scsi: megaraid_sas: Implement the PD Map support for SAS3.5 Generic Megaraid Controllers
authorSasikumar Chandrasekaran <sasikumar.pc@broadcom.com>
Tue, 10 Jan 2017 23:20:52 +0000 (18:20 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 11 Jan 2017 04:15:46 +0000 (23:15 -0500)
Update Linux driver to use new pdTargetId field for JBOD target ID

Signed-off-by: Sasikumar Chandrasekaran <sasikumar.pc@broadcom.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/megaraid/megaraid_sas.h
drivers/scsi/megaraid/megaraid_sas_base.c
drivers/scsi/megaraid/megaraid_sas_fusion.c
drivers/scsi/megaraid/megaraid_sas_fusion.h

index 0696903e28fd9321f7cec97928d06141ea023a78..21c48e1aa52de664b49da8a7344bd4872562ad13 100644 (file)
@@ -1317,7 +1317,55 @@ struct megasas_ctrl_info {
 #endif
        } adapterOperations3;
 
-       u8          pad[0x800-0x7EC];
+       struct {
+#if defined(__BIG_ENDIAN_BITFIELD)
+       u8 reserved:7;
+       /* Indicates whether the CPLD image is part of
+        *  the package and stored in flash
+        */
+       u8 cpld_in_flash:1;
+#else
+       u8 cpld_in_flash:1;
+       u8 reserved:7;
+#endif
+       u8 reserved1[3];
+       /* Null terminated string. Has the version
+        *  information if cpld_in_flash = FALSE
+        */
+       u8 userCodeDefinition[12];
+       } cpld;  /* Valid only if upgradableCPLD is TRUE */
+
+       struct {
+       #if defined(__BIG_ENDIAN_BITFIELD)
+               u16 reserved:8;
+               u16 fw_swaps_bbu_vpd_info:1;
+               u16 support_pd_map_target_id:1;
+               u16 support_ses_ctrl_in_multipathcfg:1;
+               u16 image_upload_supported:1;
+               u16 support_encrypted_mfc:1;
+               u16 supported_enc_algo:1;
+               u16 support_ibutton_less:1;
+               u16 ctrl_info_ext_supported:1;
+       #else
+
+               u16 ctrl_info_ext_supported:1;
+               u16 support_ibutton_less:1;
+               u16 supported_enc_algo:1;
+               u16 support_encrypted_mfc:1;
+               u16 image_upload_supported:1;
+               /* FW supports LUN based association and target port based */
+               u16 support_ses_ctrl_in_multipathcfg:1;
+               /* association for the SES device connected in multipath mode */
+               /* FW defines Jbod target Id within MR_PD_CFG_SEQ */
+               u16 support_pd_map_target_id:1;
+               /* FW swaps relevant fields in MR_BBU_VPD_INFO_FIXED to
+                *  provide the data in little endian order
+                */
+               u16 fw_swaps_bbu_vpd_info:1;
+               u16 reserved:8;
+       #endif
+               } adapter_operations4;
+       u8 pad[0x800-0x7FE]; /* 0x7FE pad to 2K for expansion */
 } __packed;
 
 /*
@@ -1557,33 +1605,35 @@ union megasas_sgl_frame {
 typedef union _MFI_CAPABILITIES {
        struct {
 #if   defined(__BIG_ENDIAN_BITFIELD)
-               u32     reserved:20;
-               u32     support_qd_throttling:1;
-               u32     support_fp_rlbypass:1;
-               u32     support_vfid_in_ioframe:1;
-               u32     support_ext_io_size:1;
-               u32     support_ext_queue_depth:1;
-               u32     security_protocol_cmds_fw:1;
-               u32     support_core_affinity:1;
-               u32     support_ndrive_r1_lb:1;
-               u32     support_max_255lds:1;
-               u32     support_fastpath_wb:1;
-               u32     support_additional_msix:1;
-               u32     support_fp_remote_lun:1;
+       u32     reserved:19;
+       u32 support_pd_map_target_id:1;
+       u32     support_qd_throttling:1;
+       u32     support_fp_rlbypass:1;
+       u32     support_vfid_in_ioframe:1;
+       u32     support_ext_io_size:1;
+       u32             support_ext_queue_depth:1;
+       u32     security_protocol_cmds_fw:1;
+       u32     support_core_affinity:1;
+       u32     support_ndrive_r1_lb:1;
+       u32             support_max_255lds:1;
+       u32             support_fastpath_wb:1;
+       u32     support_additional_msix:1;
+       u32     support_fp_remote_lun:1;
 #else
-               u32     support_fp_remote_lun:1;
-               u32     support_additional_msix:1;
-               u32     support_fastpath_wb:1;
-               u32     support_max_255lds:1;
-               u32     support_ndrive_r1_lb:1;
-               u32     support_core_affinity:1;
-               u32     security_protocol_cmds_fw:1;
-               u32     support_ext_queue_depth:1;
-               u32     support_ext_io_size:1;
-               u32     support_vfid_in_ioframe:1;
-               u32     support_fp_rlbypass:1;
-               u32     support_qd_throttling:1;
-               u32     reserved:20;
+       u32     support_fp_remote_lun:1;
+       u32     support_additional_msix:1;
+       u32             support_fastpath_wb:1;
+       u32             support_max_255lds:1;
+       u32     support_ndrive_r1_lb:1;
+       u32     support_core_affinity:1;
+       u32     security_protocol_cmds_fw:1;
+       u32             support_ext_queue_depth:1;
+       u32     support_ext_io_size:1;
+       u32     support_vfid_in_ioframe:1;
+       u32     support_fp_rlbypass:1;
+       u32     support_qd_throttling:1;
+       u32     support_pd_map_target_id:1;
+       u32     reserved:19;
 #endif
        } mfi_capabilities;
        __le32          reg;
@@ -2052,6 +2102,7 @@ struct megasas_instance {
        u32 crash_dump_drv_support;
        u32 crash_dump_app_support;
        u32 secure_jbod_support;
+       u32 support_morethan256jbod; /* FW support for more than 256 PD/JBOD */
        bool use_seqnum_jbod_fp;   /* Added for PD sequence */
        spinlock_t crashdump_lock;
 
