summaryrefslogtreecommitdiffstats
path: root/sys/dev/isp/ispmbox.h
diff options
context:
space:
mode:
authormjacob <mjacob@FreeBSD.org>2009-08-01 01:04:26 +0000
committermjacob <mjacob@FreeBSD.org>2009-08-01 01:04:26 +0000
commit2d4b24984c5d2ea2556ae2b1ef1df7f0833dc1b5 (patch)
tree884359c5bdd547b6c49dd87022ae80caeb753792 /sys/dev/isp/ispmbox.h
parent8cd95c9b5850387fecf5b9901ef05d9c08489a4c (diff)
downloadFreeBSD-src-2d4b24984c5d2ea2556ae2b1ef1df7f0833dc1b5.zip
FreeBSD-src-2d4b24984c5d2ea2556ae2b1ef1df7f0833dc1b5.tar.gz
Add 8Gb support (isp_2500). Fix a fair number of configuration and
firmware loading bugs. Target mode support has received some serious attention to make it more usable and stable. Some backward compatible additions to CAM have been made that make target mode async events easier to deal with have also been put into place. Further refinement and better support for NP-IV (N-port Virtualization) is now in place. Code for release prior to RELENG_7 has been stripped away for code clarity. Sponsored by: Copan Systems Reviewed by: scottl, ken, jung-uk kim Approved by: re
Diffstat (limited to 'sys/dev/isp/ispmbox.h')
-rw-r--r--sys/dev/isp/ispmbox.h1202
1 files changed, 1167 insertions, 35 deletions
diff --git a/sys/dev/isp/ispmbox.h b/sys/dev/isp/ispmbox.h
index 272d74e..8f68937 100644
--- a/sys/dev/isp/ispmbox.h
+++ b/sys/dev/isp/ispmbox.h
@@ -1,6 +1,6 @@
/* $FreeBSD$ */
/*-
- * Copyright (c) 1997-2007 by Matthew Jacob
+ * Copyright (c) 1997-2009 by Matthew Jacob
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -24,6 +24,7 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
*/
/*
* Mailbox and Queue Entry Definitions for for Qlogic ISP SCSI adapters.
@@ -121,11 +122,20 @@
/* These are for the ISP2X00 FC cards */
#define MBOX_GET_LOOP_ID 0x0020
+/* for 24XX cards, outgoing mailbox 7 has these values for F or FL topologies */
+#define ISP24XX_INORDER 0x0100
+#define ISP24XX_NPIV_SAN 0x0400
+#define ISP24XX_VSAN_SAN 0x1000
+#define ISP24XX_FC_SP_SAN 0x2000
+
#define MBOX_GET_FIRMWARE_OPTIONS 0x0028
#define MBOX_SET_FIRMWARE_OPTIONS 0x0038
#define MBOX_GET_RESOURCE_COUNT 0x0042
#define MBOX_REQUEST_OFFLINE_MODE 0x0043
#define MBOX_ENHANCED_GET_PDB 0x0047
+#define MBOX_INIT_FIRMWARE_MULTI_ID 0x0048 /* 2400 only */
+#define MBOX_GET_VP_DATABASE 0x0049 /* 2400 only */
+#define MBOX_GET_VP_DATABASE_ENTRY 0x004a /* 2400 only */
#define MBOX_EXEC_COMMAND_IOCB_A64 0x0054
#define MBOX_INIT_FIRMWARE 0x0060
#define MBOX_GET_INIT_CONTROL_BLOCK 0x0061
@@ -158,6 +168,7 @@
#define MBGSD_TWOGB 1
#define MBGSD_AUTO 2
#define MBGSD_FOURGB 3 /* 24XX only */
+#define MBGSD_EIGHTGB 4 /* 25XX only */
#define ISP2100_SET_PCI_PARAM 0x00ff
@@ -250,6 +261,11 @@
#define QENTRY_LEN 64
/*
+ * Special Internal Handle for IOCBs
+ */
+#define ISP_SPCL_HANDLE 0xa5dead5a
+
+/*
* Command Structure Definitions
*/
@@ -273,15 +289,6 @@ typedef struct {
} ispdslist_t;
-/*
- * These elements get swizzled around for SBus instances.
- */
-#define ISP_SWAP8(a, b) { \
- uint8_t tmp; \
- tmp = a; \
- a = b; \
- b = tmp; \
-}
typedef struct {
uint8_t rqs_entry_type;
uint8_t rqs_entry_count;
@@ -294,7 +301,9 @@ typedef struct {
#define RQSFLAG_FULL 0x02
#define RQSFLAG_BADHEADER 0x04
#define RQSFLAG_BADPACKET 0x08
-#define RQSFLAG_MASK 0x0f
+#define RQSFLAG_BADCOUNT 0x10
+#define RQSFLAG_BADORDER 0x20
+#define RQSFLAG_MASK 0x3f
/* RQS entry_type definitions */
#define RQSTYPE_REQUEST 0x01
@@ -331,6 +340,9 @@ typedef struct {
#define RQSTYPE_IP_RECV_CONT 0x24
#define RQSTYPE_CT_PASSTHRU 0x29
#define RQSTYPE_MS_PASSTHRU 0x29
+#define RQSTYPE_VP_CTRL 0x30 /* 24XX only */
+#define RQSTYPE_VP_MODIFY 0x31 /* 24XX only */
+#define RQSTYPE_RPT_ID_ACQ 0x32 /* 24XX only */
#define RQSTYPE_ABORT_IO 0x33
#define RQSTYPE_T6RQS 0x48
#define RQSTYPE_LOGIN 0x52
@@ -533,6 +545,31 @@ typedef struct {
ispds64_t req_dataseg;
} ispreqt7_t;
+/* Task Management Request Function */
+typedef struct {
+ isphdr_t tmf_header;
+ uint32_t tmf_handle;
+ uint16_t tmf_nphdl;
+ uint8_t tmf_reserved0[2];
+ uint16_t tmf_delay;
+ uint16_t tmf_timeout;
+ uint8_t tmf_lun[8];
+ uint32_t tmf_flags;
+ uint8_t tmf_reserved1[20];
+ uint16_t tmf_tidlo;
+ uint8_t tmf_tidhi;
+ uint8_t tmf_vpidx;
+ uint8_t tmf_reserved2[12];
+} isp24xx_tmf_t;
+
+#define ISP24XX_TMF_NOSEND 0x80000000
+
+#define ISP24XX_TMF_LUN_RESET 0x00000010
+#define ISP24XX_TMF_ABORT_TASK_SET 0x00000008
+#define ISP24XX_TMF_CLEAR_TASK_SET 0x00000004
+#define ISP24XX_TMF_TARGET_RESET 0x00000002
+#define ISP24XX_TMF_CLEAR_ACA 0x00000001
+
/* I/O Abort Structure */
typedef struct {
isphdr_t abrt_header;
@@ -546,7 +583,9 @@ typedef struct {
uint8_t abrt_vpidx;
uint8_t abrt_reserved1[12];
} isp24xx_abrt_t;
-#define ISP24XX_ABRT_NO_ABTS 0x01 /* don't actually send an ABTS */
+
+#define ISP24XX_ABRT_NOSEND 0x01 /* don't actually send ABTS */
+#define ISP24XX_ABRT_OKAY 0x00 /* in nphdl on return */
#define ISP24XX_ABRT_ENXIO 0x31 /* in nphdl on return */
#define ISP_CDSEG 7
@@ -623,11 +662,12 @@ typedef struct {
uint16_t ctp_status;
uint16_t ctp_nphdl; /* n-port handle */
uint16_t ctp_cmd_cnt; /* Command DSD count */
- uint16_t ctp_vpidx; /* low 8 bits */
+ uint8_t ctp_vpidx;
+ uint8_t ctp_reserved0;
uint16_t ctp_time;
- uint16_t ctp_reserved0;
+ uint16_t ctp_reserved1;
uint16_t ctp_rsp_cnt; /* Response DSD count */
- uint16_t ctp_reserved1[5];
+ uint16_t ctp_reserved2[5];
uint32_t ctp_rsp_bcnt; /* Response byte count */
uint32_t ctp_cmd_bcnt; /* Command byte count */
ispds64_t ctp_dataseg[2];
@@ -766,24 +806,36 @@ typedef struct {
* About Firmware returns an 'attribute' word in mailbox 6.
* These attributes are for 2200 and 2300.
*/
-#define ISP_FW_ATTR_TMODE 0x01
-#define ISP_FW_ATTR_SCCLUN 0x02
-#define ISP_FW_ATTR_FABRIC 0x04
-#define ISP_FW_ATTR_CLASS2 0x08
-#define ISP_FW_ATTR_FCTAPE 0x10
-#define ISP_FW_ATTR_IP 0x20
-#define ISP_FW_ATTR_VI 0x40
-#define ISP_FW_ATTR_VI_SOLARIS 0x80
-#define ISP_FW_ATTR_2KLOGINS 0x100 /* XXX: just a guess */
+#define ISP_FW_ATTR_TMODE 0x0001
+#define ISP_FW_ATTR_SCCLUN 0x0002
+#define ISP_FW_ATTR_FABRIC 0x0004
+#define ISP_FW_ATTR_CLASS2 0x0008
+#define ISP_FW_ATTR_FCTAPE 0x0010
+#define ISP_FW_ATTR_IP 0x0020
+#define ISP_FW_ATTR_VI 0x0040
+#define ISP_FW_ATTR_VI_SOLARIS 0x0080
+#define ISP_FW_ATTR_2KLOGINS 0x0100 /* just a guess... */
/* and these are for the 2400 */
-#define ISP2400_FW_ATTR_CLASS2 (1 << 0)
-#define ISP2400_FW_ATTR_IP (1 << 1)
-#define ISP2400_FW_ATTR_MULTIID (1 << 2)
-#define ISP2400_FW_ATTR_SB2 (1 << 3)
-#define ISP2400_FW_ATTR_T10CRC (1 << 4)
-#define ISP2400_FW_ATTR_VI (1 << 5)
-#define ISP2400_FW_ATTR_EXPFW (1 << 13)
+#define ISP2400_FW_ATTR_CLASS2 0x0001
+#define ISP2400_FW_ATTR_IP 0x0002
+#define ISP2400_FW_ATTR_MULTIID 0x0004
+#define ISP2400_FW_ATTR_SB2 0x0008
+#define ISP2400_FW_ATTR_T10CRC 0x0010
+#define ISP2400_FW_ATTR_VI 0x0020
+#define ISP2400_FW_ATTR_EXPFW 0x2000
+
+#define ISP_CAP_TMODE(isp) \
+ (IS_24XX(isp)? 1 : (isp->isp_fwattr & ISP_FW_ATTR_TMODE))
+#define ISP_CAP_SCCFW(isp) \
+ (IS_24XX(isp)? 1 : (isp->isp_fwattr & ISP_FW_ATTR_SCCLUN))
+#define ISP_CAP_2KLOGIN(isp) \
+ (IS_24XX(isp)? 1 : (isp->isp_fwattr & ISP_FW_ATTR_2KLOGINS))
+#define ISP_CAP_MULTI_ID(isp) \
+ (IS_24XX(isp)? (isp->isp_fwattr & ISP2400_FW_ATTR_MULTIID) : 0)
+
+#define ISP_GET_VPIDX(isp, tag) \
+ (ISP_CAP_MULTI_ID(isp) ? tag : 0)
/*
* Reduced Interrupt Operation Response Queue Entreis
@@ -928,6 +980,7 @@ typedef struct {
#define ICB2400_OPT3_RATE_TWOGB 0x00002000
#define ICB2400_OPT3_RATE_AUTO 0x00004000
#define ICB2400_OPT3_RATE_FOURGB 0x00006000
+#define ICB2400_OPT3_RATE_EIGHTGB 0x00008000
#define ICB2400_OPT3_ENA_OOF_XFRDY 0x00000200
#define ICB2400_OPT3_NO_LOCAL_PLOGI 0x00000080
#define ICB2400_OPT3_ENA_OOF 0x00000040
@@ -1021,6 +1074,95 @@ typedef struct {
((uint64_t) array[ICB_NNM6] << 48) | \
((uint64_t) array[ICB_NNM7] << 56)
+
+/*
+ * For MULTI_ID firmware, this describes a
+ * virtual port entity for getting status.
+ */
+typedef struct {
+ uint16_t vp_port_status;
+ uint8_t vp_port_options;
+ uint8_t vp_port_loopid;
+ uint8_t vp_port_portname[8];
+ uint8_t vp_port_nodename[8];
+ uint16_t vp_port_portid_lo; /* not present when trailing icb */
+ uint16_t vp_port_portid_hi; /* not present when trailing icb */
+} vp_port_info_t;
+
+#define ICB2400_VPOPT_TGT_DISABLE 0x00000020 /* disable target mode */
+#define ICB2400_VPOPT_INI_ENABLE 0x00000010 /* enable initiator mode */
+#define ICB2400_VPOPT_ENABLED 0x00000008
+#define ICB2400_VPOPT_NOPLAY 0x00000004
+#define ICB2400_VPOPT_PREVLOOP 0x00000002
+#define ICB2400_VPOPT_HARD_ADDRESS 0x00000001
+
+#define ICB2400_VPOPT_WRITE_SIZE 20
+
+/*
+ * For MULTI_ID firmware, we append this structure
+ * to the isp_icb_2400_t above, followed by a list
+ * structures that are *most* of the vp_port_info_t.
+ */
+typedef struct {
+ uint16_t vp_count;
+ uint16_t vp_global_options;
+} isp_icb_2400_vpinfo_t;
+
+#define ICB2400_VPINFO_OFF 0x80 /* offset from start of ICB */
+#define ICB2400_VPINFO_PORT_OFF(chan) \
+ ICB2400_VPINFO_OFF + \
+ sizeof (isp_icb_2400_vpinfo_t) + ((chan - 1) * ICB2400_VPOPT_WRITE_SIZE)
+
+#define ICB2400_VPGOPT_MID_DISABLE 0x02
+
+typedef struct {
+ isphdr_t vp_ctrl_hdr;
+ uint32_t vp_ctrl_handle;
+ uint16_t vp_ctrl_index_fail;
+ uint16_t vp_ctrl_status;
+ uint16_t vp_ctrl_command;
+ uint16_t vp_ctrl_vp_count;
+ uint16_t vp_ctrl_idmap[8];
+ uint8_t vp_ctrl_reserved[32];
+} vp_ctrl_info_t;
+
+#define VP_CTRL_CMD_ENABLE_VP 0
+#define VP_CTRL_CMD_DISABLE_VP 8
+#define VP_CTRL_CMD_DISABLE_VP_REINIT_LINK 9
+#define VP_CTRL_CMD_DISABLE_VP_LOGO 0xA
+
+/*
+ * We can use this structure for modifying either one or two VP ports after initialization
+ */
+typedef struct {
+ isphdr_t vp_mod_hdr;
+ uint32_t vp_mod_hdl;
+ uint16_t vp_mod_reserved0;
+ uint16_t vp_mod_status;
+ uint8_t vp_mod_cmd;
+ uint8_t vp_mod_cnt;
+ uint8_t vp_mod_idx0;
+ uint8_t vp_mod_idx1;
+ struct {
+ uint8_t options;
+ uint8_t loopid;
+ uint16_t reserved1;
+ uint8_t wwpn[8];
+ uint8_t wwnn[8];
+ } vp_mod_ports[2];
+ uint8_t vp_mod_reserved2[8];
+} vp_modify_t;
+
+#define VP_STS_OK 0x00
+#define VP_STS_ERR 0x01
+#define VP_CNT_ERR 0x02
+#define VP_GEN_ERR 0x03
+#define VP_IDX_ERR 0x04
+#define VP_STS_BSY 0x05
+
+#define VP_MODIFY_VP 0x00
+#define VP_MODIFY_ENA 0x01
+
/*
* Port Data Base Element
*/
@@ -1120,6 +1262,14 @@ typedef struct {
#define PDB2400_CLASS2 0x0010
#define PDB2400_ADDR_VALID 0x0002
+#define PDB2400_STATE_PLOGI_PEND 0x03
+#define PDB2400_STATE_PLOGI_DONE 0x04
+#define PDB2400_STATE_PRLI_PEND 0x05
+#define PDB2400_STATE_LOGGED_IN 0x06
+#define PDB2400_STATE_PORT_UNAVAIL 0x07
+#define PDB2400_STATE_PRLO_PEND 0x09
+#define PDB2400_STATE_LOGO_PEND 0x0B
+
/*
* Common elements from the above two structures that are actually useful to us.
*/
@@ -1133,10 +1283,40 @@ typedef struct {
} isp_pdb_t;
/*
+ * Port Database Changed Async Event information for 24XX cards
+ */
+#define PDB24XX_AE_OK 0x00
+#define PDB24XX_AE_IMPL_LOGO_1 0x01
+#define PDB24XX_AE_IMPL_LOGO_2 0x02
+#define PDB24XX_AE_IMPL_LOGO_3 0x03
+#define PDB24XX_AE_PLOGI_RCVD 0x04
+#define PDB24XX_AE_PLOGI_RJT 0x05
+#define PDB24XX_AE_PRLI_RCVD 0x06
+#define PDB24XX_AE_PRLI_RJT 0x07
+#define PDB24XX_AE_TPRLO 0x08
+#define PDB24XX_AE_TPRLO_RJT 0x09
+#define PDB24XX_AE_PRLO_RCVD 0x0a
+#define PDB24XX_AE_LOGO_RCVD 0x0b
+#define PDB24XX_AE_TOPO_CHG 0x0c
+#define PDB24XX_AE_NPORT_CHG 0x0d
+#define PDB24XX_AE_FLOGI_RJT 0x0e
+#define PDB24XX_AE_BAD_FANN 0x0f
+#define PDB24XX_AE_FLOGI_TIMO 0x10
+#define PDB24XX_AE_ABX_LOGO 0x11
+#define PDB24XX_AE_PLOGI_DONE 0x12
+#define PDB24XX_AE_PRLI_DONJE 0x13
+#define PDB24XX_AE_OPN_1 0x14
+#define PDB24XX_AE_OPN_2 0x15
+#define PDB24XX_AE_TXERR 0x16
+#define PDB24XX_AE_FORCED_LOGO 0x17
+#define PDB24XX_AE_DISC_TIMO 0x18
+
+/*
* Genericized Port Login/Logout software structure
*/
typedef struct {
uint16_t handle;
+ uint16_t channel;
uint32_t
flags : 8,
portid : 24;
@@ -1201,6 +1381,36 @@ typedef struct {
#define PLOGX_FLG_FCP2_OVERRIDE 0x200 /* if with PRLOG, PRLI */
/*
+ * Report ID Acquisistion (24XX multi-id firmware)
+ */
+typedef struct {
+ isphdr_t ridacq_hdr;
+ uint32_t ridacq_handle;
+ union {
+ struct {
+ uint8_t ridacq_vp_acquired;
+ uint8_t ridacq_vp_setup;
+ uint16_t ridacq_reserved0;
+ } type0; /* type 0 */
+ struct {
+ uint16_t ridacq_vp_count;
+ uint8_t ridacq_vp_index;
+ uint8_t ridacq_vp_status;
+ } type1; /* type 1 */
+ } un;
+ uint16_t ridacq_vp_port_lo;
+ uint8_t ridacq_vp_port_hi;
+ uint8_t ridacq_format; /* 0 or 1 */
+ uint16_t ridacq_map[8];
+ uint8_t ridacq_reserved1[32];
+} isp_ridacq_t;
+
+#define RIDACQ_STS_COMPLETE 0
+#define RIDACQ_STS_UNACQUIRED 1
+#define RIDACQ_STS_CHANGED 20
+
+
+/*
* Simple Name Server Data Structures
*/
#define SNS_GA_NXT 0x100
@@ -1385,18 +1595,21 @@ typedef struct {
} els_t;
/*
- * A handy package structure for running FC-SCSI commands via RUN IOCB A64.
+ * A handy package structure for running FC-SCSI commands internally
*/
typedef struct {
uint16_t handle;
uint16_t lun;
- uint32_t portid;
+ uint32_t
+ channel : 8,
+ portid : 24;
uint32_t timeout;
union {
struct {
uint32_t data_length;
- uint8_t do_read;
- uint8_t pad[3];
+ uint32_t
+ no_wait : 1,
+ do_read : 1;
uint8_t cdb[16];
void *data_ptr;
} beg;
@@ -1409,4 +1622,923 @@ typedef struct {
} end;
} fcd;
} isp_xcmd_t;
+
+/*
+ * Target Mode related definitions
+ */
+#define QLTM_SENSELEN 18 /* non-FC cards only */
+#define QLTM_SVALID 0x80
+
+/*
+ * Structure for Enable Lun and Modify Lun queue entries
+ */
+typedef struct {
+ isphdr_t le_header;
+ uint32_t le_reserved;
+ uint8_t le_lun;
+ uint8_t le_rsvd;
+ uint8_t le_ops; /* Modify LUN only */
+ uint8_t le_tgt; /* Not for FC */
+ uint32_t le_flags; /* Not for FC */
+ uint8_t le_status;
+ uint8_t le_reserved2;
+ uint8_t le_cmd_count;
+ uint8_t le_in_count;
+ uint8_t le_cdb6len; /* Not for FC */
+ uint8_t le_cdb7len; /* Not for FC */
+ uint16_t le_timeout;
+ uint16_t le_reserved3[20];
+} lun_entry_t;
+
+/*
+ * le_flags values
+ */
+#define LUN_TQAE 0x00000002 /* bit1 Tagged Queue Action Enable */
+#define LUN_DSSM 0x01000000 /* bit24 Disable Sending SDP Message */
+#define LUN_DISAD 0x02000000 /* bit25 Disable autodisconnect */
+#define LUN_DM 0x40000000 /* bit30 Disconnects Mandatory */
+
+/*
+ * le_ops values
+ */
+#define LUN_CCINCR 0x01 /* increment command count */
+#define LUN_CCDECR 0x02 /* decrement command count */
+#define LUN_ININCR 0x40 /* increment immed. notify count */
+#define LUN_INDECR 0x80 /* decrement immed. notify count */
+
+/*
+ * le_status values
+ */
+#define LUN_OK 0x01 /* we be rockin' */
+#define LUN_ERR 0x04 /* request completed with error */
+#define LUN_INVAL 0x06 /* invalid request */
+#define LUN_NOCAP 0x16 /* can't provide requested capability */
+#define LUN_ENABLED 0x3E /* LUN already enabled */
+
+/*
+ * Immediate Notify Entry structure
+ */
+#define IN_MSGLEN 8 /* 8 bytes */
+#define IN_RSVDLEN 8 /* 8 words */
+typedef struct {
+ isphdr_t in_header;
+ uint32_t in_reserved;
+ uint8_t in_lun; /* lun */
+ uint8_t in_iid; /* initiator */
+ uint8_t in_reserved2;
+ uint8_t in_tgt; /* target */
+ uint32_t in_flags;
+ uint8_t in_status;
+ uint8_t in_rsvd2;
+ uint8_t in_tag_val; /* tag value */
+ uint8_t in_tag_type; /* tag type */
+ uint16_t in_seqid; /* sequence id */
+ uint8_t in_msg[IN_MSGLEN]; /* SCSI message bytes */
+ uint16_t in_reserved3[IN_RSVDLEN];
+ uint8_t in_sense[QLTM_SENSELEN];/* suggested sense data */
+} in_entry_t;
+
+typedef struct {
+ isphdr_t in_header;
+ uint32_t in_reserved;
+ uint8_t in_lun; /* lun */
+ uint8_t in_iid; /* initiator */
+ uint16_t in_scclun;
+ uint32_t in_reserved2;
+ uint16_t in_status;
+ uint16_t in_task_flags;
+ uint16_t in_seqid; /* sequence id */
+} in_fcentry_t;
+
+typedef struct {
+ isphdr_t in_header;
+ uint32_t in_reserved;
+ uint16_t in_iid; /* initiator */
+ uint16_t in_scclun;
+ uint32_t in_reserved2;
+ uint16_t in_status;
+ uint16_t in_task_flags;
+ uint16_t in_seqid; /* sequence id */
+} in_fcentry_e_t;
+
+/*
+ * Values for the in_status field
+ */
+#define IN_REJECT 0x0D /* Message Reject message received */
+#define IN_RESET 0x0E /* Bus Reset occurred */
+#define IN_NO_RCAP 0x16 /* requested capability not available */
+#define IN_IDE_RECEIVED 0x33 /* Initiator Detected Error msg received */
+#define IN_RSRC_UNAVAIL 0x34 /* resource unavailable */
+#define IN_MSG_RECEIVED 0x36 /* SCSI message received */
+#define IN_ABORT_TASK 0x20 /* task named in RX_ID is being aborted (FC) */
+#define IN_PORT_LOGOUT 0x29 /* port has logged out (FC) */
+#define IN_PORT_CHANGED 0x2A /* port changed */
+#define IN_GLOBAL_LOGO 0x2E /* all ports logged out */
+#define IN_NO_NEXUS 0x3B /* Nexus not established */
+
+/*
+ * Values for the in_task_flags field- should only get one at a time!
+ */
+#define TASK_FLAGS_RESERVED_MASK (0xe700)
+#define TASK_FLAGS_CLEAR_ACA (1<<14)
+#define TASK_FLAGS_TARGET_RESET (1<<13)
+#define TASK_FLAGS_LUN_RESET (1<<12)
+#define TASK_FLAGS_CLEAR_TASK_SET (1<<10)
+#define TASK_FLAGS_ABORT_TASK_SET (1<<9)
+
+/*
+ * ISP24XX Immediate Notify
+ */
+typedef struct {
+ isphdr_t in_header;
+ uint32_t in_reserved;
+ uint16_t in_nphdl;
+ uint16_t in_reserved1;
+ uint16_t in_flags;
+ uint16_t in_srr_rxid;
+ uint16_t in_status;
+ uint8_t in_status_subcode;
+ uint8_t in_reserved2;
+ uint32_t in_rxid;
+ uint16_t in_srr_reloff_lo;
+ uint16_t in_srr_reloff_hi;
+ uint16_t in_srr_iu;
+ uint16_t in_srr_oxid;
+ /*
+ * If bit 2 is set in in_flags, the following
+ * two tags are valid. If the received ELS is
+ * a LOGO, then these tags contain the N Port ID
+ * from the LOGO payload. If the received ELS
+ * request is TPRLO, these tags contain the
+ * Third Party Originator N Port ID.
+ */
+ uint16_t in_nport_id_hi;
+ uint8_t in_nport_id_lo;
+ uint8_t in_reserved3;
+ /*
+ * If bit 2 is set in in_flags, the following
+ * tag is valid. If the received ELS is a LOGO,
+ * then this tag contains the n-port handle
+ * from the LOGO payload. If the received ELS
+ * request is TPRLO, this tag contain the
+ * n-port handle for the Third Party Originator.
+ */
+ uint16_t in_np_handle;
+ uint8_t in_reserved4[12];
+ uint8_t in_reserved5;
+ uint8_t in_vpidx;
+ uint32_t in_reserved6;
+ uint16_t in_portid_lo;
+ uint8_t in_portid_hi;
+ uint8_t in_reserved7;
+ uint16_t in_reserved8;
+ uint16_t in_oxid;
+} in_fcentry_24xx_t;
+
+#define IN24XX_FLAG_PUREX_IOCB 0x1
+#define IN24XX_FLAG_GLOBAL_LOGOUT 0x2
+#define IN24XX_FLAG_NPHDL_VALID 0x4
+
+#define IN24XX_LIP_RESET 0x0E
+#define IN24XX_LINK_RESET 0x0F
+#define IN24XX_PORT_LOGOUT 0x29
+#define IN24XX_PORT_CHANGED 0x2A
+#define IN24XX_LINK_FAILED 0x2E
+#define IN24XX_SRR_RCVD 0x45
+#define IN24XX_ELS_RCVD 0x46 /*
+ * login-affectin ELS received- check
+ * subcode for specific opcode
+ */
+
+/*
+ * For f/w > 4.0.25, these offsets in the Immediate Notify contain
+ * the WWNN/WWPN if the ELS is PLOGI, PDISC or ADISC. The WWN is in
+ * Big Endian format.
+ */
+#define IN24XX_PLOGI_WWNN_OFF 0x20
+#define IN24XX_PLOGI_WWPN_OFF 0x28
+
+/*
+ * For f/w > 4.0.25, this offset in the Immediate Notify contain
+ * the WWPN if the ELS is LOGO. The WWN is in Big Endian format.
+ */
+#define IN24XX_LOGO_WWPN_OFF 0x28
+
+/*
+ * Immediate Notify Status Subcodes for IN24XX_PORT_LOGOUT
+ */
+#define IN24XX_PORT_LOGOUT_PDISC_TMO 0x00
+#define IN24XX_PORT_LOGOUT_UXPR_DISC 0x01
+#define IN24XX_PORT_LOGOUT_OWN_OPN 0x02
+#define IN24XX_PORT_LOGOUT_OWN_OPN_SFT 0x03
+#define IN24XX_PORT_LOGOUT_ABTS_TMO 0x04
+#define IN24XX_PORT_LOGOUT_DISC_RJT 0x05
+#define IN24XX_PORT_LOGOUT_LOGIN_NEEDED 0x06
+#define IN24XX_PORT_LOGOUT_BAD_DISC 0x07
+#define IN24XX_PORT_LOGOUT_LOST_ALPA 0x08
+#define IN24XX_PORT_LOGOUT_XMIT_FAILURE 0x09
+
+/*
+ * Immediate Notify Status Subcodes for IN24XX_PORT_CHANGED
+ */
+#define IN24XX_PORT_CHANGED_BADFAN 0x00
+#define IN24XX_PORT_CHANGED_TOPO_CHANGE 0x01
+#define IN24XX_PORT_CHANGED_FLOGI_ACC 0x02
+#define IN24XX_PORT_CHANGED_FLOGI_RJT 0x03
+#define IN24XX_PORT_CHANGED_TIMEOUT 0x04
+#define IN24XX_PORT_CHANGED_PORT_CHANGE 0x05
+
+/*
+ * Notify Acknowledge Entry structure
+ */
+#define NA_RSVDLEN 22
+typedef struct {
+ isphdr_t na_header;
+ uint32_t na_reserved;
+ uint8_t na_lun; /* lun */
+ uint8_t na_iid; /* initiator */
+ uint8_t na_reserved2;
+ uint8_t na_tgt; /* target */
+ uint32_t na_flags;
+ uint8_t na_status;
+ uint8_t na_event;
+ uint16_t na_seqid; /* sequence id */
+ uint16_t na_reserved3[NA_RSVDLEN];
+} na_entry_t;
+
+/*
+ * Value for the na_event field
+ */
+#define NA_RST_CLRD 0x80 /* Clear an async event notification */
+#define NA_OK 0x01 /* Notify Acknowledge Succeeded */
+#define NA_INVALID 0x06 /* Invalid Notify Acknowledge */
+
+#define NA2_RSVDLEN 21
+typedef struct {
+ isphdr_t na_header;
+ uint32_t na_reserved;
+ uint8_t na_reserved1;
+ uint8_t na_iid; /* initiator loop id */
+ uint16_t na_response;
+ uint16_t na_flags;
+ uint16_t na_reserved2;
+ uint16_t na_status;
+ uint16_t na_task_flags;
+ uint16_t na_seqid; /* sequence id */
+ uint16_t na_reserved3[NA2_RSVDLEN];
+} na_fcentry_t;
+
+typedef struct {
+ isphdr_t na_header;
+ uint32_t na_reserved;
+ uint16_t na_iid; /* initiator loop id */
+ uint16_t na_response; /* response code */
+ uint16_t na_flags;
+ uint16_t na_reserved2;
+ uint16_t na_status;
+ uint16_t na_task_flags;
+ uint16_t na_seqid; /* sequence id */
+ uint16_t na_reserved3[NA2_RSVDLEN];
+} na_fcentry_e_t;
+
+#define NAFC_RCOUNT 0x80 /* increment resource count */
+#define NAFC_RST_CLRD 0x20 /* Clear LIP Reset */
+#define NAFC_TVALID 0x10 /* task mangement response code is valid */
+
+/*
+ * ISP24XX Notify Acknowledge
+ */
+
+typedef struct {
+ isphdr_t na_header;
+ uint32_t na_handle;
+ uint16_t na_nphdl;
+ uint16_t na_reserved1;
+ uint16_t na_flags;
+ uint16_t na_srr_rxid;
+ uint16_t na_status;
+ uint8_t na_status_subcode;
+ uint8_t na_reserved2;
+ uint32_t na_rxid;
+ uint16_t na_srr_reloff_lo;
+ uint16_t na_srr_reloff_hi;
+ uint16_t na_srr_iu;
+ uint16_t na_srr_flags;
+ uint8_t na_reserved3[18];
+ uint8_t na_reserved4;
+ uint8_t na_vpidx;
+ uint8_t na_srr_reject_vunique;
+ uint8_t na_srr_reject_explanation;
+ uint8_t na_srr_reject_code;
+ uint8_t na_reserved5;
+ uint8_t na_reserved6[6];
+ uint16_t na_oxid;
+} na_fcentry_24xx_t;
+
+/*
+ * Accept Target I/O Entry structure
+ */
+#define ATIO_CDBLEN 26
+
+typedef struct {
+ isphdr_t at_header;
+ uint16_t at_reserved;
+ uint16_t at_handle;
+ uint8_t at_lun; /* lun */
+ uint8_t at_iid; /* initiator */
+ uint8_t at_cdblen; /* cdb length */
+ uint8_t at_tgt; /* target */
+ uint32_t at_flags;
+ uint8_t at_status; /* firmware status */
+ uint8_t at_scsi_status; /* scsi status */
+ uint8_t at_tag_val; /* tag value */
+ uint8_t at_tag_type; /* tag type */
+ uint8_t at_cdb[ATIO_CDBLEN]; /* received CDB */
+ uint8_t at_sense[QLTM_SENSELEN];/* suggested sense data */
+} at_entry_t;
+
+/*
+ * at_flags values
+ */
+#define AT_NODISC 0x00008000 /* disconnect disabled */
+#define AT_TQAE 0x00000002 /* Tagged Queue Action enabled */
+
+/*
+ * at_status values
+ */
+#define AT_PATH_INVALID 0x07 /* ATIO sent to firmware for disabled lun */
+#define AT_RESET 0x0E /* SCSI Bus Reset Occurred */
+#define AT_PHASE_ERROR 0x14 /* Bus phase sequence error */
+#define AT_NOCAP 0x16 /* Requested capability not available */
+#define AT_BDR_MSG 0x17 /* Bus Device Reset msg received */
+#define AT_CDB 0x3D /* CDB received */
+/*
+ * Macros to create and fetch and test concatenated handle and tag value macros
+ * (SPI only)
+ */
+#define AT_MAKE_TAGID(tid, aep) \
+ tid = aep->at_handle; \
+ if (aep->at_flags & AT_TQAE) { \
+ tid |= (aep->at_tag_val << 16); \
+ tid |= (1 << 24); \
+ }
+
+#define CT_MAKE_TAGID(tid, ct) \
+ tid = ct->ct_fwhandle; \
+ if (ct->ct_flags & CT_TQAE) { \
+ tid |= (ct->ct_tag_val << 16); \
+ tid |= (1 << 24); \
+ }
+
+#define AT_HAS_TAG(val) ((val) & (1 << 24))
+#define AT_GET_TAG(val) (((val) >> 16) & 0xff)
+#define AT_GET_HANDLE(val) ((val) & 0xffff)
+
+#define IN_MAKE_TAGID(tid, inp) \
+ tid = inp->in_seqid; \
+ tid |= (inp->in_tag_val << 16); \
+ tid |= (1 << 24)
+
+/*
+ * Accept Target I/O Entry structure, Type 2
+ */
+#define ATIO2_CDBLEN 16
+
+typedef struct {
+ isphdr_t at_header;
+ uint32_t at_reserved;
+ uint8_t at_lun; /* lun or reserved */
+ uint8_t at_iid; /* initiator */
+ uint16_t at_rxid; /* response ID */
+ uint16_t at_flags;
+ uint16_t at_status; /* firmware status */
+ uint8_t at_crn; /* command reference number */
+ uint8_t at_taskcodes;
+ uint8_t at_taskflags;
+ uint8_t at_execodes;
+ uint8_t at_cdb[ATIO2_CDBLEN]; /* received CDB */
+ uint32_t at_datalen; /* allocated data len */
+ uint16_t at_scclun; /* SCC Lun or reserved */
+ uint16_t at_wwpn[4]; /* WWPN of initiator */
+ uint16_t at_reserved2[6];
+ uint16_t at_oxid;
+} at2_entry_t;
+
+typedef struct {
+ isphdr_t at_header;
+ uint32_t at_reserved;
+ uint16_t at_iid; /* initiator */
+ uint16_t at_rxid; /* response ID */
+ uint16_t at_flags;
+ uint16_t at_status; /* firmware status */
+ uint8_t at_crn; /* command reference number */
+ uint8_t at_taskcodes;
+ uint8_t at_taskflags;
+ uint8_t at_execodes;
+ uint8_t at_cdb[ATIO2_CDBLEN]; /* received CDB */
+ uint32_t at_datalen; /* allocated data len */
+ uint16_t at_scclun; /* SCC Lun or reserved */
+ uint16_t at_wwpn[4]; /* WWPN of initiator */
+ uint16_t at_reserved2[6];
+ uint16_t at_oxid;
+} at2e_entry_t;
+
+#define ATIO2_WWPN_OFFSET 0x2A
+#define ATIO2_OXID_OFFSET 0x3E
+
+#define ATIO2_TC_ATTR_MASK 0x7
+#define ATIO2_TC_ATTR_SIMPLEQ 0
+#define ATIO2_TC_ATTR_HEADOFQ 1
+#define ATIO2_TC_ATTR_ORDERED 2
+#define ATIO2_TC_ATTR_ACAQ 4
+#define ATIO2_TC_ATTR_UNTAGGED 5
+
+#define ATIO2_EX_WRITE 0x1
+#define ATIO2_EX_READ 0x2
+/*
+ * Macros to create and fetch and test concatenated handle and tag value macros
+ */
+#define AT2_MAKE_TAGID(tid, bus, inst, aep) \
+ tid = aep->at_rxid; \
+ tid |= (((uint64_t)inst) << 32); \
+ tid |= (((uint64_t)bus) << 48)
+
+#define CT2_MAKE_TAGID(tid, bus, inst, ct) \
+ tid = ct->ct_rxid; \
+ tid |= (((uint64_t)inst) << 32); \
+ tid |= (((uint64_t)(bus & 0xff)) << 48)
+
+#define AT2_HAS_TAG(val) 1
+#define AT2_GET_TAG(val) ((val) & 0xffffffff)
+#define AT2_GET_INST(val) (((val) >> 32) & 0xffff)
+#define AT2_GET_HANDLE AT2_GET_TAG
+#define AT2_GET_BUS(val) (((val) >> 48) & 0xff)
+
+#define FC_HAS_TAG AT2_HAS_TAG
+#define FC_GET_TAG AT2_GET_TAG
+#define FC_GET_INST AT2_GET_INST
+#define FC_GET_HANDLE AT2_GET_HANDLE
+
+#define IN_FC_MAKE_TAGID(tid, bus, inst, seqid) \
+ tid = seqid; \
+ tid |= (((uint64_t)inst) << 32); \
+ tid |= (((uint64_t)(bus & 0xff)) << 48)
+
+#define FC_TAG_INSERT_INST(tid, inst) \
+ tid &= ~0x0000ffff00000000ull; \
+ tid |= (((uint64_t)inst) << 32)
+
+/*
+ * 24XX ATIO Definition
+ *
+ * This is *quite* different from other entry types.
+ * First of all, it has its own queue it comes in on.
+ *
+ * Secondly, it doesn't have a normal header.
+ *
+ * Thirdly, it's just a passthru of the FCP CMND IU
+ * which is recorded in big endian mode.
+ */
+typedef struct {
+ uint8_t at_type;
+ uint8_t at_count;
+ /*
+ * Task attribute in high four bits,
+ * the rest is the FCP CMND IU Length.
+ * NB: the command can extend past the
+ * length for a single queue entry.
+ */
+ uint16_t at_ta_len;
+ uint32_t at_rxid;
+ fc_hdr_t at_hdr;
+ fcp_cmnd_iu_t at_cmnd;
+} at7_entry_t;
+#define AT7_NORESRC_RXID 0xffffffff
+
+
+/*
+ * Continue Target I/O Entry structure
+ * Request from driver. The response from the
+ * ISP firmware is the same except that the last 18
+ * bytes are overwritten by suggested sense data if
+ * the 'autosense valid' bit is set in the status byte.
+ */
+typedef struct {
+ isphdr_t ct_header;
+ uint16_t ct_syshandle;
+ uint16_t ct_fwhandle; /* required by f/w */
+ uint8_t ct_lun; /* lun */
+ uint8_t ct_iid; /* initiator id */
+ uint8_t ct_reserved2;
+ uint8_t ct_tgt; /* our target id */
+ uint32_t ct_flags;
+ uint8_t ct_status; /* isp status */
+ uint8_t ct_scsi_status; /* scsi status */
+ uint8_t ct_tag_val; /* tag value */
+ uint8_t ct_tag_type; /* tag type */
+ uint32_t ct_xfrlen; /* transfer length */
+ int32_t ct_resid; /* residual length */
+ uint16_t ct_timeout;
+ uint16_t ct_seg_count;
+ ispds_t ct_dataseg[ISP_RQDSEG];
+} ct_entry_t;
+
+/*
+ * For some of the dual port SCSI adapters, port (bus #) is reported
+ * in the MSbit of ct_iid. Bit fields are a bit too awkward here.
+ *
+ * Note that this does not apply to FC adapters at all which can and
+ * do report IIDs between 0x81 && 0xfe (or 0x7ff) which represent devices
+ * that have logged in across a SCSI fabric.
+ */
+#define GET_IID_VAL(x) (x & 0x3f)
+#define GET_BUS_VAL(x) ((x >> 7) & 0x1)
+#define SET_IID_VAL(y, x) y = ((y & ~0x3f) | (x & 0x3f))
+#define SET_BUS_VAL(y, x) y = ((y & 0x3f) | ((x & 0x1) << 7))
+
+/*
+ * ct_flags values
+ */
+#define CT_TQAE 0x00000002 /* bit 1, Tagged Queue Action enable */
+#define CT_DATA_IN 0x00000040 /* bits 6&7, Data direction */
+#define CT_DATA_OUT 0x00000080 /* bits 6&7, Data direction */
+#define CT_NO_DATA 0x000000C0 /* bits 6&7, Data direction */
+#define CT_CCINCR 0x00000100 /* bit 8, autoincrement atio count */
+#define CT_DATAMASK 0x000000C0 /* bits 6&7, Data direction */
+#define CT_INISYNCWIDE 0x00004000 /* bit 14, Do Sync/Wide Negotiation */
+#define CT_NODISC 0x00008000 /* bit 15, Disconnects disabled */
+#define CT_DSDP 0x01000000 /* bit 24, Disable Save Data Pointers */
+#define CT_SENDRDP 0x04000000 /* bit 26, Send Restore Pointers msg */
+#define CT_SENDSTATUS 0x80000000 /* bit 31, Send SCSI status byte */
+
+/*
+ * ct_status values
+ * - set by the firmware when it returns the CTIO
+ */
+#define CT_OK 0x01 /* completed without error */
+#define CT_ABORTED 0x02 /* aborted by host */
+#define CT_ERR 0x04 /* see sense data for error */
+#define CT_INVAL 0x06 /* request for disabled lun */
+#define CT_NOPATH 0x07 /* invalid ITL nexus */
+#define CT_INVRXID 0x08 /* (FC only) Invalid RX_ID */
+#define CT_DATA_OVER 0x09 /* (FC only) Data Overrun */
+#define CT_RSELTMO 0x0A /* reselection timeout after 2 tries */
+#define CT_TIMEOUT 0x0B /* timed out */
+#define CT_RESET 0x0E /* SCSI Bus Reset occurred */
+#define CT_PARITY 0x0F /* Uncorrectable Parity Error */
+#define CT_BUS_ERROR 0x10 /* (FC Only) DMA PCI Error */
+#define CT_PANIC 0x13 /* Unrecoverable Error */
+#define CT_PHASE_ERROR 0x14 /* Bus phase sequence error */
+#define CT_DATA_UNDER 0x15 /* (FC only) Data Underrun */
+#define CT_BDR_MSG 0x17 /* Bus Device Reset msg received */
+#define CT_TERMINATED 0x19 /* due to Terminate Transfer mbox cmd */
+#define CT_PORTUNAVAIL 0x28 /* port not available */
+#define CT_LOGOUT 0x29 /* port logout */
+#define CT_PORTCHANGED 0x2A /* port changed */
+#define CT_IDE 0x33 /* Initiator Detected Error */
+#define CT_NOACK 0x35 /* Outstanding Immed. Notify. entry */
+#define CT_SRR 0x45 /* SRR Received */
+#define CT_LUN_RESET 0x48 /* Lun Reset Received */
+
+#define CT_HBA_RESET 0xffff /* pseudo error - command destroyed by HBA reset*/
+
+/*
+ * When the firmware returns a CTIO entry, it may overwrite the last
+ * part of the structure with sense data. This starts at offset 0x2E
+ * into the entry, which is in the middle of ct_dataseg[1]. Rather
+ * than define a new struct for this, I'm just using the sense data
+ * offset.
+ */
+#define CTIO_SENSE_OFFSET 0x2E
+
+/*
+ * Entry length in u_longs. All entries are the same size so
+ * any one will do as the numerator.
+ */
+#define UINT32_ENTRY_SIZE (sizeof(at_entry_t)/sizeof(uint32_t))
+
+/*
+ * QLA2100 CTIO (type 2) entry
+ */
+#define MAXRESPLEN 26
+typedef struct {
+ isphdr_t ct_header;
+ uint32_t ct_syshandle;
+ uint8_t ct_lun; /* lun */
+ uint8_t ct_iid; /* initiator id */
+ uint16_t ct_rxid; /* response ID */
+ uint16_t ct_flags;
+ uint16_t ct_status; /* isp status */
+ uint16_t ct_timeout;
+ uint16_t ct_seg_count;
+ uint32_t ct_reloff; /* relative offset */
+ int32_t ct_resid; /* residual length */
+ union {
+ /*
+ * The three different modes that the target driver
+ * can set the CTIO{2,3,4} up as.
+ *
+ * The first is for sending FCP_DATA_IUs as well as
+ * (optionally) sending a terminal SCSI status FCP_RSP_IU.
+ *
+ * The second is for sending SCSI sense data in an FCP_RSP_IU.
+ * Note that no FCP_DATA_IUs will be sent.
+ *
+ * The third is for sending FCP_RSP_IUs as built specifically
+ * in system memory as located by the isp_dataseg.
+ */
+ struct {
+ uint32_t _reserved;
+ uint16_t _reserved2;
+ uint16_t ct_scsi_status;
+ uint32_t ct_xfrlen;
+ union {
+ ispds_t ct_dataseg[ISP_RQDSEG_T2];
+ ispds64_t ct_dataseg64[ISP_RQDSEG_T3];
+ ispdslist_t ct_dslist;
+ } u;
+ } m0;
+ struct {
+ uint16_t _reserved;
+ uint16_t _reserved2;
+ uint16_t ct_senselen;
+ uint16_t ct_scsi_status;
+ uint16_t ct_resplen;
+ uint8_t ct_resp[MAXRESPLEN];
+ } m1;
+ struct {
+ uint32_t _reserved;
+ uint16_t _reserved2;
+ uint16_t _reserved3;
+ uint32_t ct_datalen;
+ ispds_t ct_fcp_rsp_iudata;
+ } m2;
+ } rsp;
+} ct2_entry_t;
+
+typedef struct {
+ isphdr_t ct_header;
+ uint32_t ct_syshandle;
+ uint16_t ct_iid; /* initiator id */
+ uint16_t ct_rxid; /* response ID */
+ uint16_t ct_flags;
+ uint16_t ct_status; /* isp status */
+ uint16_t ct_timeout;
+ uint16_t ct_seg_count;
+ uint32_t ct_reloff; /* relative offset */
+ int32_t ct_resid; /* residual length */
+ union {
+ struct {
+ uint32_t _reserved;
+ uint16_t _reserved2;
+ uint16_t ct_scsi_status;
+ uint32_t ct_xfrlen;
+ union {
+ ispds_t ct_dataseg[ISP_RQDSEG_T2];
+ ispds64_t ct_dataseg64[ISP_RQDSEG_T3];
+ ispdslist_t ct_dslist;
+ } u;
+ } m0;
+ struct {
+ uint16_t _reserved;
+ uint16_t _reserved2;
+ uint16_t ct_senselen;
+ uint16_t ct_scsi_status;
+ uint16_t ct_resplen;
+ uint8_t ct_resp[MAXRESPLEN];
+ } m1;
+ struct {
+ uint32_t _reserved;
+ uint16_t _reserved2;
+ uint16_t _reserved3;
+ uint32_t ct_datalen;
+ ispds_t ct_fcp_rsp_iudata;
+ } m2;
+ } rsp;
+} ct2e_entry_t;
+
+/*
+ * ct_flags values for CTIO2
+ */
+#define CT2_FLAG_MODE0 0x0000
+#define CT2_FLAG_MODE1 0x0001
+#define CT2_FLAG_MODE2 0x0002
+#define CT2_FLAG_MMASK 0x0003
+#define CT2_DATA_IN 0x0040
+#define CT2_DATA_OUT 0x0080
+#define CT2_NO_DATA 0x00C0
+#define CT2_DATAMASK 0x00C0
+#define CT2_CCINCR 0x0100
+#define CT2_FASTPOST 0x0200
+#define CT2_CONFIRM 0x2000
+#define CT2_TERMINATE 0x4000
+#define CT2_SENDSTATUS 0x8000
+
+/*
+ * ct_status values are (mostly) the same as that for ct_entry.
+ */
+
+/*
+ * ct_scsi_status values- the low 8 bits are the normal SCSI status
+ * we know and love. The upper 8 bits are validity markers for FCP_RSP_IU
+ * fields.
+ */
+#define CT2_RSPLEN_VALID 0x0100
+#define CT2_SNSLEN_VALID 0x0200
+#define CT2_DATA_OVER 0x0400
+#define CT2_DATA_UNDER 0x0800
+
+/*
+ * ISP24XX CTIO
+ */
+#define MAXRESPLEN_24XX 24
+typedef struct {
+ isphdr_t ct_header;
+ uint32_t ct_syshandle;
+ uint16_t ct_nphdl; /* status on returned CTIOs */
+ uint16_t ct_timeout;
+ uint16_t ct_seg_count;
+ uint8_t ct_vpidx;
+ uint8_t ct_xflags;
+ uint16_t ct_iid_lo; /* low 16 bits of portid */
+ uint8_t ct_iid_hi; /* hi 8 bits of portid */
+ uint8_t ct_reserved;
+ uint32_t ct_rxid;
+ uint16_t ct_senselen; /* mode 1 only */
+ uint16_t ct_flags;
+ int32_t ct_resid; /* residual length */
+ uint16_t ct_oxid;
+ uint16_t ct_scsi_status; /* modes 0 && 1 only */
+ union {
+ struct {
+ uint32_t reloff;
+ uint32_t reserved0;
+ uint32_t ct_xfrlen;
+ uint32_t reserved1;
+ ispds64_t ds;
+ } m0;
+ struct {
+ uint16_t ct_resplen;
+ uint16_t reserved;
+ uint8_t ct_resp[MAXRESPLEN_24XX];
+ } m1;
+ struct {
+ uint32_t reserved0;
+ uint32_t ct_datalen;
+ uint32_t reserved1;
+ ispds64_t ct_fcp_rsp_iudata;
+ } m2;
+ } rsp;
+} ct7_entry_t;
+
+/*
+ * ct_flags values for CTIO7
+ */
+#define CT7_DATA_IN 0x0002
+#define CT7_DATA_OUT 0x0001
+#define CT7_NO_DATA 0x0000
+#define CT7_DATAMASK 0x003
+#define CT7_DSD_ENABLE 0x0004
+#define CT7_CONF_STSFD 0x0010
+#define CT7_EXPLCT_CONF 0x0020
+#define CT7_FLAG_MODE0 0x0000
+#define CT7_FLAG_MODE1 0x0040
+#define CT7_FLAG_MODE2 0x0080
+#define CT7_FLAG_MMASK 0x00C0
+#define CT7_NOACK 0x0100
+#define CT7_TASK_ATTR_SHIFT 9
+#define CT7_CONFIRM 0x2000
+#define CT7_TERMINATE 0x4000
+#define CT7_SENDSTATUS 0x8000
+
+/*
+ * Type 7 CTIO status codes
+ */
+#define CT7_OK 0x01 /* completed without error */
+#define CT7_ABORTED 0x02 /* aborted by host */
+#define CT7_ERR 0x04 /* see sense data for error */
+#define CT7_INVAL 0x06 /* request for disabled lun */
+#define CT7_INVRXID 0x08 /* Invalid RX_ID */
+#define CT7_DATA_OVER 0x09 /* Data Overrun */
+#define CT7_TIMEOUT 0x0B /* timed out */
+#define CT7_RESET 0x0E /* LIP Rset Received */
+#define CT7_BUS_ERROR 0x10 /* DMA PCI Error */
+#define CT7_REASSY_ERR 0x11 /* DMA reassembly error */
+#define CT7_DATA_UNDER 0x15 /* Data Underrun */
+#define CT7_PORTUNAVAIL 0x28 /* port not available */
+#define CT7_LOGOUT 0x29 /* port logout */
+#define CT7_PORTCHANGED 0x2A /* port changed */
+#define CT7_SRR 0x45 /* SRR Received */
+
+/*
+ * Other 24XX related target IOCBs
+ */
+
+/*
+ * ABTS Received
+ */
+typedef struct {
+ isphdr_t abts_header;
+ uint8_t abts_reserved0[6];
+ uint16_t abts_nphdl;
+ uint16_t abts_reserved1;
+ uint16_t abts_sof;
+ uint32_t abts_rxid_abts;
+ uint16_t abts_did_lo;
+ uint8_t abts_did_hi;
+ uint8_t abts_r_ctl;
+ uint16_t abts_sid_lo;
+ uint8_t abts_sid_hi;
+ uint8_t abts_cs_ctl;
+ uint16_t abts_fs_ctl;
+ uint8_t abts_f_ctl;
+ uint8_t abts_type;
+ uint16_t abts_seq_cnt;
+ uint8_t abts_df_ctl;
+ uint8_t abts_seq_id;
+ uint16_t abts_rx_id;
+ uint16_t abts_ox_id;
+ uint32_t abts_param;
+ uint8_t abts_reserved2[16];
+ uint32_t abts_rxid_task;
+} abts_t;
+
+typedef struct {
+ isphdr_t abts_rsp_header;
+ uint32_t abts_rsp_handle;
+ uint16_t abts_rsp_status;
+ uint16_t abts_rsp_nphdl;
+ uint16_t abts_rsp_ctl_flags;
+ uint16_t abts_rsp_sof;
+ uint32_t abts_rsp_rxid_abts;
+ uint16_t abts_rsp_did_lo;
+ uint8_t abts_rsp_did_hi;
+ uint8_t abts_rsp_r_ctl;
+ uint16_t abts_rsp_sid_lo;
+ uint8_t abts_rsp_sid_hi;
+ uint8_t abts_rsp_cs_ctl;
+ uint16_t abts_rsp_f_ctl_lo;
+ uint8_t abts_rsp_f_ctl_hi;
+ uint8_t abts_rsp_type;
+ uint16_t abts_rsp_seq_cnt;
+ uint8_t abts_rsp_df_ctl;
+ uint8_t abts_rsp_seq_id;
+ uint16_t abts_rsp_rx_id;
+ uint16_t abts_rsp_ox_id;
+ uint32_t abts_rsp_param;
+ union {
+ struct {
+ uint16_t reserved;
+ uint8_t last_seq_id;
+ uint8_t seq_id_valid;
+ uint16_t aborted_rx_id;
+ uint16_t aborted_ox_id;
+ uint16_t high_seq_cnt;
+ uint16_t low_seq_cnt;
+ uint8_t reserved2[4];
+ } ba_acc;
+ struct {
+ uint8_t vendor_unique;
+ uint8_t explanation;
+ uint8_t reason;
+ uint8_t reserved;
+ uint8_t reserved2[12];
+ } ba_rjt;
+ struct {
+ uint8_t reserved[8];
+ uint32_t subcode1;
+ uint32_t subcode2;
+ } rsp;
+ uint8_t reserved[16];
+ } abts_rsp_payload;
+ uint32_t abts_rsp_rxid_task;
+} abts_rsp_t;
+
+/* terminate this ABTS exchange */
+#define ISP24XX_ABTS_RSP_TERMINATE 0x01
+
+#define ISP24XX_ABTS_RSP_COMPLETE 0x00
+#define ISP24XX_ABTS_RSP_RESET 0x04
+#define ISP24XX_ABTS_RSP_ABORTED 0x05
+#define ISP24XX_ABTS_RSP_TIMEOUT 0x06
+#define ISP24XX_ABTS_RSP_INVXID 0x08
+#define ISP24XX_ABTS_RSP_LOGOUT 0x29
+#define ISP24XX_ABTS_RSP_SUBCODE 0x31
+
+#define ISP24XX_NO_TASK 0xffffffff
+
+/*
+ * Miscellaneous
+ *
+ * These are the limits of the number of dma segments we
+ * can deal with based not on the size of the segment counter
+ * (which is 16 bits), but on the size of the number of
+ * queue entries field (which is 8 bits). We assume no
+ * segments in the first queue entry, so we can either
+ * have 7 dma segments per continuation entry or 5
+ * (for 64 bit dma).. multiplying out by 254....
+ */
+#define ISP_NSEG_MAX 1778
+#define ISP_NSEG64_MAX 1270
+
#endif /* _ISPMBOX_H */
OpenPOWER on IntegriCloud