From owner-svn-src-all@freebsd.org Sun Nov 22 04:10:14 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 074C247C010; Sun, 22 Nov 2020 04:10:14 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Cdxdd6Vhgz4Wk9; Sun, 22 Nov 2020 04:10:13 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id C76C6142DA; Sun, 22 Nov 2020 04:10:13 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0AM4AD1D016402; Sun, 22 Nov 2020 04:10:13 GMT (envelope-from mav@FreeBSD.org) Received: (from mav@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0AM4ADaT016401; Sun, 22 Nov 2020 04:10:13 GMT (envelope-from mav@FreeBSD.org) Message-Id: <202011220410.0AM4ADaT016401@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mav set sender to mav@FreeBSD.org using -f From: Alexander Motin Date: Sun, 22 Nov 2020 04:10:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r367925 - head/sys/dev/isp X-SVN-Group: head X-SVN-Commit-Author: mav X-SVN-Commit-Paths: head/sys/dev/isp X-SVN-Commit-Revision: 367925 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Nov 2020 04:10:14 -0000 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;