[SCSI] qla2xxx: Add ISP25XX support.
[safe/jmp/linux-2.6] / drivers / scsi / qla2xxx / qla_def.h
index e83e4a3..0c9f36c 100644 (file)
@@ -1478,14 +1478,17 @@ typedef union {
        uint32_t b24 : 24;
 
        struct {
-               uint8_t d_id[3];
-               uint8_t rsvd_1;
-       } r;
-
-       struct {
+#ifdef __BIG_ENDIAN
+               uint8_t domain;
+               uint8_t area;
+               uint8_t al_pa;
+#elif __LITTLE_ENDIAN
                uint8_t al_pa;
                uint8_t area;
                uint8_t domain;
+#else
+#error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined!"
+#endif
                uint8_t rsvd_1;
        } b;
 } port_id_t;
@@ -1548,6 +1551,9 @@ typedef struct fc_port {
 
        unsigned long last_queue_full;
        unsigned long last_ramp_up;
+
+       struct list_head vp_fcport;
+       uint16_t vp_idx;
 } fc_port_t;
 
 /*
@@ -1602,6 +1608,7 @@ typedef struct fc_port {
 
 #define CT_REJECT_RESPONSE     0x8001
 #define CT_ACCEPT_RESPONSE     0x8002
+#define CT_REASON_INVALID_COMMAND_CODE 0x01
 #define CT_REASON_CANNOT_PERFORM       0x09
 #define CT_EXPL_ALREADY_REGISTERED     0x10
 
@@ -1704,6 +1711,14 @@ struct ct_fdmi_hba_attributes {
 #define FDMI_PORT_OS_DEVICE_NAME       5
 #define FDMI_PORT_HOST_NAME            6
 
+#define FDMI_PORT_SPEED_1GB            0x1
+#define FDMI_PORT_SPEED_2GB            0x2
+#define FDMI_PORT_SPEED_10GB           0x4
+#define FDMI_PORT_SPEED_4GB            0x8
+#define FDMI_PORT_SPEED_8GB            0x10
+#define FDMI_PORT_SPEED_16GB           0x20
+#define FDMI_PORT_SPEED_UNKNOWN                0x8000
+
 struct ct_fdmi_port_attr {
        uint16_t type;
        uint16_t len;
@@ -1995,6 +2010,36 @@ struct gid_list_info {
 };
 #define GID_LIST_SIZE (sizeof(struct gid_list_info) * MAX_FIBRE_DEVICES)
 
+/* NPIV */
+typedef struct vport_info {
+       uint8_t         port_name[WWN_SIZE];
+       uint8_t         node_name[WWN_SIZE];
+       int             vp_id;
+       uint16_t        loop_id;
+       unsigned long   host_no;
+       uint8_t         port_id[3];
+       int             loop_state;
+} vport_info_t;
+
+typedef struct vport_params {
+       uint8_t         port_name[WWN_SIZE];
+       uint8_t         node_name[WWN_SIZE];
+       uint32_t        options;
+#define        VP_OPTS_RETRY_ENABLE    BIT_0
+#define        VP_OPTS_VP_DISABLE      BIT_1
+} vport_params_t;
+
+/* NPIV - return codes of VP create and modify */
+#define VP_RET_CODE_OK                 0
+#define VP_RET_CODE_FATAL              1
+#define VP_RET_CODE_WRONG_ID           2
+#define VP_RET_CODE_WWPN               3
+#define VP_RET_CODE_RESOURCES          4
+#define VP_RET_CODE_NO_MEM             5
+#define VP_RET_CODE_NOT_FOUND          6
+
+#define to_qla_parent(x) (((x)->parent) ? (x)->parent : (x))
+
 /*
  * ISP operations
  */
@@ -2069,6 +2114,16 @@ struct qla_msix_entry {
        uint16_t msix_entry;
 };
 
