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