]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/ipr.h
[PATCH] mutex subsystem, semaphore to mutex: VFS, ->i_sem
[linux-2.6-omap-h63xx.git] / drivers / scsi / ipr.h
index b8ae306691276bd798a001ca2b1b744a2286f8f2..b639332131f1b8cb7dd251cfbdf58af919553a55 100644 (file)
@@ -36,8 +36,8 @@
 /*
  * Literals
  */
-#define IPR_DRIVER_VERSION "2.0.14"
-#define IPR_DRIVER_DATE "(May 2, 2005)"
+#define IPR_DRIVER_VERSION "2.1.1"
+#define IPR_DRIVER_DATE "(November 15, 2005)"
 
 /*
  * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding
 #define IPR_SUBS_DEV_ID_571A   0x02C0
 #define IPR_SUBS_DEV_ID_571B   0x02BE
 #define IPR_SUBS_DEV_ID_571E  0x02BF
+#define IPR_SUBS_DEV_ID_571F   0x02D5
+#define IPR_SUBS_DEV_ID_572A   0x02C1
+#define IPR_SUBS_DEV_ID_572B   0x02C2
+#define IPR_SUBS_DEV_ID_575B   0x030D
 
 #define IPR_NAME                               "ipr"
 
@@ -80,6 +84,7 @@
 #define IPR_IOASC_HW_DEV_BUS_STATUS                    0x04448500
 #define        IPR_IOASC_IOASC_MASK                    0xFFFFFF00
 #define        IPR_IOASC_SCSI_STATUS_MASK              0x000000FF
+#define IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT   0x05240000
 #define IPR_IOASC_IR_RESOURCE_HANDLE           0x05250000
 #define IPR_IOASC_IR_NO_CMDS_TO_2ND_IOA                0x05258100
 #define IPR_IOASA_IR_DUAL_IOA_DISABLED         0x052C8000
 #define IPR_NUM_LOG_HCAMS                              2
 #define IPR_NUM_CFG_CHG_HCAMS                          2
 #define IPR_NUM_HCAMS  (IPR_NUM_LOG_HCAMS + IPR_NUM_CFG_CHG_HCAMS)
-#define IPR_MAX_NUM_TARGETS_PER_BUS                    0x10
+#define IPR_MAX_NUM_TARGETS_PER_BUS                    256
 #define IPR_MAX_NUM_LUNS_PER_TARGET                    256
 #define IPR_MAX_NUM_VSET_LUNS_PER_TARGET       8
 #define IPR_VSET_BUS                                   0xff
 #define IPR_IOA_BUS                                            0xff
 #define IPR_IOA_TARGET                                 0xff
 #define IPR_IOA_LUN                                            0xff
-#define IPR_MAX_NUM_BUSES                              4
+#define IPR_MAX_NUM_BUSES                              8
 #define IPR_MAX_BUS_TO_SCAN                            IPR_MAX_NUM_BUSES
 
 #define IPR_NUM_RESET_RELOAD_RETRIES           3
@@ -254,6 +259,11 @@ struct ipr_vpd {
        u8 sn[IPR_SERIAL_NUM_LEN];
 }__attribute__((packed));
 
+struct ipr_ext_vpd {
+       struct ipr_vpd vpd;
+       __be32 wwid[2];
+}__attribute__((packed));
+
 struct ipr_std_inq_data {
        u8 peri_qual_dev_type;
 #define IPR_STD_INQ_PERI_QUAL(peri) ((peri) >> 5)
@@ -297,6 +307,10 @@ struct ipr_config_table_entry {
 #define IPR_SUBTYPE_GENERIC_SCSI       1
 #define IPR_SUBTYPE_VOLUME_SET         2
 
+#define IPR_QUEUEING_MODEL(res)        ((((res)->cfgte.flags) & 0x70) >> 4)
+#define IPR_QUEUE_FROZEN_MODEL 0
+#define IPR_QUEUE_NACA_MODEL           1
+
        struct ipr_res_addr res_addr;
        __be32 res_handle;
        __be32 reserved4[2];
@@ -553,14 +567,31 @@ struct ipr_hostrcb_device_data_entry {
        __be32 ioa_data[5];
 }__attribute__((packed, aligned (4)));
 
+struct ipr_hostrcb_device_data_entry_enhanced {
+       struct ipr_ext_vpd vpd;
+       u8 ccin[4];
+       struct ipr_res_addr dev_res_addr;
+       struct ipr_ext_vpd new_vpd;
+       u8 new_ccin[4];
+       struct ipr_ext_vpd ioa_last_with_dev_vpd;
+       struct ipr_ext_vpd cfc_last_with_dev_vpd;
+}__attribute__((packed, aligned (4)));
+
 struct ipr_hostrcb_array_data_entry {
        struct ipr_vpd vpd;
        struct ipr_res_addr expected_dev_res_addr;
        struct ipr_res_addr dev_res_addr;
 }__attribute__((packed, aligned (4)));
 
+struct ipr_hostrcb_array_data_entry_enhanced {
+       struct ipr_ext_vpd vpd;
+       u8 ccin[4];
+       struct ipr_res_addr expected_dev_res_addr;
+       struct ipr_res_addr dev_res_addr;
+}__attribute__((packed, aligned (4)));
+
 struct ipr_hostrcb_type_ff_error {
-       __be32 ioa_data[246];
+       __be32 ioa_data[502];
 }__attribute__((packed, aligned (4)));
 
 struct ipr_hostrcb_type_01_error {
@@ -578,6 +609,14 @@ struct ipr_hostrcb_type_02_error {
        __be32 ioa_data[3];
 }__attribute__((packed, aligned (4)));
 
+struct ipr_hostrcb_type_12_error {
+       struct ipr_ext_vpd ioa_vpd;
+       struct ipr_ext_vpd cfc_vpd;
+       struct ipr_ext_vpd ioa_last_attached_to_cfc_vpd;
+       struct ipr_ext_vpd cfc_last_attached_to_ioa_vpd;
+       __be32 ioa_data[3];
+}__attribute__((packed, aligned (4)));
+
 struct ipr_hostrcb_type_03_error {
        struct ipr_vpd ioa_vpd;
        struct ipr_vpd cfc_vpd;
@@ -587,6 +626,14 @@ struct ipr_hostrcb_type_03_error {
        struct ipr_hostrcb_device_data_entry dev[3];
 }__attribute__((packed, aligned (4)));
 
+struct ipr_hostrcb_type_13_error {
+       struct ipr_ext_vpd ioa_vpd;
+       struct ipr_ext_vpd cfc_vpd;
+       __be32 errors_detected;
+       __be32 errors_logged;
+       struct ipr_hostrcb_device_data_entry_enhanced dev[3];
+}__attribute__((packed, aligned (4)));
+
 struct ipr_hostrcb_type_04_error {
        struct ipr_vpd ioa_vpd;
        struct ipr_vpd cfc_vpd;
@@ -602,12 +649,30 @@ struct ipr_hostrcb_type_04_error {
        u8 protection_level[8];
 }__attribute__((packed, aligned (4)));
 
+struct ipr_hostrcb_type_14_error {
+       struct ipr_ext_vpd ioa_vpd;
+       struct ipr_ext_vpd cfc_vpd;
+       __be32 exposed_mode_adn;
+       __be32 array_id;
+       struct ipr_res_addr last_func_vset_res_addr;
+       u8 vset_serial_num[IPR_SERIAL_NUM_LEN];
+       u8 protection_level[8];
+       __be32 num_entries;
+       struct ipr_hostrcb_array_data_entry_enhanced array_member[18];
+}__attribute__((packed, aligned (4)));
+
 struct ipr_hostrcb_type_07_error {
        u8 failure_reason[64];
        struct ipr_vpd vpd;
        u32 data[222];
 }__attribute__((packed, aligned (4)));
 
+struct ipr_hostrcb_type_17_error {
+       u8 failure_reason[64];
+       struct ipr_ext_vpd vpd;
+       u32 data[476];
+}__attribute__((packed, aligned (4)));
+
 struct ipr_hostrcb_error {
        __be32 failing_dev_ioasc;
        struct ipr_res_addr failing_dev_res_addr;
@@ -620,6 +685,10 @@ struct ipr_hostrcb_error {
                struct ipr_hostrcb_type_03_error type_03_error;
                struct ipr_hostrcb_type_04_error type_04_error;
                struct ipr_hostrcb_type_07_error type_07_error;
+               struct ipr_hostrcb_type_12_error type_12_error;
+               struct ipr_hostrcb_type_13_error type_13_error;
+               struct ipr_hostrcb_type_14_error type_14_error;
+               struct ipr_hostrcb_type_17_error type_17_error;
        } u;
 }__attribute__((packed, aligned (4)));
 
@@ -654,6 +723,11 @@ struct ipr_hcam {
 #define IPR_HOST_RCB_OVERLAY_ID_4                              0x04
 #define IPR_HOST_RCB_OVERLAY_ID_6                              0x06
 #define IPR_HOST_RCB_OVERLAY_ID_7                              0x07
+#define IPR_HOST_RCB_OVERLAY_ID_12                             0x12
+#define IPR_HOST_RCB_OVERLAY_ID_13                             0x13
+#define IPR_HOST_RCB_OVERLAY_ID_14                             0x14
+#define IPR_HOST_RCB_OVERLAY_ID_16                             0x16
+#define IPR_HOST_RCB_OVERLAY_ID_17                             0x17
 #define IPR_HOST_RCB_OVERLAY_ID_DEFAULT                        0xFF
 
        u8 reserved1[3];
@@ -848,6 +922,7 @@ struct ipr_ioa_cfg {
        u8 dump_taken:1;
        u8 allow_cmds:1;
        u8 allow_ml_add_del:1;
+       u8 needs_hard_reset:1;
 
        enum ipr_cache_state cache_state;
        u16 type; /* CCIN of the card */
