xref: /freebsd/sys/dev/isp/isp_freebsd.h (revision df9d46b6d9e77db555ba7246673787cd8e1d0e51)
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
38be44b164SMatt Jacob #define	ISP_PLATFORM_VERSION_MINOR	2
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"
67be44b164SMatt Jacob /*
68be44b164SMatt Jacob  * We are now always supporting fabric mode.
69be44b164SMatt Jacob  */
70b460c5c9SMatt Jacob #define	ISP2100_FABRIC		1
71b460c5c9SMatt Jacob #define	ISP2100_SCRLEN		0x400
72b460c5c9SMatt Jacob 
73b460c5c9SMatt Jacob #ifndef	SCSI_CHECK
74b460c5c9SMatt Jacob #define	SCSI_CHECK	SCSI_STATUS_CHECK_COND
75b460c5c9SMatt Jacob #endif
76b460c5c9SMatt Jacob #ifndef	SCSI_BUSY
77b460c5c9SMatt Jacob #define	SCSI_BUSY	SCSI_STATUS_BUSY
78b460c5c9SMatt Jacob #endif
79b460c5c9SMatt Jacob #ifndef	SCSI_QFULL
80b460c5c9SMatt Jacob #define	SCSI_QFULL	SCSI_STATUS_QUEUE_FULL
81b460c5c9SMatt Jacob #endif
82b460c5c9SMatt Jacob 
83b460c5c9SMatt Jacob #define	ISP_SCSI_XFER_T		struct ccb_scsiio
84be44b164SMatt Jacob typedef void ispfwfunc __P((int, int, int, const u_int16_t **));
8540b27503SMatt Jacob 
8640b27503SMatt Jacob #ifdef	ISP_TARGET_MODE
8740b27503SMatt Jacob typedef struct tstate {
8840b27503SMatt Jacob 	struct tstate *next;
8940b27503SMatt Jacob 	struct cam_path *owner;
9040b27503SMatt Jacob 	struct ccb_hdr_slist atios;
9140b27503SMatt Jacob 	struct ccb_hdr_slist inots;
9240b27503SMatt Jacob 	lun_id_t lun;
9340b27503SMatt Jacob 	u_int32_t hold;
9440b27503SMatt Jacob } tstate_t;
9540b27503SMatt Jacob 
9640b27503SMatt Jacob /*
9740b27503SMatt Jacob  * This should work very well for 100% of parallel SCSI cases, 100%
9840b27503SMatt Jacob  * of non-SCCLUN FC cases, and hopefully some larger fraction of the
9940b27503SMatt Jacob  * SCCLUN FC cases. Basically, we index by the low 5 bits of lun and
10040b27503SMatt Jacob  * then linear search. This has to be reasonably zippy, but not crucially
10140b27503SMatt Jacob  * so.
10240b27503SMatt Jacob  */
10340b27503SMatt Jacob #define	LUN_HASH_SIZE		32
10440b27503SMatt Jacob #define	LUN_HASH_FUNC(lun)	((lun) & 0x1f)
10540b27503SMatt Jacob 
10640b27503SMatt Jacob #endif
10740b27503SMatt Jacob 
1086054c3f6SMatt Jacob struct isposinfo {
10940b27503SMatt Jacob 	struct ispsoftc *	next;
1106db20c31SMatt Jacob 	u_int64_t		default_wwn;
1116054c3f6SMatt Jacob 	char			name[8];
1126054c3f6SMatt Jacob 	int			unit;
113b460c5c9SMatt Jacob 	struct cam_sim		*sim;
114b460c5c9SMatt Jacob 	struct cam_path		*path;
115b460c5c9SMatt Jacob 	struct cam_sim		*sim2;
116b460c5c9SMatt Jacob 	struct cam_path		*path2;
117df9d46b6SMatt Jacob 	struct intr_config_hook	ehook;
118df9d46b6SMatt Jacob 	volatile u_int16_t	:	14,
119df9d46b6SMatt Jacob 		islocked	:	1,
120df9d46b6SMatt Jacob 		intsok		:	1;
121df9d46b6SMatt Jacob 	u_int8_t		mboxwaiting;
122df9d46b6SMatt Jacob 	u_int8_t		simqfrozen;
123df9d46b6SMatt Jacob 	int			splsaved;
12440b27503SMatt Jacob #ifdef	ISP_TARGET_MODE
12540b27503SMatt Jacob #define	TM_WANTED		0x01
12640b27503SMatt Jacob #define	TM_BUSY			0x02
12740b27503SMatt Jacob #define	TM_TMODE_ENABLED	0x80
12840b27503SMatt Jacob 	u_int8_t		tmflags;
12940b27503SMatt Jacob 	u_int8_t		rstatus;
13040b27503SMatt Jacob 	u_int16_t		rollinfo;
13140b27503SMatt Jacob 	tstate_t		tsdflt;
13240b27503SMatt Jacob 	tstate_t		*lun_hash[LUN_HASH_SIZE];
13340b27503SMatt Jacob #endif
1346054c3f6SMatt Jacob };
135b460c5c9SMatt Jacob #define	SIMQFRZ_RESOURCE	0x1
136b460c5c9SMatt Jacob #define	SIMQFRZ_LOOPDOWN	0x2
1371a43c1fcSMatt Jacob #define	SIMQFRZ_TIMED		0x4
138b460c5c9SMatt Jacob 
139b460c5c9SMatt Jacob #define	isp_sim		isp_osinfo.sim
140b460c5c9SMatt Jacob #define	isp_path	isp_osinfo.path
141b460c5c9SMatt Jacob #define	isp_sim2	isp_osinfo.sim2
142b460c5c9SMatt Jacob #define	isp_path2	isp_osinfo.path2
143b460c5c9SMatt Jacob #define	isp_unit	isp_osinfo.unit
144b460c5c9SMatt Jacob #define	isp_name	isp_osinfo.name
145b460c5c9SMatt Jacob 
146b460c5c9SMatt Jacob #define	MAXISPREQUEST		256
147478f8a96SJustin T. Gibbs 
148bc3dacd6SMatt Jacob #include <dev/isp/ispreg.h>
149bc3dacd6SMatt Jacob #include <dev/isp/ispvar.h>
150bc3dacd6SMatt Jacob #include <dev/isp/ispmbox.h>
151bc3dacd6SMatt Jacob 
15267b6f02bSMatt Jacob #define	DFLT_DBLEVEL		isp_debug
15367b6f02bSMatt Jacob extern int isp_debug;
154df9d46b6SMatt Jacob 
155df9d46b6SMatt Jacob static __inline void isp_lock(struct ispsoftc *);
156df9d46b6SMatt Jacob static __inline void isp_unlock(struct ispsoftc *);
157df9d46b6SMatt Jacob 
158df9d46b6SMatt Jacob static __inline void
159df9d46b6SMatt Jacob isp_lock(struct ispsoftc *isp)
160df9d46b6SMatt Jacob {
161df9d46b6SMatt Jacob 	int s = splcam();
162df9d46b6SMatt Jacob 	if (isp->isp_osinfo.islocked == 0) {
163df9d46b6SMatt Jacob 		isp->isp_osinfo.islocked = 1;
164df9d46b6SMatt Jacob 		isp->isp_osinfo.splsaved = s;
165df9d46b6SMatt Jacob 	} else {
166df9d46b6SMatt Jacob 		splx(s);
167df9d46b6SMatt Jacob 	}
168df9d46b6SMatt Jacob }
169df9d46b6SMatt Jacob 
170df9d46b6SMatt Jacob static __inline void
171df9d46b6SMatt Jacob isp_unlock(struct ispsoftc *isp)
172df9d46b6SMatt Jacob {
173df9d46b6SMatt Jacob 	if (isp->isp_osinfo.islocked) {
174df9d46b6SMatt Jacob 		isp->isp_osinfo.islocked = 0;
175df9d46b6SMatt Jacob 		splx(isp->isp_osinfo.splsaved);
176df9d46b6SMatt Jacob 	}
177df9d46b6SMatt Jacob }
178df9d46b6SMatt Jacob 
179df9d46b6SMatt Jacob #define	ISP_LOCK		isp_lock
180df9d46b6SMatt Jacob #define	ISP_UNLOCK		isp_unlock
181df9d46b6SMatt Jacob #define	SERVICING_INTERRUPT(isp)	(intr_nesting_level != 0)
182df9d46b6SMatt Jacob 
183df9d46b6SMatt Jacob #define	MBOX_WAIT_COMPLETE(isp)		\
184df9d46b6SMatt Jacob 	if (isp->isp_osinfo.intsok == 0 || SERVICING_INTERRUPT(isp)) { \
185df9d46b6SMatt Jacob 		int j; \
186df9d46b6SMatt Jacob 		for (j = 0; j < 60 * 2000; j++) { \
187df9d46b6SMatt Jacob 			if (isp_intr(isp) == 0) { \
188df9d46b6SMatt Jacob 				SYS_DELAY(500); \
189df9d46b6SMatt Jacob 			} \
190df9d46b6SMatt Jacob 			if (isp->isp_mboxbsy == 0) \
191df9d46b6SMatt Jacob 				break; \
192df9d46b6SMatt Jacob 		} \
193df9d46b6SMatt Jacob 		if (isp->isp_mboxbsy != 0) \
194df9d46b6SMatt Jacob 			printf("%s: mailbox timeout\n", isp->isp_name); \
195df9d46b6SMatt Jacob 	} else { \
196df9d46b6SMatt Jacob 		isp->isp_osinfo.mboxwaiting = 1; \
197df9d46b6SMatt Jacob 		while (isp->isp_mboxbsy != 0) \
198df9d46b6SMatt Jacob 			(void) tsleep(&isp->isp_osinfo.mboxwaiting, PRIBIO, \
199df9d46b6SMatt Jacob 			    "isp_mailbox", 0);\
200df9d46b6SMatt Jacob 	}
201df9d46b6SMatt Jacob 
202df9d46b6SMatt Jacob #define	MBOX_NOTIFY_COMPLETE(isp)	\
203df9d46b6SMatt Jacob 	if (isp->isp_osinfo.mboxwaiting) { \
204df9d46b6SMatt Jacob 		isp->isp_osinfo.mboxwaiting = 0; \
205df9d46b6SMatt Jacob 		wakeup(&isp->isp_osinfo.mboxwaiting); \
206df9d46b6SMatt Jacob 	} \
207df9d46b6SMatt Jacob 	isp->isp_mboxbsy = 0
2086054c3f6SMatt Jacob 
209b460c5c9SMatt Jacob #define	XS_NULL(ccb)		ccb == NULL
210b460c5c9SMatt Jacob #define	XS_ISP(ccb)		((struct ispsoftc *) (ccb)->ccb_h.spriv_ptr1)
2116054c3f6SMatt Jacob 
212b460c5c9SMatt Jacob #define	XS_LUN(ccb)		(ccb)->ccb_h.target_lun
213b460c5c9SMatt Jacob #define	XS_TGT(ccb)		(ccb)->ccb_h.target_id
214b460c5c9SMatt Jacob #define	XS_CHANNEL(ccb)		cam_sim_bus(xpt_path_sim((ccb)->ccb_h.path))
215b460c5c9SMatt Jacob #define	XS_RESID(ccb)		(ccb)->resid
216b460c5c9SMatt Jacob #define	XS_XFRLEN(ccb)		(ccb)->dxfer_len
217b460c5c9SMatt Jacob #define	XS_CDBLEN(ccb)		(ccb)->cdb_len
218b460c5c9SMatt Jacob #define	XS_CDBP(ccb)		(((ccb)->ccb_h.flags & CAM_CDB_POINTER)? \
219b460c5c9SMatt Jacob 	(ccb)->cdb_io.cdb_ptr : (ccb)->cdb_io.cdb_bytes)
220b460c5c9SMatt Jacob #define	XS_STS(ccb)		(ccb)->scsi_status
221b460c5c9SMatt Jacob #define	XS_TIME(ccb)		(ccb)->ccb_h.timeout
222b460c5c9SMatt Jacob #define	XS_SNSP(ccb)		(&(ccb)->sense_data)
22367b6f02bSMatt Jacob #define	XS_SNSLEN(ccb)		\
22467b6f02bSMatt Jacob 	imin((sizeof((ccb)->sense_data)), ccb->sense_len)
225b460c5c9SMatt Jacob #define	XS_SNSKEY(ccb)		((ccb)->sense_data.flags & 0xf)
2266054c3f6SMatt Jacob 
227478f8a96SJustin T. Gibbs /*
228b460c5c9SMatt Jacob  * A little tricky- HBA_NOERROR is "in progress" so
229b460c5c9SMatt Jacob  * that XS_CMD_DONE can transition this to CAM_REQ_CMP.
230478f8a96SJustin T. Gibbs  */
231b460c5c9SMatt Jacob #define	HBA_NOERROR		CAM_REQ_INPROG
232b460c5c9SMatt Jacob #define	HBA_BOTCH		CAM_UNREC_HBA_ERROR
233b460c5c9SMatt Jacob #define	HBA_CMDTIMEOUT		CAM_CMD_TIMEOUT
234b460c5c9SMatt Jacob #define	HBA_SELTIMEOUT		CAM_SEL_TIMEOUT
235b460c5c9SMatt Jacob #define	HBA_TGTBSY		CAM_SCSI_STATUS_ERROR
236b460c5c9SMatt Jacob #define	HBA_BUSRESET		CAM_SCSI_BUS_RESET
237b460c5c9SMatt Jacob #define	HBA_ABORTED		CAM_REQ_ABORTED
238b460c5c9SMatt Jacob #define	HBA_DATAOVR		CAM_DATA_RUN_ERR
239b460c5c9SMatt Jacob #define	HBA_ARQFAIL		CAM_AUTOSENSE_FAIL
240b460c5c9SMatt Jacob 
241b460c5c9SMatt Jacob #define	XS_SNS_IS_VALID(ccb) ((ccb)->ccb_h.status |= CAM_AUTOSNS_VALID)
242b460c5c9SMatt Jacob #define	XS_IS_SNS_VALID(ccb) (((ccb)->ccb_h.status & CAM_AUTOSNS_VALID) != 0)
243b460c5c9SMatt Jacob 
244cc287907SMatt Jacob #define	ISP_SPRIV_ERRSET	0x1
245cc287907SMatt Jacob #define	ISP_SPRIV_INWDOG	0x2
246cc287907SMatt Jacob #define	ISP_SPRIV_GRACE		0x4
247cc287907SMatt Jacob #define	ISP_SPRIV_DONE		0x8
248cc287907SMatt Jacob 
249cc287907SMatt Jacob #define	XS_CMD_S_WDOG(sccb)	(sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_INWDOG
250cc287907SMatt Jacob #define	XS_CMD_C_WDOG(sccb)	(sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_INWDOG
251cc287907SMatt Jacob #define	XS_CMD_WDOG_P(sccb)	((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_INWDOG)
252cc287907SMatt Jacob 
253cc287907SMatt Jacob #define	XS_CMD_S_GRACE(sccb)	(sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_GRACE
254cc287907SMatt Jacob #define	XS_CMD_C_GRACE(sccb)	(sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_GRACE
255cc287907SMatt Jacob #define	XS_CMD_GRACE_P(sccb)	((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_GRACE)
256cc287907SMatt Jacob 
257cc287907SMatt Jacob #define	XS_CMD_S_DONE(sccb)	(sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_DONE
258cc287907SMatt Jacob #define	XS_CMD_C_DONE(sccb)	(sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_DONE
259cc287907SMatt Jacob #define	XS_CMD_DONE_P(sccb)	((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_DONE)
260cc287907SMatt Jacob 
261cc287907SMatt Jacob #define	XS_CMD_S_CLEAR(sccb)	(sccb)->ccb_h.spriv_field0 = 0
262cc287907SMatt Jacob 
263cc287907SMatt Jacob 
264cc287907SMatt Jacob #define	XS_SETERR(ccb, v)	(ccb)->ccb_h.status &= ~CAM_STATUS_MASK, \
265cc287907SMatt Jacob 				(ccb)->ccb_h.status |= v, \
266cc287907SMatt Jacob 				(ccb)->ccb_h.spriv_field0 |= ISP_SPRIV_ERRSET
267cc287907SMatt Jacob 
268cc287907SMatt Jacob #define	XS_INITERR(ccb)		XS_SETERR(ccb, CAM_REQ_INPROG), \
269cc287907SMatt Jacob 				XS_CMD_S_CLEAR(ccb)
270cc287907SMatt Jacob 
271cc287907SMatt Jacob #define	XS_ERR(ccb)		((ccb)->ccb_h.status & CAM_STATUS_MASK)
272cc287907SMatt Jacob 
273b460c5c9SMatt Jacob #define	XS_NOERR(ccb)		\
274cc287907SMatt Jacob 	(((ccb)->ccb_h.spriv_field0 & ISP_SPRIV_ERRSET) == 0 || \
275cc287907SMatt Jacob 	 ((ccb)->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INPROG)
276cc287907SMatt Jacob 
277cc287907SMatt Jacob #define	XS_CMD_DONE		isp_done
278b460c5c9SMatt Jacob 
279b460c5c9SMatt Jacob extern void isp_done(struct ccb_scsiio *);
280478f8a96SJustin T. Gibbs 
281478f8a96SJustin T. Gibbs /*
282b460c5c9SMatt Jacob  * Can we tag?
283478f8a96SJustin T. Gibbs  */
284b460c5c9SMatt Jacob #define	XS_CANTAG(ccb)		(((ccb)->ccb_h.flags & CAM_TAG_ACTION_VALID) \
285b460c5c9SMatt Jacob 				  && (ccb)->tag_action != CAM_TAG_ACTION_NONE)
286b460c5c9SMatt Jacob /*
287b460c5c9SMatt Jacob  * And our favorite tag is....
288b460c5c9SMatt Jacob  */
289b460c5c9SMatt Jacob #define	XS_KINDOF_TAG(ccb)	\
290b460c5c9SMatt Jacob 	((ccb->tag_action == MSG_SIMPLE_Q_TAG)? REQFLAG_STAG : \
291b460c5c9SMatt Jacob 	  ((ccb->tag_action == MSG_HEAD_OF_Q_TAG)? REQFLAG_HTAG : REQFLAG_OTAG))
292478f8a96SJustin T. Gibbs 
293b460c5c9SMatt Jacob #define	CMD_COMPLETE		0
294b460c5c9SMatt Jacob #define	CMD_EAGAIN		1
295b460c5c9SMatt Jacob #define	CMD_QUEUED		2
2961a43c1fcSMatt Jacob #define	CMD_RQLATER		3
29757c801f5SMatt Jacob 
29857c801f5SMatt Jacob extern void isp_attach(struct ispsoftc *);
29957c801f5SMatt Jacob extern void isp_uninit(struct ispsoftc *);
30057c801f5SMatt Jacob 
30157c801f5SMatt Jacob #define	MEMZERO			bzero
30257c801f5SMatt Jacob #define	MEMCPY(dst, src, amt)	bcopy((src), (dst), (amt))
30357c801f5SMatt Jacob #ifdef	__alpha__
30457c801f5SMatt Jacob #define	MemoryBarrier	alpha_mb
30557c801f5SMatt Jacob #else
30657c801f5SMatt Jacob #define	MemoryBarrier()
30757c801f5SMatt Jacob #endif
30857c801f5SMatt Jacob 
30957c801f5SMatt Jacob 
310bc3dacd6SMatt Jacob #define	DMA_MSW(x)	(((x) >> 16) & 0xffff)
311bc3dacd6SMatt Jacob #define	DMA_LSW(x)	(((x) & 0xffff))
312bc3dacd6SMatt Jacob 
31367b6f02bSMatt Jacob #define	ISP_UNSWIZZLE_AND_COPY_PDBP(isp, dest, src)	\
31467b6f02bSMatt Jacob 	bcopy(src, dest, sizeof (isp_pdb_t))
31567b6f02bSMatt Jacob #define	ISP_SWIZZLE_ICB(a, b)
31667b6f02bSMatt Jacob #define	ISP_SWIZZLE_REQUEST(a, b)
31767b6f02bSMatt Jacob #define	ISP_UNSWIZZLE_RESPONSE(a, b)
31867b6f02bSMatt Jacob #define	ISP_SWIZZLE_SNS_REQ(a, b)
31967b6f02bSMatt Jacob #define	ISP_UNSWIZZLE_SNS_RSP(a, b, c)
32067b6f02bSMatt Jacob 
3216db20c31SMatt Jacob #define	IDPRINTF(lev, x)	if (isp->isp_dblev >= (u_int8_t) lev) printf x
32257c801f5SMatt Jacob #define	PRINTF			printf
32322e1dc85SMatt Jacob #define	CFGPRINTF		if (bootverbose || DFLT_DBLEVEL > 1) printf
324df9d46b6SMatt Jacob #define	STRNCAT			strncat
325df9d46b6SMatt Jacob static __inline char *strncat(char *, const char *, size_t);
326df9d46b6SMatt Jacob static __inline char *
327df9d46b6SMatt Jacob strncat(char *d, const char *s, size_t c)
328df9d46b6SMatt Jacob {
329df9d46b6SMatt Jacob         char *t = d;
330df9d46b6SMatt Jacob 
331df9d46b6SMatt Jacob         if (c) {
332df9d46b6SMatt Jacob                 while (*d)
333df9d46b6SMatt Jacob                         d++;
334df9d46b6SMatt Jacob                 while ((*d++ = *s++)) {
335df9d46b6SMatt Jacob                         if (--c == 0) {
336df9d46b6SMatt Jacob                                 *d = '\0';
337df9d46b6SMatt Jacob                                 break;
338df9d46b6SMatt Jacob                         }
339df9d46b6SMatt Jacob                 }
340df9d46b6SMatt Jacob         }
341df9d46b6SMatt Jacob         return (t);
342df9d46b6SMatt Jacob }
34357c801f5SMatt Jacob 
34457c801f5SMatt Jacob #define	SYS_DELAY(x)	DELAY(x)
34557c801f5SMatt Jacob 
34657c801f5SMatt Jacob #define	FC_FW_READY_DELAY	(5 * 1000000)
347b460c5c9SMatt Jacob #define	DEFAULT_LOOPID(x)	109
3486db20c31SMatt Jacob #define	DEFAULT_WWN(x)		(x)->isp_osinfo.default_wwn
34957c801f5SMatt Jacob 
35067b6f02bSMatt Jacob #define	INLINE	__inline
35167b6f02bSMatt Jacob #include <dev/isp/isp_inline.h>
3526054c3f6SMatt Jacob #endif	/* _ISP_FREEBSD_H */
353