isp_pci.c (316399) | isp_pci.c (316403) |
---|---|
1/*- 2 * Copyright (c) 1997-2008 by Matthew Jacob 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 14 unchanged lines hidden (view full) --- 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26/* 27 * PCI specific probe and attach routines for Qlogic ISP SCSI adapters. 28 * FreeBSD Version. 29 */ 30#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1997-2008 by Matthew Jacob 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 14 unchanged lines hidden (view full) --- 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26/* 27 * PCI specific probe and attach routines for Qlogic ISP SCSI adapters. 28 * FreeBSD Version. 29 */ 30#include <sys/cdefs.h> |
31__FBSDID("$FreeBSD: stable/10/sys/dev/isp/isp_pci.c 316399 2017-04-02 10:52:00Z mav $"); | 31__FBSDID("$FreeBSD: stable/10/sys/dev/isp/isp_pci.c 316403 2017-04-02 10:54:58Z mav $"); |
32 33#include <sys/param.h> 34#include <sys/systm.h> 35#include <sys/kernel.h> 36#include <sys/module.h> 37#include <sys/linker.h> 38#include <sys/firmware.h> 39#include <sys/bus.h> --- 639 unchanged lines hidden (view full) --- 679 size_t psize, xsize; 680 char fwname[32]; 681 682 pcs->pci_dev = dev; 683 isp->isp_dev = dev; 684 isp->isp_nchan = 1; 685 if (sizeof (bus_addr_t) > 4) 686 isp->isp_osinfo.sixtyfourbit = 1; | 32 33#include <sys/param.h> 34#include <sys/systm.h> 35#include <sys/kernel.h> 36#include <sys/module.h> 37#include <sys/linker.h> 38#include <sys/firmware.h> 39#include <sys/bus.h> --- 639 unchanged lines hidden (view full) --- 679 size_t psize, xsize; 680 char fwname[32]; 681 682 pcs->pci_dev = dev; 683 isp->isp_dev = dev; 684 isp->isp_nchan = 1; 685 if (sizeof (bus_addr_t) > 4) 686 isp->isp_osinfo.sixtyfourbit = 1; |
687 mtx_init(&isp->isp_osinfo.lock, "isp", NULL, MTX_DEF); | 687 mtx_init(&isp->isp_lock, "isp", NULL, MTX_DEF); |
688 689 /* 690 * Get Generic Options 691 */ 692 isp_nvports = 0; 693 isp_get_generic_options(dev, isp); 694 695 linesz = PCI_DFLT_LNSZ; --- 280 unchanged lines hidden (view full) --- 976 if (pcs->pci_isp.isp_param) { 977 free(pcs->pci_isp.isp_param, M_DEVBUF); 978 pcs->pci_isp.isp_param = NULL; 979 } 980 if (pcs->pci_isp.isp_osinfo.pc.ptr) { 981 free(pcs->pci_isp.isp_osinfo.pc.ptr, M_DEVBUF); 982 pcs->pci_isp.isp_osinfo.pc.ptr = NULL; 983 } | 688 689 /* 690 * Get Generic Options 691 */ 692 isp_nvports = 0; 693 isp_get_generic_options(dev, isp); 694 695 linesz = PCI_DFLT_LNSZ; --- 280 unchanged lines hidden (view full) --- 976 if (pcs->pci_isp.isp_param) { 977 free(pcs->pci_isp.isp_param, M_DEVBUF); 978 pcs->pci_isp.isp_param = NULL; 979 } 980 if (pcs->pci_isp.isp_osinfo.pc.ptr) { 981 free(pcs->pci_isp.isp_osinfo.pc.ptr, M_DEVBUF); 982 pcs->pci_isp.isp_osinfo.pc.ptr = NULL; 983 } |
984 mtx_destroy(&isp->isp_osinfo.lock); | 984 mtx_destroy(&isp->isp_lock); |
985 return (ENXIO); 986} 987 988static int 989isp_pci_detach(device_t dev) 990{ 991 struct isp_pcisoftc *pcs = device_get_softc(dev); 992 ispsoftc_t *isp = &pcs->pci_isp; --- 21 unchanged lines hidden (view full) --- 1014 if (pcs->pci_isp.isp_param) { 1015 free(pcs->pci_isp.isp_param, M_DEVBUF); 1016 pcs->pci_isp.isp_param = NULL; 1017 } 1018 if (pcs->pci_isp.isp_osinfo.pc.ptr) { 1019 free(pcs->pci_isp.isp_osinfo.pc.ptr, M_DEVBUF); 1020 pcs->pci_isp.isp_osinfo.pc.ptr = NULL; 1021 } | 985 return (ENXIO); 986} 987 988static int 989isp_pci_detach(device_t dev) 990{ 991 struct isp_pcisoftc *pcs = device_get_softc(dev); 992 ispsoftc_t *isp = &pcs->pci_isp; --- 21 unchanged lines hidden (view full) --- 1014 if (pcs->pci_isp.isp_param) { 1015 free(pcs->pci_isp.isp_param, M_DEVBUF); 1016 pcs->pci_isp.isp_param = NULL; 1017 } 1018 if (pcs->pci_isp.isp_osinfo.pc.ptr) { 1019 free(pcs->pci_isp.isp_osinfo.pc.ptr, M_DEVBUF); 1020 pcs->pci_isp.isp_osinfo.pc.ptr = NULL; 1021 } |
1022 mtx_destroy(&isp->isp_osinfo.lock); | 1022 mtx_destroy(&isp->isp_lock); |
1023 return (0); 1024} 1025 1026#define IspVirt2Off(a, x) \ 1027 (((struct isp_pcisoftc *)a)->pci_poff[((x) & _BLK_REG_MASK) >> \ 1028 _BLK_REG_SHFT] + ((x) & 0xfff)) 1029 1030#define BXR2(isp, off) bus_read_2((isp)->isp_regs, (off)) --- 496 unchanged lines hidden (view full) --- 1527 slim = (1UL << 24); 1528 llim = BUS_SPACE_MAXADDR_32BIT; 1529 } 1530 if (isp->isp_osinfo.sixtyfourbit) 1531 nsegs = ISP_NSEG64_MAX; 1532 else 1533 nsegs = ISP_NSEG_MAX; 1534 | 1023 return (0); 1024} 1025 1026#define IspVirt2Off(a, x) \ 1027 (((struct isp_pcisoftc *)a)->pci_poff[((x) & _BLK_REG_MASK) >> \ 1028 _BLK_REG_SHFT] + ((x) & 0xfff)) 1029 1030#define BXR2(isp, off) bus_read_2((isp)->isp_regs, (off)) --- 496 unchanged lines hidden (view full) --- 1527 slim = (1UL << 24); 1528 llim = BUS_SPACE_MAXADDR_32BIT; 1529 } 1530 if (isp->isp_osinfo.sixtyfourbit) 1531 nsegs = ISP_NSEG64_MAX; 1532 else 1533 nsegs = ISP_NSEG_MAX; 1534 |
1535 if (isp_dma_tag_create(BUS_DMA_ROOTARG(ISP_PCD(isp)), 1, | 1535 if (bus_dma_tag_create(bus_get_dma_tag(ISP_PCD(isp)), 1, |
1536 slim, llim, hlim, NULL, NULL, BUS_SPACE_MAXSIZE, nsegs, slim, 0, | 1536 slim, llim, hlim, NULL, NULL, BUS_SPACE_MAXSIZE, nsegs, slim, 0, |
1537 &isp->isp_osinfo.dmat)) { | 1537 busdma_lock_mutex, &isp->isp_lock, &isp->isp_osinfo.dmat)) { |
1538 ISP_LOCK(isp); 1539 isp_prt(isp, ISP_LOGERR, "could not create master dma tag"); 1540 return (1); 1541 } 1542 1543 /* 1544 * Allocate and map the request queue and a region for external 1545 * DMA addressable command/status structures (22XX and later). 1546 */ 1547 len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); 1548 if (isp->isp_type >= ISP_HA_FC_2200) 1549 len += (N_XCMDS * XCMD_SIZE); | 1538 ISP_LOCK(isp); 1539 isp_prt(isp, ISP_LOGERR, "could not create master dma tag"); 1540 return (1); 1541 } 1542 1543 /* 1544 * Allocate and map the request queue and a region for external 1545 * DMA addressable command/status structures (22XX and later). 1546 */ 1547 len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); 1548 if (isp->isp_type >= ISP_HA_FC_2200) 1549 len += (N_XCMDS * XCMD_SIZE); |
1550 if (isp_dma_tag_create(isp->isp_osinfo.dmat, QENTRY_LEN, slim, | 1550 if (bus_dma_tag_create(isp->isp_osinfo.dmat, QENTRY_LEN, slim, |
1551 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, | 1551 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, |
1552 len, 1, len, 0, &isp->isp_osinfo.reqdmat)) { | 1552 len, 1, len, 0, busdma_lock_mutex, &isp->isp_lock, 1553 &isp->isp_osinfo.reqdmat)) { |
1553 isp_prt(isp, ISP_LOGERR, "cannot create request DMA tag"); 1554 goto bad; 1555 } 1556 if (bus_dmamem_alloc(isp->isp_osinfo.reqdmat, (void **)&base, 1557 BUS_DMA_COHERENT, &isp->isp_osinfo.reqmap) != 0) { 1558 isp_prt(isp, ISP_LOGERR, "cannot allocate request DMA memory"); 1559 bus_dma_tag_destroy(isp->isp_osinfo.reqdmat); 1560 goto bad; --- 22 unchanged lines hidden (view full) --- 1583 ecmd->next = ecmd + 1; 1584 } 1585 } 1586 1587 /* 1588 * Allocate and map the result queue. 1589 */ 1590 len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); | 1554 isp_prt(isp, ISP_LOGERR, "cannot create request DMA tag"); 1555 goto bad; 1556 } 1557 if (bus_dmamem_alloc(isp->isp_osinfo.reqdmat, (void **)&base, 1558 BUS_DMA_COHERENT, &isp->isp_osinfo.reqmap) != 0) { 1559 isp_prt(isp, ISP_LOGERR, "cannot allocate request DMA memory"); 1560 bus_dma_tag_destroy(isp->isp_osinfo.reqdmat); 1561 goto bad; --- 22 unchanged lines hidden (view full) --- 1584 ecmd->next = ecmd + 1; 1585 } 1586 } 1587 1588 /* 1589 * Allocate and map the result queue. 1590 */ 1591 len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); |
1591 if (isp_dma_tag_create(isp->isp_osinfo.dmat, QENTRY_LEN, slim, | 1592 if (bus_dma_tag_create(isp->isp_osinfo.dmat, QENTRY_LEN, slim, |
1592 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, | 1593 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, |
1593 len, 1, len, 0, &isp->isp_osinfo.respdmat)) { | 1594 len, 1, len, 0, busdma_lock_mutex, &isp->isp_lock, 1595 &isp->isp_osinfo.respdmat)) { |
1594 isp_prt(isp, ISP_LOGERR, "cannot create response DMA tag"); 1595 goto bad; 1596 } 1597 if (bus_dmamem_alloc(isp->isp_osinfo.respdmat, (void **)&base, 1598 BUS_DMA_COHERENT, &isp->isp_osinfo.respmap) != 0) { 1599 isp_prt(isp, ISP_LOGERR, "cannot allocate response DMA memory"); 1600 bus_dma_tag_destroy(isp->isp_osinfo.respdmat); 1601 goto bad; --- 10 unchanged lines hidden (view full) --- 1612 isp->isp_result_dma = im.maddr; 1613 1614#ifdef ISP_TARGET_MODE 1615 /* 1616 * Allocate and map ATIO queue on 24xx with target mode. 1617 */ 1618 if (IS_24XX(isp)) { 1619 len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); | 1596 isp_prt(isp, ISP_LOGERR, "cannot create response DMA tag"); 1597 goto bad; 1598 } 1599 if (bus_dmamem_alloc(isp->isp_osinfo.respdmat, (void **)&base, 1600 BUS_DMA_COHERENT, &isp->isp_osinfo.respmap) != 0) { 1601 isp_prt(isp, ISP_LOGERR, "cannot allocate response DMA memory"); 1602 bus_dma_tag_destroy(isp->isp_osinfo.respdmat); 1603 goto bad; --- 10 unchanged lines hidden (view full) --- 1614 isp->isp_result_dma = im.maddr; 1615 1616#ifdef ISP_TARGET_MODE 1617 /* 1618 * Allocate and map ATIO queue on 24xx with target mode. 1619 */ 1620 if (IS_24XX(isp)) { 1621 len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); |
1620 if (isp_dma_tag_create(isp->isp_osinfo.dmat, QENTRY_LEN, slim, | 1622 if (bus_dma_tag_create(isp->isp_osinfo.dmat, QENTRY_LEN, slim, |
1621 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, | 1623 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, |
1622 len, 1, len, 0, &isp->isp_osinfo.atiodmat)) { | 1624 len, 1, len, 0, busdma_lock_mutex, &isp->isp_lock, 1625 &isp->isp_osinfo.atiodmat)) { |
1623 isp_prt(isp, ISP_LOGERR, "cannot create ATIO DMA tag"); 1624 goto bad; 1625 } 1626 if (bus_dmamem_alloc(isp->isp_osinfo.atiodmat, (void **)&base, 1627 BUS_DMA_COHERENT, &isp->isp_osinfo.atiomap) != 0) { 1628 isp_prt(isp, ISP_LOGERR, "cannot allocate ATIO DMA memory"); 1629 bus_dma_tag_destroy(isp->isp_osinfo.atiodmat); 1630 goto bad; --- 7 unchanged lines hidden (view full) --- 1638 } 1639 isp_prt(isp, ISP_LOGDEBUG0, "ATIO area @ 0x%jx/0x%jx", 1640 (uintmax_t)im.maddr, (uintmax_t)len); 1641 isp->isp_atioq_dma = im.maddr; 1642 } 1643#endif 1644 1645 if (IS_FC(isp)) { | 1626 isp_prt(isp, ISP_LOGERR, "cannot create ATIO DMA tag"); 1627 goto bad; 1628 } 1629 if (bus_dmamem_alloc(isp->isp_osinfo.atiodmat, (void **)&base, 1630 BUS_DMA_COHERENT, &isp->isp_osinfo.atiomap) != 0) { 1631 isp_prt(isp, ISP_LOGERR, "cannot allocate ATIO DMA memory"); 1632 bus_dma_tag_destroy(isp->isp_osinfo.atiodmat); 1633 goto bad; --- 7 unchanged lines hidden (view full) --- 1641 } 1642 isp_prt(isp, ISP_LOGDEBUG0, "ATIO area @ 0x%jx/0x%jx", 1643 (uintmax_t)im.maddr, (uintmax_t)len); 1644 isp->isp_atioq_dma = im.maddr; 1645 } 1646#endif 1647 1648 if (IS_FC(isp)) { |
1646 if (isp_dma_tag_create(isp->isp_osinfo.dmat, 64, slim, | 1649 if (bus_dma_tag_create(isp->isp_osinfo.dmat, 64, slim, |
1647 BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, | 1650 BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, |
1648 2*QENTRY_LEN, 1, 2*QENTRY_LEN, 0, &isp->isp_osinfo.iocbdmat)) { | 1651 2*QENTRY_LEN, 1, 2*QENTRY_LEN, 0, busdma_lock_mutex, 1652 &isp->isp_lock, &isp->isp_osinfo.iocbdmat)) { |
1649 goto bad; 1650 } 1651 if (bus_dmamem_alloc(isp->isp_osinfo.iocbdmat, 1652 (void **)&base, BUS_DMA_COHERENT, &isp->isp_osinfo.iocbmap) != 0) 1653 goto bad; 1654 isp->isp_iocb = base; 1655 im.error = 0; 1656 if (bus_dmamap_load(isp->isp_osinfo.iocbdmat, isp->isp_osinfo.iocbmap, 1657 base, 2*QENTRY_LEN, imc, &im, 0) || im.error) 1658 goto bad; 1659 isp->isp_iocb_dma = im.maddr; 1660 | 1653 goto bad; 1654 } 1655 if (bus_dmamem_alloc(isp->isp_osinfo.iocbdmat, 1656 (void **)&base, BUS_DMA_COHERENT, &isp->isp_osinfo.iocbmap) != 0) 1657 goto bad; 1658 isp->isp_iocb = base; 1659 im.error = 0; 1660 if (bus_dmamap_load(isp->isp_osinfo.iocbdmat, isp->isp_osinfo.iocbmap, 1661 base, 2*QENTRY_LEN, imc, &im, 0) || im.error) 1662 goto bad; 1663 isp->isp_iocb_dma = im.maddr; 1664 |
1661 if (isp_dma_tag_create(isp->isp_osinfo.dmat, 64, slim, | 1665 if (bus_dma_tag_create(isp->isp_osinfo.dmat, 64, slim, |
1662 BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, | 1666 BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, |
1663 ISP_FC_SCRLEN, 1, ISP_FC_SCRLEN, 0, &isp->isp_osinfo.scdmat)) | 1667 ISP_FC_SCRLEN, 1, ISP_FC_SCRLEN, 0, busdma_lock_mutex, 1668 &isp->isp_lock, &isp->isp_osinfo.scdmat)) |
1664 goto bad; 1665 for (cmap = 0; cmap < isp->isp_nchan; cmap++) { 1666 struct isp_fc *fc = ISP_FC_PC(isp, cmap); 1667 if (bus_dmamem_alloc(isp->isp_osinfo.scdmat, 1668 (void **)&base, BUS_DMA_COHERENT, &fc->scmap) != 0) 1669 goto bad; 1670 FCPARAM(isp, cmap)->isp_scratch = base; 1671 im.error = 0; --- 38 unchanged lines hidden (view full) --- 1710 if (error) { 1711 isp_prt(isp, ISP_LOGERR, "error %d creating per-cmd DMA maps", error); 1712 while (--i >= 0) { 1713 bus_dmamap_destroy(isp->isp_osinfo.dmat, 1714 isp->isp_osinfo.pcmd_pool[i].dmap); 1715 } 1716 goto bad; 1717 } | 1669 goto bad; 1670 for (cmap = 0; cmap < isp->isp_nchan; cmap++) { 1671 struct isp_fc *fc = ISP_FC_PC(isp, cmap); 1672 if (bus_dmamem_alloc(isp->isp_osinfo.scdmat, 1673 (void **)&base, BUS_DMA_COHERENT, &fc->scmap) != 0) 1674 goto bad; 1675 FCPARAM(isp, cmap)->isp_scratch = base; 1676 im.error = 0; --- 38 unchanged lines hidden (view full) --- 1715 if (error) { 1716 isp_prt(isp, ISP_LOGERR, "error %d creating per-cmd DMA maps", error); 1717 while (--i >= 0) { 1718 bus_dmamap_destroy(isp->isp_osinfo.dmat, 1719 isp->isp_osinfo.pcmd_pool[i].dmap); 1720 } 1721 goto bad; 1722 } |
1718 callout_init_mtx(&pcmd->wdog, &isp->isp_osinfo.lock, 0); | 1723 callout_init_mtx(&pcmd->wdog, &isp->isp_lock, 0); |
1719 if (i == isp->isp_maxcmds-1) 1720 pcmd->next = NULL; 1721 else 1722 pcmd->next = &isp->isp_osinfo.pcmd_pool[i+1]; 1723 } 1724 isp->isp_osinfo.pcmd_free = &isp->isp_osinfo.pcmd_pool[0]; 1725 1726 len = sizeof (isp_hdl_t) * isp->isp_maxcmds; --- 414 unchanged lines hidden --- | 1724 if (i == isp->isp_maxcmds-1) 1725 pcmd->next = NULL; 1726 else 1727 pcmd->next = &isp->isp_osinfo.pcmd_pool[i+1]; 1728 } 1729 isp->isp_osinfo.pcmd_free = &isp->isp_osinfo.pcmd_pool[0]; 1730 1731 len = sizeof (isp_hdl_t) * isp->isp_maxcmds; --- 414 unchanged lines hidden --- |