mirror of
https://github.com/opnsense/src.git
synced 2026-06-08 16:22:46 -04:00
Use single DMA tag for scratch areas of all virtual ports.
This commit is contained in:
parent
bfb5568a3c
commit
7d191fdb97
2 changed files with 32 additions and 29 deletions
|
|
@ -225,8 +225,7 @@ struct isp_fc {
|
|||
struct cam_path *path;
|
||||
struct ispsoftc *isp;
|
||||
struct proc *kproc;
|
||||
bus_dma_tag_t tdmat;
|
||||
bus_dmamap_t tdmap;
|
||||
bus_dmamap_t scmap;
|
||||
uint64_t def_wwpn;
|
||||
uint64_t def_wwnn;
|
||||
time_t loop_down_time;
|
||||
|
|
@ -285,13 +284,14 @@ struct isposinfo {
|
|||
const struct firmware * fw;
|
||||
|
||||
/*
|
||||
* DMA related sdtuff
|
||||
* DMA related stuff
|
||||
*/
|
||||
struct resource * regs;
|
||||
struct resource * regs2;
|
||||
bus_dma_tag_t dmat;
|
||||
bus_dma_tag_t cdmat;
|
||||
bus_dmamap_t cdmap;
|
||||
bus_dma_tag_t scdmat;
|
||||
|
||||
/*
|
||||
* Command and transaction related related stuff
|
||||
|
|
@ -409,7 +409,7 @@ switch (type) { \
|
|||
case SYNC_SFORDEV: \
|
||||
{ \
|
||||
struct isp_fc *fc = ISP_FC_PC(isp, chan); \
|
||||
bus_dmamap_sync(fc->tdmat, fc->tdmap, \
|
||||
bus_dmamap_sync(isp->isp_osinfo.scdmat, fc->scmap, \
|
||||
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); \
|
||||
break; \
|
||||
} \
|
||||
|
|
@ -421,7 +421,7 @@ case SYNC_REQUEST: \
|
|||
case SYNC_SFORCPU: \
|
||||
{ \
|
||||
struct isp_fc *fc = ISP_FC_PC(isp, chan); \
|
||||
bus_dmamap_sync(fc->tdmat, fc->tdmap, \
|
||||
bus_dmamap_sync(isp->isp_osinfo.scdmat, fc->scmap, \
|
||||
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); \
|
||||
break; \
|
||||
} \
|
||||
|
|
@ -443,7 +443,7 @@ switch (type) { \
|
|||
case SYNC_SFORDEV: \
|
||||
{ \
|
||||
struct isp_fc *fc = ISP_FC_PC(isp, chan); \
|
||||
bus_dmamap_sync(fc->tdmat, fc->tdmap, \
|
||||
bus_dmamap_sync(isp->isp_osinfo.scdmat, fc->scmap, \
|
||||
BUS_DMASYNC_PREWRITE); \
|
||||
break; \
|
||||
} \
|
||||
|
|
@ -454,7 +454,7 @@ case SYNC_REQUEST: \
|
|||
case SYNC_SFORCPU: \
|
||||
{ \
|
||||
struct isp_fc *fc = ISP_FC_PC(isp, chan); \
|
||||
bus_dmamap_sync(fc->tdmat, fc->tdmap, \
|
||||
bus_dmamap_sync(isp->isp_osinfo.scdmat, fc->scmap, \
|
||||
BUS_DMASYNC_POSTWRITE); \
|
||||
break; \
|
||||
} \
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue