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