+#define        WATCH_INTERVAL          1       /* number of seconds */
+
+/* NPIV */
+#define MAX_MULTI_ID_LOOP                     126
+#define MAX_MULTI_ID_FABRIC                    64
+#define MAX_NUM_VPORT_LOOP                      (MAX_MULTI_ID_LOOP - 1)
+#define MAX_NUM_VPORT_FABRIC                    (MAX_MULTI_ID_FABRIC - 1)
+#define MAX_NUM_VHBA_LOOP                       (MAX_MULTI_ID_LOOP - 1)
+#define MAX_NUM_VHBA_FABRIC                     (MAX_MULTI_ID_FABRIC - 1)
+
 /*
  * Linux Host Adapter structure
  */
@@ -2103,6 +2158,9 @@ typedef struct scsi_qla_host {
                uint32_t        msi_enabled             :1;
                uint32_t        msix_enabled            :1;
                uint32_t        disable_serdes          :1;
+               uint32_t        gpsc_supported          :1;
+               uint32_t        vsan_enabled            :1;
+               uint32_t        npiv_supported          :1;
        } flags;
 
        atomic_t        loop_state;
@@ -2142,6 +2200,7 @@ typedef struct scsi_qla_host {
 #define BEACON_BLINK_NEEDED    25
 #define REGISTER_FDMI_NEEDED   26
 #define FCPORT_UPDATE_NEEDED   27
+#define VP_DPC_NEEDED          28      /* wake up for VP dpc handling */
 
        uint32_t        device_flags;
 #define DFLG_LOCAL_DEVICES             BIT_0
@@ -2150,6 +2209,7 @@ typedef struct scsi_qla_host {
 #define        SWITCH_FOUND                    BIT_3
 #define        DFLG_NO_CABLE                   BIT_4
 
+#define PCI_DEVICE_ID_QLOGIC_ISP2532   0x2532
        uint32_t        device_type;
 #define DT_ISP2100                     BIT_0
 #define DT_ISP2200                     BIT_1
@@ -2162,8 +2222,11 @@ typedef struct scsi_qla_host {
 #define DT_ISP2432                     BIT_8
 #define DT_ISP5422                     BIT_9
 #define DT_ISP5432                     BIT_10
-#define DT_ISP_LAST                    (DT_ISP5432 << 1)
+#define DT_ISP2532                     BIT_11
+#define DT_ISP_LAST                    (DT_ISP2532 << 1)
 
+#define DT_IIDMA                       BIT_26
+#define DT_FWI2                                BIT_27
 #define DT_ZIO_SUPPORTED               BIT_28
 #define DT_OEM_001                     BIT_29
 #define DT_ISP2200A                    BIT_30
@@ -2181,12 +2244,16 @@ typedef struct scsi_qla_host {
 #define IS_QLA2432(ha) (DT_MASK(ha) & DT_ISP2432)
 #define IS_QLA5422(ha) (DT_MASK(ha) & DT_ISP5422)
 #define IS_QLA5432(ha) (DT_MASK(ha) & DT_ISP5432)
+#define IS_QLA2532(ha) (DT_MASK(ha) & DT_ISP2532)
 
 #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \
                         IS_QLA6312(ha) || IS_QLA6322(ha))
 #define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha))
 #define IS_QLA54XX(ha) (IS_QLA5422(ha) || IS_QLA5432(ha))
+#define IS_QLA25XX(ha) (IS_QLA2532(ha))
 
+#define IS_IIDMA_CAPABLE(ha)   ((ha)->device_type & DT_IIDMA)
+#define IS_FWI2_CAPABLE(ha)    ((ha)->device_type & DT_FWI2)
 #define IS_ZIO_SUPPORTED(ha)   ((ha)->device_type & DT_ZIO_SUPPORTED)
 #define IS_OEM_001(ha)         ((ha)->device_type & DT_OEM_001)
 #define HAS_EXTENDED_IDS(ha)   ((ha)->device_type & DT_EXTENDED_IDS)
@@ -2223,7 +2290,7 @@ typedef struct scsi_qla_host {
        uint16_t        rsp_ring_index;     /* Current index. */
        uint16_t        response_q_length;
 
-       struct isp_operations isp_ops;
+       struct isp_operations *isp_ops;
 
        /* Outstandings ISP commands. */
        srb_t           *outstanding_cmds[MAX_OUTSTANDING_COMMANDS];
@@ -2232,6 +2299,11 @@ typedef struct scsi_qla_host {
 
        /* ISP configuration data. */
        uint16_t        loop_id;                /* Host adapter loop id */
+       uint16_t        switch_cap;
+#define FLOGI_SEQ_DEL          BIT_8
+#define FLOGI_MID_SUPPORT      BIT_10
+#define FLOGI_VSAN_SUPPORT     BIT_12
+#define FLOGI_SP_SUPPORT       BIT_13
        uint16_t        fb_rev;
 
        port_id_t       d_id;                   /* Host adapter port id */
@@ -2242,6 +2314,7 @@ typedef struct scsi_qla_host {
 #define PORT_SPEED_1GB 0x00
 #define PORT_SPEED_2GB 0x01
 #define PORT_SPEED_4GB 0x03
+#define PORT_SPEED_8GB 0x04
        uint16_t        link_data_rate;         /* F/W operating speed */
 
        uint8_t         current_topology;
@@ -2339,6 +2412,7 @@ typedef struct scsi_qla_host {
 #define MBX_UPDATE_FLASH_ACTIVE        3
 
        struct semaphore mbx_cmd_sem;   /* Serialialize mbx access */
+       struct semaphore vport_sem;     /* Virtual port synchronization */
        struct semaphore mbx_intr_sem;  /* Used for completion notification */
 
        uint32_t        mbx_flags;
@@ -2423,6 +2497,37 @@ typedef struct scsi_qla_host {
        struct fc_host_statistics fc_host_stat;
 
        struct qla_msix_entry msix_entries[QLA_MSIX_ENTRIES];
+
+       struct list_head        vp_list;        /* list of VP */
+       struct fc_vport *fc_vport;      /* holds fc_vport * for each vport */
+       uint8_t         vp_idx_map[16];
+       uint16_t        num_vhosts;     /* number of vports created */
+       uint16_t        num_vsans;      /* number of vsan created */
+       uint16_t        vp_idx;         /* vport ID */
+
+       struct scsi_qla_host    *parent;        /* holds pport */
+       unsigned long           vp_flags;
+       struct list_head        vp_fcports;     /* list of fcports */
+#define VP_IDX_ACQUIRED                0       /* bit no 0 */
+#define VP_CREATE_NEEDED       1
+#define VP_BIND_NEEDED         2
+#define VP_DELETE_NEEDED       3
+#define VP_SCR_NEEDED          4       /* State Change Request registration */
+       atomic_t                vp_state;
+#define VP_OFFLINE             0
+#define VP_ACTIVE              1
+#define VP_FAILED              2
+// #define VP_DISABLE          3
+       uint16_t        vp_err_state;
+       uint16_t        vp_prev_err_state;
+#define VP_ERR_UNKWN           0
+#define VP_ERR_PORTDWN         1
+#define VP_ERR_FAB_UNSUPPORTED 2
+#define VP_ERR_FAB_NORESOURCES 3
+#define VP_ERR_FAB_LOGOUT      4
+#define VP_ERR_ADAP_NORESOURCES        5
+       int             max_npiv_vports;        /* 63 or 125 per topoloty */
+       int             cur_vport_count;
 } scsi_qla_host_t;
 
 
@@ -2476,6 +2581,7 @@ typedef struct scsi_qla_host {
 #define OPTROM_SIZE_2300       0x20000
 #define OPTROM_SIZE_2322       0x100000
 #define OPTROM_SIZE_24XX       0x100000
+#define OPTROM_SIZE_25XX       0x200000
 
 #include "qla_gbl.h"
 #include "qla_dbg.h"