Roll core version number. Do some stylistic changes. Ensure that

the result queue length is never less than 64. Move (ick) temp port
database used for post-LIP merging off the kernel stack and put it
into the softc. Remove some target mode stuff which will come back
later in a different file. Change how the list of outstanding commands
are stored (now allocated at mailbox setup time to be just enough for
the max for a specific HBA which can vary). Keep a rotating seed of
the last index for this in the softc. Increase the count of active
commands from 10 to 16 bits.
This commit is contained in:
mjacob 1999-10-17 18:45:31 +00:00
parent e11b1a283a
commit a1991492ab

View File

@ -2,11 +2,10 @@
/*
* Soft Definitions for for Qlogic ISP SCSI adapters.
*
*---------------------------------------
* Copyright (c) 1997, 1998, 1999 by Matthew Jacob
* NASA/Ames Research Center
* All rights reserved.
*---------------------------------------
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -47,7 +46,7 @@
#endif
#define ISP_CORE_VERSION_MAJOR 1
#define ISP_CORE_VERSION_MINOR 9
#define ISP_CORE_VERSION_MINOR 10
/*
* Vector for bus specific code to provide specific services.
@ -89,28 +88,34 @@ struct ispmdvec {
#define _ISP_FC_LUN(isp) 16
#endif
#define _ISP_SCSI_LUN(isp) \
((ISP_FW_REVX(isp->isp_fwrev) >= ISP_FW_REV(7, 55, 0))? 32 : 8)
((ISP_FW_REVX(isp->isp_fwrev) >= ISP_FW_REV(7, 55, 0))? 32 : 8)
#define ISP_MAX_LUNS(isp) \
(IS_FC(isp)? _ISP_FC_LUN(isp) : _ISP_SCSI_LUN(isp))
/* queue length must be a power of two */
/* this is the size of a queue entry (request and response) */
#define QENTRY_LEN 64
/* both request and result queue length must be a power of two */
#define RQUEST_QUEUE_LEN MAXISPREQUEST
/* I've seen wierdnesses with the result queue < 64 */
#if MAXISPREQUEST > 64
#define RESULT_QUEUE_LEN (MAXISPREQUEST/2)
#else
#define RESULT_QUEUE_LEN MAXISPREQUEST
#endif
#define ISP_QUEUE_ENTRY(q, idx) ((q) + ((idx) * QENTRY_LEN))
#define ISP_QUEUE_SIZE(n) ((n) * QENTRY_LEN)
#define ISP_NXT_QENTRY(idx, qlen) (((idx) + 1) & ((qlen)-1))
#define ISP_QAVAIL(in, out, qlen) \
#define ISP_QAVAIL(in, out, qlen) \
((in == out)? (qlen - 1) : ((in > out)? \
((qlen - 1) - (in - out)) : (out - in - 1)))
((qlen - 1) - (in - out)) : (out - in - 1)))
/*
* SCSI Specific Host Adapter Parameters- per bus, per target
*/
typedef struct {
u_int isp_gotdparms : 1,
isp_req_ack_active_neg : 1,
isp_data_line_active_neg: 1,
isp_req_ack_active_neg : 1,
isp_data_line_active_neg: 1,
isp_cmd_dma_burst_enable: 1,
isp_data_dma_burst_enabl: 1,
isp_fifo_threshold : 3,
@ -119,13 +124,13 @@ typedef struct {
isp_lvdmode : 1,
: 1,
isp_initiator_id : 4,
isp_async_data_setup : 4;
u_int16_t isp_selection_timeout;
u_int16_t isp_max_queue_depth;
isp_async_data_setup : 4;
u_int16_t isp_selection_timeout;
u_int16_t isp_max_queue_depth;
u_int8_t isp_tag_aging;
u_int8_t isp_bus_reset_delay;
u_int8_t isp_retry_count;
u_int8_t isp_retry_delay;
u_int8_t isp_bus_reset_delay;
u_int8_t isp_retry_count;
u_int8_t isp_retry_delay;
struct {
u_int dev_enable : 1, /* ignored */
: 1,
@ -160,17 +165,21 @@ typedef struct {
/* technically, not really correct, as they need to be rated based upon clock */
#define ISP_40M_SYNCPARMS 0x080a
#define ISP_20M_SYNCPARMS 0x080c
#define ISP_10M_SYNCPARMS 0x0c19
#define ISP_08M_SYNCPARMS 0x0c25
#define ISP_05M_SYNCPARMS 0x0c32
#define ISP_04M_SYNCPARMS 0x0c41
#define ISP_20M_SYNCPARMS 0x080c
#define ISP_10M_SYNCPARMS 0x0c19
#define ISP_08M_SYNCPARMS 0x0c25
#define ISP_05M_SYNCPARMS 0x0c32
#define ISP_04M_SYNCPARMS 0x0c41
/*
* Fibre Channel Specifics
*/
#define FL_PORT_ID 0x7e /* FL_Port Special ID */
#define FC_PORT_ID 0x7f /* Fabric Controller Special ID */
#define FC_SNS_ID 0x80 /* SNS Server Special ID */
typedef struct {
u_int isp_fwoptions : 16,
u_int32_t isp_fwoptions : 16,
: 7,
loop_seen_once : 1,
isp_loopstate : 3, /* Current Loop State */
@ -179,10 +188,12 @@ typedef struct {
isp_onfabric : 1;
u_int8_t isp_loopid; /* hard loop id */
u_int8_t isp_alpa; /* ALPA */
volatile u_int16_t isp_lipseq; /* LIP sequence # */
u_int32_t isp_portid;
u_int8_t isp_execthrottle;
u_int8_t isp_retry_delay;
u_int8_t isp_retry_count;
u_int8_t isp_retry_delay;
u_int8_t isp_retry_count;
u_int8_t isp_reserved;
u_int16_t isp_maxalloc;
u_int16_t isp_maxfrmlen;
u_int64_t isp_nodewwn;
@ -197,16 +208,16 @@ typedef struct {
* to move around.
*/
struct lportdb {
u_int
u_int
loopid : 8,
: 4,
fabdev : 1,
roles : 2,
valid : 1;
u_int32_t portid;
u_int32_t portid;
u_int64_t node_wwn;
u_int64_t port_wwn;
} portdb[MAX_FC_TARG];
} portdb[MAX_FC_TARG], tport[FL_PORT_ID];
/*
* Scratch DMA mapped in area to fetch Port Database stuff, etc.
@ -229,46 +240,6 @@ typedef struct {
#define LOOP_PDB_RCVD 2
#define LOOP_READY 7
#define FL_PORT_ID 0x7e /* FL_Port Special ID */
#define FC_PORT_ID 0x7f /* Fabric Controller Special ID */
#define FC_SNS_ID 0x80 /* SNS Server Special ID */
#ifdef ISP_TARGET_MODE
/*
* Some temporary Target Mode definitions
*/
typedef struct tmd_cmd {
u_int8_t cd_iid; /* initiator */
u_int8_t cd_tgt; /* target */
u_int8_t cd_lun; /* LUN for this command */
u_int8_t cd_state;
u_int8_t cd_cdb[16]; /* command bytes */
u_int8_t cd_sensedata[20];
u_int16_t cd_rxid;
u_int32_t cd_datalen;
u_int32_t cd_totbytes;
void * cd_hba;
} tmd_cmd_t;
/*
* Async Target Mode Event Definitions
*/
#define TMD_BUS_RESET 0
#define TMD_BDR 1
/*
* Immediate Notify data structure.
*/
#define NOTIFY_MSGLEN 5
typedef struct {
u_int8_t nt_iid; /* initiator */
u_int8_t nt_tgt; /* target */
u_int8_t nt_lun; /* LUN for this command */
u_int8_t nt_msg[NOTIFY_MSGLEN]; /* SCSI message byte(s) */
} tmd_notify_t;
#endif
/*
* Soft Structure per host adapter
*/
@ -299,68 +270,36 @@ struct ispsoftc {
u_int16_t isp_fwrev[3]; /* Running F/W revision */
u_int16_t isp_romfw_rev[3]; /* 'ROM' F/W revision */
u_int16_t isp_maxcmds; /* max active I/O cmds */
void * isp_param;
/*
* Volatile state
*/
volatile u_int
: 13,
volatile u_int : 9,
isp_state : 3,
: 2,
isp_sendmarker : 2, /* send a marker entry */
isp_update : 2, /* update parameters */
isp_nactive : 10; /* how many commands active */
isp_nactive : 16; /* how many commands active */
volatile u_int16_t isp_reqodx; /* index of last ISP pickup */
volatile u_int16_t isp_reqidx; /* index of next request */
volatile u_int16_t isp_residx; /* index of next result */
volatile u_int16_t isp_lasthdls; /* last handle seed */
/*
* Result and Request Queue indices.
* Active commands are stored here, found by handle functions.
*/
volatile u_int8_t isp_reqodx; /* index of last ISP pickup */
volatile u_int8_t isp_reqidx; /* index of next request */
volatile u_int8_t isp_residx; /* index of next result */
volatile u_int8_t isp_seqno; /* rolling sequence # */
ISP_SCSI_XFER_T **isp_xflist;
/*
* Sheer laziness, but it gets us around the problem
* where we don't have a clean way of remembering
* which transaction is bound to which ISP queue entry.
*
* There are other more clever ways to do this, but,
* jeez, so I blow a couple of KB per host adapter...
* and it *is* faster.
*/
ISP_SCSI_XFER_T *isp_xflist[RQUEST_QUEUE_LEN];
/*
* request/result queues and dma handles for them.
* request/result queue pointers and dma handles for them.
*/
caddr_t isp_rquest;
caddr_t isp_result;
u_int32_t isp_rquest_dma;
u_int32_t isp_result_dma;
#ifdef ISP_TARGET_MODE
/*
* Vectors for handling target mode support.
*
* isp_tmd_newcmd is for feeding a newly arrived command to some
* upper layer.
*
* isp_tmd_event is for notifying some upper layer that an event has
* occurred that is not necessarily tied to any target (e.g., a SCSI
* Bus Reset).
*
* isp_tmd_notify is for notifying some upper layer that some
* event is now occurring that is either pertinent for a specific
* device or for a specific command (e.g., BDR or ABORT TAG).
*
* It is left undefined (for now) how pools of commands are managed.
*/
void (*isp_tmd_newcmd) __P((void *, tmd_cmd_t *));
void (*isp_tmd_event) __P((void *, int));
void (*isp_tmd_notify) __P((void *, tmd_notify_t *));
#endif
};
#define SDPARAM(isp) ((sdparam *) (isp)->isp_param)
@ -384,7 +323,6 @@ struct ispsoftc {
#define ISP_FW_REV(maj, min, mic) ((maj << 24) | (min << 16) | mic)
#define ISP_FW_REVX(xp) ((xp[0]<<24) | (xp[1] << 16) | xp[2])
/*
* Bus (implementation) types
*/
@ -429,9 +367,9 @@ struct ispsoftc {
#define ISP_DMASETUP(isp, xs, req, iptrp, optr) \
(*(isp)->isp_mdvec->dv_dmaset)((isp), (xs), (req), (iptrp), (optr))
#define ISP_DMAFREE(isp, xs, seqno) \
#define ISP_DMAFREE(isp, xs, hndl) \
if ((isp)->isp_mdvec->dv_dmaclr) \
(*(isp)->isp_mdvec->dv_dmaclr)((isp), (xs), (seqno))
(*(isp)->isp_mdvec->dv_dmaclr)((isp), (xs), (hndl))
#define ISP_RESET0(isp) \
if ((isp)->isp_mdvec->dv_reset0) (*(isp)->isp_mdvec->dv_reset0)((isp))
@ -516,5 +454,4 @@ int isp_async __P((struct ispsoftc *, ispasync_t, void *));
*/
void isp_lostcmd __P((struct ispsoftc *, ISP_SCSI_XFER_T *));
#endif /* _ISPVAR_H */