index eba107898c7f4d49c198f9ecc2f5b00ed3803eaf..70891a76ca8614c376ac3fb9f68ba9977c2d0bca 100644 (file)
@@ -4576,6 +4576,7 @@ megasas_get_ctrl_info(struct megasas_instance *instance)
                le32_to_cpus((u32 *)&ctrl_info->properties.OnOffProperties);
                le32_to_cpus((u32 *)&ctrl_info->adapterOperations2);
                le32_to_cpus((u32 *)&ctrl_info->adapterOperations3);
+               le16_to_cpus((u16 *)&ctrl_info->adapter_operations4);
 
                /* Update the latest Ext VD info.
                 * From Init path, store current firmware details.
@@ -4585,6 +4586,8 @@ megasas_get_ctrl_info(struct megasas_instance *instance)
                megasas_update_ext_vd_details(instance);
                instance->use_seqnum_jbod_fp =
                        ctrl_info->adapterOperations3.useSeqNumJbodFP;
+               instance->support_morethan256jbod =
+                       ctrl_info->adapter_operations4.support_pd_map_target_id;
 
                /*Check whether controller is iMR or MR */
                instance->is_imr = (ctrl_info->memory_size ? 0 : 1);
index 705102f5b3a2b6958886ec875f4cc30c3a916b20..9a9c84fb91b1790a202bdfe3a0b25e111370cb63 100644 (file)
@@ -858,6 +858,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
                drv_ops->mfi_capabilities.support_ext_queue_depth = 1;
 
        drv_ops->mfi_capabilities.support_qd_throttling = 1;
+       drv_ops->mfi_capabilities.support_pd_map_target_id = 1;
        /* Convert capability to LE32 */
        cpu_to_le32s((u32 *)&init_frame->driver_operations.mfi_capabilities);
 
@@ -2244,6 +2245,11 @@ megasas_build_syspd_fusion(struct megasas_instance *instance,
                /* TgtId must be incremented by 255 as jbod seq number is index
                 * below raid map
                 */
+                /* More than 256 PD/JBOD support for Ventura */
+               if (instance->support_morethan256jbod)
+                       pRAID_Context->virtual_disk_tgt_id =
+                               pd_sync->seq[pd_index].pd_target_id;
+               else
                pRAID_Context->virtual_disk_tgt_id =
                        cpu_to_le16(device_id + (MAX_PHYSICAL_DEVICES - 1));
                pRAID_Context->config_seq_num = pd_sync->seq[pd_index].seqNum;
index 391aae6e27a4e721dcdc1250c5dac4a76e1cf58d..3addd0cb2e9979453d2a23628813e1852e1ebdb7 100644 (file)
@@ -1189,7 +1189,8 @@ struct MR_PD_CFG_SEQ {
                u8     reserved:7;
 #endif
        } capability;
-       u8  reserved[3];
+       u8  reserved;
+       u16 pd_target_id;
 } __packed;
 
 struct MR_PD_CFG_SEQ_NUM_SYNC {