isp_freebsd.h revision 48602
148602Smjacob/* $Id: isp_freebsd.h,v 1.16 1999/07/02 23:10:34 mjacob Exp $ */ 248602Smjacob/* release_6_5_99 */ 335388Smjacob/* 448487Smjacob * Qlogic ISP SCSI Host Adapter FreeBSD Wrapper Definitions (CAM version) 535388Smjacob *--------------------------------------- 648487Smjacob * Copyright (c) 1997, 1998, 1999 by Matthew Jacob 735388Smjacob * NASA/Ames Research Center 835388Smjacob * All rights reserved. 935388Smjacob *--------------------------------------- 1035388Smjacob * 1135388Smjacob * Redistribution and use in source and binary forms, with or without 1235388Smjacob * modification, are permitted provided that the following conditions 1335388Smjacob * are met: 1435388Smjacob * 1. Redistributions of source code must retain the above copyright 1535388Smjacob * notice immediately at the beginning of the file, without modification, 1635388Smjacob * this list of conditions, and the following disclaimer. 1735388Smjacob * 2. Redistributions in binary form must reproduce the above copyright 1835388Smjacob * notice, this list of conditions and the following disclaimer in the 1935388Smjacob * documentation and/or other materials provided with the distribution. 2035388Smjacob * 3. The name of the author may not be used to endorse or promote products 2135388Smjacob * derived from this software without specific prior written permission. 2235388Smjacob * 2335388Smjacob * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 2435388Smjacob * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2535388Smjacob * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2635388Smjacob * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 2735388Smjacob * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2835388Smjacob * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2935388Smjacob * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3035388Smjacob * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3135388Smjacob * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3235388Smjacob * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3335388Smjacob * SUCH DAMAGE. 3435388Smjacob */ 3535388Smjacob#ifndef _ISP_FREEBSD_H 3635388Smjacob#define _ISP_FREEBSD_H 3735388Smjacob 3839235Sgibbs#define ISP_PLATFORM_VERSION_MAJOR 0 3948487Smjacob#define ISP_PLATFORM_VERSION_MINOR 992 4039235Sgibbs 4148487Smjacob 4239445Smjacob#include <sys/param.h> 4348487Smjacob#include <sys/param.h> 4448487Smjacob#include <sys/systm.h> 4548487Smjacob#include <sys/kernel.h> 4648487Smjacob#include <sys/queue.h> 4739445Smjacob 4848487Smjacob#include <machine/bus_memio.h> 4948487Smjacob#include <machine/bus_pio.h> 5048487Smjacob#include <machine/bus.h> 5148487Smjacob#include <machine/clock.h> 5239445Smjacob 5348487Smjacob#include <cam/cam.h> 5448487Smjacob#include <cam/cam_debug.h> 5548487Smjacob#include <cam/cam_ccb.h> 5648487Smjacob#include <cam/cam_sim.h> 5748487Smjacob#include <cam/cam_xpt.h> 5848487Smjacob#include <cam/cam_xpt_sim.h> 5948487Smjacob#include <cam/cam_debug.h> 6048487Smjacob#include <cam/scsi/scsi_all.h> 6148487Smjacob#include <cam/scsi/scsi_message.h> 6248487Smjacob 6348487Smjacob#include "opt_isp.h" 6448487Smjacob#ifdef SCSI_ISP_FABRIC 6548487Smjacob#define ISP2100_FABRIC 1 6648487Smjacob#define ISP2100_SCRLEN 0x400 6739235Sgibbs#else 6848602Smjacob#define ISP2100_SCRLEN 0x100 6945284Smjacob#endif 7048487Smjacob#ifdef SCSI_ISP_SCCLUN 7148487Smjacob#define ISP2100_SCCLUN 1 7248487Smjacob#endif 7339235Sgibbs 7448487Smjacob#ifndef SCSI_CHECK 7548487Smjacob#define SCSI_CHECK SCSI_STATUS_CHECK_COND 7648487Smjacob#endif 7748487Smjacob#ifndef SCSI_BUSY 7848487Smjacob#define SCSI_BUSY SCSI_STATUS_BUSY 7948487Smjacob#endif 8048487Smjacob#ifndef SCSI_QFULL 8148487Smjacob#define SCSI_QFULL SCSI_STATUS_QUEUE_FULL 8248487Smjacob#endif 8335388Smjacob 8448487Smjacob#define ISP_SCSI_XFER_T struct ccb_scsiio 8535388Smjacobstruct isposinfo { 8635388Smjacob char name[8]; 8735388Smjacob int unit; 8848487Smjacob int seed; 8948487Smjacob struct cam_sim *sim; 9048487Smjacob struct cam_path *path; 9148487Smjacob struct cam_sim *sim2; 9248487Smjacob struct cam_path *path2; 9348487Smjacob volatile char simqfrozen; 9435388Smjacob}; 9548487Smjacob#define SIMQFRZ_RESOURCE 0x1 9648487Smjacob#define SIMQFRZ_LOOPDOWN 0x2 9739235Sgibbs 9848487Smjacob#define isp_sim isp_osinfo.sim 9948487Smjacob#define isp_path isp_osinfo.path 10048487Smjacob#define isp_sim2 isp_osinfo.sim2 10148487Smjacob#define isp_path2 isp_osinfo.path2 10248487Smjacob#define isp_unit isp_osinfo.unit 10348487Smjacob#define isp_name isp_osinfo.name 10448487Smjacob 10548487Smjacob#define MAXISPREQUEST 256 10648487Smjacob 10745284Smjacob#include <dev/isp/ispreg.h> 10845284Smjacob#include <dev/isp/ispvar.h> 10945284Smjacob#include <dev/isp/ispmbox.h> 11045284Smjacob 11148487Smjacob#define PVS "Qlogic ISP Driver, FreeBSD CAM" 11248487Smjacob#ifdef CAMDEBUG 11348487Smjacob#define DFLT_DBLEVEL 2 11448487Smjacob#else 11535388Smjacob#define DFLT_DBLEVEL 1 11648487Smjacob#endif 11735388Smjacob#define ISP_LOCKVAL_DECL int isp_spl_save 11842131Smjacob#define ISP_ILOCKVAL_DECL ISP_LOCKVAL_DECL 11939235Sgibbs#define ISP_UNLOCK(isp) (void) splx(isp_spl_save) 12048487Smjacob#define ISP_LOCK(isp) isp_spl_save = splcam() 12139235Sgibbs#define ISP_ILOCK(isp) ISP_LOCK(isp) 12239235Sgibbs#define ISP_IUNLOCK(isp) ISP_UNLOCK(isp) 12348487Smjacob#define IMASK cam_imask 12435388Smjacob 12548487Smjacob#define XS_NULL(ccb) ccb == NULL 12648487Smjacob#define XS_ISP(ccb) ((struct ispsoftc *) (ccb)->ccb_h.spriv_ptr1) 12735388Smjacob 12848487Smjacob#define XS_LUN(ccb) (ccb)->ccb_h.target_lun 12948487Smjacob#define XS_TGT(ccb) (ccb)->ccb_h.target_id 13048487Smjacob#define XS_CHANNEL(ccb) cam_sim_bus(xpt_path_sim((ccb)->ccb_h.path)) 13148487Smjacob#define XS_RESID(ccb) (ccb)->resid 13248487Smjacob#define XS_XFRLEN(ccb) (ccb)->dxfer_len 13348487Smjacob#define XS_CDBLEN(ccb) (ccb)->cdb_len 13448487Smjacob#define XS_CDBP(ccb) (((ccb)->ccb_h.flags & CAM_CDB_POINTER)? \ 13548487Smjacob (ccb)->cdb_io.cdb_ptr : (ccb)->cdb_io.cdb_bytes) 13648487Smjacob#define XS_STS(ccb) (ccb)->scsi_status 13748487Smjacob#define XS_TIME(ccb) (ccb)->ccb_h.timeout 13848487Smjacob#define XS_SNSP(ccb) (&(ccb)->sense_data) 13948487Smjacob#define XS_SNSLEN(ccb) imin((sizeof((ccb)->sense_data)), ccb->sense_len) 14048487Smjacob#define XS_SNSKEY(ccb) ((ccb)->sense_data.flags & 0xf) 14135388Smjacob 14248487Smjacob/* 14348487Smjacob * A little tricky- HBA_NOERROR is "in progress" so 14448487Smjacob * that XS_CMD_DONE can transition this to CAM_REQ_CMP. 14548487Smjacob */ 14648487Smjacob#define HBA_NOERROR CAM_REQ_INPROG 14748487Smjacob#define HBA_BOTCH CAM_UNREC_HBA_ERROR 14848487Smjacob#define HBA_CMDTIMEOUT CAM_CMD_TIMEOUT 14948487Smjacob#define HBA_SELTIMEOUT CAM_SEL_TIMEOUT 15048487Smjacob#define HBA_TGTBSY CAM_SCSI_STATUS_ERROR 15148487Smjacob#define HBA_BUSRESET CAM_SCSI_BUS_RESET 15248487Smjacob#define HBA_ABORTED CAM_REQ_ABORTED 15348487Smjacob#define HBA_DATAOVR CAM_DATA_RUN_ERR 15448487Smjacob#define HBA_ARQFAIL CAM_AUTOSENSE_FAIL 15535388Smjacob 15648487Smjacob#define XS_SNS_IS_VALID(ccb) ((ccb)->ccb_h.status |= CAM_AUTOSNS_VALID) 15748487Smjacob#define XS_IS_SNS_VALID(ccb) (((ccb)->ccb_h.status & CAM_AUTOSNS_VALID) != 0) 15835388Smjacob 15948487Smjacob#define XS_INITERR(ccb) \ 16048487Smjacob (ccb)->ccb_h.status &= ~CAM_STATUS_MASK, \ 16148487Smjacob (ccb)->ccb_h.status |= CAM_REQ_INPROG, \ 16248487Smjacob (ccb)->ccb_h.spriv_field0 = CAM_REQ_INPROG 16348487Smjacob#define XS_SETERR(ccb, v) (ccb)->ccb_h.spriv_field0 = v 16448487Smjacob#define XS_ERR(ccb) (ccb)->ccb_h.spriv_field0 16548487Smjacob#define XS_NOERR(ccb) \ 16648487Smjacob ((ccb)->ccb_h.spriv_field0 == CAM_REQ_INPROG) 16735388Smjacob 16848487Smjacobextern void isp_done(struct ccb_scsiio *); 16948487Smjacob#define XS_CMD_DONE(sccb) isp_done(sccb) 17048487Smjacob 17148487Smjacob#define XS_IS_CMD_DONE(ccb) \ 17248487Smjacob (((ccb)->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_INPROG) 17348487Smjacob 17439235Sgibbs/* 17548487Smjacob * Can we tag? 17639235Sgibbs */ 17748487Smjacob#define XS_CANTAG(ccb) (((ccb)->ccb_h.flags & CAM_TAG_ACTION_VALID) \ 17848487Smjacob && (ccb)->tag_action != CAM_TAG_ACTION_NONE) 17939235Sgibbs/* 18048487Smjacob * And our favorite tag is.... 18139235Sgibbs */ 18248487Smjacob#define XS_KINDOF_TAG(ccb) \ 18348487Smjacob ((ccb->tag_action == MSG_SIMPLE_Q_TAG)? REQFLAG_STAG : \ 18448487Smjacob ((ccb->tag_action == MSG_HEAD_OF_Q_TAG)? REQFLAG_HTAG : REQFLAG_OTAG)) 18548487Smjacob 18639235Sgibbs 18739235Sgibbs 18848487Smjacob#define CMD_COMPLETE 0 18948487Smjacob#define CMD_EAGAIN 1 19048487Smjacob#define CMD_QUEUED 2 19148487Smjacob#define STOP_WATCHDOG(f, s) 19235388Smjacob 19344819Smjacobextern void isp_attach(struct ispsoftc *); 19444819Smjacobextern void isp_uninit(struct ispsoftc *); 19544819Smjacob 19644819Smjacob#define MEMZERO bzero 19744819Smjacob#define MEMCPY(dst, src, amt) bcopy((src), (dst), (amt)) 19844819Smjacob#ifdef __alpha__ 19944819Smjacob#define MemoryBarrier alpha_mb 20044819Smjacob#else 20144819Smjacob#define MemoryBarrier() 20244819Smjacob#endif 20344819Smjacob 20444819Smjacob 20545284Smjacob#define DMA_MSW(x) (((x) >> 16) & 0xffff) 20645284Smjacob#define DMA_LSW(x) (((x) & 0xffff)) 20745284Smjacob 20844819Smjacob#define IDPRINTF(lev, x) if (isp->isp_dblev >= lev) printf x 20944819Smjacob#define PRINTF printf 21044819Smjacob 21144819Smjacob#define SYS_DELAY(x) DELAY(x) 21244819Smjacob 21344819Smjacob#define FC_FW_READY_DELAY (5 * 1000000) 21448487Smjacob#define DEFAULT_LOOPID(x) 109 21548487Smjacob#define DEFAULT_WWN(x) (0x0000feeb00000000LL + (x)->isp_osinfo.seed) 21644819Smjacob 21744819Smjacobstatic __inline void isp_prtstst(ispstatusreq_t *sp); 21844819Smjacobstatic __inline const char *isp2100_fw_statename(int state); 21944819Smjacobstatic __inline const char *isp2100_pdb_statename(int pdb_state); 22044819Smjacob 22144819Smjacobstatic __inline void isp_prtstst(ispstatusreq_t *sp) 22244819Smjacob{ 22344819Smjacob char buf[128]; 22444819Smjacob sprintf(buf, "states->"); 22544819Smjacob if (sp->req_state_flags & RQSF_GOT_BUS) 22644819Smjacob sprintf(buf, "%s%s", buf, "GOT_BUS "); 22744819Smjacob if (sp->req_state_flags & RQSF_GOT_TARGET) 22844819Smjacob sprintf(buf, "%s%s", buf, "GOT_TGT "); 22944819Smjacob if (sp->req_state_flags & RQSF_SENT_CDB) 23044819Smjacob sprintf(buf, "%s%s", buf, "SENT_CDB "); 23144819Smjacob if (sp->req_state_flags & RQSF_XFRD_DATA) 23244819Smjacob sprintf(buf, "%s%s", buf, "XFRD_DATA "); 23344819Smjacob if (sp->req_state_flags & RQSF_GOT_STATUS) 23444819Smjacob sprintf(buf, "%s%s", buf, "GOT_STS "); 23544819Smjacob if (sp->req_state_flags & RQSF_GOT_SENSE) 23644819Smjacob sprintf(buf, "%s%s", buf, "GOT_SNS "); 23744819Smjacob if (sp->req_state_flags & RQSF_XFER_COMPLETE) 23844819Smjacob sprintf(buf, "%s%s", buf, "XFR_CMPLT "); 23944819Smjacob sprintf(buf, "%s%s", buf, "\n"); 24044819Smjacob sprintf(buf, "%s%s", buf, "status->"); 24144819Smjacob if (sp->req_status_flags & RQSTF_DISCONNECT) 24244819Smjacob sprintf(buf, "%s%s", buf, "Disconnect "); 24344819Smjacob if (sp->req_status_flags & RQSTF_SYNCHRONOUS) 24444819Smjacob sprintf(buf, "%s%s", buf, "Sync_xfr "); 24544819Smjacob if (sp->req_status_flags & RQSTF_PARITY_ERROR) 24644819Smjacob sprintf(buf, "%s%s", buf, "Parity "); 24744819Smjacob if (sp->req_status_flags & RQSTF_BUS_RESET) 24844819Smjacob sprintf(buf, "%s%s", buf, "Bus_Reset "); 24944819Smjacob if (sp->req_status_flags & RQSTF_DEVICE_RESET) 25044819Smjacob sprintf(buf, "%s%s", buf, "Device_Reset "); 25144819Smjacob if (sp->req_status_flags & RQSTF_ABORTED) 25244819Smjacob sprintf(buf, "%s%s", buf, "Aborted "); 25344819Smjacob if (sp->req_status_flags & RQSTF_TIMEOUT) 25444819Smjacob sprintf(buf, "%s%s", buf, "Timeout "); 25544819Smjacob if (sp->req_status_flags & RQSTF_NEGOTIATION) 25644819Smjacob sprintf(buf, "%s%s", buf, "Negotiation "); 25746969Smjacob printf(buf, "%s\n", buf); 25844819Smjacob} 25944819Smjacob 26044819Smjacobstatic __inline const char *isp2100_fw_statename(int state) 26144819Smjacob{ 26244819Smjacob static char buf[16]; 26344819Smjacob switch(state) { 26444819Smjacob case FW_CONFIG_WAIT: return "Config Wait"; 26544819Smjacob case FW_WAIT_AL_PA: return "Waiting for AL_PA"; 26644819Smjacob case FW_WAIT_LOGIN: return "Wait Login"; 26744819Smjacob case FW_READY: return "Ready"; 26844819Smjacob case FW_LOSS_OF_SYNC: return "Loss Of Sync"; 26944819Smjacob case FW_ERROR: return "Error"; 27044819Smjacob case FW_REINIT: return "Re-Init"; 27144819Smjacob case FW_NON_PART: return "Nonparticipating"; 27244819Smjacob default: 27346969Smjacob sprintf(buf, "0x%x", state); 27444819Smjacob return buf; 27544819Smjacob } 27644819Smjacob} 27744819Smjacob 27844819Smjacobstatic __inline const char *isp2100_pdb_statename(int pdb_state) 27944819Smjacob{ 28044819Smjacob static char buf[16]; 28144819Smjacob switch(pdb_state) { 28244819Smjacob case PDB_STATE_DISCOVERY: return "Port Discovery"; 28344819Smjacob case PDB_STATE_WDISC_ACK: return "Waiting Port Discovery ACK"; 28444819Smjacob case PDB_STATE_PLOGI: return "Port Login"; 28544819Smjacob case PDB_STATE_PLOGI_ACK: return "Wait Port Login ACK"; 28644819Smjacob case PDB_STATE_PRLI: return "Process Login"; 28744819Smjacob case PDB_STATE_PRLI_ACK: return "Wait Process Login ACK"; 28844819Smjacob case PDB_STATE_LOGGED_IN: return "Logged In"; 28944819Smjacob case PDB_STATE_PORT_UNAVAIL: return "Port Unavailable"; 29044819Smjacob case PDB_STATE_PRLO: return "Process Logout"; 29144819Smjacob case PDB_STATE_PRLO_ACK: return "Wait Process Logout ACK"; 29244819Smjacob case PDB_STATE_PLOGO: return "Port Logout"; 29344819Smjacob case PDB_STATE_PLOG_ACK: return "Wait Port Logout ACK"; 29444819Smjacob default: 29546969Smjacob sprintf(buf, "0x%x", pdb_state); 29644819Smjacob return buf; 29744819Smjacob } 29844819Smjacob} 29944819Smjacob 30035388Smjacob#endif /* _ISP_FREEBSD_H */ 301