summaryrefslogtreecommitdiffstats
path: root/sys/dev/isp/isp_pci.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-12-26 09:16:05 +0000
committermav <mav@FreeBSD.org>2015-12-26 09:16:05 +0000
commitddfeb0533d34693792672c394863162723486c24 (patch)
tree9502487138577967bb0587a693819b642a383d29 /sys/dev/isp/isp_pci.c
parent4d7095f5fe33b9293909aac69f25a3b52adb8c72 (diff)
downloadFreeBSD-src-ddfeb0533d34693792672c394863162723486c24.zip
FreeBSD-src-ddfeb0533d34693792672c394863162723486c24.tar.gz
Use single DMA tag for scratch areas of all virtual ports.
Diffstat (limited to 'sys/dev/isp/isp_pci.c')
-rw-r--r--sys/dev/isp/isp_pci.c47
1 files changed, 25 insertions, 22 deletions
diff --git a/sys/dev/isp/isp_pci.c b/sys/dev/isp/isp_pci.c
index cdc7159..49c461a 100644
--- a/sys/dev/isp/isp_pci.c
+++ b/sys/dev/isp/isp_pci.c
@@ -1604,11 +1604,8 @@ imc1(void *arg, bus_dma_segment_t *segs, int nseg, int error)
imushp->error = error;
return;
}
- if (nseg != 1) {
- imushp->error = EINVAL;
- return;
- }
- isp_prt(imushp->isp, ISP_LOGDEBUG0, "scdma @ 0x%jx/0x%jx", (uintmax_t) segs->ds_addr, (uintmax_t) segs->ds_len);
+ isp_prt(imushp->isp, ISP_LOGDEBUG0, "scdma @ 0x%jx/0x%jx",
+ (uintmax_t) segs->ds_addr, (uintmax_t) segs->ds_len);
FCPARAM(imushp->isp, imushp->chan)->isp_scdma = segs->ds_addr;
FCPARAM(imushp->isp, imushp->chan)->isp_scratch = imushp->vbase;
}
@@ -1735,23 +1732,27 @@ isp_pci_mbxdma(ispsoftc_t *isp)
}
if (IS_FC(isp)) {
+ if (isp_dma_tag_create(isp->isp_osinfo.dmat, 64, slim,
+ BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
+ ISP_FC_SCRLEN, 1, ISP_FC_SCRLEN, 0, &isp->isp_osinfo.scdmat)) {
+ goto bad;
+ }
for (cmap = 0; cmap < isp->isp_nchan; cmap++) {
struct isp_fc *fc = ISP_FC_PC(isp, cmap);
- if (isp_dma_tag_create(isp->isp_osinfo.dmat, 64, slim, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, ISP_FC_SCRLEN, 1, slim, 0, &fc->tdmat)) {
- goto bad;
- }
- if (bus_dmamem_alloc(fc->tdmat, (void **)&base, BUS_DMA_NOWAIT | BUS_DMA_COHERENT, &fc->tdmap) != 0) {
- bus_dma_tag_destroy(fc->tdmat);
+ if (bus_dmamem_alloc(isp->isp_osinfo.scdmat,
+ (void **)&base, BUS_DMA_NOWAIT | BUS_DMA_COHERENT,
+ &fc->scmap) != 0) {
goto bad;
}
im.isp = isp;
im.chan = cmap;
im.vbase = base;
im.error = 0;
- bus_dmamap_load(fc->tdmat, fc->tdmap, base, ISP_FC_SCRLEN, imc1, &im, 0);
+ bus_dmamap_load(isp->isp_osinfo.scdmat, fc->scmap,
+ base, ISP_FC_SCRLEN, imc1, &im, 0);
if (im.error) {
- bus_dmamem_free(fc->tdmat, base, fc->tdmap);
- bus_dma_tag_destroy(fc->tdmat);
+ bus_dmamem_free(isp->isp_osinfo.scdmat,
+ base, fc->scmap);
goto bad;
}
if (!IS_2100(isp)) {
@@ -1794,16 +1795,18 @@ isp_pci_mbxdma(ispsoftc_t *isp)
return (0);
bad:
- while (--cmap >= 0) {
- struct isp_fc *fc = ISP_FC_PC(isp, cmap);
- bus_dmamap_unload(fc->tdmat, fc->tdmap);
- bus_dmamem_free(fc->tdmat, base, fc->tdmap);
- bus_dma_tag_destroy(fc->tdmat);
- while (fc->nexus_free_list) {
- struct isp_nexus *n = fc->nexus_free_list;
- fc->nexus_free_list = n->next;
- free(n, M_DEVBUF);
+ if (IS_FC(isp)) {
+ while (--cmap >= 0) {
+ struct isp_fc *fc = ISP_FC_PC(isp, cmap);
+ bus_dmamap_unload(isp->isp_osinfo.scdmat, fc->scmap);
+ bus_dmamem_free(isp->isp_osinfo.scdmat, base, fc->scmap);
+ while (fc->nexus_free_list) {
+ struct isp_nexus *n = fc->nexus_free_list;
+ fc->nexus_free_list = n->next;
+ free(n, M_DEVBUF);
+ }
}
+ bus_dma_tag_destroy(isp->isp_osinfo.scdmat);
}
if (isp->isp_rquest_dma != 0)
bus_dmamap_unload(isp->isp_osinfo.cdmat, isp->isp_osinfo.cdmap);
OpenPOWER on IntegriCloud