Print this page
NEX-5717 import QLogic 16G FC drivers
Reviewed by: Steve Peng <steve.peng@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
        
@@ -17,11 +17,11 @@
  * information: Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
  */
 
-/* Copyright 2010 QLogic Corporation */
+/* Copyright 2015 QLogic Corporation */
 
 /*
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
@@ -32,11 +32,11 @@
  * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver header file.
  *
  * ***********************************************************************
  * *                                                                    **
  * *                            NOTICE                                  **
- * *            COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION              **
+ * *            COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION              **
  * *                    ALL RIGHTS RESERVED                             **
  * *                                                                    **
  * ***********************************************************************
  *
  */
@@ -43,12 +43,22 @@
 
 #ifdef  __cplusplus
 extern "C" {
 #endif
 
-#define INVALID_ENTRY_TYPE      0
+typedef struct ql_64bit_data_seg {
+        uint32_t        address[2];
+        uint32_t        length;
+} ql_64bit_data_seg_t;
 
+typedef struct ql_32bit_data_seg {
+        uint32_t        address;
+        uint32_t        length;
+} ql_32bit_data_seg_t;
+
+#define ABORTED_ENTRY_TYPE      0
+
 /*
  * ISP queue -  32-Bit DMA addressing command with extended LUN support
  *              entry structure definition.
  */
 #define IOCB_CMD_TYPE_2         0x11    /* Command entry */
@@ -69,16 +79,11 @@
         uint8_t  reserved_1[2];
         uint16_t timeout;               /* Command timeout. */
         uint16_t dseg_count;            /* Data segment count - LSB. */
         uint8_t  scsi_cdb[MAX_CMDSZ];   /* SCSI command words. */
         uint32_t byte_count;            /* Total byte count. */
-        uint32_t dseg_0_address;        /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
-        uint32_t dseg_1_address;        /* Data segment 1 address. */
-        uint32_t dseg_1_length;         /* Data segment 1 length. */
-        uint32_t dseg_2_address;        /* Data segment 2 address. */
-        uint32_t dseg_2_length;         /* Data segment 2 length. */
+        ql_32bit_data_seg_t     dseg[3];        /* Data segments. */
 } cmd_entry_t, request_t;
 
 /*
  * Command entry control flags least significant byte.
  */
@@ -110,12 +115,11 @@
         uint8_t  crn;                   /* Command reference number. */
         uint8_t  scsi_cdb[MAX_CMDSZ];   /* SCSI command bytes. */
         uint32_t total_byte_count;
         uint8_t  target_id[3];          /* SCSI Target ID */
         uint8_t  vp_index;
-        uint32_t dseg_0_address[2];     /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
+        ql_64bit_data_seg_t     dseg;           /* Data segments. */
 } cmd7_24xx_entry_t;
 
 /*
  * ISP24xx queue - Command IOCB structure definition.
  */
@@ -137,12 +141,11 @@
         uint32_t cmnd_address[2];
         uint32_t rsp_address[2];        /* Data segment 0 address. */
         uint32_t total_byte_count;
         uint8_t  target_id[3];          /* SCSI Target ID */
         uint8_t  vp_index;
-        uint32_t dseg_0_address[2];     /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
+        ql_64bit_data_seg_t     dseg;           /* Data segments. */
 } cmd6_24xx_entry_t;
 
 typedef struct fcp_cmnd {
         uint8_t         fcp_lun[8];             /* SCSI LUN ID. */
         uint8_t         crn;                    /* Command reference number. */
@@ -203,14 +206,11 @@
         uint8_t  reserved_1[2];
         uint16_t timeout;               /* Command timeout. */
         uint16_t dseg_count;            /* Data segment count - LSB. */
         uint8_t  scsi_cdb[MAX_CMDSZ];   /* SCSI command words. */
         uint32_t byte_count;            /* Total byte count. */
-        uint32_t dseg_0_address[2];     /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
-        uint32_t dseg_1_address[2];     /* Data segment 1 address. */
-        uint32_t dseg_1_length;         /* Data segment 1 length. */
+        ql_64bit_data_seg_t     dseg[2];        /* Data segments. */
 } cmd_3_entry_t;
 
 /*
  * ISP queue -  Command type 4 DSD list pointer structure definition.
  */
