xref: /freebsd/sys/dev/isp/isp_freebsd.h (revision 05914a3f9def6fb88ecf14a570f2b739f1e54595)
1c3aac50fSPeter Wemm /* $FreeBSD$ */
26054c3f6SMatt Jacob /*
3b460c5c9SMatt Jacob  * Qlogic ISP SCSI Host Adapter FreeBSD Wrapper Definitions (CAM version)
46054c3f6SMatt Jacob  *---------------------------------------
5b460c5c9SMatt Jacob  * Copyright (c) 1997, 1998, 1999 by Matthew Jacob
66054c3f6SMatt Jacob  * NASA/Ames Research Center
76054c3f6SMatt Jacob  * All rights reserved.
86054c3f6SMatt Jacob  *---------------------------------------
96054c3f6SMatt Jacob  *
106054c3f6SMatt Jacob  * Redistribution and use in source and binary forms, with or without
116054c3f6SMatt Jacob  * modification, are permitted provided that the following conditions
126054c3f6SMatt Jacob  * are met:
136054c3f6SMatt Jacob  * 1. Redistributions of source code must retain the above copyright
146054c3f6SMatt Jacob  *    notice immediately at the beginning of the file, without modification,
156054c3f6SMatt Jacob  *    this list of conditions, and the following disclaimer.
166054c3f6SMatt Jacob  * 2. Redistributions in binary form must reproduce the above copyright
176054c3f6SMatt Jacob  *    notice, this list of conditions and the following disclaimer in the
186054c3f6SMatt Jacob  *    documentation and/or other materials provided with the distribution.
196054c3f6SMatt Jacob  * 3. The name of the author may not be used to endorse or promote products
206054c3f6SMatt Jacob  *    derived from this software without specific prior written permission.
216054c3f6SMatt Jacob  *
226054c3f6SMatt Jacob  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
236054c3f6SMatt Jacob  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
246054c3f6SMatt Jacob  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
256054c3f6SMatt Jacob  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
266054c3f6SMatt Jacob  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
276054c3f6SMatt Jacob  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
286054c3f6SMatt Jacob  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
296054c3f6SMatt Jacob  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
306054c3f6SMatt Jacob  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
316054c3f6SMatt Jacob  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
326054c3f6SMatt Jacob  * SUCH DAMAGE.
336054c3f6SMatt Jacob  */
346054c3f6SMatt Jacob #ifndef	_ISP_FREEBSD_H
356054c3f6SMatt Jacob #define	_ISP_FREEBSD_H
366054c3f6SMatt Jacob 
370b69ceadSMatt Jacob #define	ISP_PLATFORM_VERSION_MAJOR	5
380b69ceadSMatt Jacob #define	ISP_PLATFORM_VERSION_MINOR	0
39b460c5c9SMatt Jacob 
40478f8a96SJustin T. Gibbs 
413dd37e43SMatt Jacob #include <sys/param.h>
42b460c5c9SMatt Jacob #include <sys/param.h>
436054c3f6SMatt Jacob #include <sys/systm.h>
446054c3f6SMatt Jacob #include <sys/kernel.h>
45b460c5c9SMatt Jacob #include <sys/queue.h>
4605914a3fSMatt Jacob #include <sys/malloc.h>
476054c3f6SMatt Jacob 
48b460c5c9SMatt Jacob #include <machine/bus_memio.h>
49b460c5c9SMatt Jacob #include <machine/bus_pio.h>
50b460c5c9SMatt Jacob #include <machine/bus.h>
51b460c5c9SMatt Jacob #include <machine/clock.h>
5257c801f5SMatt Jacob 
53b460c5c9SMatt Jacob #include <cam/cam.h>
54b460c5c9SMatt Jacob #include <cam/cam_debug.h>
55b460c5c9SMatt Jacob #include <cam/cam_ccb.h>
56b460c5c9SMatt Jacob #include <cam/cam_sim.h>
57b460c5c9SMatt Jacob #include <cam/cam_xpt.h>
58b460c5c9SMatt Jacob #include <cam/cam_xpt_sim.h>
59b460c5c9SMatt Jacob #include <cam/cam_debug.h>
60b460c5c9SMatt Jacob #include <cam/scsi/scsi_all.h>
61b460c5c9SMatt Jacob #include <cam/scsi/scsi_message.h>
62bc3dacd6SMatt Jacob 
6367b6f02bSMatt Jacob #include "opt_ddb.h"
64b460c5c9SMatt Jacob #include "opt_isp.h"
65b460c5c9SMatt Jacob #ifdef	SCSI_ISP_FABRIC
66b460c5c9SMatt Jacob #define	ISP2100_FABRIC		1
67b460c5c9SMatt Jacob #define	ISP2100_SCRLEN		0x400
68b460c5c9SMatt Jacob #else
693692397bSMatt Jacob #define	ISP2100_SCRLEN		0x100
70b460c5c9SMatt Jacob #endif
71b460c5c9SMatt Jacob #ifdef	SCSI_ISP_SCCLUN
72b460c5c9SMatt Jacob #define	ISP2100_SCCLUN	1
73b460c5c9SMatt Jacob #endif
74b460c5c9SMatt Jacob 
75b460c5c9SMatt Jacob #ifndef	SCSI_CHECK
76b460c5c9SMatt Jacob #define	SCSI_CHECK	SCSI_STATUS_CHECK_COND
77b460c5c9SMatt Jacob #endif
78b460c5c9SMatt Jacob #ifndef	SCSI_BUSY
79b460c5c9SMatt Jacob #define	SCSI_BUSY	SCSI_STATUS_BUSY
80b460c5c9SMatt Jacob #endif
81b460c5c9SMatt Jacob #ifndef	SCSI_QFULL
82b460c5c9SMatt Jacob #define	SCSI_QFULL	SCSI_STATUS_QUEUE_FULL
83b460c5c9SMatt Jacob #endif
84b460c5c9SMatt Jacob 
85b460c5c9SMatt Jacob #define	ISP_SCSI_XFER_T		struct ccb_scsiio
8640b27503SMatt Jacob 
8740b27503SMatt Jacob #ifdef	ISP_TARGET_MODE
8840b27503SMatt Jacob typedef struct tstate {
8940b27503SMatt Jacob 	struct tstate *next;
9040b27503SMatt Jacob 	struct cam_path *owner;
9140b27503SMatt Jacob 	struct ccb_hdr_slist atios;
9240b27503SMatt Jacob 	struct ccb_hdr_slist inots;
9340b27503SMatt Jacob 	lun_id_t lun;
9440b27503SMatt Jacob 	u_int32_t hold;
9540b27503SMatt Jacob } tstate_t;
9640b27503SMatt Jacob 
9740b27503SMatt Jacob /*
9840b27503SMatt Jacob  * This should work very well for 100% of parallel SCSI cases, 100%
9940b27503SMatt Jacob  * of non-SCCLUN FC cases, and hopefully some larger fraction of the
10040b27503SMatt Jacob  * SCCLUN FC cases. Basically, we index by the low 5 bits of lun and
10140b27503SMatt Jacob  * then linear search. This has to be reasonably zippy, but not crucially
10240b27503SMatt Jacob  * so.
10340b27503SMatt Jacob  */
10440b27503SMatt Jacob #define	LUN_HASH_SIZE		32
10540b27503SMatt Jacob #define	LUN_HASH_FUNC(lun)	((lun) & 0x1f)
10640b27503SMatt Jacob 
10740b27503SMatt Jacob #endif
10840b27503SMatt Jacob 
1096054c3f6SMatt Jacob struct isposinfo {
11040b27503SMatt Jacob 	struct ispsoftc *	next;
1116db20c31SMatt Jacob 	u_int64_t		default_wwn;
1126054c3f6SMatt Jacob 	char			name[8];
1136054c3f6SMatt Jacob 	int			unit;
114b460c5c9SMatt Jacob 	struct cam_sim		*sim;
115b460c5c9SMatt Jacob 	struct cam_path		*path;
116b460c5c9SMatt Jacob 	struct cam_sim		*sim2;
117b460c5c9SMatt Jacob 	struct cam_path		*path2;
118b460c5c9SMatt Jacob 	volatile char		simqfrozen;
11940b27503SMatt Jacob #ifdef	ISP_TARGET_MODE
12040b27503SMatt Jacob #define	TM_WANTED		0x01
12140b27503SMatt Jacob #define	TM_BUSY			0x02
12240b27503SMatt Jacob #define	TM_TMODE_ENABLED	0x80
12340b27503SMatt Jacob 	u_int8_t		tmflags;
12440b27503SMatt Jacob 	u_int8_t		rstatus;
12540b27503SMatt Jacob 	u_int16_t		rollinfo;
12640b27503SMatt Jacob 	tstate_t		tsdflt;
12740b27503SMatt Jacob 	tstate_t		*lun_hash[LUN_HASH_SIZE];
12840b27503SMatt Jacob #endif
1296054c3f6SMatt Jacob };
130b460c5c9SMatt Jacob #define	SIMQFRZ_RESOURCE	0x1
131b460c5c9SMatt Jacob #define	SIMQFRZ_LOOPDOWN	0x2
1321a43c1fcSMatt Jacob #define	SIMQFRZ_TIMED		0x4
133b460c5c9SMatt Jacob 
134b460c5c9SMatt Jacob #define	isp_sim		isp_osinfo.sim
135b460c5c9SMatt Jacob #define	isp_path	isp_osinfo.path
136b460c5c9SMatt Jacob #define	isp_sim2	isp_osinfo.sim2
137b460c5c9SMatt Jacob #define	isp_path2	isp_osinfo.path2
138b460c5c9SMatt Jacob #define	isp_unit	isp_osinfo.unit
139b460c5c9SMatt Jacob #define	isp_name	isp_osinfo.name
140b460c5c9SMatt Jacob 
141b460c5c9SMatt Jacob #define	MAXISPREQUEST		256
142478f8a96SJustin T. Gibbs 
143bc3dacd6SMatt Jacob #include <dev/isp/ispreg.h>
144bc3dacd6SMatt Jacob #include <dev/isp/ispvar.h>
145bc3dacd6SMatt Jacob #include <dev/isp/ispmbox.h>
146bc3dacd6SMatt Jacob 
14767b6f02bSMatt Jacob #define	DFLT_DBLEVEL		isp_debug
14867b6f02bSMatt Jacob extern int isp_debug;
1496054c3f6SMatt Jacob #define	ISP_LOCKVAL_DECL	int isp_spl_save
150c3055363SMatt Jacob #define	ISP_ILOCKVAL_DECL	ISP_LOCKVAL_DECL
151478f8a96SJustin T. Gibbs #define	ISP_UNLOCK(isp)		(void) splx(isp_spl_save)
152b460c5c9SMatt Jacob #define	ISP_LOCK(isp)		isp_spl_save = splcam()
153478f8a96SJustin T. Gibbs #define	ISP_ILOCK(isp)		ISP_LOCK(isp)
154478f8a96SJustin T. Gibbs #define	ISP_IUNLOCK(isp)	ISP_UNLOCK(isp)
155b460c5c9SMatt Jacob #define	IMASK			cam_imask
1566054c3f6SMatt Jacob 
157b460c5c9SMatt Jacob #define	XS_NULL(ccb)		ccb == NULL
158b460c5c9SMatt Jacob #define	XS_ISP(ccb)		((struct ispsoftc *) (ccb)->ccb_h.spriv_ptr1)
1596054c3f6SMatt Jacob 
160b460c5c9SMatt Jacob #define	XS_LUN(ccb)		(ccb)->ccb_h.target_lun
161b460c5c9SMatt Jacob #define	XS_TGT(ccb)		(ccb)->ccb_h.target_id
162b460c5c9SMatt Jacob #define	XS_CHANNEL(ccb)		cam_sim_bus(xpt_path_sim((ccb)->ccb_h.path))
163b460c5c9SMatt Jacob #define	XS_RESID(ccb)		(ccb)->resid
164b460c5c9SMatt Jacob #define	XS_XFRLEN(ccb)		(ccb)->dxfer_len
165b460c5c9SMatt Jacob #define	XS_CDBLEN(ccb)		(ccb)->cdb_len
166b460c5c9SMatt Jacob #define	XS_CDBP(ccb)		(((ccb)->ccb_h.flags & CAM_CDB_POINTER)? \
167b460c5c9SMatt Jacob 	(ccb)->cdb_io.cdb_ptr : (ccb)->cdb_io.cdb_bytes)
168b460c5c9SMatt Jacob #define	XS_STS(ccb)		(ccb)->scsi_status
169b460c5c9SMatt Jacob #define	XS_TIME(ccb)		(ccb)->ccb_h.timeout
170b460c5c9SMatt Jacob #define	XS_SNSP(ccb)		(&(ccb)->sense_data)
17167b6f02bSMatt Jacob #define	XS_SNSLEN(ccb)		\
17267b6f02bSMatt Jacob 	imin((sizeof((ccb)->sense_data)), ccb->sense_len)
173b460c5c9SMatt Jacob #define	XS_SNSKEY(ccb)		((ccb)->sense_data.flags & 0xf)
1746054c3f6SMatt Jacob 
175478f8a96SJustin T. Gibbs /*
176b460c5c9SMatt Jacob  * A little tricky- HBA_NOERROR is "in progress" so
177b460c5c9SMatt Jacob  * that XS_CMD_DONE can transition this to CAM_REQ_CMP.
178478f8a96SJustin T. Gibbs  */
179b460c5c9SMatt Jacob #define	HBA_NOERROR		CAM_REQ_INPROG
180b460c5c9SMatt Jacob #define	HBA_BOTCH		CAM_UNREC_HBA_ERROR
181b460c5c9SMatt Jacob #define	HBA_CMDTIMEOUT		CAM_CMD_TIMEOUT
182b460c5c9SMatt Jacob #define	HBA_SELTIMEOUT		CAM_SEL_TIMEOUT
183b460c5c9SMatt Jacob #define	HBA_TGTBSY		CAM_SCSI_STATUS_ERROR
184b460c5c9SMatt Jacob #define	HBA_BUSRESET		CAM_SCSI_BUS_RESET
185b460c5c9SMatt Jacob #define	HBA_ABORTED		CAM_REQ_ABORTED
186b460c5c9SMatt Jacob #define	HBA_DATAOVR		CAM_DATA_RUN_ERR
187b460c5c9SMatt Jacob #define	HBA_ARQFAIL		CAM_AUTOSENSE_FAIL
188b460c5c9SMatt Jacob 
189b460c5c9SMatt Jacob #define	XS_SNS_IS_VALID(ccb) ((ccb)->ccb_h.status |= CAM_AUTOSNS_VALID)
190b460c5c9SMatt Jacob #define	XS_IS_SNS_VALID(ccb) (((ccb)->ccb_h.status & CAM_AUTOSNS_VALID) != 0)
191b460c5c9SMatt Jacob 
192b460c5c9SMatt Jacob #define	XS_INITERR(ccb)		\
193b460c5c9SMatt Jacob 	(ccb)->ccb_h.status &= ~CAM_STATUS_MASK, \
194b460c5c9SMatt Jacob 	(ccb)->ccb_h.status |= CAM_REQ_INPROG, \
195b460c5c9SMatt Jacob 	(ccb)->ccb_h.spriv_field0 = CAM_REQ_INPROG
196b460c5c9SMatt Jacob #define	XS_SETERR(ccb, v)	(ccb)->ccb_h.spriv_field0 = v
197b460c5c9SMatt Jacob #define	XS_ERR(ccb)		(ccb)->ccb_h.spriv_field0
198b460c5c9SMatt Jacob #define	XS_NOERR(ccb)		\
199b460c5c9SMatt Jacob 	((ccb)->ccb_h.spriv_field0 == CAM_REQ_INPROG)
200b460c5c9SMatt Jacob 
201b460c5c9SMatt Jacob extern void isp_done(struct ccb_scsiio *);
202b460c5c9SMatt Jacob #define	XS_CMD_DONE(sccb)	isp_done(sccb)
203b460c5c9SMatt Jacob 
204b460c5c9SMatt Jacob #define	XS_IS_CMD_DONE(ccb)	\
205b460c5c9SMatt Jacob 	(((ccb)->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_INPROG)
206478f8a96SJustin T. Gibbs 
207478f8a96SJustin T. Gibbs /*
208b460c5c9SMatt Jacob  * Can we tag?
209478f8a96SJustin T. Gibbs  */
210b460c5c9SMatt Jacob #define	XS_CANTAG(ccb)		(((ccb)->ccb_h.flags & CAM_TAG_ACTION_VALID) \
211b460c5c9SMatt Jacob 				  && (ccb)->tag_action != CAM_TAG_ACTION_NONE)
212b460c5c9SMatt Jacob /*
213b460c5c9SMatt Jacob  * And our favorite tag is....
214b460c5c9SMatt Jacob  */
215b460c5c9SMatt Jacob #define	XS_KINDOF_TAG(ccb)	\
216b460c5c9SMatt Jacob 	((ccb->tag_action == MSG_SIMPLE_Q_TAG)? REQFLAG_STAG : \
217b460c5c9SMatt Jacob 	  ((ccb->tag_action == MSG_HEAD_OF_Q_TAG)? REQFLAG_HTAG : REQFLAG_OTAG))
218478f8a96SJustin T. Gibbs 
219b460c5c9SMatt Jacob #define	CMD_COMPLETE		0
220b460c5c9SMatt Jacob #define	CMD_EAGAIN		1
221b460c5c9SMatt Jacob #define	CMD_QUEUED		2
2221a43c1fcSMatt Jacob #define	CMD_RQLATER		3
223b460c5c9SMatt Jacob #define	STOP_WATCHDOG(f, s)
22457c801f5SMatt Jacob 
22557c801f5SMatt Jacob extern void isp_attach(struct ispsoftc *);
22657c801f5SMatt Jacob extern void isp_uninit(struct ispsoftc *);
22757c801f5SMatt Jacob 
22857c801f5SMatt Jacob #define	MEMZERO			bzero
22957c801f5SMatt Jacob #define	MEMCPY(dst, src, amt)	bcopy((src), (dst), (amt))
23057c801f5SMatt Jacob #ifdef	__alpha__
23157c801f5SMatt Jacob #define	MemoryBarrier	alpha_mb
23257c801f5SMatt Jacob #else
23357c801f5SMatt Jacob #define	MemoryBarrier()
23457c801f5SMatt Jacob #endif
23557c801f5SMatt Jacob 
23657c801f5SMatt Jacob 
237bc3dacd6SMatt Jacob #define	DMA_MSW(x)	(((x) >> 16) & 0xffff)
238bc3dacd6SMatt Jacob #define	DMA_LSW(x)	(((x) & 0xffff))
239bc3dacd6SMatt Jacob 
24067b6f02bSMatt Jacob #define	ISP_UNSWIZZLE_AND_COPY_PDBP(isp, dest, src)	\
24167b6f02bSMatt Jacob 	bcopy(src, dest, sizeof (isp_pdb_t))
24267b6f02bSMatt Jacob #define	ISP_SWIZZLE_ICB(a, b)
24367b6f02bSMatt Jacob #define	ISP_SWIZZLE_REQUEST(a, b)
24467b6f02bSMatt Jacob #define	ISP_UNSWIZZLE_RESPONSE(a, b)
24567b6f02bSMatt Jacob #define	ISP_SWIZZLE_SNS_REQ(a, b)
24667b6f02bSMatt Jacob #define	ISP_UNSWIZZLE_SNS_RSP(a, b, c)
24767b6f02bSMatt Jacob 
2486db20c31SMatt Jacob #define	IDPRINTF(lev, x)	if (isp->isp_dblev >= (u_int8_t) lev) printf x
24957c801f5SMatt Jacob #define	PRINTF			printf
25022e1dc85SMatt Jacob #define	CFGPRINTF		if (bootverbose || DFLT_DBLEVEL > 1) printf
25157c801f5SMatt Jacob 
25257c801f5SMatt Jacob #define	SYS_DELAY(x)	DELAY(x)
25357c801f5SMatt Jacob 
25457c801f5SMatt Jacob #define	FC_FW_READY_DELAY	(5 * 1000000)
255b460c5c9SMatt Jacob #define	DEFAULT_LOOPID(x)	109
2566db20c31SMatt Jacob #define	DEFAULT_WWN(x)		(x)->isp_osinfo.default_wwn
25757c801f5SMatt Jacob 
25867b6f02bSMatt Jacob #define	INLINE	__inline
25967b6f02bSMatt Jacob #include <dev/isp/isp_inline.h>
2606054c3f6SMatt Jacob #endif	/* _ISP_FREEBSD_H */
261