svn commit: r367925 - head/sys/dev/isp

Alexander Motin mav at FreeBSD.org
Sun Nov 22 04:10:14 UTC 2020


Author: mav
Date: Sun Nov 22 04:10:13 2020
New Revision: 367925
URL: https://svnweb.freebsd.org/changeset/base/367925

Log:
  Do not parent all busdma tags to the payload tag.
  
  There is not much to inherit any more, may create more problems than solve.
  Instead parent them all directly to upstream.
  
  While there, add missed payload tag and tune scratch tag destructions.

Modified:
  head/sys/dev/isp/isp_pci.c

Modified: head/sys/dev/isp/isp_pci.c
==============================================================================
--- head/sys/dev/isp/isp_pci.c	Sun Nov 22 02:51:30 2020	(r367924)
+++ head/sys/dev/isp/isp_pci.c	Sun Nov 22 04:10:13 2020	(r367925)
@@ -173,10 +173,8 @@ static int isp_pci_attach (device_t);
 static int isp_pci_detach (device_t);
 
 
-#define	ISP_PCD(isp)	((struct isp_pcisoftc *)isp)->pci_dev
 struct isp_pcisoftc {
 	ispsoftc_t			pci_isp;
-	device_t			pci_dev;
 	struct resource *		regs;
 	struct resource *		regs1;
 	struct resource *		regs2;
@@ -449,7 +447,6 @@ isp_pci_attach(device_t dev)
 	size_t psize, xsize;
 	char fwname[32];
 
-	pcs->pci_dev = dev;
 	isp->isp_dev = dev;
 	isp->isp_nchan = 1;
 	mtx_init(&isp->isp_lock, "isp", NULL, MTX_DEF);
@@ -464,7 +461,6 @@ isp_pci_attach(device_t dev)
 	pcs->regs = pcs->regs2 = NULL;
 	pcs->rgd = pcs->rtp = 0;
 
-	pcs->pci_dev = dev;
 	isp->isp_nchan += isp_nvports;
 	switch (pci_get_devid(dev)) {
 	case PCI_QLOGIC_ISP2422:
@@ -883,9 +879,10 @@ imc(void *arg, bus_dma_segment_t *segs, int nseg, int 
 static int
 isp_pci_mbxdma(ispsoftc_t *isp)
 {
+	bus_dma_tag_t ptag;
 	caddr_t base;
 	uint32_t len;
-	int i, error, cmap = 0;
+	int i, error, cmap;
 	bus_size_t slim;	/* segment size */
 	struct imush im;
 #ifdef	ISP_TARGET_MODE
@@ -898,28 +895,21 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 	if (isp->isp_rquest != NULL && isp->isp_maxcmds == 0)
 		return (0);
 	ISP_UNLOCK(isp);
-	if (isp->isp_rquest != NULL)
-		goto gotmaxcmds;
 
+	ptag = bus_get_dma_tag(isp->isp_osinfo.dev);
 	if (sizeof (bus_size_t) > 4)
 		slim = (bus_size_t) (1ULL << 32);
 	else
 		slim = (bus_size_t) (1UL << 31);
-	if (bus_dma_tag_create(bus_get_dma_tag(ISP_PCD(isp)), 1, slim,
-	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
-	    (ISP_NSEG64_MAX - 1) * PAGE_SIZE, ISP_NSEG64_MAX,
-	    (ISP_NSEG64_MAX - 1) * PAGE_SIZE, 0,
-	    busdma_lock_mutex, &isp->isp_lock, &isp->isp_osinfo.dmat)) {
-		ISP_LOCK(isp);
-		isp_prt(isp, ISP_LOGERR, "could not create master dma tag");
-		return (1);
-	}
 
+	if (isp->isp_rquest != NULL)
+		goto gotmaxcmds;
+
 	/*
 	 * Allocate and map the request queue.
 	 */
 	len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp));
-	if (bus_dma_tag_create(isp->isp_osinfo.dmat, QENTRY_LEN, slim,
+	if (bus_dma_tag_create(ptag, QENTRY_LEN, slim,
 	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
 	    len, 1, len, 0, NULL, NULL, &isp->isp_osinfo.reqdmat)) {
 		isp_prt(isp, ISP_LOGERR, "cannot create request DMA tag");
@@ -947,7 +937,7 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 	 * Allocate region for external DMA addressable command/status structures.
 	 */
 	len = N_XCMDS * XCMD_SIZE;
-	if (bus_dma_tag_create(isp->isp_osinfo.dmat, XCMD_SIZE, slim,
+	if (bus_dma_tag_create(ptag, XCMD_SIZE, slim,
 	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
 	    len, 1, len, 0, NULL, NULL, &isp->isp_osinfo.ecmd_dmat)) {
 		isp_prt(isp, ISP_LOGERR, "cannot create ECMD DMA tag");
@@ -956,7 +946,7 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 	if (bus_dmamem_alloc(isp->isp_osinfo.ecmd_dmat, (void **)&base,
 	    BUS_DMA_COHERENT, &isp->isp_osinfo.ecmd_map) != 0) {
 		isp_prt(isp, ISP_LOGERR, "cannot allocate ECMD DMA memory");
-		bus_dma_tag_destroy(isp->isp_osinfo.reqdmat);
+		bus_dma_tag_destroy(isp->isp_osinfo.ecmd_dmat);
 		goto bad;
 	}
 	isp->isp_osinfo.ecmd_base = (isp_ecmd_t *)base;
@@ -984,7 +974,7 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 	 * Allocate and map the result queue.
 	 */
 	len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp));
-	if (bus_dma_tag_create(isp->isp_osinfo.dmat, QENTRY_LEN, slim,
+	if (bus_dma_tag_create(ptag, QENTRY_LEN, slim,
 	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
 	    len, 1, len, 0, NULL, NULL, &isp->isp_osinfo.respdmat)) {
 		isp_prt(isp, ISP_LOGERR, "cannot create response DMA tag");
@@ -1012,7 +1002,7 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 	 * Allocate and map ATIO queue.
 	 */
 	len = ISP_QUEUE_SIZE(ATIO_QUEUE_LEN(isp));
-	if (bus_dma_tag_create(isp->isp_osinfo.dmat, QENTRY_LEN, slim,
+	if (bus_dma_tag_create(ptag, QENTRY_LEN, slim,
 	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
 	    len, 1, len, 0, NULL, NULL, &isp->isp_osinfo.atiodmat)) {
 		isp_prt(isp, ISP_LOGERR, "cannot create ATIO DMA tag");
@@ -1036,7 +1026,7 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 	isp->isp_atioq_dma = im.maddr;
 #endif
 
-	if (bus_dma_tag_create(isp->isp_osinfo.dmat, 64, slim,
+	if (bus_dma_tag_create(ptag, 64, slim,
 	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
 	    2*QENTRY_LEN, 1, 2*QENTRY_LEN, 0, NULL, NULL,
 	    &isp->isp_osinfo.iocbdmat)) {
@@ -1052,7 +1042,7 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 		goto bad;
 	isp->isp_iocb_dma = im.maddr;
 
-	if (bus_dma_tag_create(isp->isp_osinfo.dmat, 64, slim,
+	if (bus_dma_tag_create(ptag, 64, slim,
 	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
 	    ISP_FC_SCRLEN, 1, ISP_FC_SCRLEN, 0, NULL, NULL,
 	    &isp->isp_osinfo.scdmat))
@@ -1094,6 +1084,12 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 	}
 
 gotmaxcmds:
+	if (bus_dma_tag_create(ptag, 1, slim,
+	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
+	    (ISP_NSEG64_MAX - 1) * PAGE_SIZE, ISP_NSEG64_MAX,
+	    (ISP_NSEG64_MAX - 1) * PAGE_SIZE, 0,
+	    busdma_lock_mutex, &isp->isp_lock, &isp->isp_osinfo.dmat))
+		goto bad;
 	len = isp->isp_maxcmds * sizeof (struct isp_pcmd);
 	isp->isp_osinfo.pcmd_pool = (struct isp_pcmd *)
 	    malloc(len, M_DEVBUF, M_WAITOK | M_ZERO);
@@ -1148,6 +1144,10 @@ isp_pci_mbxdmafree(ispsoftc_t *isp)
 		free(isp->isp_osinfo.pcmd_pool, M_DEVBUF);
 		isp->isp_osinfo.pcmd_pool = NULL;
 	}
+	if (isp->isp_osinfo.dmat) {
+		bus_dma_tag_destroy(isp->isp_osinfo.dmat);
+		isp->isp_osinfo.dmat = NULL;
+	}
 	for (i = 0; i < isp->isp_nchan; i++) {
 		struct isp_fc *fc = ISP_FC_PC(isp, i);
 		if (FCPARAM(isp, i)->isp_scdma != 0) {
@@ -1166,8 +1166,11 @@ isp_pci_mbxdmafree(ispsoftc_t *isp)
 			free(n, M_DEVBUF);
 		}
 	}
-	if (isp->isp_iocb_dma != 0) {
+	if (isp->isp_osinfo.scdmat) {
 		bus_dma_tag_destroy(isp->isp_osinfo.scdmat);
+		isp->isp_osinfo.scdmat = NULL;
+	}
+	if (isp->isp_iocb_dma != 0) {
 		bus_dmamap_unload(isp->isp_osinfo.iocbdmat,
 		    isp->isp_osinfo.iocbmap);
 		isp->isp_iocb_dma = 0;


More information about the svn-src-all mailing list