@@ -250,24 +250,11 @@
         uint8_t entry_type;             /* Entry type. */
         uint8_t entry_count;            /* Entry count. */
         uint8_t sys_define;             /* System defined. */
         uint8_t entry_status;           /* Entry Status. */
         uint32_t reserved;
-        uint32_t dseg_0_address;        /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
-        uint32_t dseg_1_address;        /* Data segment 1 address. */
-        uint32_t dseg_1_length;         /* Data segment 1 length. */
-        uint32_t dseg_2_address;        /* Data segment 2 address. */
-        uint32_t dseg_2_length;         /* Data segment 2 length. */
-        uint32_t dseg_3_address;        /* Data segment 3 address. */
-        uint32_t dseg_3_length;         /* Data segment 3 length. */
-        uint32_t dseg_4_address;        /* Data segment 4 address. */
-        uint32_t dseg_4_length;         /* Data segment 4 length. */
-        uint32_t dseg_5_address;        /* Data segment 5 address. */
-        uint32_t dseg_5_length;         /* Data segment 5 length. */
-        uint32_t dseg_6_address;        /* Data segment 6 address. */
-        uint32_t dseg_6_length;         /* Data segment 6 length. */
+        ql_32bit_data_seg_t     dseg[7];        /* Data segments. */
 } cont_entry_t;
 
 /*
  * ISP queue - 64-Bit addressing, continuation entry structure definition.
  */
@@ -276,20 +263,11 @@
 typedef struct cont_type_1_entry {
         uint8_t entry_type;             /* Entry type. */
         uint8_t entry_count;            /* Entry count. */
         uint8_t sys_define;             /* System defined. */
         uint8_t entry_status;           /* Entry Status. */
-        uint32_t dseg_0_address[2];     /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
-        uint32_t dseg_1_address[2];     /* Data segment 1 address. */
-        uint32_t dseg_1_length;         /* Data segment 1 length. */
-        uint32_t dseg_2_address[2];     /* Data segment 2 address. */
-        uint32_t dseg_2_length;         /* Data segment 2 length. */
-        uint32_t dseg_3_address[2];     /* Data segment 3 address. */
-        uint32_t dseg_3_length;         /* Data segment 3 length. */
-        uint32_t dseg_4_address[2];     /* Data segment 4 address. */
-        uint32_t dseg_4_length;         /* Data segment 4 length. */
+        ql_64bit_data_seg_t     dseg[5];        /* Data segments. */
 } cont_type_1_entry_t;
 
 /*
  * ISP queue - status entry structure definition.
  */
@@ -383,10 +361,11 @@
 #define CS_RESOUCE_UNAVAILABLE  0x2C    /* Frimware resource unavailable. */
 #define CS_TASK_MGMT_OVERRUN    0x30    /* Task management overrun. */
 #define CS_LOGIN_LOGOUT_ERROR   0x31    /* login/logout IOCB error. */
 #define CS_SEQ_COMPLETE         0x40    /* Sequence Complete. */
 #define CS_ABORTED_SEQ_REC      0x47    /* Abort sequence was received. */
+#define CS_DEV_NOT_READY        0x81    /* Device not ready */
 #define CS_INVALID_PARAMETER    0x102   /* IP invalid_parameter. */
 #define CS_ERROR_RESOURCE       0x103   /* IP insufficient resources. */
 #define CS_IP_NOT_INITIALIZED   0x104   /* IP not_initialized. */
 
 #define CS_BAD_PAYLOAD          0x180   /* Driver defined */
@@ -501,16 +480,15 @@
         uint8_t  cmd_dseg_count_h;      /* CMD segment count - MSB. */
         uint16_t total_dseg_count;      /* CMD + RESP segment count. */
         uint8_t  reserved_2[10];
         uint32_t resp_byte_count;       /* Response byte count */
         uint32_t cmd_byte_count;        /* Command byte count */
-        uint32_t dseg_0_address[2];     /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
-        uint32_t dseg_1_address[2];     /* Data segment 1 address. */
-        uint32_t dseg_1_length;         /* Data segment 1 length. */
+        ql_64bit_data_seg_t     dseg[2];        /* Data segments. */
 } ms_entry_t;
 
+#define CF_ELS_PASSTHROUGH      BIT_7   /* MSB */
+
 /*
  * ISP24xx queue - CT Pass-Through IOCB structure definition.
  */
 #define CT_PASSTHRU_TYPE                0x29
 #define CT_PASSTHRU_DATA_SEGMENTS       1       /* Number of data segments. */
@@ -529,14 +507,11 @@
         uint16_t reserved_1;
         uint16_t resp_dseg_count;
         uint8_t  reserved_2[10];
         uint32_t resp_byte_count;
         uint32_t cmd_byte_count;
-        uint32_t dseg_0_address[2];     /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
-        uint32_t dseg_1_address[2];     /* Data segment 1 address. */
-        uint32_t dseg_1_length;         /* Data segment 1 length. */
+        ql_64bit_data_seg_t     dseg[2];        /* Data segments. */
 } ct_passthru_entry_t;
 
 /*
  * ISP24xx queue - ELS Pass-Through IOCB structure definition.
  */
@@ -563,14 +538,11 @@
         uint8_t  s_id_7_0;
         uint8_t  s_id_15_8;
         uint16_t control_flags;
         uint32_t rcv_payld_data_bcnt;
         uint32_t xmt_payld_data_bcnt;
-        uint32_t xmt_dseg_0_address[2]; /* Tx Data segment 0 address. */
-        uint32_t xmt_dseg_0_length;     /* Tx Data segment 0 length.  */
-        uint32_t rcv_dseg_0_address[2]; /* Rx Data segment 0 address. */
-        uint32_t rcv_dseg_0_length;     /* Rx Data segment 0 length.  */
+        ql_64bit_data_seg_t     dseg[2];        /* Data segments. */
 } els_passthru_entry_t;
 
 /*
  * ISP24x queue - ELS Pass-Through IOCB response.
  */
@@ -954,27 +926,19 @@
                 struct {
                         uint8_t  reserved_2[2];
                         uint8_t  scsi_status_l;
                         uint8_t  scsi_status_h;
                         uint32_t byte_count;
-                        uint32_t dseg_0_address;
-                        uint32_t dseg_0_length;
-                        uint32_t dseg_1_address;
-                        uint32_t dseg_1_length;
-                        uint32_t dseg_2_address;
-                        uint32_t dseg_2_length;
+                        ql_32bit_data_seg_t     dseg[3];
                 }s0_32bit;
 
                 struct {
                         uint8_t  reserved_3[2];
                         uint8_t  scsi_status_l;
                         uint8_t  scsi_status_h;
                         uint32_t byte_count;
-                        uint32_t dseg_0_address[2];
-                        uint32_t dseg_0_length;
-                        uint32_t dseg_1_address[2];
-                        uint32_t dseg_1_length;
+                        ql_64bit_data_seg_t     dseg[2];
                 }s0_64bit;
 
                 struct {
                         uint8_t  sense_length_l;
                         uint8_t  sense_length_h;
@@ -1023,13 +987,11 @@
                         uint16_t scsi_status;
                         uint32_t relative_offset;
                         uint32_t reserved_3;
                         uint32_t transfer_length;
                         uint32_t reserved_4;
-                        uint32_t dseg_0_address_l;
-                        uint32_t dseg_0_address_h;
-                        uint32_t dseg_0_length;
+                        ql_64bit_data_seg_t     dseg;
                 }s0;
 
                 struct {
                         uint16_t sense_length;
                         uint16_t flags;
@@ -1047,13 +1009,11 @@
                         uint32_t residual_length;
                         uint16_t ox_id;
                         uint8_t  reserved_3[10];
                         uint32_t transfer_length;
                         uint32_t reserved_4;
-                        uint32_t dseg_0_address_l;
-                        uint32_t dseg_0_address_h;
-                        uint32_t dseg_0_length;
+                        ql_64bit_data_seg_t     dseg;
                 }s2;
         }type;
 } ctio_snd_entry_t;
 
 /*
@@ -1086,13 +1046,11 @@
                         uint16_t scsi_status;
                         uint32_t relative_offset;
                         uint32_t reserved_3;
                         uint32_t transfer_length;
                         uint32_t reserved_4;
-                        uint32_t dseg_0_address_l;
-                        uint32_t dseg_0_address_h;
-                        uint32_t dseg_0_length;
+                        ql_64bit_data_seg_t     dseg;
                 }s0;
 
                 struct {
                         uint16_t sense_length;
                         uint16_t flags;
@@ -1110,13 +1068,11 @@
                         uint32_t residual_length;
                         uint16_t ox_id;
                         uint8_t  reserved_3[10];
                         uint32_t transfer_length;
                         uint32_t reserved_4;
-                        uint32_t dseg_0_address_l;
-                        uint32_t dseg_0_address_h;
-                        uint32_t dseg_0_length;
+                        ql_64bit_data_seg_t     dseg;
                 }s2;
         }type;
 } ctio_rcv_entry_t;
 
 /*
@@ -1138,16 +1094,11 @@
         uint8_t  reserved_1[2];
         uint16_t timeout;               /* Command timeout. */
         uint16_t dseg_count;            /* Data segment count. */
         uint8_t  reserved_2[16];
         uint32_t byte_count;            /* Total byte count. */
