xref: /freebsd/sys/dev/isp/isp_freebsd.h (revision 57c801f5cf434576c9cf37c2a734303739258260)
157c801f5SMatt Jacob /* $Id: isp_freebsd.h,v 1.11 1999/02/09 01:05:42 mjacob Exp $ */
257c801f5SMatt Jacob /* release_03_16_99 */
36054c3f6SMatt Jacob /*
46054c3f6SMatt Jacob  * Qlogic ISP SCSI Host Adapter FreeBSD Wrapper Definitions (non CAM version)
56054c3f6SMatt Jacob  *---------------------------------------
66054c3f6SMatt Jacob  * Copyright (c) 1997, 1998 by Matthew Jacob
76054c3f6SMatt Jacob  * NASA/Ames Research Center
86054c3f6SMatt Jacob  * All rights reserved.
96054c3f6SMatt Jacob  *---------------------------------------
106054c3f6SMatt Jacob  *
116054c3f6SMatt Jacob  * Redistribution and use in source and binary forms, with or without
126054c3f6SMatt Jacob  * modification, are permitted provided that the following conditions
136054c3f6SMatt Jacob  * are met:
146054c3f6SMatt Jacob  * 1. Redistributions of source code must retain the above copyright
156054c3f6SMatt Jacob  *    notice immediately at the beginning of the file, without modification,
166054c3f6SMatt Jacob  *    this list of conditions, and the following disclaimer.
176054c3f6SMatt Jacob  * 2. Redistributions in binary form must reproduce the above copyright
186054c3f6SMatt Jacob  *    notice, this list of conditions and the following disclaimer in the
196054c3f6SMatt Jacob  *    documentation and/or other materials provided with the distribution.
206054c3f6SMatt Jacob  * 3. The name of the author may not be used to endorse or promote products
216054c3f6SMatt Jacob  *    derived from this software without specific prior written permission.
226054c3f6SMatt Jacob  *
236054c3f6SMatt Jacob  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
246054c3f6SMatt Jacob  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
256054c3f6SMatt Jacob  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
266054c3f6SMatt Jacob  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
276054c3f6SMatt Jacob  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
286054c3f6SMatt Jacob  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
296054c3f6SMatt Jacob  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
306054c3f6SMatt Jacob  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
316054c3f6SMatt Jacob  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
326054c3f6SMatt Jacob  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
336054c3f6SMatt Jacob  * SUCH DAMAGE.
346054c3f6SMatt Jacob  */
356054c3f6SMatt Jacob #ifndef	_ISP_FREEBSD_H
366054c3f6SMatt Jacob #define	_ISP_FREEBSD_H
376054c3f6SMatt Jacob 
38478f8a96SJustin T. Gibbs #define	ISP_PLATFORM_VERSION_MAJOR	0
39c3055363SMatt Jacob #define	ISP_PLATFORM_VERSION_MINOR	98
40478f8a96SJustin T. Gibbs 
413dd37e43SMatt Jacob #include <sys/param.h>
423dd37e43SMatt Jacob 
433dd37e43SMatt Jacob #ifndef	__FreeBSD_version
443dd37e43SMatt Jacob #define	__FreeBSD_version	226000
453dd37e43SMatt Jacob #endif
463dd37e43SMatt Jacob 
473dd37e43SMatt Jacob #if	__FreeBSD_version >= 300004
4857c801f5SMatt Jacob #define	MAXISPREQUEST	256
49478f8a96SJustin T. Gibbs #include <dev/isp/isp_freebsd_cam.h>
50478f8a96SJustin T. Gibbs #else
5157c801f5SMatt Jacob #define	MAXISPREQUEST	64
52478f8a96SJustin T. Gibbs 
536054c3f6SMatt Jacob #include <sys/systm.h>
546054c3f6SMatt Jacob #include <sys/malloc.h>
556054c3f6SMatt Jacob #include <sys/buf.h>
566054c3f6SMatt Jacob #include <sys/proc.h>
576054c3f6SMatt Jacob 
586054c3f6SMatt Jacob #include <scsi/scsiconf.h>
596054c3f6SMatt Jacob #include <machine/clock.h>
606054c3f6SMatt Jacob #include <vm/vm.h>
616054c3f6SMatt Jacob #include <vm/vm_param.h>
626054c3f6SMatt Jacob #include <vm/pmap.h>
636054c3f6SMatt Jacob #include <sys/kernel.h>
646054c3f6SMatt Jacob 
6557c801f5SMatt Jacob 
6657c801f5SMatt Jacob #include <dev/isp/ispreg.h>
6757c801f5SMatt Jacob #include <dev/isp/ispvar.h>
6857c801f5SMatt Jacob #include <dev/isp/ispmbox.h>
6957c801f5SMatt Jacob 
706054c3f6SMatt Jacob #define	ISP_SCSI_XFER_T		struct scsi_xfer
716054c3f6SMatt Jacob struct isposinfo {
726054c3f6SMatt Jacob 	char			name[8];
736054c3f6SMatt Jacob 	int			unit;
746054c3f6SMatt Jacob 	struct scsi_link	_link;
756054c3f6SMatt Jacob #if	__FreeBSD_version >=	300001
766054c3f6SMatt Jacob 	struct callout_handle	watchid;
776054c3f6SMatt Jacob #endif
786054c3f6SMatt Jacob };
79478f8a96SJustin T. Gibbs 
8057c801f5SMatt Jacob #define	PVS			"Qlogic ISP Driver, FreeBSD Non-Cam"
816054c3f6SMatt Jacob #define	DFLT_DBLEVEL		1
826054c3f6SMatt Jacob #define	ISP_LOCKVAL_DECL	int isp_spl_save
83c3055363SMatt Jacob #define	ISP_ILOCKVAL_DECL	ISP_LOCKVAL_DECL
84478f8a96SJustin T. Gibbs #define	ISP_UNLOCK(isp)		(void) splx(isp_spl_save)
85478f8a96SJustin T. Gibbs #define	ISP_LOCK(isp)		isp_spl_save = splbio()
86478f8a96SJustin T. Gibbs #define	ISP_ILOCK(isp)		ISP_LOCK(isp)
87478f8a96SJustin T. Gibbs #define	ISP_IUNLOCK(isp)	ISP_UNLOCK(isp)
886054c3f6SMatt Jacob #define	IMASK			bio_imask
896054c3f6SMatt Jacob 
906054c3f6SMatt Jacob #define	XS_NULL(xs)		xs == NULL || xs->sc_link == NULL
91478f8a96SJustin T. Gibbs #define	XS_ISP(xs)		\
92478f8a96SJustin T. Gibbs 	((struct ispsoftc *) (xs)->sc_link->adapter_softc)
936054c3f6SMatt Jacob #define	XS_LUN(xs)		(xs)->sc_link->lun
946054c3f6SMatt Jacob #define	XS_TGT(xs)		(xs)->sc_link->target
956054c3f6SMatt Jacob #define	XS_RESID(xs)		(xs)->resid
966054c3f6SMatt Jacob #define	XS_XFRLEN(xs)		(xs)->datalen
976054c3f6SMatt Jacob #define	XS_CDBLEN(xs)		(xs)->cmdlen
986054c3f6SMatt Jacob #define	XS_CDBP(xs)		(xs)->cmd
996054c3f6SMatt Jacob #define	XS_STS(xs)		(xs)->status
1006054c3f6SMatt Jacob #define	XS_TIME(xs)		(xs)->timeout
1016054c3f6SMatt Jacob #define	XS_SNSP(xs)		(&(xs)->sense)
102e9c26528SMatt Jacob #define	XS_SNSLEN(xs)		(sizeof((xs)->sense))
1036054c3f6SMatt Jacob #define	XS_SNSKEY(xs)		((xs)->sense.ext.extended.flags)
1046054c3f6SMatt Jacob 
1056054c3f6SMatt Jacob #define	HBA_NOERROR		XS_NOERROR
1066054c3f6SMatt Jacob #define	HBA_BOTCH		XS_DRIVER_STUFFUP
1076054c3f6SMatt Jacob #define	HBA_CMDTIMEOUT		XS_TIMEOUT
1086054c3f6SMatt Jacob #define	HBA_SELTIMEOUT		XS_SELTIMEOUT
1096054c3f6SMatt Jacob #define	HBA_TGTBSY		XS_BUSY
1106054c3f6SMatt Jacob #define	HBA_BUSRESET		XS_DRIVER_STUFFUP
1116054c3f6SMatt Jacob #define	HBA_ABORTED		XS_DRIVER_STUFFUP
112478f8a96SJustin T. Gibbs #define	HBA_DATAOVR		XS_DRIVER_STUFFUP
113478f8a96SJustin T. Gibbs #define	HBA_ARQFAIL		XS_DRIVER_STUFFUP
1146054c3f6SMatt Jacob 
1156054c3f6SMatt Jacob #define	XS_SNS_IS_VALID(xs)	(xs)->error = XS_SENSE
1166054c3f6SMatt Jacob #define	XS_IS_SNS_VALID(xs)	((xs)->error == XS_SENSE)
1176054c3f6SMatt Jacob 
1186054c3f6SMatt Jacob #define	XS_INITERR(xs)		(xs)->error = 0
1196054c3f6SMatt Jacob #define	XS_SETERR(xs, v)	(xs)->error = v
1206054c3f6SMatt Jacob #define	XS_ERR(xs)		(xs)->error
1216054c3f6SMatt Jacob #define	XS_NOERR(xs)		(xs)->error == XS_NOERROR
1226054c3f6SMatt Jacob 
1236054c3f6SMatt Jacob #define	XS_CMD_DONE(xs)		(xs)->flags |= ITSDONE, scsi_done(xs)
1246054c3f6SMatt Jacob #define	XS_IS_CMD_DONE(xs)	(((xs)->flags & ITSDONE) != 0)
1256054c3f6SMatt Jacob 
126478f8a96SJustin T. Gibbs /*
127478f8a96SJustin T. Gibbs  * We decide whether to use tags based upon whether we're polling.
128478f8a96SJustin T. Gibbs  */
129478f8a96SJustin T. Gibbs #define	XS_CANTAG(xs)		(((xs)->flags & SCSI_NOMASK) != 0)
130478f8a96SJustin T. Gibbs 
131478f8a96SJustin T. Gibbs /*
132478f8a96SJustin T. Gibbs  * Our default tag
133478f8a96SJustin T. Gibbs  */
134c3055363SMatt Jacob #define	XS_KINDOF_TAG(xs)	REQFLAG_STAG
135478f8a96SJustin T. Gibbs 
1366054c3f6SMatt Jacob 
1376054c3f6SMatt Jacob #define	CMD_COMPLETE		COMPLETE
1386054c3f6SMatt Jacob #define	CMD_EAGAIN		TRY_AGAIN_LATER
1396054c3f6SMatt Jacob #define	CMD_QUEUED		SUCCESSFULLY_QUEUED
1406054c3f6SMatt Jacob 
1416054c3f6SMatt Jacob #define	isp_name	isp_osinfo.name
1426054c3f6SMatt Jacob 
1436054c3f6SMatt Jacob 
1446054c3f6SMatt Jacob #define	WATCH_INTERVAL		30
1456054c3f6SMatt Jacob #if	__FreeBSD_version >=	300001
1466054c3f6SMatt Jacob #define	START_WATCHDOG(f, s)	\
1476054c3f6SMatt Jacob 	(s)->isp_osinfo.watchid = timeout(f, s, WATCH_INTERVAL * hz), \
1486054c3f6SMatt Jacob 	s->isp_dogactive = 1
1496054c3f6SMatt Jacob #define	STOP_WATCHDOG(f, s)	untimeout(f, s, (s)->isp_osinfo.watchid),\
1506054c3f6SMatt Jacob 	(s)->isp_dogactive = 0
1516054c3f6SMatt Jacob #else
1526054c3f6SMatt Jacob #define	START_WATCHDOG(f, s)	\
1536054c3f6SMatt Jacob 	timeout(f, s, WATCH_INTERVAL * hz), s->isp_dogactive = 1
1546054c3f6SMatt Jacob #define	STOP_WATCHDOG(f, s)	untimeout(f, s), (s)->isp_dogactive = 0
1556054c3f6SMatt Jacob #endif
1566054c3f6SMatt Jacob 
1576054c3f6SMatt Jacob #define	RESTART_WATCHDOG(f, s)	START_WATCHDOG(f, s)
1586054c3f6SMatt Jacob 
159478f8a96SJustin T. Gibbs 
1603dd37e43SMatt Jacob #endif	/* __FreeBSD_version >= 300004 */
16157c801f5SMatt Jacob 
16257c801f5SMatt Jacob extern void isp_attach(struct ispsoftc *);
16357c801f5SMatt Jacob extern void isp_uninit(struct ispsoftc *);
16457c801f5SMatt Jacob 
16557c801f5SMatt Jacob #define	MEMZERO			bzero
16657c801f5SMatt Jacob #define	MEMCPY(dst, src, amt)	bcopy((src), (dst), (amt))
16757c801f5SMatt Jacob #ifdef	__alpha__
16857c801f5SMatt Jacob #define	MemoryBarrier	alpha_mb
16957c801f5SMatt Jacob #else
17057c801f5SMatt Jacob #define	MemoryBarrier()
17157c801f5SMatt Jacob #endif
17257c801f5SMatt Jacob 
17357c801f5SMatt Jacob 
17457c801f5SMatt Jacob #define	IDPRINTF(lev, x)	if (isp->isp_dblev >= lev) printf x
17557c801f5SMatt Jacob #define	PRINTF			printf
17657c801f5SMatt Jacob 
17757c801f5SMatt Jacob #define	SYS_DELAY(x)	DELAY(x)
17857c801f5SMatt Jacob 
17957c801f5SMatt Jacob #define	FC_FW_READY_DELAY	(5 * 1000000)
18057c801f5SMatt Jacob 
18157c801f5SMatt Jacob static __inline void isp_prtstst(ispstatusreq_t *sp);
18257c801f5SMatt Jacob static __inline const char *isp2100_fw_statename(int state);
18357c801f5SMatt Jacob static __inline const char *isp2100_pdb_statename(int pdb_state);
18457c801f5SMatt Jacob 
18557c801f5SMatt Jacob static __inline void isp_prtstst(ispstatusreq_t *sp)
18657c801f5SMatt Jacob {
18757c801f5SMatt Jacob 	char buf[128];
18857c801f5SMatt Jacob 	sprintf(buf, "states->");
18957c801f5SMatt Jacob 	if (sp->req_state_flags & RQSF_GOT_BUS)
19057c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "GOT_BUS ");
19157c801f5SMatt Jacob 	if (sp->req_state_flags & RQSF_GOT_TARGET)
19257c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "GOT_TGT ");
19357c801f5SMatt Jacob 	if (sp->req_state_flags & RQSF_SENT_CDB)
19457c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "SENT_CDB ");
19557c801f5SMatt Jacob 	if (sp->req_state_flags & RQSF_XFRD_DATA)
19657c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "XFRD_DATA ");
19757c801f5SMatt Jacob 	if (sp->req_state_flags & RQSF_GOT_STATUS)
19857c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "GOT_STS ");
19957c801f5SMatt Jacob 	if (sp->req_state_flags & RQSF_GOT_SENSE)
20057c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "GOT_SNS ");
20157c801f5SMatt Jacob 	if (sp->req_state_flags & RQSF_XFER_COMPLETE)
20257c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "XFR_CMPLT ");
20357c801f5SMatt Jacob 	sprintf(buf, "%s%s", buf, "\n");
20457c801f5SMatt Jacob 	sprintf(buf, "%s%s", buf, "status->");
20557c801f5SMatt Jacob 	if (sp->req_status_flags & RQSTF_DISCONNECT)
20657c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "Disconnect ");
20757c801f5SMatt Jacob 	if (sp->req_status_flags & RQSTF_SYNCHRONOUS)
20857c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "Sync_xfr ");
20957c801f5SMatt Jacob 	if (sp->req_status_flags & RQSTF_PARITY_ERROR)
21057c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "Parity ");
21157c801f5SMatt Jacob 	if (sp->req_status_flags & RQSTF_BUS_RESET)
21257c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "Bus_Reset ");
21357c801f5SMatt Jacob 	if (sp->req_status_flags & RQSTF_DEVICE_RESET)
21457c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "Device_Reset ");
21557c801f5SMatt Jacob 	if (sp->req_status_flags & RQSTF_ABORTED)
21657c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "Aborted ");
21757c801f5SMatt Jacob 	if (sp->req_status_flags & RQSTF_TIMEOUT)
21857c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "Timeout ");
21957c801f5SMatt Jacob 	if (sp->req_status_flags & RQSTF_NEGOTIATION)
22057c801f5SMatt Jacob 		sprintf(buf, "%s%s", buf, "Negotiation ");
22157c801f5SMatt Jacob 	sprintf(buf, "%s%s", buf, "\n");
22257c801f5SMatt Jacob }
22357c801f5SMatt Jacob 
22457c801f5SMatt Jacob static __inline const char *isp2100_fw_statename(int state)
22557c801f5SMatt Jacob {
22657c801f5SMatt Jacob 	static char buf[16];
22757c801f5SMatt Jacob 	switch(state) {
22857c801f5SMatt Jacob 	case FW_CONFIG_WAIT:	return "Config Wait";
22957c801f5SMatt Jacob 	case FW_WAIT_AL_PA:	return "Waiting for AL_PA";
23057c801f5SMatt Jacob 	case FW_WAIT_LOGIN:	return "Wait Login";
23157c801f5SMatt Jacob 	case FW_READY:		return "Ready";
23257c801f5SMatt Jacob 	case FW_LOSS_OF_SYNC:	return "Loss Of Sync";
23357c801f5SMatt Jacob 	case FW_ERROR:		return "Error";
23457c801f5SMatt Jacob 	case FW_REINIT:		return "Re-Init";
23557c801f5SMatt Jacob 	case FW_NON_PART:	return "Nonparticipating";
23657c801f5SMatt Jacob 	default:
23757c801f5SMatt Jacob 		sprintf(buf, "?0x%x?", state);
23857c801f5SMatt Jacob 		return buf;
23957c801f5SMatt Jacob 	}
24057c801f5SMatt Jacob }
24157c801f5SMatt Jacob 
24257c801f5SMatt Jacob static __inline const char *isp2100_pdb_statename(int pdb_state)
24357c801f5SMatt Jacob {
24457c801f5SMatt Jacob 	static char buf[16];
24557c801f5SMatt Jacob 	switch(pdb_state) {
24657c801f5SMatt Jacob 	case PDB_STATE_DISCOVERY:	return "Port Discovery";
24757c801f5SMatt Jacob 	case PDB_STATE_WDISC_ACK:	return "Waiting Port Discovery ACK";
24857c801f5SMatt Jacob 	case PDB_STATE_PLOGI:		return "Port Login";
24957c801f5SMatt Jacob 	case PDB_STATE_PLOGI_ACK:	return "Wait Port Login ACK";
25057c801f5SMatt Jacob 	case PDB_STATE_PRLI:		return "Process Login";
25157c801f5SMatt Jacob 	case PDB_STATE_PRLI_ACK:	return "Wait Process Login ACK";
25257c801f5SMatt Jacob 	case PDB_STATE_LOGGED_IN:	return "Logged In";
25357c801f5SMatt Jacob 	case PDB_STATE_PORT_UNAVAIL:	return "Port Unavailable";
25457c801f5SMatt Jacob 	case PDB_STATE_PRLO:		return "Process Logout";
25557c801f5SMatt Jacob 	case PDB_STATE_PRLO_ACK:	return "Wait Process Logout ACK";
25657c801f5SMatt Jacob 	case PDB_STATE_PLOGO:		return "Port Logout";
25757c801f5SMatt Jacob 	case PDB_STATE_PLOG_ACK:	return "Wait Port Logout ACK";
25857c801f5SMatt Jacob 	default:
25957c801f5SMatt Jacob 		sprintf(buf, "?0x%x?", pdb_state);
26057c801f5SMatt Jacob 		return buf;
26157c801f5SMatt Jacob 	}
26257c801f5SMatt Jacob }
26357c801f5SMatt Jacob 
26457c801f5SMatt Jacob /*
26557c801f5SMatt Jacob  * Disable these for now
26657c801f5SMatt Jacob  */
26757c801f5SMatt Jacob 
26857c801f5SMatt Jacob #define	ISP_NO_FASTPOST_SCSI		1
26957c801f5SMatt Jacob #define	ISP_NO_FASTPOST_FC		1
27057c801f5SMatt Jacob #define	ISP_DISABLE_1080_SUPPORT	1
27157c801f5SMatt Jacob 
2726054c3f6SMatt Jacob #endif	/* _ISP_FREEBSD_H */
273