diff options
Diffstat (limited to 'sys/dev/pci')
-rw-r--r-- | sys/dev/pci/isp_pci.c | 767 |
1 files changed, 501 insertions, 266 deletions
diff --git a/sys/dev/pci/isp_pci.c b/sys/dev/pci/isp_pci.c index 3f12d0a40cd..a0caffdc95c 100644 --- a/sys/dev/pci/isp_pci.c +++ b/sys/dev/pci/isp_pci.c @@ -1,12 +1,8 @@ -/* $OpenBSD: isp_pci.c,v 1.46 2009/05/31 17:42:13 miod Exp $ */ -/* - * PCI specific probe and attach routines for QLogic ISP SCSI adapters. - * - *--------------------------------------- - * Copyright (c) 1997, 1998, 1999 by Matthew Jacob - * NASA/Ames Research Center +/* $OpenBSD: isp_pci.c,v 1.47 2009/06/24 11:00:53 krw Exp $ */ +/* $FreeBSD: src/sys/dev/isp/isp_pci.c,v 1.148 2007/06/26 23:08:57 mjacob Exp $*/ +/*- + * Copyright (c) 1997-2006 by Matthew Jacob * All rights reserved. - *--------------------------------------- * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -14,10 +10,7 @@ * 1. Redistributions of source code must retain the above copyright * notice immediately at the beginning of the file, without modification, * this list of conditions, and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products + * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND @@ -31,7 +24,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + */ +/* + * PCI specific probe and attach routines for Qlogic ISP SCSI adapters. + * FreeBSD Version. */ #include <dev/ic/isp_openbsd.h> @@ -48,79 +44,36 @@ #include <mips64/archtype.h> #endif -static u_int16_t isp_pci_rd_reg(struct ispsoftc *, int); -static void isp_pci_wr_reg(struct ispsoftc *, int, u_int16_t); -#if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT)) -static u_int16_t isp_pci_rd_reg_1080(struct ispsoftc *, int); -static void isp_pci_wr_reg_1080(struct ispsoftc *, int, u_int16_t); -#endif -static int -isp_pci_rd_isr(struct ispsoftc *, u_int16_t *, u_int16_t *, u_int16_t *); -#ifndef ISP_DISABLE_2300_SUPPORT -static int -isp_pci_rd_isr_2300(struct ispsoftc *, u_int16_t *, u_int16_t *, u_int16_t *); -#endif -static int isp_pci_mbxdma(struct ispsoftc *); -static int isp_pci_dmasetup(struct ispsoftc *, struct scsi_xfer *, - ispreq_t *, u_int16_t *, u_int16_t); -static void -isp_pci_dmateardown (struct ispsoftc *, struct scsi_xfer *, u_int16_t); -static void isp_pci_reset1 (struct ispsoftc *); -static void isp_pci_dumpregs (struct ispsoftc *, const char *); -static int isp_pci_intr (void *); - -#ifdef ISP_COMPILE_FW -#define ISP_COMPILE_1040_FW 1 -#define ISP_COMPILE_1080_FW 1 -#define ISP_COMPILE_12160_FW 1 -#define ISP_COMPILE_2100_FW 1 -#define ISP_COMPILE_2200_FW 1 -#define ISP_COMPILE_2300_FW 1 -#endif - -#if defined(ISP_DISABLE_1040_SUPPORT) || !defined(ISP_COMPILE_1040_FW) -#define ISP_1040_RISC_CODE NULL -#else -#define ISP_1040_RISC_CODE (u_int16_t *) isp_1040_risc_code #include <dev/microcode/isp/asm_1040.h> -#endif - -#if defined(ISP_DISABLE_1080_SUPPORT) || !defined(ISP_COMPILE_1080_FW) -#define ISP_1080_RISC_CODE NULL -#else -#define ISP_1080_RISC_CODE (u_int16_t *) isp_1080_risc_code #include <dev/microcode/isp/asm_1080.h> -#endif - -#if defined(ISP_DISABLE_12160_SUPPORT) || !defined(ISP_COMPILE_12160_FW) -#define ISP_12160_RISC_CODE (u_int16_t *) NULL -#else -#define ISP_12160_RISC_CODE (u_int16_t *) isp_12160_risc_code #include <dev/microcode/isp/asm_12160.h> -#endif - -#if defined(ISP_DISABLE_2100_SUPPORT) || !defined(ISP_COMPILE_2100_FW) -#define ISP_2100_RISC_CODE NULL -#else -#define ISP_2100_RISC_CODE (u_int16_t *) isp_2100_risc_code #include <dev/microcode/isp/asm_2100.h> -#endif - -#if defined(ISP_DISABLE_2200_SUPPORT) || !defined(ISP_COMPILE_2200_FW) -#define ISP_2200_RISC_CODE NULL -#else -#define ISP_2200_RISC_CODE (u_int16_t *) isp_2200_risc_code #include <dev/microcode/isp/asm_2200.h> -#endif - -#if defined(ISP_DISABLE_2300_SUPPORT) || !defined(ISP_COMPILE_2300_FW) -#define ISP_2300_RISC_CODE NULL -#else -#define ISP_2300_RISC_CODE (u_int16_t *) isp_2300_risc_code #include <dev/microcode/isp/asm_2300.h> -#endif +#include <dev/microcode/isp/asm_2400.h> + +#define BUS_PROBE_DEFAULT 0 + +uint32_t isp_pci_rd_reg(ispsoftc_t *, int); +void isp_pci_wr_reg(ispsoftc_t *, int, uint32_t); +uint32_t isp_pci_rd_reg_1080(ispsoftc_t *, int); +void isp_pci_wr_reg_1080(ispsoftc_t *, int, uint32_t); +uint32_t isp_pci_rd_reg_2400(ispsoftc_t *, int); +void isp_pci_wr_reg_2400(ispsoftc_t *, int, uint32_t); +int isp_pci_rd_isr(ispsoftc_t *, uint32_t *, uint16_t *, uint16_t *); +int isp_pci_rd_isr_2300(ispsoftc_t *, uint32_t *, uint16_t *, uint16_t *); +int isp_pci_rd_isr_2400(ispsoftc_t *, uint32_t *, uint16_t *, uint16_t *); +int isp_pci_mbxdma(ispsoftc_t *); +int isp_pci_dmasetup(ispsoftc_t *, XS_T *, ispreq_t *, uint32_t *, uint32_t); +void isp_pci_reset0(ispsoftc_t *); +void isp_pci_reset1(ispsoftc_t *); +void isp_pci_dumpregs(ispsoftc_t *, const char *); + + +int isp_pci_rd_debounced(struct ispsoftc *, int, u_int16_t *); +int isp_pci_intr (void *); +void isp_pci_dmateardown(struct ispsoftc *, XS_T *, u_int32_t); -#ifndef ISP_DISABLE_1020_SUPPORT static struct ispmdvec mdvec = { isp_pci_rd_isr, isp_pci_rd_reg, @@ -128,15 +81,13 @@ static struct ispmdvec mdvec = { isp_pci_mbxdma, isp_pci_dmasetup, isp_pci_dmateardown, - NULL, + isp_pci_reset0, isp_pci_reset1, isp_pci_dumpregs, - ISP_1040_RISC_CODE, + NULL, BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64 }; -#endif -#ifndef ISP_DISABLE_1080_SUPPORT static struct ispmdvec mdvec_1080 = { isp_pci_rd_isr, isp_pci_rd_reg_1080, @@ -144,15 +95,13 @@ static struct ispmdvec mdvec_1080 = { isp_pci_mbxdma, isp_pci_dmasetup, isp_pci_dmateardown, - NULL, + isp_pci_reset0, isp_pci_reset1, isp_pci_dumpregs, - ISP_1080_RISC_CODE, + isp_1080_risc_code, BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64 }; -#endif -#ifndef ISP_DISABLE_12160_SUPPORT static struct ispmdvec mdvec_12160 = { isp_pci_rd_isr, isp_pci_rd_reg_1080, @@ -160,15 +109,13 @@ static struct ispmdvec mdvec_12160 = { isp_pci_mbxdma, isp_pci_dmasetup, isp_pci_dmateardown, - NULL, + isp_pci_reset0, isp_pci_reset1, isp_pci_dumpregs, - ISP_12160_RISC_CODE, + isp_12160_risc_code, BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64 }; -#endif -#ifndef ISP_DISABLE_2100_SUPPORT static struct ispmdvec mdvec_2100 = { isp_pci_rd_isr, isp_pci_rd_reg, @@ -176,14 +123,12 @@ static struct ispmdvec mdvec_2100 = { isp_pci_mbxdma, isp_pci_dmasetup, isp_pci_dmateardown, - NULL, + isp_pci_reset0, isp_pci_reset1, isp_pci_dumpregs, - ISP_2100_RISC_CODE + isp_2100_risc_code }; -#endif -#ifndef ISP_DISABLE_2200_SUPPORT static struct ispmdvec mdvec_2200 = { isp_pci_rd_isr, isp_pci_rd_reg, @@ -191,14 +136,12 @@ static struct ispmdvec mdvec_2200 = { isp_pci_mbxdma, isp_pci_dmasetup, isp_pci_dmateardown, - NULL, + isp_pci_reset0, isp_pci_reset1, isp_pci_dumpregs, - ISP_2200_RISC_CODE + isp_2200_risc_code }; -#endif -#ifndef ISP_DISABLE_2300_SUPPORT static struct ispmdvec mdvec_2300 = { isp_pci_rd_isr_2300, isp_pci_rd_reg, @@ -206,15 +149,58 @@ static struct ispmdvec mdvec_2300 = { isp_pci_mbxdma, isp_pci_dmasetup, isp_pci_dmateardown, - NULL, + isp_pci_reset0, isp_pci_reset1, isp_pci_dumpregs, - ISP_2300_RISC_CODE + isp_2300_risc_code +}; + +static struct ispmdvec mdvec_2400 = { + isp_pci_rd_isr_2400, + isp_pci_rd_reg_2400, + isp_pci_wr_reg_2400, + isp_pci_mbxdma, + isp_pci_dmasetup, + isp_pci_dmateardown, + isp_pci_reset0, + isp_pci_reset1, + NULL }; + +#ifndef PCIM_CMD_INVEN +#define PCIM_CMD_INVEN 0x10 +#endif +#ifndef PCIM_CMD_BUSMASTEREN +#define PCIM_CMD_BUSMASTEREN 0x0004 +#endif +#ifndef PCIM_CMD_PERRESPEN +#define PCIM_CMD_PERRESPEN 0x0040 +#endif +#ifndef PCIM_CMD_SEREN +#define PCIM_CMD_SEREN 0x0100 +#endif +#ifndef PCIM_CMD_INTX_DISABLE +#define PCIM_CMD_INTX_DISABLE 0x0400 +#endif + +#ifndef PCIR_COMMAND +#define PCIR_COMMAND 0x04 +#endif + +#ifndef PCIR_CACHELNSZ +#define PCIR_CACHELNSZ 0x0c +#endif + +#ifndef PCIR_LATTIMER +#define PCIR_LATTIMER 0x0d +#endif + +#ifndef PCIR_ROMADDR +#define PCIR_ROMADDR 0x30 #endif #ifndef PCI_VENDOR_QLOGIC -#define PCI_VENDOR_QLOGIC 0x1077 +#define PCI_VENDOR_QLOGIC 0x1077 #endif #ifndef PCI_PRODUCT_QLOGIC_ISP1020 @@ -225,14 +211,6 @@ static struct ispmdvec mdvec_2300 = { #define PCI_PRODUCT_QLOGIC_ISP1080 0x1080 #endif -#ifndef PCI_PRODUCT_QLOGIC_ISP1240 -#define PCI_PRODUCT_QLOGIC_ISP1240 0x1240 -#endif - -#ifndef PCI_PRODUCT_QLOGIC_ISP1280 -#define PCI_PRODUCT_QLOGIC_ISP1280 0x1280 -#endif - #ifndef PCI_PRODUCT_QLOGIC_ISP10160 #define PCI_PRODUCT_QLOGIC_ISP10160 0x1016 #endif @@ -241,6 +219,14 @@ static struct ispmdvec mdvec_2300 = { #define PCI_PRODUCT_QLOGIC_ISP12160 0x1216 #endif +#ifndef PCI_PRODUCT_QLOGIC_ISP1240 +#define PCI_PRODUCT_QLOGIC_ISP1240 0x1240 +#endif + +#ifndef PCI_PRODUCT_QLOGIC_ISP1280 +#define PCI_PRODUCT_QLOGIC_ISP1280 0x1280 +#endif + #ifndef PCI_PRODUCT_QLOGIC_ISP2100 #define PCI_PRODUCT_QLOGIC_ISP2100 0x2100 #endif @@ -257,20 +243,32 @@ static struct ispmdvec mdvec_2300 = { #define PCI_PRODUCT_QLOGIC_ISP2312 0x2312 #endif +#ifndef PCI_PRODUCT_QLOGIC_ISP2322 +#define PCI_PRODUCT_QLOGIC_ISP2322 0x2322 +#endif + +#ifndef PCI_PRODUCT_QLOGIC_ISP2422 +#define PCI_PRODUCT_QLOGIC_ISP2422 0x2422 +#endif + +#ifndef PCI_PRODUCT_QLOGIC_ISP2432 +#define PCI_PRODUCT_QLOGIC_ISP2432 0x2432 +#endif + #ifndef PCI_PRODUCT_QLOGIC_ISP6312 #define PCI_PRODUCT_QLOGIC_ISP6312 0x6312 #endif -#define PCI_QLOGIC_ISP ((PCI_PRODUCT_QLOGIC_ISP1020 << 16) | PCI_VENDOR_QLOGIC) +#ifndef PCI_PRODUCT_QLOGIC_ISP6322 +#define PCI_PRODUCT_QLOGIC_ISP6322 0x6322 +#endif -#define PCI_QLOGIC_ISP1080 \ - ((PCI_PRODUCT_QLOGIC_ISP1080 << 16) | PCI_VENDOR_QLOGIC) -#define PCI_QLOGIC_ISP1240 \ - ((PCI_PRODUCT_QLOGIC_ISP1240 << 16) | PCI_VENDOR_QLOGIC) +#define PCI_QLOGIC_ISP1020 \ + ((PCI_PRODUCT_QLOGIC_ISP1020 << 16) | PCI_VENDOR_QLOGIC) -#define PCI_QLOGIC_ISP1280 \ - ((PCI_PRODUCT_QLOGIC_ISP1280 << 16) | PCI_VENDOR_QLOGIC) +#define PCI_QLOGIC_ISP1080 \ + ((PCI_PRODUCT_QLOGIC_ISP1080 << 16) | PCI_VENDOR_QLOGIC) #define PCI_QLOGIC_ISP10160 \ ((PCI_PRODUCT_QLOGIC_ISP10160 << 16) | PCI_VENDOR_QLOGIC) @@ -278,6 +276,12 @@ static struct ispmdvec mdvec_2300 = { #define PCI_QLOGIC_ISP12160 \ ((PCI_PRODUCT_QLOGIC_ISP12160 << 16) | PCI_VENDOR_QLOGIC) +#define PCI_QLOGIC_ISP1240 \ + ((PCI_PRODUCT_QLOGIC_ISP1240 << 16) | PCI_VENDOR_QLOGIC) + +#define PCI_QLOGIC_ISP1280 \ + ((PCI_PRODUCT_QLOGIC_ISP1280 << 16) | PCI_VENDOR_QLOGIC) + #define PCI_QLOGIC_ISP2100 \ ((PCI_PRODUCT_QLOGIC_ISP2100 << 16) | PCI_VENDOR_QLOGIC) @@ -290,18 +294,28 @@ static struct ispmdvec mdvec_2300 = { #define PCI_QLOGIC_ISP2312 \ ((PCI_PRODUCT_QLOGIC_ISP2312 << 16) | PCI_VENDOR_QLOGIC) +#define PCI_QLOGIC_ISP2322 \ + ((PCI_PRODUCT_QLOGIC_ISP2322 << 16) | PCI_VENDOR_QLOGIC) + +#define PCI_QLOGIC_ISP2422 \ + ((PCI_PRODUCT_QLOGIC_ISP2422 << 16) | PCI_VENDOR_QLOGIC) + +#define PCI_QLOGIC_ISP2432 \ + ((PCI_PRODUCT_QLOGIC_ISP2432 << 16) | PCI_VENDOR_QLOGIC) + #define PCI_QLOGIC_ISP6312 \ ((PCI_PRODUCT_QLOGIC_ISP6312 << 16) | PCI_VENDOR_QLOGIC) +#define PCI_QLOGIC_ISP6322 \ + ((PCI_PRODUCT_QLOGIC_ISP6322 << 16) | PCI_VENDOR_QLOGIC) + /* * Odd case for some AMI raid cards... We need to *not* attach to this. */ #define AMI_RAID_SUBVENDOR_ID 0x101e - -#define IO_MAP_REG 0x10 -#define MEM_MAP_REG 0x14 -#define PCIR_ROMADDR 0x30 +#define IO_MAP_REG 0x10 +#define MEM_MAP_REG 0x14 #define PCI_DFLT_LTNCY 0x40 #define PCI_DFLT_LNSZ 0x10 @@ -314,9 +328,29 @@ static struct ispmdvec mdvec_2300 = { #endif #endif -static int isp_pci_probe (struct device *, void *, void *); -static void isp_pci_attach (struct device *, struct device *, void *); +const struct pci_matchid ispdev[] = { + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP1020 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP1080 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP1240 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP1280 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP10160 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP12160 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP2100 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP2200 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP2300 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP2312 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP2322 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP2422 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP2432 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP6312 }, + { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP6322 }, + { 0, 0 } +}; + +int isp_pci_probe (struct device *, void *, void *); +void isp_pci_attach (struct device *, struct device *, void *); +#define ISP_PCD(isp) ((struct isp_pcisoftc *)isp)->pci_dev struct isp_pcisoftc { struct ispsoftc pci_isp; pci_chipset_tag_t pci_pc; @@ -332,39 +366,7 @@ struct cfattach isp_pci_ca = { sizeof (struct isp_pcisoftc), isp_pci_probe, isp_pci_attach }; -#ifdef DEBUG -const char vstring[] = - "QLogic ISP Driver, NetBSD (pci) Platform Version %d.%d Core Version %d.%d"; -#endif - -const struct pci_matchid ispdev[] = { -#ifndef ISP_DISABLE_1020_SUPPORT - { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP1020 }, -#endif -#ifndef ISP_DISABLE_1080_SUPPORT - { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP1080 }, - { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP1240 }, - { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP1280 }, -#endif -#ifndef ISP_DISABLE_12160_SUPPORT - { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP10160 }, - { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP12160 }, -#endif -#ifndef ISP_DISABLE_2100_SUPPORT - { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP2100 }, -#endif -#ifndef ISP_DISABLE_2200_SUPPORT - { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP2200 }, -#endif -#ifndef ISP_DISABLE_2300_SUPPORT - { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP2300 }, - { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP2312 }, - { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP6312 }, -#endif - { 0, 0 } -}; - -static int +int isp_pci_probe(struct device *parent, void *match, void *aux) { struct pci_attach_args *pa = aux; @@ -386,7 +388,7 @@ isp_pci_probe(struct device *parent, void *match, void *aux) } -static void +void isp_pci_attach(struct device *parent, struct device *self, void *aux) { #ifdef DEBUG @@ -395,7 +397,7 @@ isp_pci_attach(struct device *parent, struct device *self, void *aux) static const char nomem[] = ": no mem for sdparam table\n"; u_int32_t data, rev, linesz = PCI_DFLT_LNSZ; struct pci_attach_args *pa = aux; - struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) self; + struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)self; struct ispsoftc *isp = &pcs->pci_isp; bus_space_tag_t st, iot, memt; bus_space_handle_t sh, ioh, memh; @@ -487,8 +489,8 @@ isp_pci_attach(struct device *parent, struct device *self, void *aux) printf("\n"); #endif - pcs->pci_st = st; - pcs->pci_sh = sh; + pcs->pci_st = isp->isp_bus_tag = st; + pcs->pci_sh = isp->isp_bus_handle = sh; pcs->pci_pc = pa->pa_pc; pcs->pci_tag = pa->pa_tag; pcs->pci_poff[BIU_BLOCK >> _BLK_REG_SHFT] = BIU_REGS_OFF; @@ -497,8 +499,7 @@ isp_pci_attach(struct device *parent, struct device *self, void *aux) pcs->pci_poff[RISC_BLOCK >> _BLK_REG_SHFT] = PCI_RISC_REGS_OFF; pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = DMA_REGS_OFF; rev = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG) & 0xff; -#ifndef ISP_DISABLE_1020_SUPPORT - if (pa->pa_id == PCI_QLOGIC_ISP) { + if (pa->pa_id == PCI_QLOGIC_ISP1020) { isp->isp_mdvec = &mdvec; isp->isp_type = ISP_HA_SCSI_UNKNOWN; isp->isp_param = malloc(sizeof(sdparam), M_DEVBUF, @@ -508,8 +509,6 @@ isp_pci_attach(struct device *parent, struct device *self, void *aux) return; } } -#endif -#ifndef ISP_DISABLE_1080_SUPPORT if (pa->pa_id == PCI_QLOGIC_ISP1080) { isp->isp_mdvec = &mdvec_1080; isp->isp_type = ISP_HA_SCSI_1080; @@ -546,8 +545,6 @@ isp_pci_attach(struct device *parent, struct device *self, void *aux) pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = ISP1080_DMA_REGS_OFF; } -#endif -#ifndef ISP_DISABLE_12160_SUPPORT if (pa->pa_id == PCI_QLOGIC_ISP10160) { isp->isp_mdvec = &mdvec_12160; isp->isp_type = ISP_HA_SCSI_10160; @@ -572,8 +569,6 @@ isp_pci_attach(struct device *parent, struct device *self, void *aux) pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = ISP1080_DMA_REGS_OFF; } -#endif -#ifndef ISP_DISABLE_2100_SUPPORT if (pa->pa_id == PCI_QLOGIC_ISP2100) { isp->isp_mdvec = &mdvec_2100; isp->isp_type = ISP_HA_FC_2100; @@ -595,8 +590,6 @@ isp_pci_attach(struct device *parent, struct device *self, void *aux) linesz = 1; } } -#endif -#ifndef ISP_DISABLE_2200_SUPPORT if (pa->pa_id == PCI_QLOGIC_ISP2200) { isp->isp_mdvec = &mdvec_2200; isp->isp_type = ISP_HA_FC_2200; @@ -621,18 +614,38 @@ isp_pci_attach(struct device *parent, struct device *self, void *aux) } #endif } -#endif -#ifndef ISP_DISABLE_2300_SUPPORT - if (pa->pa_id == PCI_QLOGIC_ISP2300 || - pa->pa_id == PCI_QLOGIC_ISP2312 || + if (pa->pa_id == PCI_QLOGIC_ISP2300) { + isp->isp_mdvec = &mdvec_2300; + isp->isp_type = ISP_HA_FC_2300; + isp->isp_param = malloc(sizeof(fcparam), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (isp->isp_param == NULL) { + printf(nomem); + return; + } + pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = + PCI_MBOX_REGS2300_OFF; + } + if (pa->pa_id == PCI_QLOGIC_ISP2312 || pa->pa_id == PCI_QLOGIC_ISP6312) { isp->isp_mdvec = &mdvec_2300; - if (pa->pa_id == PCI_QLOGIC_ISP2300) { - isp->isp_type = ISP_HA_FC_2300; - } else { - isp->isp_type = ISP_HA_FC_2312; - isp->isp_port = pa->pa_function; + isp->isp_type = ISP_HA_FC_2312; + isp->isp_port = pa->pa_function; + isp->isp_param = malloc(sizeof(fcparam), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (isp->isp_param == NULL) { + printf(nomem); + return; } + pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = + PCI_MBOX_REGS2300_OFF; + data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG); + } + if (pa->pa_id == PCI_QLOGIC_ISP2322 || + pa->pa_id == PCI_QLOGIC_ISP6322) { + isp->isp_mdvec = &mdvec_2300; + isp->isp_type = ISP_HA_FC_2322; + isp->isp_port = pa->pa_function; isp->isp_param = malloc(sizeof(fcparam), M_DEVBUF, M_NOWAIT | M_ZERO); if (isp->isp_param == NULL) { @@ -643,7 +656,20 @@ isp_pci_attach(struct device *parent, struct device *self, void *aux) PCI_MBOX_REGS2300_OFF; data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG); } -#endif + if (pa->pa_id == PCI_QLOGIC_ISP2422 || + pa->pa_id == PCI_QLOGIC_ISP2432) { + isp->isp_mdvec = &mdvec_2400; + isp->isp_type = ISP_HA_FC_2400; + isp->isp_port = pa->pa_function; + isp->isp_param = malloc(sizeof(fcparam), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (isp->isp_param == NULL) { + printf(nomem); + return; + } + pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = + PCI_MBOX_REGS2400_OFF; + } /* * Set up logging levels. */ @@ -739,7 +765,7 @@ isp_pci_attach(struct device *parent, struct device *self, void *aux) free(isp->isp_param, M_DEVBUF); return; } - ENABLE_INTS(isp); + ISP_ENABLE_INTS(isp); isp_init(isp); if (isp->isp_state != ISP_INITSTATE) { isp_uninit(isp); @@ -762,19 +788,22 @@ isp_pci_attach(struct device *parent, struct device *self, void *aux) #define IspVirt2Off(a, x) \ (((struct isp_pcisoftc *)a)->pci_poff[((x) & _BLK_REG_MASK) >> \ - _BLK_REG_SHFT] + ((x) & 0xff)) + _BLK_REG_SHFT] + ((x) & 0xfff)) #define BXR2(pcs, off) \ bus_space_read_2(pcs->pci_st, pcs->pci_sh, off) #define BXW2(pcs, off, v) \ bus_space_write_2(pcs->pci_st, pcs->pci_sh, off, v) +#define BXR4(pcs, off) \ + bus_space_read_4(pcs->pci_st, pcs->pci_sh, off) +#define BXW4(pcs, off, v) \ + bus_space_write_4(pcs->pci_st, pcs->pci_sh, off, v) - -static INLINE int +int isp_pci_rd_debounced(struct ispsoftc *isp, int off, u_int16_t *rp) { - struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; - u_int16_t val0, val1; + struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; + u_int32_t val0, val1; int i = 0; do { @@ -788,11 +817,11 @@ isp_pci_rd_debounced(struct ispsoftc *isp, int off, u_int16_t *rp) return (0); } -static int -isp_pci_rd_isr(struct ispsoftc *isp, u_int16_t *isrp, +int +isp_pci_rd_isr(struct ispsoftc *isp, u_int32_t *isrp, u_int16_t *semap, u_int16_t *mbp) { - struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; + struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; u_int16_t isr, sema; if (IS_2100(isp)) { @@ -825,20 +854,19 @@ isp_pci_rd_isr(struct ispsoftc *isp, u_int16_t *isrp, return (1); } -#ifndef ISP_DISABLE_2300_SUPPORT -static int -isp_pci_rd_isr_2300(struct ispsoftc *isp, u_int16_t *isrp, +int +isp_pci_rd_isr_2300(struct ispsoftc *isp, u_int32_t *isrp, u_int16_t *semap, u_int16_t *mbox0p) { - struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; + struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; + u_int32_t hccr; u_int32_t r2hisr; if (!(BXR2(pcs, IspVirt2Off(isp, BIU_ISR)) & BIU2100_ISR_RISC_INT)) { *isrp = 0; return (0); } - r2hisr = bus_space_read_4(pcs->pci_st, pcs->pci_sh, - IspVirt2Off(pcs, BIU_R2HSTSLO)); + r2hisr = BXR4(pcs, IspVirt2Off(isp, BIU_R2HSTSLO)); isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr); if ((r2hisr & BIU_R2HST_INTR) == 0) { *isrp = 0; @@ -875,16 +903,26 @@ isp_pci_rd_isr_2300(struct ispsoftc *isp, u_int16_t *isrp, *semap = 0; return (1); default: + hccr = ISP_READ(isp, HCCR); + if (hccr & HCCR_PAUSE) { + ISP_WRITE(isp, HCCR, HCCR_RESET); + isp_prt(isp, ISP_LOGERR, + "RISC paused at interrupt (%x->%x)", hccr, + ISP_READ(isp, HCCR)); + ISP_WRITE(isp, BIU_ICR, 0); + } else { + isp_prt(isp, ISP_LOGERR, "unknown interrupt 0x%x\n", + r2hisr); + } return (0); } } -#endif -static u_int16_t +u_int32_t isp_pci_rd_reg(struct ispsoftc *isp, int regoff) { u_int16_t rv; - struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; + struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; int oldconf = 0; if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { @@ -894,18 +932,57 @@ isp_pci_rd_reg(struct ispsoftc *isp, int regoff) oldconf = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oldconf | BIU_PCI_CONF1_SXP); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, BIU_CONF1), 2); } rv = BXR2(pcs, IspVirt2Off(isp, regoff)); if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oldconf); } + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, BIU_CONF1), 2); return (rv); } -static void -isp_pci_wr_reg(struct ispsoftc *isp, int regoff, u_int16_t val) +int +isp_pci_rd_isr_2400(ispsoftc_t *isp, uint32_t *isrp, + uint16_t *semap, uint16_t *mbox0p) { - struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; + struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; + uint32_t r2hisr; + + r2hisr = BXR4(pcs, IspVirt2Off(isp, BIU2400_R2HSTSLO)); + isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr); + if ((r2hisr & BIU2400_R2HST_INTR) == 0) { + *isrp = 0; + return (0); + } + switch (r2hisr & BIU2400_R2HST_ISTAT_MASK) { + case ISP2400R2HST_ROM_MBX_OK: + case ISP2400R2HST_ROM_MBX_FAIL: + case ISP2400R2HST_MBX_OK: + case ISP2400R2HST_MBX_FAIL: + case ISP2400R2HST_ASYNC_EVENT: + *isrp = r2hisr & 0xffff; + *mbox0p = (r2hisr >> 16); + *semap = 1; + return (1); + case ISP2400R2HST_RSPQ_UPDATE: + case ISP2400R2HST_ATIO_RSPQ_UPDATE: + case ISP2400R2HST_ATIO_RQST_UPDATE: + *isrp = r2hisr & 0xffff; + *mbox0p = 0; + *semap = 0; + return (1); + default: + ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RISC_INT); + isp_prt(isp, ISP_LOGERR, "unknown interrupt 0x%x\n", r2hisr); + return (0); + } +} + +void +isp_pci_wr_reg(struct ispsoftc *isp, int regoff, u_int32_t val) +{ + struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; int oldconf = 0; if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { @@ -915,23 +992,26 @@ isp_pci_wr_reg(struct ispsoftc *isp, int regoff, u_int16_t val) oldconf = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oldconf | BIU_PCI_CONF1_SXP); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, BIU_CONF1), 2); } BXW2(pcs, IspVirt2Off(isp, regoff), val); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, regoff), 2); if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oldconf); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, BIU_CONF1), 2); } + } -#if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT)) -static u_int16_t +u_int32_t isp_pci_rd_reg_1080(struct ispsoftc *isp, int regoff) { - u_int16_t rv, oc = 0; - struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; + struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; + u_int32_t rv, oc = 0; if ((regoff & _BLK_REG_MASK) == SXP_BLOCK || (regoff & _BLK_REG_MASK) == (SXP_BLOCK|SXP_BANK1_SELECT)) { - u_int16_t tc; + u_int32_t tc; /* * We will assume that someone has paused the RISC processor. */ @@ -942,27 +1022,30 @@ isp_pci_rd_reg_1080(struct ispsoftc *isp, int regoff) else tc |= BIU_PCI1080_CONF1_SXP0; BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), tc); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, BIU_CONF1), 2); } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) { oc = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oc | BIU_PCI1080_CONF1_DMA); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, BIU_CONF1), 2); } rv = BXR2(pcs, IspVirt2Off(isp, regoff)); if (oc) { BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oc); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, BIU_CONF1), 2); } return (rv); } -static void -isp_pci_wr_reg_1080(struct ispsoftc *isp, int regoff, u_int16_t val) +void +isp_pci_wr_reg_1080(struct ispsoftc *isp, int regoff, u_int32_t val) { - struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; + struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; int oc = 0; if ((regoff & _BLK_REG_MASK) == SXP_BLOCK || (regoff & _BLK_REG_MASK) == (SXP_BLOCK|SXP_BANK1_SELECT)) { - u_int16_t tc; + u_int32_t tc; /* * We will assume that someone has paused the RISC processor. */ @@ -973,26 +1056,155 @@ isp_pci_wr_reg_1080(struct ispsoftc *isp, int regoff, u_int16_t val) else tc |= BIU_PCI1080_CONF1_SXP0; BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), tc); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, BIU_CONF1), 2); } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) { oc = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oc | BIU_PCI1080_CONF1_DMA); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, BIU_CONF1), 2); } BXW2(pcs, IspVirt2Off(isp, regoff), val); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, regoff), 2); if (oc) { BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oc); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, BIU_CONF1), 2); } } -#endif -static int +uint32_t +isp_pci_rd_reg_2400(ispsoftc_t *isp, int regoff) +{ + struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; + uint32_t rv; + int block = regoff & _BLK_REG_MASK; + + switch (block) { + case BIU_BLOCK: + break; + case MBOX_BLOCK: + return (BXR2(pcs, IspVirt2Off(isp, regoff))); + case SXP_BLOCK: + isp_prt(isp, ISP_LOGWARN, "SXP_BLOCK read at 0x%x", regoff); + return (0xffffffff); + case RISC_BLOCK: + isp_prt(isp, ISP_LOGWARN, "RISC_BLOCK read at 0x%x", regoff); + return (0xffffffff); + case DMA_BLOCK: + isp_prt(isp, ISP_LOGWARN, "DMA_BLOCK read at 0x%x", regoff); + return (0xffffffff); + default: + isp_prt(isp, ISP_LOGWARN, "unknown block read at 0x%x", regoff); + return (0xffffffff); + } + + + switch (regoff) { + case BIU2400_FLASH_ADDR: + case BIU2400_FLASH_DATA: + case BIU2400_ICR: + case BIU2400_ISR: + case BIU2400_CSR: + case BIU2400_REQINP: + case BIU2400_REQOUTP: + case BIU2400_RSPINP: + case BIU2400_RSPOUTP: + case BIU2400_PRI_RQINP: + case BIU2400_PRI_RSPINP: + case BIU2400_ATIO_RSPINP: + case BIU2400_ATIO_REQINP: + case BIU2400_HCCR: + case BIU2400_GPIOD: + case BIU2400_GPIOE: + case BIU2400_HSEMA: + rv = BXR4(pcs, IspVirt2Off(isp, regoff)); + break; + case BIU2400_R2HSTSLO: + rv = BXR4(pcs, IspVirt2Off(isp, regoff)); + break; + case BIU2400_R2HSTSHI: + rv = BXR4(pcs, IspVirt2Off(isp, regoff)) >> 16; + break; + default: + isp_prt(isp, ISP_LOGERR, + "isp_pci_rd_reg_2400: unknown offset %x", regoff); + rv = 0xffffffff; + break; + } + return (rv); +} + +void +isp_pci_wr_reg_2400(ispsoftc_t *isp, int regoff, uint32_t val) +{ + struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; + int block = regoff & _BLK_REG_MASK; + + switch (block) { + case BIU_BLOCK: + break; + case MBOX_BLOCK: + BXW2(pcs, IspVirt2Off(isp, regoff), val); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, regoff), 2); + return; + case SXP_BLOCK: + isp_prt(isp, ISP_LOGWARN, "SXP_BLOCK write at 0x%x", regoff); + return; + case RISC_BLOCK: + isp_prt(isp, ISP_LOGWARN, "RISC_BLOCK write at 0x%x", regoff); + return; + case DMA_BLOCK: + isp_prt(isp, ISP_LOGWARN, "DMA_BLOCK write at 0x%x", regoff); + return; + default: + isp_prt(isp, ISP_LOGWARN, "unknown block write at 0x%x", + regoff); + break; + } + + switch (regoff) { + case BIU2400_FLASH_ADDR: + case BIU2400_FLASH_DATA: + case BIU2400_ICR: + case BIU2400_ISR: + case BIU2400_CSR: + case BIU2400_REQINP: + case BIU2400_REQOUTP: + case BIU2400_RSPINP: + case BIU2400_RSPOUTP: + case BIU2400_PRI_RQINP: + case BIU2400_PRI_RSPINP: + case BIU2400_ATIO_RSPINP: + case BIU2400_ATIO_REQINP: + case BIU2400_HCCR: + case BIU2400_GPIOD: + case BIU2400_GPIOE: + case BIU2400_HSEMA: + BXW4(pcs, IspVirt2Off(isp, regoff), val); + MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, regoff), 4); + break; + default: + isp_prt(isp, ISP_LOGERR, + "isp_pci_wr_reg_2400: bad offset 0x%x", regoff); + break; + } +} + + +struct imush { + ispsoftc_t *isp; + int error; +}; + + +int isp_pci_mbxdma(struct ispsoftc *isp) { struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; bus_dma_tag_t dmat = isp->isp_dmatag; bus_dma_segment_t sg; + bus_addr_t addr; bus_size_t len; - fcparam *fcp; + caddr_t base; int rs, i; if (isp->isp_rquest_dma) /* been here before? */ @@ -1033,62 +1245,48 @@ isp_pci_mbxdma(struct ispsoftc *isp) } /* - * Allocate and map the request queue. + * Allocate and map the request, result queues, plus FC scratch area. */ len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); + len += ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); + if (IS_FC(isp)) { + len += ISP2100_SCRLEN; + } + if (bus_dmamem_alloc(dmat, len, PAGE_SIZE, 0, &sg, 1, &rs, BUS_DMA_NOWAIT) || bus_dmamem_map(isp->isp_dmatag, &sg, rs, len, - (caddr_t *)&isp->isp_rquest, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { + &base, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { goto dmafail; } if (bus_dmamap_create(dmat, len, 1, len, 0, BUS_DMA_NOWAIT, - &isp->isp_rqdmap) || bus_dmamap_load(dmat, isp->isp_rqdmap, - (caddr_t)isp->isp_rquest, len, NULL, + &isp->isp_cdmap) || bus_dmamap_load(dmat, isp->isp_cdmap, + base, len, NULL, BUS_DMA_NOWAIT)) { goto dmafail; } - isp->isp_rquest_dma = isp->isp_rqdmap->dm_segs[0].ds_addr; - /* - * Allocate and map the result queue. - */ - len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); - if (bus_dmamem_alloc(dmat, len, PAGE_SIZE, 0, &sg, 1, &rs, - BUS_DMA_NOWAIT) || - bus_dmamem_map(dmat, &sg, rs, len, (caddr_t *)&isp->isp_result, - BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { - goto dmafail; - } - if (bus_dmamap_create(dmat, len, 1, len, 0, BUS_DMA_NOWAIT, - &isp->isp_rsdmap) || bus_dmamap_load(isp->isp_dmatag, - isp->isp_rsdmap, (caddr_t)isp->isp_result, len, NULL, - BUS_DMA_NOWAIT)) { - goto dmafail; - } - isp->isp_result_dma = isp->isp_rsdmap->dm_segs[0].ds_addr; + addr = isp->isp_cdmap->dm_segs[0].ds_addr; + isp->isp_rquest_dma = addr; + addr += ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); + isp->isp_result_dma = addr; - if (IS_SCSI(isp)) { - return (0); - } + if (IS_FC(isp)) { + addr += ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); + FCPARAM(isp)->isp_scdma = addr; - fcp = isp->isp_param; - len = ISP2100_SCRLEN; - if (bus_dmamem_alloc(dmat, len, PAGE_SIZE, 0, &sg, 1, &rs, - BUS_DMA_NOWAIT) || - bus_dmamem_map(dmat, &sg, rs, len, (caddr_t *)&fcp->isp_scratch, - BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { - goto dmafail; } - if (bus_dmamap_create(dmat, len, 1, len, 0, BUS_DMA_NOWAIT, - &isp->isp_scdmap) || bus_dmamap_load(dmat, - isp->isp_scdmap, (caddr_t)fcp->isp_scratch, len, NULL, - BUS_DMA_NOWAIT)) { - goto dmafail; + + isp->isp_rquest = base; + base += ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); + isp->isp_result = base; + if (IS_FC(isp)) { + base += ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); + FCPARAM(isp)->isp_scratch = base; } - fcp->isp_scdma = isp->isp_scdmap->dm_segs[0].ds_addr; return (0); + dmafail: isp_prt(isp, ISP_LOGERR, "mailbox dma setup failure"); for (i = 0; i < isp->isp_maxcmds; i++) { @@ -1101,17 +1299,17 @@ dmafail: return (1); } -static int +int isp_pci_dmasetup(struct ispsoftc *isp, XS_T *xs, ispreq_t *rq, - u_int16_t *nxtip, u_int16_t optr) + u_int32_t *nxtip, u_int32_t optr) { struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; bus_dmamap_t dmap; - u_int16_t starti = isp->isp_reqidx, nxti = *nxtip; + u_int16_t nxti = *nxtip; ispreq_t *qep; int segcnt, seg, error, ovseg, seglim, drq; - qep = (ispreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, starti); + qep = (ispreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx); dmap = pcs->pci_xfer_dmap[isp_handle_index(rq->req_handle)]; if (xs->datalen == 0) { rq->req_seg_count = 1; @@ -1222,17 +1420,37 @@ mbxsync: (ispextreq_t *)qep); break; case RQSTYPE_T2RQS: - isp_put_request_t2(isp, (ispreqt2_t *) rq, (ispreqt2_t *) qep); + if (FCPARAM(isp)->isp_2klogin) { + isp_put_request_t2e(isp, + (ispreqt2e_t *) rq, (ispreqt2e_t *) qep); + } else { + isp_put_request_t2(isp, + (ispreqt2_t *) rq, (ispreqt2_t *) qep); + } + break; + case RQSTYPE_T3RQS: + if (FCPARAM(isp)->isp_2klogin) { + isp_put_request_t3e(isp, + (ispreqt3e_t *) rq, (ispreqt3e_t *) qep); + break; + } + /* FALLTHROUGH */ + case RQSTYPE_A64: + isp_put_request_t3(isp, (ispreqt3_t *) rq, (ispreqt3_t *) qep); + break; + case RQSTYPE_T7RQS: + isp_put_request_t7(isp, (ispreqt7_t *) rq, (ispreqt7_t *) qep); break; } *nxtip = nxti; return (CMD_QUEUED); } -static int +int isp_pci_intr(void *arg) { - u_int16_t isr, sema, mbox; + u_int32_t isr; + u_int16_t sema, mbox; struct ispsoftc *isp = (struct ispsoftc *)arg; isp->isp_intcnt++; @@ -1247,8 +1465,8 @@ isp_pci_intr(void *arg) } } -static void -isp_pci_dmateardown(struct ispsoftc *isp, XS_T *xs, u_int16_t handle) +void +isp_pci_dmateardown(struct ispsoftc *isp, XS_T *xs, u_int32_t handle) { struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; bus_dmamap_t dmap = pcs->pci_xfer_dmap[isp_handle_index(handle)]; @@ -1258,22 +1476,39 @@ isp_pci_dmateardown(struct ispsoftc *isp, XS_T *xs, u_int16_t handle) bus_dmamap_unload(isp->isp_dmatag, dmap); } -static void +void +isp_pci_reset0(ispsoftc_t *isp) +{ + ISP_DISABLE_INTS(isp); +} + +void isp_pci_reset1(struct ispsoftc *isp) { - /* Make sure the BIOS is disabled */ - isp_pci_wr_reg(isp, HCCR, PCI_HCCR_CMD_BIOS); - if (isp->isp_osinfo.no_mbox_ints == 0) { - ENABLE_INTS(isp); + if (!IS_24XX(isp)) { + /* Make sure the BIOS is disabled */ + isp_pci_wr_reg(isp, HCCR, PCI_HCCR_CMD_BIOS); } + /* and enable interrupts */ + ISP_ENABLE_INTS(isp); } -static void +void isp_pci_dumpregs(struct ispsoftc *isp, const char *msg) { struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; if (msg) isp_prt(isp, ISP_LOGERR, "%s", msg); + if (IS_SCSI(isp)) + isp_prt(isp, ISP_LOGERR, " biu_conf1=%x", + ISP_READ(isp, BIU_CONF1)); + else + isp_prt(isp, ISP_LOGERR, " biu_csr=%x", + ISP_READ(isp, BIU2100_CSR)); + isp_prt(isp, ISP_LOGERR, " biu_icr=%x biu_isr=%x biu_sema=%x ", + ISP_READ(isp, BIU_ICR), ISP_READ(isp, BIU_ISR), + ISP_READ(isp, BIU_SEMA)); + isp_prt(isp, ISP_LOGERR, "risc_hccr=%x\n", ISP_READ(isp, HCCR)); isp_prt(isp, ISP_LOGERR, "PCI Status Command/Status=%x\n", pci_conf_read(pcs->pci_pc, pcs->pci_tag, PCI_COMMAND_STATUS_REG)); } |