aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2019-01-07 02:39:40 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2019-01-07 02:39:40 +0000
commitd91cc9dd63f4a646eb50781733539b680bdc0d15 (patch)
treef2d31a990b6e5c8b4f99b4e58150a86df260937d /sys
parent866fe991ac4014aafb031f2651f52444e2fdf3c5 (diff)
downloadsrc-d91cc9dd63f4a646eb50781733539b680bdc0d15.tar.gz
src-d91cc9dd63f4a646eb50781733539b680bdc0d15.zip
Fix use of busdma(9) KPI in ahci(4).
Use BUS_DMA_NOWAIT for loads at initialization time. Report actual numeric error code if any problem occurs at the initialization. Reported and tested by: pho Reviewed by: mav Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D18741
Notes
Notes: svn path=/head/; revision=342826
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ahci/ahci.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c
index c6f0293863db..4a17fb535498 100644
--- a/sys/dev/ahci/ahci.c
+++ b/sys/dev/ahci/ahci.c
@@ -982,18 +982,22 @@ ahci_dmainit(device_t dev)
struct ahci_channel *ch = device_get_softc(dev);
struct ahci_dc_cb_args dcba;
size_t rfsize;
+ int error;
/* Command area. */
- if (bus_dma_tag_create(bus_get_dma_tag(dev), 1024, 0,
+ error = bus_dma_tag_create(bus_get_dma_tag(dev), 1024, 0,
BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
NULL, NULL, AHCI_WORK_SIZE, 1, AHCI_WORK_SIZE,
- 0, NULL, NULL, &ch->dma.work_tag))
+ 0, NULL, NULL, &ch->dma.work_tag);
+ if (error != 0)
goto error;
- if (bus_dmamem_alloc(ch->dma.work_tag, (void **)&ch->dma.work,
- BUS_DMA_ZERO, &ch->dma.work_map))
+ error = bus_dmamem_alloc(ch->dma.work_tag, (void **)&ch->dma.work,
+ BUS_DMA_ZERO, &ch->dma.work_map);
+ if (error != 0)
goto error;
- if (bus_dmamap_load(ch->dma.work_tag, ch->dma.work_map, ch->dma.work,
- AHCI_WORK_SIZE, ahci_dmasetupc_cb, &dcba, 0) || dcba.error) {
+ error = bus_dmamap_load(ch->dma.work_tag, ch->dma.work_map, ch->dma.work,
+ AHCI_WORK_SIZE, ahci_dmasetupc_cb, &dcba, BUS_DMA_NOWAIT);
+ if (error != 0 || (error = dcba.error) != 0) {
bus_dmamem_free(ch->dma.work_tag, ch->dma.work, ch->dma.work_map);
goto error;
}
@@ -1003,33 +1007,37 @@ ahci_dmainit(device_t dev)
rfsize = 4096;
else
rfsize = 256;
- if (bus_dma_tag_create(bus_get_dma_tag(dev), rfsize, 0,
+ error = bus_dma_tag_create(bus_get_dma_tag(dev), rfsize, 0,
BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
NULL, NULL, rfsize, 1, rfsize,
- 0, NULL, NULL, &ch->dma.rfis_tag))
+ 0, NULL, NULL, &ch->dma.rfis_tag);
+ if (error != 0)
goto error;
- if (bus_dmamem_alloc(ch->dma.rfis_tag, (void **)&ch->dma.rfis, 0,
- &ch->dma.rfis_map))
+ error = bus_dmamem_alloc(ch->dma.rfis_tag, (void **)&ch->dma.rfis, 0,
+ &ch->dma.rfis_map);
+ if (error != 0)
goto error;
- if (bus_dmamap_load(ch->dma.rfis_tag, ch->dma.rfis_map, ch->dma.rfis,
- rfsize, ahci_dmasetupc_cb, &dcba, 0) || dcba.error) {
+ error = bus_dmamap_load(ch->dma.rfis_tag, ch->dma.rfis_map, ch->dma.rfis,
+ rfsize, ahci_dmasetupc_cb, &dcba, BUS_DMA_NOWAIT);
+ if (error != 0 || (error = dcba.error) != 0) {
bus_dmamem_free(ch->dma.rfis_tag, ch->dma.rfis, ch->dma.rfis_map);
goto error;
}
ch->dma.rfis_bus = dcba.maddr;
/* Data area. */
- if (bus_dma_tag_create(bus_get_dma_tag(dev), 2, 0,
+ error = bus_dma_tag_create(bus_get_dma_tag(dev), 2, 0,
BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
NULL, NULL,
AHCI_SG_ENTRIES * PAGE_SIZE * ch->numslots,
AHCI_SG_ENTRIES, AHCI_PRD_MAX,
- 0, busdma_lock_mutex, &ch->mtx, &ch->dma.data_tag)) {
+ 0, busdma_lock_mutex, &ch->mtx, &ch->dma.data_tag);
+ if (error != 0)
goto error;
- }
return;
error:
- device_printf(dev, "WARNING - DMA initialization failed\n");
+ device_printf(dev, "WARNING - DMA initialization failed, error %d\n",
+ error);
ahci_dmafini(dev);
}