@@ -958,6 +1033,7 @@ struct ipr_cmnd {
        struct timer_list timer;
        void (*done) (struct ipr_cmnd *);
        int (*job_step) (struct ipr_cmnd *);
+       int (*job_step_failed) (struct ipr_cmnd *);
        u16 cmd_index;
        u8 sense_buffer[SCSI_SENSE_BUFFERSIZE];
        dma_addr_t sense_buffer_dma;
@@ -1228,6 +1304,20 @@ static inline int ipr_is_gscsi(struct ipr_resource_entry *res)
                return 0;
 }
 
+/**
+ * ipr_is_naca_model - Determine if a resource is using NACA queueing model
+ * @res:       resource entry struct
+ *
+ * Return value:
+ *     1 if NACA queueing model / 0 if not NACA queueing model
+ **/
+static inline int ipr_is_naca_model(struct ipr_resource_entry *res)
+{
+       if (ipr_is_gscsi(res) && IPR_QUEUEING_MODEL(res) == IPR_QUEUE_NACA_MODEL)
+               return 1;
+       return 0;
+}
+
 /**
  * ipr_is_device - Determine if resource address is that of a device
  * @res_addr:  resource address struct
@@ -1238,7 +1328,7 @@ static inline int ipr_is_gscsi(struct ipr_resource_entry *res)
 static inline int ipr_is_device(struct ipr_res_addr *res_addr)
 {
        if ((res_addr->bus < IPR_MAX_NUM_BUSES) &&
-           (res_addr->target < IPR_MAX_NUM_TARGETS_PER_BUS))
+           (res_addr->target < (IPR_MAX_NUM_TARGETS_PER_BUS - 1)))
                return 1;
 
        return 0;