isp_pci.c (160080) | isp_pci.c (160212) |
---|---|
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> | 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 $"); | 32__FBSDID("$FreeBSD: head/sys/dev/isp/isp_pci.c 160212 2006-07-09 17:50:20Z mjacob $"); |
33 34#include <sys/param.h> 35#include <sys/systm.h> 36#include <sys/kernel.h> 37#include <sys/module.h> | 33 34#include <sys/param.h> 35#include <sys/systm.h> 36#include <sys/kernel.h> 37#include <sys/module.h> |
38#if __FreeBSD_version >= 700000 39#include <sys/linker.h> 40#include <sys/firmware.h> 41#endif |
|
38#include <sys/bus.h> 39#if __FreeBSD_version < 500000 | 42#include <sys/bus.h> 43#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 | 44#include <pci/pcireg.h> 45#include <pci/pcivar.h> 46#include <machine/bus_memio.h> 47#include <machine/bus_pio.h> 48#else 49#include <sys/stdint.h> 50#include <dev/pci/pcireg.h> 51#include <dev/pci/pcivar.h> --- 18 unchanged lines hidden (view full) --- 70static int 71isp_pci_rd_isr_2300(ispsoftc_t *, uint16_t *, uint16_t *, uint16_t *); 72static int isp_pci_mbxdma(ispsoftc_t *); 73static int 74isp_pci_dmasetup(ispsoftc_t *, XS_T *, ispreq_t *, uint16_t *, uint16_t); 75static void 76isp_pci_dmateardown(ispsoftc_t *, XS_T *, uint16_t); 77 |
78 |
|
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 | 79static void isp_pci_reset1(ispsoftc_t *); 80static void isp_pci_dumpregs(ispsoftc_t *, const char *); 81 82static struct ispmdvec mdvec = { 83 isp_pci_rd_isr, 84 isp_pci_rd_reg, 85 isp_pci_wr_reg, 86 isp_pci_mbxdma, --- 153 unchanged lines hidden (view full) --- 240#ifndef PCI_PRODUCT_QLOGIC_ISP2422 241#define PCI_PRODUCT_QLOGIC_ISP2422 0x2422 242#endif 243 244#ifndef PCI_PRODUCT_QLOGIC_ISP6312 245#define PCI_PRODUCT_QLOGIC_ISP6312 0x6312 246#endif 247 |
248#ifndef PCI_PRODUCT_QLOGIC_ISP6322 249#define PCI_PRODUCT_QLOGIC_ISP6322 0x6322 250#endif 251 252 |
|
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 | 253#define PCI_QLOGIC_ISP1020 \ 254 ((PCI_PRODUCT_QLOGIC_ISP1020 << 16) | PCI_VENDOR_QLOGIC) 255 256#define PCI_QLOGIC_ISP1080 \ 257 ((PCI_PRODUCT_QLOGIC_ISP1080 << 16) | PCI_VENDOR_QLOGIC) 258 259#define PCI_QLOGIC_ISP10160 \ 260 ((PCI_PRODUCT_QLOGIC_ISP10160 << 16) | PCI_VENDOR_QLOGIC) --- 23 unchanged lines hidden (view full) --- 284 ((PCI_PRODUCT_QLOGIC_ISP2322 << 16) | PCI_VENDOR_QLOGIC) 285 286#define PCI_QLOGIC_ISP2422 \ 287 ((PCI_PRODUCT_QLOGIC_ISP2422 << 16) | PCI_VENDOR_QLOGIC) 288 289#define PCI_QLOGIC_ISP6312 \ 290 ((PCI_PRODUCT_QLOGIC_ISP6312 << 16) | PCI_VENDOR_QLOGIC) 291 |
292#define PCI_QLOGIC_ISP6322 \ 293 ((PCI_PRODUCT_QLOGIC_ISP6322 << 16) | PCI_VENDOR_QLOGIC) 294 |
|
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}; | 295/* 296 * Odd case for some AMI raid cards... We need to *not* attach to this. 297 */ 298#define AMI_RAID_SUBVENDOR_ID 0x101e 299 300#define IO_MAP_REG 0x10 301#define MEM_MAP_REG 0x14 302 --- 10 unchanged lines hidden (view full) --- 313 struct resource * pci_reg; 314 bus_space_tag_t pci_st; 315 bus_space_handle_t pci_sh; 316 void * ih; 317 int16_t pci_poff[_NREG_BLKS]; 318 bus_dma_tag_t dmat; 319 bus_dmamap_t *dmaps; 320}; |
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); | 321 322static device_method_t isp_pci_methods[] = { 323 /* Device interface */ 324 DEVMETHOD(device_probe, isp_pci_probe), 325 DEVMETHOD(device_attach, isp_pci_attach), 326 { 0, 0 } 327}; 328static void isp_pci_intr(void *); 329 330static driver_t isp_pci_driver = { 331 "isp", isp_pci_methods, sizeof (struct isp_pcisoftc) 332}; 333static devclass_t isp_devclass; 334DRIVER_MODULE(isp, pci, isp_pci_driver, isp_devclass, 0, 0); |
335#if __FreeBSD_version >= 700000 336MODULE_DEPEND(isp, ispfw, 1, 1, 1); 337MODULE_DEPEND(isp, firmware, 1, 1, 1); 338#else 339typedef void ispfwfunc(int, int, int, uint16_t **); 340extern ispfwfunc *isp_get_firmware_p; 341#endif |
|
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; | 342 343static int 344isp_pci_probe(device_t dev) 345{ 346 switch ((pci_get_device(dev) << 16) | (pci_get_vendor(dev))) { 347 case PCI_QLOGIC_ISP1020: 348 device_set_desc(dev, "Qlogic ISP 1020/1040 PCI SCSI Adapter"); 349 break; --- 31 unchanged lines hidden (view full) --- 381 device_set_desc(dev, "Qlogic ISP 2322 PCI FC-AL Adapter"); 382 break; 383 case PCI_QLOGIC_ISP2422: 384 device_set_desc(dev, "Qlogic ISP 2422 PCI FC-AL Adapter"); 385 break; 386 case PCI_QLOGIC_ISP6312: 387 device_set_desc(dev, "Qlogic ISP 6312 PCI FC-AL Adapter"); 388 break; |
389 case PCI_QLOGIC_ISP6322: 390 device_set_desc(dev, "Qlogic ISP 6322 PCI FC-AL Adapter"); 391 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 } | 392 default: 393 return (ENXIO); 394 } 395 if (isp_announced == 0 && bootverbose) { 396 printf("Qlogic ISP Driver, FreeBSD Version %d.%d, " 397 "Core Version %d.%d\n", 398 ISP_PLATFORM_VERSION_MAJOR, ISP_PLATFORM_VERSION_MINOR, 399 ISP_CORE_VERSION_MAJOR, ISP_CORE_VERSION_MINOR); --- 464 unchanged lines hidden (view full) --- 864 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2312 || 865 pci_get_devid(dev) == PCI_QLOGIC_ISP6312) { 866 mdvp = &mdvec_2300; 867 basetype = ISP_HA_FC_2312; 868 psize = sizeof (fcparam); 869 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 870 PCI_MBOX_REGS2300_OFF; 871 } |
851 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2322) { | 872 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2322 || 873 pci_get_devid(dev) == PCI_QLOGIC_ISP6322) { |
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 | 874 mdvp = &mdvec_2300; 875 basetype = ISP_HA_FC_2322; 876 psize = sizeof (fcparam); 877 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 878 PCI_MBOX_REGS2300_OFF; 879 } 880 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2422) { 881 mdvp = &mdvec_2300; --- 8 unchanged lines hidden (view full) --- 890 device_printf(dev, "cannot allocate parameter data\n"); 891 goto bad; 892 } 893 isp->isp_mdvec = mdvp; 894 isp->isp_type = basetype; 895 isp->isp_revision = pci_get_revid(dev); 896 isp->isp_dev = dev; 897 |
898#if __FreeBSD_version >= 700000 |
|
876 /* 877 * Try and find firmware for this device. 878 */ | 899 /* 900 * Try and find firmware for this device. 901 */ |
902 { 903 char fwname[32]; 904 unsigned int did = pci_get_device(dev); |
|
879 | 905 |
906 /* 907 * Map a few pci ids to fw names 908 */ 909 switch (did) { 910 case PCI_PRODUCT_QLOGIC_ISP1020: 911 did = 0x1040; 912 break; 913 case PCI_PRODUCT_QLOGIC_ISP1240: 914 did = 0x1080; 915 break; 916 case PCI_PRODUCT_QLOGIC_ISP10160: 917 case PCI_PRODUCT_QLOGIC_ISP12160: 918 did = 0x12160; 919 break; 920 case PCI_PRODUCT_QLOGIC_ISP6312: 921 case PCI_PRODUCT_QLOGIC_ISP2312: 922 did = 0x2300; 923 break; 924 case PCI_PRODUCT_QLOGIC_ISP6322: 925 did = 0x2322; 926 break; 927 default: 928 break; 929 } 930 931 isp->isp_osinfo.fw = NULL; 932 if (isp->isp_role & ISP_ROLE_TARGET) { 933 snprintf(fwname, sizeof (fwname), "isp_%04x_it", did); 934 isp->isp_osinfo.fw = firmware_get(fwname); 935 } 936 if (isp->isp_osinfo.fw == NULL) { 937 snprintf(fwname, sizeof (fwname), "isp_%04x", did); 938 isp->isp_osinfo.fw = firmware_get(fwname); 939 } 940 if (isp->isp_osinfo.fw != NULL) { 941 union { 942 const void *fred; 943 uint16_t *bob; 944 } u; 945 u.fred = isp->isp_osinfo.fw->data; 946 isp->isp_mdvec->dv_ispfw = u.bob; 947 } 948 } 949#else |
|
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 } | 950 if (isp_get_firmware_p) { 951 int device = (int) pci_get_device(dev); 952#ifdef ISP_TARGET_MODE 953 (*isp_get_firmware_p)(0, 1, device, &mdvp->dv_ispfw); 954#else 955 (*isp_get_firmware_p)(0, 0, device, &mdvp->dv_ispfw); 956#endif 957 } |
958#endif |
|
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; | 959 960 /* 961 * Make sure that SERR, PERR, WRITE INVALIDATE and BUSMASTER 962 * are set. 963 */ 964 cmd |= PCIM_CMD_SEREN | PCIM_CMD_PERRESPEN | 965 PCIM_CMD_BUSMASTEREN | PCIM_CMD_INVEN; |
966 |
|
895 if (IS_2300(isp)) { /* per QLogic errata */ 896 cmd &= ~PCIM_CMD_INVEN; 897 } | 967 if (IS_2300(isp)) { /* per QLogic errata */ 968 cmd &= ~PCIM_CMD_INVEN; 969 } |
970 |
|
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 --- | 971 if (IS_23XX(isp)) { 972 /* 973 * Can't tell if ROM will hang on 'ABOUT FIRMWARE' command. 974 */ 975 isp->isp_touched = 1; 976 977 } 978 --- 1520 unchanged lines hidden --- |