Deleted Added
full compact
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 ---