Deleted Added
sdiff udiff text old ( 160080 ) new ( 160212 )
full compact
1/*-
2 * PCI specific probe and attach routines for Qlogic ISP SCSI adapters.
3 * FreeBSD Version.
4 *
5 * Copyright (c) 1997-2006 by Matthew Jacob
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 15 unchanged lines hidden (view full) ---

24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 */
30
31#include <sys/cdefs.h>
32__FBSDID("$FreeBSD: head/sys/dev/isp/isp_pci.c 160080 2006-07-03 08:24:09Z mjacob $");
33
34#include <sys/param.h>
35#include <sys/systm.h>
36#include <sys/kernel.h>
37#include <sys/module.h>
38#include <sys/bus.h>
39#if __FreeBSD_version < 500000
40#include <sys/bus.h>
41#include <pci/pcireg.h>
42#include <pci/pcivar.h>
43#include <machine/bus_memio.h>
44#include <machine/bus_pio.h>
45#else
46#include <sys/stdint.h>
47#include <dev/pci/pcireg.h>
48#include <dev/pci/pcivar.h>

--- 18 unchanged lines hidden (view full) ---

67static int
68isp_pci_rd_isr_2300(ispsoftc_t *, uint16_t *, uint16_t *, uint16_t *);
69static int isp_pci_mbxdma(ispsoftc_t *);
70static int
71isp_pci_dmasetup(ispsoftc_t *, XS_T *, ispreq_t *, uint16_t *, uint16_t);
72static void
73isp_pci_dmateardown(ispsoftc_t *, XS_T *, uint16_t);
74
75static void isp_pci_reset1(ispsoftc_t *);
76static void isp_pci_dumpregs(ispsoftc_t *, const char *);
77
78static struct ispmdvec mdvec = {
79 isp_pci_rd_isr,
80 isp_pci_rd_reg,
81 isp_pci_wr_reg,
82 isp_pci_mbxdma,

--- 153 unchanged lines hidden (view full) ---

236#ifndef PCI_PRODUCT_QLOGIC_ISP2422
237#define PCI_PRODUCT_QLOGIC_ISP2422 0x2422
238#endif
239
240#ifndef PCI_PRODUCT_QLOGIC_ISP6312
241#define PCI_PRODUCT_QLOGIC_ISP6312 0x6312
242#endif
243
244#define PCI_QLOGIC_ISP1020 \
245 ((PCI_PRODUCT_QLOGIC_ISP1020 << 16) | PCI_VENDOR_QLOGIC)
246
247#define PCI_QLOGIC_ISP1080 \
248 ((PCI_PRODUCT_QLOGIC_ISP1080 << 16) | PCI_VENDOR_QLOGIC)
249
250#define PCI_QLOGIC_ISP10160 \
251 ((PCI_PRODUCT_QLOGIC_ISP10160 << 16) | PCI_VENDOR_QLOGIC)

--- 23 unchanged lines hidden (view full) ---

275 ((PCI_PRODUCT_QLOGIC_ISP2322 << 16) | PCI_VENDOR_QLOGIC)
276
277#define PCI_QLOGIC_ISP2422 \
278 ((PCI_PRODUCT_QLOGIC_ISP2422 << 16) | PCI_VENDOR_QLOGIC)
279
280#define PCI_QLOGIC_ISP6312 \
281 ((PCI_PRODUCT_QLOGIC_ISP6312 << 16) | PCI_VENDOR_QLOGIC)
282
283/*
284 * Odd case for some AMI raid cards... We need to *not* attach to this.
285 */
286#define AMI_RAID_SUBVENDOR_ID 0x101e
287
288#define IO_MAP_REG 0x10
289#define MEM_MAP_REG 0x14
290

--- 10 unchanged lines hidden (view full) ---

301 struct resource * pci_reg;
302 bus_space_tag_t pci_st;
303 bus_space_handle_t pci_sh;
304 void * ih;
305 int16_t pci_poff[_NREG_BLKS];
306 bus_dma_tag_t dmat;
307 bus_dmamap_t *dmaps;
308};
309extern ispfwfunc *isp_get_firmware_p;
310
311static device_method_t isp_pci_methods[] = {
312 /* Device interface */
313 DEVMETHOD(device_probe, isp_pci_probe),
314 DEVMETHOD(device_attach, isp_pci_attach),
315 { 0, 0 }
316};
317static void isp_pci_intr(void *);
318
319static driver_t isp_pci_driver = {
320 "isp", isp_pci_methods, sizeof (struct isp_pcisoftc)
321};
322static devclass_t isp_devclass;
323DRIVER_MODULE(isp, pci, isp_pci_driver, isp_devclass, 0, 0);
324
325static int
326isp_pci_probe(device_t dev)
327{
328 switch ((pci_get_device(dev) << 16) | (pci_get_vendor(dev))) {
329 case PCI_QLOGIC_ISP1020:
330 device_set_desc(dev, "Qlogic ISP 1020/1040 PCI SCSI Adapter");
331 break;

--- 31 unchanged lines hidden (view full) ---

363 device_set_desc(dev, "Qlogic ISP 2322 PCI FC-AL Adapter");
364 break;
365 case PCI_QLOGIC_ISP2422:
366 device_set_desc(dev, "Qlogic ISP 2422 PCI FC-AL Adapter");
367 break;
368 case PCI_QLOGIC_ISP6312:
369 device_set_desc(dev, "Qlogic ISP 6312 PCI FC-AL Adapter");
370 break;
371 default:
372 return (ENXIO);
373 }
374 if (isp_announced == 0 && bootverbose) {
375 printf("Qlogic ISP Driver, FreeBSD Version %d.%d, "
376 "Core Version %d.%d\n",
377 ISP_PLATFORM_VERSION_MAJOR, ISP_PLATFORM_VERSION_MINOR,
378 ISP_CORE_VERSION_MAJOR, ISP_CORE_VERSION_MINOR);

--- 464 unchanged lines hidden (view full) ---

843 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2312 ||
844 pci_get_devid(dev) == PCI_QLOGIC_ISP6312) {
845 mdvp = &mdvec_2300;
846 basetype = ISP_HA_FC_2312;
847 psize = sizeof (fcparam);
848 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] =
849 PCI_MBOX_REGS2300_OFF;
850 }
851 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2322) {
852 mdvp = &mdvec_2300;
853 basetype = ISP_HA_FC_2322;
854 psize = sizeof (fcparam);
855 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] =
856 PCI_MBOX_REGS2300_OFF;
857 }
858 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2422) {
859 mdvp = &mdvec_2300;

--- 8 unchanged lines hidden (view full) ---

868 device_printf(dev, "cannot allocate parameter data\n");
869 goto bad;
870 }
871 isp->isp_mdvec = mdvp;
872 isp->isp_type = basetype;
873 isp->isp_revision = pci_get_revid(dev);
874 isp->isp_dev = dev;
875
876 /*
877 * Try and find firmware for this device.
878 */
879
880 if (isp_get_firmware_p) {
881 int device = (int) pci_get_device(dev);
882#ifdef ISP_TARGET_MODE
883 (*isp_get_firmware_p)(0, 1, device, &mdvp->dv_ispfw);
884#else
885 (*isp_get_firmware_p)(0, 0, device, &mdvp->dv_ispfw);
886#endif
887 }
888
889 /*
890 * Make sure that SERR, PERR, WRITE INVALIDATE and BUSMASTER
891 * are set.
892 */
893 cmd |= PCIM_CMD_SEREN | PCIM_CMD_PERRESPEN |
894 PCIM_CMD_BUSMASTEREN | PCIM_CMD_INVEN;
895 if (IS_2300(isp)) { /* per QLogic errata */
896 cmd &= ~PCIM_CMD_INVEN;
897 }
898 if (IS_23XX(isp)) {
899 /*
900 * Can't tell if ROM will hang on 'ABOUT FIRMWARE' command.
901 */
902 isp->isp_touched = 1;
903
904 }
905

--- 1520 unchanged lines hidden ---