-        uint32_t dseg_0_address;        /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
-        uint32_t dseg_1_address;        /* Data segment 1 address. */
-        uint32_t dseg_1_length;         /* Data segment 1 length. */
-        uint32_t dseg_2_address;        /* Data segment 2 address. */
-        uint32_t dseg_2_length;         /* Data segment 2 length. */
+        ql_32bit_data_seg_t     dseg[3];        /* Data segments. */
 } ip_entry_t;
 
 /*
  * ISP queue -  64-Bit DMA addressing IP entry structure definition.
  */
@@ -1167,14 +1118,11 @@
         uint8_t  reserved_1[2];
         uint16_t timeout;               /* Command timeout. */
         uint16_t dseg_count;            /* Data segment count. */
         uint8_t  reserved_2[16];
         uint32_t byte_count;            /* Total byte count. */
-        uint32_t dseg_0_address[2];     /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
-        uint32_t dseg_1_address[2];     /* Data segment 1 address. */
-        uint32_t dseg_1_length;         /* Data segment 1 length. */
+        ql_64bit_data_seg_t     dseg[2];        /* Data segments. */
 } ip_a64_entry_t;
 
 /*
  * ISP24xx queue - IP command entry structure definition.
  */
@@ -1195,12 +1143,11 @@
         uint16_t frame_hdr_cntrl_flgs;
         uint8_t  reserved_2[12];
         uint32_t sys_define_2;
         uint32_t byte_count;            /* Total byte count. */
         uint8_t  reserved_3[4];
-        uint32_t dseg_0_address[2];     /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
+        ql_64bit_data_seg_t     dseg;   /* Data segments. */
 } ip_cmd_entry_t;
 
 /*
  * IP command Control Flags.
  */
@@ -1365,12 +1312,12 @@
         uint8_t  entry_type;            /* Entry type. */
         uint8_t  entry_count;           /* Entry count. */
         uint8_t  sys_define;            /* System defined. */
         uint8_t  entry_status;          /* Entry Status. */
         uint32_t handle;                /* System handle */
-        uint8_t  acq_cnt;               /* format 0 acquired, format 1 count */
-        uint8_t  setup;                 /* format 0 */
+        uint8_t vp_acquired;
+        uint8_t vp_setup;
         uint8_t  reserved[2];
         uint8_t  port_id[3];
         uint8_t  format;
         uint8_t  vp_index[16];
         uint8_t  reserved_1[32];
@@ -1382,16 +1329,40 @@
         uint8_t  sys_define;            /* System defined. */
         uint8_t  entry_status;          /* Entry Status. */
         uint32_t handle;                /* System handle */
         uint16_t vp_count;
         uint8_t  vp_index;
-        uint8_t  status;
+        uint8_t vp_status;
         uint8_t  port_id[3];
         uint8_t  format;
         uint8_t  reserved[48];
 } report_id_1_t;
 
