xref: /freebsd/sys/dev/isp/isp_freebsd.h (revision 18ccaecd457587b0df07715f59b20e49d39793f6)
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
3818ccaecdSMatt Jacob #define	ISP_PLATFORM_VERSION_MINOR	3
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>
47df9d46b6SMatt Jacob #include <sys/proc.h>
486054c3f6SMatt Jacob 
49b460c5c9SMatt Jacob #include <machine/bus_memio.h>
50b460c5c9SMatt Jacob #include <machine/bus_pio.h>
51b460c5c9SMatt Jacob #include <machine/bus.h>
52b460c5c9SMatt Jacob #include <machine/clock.h>
53df9d46b6SMatt Jacob #include <machine/cpu.h>
5457c801f5SMatt Jacob 
55b460c5c9SMatt Jacob #include <cam/cam.h>
56b460c5c9SMatt Jacob #include <cam/cam_debug.h>
57b460c5c9SMatt Jacob #include <cam/cam_ccb.h>
58b460c5c9SMatt Jacob #include <cam/cam_sim.h>
59b460c5c9SMatt Jacob #include <cam/cam_xpt.h>
60b460c5c9SMatt Jacob #include <cam/cam_xpt_sim.h>
61b460c5c9SMatt Jacob #include <cam/cam_debug.h>
62b460c5c9SMatt Jacob #include <cam/scsi/scsi_all.h>
63b460c5c9SMatt Jacob #include <cam/scsi/scsi_message.h>
64bc3dacd6SMatt Jacob 
6567b6f02bSMatt Jacob #include "opt_ddb.h"
66b460c5c9SMatt Jacob #include "opt_isp.h"
67b460c5c9SMatt Jacob 
68be44b164SMatt Jacob typedef void ispfwfunc __P((int, int, int, const u_int16_t **));
6940b27503SMatt Jacob 
7040b27503SMatt Jacob #ifdef	ISP_TARGET_MODE
7140b27503SMatt Jacob typedef struct tstate {
7240b27503SMatt Jacob 	struct tstate *next;
7340b27503SMatt Jacob 	struct cam_path *owner;
7440b27503SMatt Jacob 	struct ccb_hdr_slist atios;
7540b27503SMatt Jacob 	struct ccb_hdr_slist inots;
7640b27503SMatt Jacob 	lun_id_t lun;
7740b27503SMatt Jacob 	u_int32_t hold;
7840b27503SMatt Jacob } tstate_t;
7940b27503SMatt Jacob 
8040b27503SMatt Jacob /*
8140b27503SMatt Jacob  * This should work very well for 100% of parallel SCSI cases, 100%
8240b27503SMatt Jacob  * of non-SCCLUN FC cases, and hopefully some larger fraction of the
8340b27503SMatt Jacob  * SCCLUN FC cases. Basically, we index by the low 5 bits of lun and
8440b27503SMatt Jacob  * then linear search. This has to be reasonably zippy, but not crucially
8540b27503SMatt Jacob  * so.
8640b27503SMatt Jacob  */
8740b27503SMatt Jacob #define	LUN_HASH_SIZE		32
8840b27503SMatt Jacob #define	LUN_HASH_FUNC(lun)	((lun) & 0x1f)
8940b27503SMatt Jacob 
9040b27503SMatt Jacob #endif
9140b27503SMatt Jacob 
926054c3f6SMatt Jacob struct isposinfo {
9340b27503SMatt Jacob 	struct ispsoftc *	next;
946db20c31SMatt Jacob 	u_int64_t		default_wwn;
956054c3f6SMatt Jacob 	char			name[8];
966054c3f6SMatt Jacob 	int			unit;
97b460c5c9SMatt Jacob 	struct cam_sim		*sim;
98b460c5c9SMatt Jacob 	struct cam_path		*path;
99b460c5c9SMatt Jacob 	struct cam_sim		*sim2;
100b460c5c9SMatt Jacob 	struct cam_path		*path2;
101df9d46b6SMatt Jacob 	struct intr_config_hook	ehook;
102df9d46b6SMatt Jacob 	volatile u_int16_t	:	14,
103df9d46b6SMatt Jacob 		islocked	:	1,
104df9d46b6SMatt Jacob 		intsok		:	1;
105df9d46b6SMatt Jacob 	u_int8_t		mboxwaiting;
106df9d46b6SMatt Jacob 	u_int8_t		simqfrozen;
107df9d46b6SMatt Jacob 	int			splsaved;
10840b27503SMatt Jacob #ifdef	ISP_TARGET_MODE
10940b27503SMatt Jacob #define	TM_WANTED		0x01
11040b27503SMatt Jacob #define	TM_BUSY			0x02
11140b27503SMatt Jacob #define	TM_TMODE_ENABLED	0x80
11240b27503SMatt Jacob 	u_int8_t		tmflags;
11340b27503SMatt Jacob 	u_int8_t		rstatus;
11440b27503SMatt Jacob 	u_int16_t		rollinfo;
11540b27503SMatt Jacob 	tstate_t		tsdflt;
11640b27503SMatt Jacob 	tstate_t		*lun_hash[LUN_HASH_SIZE];
11740b27503SMatt Jacob #endif
1186054c3f6SMatt Jacob };
11918ccaecdSMatt Jacob 
12018ccaecdSMatt Jacob /*
12118ccaecdSMatt Jacob  * Required Macros/Defines
12218ccaecdSMatt Jacob  */
12318ccaecdSMatt Jacob 
12418ccaecdSMatt Jacob #define	INLINE			__inline
12518ccaecdSMatt Jacob 
12618ccaecdSMatt Jacob #define	ISP2100_FABRIC		1
12718ccaecdSMatt Jacob #define	ISP2100_SCRLEN		0x400
12818ccaecdSMatt Jacob 
12918ccaecdSMatt Jacob #define	MEMZERO			bzero
13018ccaecdSMatt Jacob #define	MEMCPY(dst, src, amt)	bcopy((src), (dst), (amt))
13118ccaecdSMatt Jacob #define	SNPRINTF		snprintf
13218ccaecdSMatt Jacob #define	STRNCAT			strncat
13318ccaecdSMatt Jacob #define	USEC_DELAY		DELAY
13418ccaecdSMatt Jacob 
13518ccaecdSMatt Jacob #define	NANOTIME_T		struct timespec
13618ccaecdSMatt Jacob #define	GET_NANOTIME		nanotime
13718ccaecdSMatt Jacob #define	GET_NANOSEC(x)		((x)->tv_sec * 1000000000 + (x)->tv_nsec)
13818ccaecdSMatt Jacob #define	NANOTIME_SUB		nanotime_sub
13918ccaecdSMatt Jacob 
14018ccaecdSMatt Jacob #define	MAXISPREQUEST(isp)	256
14118ccaecdSMatt Jacob 
14218ccaecdSMatt Jacob #ifdef	__alpha__
14318ccaecdSMatt Jacob #define	MEMORYBARRIER(isp, type, offset, size)	alpha_mb()
14418ccaecdSMatt Jacob #else
14518ccaecdSMatt Jacob #define	MEMORYBARRIER(isp, type, offset, size)
14618ccaecdSMatt Jacob #endif
14718ccaecdSMatt Jacob 
14818ccaecdSMatt Jacob #define	MBOX_ACQUIRE(isp)
14918ccaecdSMatt Jacob #define	MBOX_WAIT_COMPLETE		isp_mbox_wait_complete
15018ccaecdSMatt Jacob #define	MBOX_NOTIFY_COMPLETE(isp)	\
15118ccaecdSMatt Jacob 	if (isp->isp_osinfo.mboxwaiting) { \
15218ccaecdSMatt Jacob 		isp->isp_osinfo.mboxwaiting = 0; \
15318ccaecdSMatt Jacob 		wakeup(&isp->isp_osinfo.mboxwaiting); \
15418ccaecdSMatt Jacob 	} \
15518ccaecdSMatt Jacob 	isp->isp_mboxbsy = 0
15618ccaecdSMatt Jacob #define	MBOX_RELEASE(isp)
15718ccaecdSMatt Jacob 
15818ccaecdSMatt Jacob #ifndef	SCSI_GOOD
15918ccaecdSMatt Jacob #define	SCSI_GOOD	SCSI_STATUS_OK
16018ccaecdSMatt Jacob #endif
16118ccaecdSMatt Jacob #ifndef	SCSI_CHECK
16218ccaecdSMatt Jacob #define	SCSI_CHECK	SCSI_STATUS_CHECK_COND
16318ccaecdSMatt Jacob #endif
16418ccaecdSMatt Jacob #ifndef	SCSI_BUSY
16518ccaecdSMatt Jacob #define	SCSI_BUSY	SCSI_STATUS_BUSY
16618ccaecdSMatt Jacob #endif
16718ccaecdSMatt Jacob #ifndef	SCSI_QFULL
16818ccaecdSMatt Jacob #define	SCSI_QFULL	SCSI_STATUS_QUEUE_FULL
16918ccaecdSMatt Jacob #endif
17018ccaecdSMatt Jacob 
17118ccaecdSMatt Jacob #define	XS_T			struct ccb_scsiio
17218ccaecdSMatt Jacob #define	XS_ISP(ccb)		((struct ispsoftc *) (ccb)->ccb_h.spriv_ptr1)
17318ccaecdSMatt Jacob #define	XS_CHANNEL(ccb)		cam_sim_bus(xpt_path_sim((ccb)->ccb_h.path))
17418ccaecdSMatt Jacob #define	XS_TGT(ccb)		(ccb)->ccb_h.target_id
17518ccaecdSMatt Jacob #define	XS_LUN(ccb)		(ccb)->ccb_h.target_lun
17618ccaecdSMatt Jacob 
17718ccaecdSMatt Jacob #define	XS_CDBP(ccb)	\
17818ccaecdSMatt Jacob 	(((ccb)->ccb_h.flags & CAM_CDB_POINTER)? \
17918ccaecdSMatt Jacob 	 (ccb)->cdb_io.cdb_ptr : (ccb)->cdb_io.cdb_bytes)
18018ccaecdSMatt Jacob 
18118ccaecdSMatt Jacob #define	XS_CDBLEN(ccb)		(ccb)->cdb_len
18218ccaecdSMatt Jacob #define	XS_XFRLEN(ccb)		(ccb)->dxfer_len
18318ccaecdSMatt Jacob #define	XS_TIME(ccb)		(ccb)->ccb_h.timeout
18418ccaecdSMatt Jacob #define	XS_RESID(ccb)		(ccb)->resid
18518ccaecdSMatt Jacob #define	XS_STSP(ccb)		(&(ccb)->scsi_status)
18618ccaecdSMatt Jacob #define	XS_SNSP(ccb)		(&(ccb)->sense_data)
18718ccaecdSMatt Jacob 
18818ccaecdSMatt Jacob #define	XS_SNSLEN(ccb)		\
18918ccaecdSMatt Jacob 	imin((sizeof((ccb)->sense_data)), ccb->sense_len)
19018ccaecdSMatt Jacob 
19118ccaecdSMatt Jacob #define	XS_SNSKEY(ccb)		((ccb)->sense_data.flags & 0xf)
19218ccaecdSMatt Jacob #define	XS_TAG_P(ccb)	\
19318ccaecdSMatt Jacob 	(((ccb)->ccb_h.flags & CAM_TAG_ACTION_VALID) && \
19418ccaecdSMatt Jacob 	 (ccb)->tag_action != CAM_TAG_ACTION_NONE)
19518ccaecdSMatt Jacob 
19618ccaecdSMatt Jacob #define	XS_TAG_TYPE(ccb)	\
19718ccaecdSMatt Jacob 	((ccb->tag_action == MSG_SIMPLE_Q_TAG)? REQFLAG_STAG : \
19818ccaecdSMatt Jacob 	 ((ccb->tag_action == MSG_HEAD_OF_Q_TAG)? REQFLAG_HTAG : REQFLAG_OTAG))
19918ccaecdSMatt Jacob 
20018ccaecdSMatt Jacob 
20118ccaecdSMatt Jacob #define	XS_SETERR(ccb, v)	(ccb)->ccb_h.status &= ~CAM_STATUS_MASK, \
20218ccaecdSMatt Jacob 				(ccb)->ccb_h.status |= v, \
20318ccaecdSMatt Jacob 				(ccb)->ccb_h.spriv_field0 |= ISP_SPRIV_ERRSET
20418ccaecdSMatt Jacob 
20518ccaecdSMatt Jacob #	define	HBA_NOERROR		CAM_REQ_INPROG
20618ccaecdSMatt Jacob #	define	HBA_BOTCH		CAM_UNREC_HBA_ERROR
20718ccaecdSMatt Jacob #	define	HBA_CMDTIMEOUT		CAM_CMD_TIMEOUT
20818ccaecdSMatt Jacob #	define	HBA_SELTIMEOUT		CAM_SEL_TIMEOUT
20918ccaecdSMatt Jacob #	define	HBA_TGTBSY		CAM_SCSI_STATUS_ERROR
21018ccaecdSMatt Jacob #	define	HBA_BUSRESET		CAM_SCSI_BUS_RESET
21118ccaecdSMatt Jacob #	define	HBA_ABORTED		CAM_REQ_ABORTED
21218ccaecdSMatt Jacob #	define	HBA_DATAOVR		CAM_DATA_RUN_ERR
21318ccaecdSMatt Jacob #	define	HBA_ARQFAIL		CAM_AUTOSENSE_FAIL
21418ccaecdSMatt Jacob 
21518ccaecdSMatt Jacob 
21618ccaecdSMatt Jacob #define	XS_ERR(ccb)		((ccb)->ccb_h.status & CAM_STATUS_MASK)
21718ccaecdSMatt Jacob 
21818ccaecdSMatt Jacob #define	XS_NOERR(ccb)		\
21918ccaecdSMatt Jacob 	(((ccb)->ccb_h.spriv_field0 & ISP_SPRIV_ERRSET) == 0 || \
22018ccaecdSMatt Jacob 	 ((ccb)->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INPROG)
22118ccaecdSMatt Jacob 
22218ccaecdSMatt Jacob #define	XS_INITERR(ccb)		\
22318ccaecdSMatt Jacob 	XS_SETERR(ccb, CAM_REQ_INPROG), (ccb)->ccb_h.spriv_field0 = 0
22418ccaecdSMatt Jacob 
22518ccaecdSMatt Jacob #define	XS_SAVE_SENSE(xs, sp)				\
22618ccaecdSMatt Jacob 	bcopy(sp->req_sense_data, &(xs)->sense_data,	\
22718ccaecdSMatt Jacob 	    imin(XS_SNSLEN(xs), sp->req_sense_len))
22818ccaecdSMatt Jacob 
22918ccaecdSMatt Jacob #define	XS_SET_STATE_STAT(a, b, c)
23018ccaecdSMatt Jacob 
23118ccaecdSMatt Jacob #define	DEFAULT_IID(x)		7
23218ccaecdSMatt Jacob #define	DEFAULT_LOOPID(x)	109
23318ccaecdSMatt Jacob #define	DEFAULT_NODEWWN(isp)	(isp)->isp_osinfo.default_wwn
23418ccaecdSMatt Jacob #define	DEFAULT_PORTWWN(isp)	\
23518ccaecdSMatt Jacob 	isp_port_from_node_wwn((isp), (isp)->isp_osinfo.default_wwn)
23618ccaecdSMatt Jacob #define	PORT_FROM_NODE_WWN	isp_port_from_node_wwn
23718ccaecdSMatt Jacob 
23818ccaecdSMatt Jacob #define	ISP_UNSWIZZLE_AND_COPY_PDBP(isp, dest, src)	\
23918ccaecdSMatt Jacob 	if((void *)src != (void *)dest) bcopy(src, dest, sizeof (isp_pdb_t))
24018ccaecdSMatt Jacob #define	ISP_SWIZZLE_ICB(a, b)
24118ccaecdSMatt Jacob #define	ISP_SWIZZLE_REQUEST(a, b)
24218ccaecdSMatt Jacob #define	ISP_UNSWIZZLE_RESPONSE(a, b, c)
24318ccaecdSMatt Jacob #define	ISP_SWIZZLE_SNS_REQ(a, b)
24418ccaecdSMatt Jacob #define	ISP_UNSWIZZLE_SNS_RSP(a, b, c)
24518ccaecdSMatt Jacob #define	ISP_SWIZZLE_NVRAM_WORD(isp, x)
24618ccaecdSMatt Jacob 
24718ccaecdSMatt Jacob /*
24818ccaecdSMatt Jacob  * Includes of common header files
24918ccaecdSMatt Jacob  */
25018ccaecdSMatt Jacob 
25118ccaecdSMatt Jacob #include <dev/isp/ispreg.h>
25218ccaecdSMatt Jacob #include <dev/isp/ispvar.h>
25318ccaecdSMatt Jacob #include <dev/isp/ispmbox.h>
25418ccaecdSMatt Jacob 
25518ccaecdSMatt Jacob /*
25618ccaecdSMatt Jacob  * isp_osinfo definiitions && shorthand
25718ccaecdSMatt Jacob  */
258b460c5c9SMatt Jacob #define	SIMQFRZ_RESOURCE	0x1
259b460c5c9SMatt Jacob #define	SIMQFRZ_LOOPDOWN	0x2
2601a43c1fcSMatt Jacob #define	SIMQFRZ_TIMED		0x4
261b460c5c9SMatt Jacob 
262b460c5c9SMatt Jacob #define	isp_sim		isp_osinfo.sim
263b460c5c9SMatt Jacob #define	isp_path	isp_osinfo.path
264b460c5c9SMatt Jacob #define	isp_sim2	isp_osinfo.sim2
265b460c5c9SMatt Jacob #define	isp_path2	isp_osinfo.path2
266b460c5c9SMatt Jacob #define	isp_unit	isp_osinfo.unit
267b460c5c9SMatt Jacob #define	isp_name	isp_osinfo.name
268b460c5c9SMatt Jacob 
26918ccaecdSMatt Jacob /*
27018ccaecdSMatt Jacob  * prototypes for isp_pci && isp_freebsd to share
27118ccaecdSMatt Jacob  */
27218ccaecdSMatt Jacob extern void isp_attach(struct ispsoftc *);
27318ccaecdSMatt Jacob extern void isp_uninit(struct ispsoftc *);
274478f8a96SJustin T. Gibbs 
27518ccaecdSMatt Jacob /*
27618ccaecdSMatt Jacob  * Locking macros...
27718ccaecdSMatt Jacob  */
278df9d46b6SMatt Jacob 
279df9d46b6SMatt Jacob #define	ISP_LOCK		isp_lock
280df9d46b6SMatt Jacob #define	ISP_UNLOCK		isp_unlock
28118ccaecdSMatt Jacob 
28218ccaecdSMatt Jacob /* not safely working yet */
283910fb4f6SMatt Jacob #if	0
284df9d46b6SMatt Jacob #define	SERVICING_INTERRUPT(isp)	(intr_nesting_level != 0)
285910fb4f6SMatt Jacob #endif
286df9d46b6SMatt Jacob 
287478f8a96SJustin T. Gibbs /*
28818ccaecdSMatt Jacob  * Platform private flags
289478f8a96SJustin T. Gibbs  */
290cc287907SMatt Jacob #define	ISP_SPRIV_ERRSET	0x1
291cc287907SMatt Jacob #define	ISP_SPRIV_INWDOG	0x2
292cc287907SMatt Jacob #define	ISP_SPRIV_GRACE		0x4
293cc287907SMatt Jacob #define	ISP_SPRIV_DONE		0x8
294cc287907SMatt Jacob 
295cc287907SMatt Jacob #define	XS_CMD_S_WDOG(sccb)	(sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_INWDOG
296cc287907SMatt Jacob #define	XS_CMD_C_WDOG(sccb)	(sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_INWDOG
297cc287907SMatt Jacob #define	XS_CMD_WDOG_P(sccb)	((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_INWDOG)
298cc287907SMatt Jacob 
299cc287907SMatt Jacob #define	XS_CMD_S_GRACE(sccb)	(sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_GRACE
300cc287907SMatt Jacob #define	XS_CMD_C_GRACE(sccb)	(sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_GRACE
301cc287907SMatt Jacob #define	XS_CMD_GRACE_P(sccb)	((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_GRACE)
302cc287907SMatt Jacob 
303cc287907SMatt Jacob #define	XS_CMD_S_DONE(sccb)	(sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_DONE
304cc287907SMatt Jacob #define	XS_CMD_C_DONE(sccb)	(sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_DONE
305cc287907SMatt Jacob #define	XS_CMD_DONE_P(sccb)	((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_DONE)
306cc287907SMatt Jacob 
307cc287907SMatt Jacob #define	XS_CMD_S_CLEAR(sccb)	(sccb)->ccb_h.spriv_field0 = 0
308478f8a96SJustin T. Gibbs /*
30918ccaecdSMatt Jacob  * Platform specific inline functions
310478f8a96SJustin T. Gibbs  */
311478f8a96SJustin T. Gibbs 
31218ccaecdSMatt Jacob static INLINE void isp_lock(struct ispsoftc *);
31318ccaecdSMatt Jacob static INLINE void
31418ccaecdSMatt Jacob isp_lock(struct ispsoftc *isp)
31518ccaecdSMatt Jacob {
31618ccaecdSMatt Jacob 	int s = splcam();
31718ccaecdSMatt Jacob 	if (isp->isp_osinfo.islocked == 0) {
31818ccaecdSMatt Jacob 		isp->isp_osinfo.islocked = 1;
31918ccaecdSMatt Jacob 		isp->isp_osinfo.splsaved = s;
32018ccaecdSMatt Jacob 	} else {
32118ccaecdSMatt Jacob 		splx(s);
32218ccaecdSMatt Jacob 	}
32318ccaecdSMatt Jacob }
32457c801f5SMatt Jacob 
32518ccaecdSMatt Jacob static INLINE void isp_unlock(struct ispsoftc *);
32618ccaecdSMatt Jacob static INLINE void
32718ccaecdSMatt Jacob isp_unlock(struct ispsoftc *isp)
32818ccaecdSMatt Jacob {
32918ccaecdSMatt Jacob 	if (isp->isp_osinfo.islocked) {
33018ccaecdSMatt Jacob 		isp->isp_osinfo.islocked = 0;
33118ccaecdSMatt Jacob 		splx(isp->isp_osinfo.splsaved);
33218ccaecdSMatt Jacob 	}
33318ccaecdSMatt Jacob }
33457c801f5SMatt Jacob 
33518ccaecdSMatt Jacob static INLINE void isp_mbox_wait_complete(struct ispsoftc *);
33618ccaecdSMatt Jacob static INLINE void
33718ccaecdSMatt Jacob isp_mbox_wait_complete(struct ispsoftc *isp)
33818ccaecdSMatt Jacob {
33918ccaecdSMatt Jacob #ifdef	SERVICING_INTERRUPT
34018ccaecdSMatt Jacob 	if (isp->isp_osinfo.intsok == 0 || SERVICING_INTERRUPT(isp)) {
34118ccaecdSMatt Jacob 		int j;
34218ccaecdSMatt Jacob 		for (j = 0; j < 60 * 2000; j++) {
34318ccaecdSMatt Jacob 			if (isp_intr(isp) == 0) {
34418ccaecdSMatt Jacob 				USEC_DELAY(500);
34518ccaecdSMatt Jacob 			}
34618ccaecdSMatt Jacob 			if (isp->isp_mboxbsy == 0) {
34718ccaecdSMatt Jacob 				break;
34818ccaecdSMatt Jacob 			}
34918ccaecdSMatt Jacob 		}
35018ccaecdSMatt Jacob 		if (isp->isp_mboxbsy != 0) {
35118ccaecdSMatt Jacob 			isp_prt(isp, ISP_LOGWARN, "mailbox timeout");
35218ccaecdSMatt Jacob 		}
35318ccaecdSMatt Jacob 	} else {
35418ccaecdSMatt Jacob 		isp->isp_osinfo.mboxwaiting = 1;
35518ccaecdSMatt Jacob 		while (isp->isp_mboxbsy != 0) {
35618ccaecdSMatt Jacob 			(void) tsleep(&isp->isp_osinfo.mboxwaiting, PRIBIO,
35718ccaecdSMatt Jacob 			    "isp_mailbox", 0);
35818ccaecdSMatt Jacob 		}
35918ccaecdSMatt Jacob 	}
36057c801f5SMatt Jacob #else
36118ccaecdSMatt Jacob 	int j;
36218ccaecdSMatt Jacob 	for (j = 0; j < 60 * 2000; j++) {
36318ccaecdSMatt Jacob 		if (isp_intr(isp) == 0) {
36418ccaecdSMatt Jacob 			USEC_DELAY(500);
36518ccaecdSMatt Jacob 		}
36618ccaecdSMatt Jacob 		if (isp->isp_mboxbsy == 0) {
36718ccaecdSMatt Jacob 			break;
36818ccaecdSMatt Jacob 		}
36918ccaecdSMatt Jacob 	}
37018ccaecdSMatt Jacob 	if (isp->isp_mboxbsy != 0) {
37118ccaecdSMatt Jacob 		isp_prt(isp, ISP_LOGWARN, "mailbox timeout");
37218ccaecdSMatt Jacob 	}
37357c801f5SMatt Jacob #endif
37418ccaecdSMatt Jacob }
37557c801f5SMatt Jacob 
37618ccaecdSMatt Jacob static INLINE u_int64_t nanotime_sub(struct timespec *, struct timespec *);
37718ccaecdSMatt Jacob static INLINE u_int64_t
37818ccaecdSMatt Jacob nanotime_sub(struct timespec *b, struct timespec *a)
37918ccaecdSMatt Jacob {
38018ccaecdSMatt Jacob 	u_int64_t elapsed;
38118ccaecdSMatt Jacob 	struct timespec x = *b;
38218ccaecdSMatt Jacob 	timespecsub(&x, a);
38318ccaecdSMatt Jacob 	elapsed = GET_NANOSEC(&x);
38418ccaecdSMatt Jacob 	if (elapsed == 0)
38518ccaecdSMatt Jacob 		elapsed++;
38618ccaecdSMatt Jacob 	return (elapsed);
38718ccaecdSMatt Jacob }
38857c801f5SMatt Jacob 
38918ccaecdSMatt Jacob static INLINE char *strncat(char *, const char *, size_t);
39018ccaecdSMatt Jacob static INLINE char *
391df9d46b6SMatt Jacob strncat(char *d, const char *s, size_t c)
392df9d46b6SMatt Jacob {
393df9d46b6SMatt Jacob         char *t = d;
394df9d46b6SMatt Jacob 
395df9d46b6SMatt Jacob         if (c) {
396df9d46b6SMatt Jacob                 while (*d)
397df9d46b6SMatt Jacob                         d++;
398df9d46b6SMatt Jacob                 while ((*d++ = *s++)) {
399df9d46b6SMatt Jacob                         if (--c == 0) {
400df9d46b6SMatt Jacob                                 *d = '\0';
401df9d46b6SMatt Jacob                                 break;
402df9d46b6SMatt Jacob                         }
403df9d46b6SMatt Jacob                 }
404df9d46b6SMatt Jacob         }
405df9d46b6SMatt Jacob         return (t);
406df9d46b6SMatt Jacob }
40757c801f5SMatt Jacob 
40818ccaecdSMatt Jacob static INLINE u_int64_t isp_port_from_node_wwn(struct ispsoftc *, u_int64_t);
40918ccaecdSMatt Jacob static INLINE u_int64_t
41018ccaecdSMatt Jacob isp_port_from_node_wwn(struct ispsoftc *isp, u_int64_t node_wwn)
41118ccaecdSMatt Jacob {
41218ccaecdSMatt Jacob 	u_int64_t rv = node_wwn;
41318ccaecdSMatt Jacob 	if ((node_wwn >> 60) == 2) {
41418ccaecdSMatt Jacob 		rv = node_wwn |
41518ccaecdSMatt Jacob 		    (((u_int64_t)(isp->isp_unit+1)) << 48);
41618ccaecdSMatt Jacob 	}
41718ccaecdSMatt Jacob 	return (rv);
41818ccaecdSMatt Jacob }
41957c801f5SMatt Jacob 
42018ccaecdSMatt Jacob /*
42118ccaecdSMatt Jacob  * Common inline functions
42218ccaecdSMatt Jacob  */
42357c801f5SMatt Jacob 
42467b6f02bSMatt Jacob #include <dev/isp/isp_inline.h>
4256054c3f6SMatt Jacob #endif	/* _ISP_FREEBSD_H */
426