Home | History | Annotate | Line # | Download | only in pci
isp_pci.c revision 1.61
      1 /* $NetBSD: isp_pci.c,v 1.61 2000/12/09 08:06:33 mjacob Exp $ */
      2 /*
      3  * This driver, which is contained in NetBSD in the files:
      4  *
      5  *	sys/dev/ic/isp.c
      6  *	sys/dev/ic/ic/isp.c
      7  *	sys/dev/ic/ic/isp_inline.h
      8  *	sys/dev/ic/ic/isp_netbsd.c
      9  *	sys/dev/ic/ic/isp_netbsd.h
     10  *	sys/dev/ic/ic/isp_target.c
     11  *	sys/dev/ic/ic/isp_target.h
     12  *	sys/dev/ic/ic/isp_tpublic.h
     13  *	sys/dev/ic/ic/ispmbox.h
     14  *	sys/dev/ic/ic/ispreg.h
     15  *	sys/dev/ic/ic/ispvar.h
     16  *	sys/microcode/isp/asm_sbus.h
     17  *	sys/microcode/isp/asm_1040.h
     18  *	sys/microcode/isp/asm_1080.h
     19  *	sys/microcode/isp/asm_12160.h
     20  *	sys/microcode/isp/asm_2100.h
     21  *	sys/microcode/isp/asm_2200.h
     22  *	sys/pci/isp_pci.c
     23  *	sys/sbus/isp_sbus.c
     24  *
     25  * Is being actively maintained by Matthew Jacob (mjacob (at) netbsd.org).
     26  * This driver also is shared source with FreeBSD, OpenBSD, Linux, Solaris,
     27  * Linux versions. This tends to be an interesting maintenance problem.
     28  *
     29  * Please coordinate with Matthew Jacob on changes you wish to make here.
     30  */
     31 /*
     32  * PCI specific probe and attach routines for Qlogic ISP SCSI adapters.
     33  * Matthew Jacob (mjacob (at) nas.nasa.gov)
     34  */
     35 /*
     36  * Copyright (C) 1997, 1998, 1999 National Aeronautics & Space Administration
     37  * All rights reserved.
     38  *
     39  * Redistribution and use in source and binary forms, with or without
     40  * modification, are permitted provided that the following conditions
     41  * are met:
     42  * 1. Redistributions of source code must retain the above copyright
     43  *    notice, this list of conditions and the following disclaimer.
     44  * 2. Redistributions in binary form must reproduce the above copyright
     45  *    notice, this list of conditions and the following disclaimer in the
     46  *    documentation and/or other materials provided with the distribution.
     47  * 3. The name of the author may not be used to endorse or promote products
     48  *    derived from this software without specific prior written permission
     49  *
     50  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     51  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     52  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     53  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     54  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     55  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     56  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     57  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     58  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     59  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     60  */
     61 
     62 #include <dev/ic/isp_netbsd.h>
     63 #include <dev/pci/pcireg.h>
     64 #include <dev/pci/pcivar.h>
     65 #include <dev/pci/pcidevs.h>
     66 #include <uvm/uvm_extern.h>
     67 
     68 static u_int16_t isp_pci_rd_reg __P((struct ispsoftc *, int));
     69 static void isp_pci_wr_reg __P((struct ispsoftc *, int, u_int16_t));
     70 #if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT))
     71 static u_int16_t isp_pci_rd_reg_1080 __P((struct ispsoftc *, int));
     72 static void isp_pci_wr_reg_1080 __P((struct ispsoftc *, int, u_int16_t));
     73 #endif
     74 static int isp_pci_mbxdma __P((struct ispsoftc *));
     75 static int isp_pci_dmasetup __P((struct ispsoftc *, struct scsipi_xfer *,
     76 	ispreq_t *, u_int16_t *, u_int16_t));
     77 static void isp_pci_dmateardown __P((struct ispsoftc *, struct scsipi_xfer *,
     78 	u_int32_t));
     79 static void isp_pci_reset1 __P((struct ispsoftc *));
     80 static void isp_pci_dumpregs __P((struct ispsoftc *, const char *));
     81 static int isp_pci_intr __P((void *));
     82 
     83 #if	defined(ISP_DISABLE_1020_SUPPORT)
     84 #define	ISP_1040_RISC_CODE	NULL
     85 #else
     86 #define	ISP_1040_RISC_CODE	isp_1040_risc_code
     87 #include <dev/microcode/isp/asm_1040.h>
     88 #endif
     89 
     90 #if	defined(ISP_DISABLE_1080_SUPPORT)
     91 #define	ISP_1080_RISC_CODE	NULL
     92 #else
     93 #define	ISP_1080_RISC_CODE	isp_1080_risc_code
     94 #include <dev/microcode/isp/asm_1080.h>
     95 #endif
     96 
     97 #if	defined(ISP_DISABLE_12160_SUPPORT)
     98 #define	ISP_12160_RISC_CODE	NULL
     99 #else
    100 #define	ISP_12160_RISC_CODE	isp_12160_risc_code
    101 #include <dev/microcode/isp/asm_12160.h>
    102 #endif
    103 
    104 #if	defined(ISP_DISABLE_2100_SUPPORT)
    105 #define	ISP_2100_RISC_CODE	NULL
    106 #else
    107 #define	ISP_2100_RISC_CODE	isp_2100_risc_code
    108 #include <dev/microcode/isp/asm_2100.h>
    109 #endif
    110 
    111 #if	defined(ISP_DISABLE_2200_SUPPORT)
    112 #define	ISP_2200_RISC_CODE	NULL
    113 #else
    114 #define	ISP_2200_RISC_CODE	isp_2200_risc_code
    115 #include <dev/microcode/isp/asm_2200.h>
    116 #endif
    117 
    118 #ifndef	ISP_DISABLE_1020_SUPPORT
    119 static struct ispmdvec mdvec = {
    120 	isp_pci_rd_reg,
    121 	isp_pci_wr_reg,
    122 	isp_pci_mbxdma,
    123 	isp_pci_dmasetup,
    124 	isp_pci_dmateardown,
    125 	NULL,
    126 	isp_pci_reset1,
    127 	isp_pci_dumpregs,
    128 	ISP_1040_RISC_CODE,
    129 	BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64
    130 };
    131 #endif
    132 
    133 #ifndef	ISP_DISABLE_1080_SUPPORT
    134 static struct ispmdvec mdvec_1080 = {
    135 	isp_pci_rd_reg_1080,
    136 	isp_pci_wr_reg_1080,
    137 	isp_pci_mbxdma,
    138 	isp_pci_dmasetup,
    139 	isp_pci_dmateardown,
    140 	NULL,
    141 	isp_pci_reset1,
    142 	isp_pci_dumpregs,
    143 	ISP_1080_RISC_CODE,
    144 	BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64
    145 };
    146 #endif
    147 
    148 #ifndef	ISP_DISABLE_12160_SUPPORT
    149 static struct ispmdvec mdvec_12160 = {
    150 	isp_pci_rd_reg_1080,
    151 	isp_pci_wr_reg_1080,
    152 	isp_pci_mbxdma,
    153 	isp_pci_dmasetup,
    154 	isp_pci_dmateardown,
    155 	NULL,
    156 	isp_pci_reset1,
    157 	isp_pci_dumpregs,
    158 	ISP_12160_RISC_CODE,
    159 	BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64
    160 };
    161 #endif
    162 
    163 #ifndef	ISP_DISABLE_2100_SUPPORT
    164 static struct ispmdvec mdvec_2100 = {
    165 	isp_pci_rd_reg,
    166 	isp_pci_wr_reg,
    167 	isp_pci_mbxdma,
    168 	isp_pci_dmasetup,
    169 	isp_pci_dmateardown,
    170 	NULL,
    171 	isp_pci_reset1,
    172 	isp_pci_dumpregs,
    173 	ISP_2100_RISC_CODE
    174 };
    175 #endif
    176 
    177 #ifndef	ISP_DISABLE_2200_SUPPORT
    178 static struct ispmdvec mdvec_2200 = {
    179 	isp_pci_rd_reg,
    180 	isp_pci_wr_reg,
    181 	isp_pci_mbxdma,
    182 	isp_pci_dmasetup,
    183 	isp_pci_dmateardown,
    184 	NULL,
    185 	isp_pci_reset1,
    186 	isp_pci_dumpregs,
    187 	ISP_2200_RISC_CODE
    188 };
    189 #endif
    190 
    191 #ifndef	PCI_VENDOR_QLOGIC
    192 #define	PCI_VENDOR_QLOGIC	0x1077
    193 #endif
    194 
    195 #ifndef	PCI_PRODUCT_QLOGIC_ISP1020
    196 #define	PCI_PRODUCT_QLOGIC_ISP1020	0x1020
    197 #endif
    198 
    199 #ifndef	PCI_PRODUCT_QLOGIC_ISP1080
    200 #define	PCI_PRODUCT_QLOGIC_ISP1080	0x1080
    201 #endif
    202 
    203 #ifndef	PCI_PRODUCT_QLOGIC_ISP1240
    204 #define	PCI_PRODUCT_QLOGIC_ISP1240	0x1240
    205 #endif
    206 
    207 #ifndef	PCI_PRODUCT_QLOGIC_ISP1280
    208 #define	PCI_PRODUCT_QLOGIC_ISP1280	0x1280
    209 #endif
    210 
    211 #ifndef	PCI_PRODUCT_QLOGIC_ISP12160
    212 #define	PCI_PRODUCT_QLOGIC_ISP12160	0x1216
    213 #endif
    214 
    215 #ifndef	PCI_PRODUCT_QLOGIC_ISP2100
    216 #define	PCI_PRODUCT_QLOGIC_ISP2100	0x2100
    217 #endif
    218 
    219 #ifndef	PCI_PRODUCT_QLOGIC_ISP2200
    220 #define	PCI_PRODUCT_QLOGIC_ISP2200	0x2200
    221 #endif
    222 
    223 #define	PCI_QLOGIC_ISP	((PCI_PRODUCT_QLOGIC_ISP1020 << 16) | PCI_VENDOR_QLOGIC)
    224 
    225 #define	PCI_QLOGIC_ISP1080	\
    226 	((PCI_PRODUCT_QLOGIC_ISP1080 << 16) | PCI_VENDOR_QLOGIC)
    227 
    228 #define	PCI_QLOGIC_ISP1240	\
    229 	((PCI_PRODUCT_QLOGIC_ISP1240 << 16) | PCI_VENDOR_QLOGIC)
    230 
    231 #define	PCI_QLOGIC_ISP1280	\
    232 	((PCI_PRODUCT_QLOGIC_ISP1280 << 16) | PCI_VENDOR_QLOGIC)
    233 
    234 #define	PCI_QLOGIC_ISP12160	\
    235 	((PCI_PRODUCT_QLOGIC_ISP12160 << 16) | PCI_VENDOR_QLOGIC)
    236 
    237 #define	PCI_QLOGIC_ISP2100	\
    238 	((PCI_PRODUCT_QLOGIC_ISP2100 << 16) | PCI_VENDOR_QLOGIC)
    239 
    240 #define	PCI_QLOGIC_ISP2200	\
    241 	((PCI_PRODUCT_QLOGIC_ISP2200 << 16) | PCI_VENDOR_QLOGIC)
    242 
    243 #define	IO_MAP_REG	0x10
    244 #define	MEM_MAP_REG	0x14
    245 #define	PCIR_ROMADDR	0x30
    246 
    247 #define	PCI_DFLT_LTNCY	0x40
    248 #define	PCI_DFLT_LNSZ	0x10
    249 
    250 
    251 static int isp_pci_probe __P((struct device *, struct cfdata *, void *));
    252 static void isp_pci_attach __P((struct device *, struct device *, void *));
    253 
    254 struct isp_pcisoftc {
    255 	struct ispsoftc		pci_isp;
    256 	pci_chipset_tag_t	pci_pc;
    257 	pcitag_t		pci_tag;
    258 	bus_space_tag_t		pci_st;
    259 	bus_space_handle_t	pci_sh;
    260 	bus_dma_tag_t		pci_dmat;
    261 	bus_dmamap_t		pci_scratch_dmap;	/* for fcp only */
    262 	bus_dmamap_t		pci_rquest_dmap;
    263 	bus_dmamap_t		pci_result_dmap;
    264 	bus_dmamap_t		*pci_xfer_dmap;
    265 	void *			pci_ih;
    266 	int16_t			pci_poff[_NREG_BLKS];
    267 };
    268 
    269 struct cfattach isp_pci_ca = {
    270 	sizeof (struct isp_pcisoftc), isp_pci_probe, isp_pci_attach
    271 };
    272 
    273 #ifdef	DEBUG
    274 static char *vstring =
    275     "Qlogic ISP Driver, NetBSD (pci) Platform Version %d.%d Core Version %d.%d";
    276 #endif
    277 
    278 static int
    279 isp_pci_probe(parent, match, aux)
    280 	struct device *parent;
    281 	struct cfdata *match;
    282 	void *aux;
    283 {
    284 	struct pci_attach_args *pa = aux;
    285 	switch (pa->pa_id) {
    286 #ifndef	ISP_DISABLE_1020_SUPPORT
    287 	case PCI_QLOGIC_ISP:
    288 		return (1);
    289 #endif
    290 #ifndef	ISP_DISABLE_1080_SUPPORT
    291 	case PCI_QLOGIC_ISP1080:
    292 	case PCI_QLOGIC_ISP1240:
    293 	case PCI_QLOGIC_ISP1280:
    294 		return (1);
    295 #endif
    296 #ifndef	ISP_DISABLE_12160_SUPPORT
    297 	case PCI_QLOGIC_ISP12160:
    298 		return (1);
    299 #endif
    300 #ifndef	ISP_DISABLE_2100_SUPPORT
    301 	case PCI_QLOGIC_ISP2100:
    302 		return (1);
    303 #endif
    304 #ifndef	ISP_DISABLE_2200_SUPPORT
    305 	case PCI_QLOGIC_ISP2200:
    306 		return (1);
    307 #endif
    308 	default:
    309 		return (0);
    310 	}
    311 }
    312 
    313 
    314 static void
    315 isp_pci_attach(parent, self, aux)
    316 	struct device *parent, *self;
    317 	void *aux;
    318 {
    319 #ifdef	DEBUG
    320 	static char oneshot = 1;
    321 #endif
    322 	static char *nomem = "%s: no mem for sdparam table\n";
    323 	u_int32_t data, rev, linesz = PCI_DFLT_LNSZ;
    324 	struct pci_attach_args *pa = aux;
    325 	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) self;
    326 	struct ispsoftc *isp = &pcs->pci_isp;
    327 	bus_space_tag_t st, iot, memt;
    328 	bus_space_handle_t sh, ioh, memh;
    329 	pci_intr_handle_t ih;
    330 	const char *intrstr;
    331 	int ioh_valid, memh_valid;
    332 
    333 	ioh_valid = (pci_mapreg_map(pa, IO_MAP_REG,
    334 	    PCI_MAPREG_TYPE_IO, 0,
    335 	    &iot, &ioh, NULL, NULL) == 0);
    336 	memh_valid = (pci_mapreg_map(pa, MEM_MAP_REG,
    337 	    PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT, 0,
    338 	    &memt, &memh, NULL, NULL) == 0);
    339 
    340 	if (memh_valid) {
    341 		st = memt;
    342 		sh = memh;
    343 	} else if (ioh_valid) {
    344 		st = iot;
    345 		sh = ioh;
    346 	} else {
    347 		printf(": unable to map device registers\n");
    348 		return;
    349 	}
    350 	printf("\n");
    351 
    352 	pcs->pci_st = st;
    353 	pcs->pci_sh = sh;
    354 	pcs->pci_dmat = pa->pa_dmat;
    355 	pcs->pci_pc = pa->pa_pc;
    356 	pcs->pci_tag = pa->pa_tag;
    357 	pcs->pci_poff[BIU_BLOCK >> _BLK_REG_SHFT] = BIU_REGS_OFF;
    358 	pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS_OFF;
    359 	pcs->pci_poff[SXP_BLOCK >> _BLK_REG_SHFT] = PCI_SXP_REGS_OFF;
    360 	pcs->pci_poff[RISC_BLOCK >> _BLK_REG_SHFT] = PCI_RISC_REGS_OFF;
    361 	pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = DMA_REGS_OFF;
    362 	rev = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG) & 0xff;
    363 
    364 #ifndef	ISP_DISABLE_1020_SUPPORT
    365 	if (pa->pa_id == PCI_QLOGIC_ISP) {
    366 		isp->isp_mdvec = &mdvec;
    367 		isp->isp_type = ISP_HA_SCSI_UNKNOWN;
    368 		isp->isp_param = malloc(sizeof (sdparam), M_DEVBUF, M_NOWAIT);
    369 		if (isp->isp_param == NULL) {
    370 			printf(nomem, isp->isp_name);
    371 			return;
    372 		}
    373 		bzero(isp->isp_param, sizeof (sdparam));
    374 	}
    375 #endif
    376 #ifndef	ISP_DISABLE_1080_SUPPORT
    377 	if (pa->pa_id == PCI_QLOGIC_ISP1080) {
    378 		isp->isp_mdvec = &mdvec_1080;
    379 		isp->isp_type = ISP_HA_SCSI_1080;
    380 		isp->isp_param = malloc(sizeof (sdparam), M_DEVBUF, M_NOWAIT);
    381 		if (isp->isp_param == NULL) {
    382 			printf(nomem, isp->isp_name);
    383 			return;
    384 		}
    385 		bzero(isp->isp_param, sizeof (sdparam));
    386 		pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] =
    387 		    ISP1080_DMA_REGS_OFF;
    388 	}
    389 	if (pa->pa_id == PCI_QLOGIC_ISP1240) {
    390 		isp->isp_mdvec = &mdvec_1080;
    391 		isp->isp_type = ISP_HA_SCSI_1240;
    392 		isp->isp_param =
    393 		    malloc(2 * sizeof (sdparam), M_DEVBUF, M_NOWAIT);
    394 		if (isp->isp_param == NULL) {
    395 			printf(nomem, isp->isp_name);
    396 			return;
    397 		}
    398 		bzero(isp->isp_param, 2 * sizeof (sdparam));
    399 		pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] =
    400 		    ISP1080_DMA_REGS_OFF;
    401 	}
    402 	if (pa->pa_id == PCI_QLOGIC_ISP1280) {
    403 		isp->isp_mdvec = &mdvec_1080;
    404 		isp->isp_type = ISP_HA_SCSI_1280;
    405 		isp->isp_param =
    406 		    malloc(2 * sizeof (sdparam), M_DEVBUF, M_NOWAIT);
    407 		if (isp->isp_param == NULL) {
    408 			printf(nomem, isp->isp_name);
    409 			return;
    410 		}
    411 		bzero(isp->isp_param, 2 * sizeof (sdparam));
    412 		pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] =
    413 		    ISP1080_DMA_REGS_OFF;
    414 	}
    415 #endif
    416 #ifndef	ISP_DISABLE_12160_SUPPORT
    417 	if (pa->pa_id == PCI_QLOGIC_ISP12160) {
    418 		isp->isp_mdvec = &mdvec_12160;
    419 		isp->isp_type = ISP_HA_SCSI_12160;
    420 		isp->isp_param =
    421 		    malloc(2 * sizeof (sdparam), M_DEVBUF, M_NOWAIT);
    422 		if (isp->isp_param == NULL) {
    423 			printf(nomem, isp->isp_name);
    424 			return;
    425 		}
    426 		bzero(isp->isp_param, 2 * sizeof (sdparam));
    427 		pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] =
    428 		    ISP1080_DMA_REGS_OFF;
    429 	}
    430 #endif
    431 #ifndef	ISP_DISABLE_2100_SUPPORT
    432 	if (pa->pa_id == PCI_QLOGIC_ISP2100) {
    433 		isp->isp_mdvec = &mdvec_2100;
    434 		isp->isp_type = ISP_HA_FC_2100;
    435 		isp->isp_param = malloc(sizeof (fcparam), M_DEVBUF, M_NOWAIT);
    436 		if (isp->isp_param == NULL) {
    437 			printf(nomem, isp->isp_name);
    438 			return;
    439 		}
    440 		bzero(isp->isp_param, sizeof (fcparam));
    441 		pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] =
    442 		    PCI_MBOX_REGS2100_OFF;
    443 		if (rev < 3) {
    444 			/*
    445 			 * XXX: Need to get the actual revision
    446 			 * XXX: number of the 2100 FB. At any rate,
    447 			 * XXX: lower cache line size for early revision
    448 			 * XXX; boards.
    449 			 */
    450 			linesz = 1;
    451 		}
    452 	}
    453 #endif
    454 #ifndef	ISP_DISABLE_2200_SUPPORT
    455 	if (pa->pa_id == PCI_QLOGIC_ISP2200) {
    456 		isp->isp_mdvec = &mdvec_2200;
    457 		isp->isp_type = ISP_HA_FC_2200;
    458 		isp->isp_param = malloc(sizeof (fcparam), M_DEVBUF, M_NOWAIT);
    459 		if (isp->isp_param == NULL) {
    460 			printf(nomem, isp->isp_name);
    461 			return;
    462 		}
    463 		bzero(isp->isp_param, sizeof (fcparam));
    464 		pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] =
    465 		    PCI_MBOX_REGS2100_OFF;
    466 		data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG);
    467 	}
    468 #endif
    469 	/*
    470 	 * Set up logging levels.
    471 	 */
    472 #ifdef	ISP_LOGDEFAULT
    473 	isp->isp_dblev = ISP_LOGDEFAULT;
    474 #else
    475 	isp->isp_dblev = ISP_LOGCONFIG|ISP_LOGWARN|ISP_LOGERR;
    476 #ifdef	SCSIDEBUG
    477 	isp->isp_dblev |= ISP_LOGDEBUG1|ISP_LOGDEBUG2;
    478 #endif
    479 #ifdef	DEBUG
    480 	isp->isp_dblev |= ISP_LOGDEBUG0|ISP_LOGINFO;
    481 #endif
    482 #endif
    483 
    484 #ifdef	DEBUG
    485 	if (oneshot) {
    486 		oneshot = 0;
    487 		isp_prt(isp, ISP_LOGCONFIG, vstring,
    488 		    ISP_PLATFORM_VERSION_MAJOR, ISP_PLATFORM_VERSION_MINOR,
    489 		    ISP_CORE_VERSION_MAJOR, ISP_CORE_VERSION_MINOR);
    490 	}
    491 #endif
    492 
    493 	isp->isp_revision = rev;
    494 
    495 	/*
    496 	 * Make sure that command register set sanely.
    497 	 */
    498 	data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
    499 	data |= PCI_COMMAND_MASTER_ENABLE | PCI_COMMAND_INVALIDATE_ENABLE;
    500 
    501 	/*
    502 	 * Not so sure about these- but I think it's important that they get
    503 	 * enabled......
    504 	 */
    505 	data |= PCI_COMMAND_PARITY_ENABLE | PCI_COMMAND_SERR_ENABLE;
    506 	pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, data);
    507 
    508 	/*
    509 	 * Make sure that the latency timer, cache line size,
    510 	 * and ROM is disabled.
    511 	 */
    512 	data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG);
    513 	data &= ~(PCI_LATTIMER_MASK << PCI_LATTIMER_SHIFT);
    514 	data &= ~(PCI_CACHELINE_MASK << PCI_CACHELINE_SHIFT);
    515 	data |= (PCI_DFLT_LTNCY	<< PCI_LATTIMER_SHIFT);
    516 	data |= (linesz << PCI_CACHELINE_SHIFT);
    517 	pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG, data);
    518 
    519 	data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCIR_ROMADDR);
    520 	data &= ~1;
    521 	pci_conf_write(pa->pa_pc, pa->pa_tag, PCIR_ROMADDR, data);
    522 
    523 	if (pci_intr_map(pa->pa_pc, pa->pa_intrtag, pa->pa_intrpin,
    524 	    pa->pa_intrline, &ih)) {
    525 		printf("%s: couldn't map interrupt\n", isp->isp_name);
    526 		free(isp->isp_param, M_DEVBUF);
    527 		return;
    528 	}
    529 	intrstr = pci_intr_string(pa->pa_pc, ih);
    530 	if (intrstr == NULL)
    531 		intrstr = "<I dunno>";
    532 	pcs->pci_ih = pci_intr_establish(pa->pa_pc, ih, IPL_BIO,
    533 	    isp_pci_intr, isp);
    534 	if (pcs->pci_ih == NULL) {
    535 		printf("%s: couldn't establish interrupt at %s\n",
    536 			isp->isp_name, intrstr);
    537 		free(isp->isp_param, M_DEVBUF);
    538 		return;
    539 	}
    540 
    541 	printf("%s: interrupting at %s\n", isp->isp_name, intrstr);
    542 
    543 	if (IS_FC(isp)) {
    544 		DEFAULT_NODEWWN(isp) = 0x400000007F000002;
    545 		DEFAULT_PORTWWN(isp) = 0x400000007F000002;
    546 	}
    547 
    548 	isp->isp_confopts = self->dv_cfdata->cf_flags;
    549 	ISP_LOCK(isp);
    550 	isp->isp_osinfo.no_mbox_ints = 1;
    551 	isp_reset(isp);
    552 	if (isp->isp_state != ISP_RESETSTATE) {
    553 		ISP_UNLOCK(isp);
    554 		free(isp->isp_param, M_DEVBUF);
    555 		return;
    556 	}
    557 	ENABLE_INTS(isp);
    558 	isp_init(isp);
    559 	if (isp->isp_state != ISP_INITSTATE) {
    560 		isp_uninit(isp);
    561 		ISP_UNLOCK(isp);
    562 		free(isp->isp_param, M_DEVBUF);
    563 		return;
    564 	}
    565 	/*
    566 	 * Do platform attach.
    567 	 */
    568 	ISP_UNLOCK(isp);
    569 	isp_attach(isp);
    570 	if (isp->isp_state != ISP_RUNSTATE) {
    571 		ISP_LOCK(isp);
    572 		isp_uninit(isp);
    573 		free(isp->isp_param, M_DEVBUF);
    574 		ISP_UNLOCK(isp);
    575 	}
    576 }
    577 
    578 static u_int16_t
    579 isp_pci_rd_reg(isp, regoff)
    580 	struct ispsoftc *isp;
    581 	int regoff;
    582 {
    583 	u_int16_t rv;
    584 	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
    585 	int offset, oldconf = 0;
    586 
    587 	if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
    588 		/*
    589 		 * We will assume that someone has paused the RISC processor.
    590 		 */
    591 		oldconf = isp_pci_rd_reg(isp, BIU_CONF1);
    592 		isp_pci_wr_reg(isp, BIU_CONF1, oldconf | BIU_PCI_CONF1_SXP);
    593 		delay(250);
    594 	}
    595 	offset = pcs->pci_poff[(regoff & _BLK_REG_MASK) >> _BLK_REG_SHFT];
    596 	offset += (regoff & 0xff);
    597 	rv = bus_space_read_2(pcs->pci_st, pcs->pci_sh, offset);
    598 	if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
    599 		isp_pci_wr_reg(isp, BIU_CONF1, oldconf);
    600 		delay(250);
    601 	}
    602 	return (rv);
    603 }
    604 
    605 static void
    606 isp_pci_wr_reg(isp, regoff, val)
    607 	struct ispsoftc *isp;
    608 	int regoff;
    609 	u_int16_t val;
    610 {
    611 	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
    612 	int offset, oldconf = 0;
    613 
    614 	if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
    615 		/*
    616 		 * We will assume that someone has paused the RISC processor.
    617 		 */
    618 		oldconf = isp_pci_rd_reg(isp, BIU_CONF1);
    619 		isp_pci_wr_reg(isp, BIU_CONF1, oldconf | BIU_PCI_CONF1_SXP);
    620 		delay(250);
    621 	}
    622 	offset = pcs->pci_poff[(regoff & _BLK_REG_MASK) >> _BLK_REG_SHFT];
    623 	offset += (regoff & 0xff);
    624 	bus_space_write_2(pcs->pci_st, pcs->pci_sh, offset, val);
    625 	if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
    626 		isp_pci_wr_reg(isp, BIU_CONF1, oldconf);
    627 		delay(250);
    628 	}
    629 }
    630 
    631 #if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT))
    632 static u_int16_t
    633 isp_pci_rd_reg_1080(isp, regoff)
    634 	struct ispsoftc *isp;
    635 	int regoff;
    636 {
    637 	u_int16_t rv, oc = 0;
    638 	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
    639 	int offset;
    640 
    641 	if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
    642 		u_int16_t tc;
    643 		/*
    644 		 * We will assume that someone has paused the RISC processor.
    645 		 */
    646 		oc = isp_pci_rd_reg(isp, BIU_CONF1);
    647 		tc = oc & ~BIU_PCI1080_CONF1_DMA;
    648 		if (IS_1280(isp)) {
    649 			if (regoff & SXP_BANK1_SELECT)
    650 				tc |= BIU_PCI1080_CONF1_SXP0;
    651 			else
    652 				tc |= BIU_PCI1080_CONF1_SXP1;
    653 		} else {
    654 			tc |= BIU_PCI1080_CONF1_SXP0;
    655 		}
    656 		isp_pci_wr_reg(isp, BIU_CONF1, tc);
    657 		delay(250);
    658 	} else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) {
    659 		oc = isp_pci_rd_reg(isp, BIU_CONF1);
    660 		isp_pci_wr_reg(isp, BIU_CONF1, oc | BIU_PCI1080_CONF1_DMA);
    661 		delay(250);
    662 	}
    663 	offset = pcs->pci_poff[(regoff & _BLK_REG_MASK) >> _BLK_REG_SHFT];
    664 	offset += (regoff & 0xff);
    665 	rv = bus_space_read_2(pcs->pci_st, pcs->pci_sh, offset);
    666 	/*
    667 	 * Okay, because BIU_CONF1 is always nonzero
    668 	 */
    669 	if (oc) {
    670 		isp_pci_wr_reg(isp, BIU_CONF1, oc);
    671 		delay(250);
    672 	}
    673 	return (rv);
    674 }
    675 
    676 static void
    677 isp_pci_wr_reg_1080(isp, regoff, val)
    678 	struct ispsoftc *isp;
    679 	int regoff;
    680 	u_int16_t val;
    681 {
    682 	u_int16_t oc = 0;
    683 	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
    684 	int offset;
    685 
    686 	if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
    687 		u_int16_t tc;
    688 		/*
    689 		 * We will assume that someone has paused the RISC processor.
    690 		 */
    691 		oc = isp_pci_rd_reg(isp, BIU_CONF1);
    692 		tc = oc & ~BIU_PCI1080_CONF1_DMA;
    693 		if (IS_1280(isp)) {
    694 			if (regoff & SXP_BANK1_SELECT)
    695 				tc |= BIU_PCI1080_CONF1_SXP0;
    696 			else
    697 				tc |= BIU_PCI1080_CONF1_SXP1;
    698 		} else {
    699 			tc |= BIU_PCI1080_CONF1_SXP0;
    700 		}
    701 		isp_pci_wr_reg(isp, BIU_CONF1, tc);
    702 		delay(250);
    703 	} else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) {
    704 		oc = isp_pci_rd_reg(isp, BIU_CONF1);
    705 		isp_pci_wr_reg(isp, BIU_CONF1, oc | BIU_PCI1080_CONF1_DMA);
    706 		delay(250);
    707 	}
    708 	offset = pcs->pci_poff[(regoff & _BLK_REG_MASK) >> _BLK_REG_SHFT];
    709 	offset += (regoff & 0xff);
    710 	bus_space_write_2(pcs->pci_st, pcs->pci_sh, offset, val);
    711 	/*
    712 	 * Okay, because BIU_CONF1 is always nonzero
    713 	 */
    714 	if (oc) {
    715 		isp_pci_wr_reg(isp, BIU_CONF1, oc);
    716 		delay(250);
    717 	}
    718 }
    719 #endif
    720 
    721 static int
    722 isp_pci_mbxdma(isp)
    723 	struct ispsoftc *isp;
    724 {
    725 	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp;
    726 	bus_dma_tag_t dmat = pcs->pci_dmat;
    727 	bus_dma_segment_t sg;
    728 	bus_size_t len;
    729 	fcparam *fcp;
    730 	int rs, i;
    731 
    732 	if (isp->isp_rquest_dma)	/* been here before? */
    733 		return (0);
    734 
    735 	len = isp->isp_maxcmds * sizeof (XS_T);
    736 	isp->isp_xflist = (XS_T **) malloc(len, M_DEVBUF, M_WAITOK);
    737 	if (isp->isp_xflist == NULL) {
    738 		isp_prt(isp, ISP_LOGERR, "cannot malloc xflist array");
    739 		return (1);
    740 	}
    741 	bzero(isp->isp_xflist, len);
    742 	len = isp->isp_maxcmds * sizeof (bus_dmamap_t);
    743 	pcs->pci_xfer_dmap = (bus_dmamap_t *) malloc(len, M_DEVBUF, M_WAITOK);
    744 	if (pcs->pci_xfer_dmap == NULL) {
    745 		free(isp->isp_xflist, M_DEVBUF);
    746 		isp->isp_xflist = NULL;
    747 		isp_prt(isp, ISP_LOGERR, "cannot malloc dma map array");
    748 		return (1);
    749 	}
    750 	for (i = 0; i < isp->isp_maxcmds; i++) {
    751 		if (bus_dmamap_create(dmat, MAXPHYS, (MAXPHYS / PAGE_SIZE) + 1,
    752 		    MAXPHYS, 0, BUS_DMA_NOWAIT, &pcs->pci_xfer_dmap[i])) {
    753 			isp_prt(isp, ISP_LOGERR, "cannot create dma maps");
    754 			break;
    755 		}
    756 	}
    757 	if (i < isp->isp_maxcmds) {
    758 		while (--i >= 0) {
    759 			bus_dmamap_destroy(dmat, pcs->pci_xfer_dmap[i]);
    760 		}
    761 		free(isp->isp_xflist, M_DEVBUF);
    762 		free(pcs->pci_xfer_dmap, M_DEVBUF);
    763 		isp->isp_xflist = NULL;
    764 		pcs->pci_xfer_dmap = NULL;
    765 		return (1);
    766 	}
    767 
    768 	/*
    769 	 * Allocate and map the request queue.
    770 	 */
    771 	len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp));
    772 	if (bus_dmamem_alloc(dmat, len, PAGE_SIZE, 0, &sg, 1, &rs,
    773 			     BUS_DMA_NOWAIT) ||
    774 	    bus_dmamem_map(pcs->pci_dmat, &sg, rs, len,
    775 	    (caddr_t *)&isp->isp_rquest, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) {
    776 		goto dmafail;
    777 	}
    778 
    779 	if (bus_dmamap_create(dmat, len, 1, len, 0, BUS_DMA_NOWAIT,
    780 	    &pcs->pci_rquest_dmap) || bus_dmamap_load(dmat,
    781 	    pcs->pci_rquest_dmap, (caddr_t)isp->isp_rquest, len, NULL,
    782 	    BUS_DMA_NOWAIT)) {
    783 		goto dmafail;
    784 	}
    785 
    786 	isp->isp_rquest_dma = pcs->pci_rquest_dmap->dm_segs[0].ds_addr;
    787 
    788 	/*
    789 	 * Allocate and map the result queue.
    790 	 */
    791 	len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp));
    792 	if (bus_dmamem_alloc(dmat, len, PAGE_SIZE, 0, &sg, 1, &rs,
    793 			     BUS_DMA_NOWAIT) ||
    794 	    bus_dmamem_map(dmat, &sg, rs, len, (caddr_t *)&isp->isp_result,
    795 	    BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) {
    796 		goto dmafail;
    797 	}
    798 	if (bus_dmamap_create(dmat, len, 1, len, 0, BUS_DMA_NOWAIT,
    799 	    &pcs->pci_result_dmap) || bus_dmamap_load(pcs->pci_dmat,
    800 	    pcs->pci_result_dmap, (caddr_t)isp->isp_result, len, NULL,
    801 	    BUS_DMA_NOWAIT)) {
    802 		goto dmafail;
    803 	}
    804 	isp->isp_result_dma = pcs->pci_result_dmap->dm_segs[0].ds_addr;
    805 
    806 	if (IS_SCSI(isp)) {
    807 		return (0);
    808 	}
    809 
    810 	fcp = isp->isp_param;
    811 	len = ISP2100_SCRLEN;
    812 	if (bus_dmamem_alloc(dmat, len, PAGE_SIZE, 0, &sg, 1, &rs,
    813 			     BUS_DMA_NOWAIT) ||
    814 	    bus_dmamem_map(dmat, &sg, rs, len, (caddr_t *)&fcp->isp_scratch,
    815 	    BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) {
    816 		goto dmafail;
    817 	}
    818 	if (bus_dmamap_create(dmat, len, 1, len, 0, BUS_DMA_NOWAIT,
    819 	    &pcs->pci_scratch_dmap) || bus_dmamap_load(dmat,
    820 	    pcs->pci_scratch_dmap, (caddr_t)fcp->isp_scratch, len, NULL,
    821 	    BUS_DMA_NOWAIT)) {
    822 		goto dmafail;
    823 	}
    824 	fcp->isp_scdma = pcs->pci_scratch_dmap->dm_segs[0].ds_addr;
    825 	return (0);
    826 dmafail:
    827 	isp_prt(isp, ISP_LOGERR, "mailbox dma setup failure");
    828 	for (i = 0; i < isp->isp_maxcmds; i++) {
    829 		bus_dmamap_destroy(dmat, pcs->pci_xfer_dmap[i]);
    830 	}
    831 	free(isp->isp_xflist, M_DEVBUF);
    832 	free(pcs->pci_xfer_dmap, M_DEVBUF);
    833 	isp->isp_xflist = NULL;
    834 	pcs->pci_xfer_dmap = NULL;
    835 	return (1);
    836 }
    837 
    838 static int
    839 isp_pci_dmasetup(isp, xs, rq, iptrp, optr)
    840 	struct ispsoftc *isp;
    841 	struct scsipi_xfer *xs;
    842 	ispreq_t *rq;
    843 	u_int16_t *iptrp;
    844 	u_int16_t optr;
    845 {
    846 	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp;
    847 	bus_dmamap_t dmap;
    848 	ispcontreq_t *crq;
    849 	int segcnt, seg, error, ovseg, seglim, drq;
    850 
    851 	dmap = pcs->pci_xfer_dmap[isp_handle_index(rq->req_handle)];
    852 
    853 	if (xs->datalen == 0) {
    854 		rq->req_seg_count = 1;
    855 		goto mbxsync;
    856 	}
    857 	if (xs->xs_control & XS_CTL_DATA_IN) {
    858 		drq = REQFLAG_DATA_IN;
    859 	} else {
    860 		drq = REQFLAG_DATA_OUT;
    861 	}
    862 
    863 	if (IS_FC(isp)) {
    864 		seglim = ISP_RQDSEG_T2;
    865 		((ispreqt2_t *)rq)->req_totalcnt = xs->datalen;
    866 		((ispreqt2_t *)rq)->req_flags |= drq;
    867 	} else {
    868 		rq->req_flags |= drq;
    869 		if (XS_CDBLEN(xs) > 12) {
    870 			seglim = 0;
    871 		} else {
    872 			seglim = ISP_RQDSEG;
    873 		}
    874 	}
    875 	error = bus_dmamap_load(pcs->pci_dmat, dmap, xs->data, xs->datalen,
    876 	    NULL, xs->xs_control & XS_CTL_NOSLEEP ?
    877 	    BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
    878 	if (error) {
    879 		XS_SETERR(xs, HBA_BOTCH);
    880 		return (CMD_COMPLETE);
    881 	}
    882 
    883 	segcnt = dmap->dm_nsegs;
    884 
    885 	isp_prt(isp, ISP_LOGDEBUG2, "%d byte %s %p in %d segs",
    886 	    xs->datalen, (xs->xs_control & XS_CTL_DATA_IN)? "read to" :
    887 	    "write from", xs->data, segcnt);
    888 
    889 	for (seg = 0, rq->req_seg_count = 0;
    890 	    seglim && seg < segcnt && rq->req_seg_count < seglim;
    891 	    seg++, rq->req_seg_count++) {
    892 		if (IS_FC(isp)) {
    893 			ispreqt2_t *rq2 = (ispreqt2_t *)rq;
    894 #if	_BYTE_ORDER == _BIG_ENDIAN
    895 			rq2->req_dataseg[rq2->req_seg_count].ds_count =
    896 			    bswap32(dmap->dm_segs[seg].ds_len);
    897 			rq2->req_dataseg[rq2->req_seg_count].ds_base =
    898 			    bswap32(dmap->dm_segs[seg].ds_addr);
    899 #else
    900 			rq2->req_dataseg[rq2->req_seg_count].ds_count =
    901 			    dmap->dm_segs[seg].ds_len;
    902 			rq2->req_dataseg[rq2->req_seg_count].ds_base =
    903 			    dmap->dm_segs[seg].ds_addr;
    904 #endif
    905 		} else {
    906 #if	_BYTE_ORDER == _BIG_ENDIAN
    907 			rq->req_dataseg[rq->req_seg_count].ds_count =
    908 			    bswap32(dmap->dm_segs[seg].ds_len);
    909 			rq->req_dataseg[rq->req_seg_count].ds_base =
    910 			    bswap32(dmap->dm_segs[seg].ds_addr);
    911 #else
    912 			rq->req_dataseg[rq->req_seg_count].ds_count =
    913 			    dmap->dm_segs[seg].ds_len;
    914 			rq->req_dataseg[rq->req_seg_count].ds_base =
    915 			    dmap->dm_segs[seg].ds_addr;
    916 #endif
    917 		}
    918 		isp_prt(isp, ISP_LOGDEBUG2, "seg0.[%d]={0x%x,%d}",
    919 		    rq->req_seg_count, dmap->dm_segs[seg].ds_addr,
    920 		    dmap->dm_segs[seg].ds_len);
    921 	}
    922 
    923 	if (seg == segcnt)
    924 		goto dmasync;
    925 
    926 	do {
    927 		crq = (ispcontreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, *iptrp);
    928 		*iptrp = ISP_NXT_QENTRY(*iptrp, RQUEST_QUEUE_LEN(isp));
    929 		if (*iptrp == optr) {
    930 			isp_prt(isp, ISP_LOGDEBUG0, "Request Queue Overflow++");
    931 			bus_dmamap_unload(pcs->pci_dmat, dmap);
    932 			XS_SETERR(xs, HBA_BOTCH);
    933 			return (CMD_EAGAIN);
    934 		}
    935 		rq->req_header.rqs_entry_count++;
    936 		bzero((void *)crq, sizeof (*crq));
    937 		crq->req_header.rqs_entry_count = 1;
    938 		crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
    939 
    940 		for (ovseg = 0; seg < segcnt && ovseg < ISP_CDSEG;
    941 		    rq->req_seg_count++, seg++, ovseg++) {
    942 #if	_BYTE_ORDER == _BIG_ENDIAN
    943 			crq->req_dataseg[ovseg].ds_count =
    944 			    bswap32(dmap->dm_segs[seg].ds_len);
    945 			crq->req_dataseg[ovseg].ds_base =
    946 			    bswap32(dmap->dm_segs[seg].ds_addr);
    947 #else
    948 			crq->req_dataseg[ovseg].ds_count =
    949 			    dmap->dm_segs[seg].ds_len;
    950 			crq->req_dataseg[ovseg].ds_base =
    951 			    dmap->dm_segs[seg].ds_addr;
    952 #endif
    953 			isp_prt(isp, ISP_LOGDEBUG2, "seg%d.[%d]={0x%x,%d}",
    954 			    rq->req_header.rqs_entry_count - 1,
    955 			    rq->req_seg_count, dmap->dm_segs[seg].ds_addr,
    956 			    dmap->dm_segs[seg].ds_len);
    957 		}
    958 	} while (seg < segcnt);
    959 
    960 
    961 dmasync:
    962 	bus_dmamap_sync(pcs->pci_dmat, dmap, 0, dmap->dm_mapsize,
    963 	    (xs->xs_control & XS_CTL_DATA_IN) ?  BUS_DMASYNC_PREREAD :
    964 	    BUS_DMASYNC_PREWRITE);
    965 
    966 mbxsync:
    967 	ISP_SWIZZLE_REQUEST(isp, rq);
    968 	bus_dmamap_sync(pcs->pci_dmat, pcs->pci_rquest_dmap, 0,
    969 	    pcs->pci_rquest_dmap->dm_mapsize, BUS_DMASYNC_PREWRITE);
    970 	return (CMD_QUEUED);
    971 }
    972 
    973 static int
    974 isp_pci_intr(arg)
    975 	void *arg;
    976 {
    977 	int rv;
    978 	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)arg;
    979 	bus_dmamap_sync(pcs->pci_dmat, pcs->pci_result_dmap, 0,
    980 	    pcs->pci_result_dmap->dm_mapsize, BUS_DMASYNC_POSTREAD);
    981 	pcs->pci_isp.isp_osinfo.onintstack = 1;
    982 	rv = isp_intr(arg);
    983 	pcs->pci_isp.isp_osinfo.onintstack = 0;
    984 	return (rv);
    985 }
    986 
    987 static void
    988 isp_pci_dmateardown(isp, xs, handle)
    989 	struct ispsoftc *isp;
    990 	struct scsipi_xfer *xs;
    991 	u_int32_t handle;
    992 {
    993 	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp;
    994 	bus_dmamap_t dmap = pcs->pci_xfer_dmap[isp_handle_index(handle)];
    995 	bus_dmamap_sync(pcs->pci_dmat, dmap, 0, dmap->dm_mapsize,
    996 	    xs->xs_control & XS_CTL_DATA_IN ?
    997 	    BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
    998 	bus_dmamap_unload(pcs->pci_dmat, dmap);
    999 }
   1000 
   1001 static void
   1002 isp_pci_reset1(isp)
   1003 	struct ispsoftc *isp;
   1004 {
   1005 	/* Make sure the BIOS is disabled */
   1006 	isp_pci_wr_reg(isp, HCCR, PCI_HCCR_CMD_BIOS);
   1007 }
   1008 
   1009 static void
   1010 isp_pci_dumpregs(isp, msg)
   1011 	struct ispsoftc *isp;
   1012 	const char *msg;
   1013 {
   1014 	struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp;
   1015 	if (msg)
   1016 		printf("%s: %s\n", isp->isp_name, msg);
   1017 	if (IS_SCSI(isp))
   1018 		printf("    biu_conf1=%x", ISP_READ(isp, BIU_CONF1));
   1019 	else
   1020 		printf("    biu_csr=%x", ISP_READ(isp, BIU2100_CSR));
   1021 	printf(" biu_icr=%x biu_isr=%x biu_sema=%x ", ISP_READ(isp, BIU_ICR),
   1022 	    ISP_READ(isp, BIU_ISR), ISP_READ(isp, BIU_SEMA));
   1023 	printf("risc_hccr=%x\n", ISP_READ(isp, HCCR));
   1024 
   1025 
   1026 	if (IS_SCSI(isp)) {
   1027 		ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
   1028 		printf("    cdma_conf=%x cdma_sts=%x cdma_fifostat=%x\n",
   1029 			ISP_READ(isp, CDMA_CONF), ISP_READ(isp, CDMA_STATUS),
   1030 			ISP_READ(isp, CDMA_FIFO_STS));
   1031 		printf("    ddma_conf=%x ddma_sts=%x ddma_fifostat=%x\n",
   1032 			ISP_READ(isp, DDMA_CONF), ISP_READ(isp, DDMA_STATUS),
   1033 			ISP_READ(isp, DDMA_FIFO_STS));
   1034 		printf("    sxp_int=%x sxp_gross=%x sxp(scsi_ctrl)=%x\n",
   1035 			ISP_READ(isp, SXP_INTERRUPT),
   1036 			ISP_READ(isp, SXP_GROSS_ERR),
   1037 			ISP_READ(isp, SXP_PINS_CTRL));
   1038 		ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
   1039 	}
   1040 	printf("    mbox regs: %x %x %x %x %x\n",
   1041 	    ISP_READ(isp, OUTMAILBOX0), ISP_READ(isp, OUTMAILBOX1),
   1042 	    ISP_READ(isp, OUTMAILBOX2), ISP_READ(isp, OUTMAILBOX3),
   1043 	    ISP_READ(isp, OUTMAILBOX4));
   1044 	printf("    PCI Status Command/Status=%x\n",
   1045 	    pci_conf_read(pcs->pci_pc, pcs->pci_tag, PCI_COMMAND_STATUS_REG));
   1046 }
   1047