static void ata_dmaalloc(device_t dev) { struct ata_channel *ch = device_get_softc(dev); struct ata_dc_cb_args dcba; int i; /* alloc and setup needed dma slots */ bzero(ch->dma.slot, sizeof(struct ata_dmaslot) * ATA_DMA_SLOTS); for (i = 0; i < ch->dma.dma_slots; i++) { struct ata_dmaslot *slot = &ch->dma.slot[i]; if (bus_dma_tag_create(ch->dma.dmatag, PAGE_SIZE, PAGE_SIZE, ch->dma.max_address, BUS_SPACE_MAXADDR, NULL, NULL, PAGE_SIZE, 1, PAGE_SIZE, 0, NULL, NULL, &slot->sg_tag)) { device_printf(ch->dev, "FAILURE - create sg_tag\n"); goto error; } if (bus_dmamem_alloc(slot->sg_tag, (void **)&slot->sg, BUS_DMA_WAITOK, &slot->sg_map)) { device_printf(ch->dev, "FAILURE - alloc sg_map\n"); goto error; } if (bus_dmamap_load(slot->sg_tag, slot->sg_map, slot->sg, MAXTABSZ, ata_dmasetupc_cb, &dcba, 0) || dcba.error) { device_printf(ch->dev, "FAILURE - load sg\n"); goto error; } slot->sg_bus = dcba.maddr; if (bus_dma_tag_create(ch->dma.dmatag, ch->dma.alignment, ch->dma.boundary, ch->dma.max_address, BUS_SPACE_MAXADDR, NULL, NULL, ch->dma.max_iosize, ATA_DMA_ENTRIES, ch->dma.segsize, BUS_DMA_ALLOCNOW, NULL, NULL, &slot->data_tag)) { device_printf(ch->dev, "FAILURE - create data_tag\n"); goto error; } if (bus_dmamap_create(slot->data_tag, 0, &slot->data_map)) { device_printf(ch->dev, "FAILURE - create data_map\n"); goto error; } } return; error: device_printf(dev, "WARNING - DMA allocation failed, disabling DMA\n"); ata_dmafree(dev); }
static void ata_dmaalloc(device_t dev) { struct ata_channel *ch = device_get_softc(dev); struct ata_dc_cb_args ccba; if (bus_dma_tag_create(NULL, ch->dma->alignment, 0, ch->dma->max_address, BUS_SPACE_MAXADDR, NULL, NULL, ch->dma->max_iosize, ATA_DMA_ENTRIES, ch->dma->segsize, 0, &ch->dma->dmatag)) goto error; if (bus_dma_tag_create(ch->dma->dmatag, PAGE_SIZE, PAGE_SIZE, ch->dma->max_address, BUS_SPACE_MAXADDR, NULL, NULL, MAXTABSZ, 1, MAXTABSZ, 0, &ch->dma->sg_tag)) goto error; if (bus_dma_tag_create(ch->dma->dmatag,ch->dma->alignment,ch->dma->boundary, ch->dma->max_address, BUS_SPACE_MAXADDR, NULL, NULL, ch->dma->max_iosize, ATA_DMA_ENTRIES, ch->dma->segsize, 0, &ch->dma->data_tag)) goto error; if (bus_dmamem_alloc(ch->dma->sg_tag, (void **)&ch->dma->sg, 0, &ch->dma->sg_map)) goto error; if (bus_dmamap_load(ch->dma->sg_tag, ch->dma->sg_map, ch->dma->sg, MAXTABSZ, ata_dmasetupc_cb, &ccba, 0) || ccba.error) { bus_dmamem_free(ch->dma->sg_tag, ch->dma->sg, ch->dma->sg_map); goto error; } ch->dma->sg_bus = ccba.maddr; if (bus_dmamap_create(ch->dma->data_tag, 0, &ch->dma->data_map)) goto error; if (bus_dma_tag_create(ch->dma->dmatag, PAGE_SIZE, 64 * 1024, ch->dma->max_address, BUS_SPACE_MAXADDR, NULL, NULL, MAXWSPCSZ, 1, MAXWSPCSZ, 0, &ch->dma->work_tag)) goto error; if (bus_dmamem_alloc(ch->dma->work_tag, (void *)&ch->dma->work, 0, (void *)&ch->dma->work_map)) goto error; if (bus_dmamap_load(ch->dma->work_tag, ch->dma->work_map,ch->dma->work, MAXWSPCSZ, ata_dmasetupc_cb, &ccba, 0) || ccba.error) { bus_dmamem_free(ch->dma->work_tag,ch->dma->work, ch->dma->work_map); goto error; } ch->dma->work_bus = ccba.maddr; return; error: device_printf(dev, "WARNING - DMA allocation failed, disabling DMA\n"); ata_dmafree(dev); kfree(ch->dma, M_ATADMA); ch->dma = NULL; }