16054c3f6SMatt Jacob /* $FreeBSD$ */ 26054c3f6SMatt Jacob /* 36054c3f6SMatt Jacob * Qlogic ISP SCSI Host Adapter FreeBSD Wrapper Definitions (non CAM version) 46054c3f6SMatt Jacob *--------------------------------------- 56054c3f6SMatt Jacob * Copyright (c) 1997, 1998 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 37478f8a96SJustin T. Gibbs #define ISP_PLATFORM_VERSION_MAJOR 0 383dd37e43SMatt Jacob #define ISP_PLATFORM_VERSION_MINOR 97 39478f8a96SJustin T. Gibbs 403dd37e43SMatt Jacob #include <sys/param.h> 413dd37e43SMatt Jacob 423dd37e43SMatt Jacob #ifndef __FreeBSD_version 433dd37e43SMatt Jacob #define __FreeBSD_version 226000 443dd37e43SMatt Jacob #endif 453dd37e43SMatt Jacob 463dd37e43SMatt Jacob #if __FreeBSD_version >= 300004 47478f8a96SJustin T. Gibbs #include <dev/isp/isp_freebsd_cam.h> 48478f8a96SJustin T. Gibbs #else 49478f8a96SJustin T. Gibbs 506054c3f6SMatt Jacob #include <sys/systm.h> 516054c3f6SMatt Jacob #include <sys/malloc.h> 526054c3f6SMatt Jacob #include <sys/buf.h> 536054c3f6SMatt Jacob #include <sys/proc.h> 546054c3f6SMatt Jacob 556054c3f6SMatt Jacob #include <scsi/scsiconf.h> 566054c3f6SMatt Jacob #include <machine/clock.h> 576054c3f6SMatt Jacob #include <vm/vm.h> 586054c3f6SMatt Jacob #include <vm/vm_param.h> 596054c3f6SMatt Jacob #include <vm/pmap.h> 606054c3f6SMatt Jacob #include <sys/kernel.h> 616054c3f6SMatt Jacob 626054c3f6SMatt Jacob #define ISP_SCSI_XFER_T struct scsi_xfer 636054c3f6SMatt Jacob struct isposinfo { 646054c3f6SMatt Jacob char name[8]; 656054c3f6SMatt Jacob int unit; 666054c3f6SMatt Jacob struct scsi_link _link; 676054c3f6SMatt Jacob #if __FreeBSD_version >= 300001 686054c3f6SMatt Jacob struct callout_handle watchid; 696054c3f6SMatt Jacob #endif 706054c3f6SMatt Jacob }; 71478f8a96SJustin T. Gibbs 726054c3f6SMatt Jacob #define MAXISPREQUEST 64 736054c3f6SMatt Jacob 746054c3f6SMatt Jacob #include <dev/isp/ispreg.h> 756054c3f6SMatt Jacob #include <dev/isp/ispvar.h> 766054c3f6SMatt Jacob #include <dev/isp/ispmbox.h> 776054c3f6SMatt Jacob 786054c3f6SMatt Jacob #define PRINTF printf 796054c3f6SMatt Jacob #define IDPRINTF(lev, x) if (isp->isp_dblev >= lev) printf x 806054c3f6SMatt Jacob #define DFLT_DBLEVEL 1 816054c3f6SMatt Jacob 826054c3f6SMatt Jacob #define ISP_LOCKVAL_DECL int isp_spl_save 83478f8a96SJustin T. Gibbs #define ISP_UNLOCK(isp) (void) splx(isp_spl_save) 84478f8a96SJustin T. Gibbs #define ISP_LOCK(isp) isp_spl_save = splbio() 85478f8a96SJustin T. Gibbs #define ISP_ILOCK(isp) ISP_LOCK(isp) 86478f8a96SJustin T. Gibbs #define ISP_IUNLOCK(isp) ISP_UNLOCK(isp) 876054c3f6SMatt Jacob #define IMASK bio_imask 886054c3f6SMatt Jacob 896054c3f6SMatt Jacob #define XS_NULL(xs) xs == NULL || xs->sc_link == NULL 90478f8a96SJustin T. Gibbs #define XS_ISP(xs) \ 91478f8a96SJustin T. Gibbs ((struct ispsoftc *) (xs)->sc_link->adapter_softc) 926054c3f6SMatt Jacob #define XS_LUN(xs) (xs)->sc_link->lun 936054c3f6SMatt Jacob #define XS_TGT(xs) (xs)->sc_link->target 946054c3f6SMatt Jacob #define XS_RESID(xs) (xs)->resid 956054c3f6SMatt Jacob #define XS_XFRLEN(xs) (xs)->datalen 966054c3f6SMatt Jacob #define XS_CDBLEN(xs) (xs)->cmdlen 976054c3f6SMatt Jacob #define XS_CDBP(xs) (xs)->cmd 986054c3f6SMatt Jacob #define XS_STS(xs) (xs)->status 996054c3f6SMatt Jacob #define XS_TIME(xs) (xs)->timeout 1006054c3f6SMatt Jacob #define XS_SNSP(xs) (&(xs)->sense) 1016054c3f6SMatt Jacob #define XS_SNSLEN(xs) (sizeof (xs)->sense) 1026054c3f6SMatt Jacob #define XS_SNSKEY(xs) ((xs)->sense.ext.extended.flags) 1036054c3f6SMatt Jacob 1046054c3f6SMatt Jacob #define HBA_NOERROR XS_NOERROR 1056054c3f6SMatt Jacob #define HBA_BOTCH XS_DRIVER_STUFFUP 1066054c3f6SMatt Jacob #define HBA_CMDTIMEOUT XS_TIMEOUT 1076054c3f6SMatt Jacob #define HBA_SELTIMEOUT XS_SELTIMEOUT 1086054c3f6SMatt Jacob #define HBA_TGTBSY XS_BUSY 1096054c3f6SMatt Jacob #define HBA_BUSRESET XS_DRIVER_STUFFUP 1106054c3f6SMatt Jacob #define HBA_ABORTED XS_DRIVER_STUFFUP 111478f8a96SJustin T. Gibbs #define HBA_DATAOVR XS_DRIVER_STUFFUP 112478f8a96SJustin T. Gibbs #define HBA_ARQFAIL XS_DRIVER_STUFFUP 1136054c3f6SMatt Jacob 1146054c3f6SMatt Jacob #define XS_SNS_IS_VALID(xs) (xs)->error = XS_SENSE 1156054c3f6SMatt Jacob #define XS_IS_SNS_VALID(xs) ((xs)->error == XS_SENSE) 1166054c3f6SMatt Jacob 1176054c3f6SMatt Jacob #define XS_INITERR(xs) (xs)->error = 0 1186054c3f6SMatt Jacob #define XS_SETERR(xs, v) (xs)->error = v 1196054c3f6SMatt Jacob #define XS_ERR(xs) (xs)->error 1206054c3f6SMatt Jacob #define XS_NOERR(xs) (xs)->error == XS_NOERROR 1216054c3f6SMatt Jacob 1226054c3f6SMatt Jacob #define XS_CMD_DONE(xs) (xs)->flags |= ITSDONE, scsi_done(xs) 1236054c3f6SMatt Jacob #define XS_IS_CMD_DONE(xs) (((xs)->flags & ITSDONE) != 0) 1246054c3f6SMatt Jacob 125478f8a96SJustin T. Gibbs /* 126478f8a96SJustin T. Gibbs * We decide whether to use tags based upon whether we're polling. 127478f8a96SJustin T. Gibbs */ 128478f8a96SJustin T. Gibbs #define XS_CANTAG(xs) (((xs)->flags & SCSI_NOMASK) != 0) 129478f8a96SJustin T. Gibbs 130478f8a96SJustin T. Gibbs /* 131478f8a96SJustin T. Gibbs * Our default tag 132478f8a96SJustin T. Gibbs */ 133478f8a96SJustin T. Gibbs #define XS_KINDOF_TAG(xs) REQFLAG_OTAG 134478f8a96SJustin T. Gibbs 1356054c3f6SMatt Jacob 1366054c3f6SMatt Jacob #define CMD_COMPLETE COMPLETE 1376054c3f6SMatt Jacob #define CMD_EAGAIN TRY_AGAIN_LATER 1386054c3f6SMatt Jacob #define CMD_QUEUED SUCCESSFULLY_QUEUED 1396054c3f6SMatt Jacob 1406054c3f6SMatt Jacob 1416054c3f6SMatt Jacob 1426054c3f6SMatt Jacob #define isp_name isp_osinfo.name 1436054c3f6SMatt Jacob 1446054c3f6SMatt Jacob 1456054c3f6SMatt Jacob #define SYS_DELAY(x) DELAY(x) 1466054c3f6SMatt Jacob 1476054c3f6SMatt Jacob #define WATCH_INTERVAL 30 1486054c3f6SMatt Jacob #if __FreeBSD_version >= 300001 1496054c3f6SMatt Jacob #define START_WATCHDOG(f, s) \ 1506054c3f6SMatt Jacob (s)->isp_osinfo.watchid = timeout(f, s, WATCH_INTERVAL * hz), \ 1516054c3f6SMatt Jacob s->isp_dogactive = 1 1526054c3f6SMatt Jacob #define STOP_WATCHDOG(f, s) untimeout(f, s, (s)->isp_osinfo.watchid),\ 1536054c3f6SMatt Jacob (s)->isp_dogactive = 0 1546054c3f6SMatt Jacob #else 1556054c3f6SMatt Jacob #define START_WATCHDOG(f, s) \ 1566054c3f6SMatt Jacob timeout(f, s, WATCH_INTERVAL * hz), s->isp_dogactive = 1 1576054c3f6SMatt Jacob #define STOP_WATCHDOG(f, s) untimeout(f, s), (s)->isp_dogactive = 0 1586054c3f6SMatt Jacob #endif 1596054c3f6SMatt Jacob 1606054c3f6SMatt Jacob #define RESTART_WATCHDOG(f, s) START_WATCHDOG(f, s) 1616054c3f6SMatt Jacob extern void isp_attach __P((struct ispsoftc *)); 1626054c3f6SMatt Jacob 163478f8a96SJustin T. Gibbs #define PVS "Qlogic ISP Driver, FreeBSD Non-Cam" 164478f8a96SJustin T. Gibbs 1653dd37e43SMatt Jacob #endif /* __FreeBSD_version >= 300004 */ 1666054c3f6SMatt Jacob #endif /* _ISP_FREEBSD_H */ 167