+typedef struct report_id_acq {
+        uint8_t entry_type;             /* Entry type. */
+        uint8_t entry_count;            /* Entry count. */
+        uint8_t sys_define;             /* System defined. */
+        uint8_t entry_status;           /* Entry Status. */
+        uint32_t handle;                /* System handle */
+        uint8_t vp_acquired;
+        uint8_t vp_setup;
+        uint8_t vp_index;
+        uint8_t vp_status;
+        uint8_t port_id[3];
+        uint8_t format;
+        uint8_t status_subcode;
+        uint8_t flags;
+        uint16_t fip_flags;
+        uint16_t fcf_index;
+        uint16_t mac[3];
+        uint8_t reserved[4];
+        uint8_t ls_rjt_subcode;
+        uint8_t ls_rjt_explanation;
+        uint8_t ls_rjt_reason_code;
+        uint8_t reserved_1[29];
+} report_id_acq_t;
+
 /*
  * ISP2400 queue - Verify Menlo FW entry structure definition.
  */
 #define VERIFY_MENLO_TYPE       0x1b
 typedef struct vfy_menlo_entry {
@@ -1408,12 +1379,11 @@
         uint32_t exch_addr;
         uint32_t reserved_2[3];
         uint32_t fw_size;
         uint32_t fw_sequence_size;
         uint32_t relative_offset;
-        uint32_t dseg_0_address[2];     /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
+        ql_64bit_data_seg_t     dseg;   /* Data segments. */
 } vfy_menlo_entry_t;
 
 /*
  * Option Flags.
  */
@@ -1442,12 +1412,11 @@
         uint32_t parameter_2;
         uint32_t parameter_3;
         uint32_t reserved_2[3];
         uint32_t total_byte_count;
         uint32_t reserved_3;
-        uint32_t dseg_0_address[2];     /* Data segment 0 address. */
-        uint32_t dseg_0_length;         /* Data segment 0 length. */
+        ql_64bit_data_seg_t     dseg;   /* Data segments. */
 } menlo_data_entry_t;
 
 /*
  * Mailbox IOCB.
  */
@@ -1464,10 +1433,11 @@
         log_entry_t             log;
         vp_control_entry_t      vpc;
         vp_modify_entry_t       vpm;
         vfy_menlo_entry_t       mvfy;
         menlo_data_entry_t      mdata;
+        els_passthru_entry_t    els;
 } ql_mbx_iocb_t;
 
 /*
  * Global Data in ql_iocb.c source file.
  */
@@ -1474,20 +1444,22 @@
 
 /*
  * Global Function Prototypes in ql_iocb.c source file.
  */
 void ql_start_iocb(ql_adapter_state_t *, ql_srb_t *);
-void ql_isp_cmd(ql_adapter_state_t *);
-int ql_marker(ql_adapter_state_t *, uint16_t, uint16_t, uint8_t);
+int ql_marker(ql_adapter_state_t *, uint16_t, ql_lun_t *lq, uint8_t);
 void ql_isp_rcvbuf(ql_adapter_state_t *);
-void ql_command_iocb(ql_adapter_state_t *, ql_srb_t *, void *);
-void ql_ms_iocb(ql_adapter_state_t *, ql_srb_t *, void *);
-void ql_ip_iocb(ql_adapter_state_t *, ql_srb_t *, void *);
-void ql_command_24xx_iocb(ql_adapter_state_t *, ql_srb_t *, void *);
-void ql_ms_24xx_iocb(ql_adapter_state_t *, ql_srb_t *, void *);
-void ql_ip_24xx_iocb(ql_adapter_state_t *, ql_srb_t *, void *);
-void ql_els_24xx_iocb(ql_adapter_state_t *, ql_srb_t *, void *);
+void ql_command_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *,
+    void *);
+void ql_ms_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *, void *);
+void ql_ip_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *, void *);
+void ql_command_24xx_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *,
+    void *);
+void ql_ms_24xx_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *,
+    void *);
+void ql_ip_24xx_iocb(ql_adapter_state_t *, ql_request_q_t *, ql_srb_t *,
+    void *);
 
 #ifdef  __cplusplus
 }
 #endif