Loading drivers/scsi/ufs/ufs-sysfs.c +39 −2 Original line number Diff line number Diff line Loading @@ -311,6 +311,10 @@ UFS_DEVICE_DESC_PARAM(device_version, _DEV_VER, 2); UFS_DEVICE_DESC_PARAM(number_of_secure_wpa, _NUM_SEC_WPA, 1); UFS_DEVICE_DESC_PARAM(psa_max_data_size, _PSA_MAX_DATA, 4); UFS_DEVICE_DESC_PARAM(psa_state_timeout, _PSA_TMT, 1); UFS_DEVICE_DESC_PARAM(ext_feature_sup, _EXT_UFS_FEATURE_SUP, 4); UFS_DEVICE_DESC_PARAM(wb_presv_us_en, _WB_US_RED_EN, 1); UFS_DEVICE_DESC_PARAM(wb_type, _WB_TYPE, 1); UFS_DEVICE_DESC_PARAM(wb_shared_alloc_units, _WB_SHARED_ALLOC_UNITS, 4); static struct attribute *ufs_sysfs_device_descriptor[] = { &dev_attr_device_type.attr, Loading Loading @@ -339,6 +343,10 @@ static struct attribute *ufs_sysfs_device_descriptor[] = { &dev_attr_number_of_secure_wpa.attr, &dev_attr_psa_max_data_size.attr, &dev_attr_psa_state_timeout.attr, &dev_attr_ext_feature_sup.attr, &dev_attr_wb_presv_us_en.attr, &dev_attr_wb_type.attr, &dev_attr_wb_shared_alloc_units.attr, NULL, }; Loading Loading @@ -408,6 +416,12 @@ UFS_GEOMETRY_DESC_PARAM(enh4_memory_max_alloc_units, _ENM4_MAX_NUM_UNITS, 4); UFS_GEOMETRY_DESC_PARAM(enh4_memory_capacity_adjustment_factor, _ENM4_CAP_ADJ_FCTR, 2); UFS_GEOMETRY_DESC_PARAM(wb_max_alloc_units, _WB_MAX_ALLOC_UNITS, 4); UFS_GEOMETRY_DESC_PARAM(wb_max_wb_luns, _WB_MAX_WB_LUNS, 1); UFS_GEOMETRY_DESC_PARAM(wb_buff_cap_adj, _WB_BUFF_CAP_ADJ, 1); UFS_GEOMETRY_DESC_PARAM(wb_sup_red_type, _WB_SUP_RED_TYPE, 1); UFS_GEOMETRY_DESC_PARAM(wb_sup_wb_type, _WB_SUP_WB_TYPE, 1); static struct attribute *ufs_sysfs_geometry_descriptor[] = { &dev_attr_raw_device_capacity.attr, Loading Loading @@ -439,6 +453,11 @@ static struct attribute *ufs_sysfs_geometry_descriptor[] = { &dev_attr_enh3_memory_capacity_adjustment_factor.attr, &dev_attr_enh4_memory_max_alloc_units.attr, &dev_attr_enh4_memory_capacity_adjustment_factor.attr, &dev_attr_wb_max_alloc_units.attr, &dev_attr_wb_max_wb_luns.attr, &dev_attr_wb_buff_cap_adj.attr, &dev_attr_wb_sup_red_type.attr, &dev_attr_wb_sup_wb_type.attr, NULL, }; Loading Loading @@ -651,7 +670,7 @@ static ssize_t _name##_show(struct device *dev, \ pm_runtime_put_sync(hba->dev); \ if (ret) \ return -EINVAL; \ return sprintf(buf, "%s\n", flag ? "true" : "false"); \ return snprintf(buf, PAGE_SIZE, "%s\n", flag ? "true" : "false"); \ } \ static DEVICE_ATTR_RO(_name) Loading @@ -663,6 +682,9 @@ UFS_FLAG(life_span_mode_enable, _LIFE_SPAN_MODE_ENABLE); UFS_FLAG(phy_resource_removal, _FPHYRESOURCEREMOVAL); UFS_FLAG(busy_rtc, _BUSY_RTC); UFS_FLAG(disable_fw_update, _PERMANENTLY_DISABLE_FW_UPDATE); UFS_FLAG(wb_enable, _WB_EN); UFS_FLAG(wb_flush_en, _WB_BUFF_FLUSH_EN); UFS_FLAG(wb_flush_during_h8, _WB_BUFF_FLUSH_DURING_HIBERN8); static struct attribute *ufs_sysfs_device_flags[] = { &dev_attr_device_init.attr, Loading @@ -673,6 +695,9 @@ static struct attribute *ufs_sysfs_device_flags[] = { &dev_attr_phy_resource_removal.attr, &dev_attr_busy_rtc.attr, &dev_attr_disable_fw_update.attr, &dev_attr_wb_enable.attr, &dev_attr_wb_flush_en.attr, &dev_attr_wb_flush_during_h8.attr, NULL, }; Loading @@ -694,7 +719,7 @@ static ssize_t _name##_show(struct device *dev, \ pm_runtime_put_sync(hba->dev); \ if (ret) \ return -EINVAL; \ return sprintf(buf, "0x%08X\n", value); \ return snprintf(buf, PAGE_SIZE, "0x%08X\n", value); \ } \ static DEVICE_ATTR_RO(_name) Loading @@ -714,6 +739,11 @@ UFS_ATTRIBUTE(exception_event_status, _EE_STATUS); UFS_ATTRIBUTE(ffu_status, _FFU_STATUS); UFS_ATTRIBUTE(psa_state, _PSA_STATE); UFS_ATTRIBUTE(psa_data_size, _PSA_DATA_SIZE); UFS_ATTRIBUTE(wb_flush_status, _WB_FLUSH_STATUS); UFS_ATTRIBUTE(wb_avail_buf, _AVAIL_WB_BUFF_SIZE); UFS_ATTRIBUTE(wb_life_time_est, _WB_BUFF_LIFE_TIME_EST); UFS_ATTRIBUTE(wb_cur_buf, _CURR_WB_BUFF_SIZE); static struct attribute *ufs_sysfs_attributes[] = { &dev_attr_boot_lun_enabled.attr, Loading @@ -732,6 +762,10 @@ static struct attribute *ufs_sysfs_attributes[] = { &dev_attr_ffu_status.attr, &dev_attr_psa_state.attr, &dev_attr_psa_data_size.attr, &dev_attr_wb_flush_status.attr, &dev_attr_wb_avail_buf.attr, &dev_attr_wb_life_time_est.attr, &dev_attr_wb_cur_buf.attr, NULL, }; Loading Loading @@ -783,6 +817,8 @@ UFS_UNIT_DESC_PARAM(provisioning_type, _PROVISIONING_TYPE, 1); UFS_UNIT_DESC_PARAM(physical_memory_resourse_count, _PHY_MEM_RSRC_CNT, 8); UFS_UNIT_DESC_PARAM(context_capabilities, _CTX_CAPABILITIES, 2); UFS_UNIT_DESC_PARAM(large_unit_granularity, _LARGE_UNIT_SIZE_M1, 1); UFS_UNIT_DESC_PARAM(wb_buf_alloc_units, _WB_BUF_ALLOC_UNITS, 4); static struct attribute *ufs_sysfs_unit_descriptor[] = { &dev_attr_boot_lun_id.attr, Loading @@ -798,6 +834,7 @@ static struct attribute *ufs_sysfs_unit_descriptor[] = { &dev_attr_physical_memory_resourse_count.attr, &dev_attr_context_capabilities.attr, &dev_attr_large_unit_granularity.attr, &dev_attr_wb_buf_alloc_units.attr, NULL, }; Loading drivers/scsi/ufs/ufs.h +12 −0 Original line number Diff line number Diff line Loading @@ -165,6 +165,7 @@ enum unit_desc_param { UNIT_DESC_PARAM_PHY_MEM_RSRC_CNT = 0x18, UNIT_DESC_PARAM_CTX_CAPABILITIES = 0x20, UNIT_DESC_PARAM_LARGE_UNIT_SIZE_M1 = 0x22, UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS = 0x29, }; /* Device descriptor parameters offsets in bytes*/ Loading Loading @@ -205,6 +206,9 @@ enum device_desc_param { DEVICE_DESC_PARAM_PSA_TMT = 0x29, DEVICE_DESC_PARAM_PRDCT_REV = 0x2A, DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP = 0x4F, DEVICE_DESC_PARAM_WB_US_RED_EN = 0x53, DEVICE_DESC_PARAM_WB_TYPE = 0x54, DEVICE_DESC_PARAM_WB_SHARED_ALLOC_UNITS = 0x55, }; /* Interconnect descriptor parameters offsets in bytes*/ Loading Loading @@ -249,6 +253,11 @@ enum geometry_desc_param { GEOMETRY_DESC_PARAM_ENM4_MAX_NUM_UNITS = 0x3E, GEOMETRY_DESC_PARAM_ENM4_CAP_ADJ_FCTR = 0x42, GEOMETRY_DESC_PARAM_OPT_LOG_BLK_SIZE = 0x44, GEOMETRY_DESC_PARAM_WB_MAX_ALLOC_UNITS = 0x4F, GEOMETRY_DESC_PARAM_WB_MAX_WB_LUNS = 0x53, GEOMETRY_DESC_PARAM_WB_BUFF_CAP_ADJ = 0x54, GEOMETRY_DESC_PARAM_WB_SUP_RED_TYPE = 0x55, GEOMETRY_DESC_PARAM_WB_SUP_WB_TYPE = 0x56, }; /* Health descriptor parameters offsets in bytes*/ Loading Loading @@ -600,6 +609,7 @@ struct ufs_dev_info { u8 i_product_name; u16 w_spec_version; u32 d_ext_ufs_feature_sup; u8 b_wb_buffer_type; /* query flags */ bool f_power_on_wp_en; Loading @@ -613,6 +623,8 @@ struct ufs_dev_info { unsigned int quirks; bool keep_vcc_on; bool wb_config_lun; }; #define MAX_MODEL_LEN 16 Loading drivers/scsi/ufs/ufshcd.c +60 −4 Original line number Diff line number Diff line Loading @@ -6058,6 +6058,37 @@ static int ufshcd_get_lu_wp(struct ufs_hba *hba, return ret; } /* * ufshcd_get_wb_alloc_units - returns "dLUNumWriteBoosterBufferAllocUnits" * @hba: per-adapter instance * @lun: UFS device lun id * @d_lun_wbb_au: pointer to buffer to hold the LU's alloc units info * * Returns 0 in case of success and d_lun_wbb_au would be returned * Returns -ENOTSUPP if reading d_lun_wbb_au is not supported. * Returns -EINVAL in case of invalid parameters passed to this function. */ static int ufshcd_get_wb_alloc_units(struct ufs_hba *hba, u8 lun, u8 *d_lun_wbb_au) { int ret; if (!d_lun_wbb_au) ret = -EINVAL; /* WB can be supported only from LU0..LU7 */ else if (lun >= UFS_UPIU_MAX_GENERAL_LUN) ret = -ENOTSUPP; else ret = ufshcd_read_unit_desc_param(hba, lun, UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS, d_lun_wbb_au, sizeof(*d_lun_wbb_au)); return ret; } /** * ufshcd_get_lu_power_on_wp_status - get LU's power on write protect * status Loading Loading @@ -6847,8 +6878,10 @@ static void ufshcd_bkops_exception_event_handler(struct ufs_hba *hba) static bool ufshcd_wb_sup(struct ufs_hba *hba) { return !!(hba->dev_info.d_ext_ufs_feature_sup & UFS_DEV_WRITE_BOOSTER_SUP); return ((hba->dev_info.d_ext_ufs_feature_sup & UFS_DEV_WRITE_BOOSTER_SUP) && (hba->dev_info.b_wb_buffer_type || hba->dev_info.wb_config_lun)); } static int ufshcd_wb_ctrl(struct ufs_hba *hba, bool enable) Loading Loading @@ -8435,7 +8468,8 @@ static int ufs_get_device_desc(struct ufs_hba *hba, int err; size_t buff_len; u8 model_index; u8 *desc_buf; u8 *desc_buf, wb_buf[4]; u32 lun, res; buff_len = max_t(size_t, hba->desc_size.dev_desc, QUERY_DESC_MAX_SIZE + 1); Loading Loading @@ -8467,7 +8501,7 @@ static int ufs_get_device_desc(struct ufs_hba *hba, if ((dev_desc->wspecversion >= 0x310) || (dev_desc->wmanufacturerid == UFS_VENDOR_TOSHIBA && dev_desc->wspecversion >= 0x300 && hba->desc_size.dev_desc >= 0x59)) hba->desc_size.dev_desc >= 0x59)) { hba->dev_info.d_ext_ufs_feature_sup = desc_buf[DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP] << 24 | Loading @@ -8476,7 +8510,29 @@ static int ufs_get_device_desc(struct ufs_hba *hba, desc_buf[DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP + 2] << 8 | desc_buf[DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP + 3]; hba->dev_info.b_wb_buffer_type = desc_buf[DEVICE_DESC_PARAM_WB_TYPE]; if (hba->dev_info.b_wb_buffer_type) goto skip_unit_desc; hba->dev_info.wb_config_lun = false; for (lun = 0; lun < UFS_UPIU_MAX_GENERAL_LUN; lun++) { memset(wb_buf, 0, sizeof(wb_buf)); err = ufshcd_get_wb_alloc_units(hba, lun, wb_buf); if (err) break; res = wb_buf[0] << 24 | wb_buf[1] << 16 | wb_buf[2] << 8 | wb_buf[3]; if (res) { hba->dev_info.wb_config_lun = true; break; } } } skip_unit_desc: /* Zero-pad entire buffer for string termination. */ memset(desc_buf, 0, buff_len); Loading Loading
drivers/scsi/ufs/ufs-sysfs.c +39 −2 Original line number Diff line number Diff line Loading @@ -311,6 +311,10 @@ UFS_DEVICE_DESC_PARAM(device_version, _DEV_VER, 2); UFS_DEVICE_DESC_PARAM(number_of_secure_wpa, _NUM_SEC_WPA, 1); UFS_DEVICE_DESC_PARAM(psa_max_data_size, _PSA_MAX_DATA, 4); UFS_DEVICE_DESC_PARAM(psa_state_timeout, _PSA_TMT, 1); UFS_DEVICE_DESC_PARAM(ext_feature_sup, _EXT_UFS_FEATURE_SUP, 4); UFS_DEVICE_DESC_PARAM(wb_presv_us_en, _WB_US_RED_EN, 1); UFS_DEVICE_DESC_PARAM(wb_type, _WB_TYPE, 1); UFS_DEVICE_DESC_PARAM(wb_shared_alloc_units, _WB_SHARED_ALLOC_UNITS, 4); static struct attribute *ufs_sysfs_device_descriptor[] = { &dev_attr_device_type.attr, Loading Loading @@ -339,6 +343,10 @@ static struct attribute *ufs_sysfs_device_descriptor[] = { &dev_attr_number_of_secure_wpa.attr, &dev_attr_psa_max_data_size.attr, &dev_attr_psa_state_timeout.attr, &dev_attr_ext_feature_sup.attr, &dev_attr_wb_presv_us_en.attr, &dev_attr_wb_type.attr, &dev_attr_wb_shared_alloc_units.attr, NULL, }; Loading Loading @@ -408,6 +416,12 @@ UFS_GEOMETRY_DESC_PARAM(enh4_memory_max_alloc_units, _ENM4_MAX_NUM_UNITS, 4); UFS_GEOMETRY_DESC_PARAM(enh4_memory_capacity_adjustment_factor, _ENM4_CAP_ADJ_FCTR, 2); UFS_GEOMETRY_DESC_PARAM(wb_max_alloc_units, _WB_MAX_ALLOC_UNITS, 4); UFS_GEOMETRY_DESC_PARAM(wb_max_wb_luns, _WB_MAX_WB_LUNS, 1); UFS_GEOMETRY_DESC_PARAM(wb_buff_cap_adj, _WB_BUFF_CAP_ADJ, 1); UFS_GEOMETRY_DESC_PARAM(wb_sup_red_type, _WB_SUP_RED_TYPE, 1); UFS_GEOMETRY_DESC_PARAM(wb_sup_wb_type, _WB_SUP_WB_TYPE, 1); static struct attribute *ufs_sysfs_geometry_descriptor[] = { &dev_attr_raw_device_capacity.attr, Loading Loading @@ -439,6 +453,11 @@ static struct attribute *ufs_sysfs_geometry_descriptor[] = { &dev_attr_enh3_memory_capacity_adjustment_factor.attr, &dev_attr_enh4_memory_max_alloc_units.attr, &dev_attr_enh4_memory_capacity_adjustment_factor.attr, &dev_attr_wb_max_alloc_units.attr, &dev_attr_wb_max_wb_luns.attr, &dev_attr_wb_buff_cap_adj.attr, &dev_attr_wb_sup_red_type.attr, &dev_attr_wb_sup_wb_type.attr, NULL, }; Loading Loading @@ -651,7 +670,7 @@ static ssize_t _name##_show(struct device *dev, \ pm_runtime_put_sync(hba->dev); \ if (ret) \ return -EINVAL; \ return sprintf(buf, "%s\n", flag ? "true" : "false"); \ return snprintf(buf, PAGE_SIZE, "%s\n", flag ? "true" : "false"); \ } \ static DEVICE_ATTR_RO(_name) Loading @@ -663,6 +682,9 @@ UFS_FLAG(life_span_mode_enable, _LIFE_SPAN_MODE_ENABLE); UFS_FLAG(phy_resource_removal, _FPHYRESOURCEREMOVAL); UFS_FLAG(busy_rtc, _BUSY_RTC); UFS_FLAG(disable_fw_update, _PERMANENTLY_DISABLE_FW_UPDATE); UFS_FLAG(wb_enable, _WB_EN); UFS_FLAG(wb_flush_en, _WB_BUFF_FLUSH_EN); UFS_FLAG(wb_flush_during_h8, _WB_BUFF_FLUSH_DURING_HIBERN8); static struct attribute *ufs_sysfs_device_flags[] = { &dev_attr_device_init.attr, Loading @@ -673,6 +695,9 @@ static struct attribute *ufs_sysfs_device_flags[] = { &dev_attr_phy_resource_removal.attr, &dev_attr_busy_rtc.attr, &dev_attr_disable_fw_update.attr, &dev_attr_wb_enable.attr, &dev_attr_wb_flush_en.attr, &dev_attr_wb_flush_during_h8.attr, NULL, }; Loading @@ -694,7 +719,7 @@ static ssize_t _name##_show(struct device *dev, \ pm_runtime_put_sync(hba->dev); \ if (ret) \ return -EINVAL; \ return sprintf(buf, "0x%08X\n", value); \ return snprintf(buf, PAGE_SIZE, "0x%08X\n", value); \ } \ static DEVICE_ATTR_RO(_name) Loading @@ -714,6 +739,11 @@ UFS_ATTRIBUTE(exception_event_status, _EE_STATUS); UFS_ATTRIBUTE(ffu_status, _FFU_STATUS); UFS_ATTRIBUTE(psa_state, _PSA_STATE); UFS_ATTRIBUTE(psa_data_size, _PSA_DATA_SIZE); UFS_ATTRIBUTE(wb_flush_status, _WB_FLUSH_STATUS); UFS_ATTRIBUTE(wb_avail_buf, _AVAIL_WB_BUFF_SIZE); UFS_ATTRIBUTE(wb_life_time_est, _WB_BUFF_LIFE_TIME_EST); UFS_ATTRIBUTE(wb_cur_buf, _CURR_WB_BUFF_SIZE); static struct attribute *ufs_sysfs_attributes[] = { &dev_attr_boot_lun_enabled.attr, Loading @@ -732,6 +762,10 @@ static struct attribute *ufs_sysfs_attributes[] = { &dev_attr_ffu_status.attr, &dev_attr_psa_state.attr, &dev_attr_psa_data_size.attr, &dev_attr_wb_flush_status.attr, &dev_attr_wb_avail_buf.attr, &dev_attr_wb_life_time_est.attr, &dev_attr_wb_cur_buf.attr, NULL, }; Loading Loading @@ -783,6 +817,8 @@ UFS_UNIT_DESC_PARAM(provisioning_type, _PROVISIONING_TYPE, 1); UFS_UNIT_DESC_PARAM(physical_memory_resourse_count, _PHY_MEM_RSRC_CNT, 8); UFS_UNIT_DESC_PARAM(context_capabilities, _CTX_CAPABILITIES, 2); UFS_UNIT_DESC_PARAM(large_unit_granularity, _LARGE_UNIT_SIZE_M1, 1); UFS_UNIT_DESC_PARAM(wb_buf_alloc_units, _WB_BUF_ALLOC_UNITS, 4); static struct attribute *ufs_sysfs_unit_descriptor[] = { &dev_attr_boot_lun_id.attr, Loading @@ -798,6 +834,7 @@ static struct attribute *ufs_sysfs_unit_descriptor[] = { &dev_attr_physical_memory_resourse_count.attr, &dev_attr_context_capabilities.attr, &dev_attr_large_unit_granularity.attr, &dev_attr_wb_buf_alloc_units.attr, NULL, }; Loading
drivers/scsi/ufs/ufs.h +12 −0 Original line number Diff line number Diff line Loading @@ -165,6 +165,7 @@ enum unit_desc_param { UNIT_DESC_PARAM_PHY_MEM_RSRC_CNT = 0x18, UNIT_DESC_PARAM_CTX_CAPABILITIES = 0x20, UNIT_DESC_PARAM_LARGE_UNIT_SIZE_M1 = 0x22, UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS = 0x29, }; /* Device descriptor parameters offsets in bytes*/ Loading Loading @@ -205,6 +206,9 @@ enum device_desc_param { DEVICE_DESC_PARAM_PSA_TMT = 0x29, DEVICE_DESC_PARAM_PRDCT_REV = 0x2A, DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP = 0x4F, DEVICE_DESC_PARAM_WB_US_RED_EN = 0x53, DEVICE_DESC_PARAM_WB_TYPE = 0x54, DEVICE_DESC_PARAM_WB_SHARED_ALLOC_UNITS = 0x55, }; /* Interconnect descriptor parameters offsets in bytes*/ Loading Loading @@ -249,6 +253,11 @@ enum geometry_desc_param { GEOMETRY_DESC_PARAM_ENM4_MAX_NUM_UNITS = 0x3E, GEOMETRY_DESC_PARAM_ENM4_CAP_ADJ_FCTR = 0x42, GEOMETRY_DESC_PARAM_OPT_LOG_BLK_SIZE = 0x44, GEOMETRY_DESC_PARAM_WB_MAX_ALLOC_UNITS = 0x4F, GEOMETRY_DESC_PARAM_WB_MAX_WB_LUNS = 0x53, GEOMETRY_DESC_PARAM_WB_BUFF_CAP_ADJ = 0x54, GEOMETRY_DESC_PARAM_WB_SUP_RED_TYPE = 0x55, GEOMETRY_DESC_PARAM_WB_SUP_WB_TYPE = 0x56, }; /* Health descriptor parameters offsets in bytes*/ Loading Loading @@ -600,6 +609,7 @@ struct ufs_dev_info { u8 i_product_name; u16 w_spec_version; u32 d_ext_ufs_feature_sup; u8 b_wb_buffer_type; /* query flags */ bool f_power_on_wp_en; Loading @@ -613,6 +623,8 @@ struct ufs_dev_info { unsigned int quirks; bool keep_vcc_on; bool wb_config_lun; }; #define MAX_MODEL_LEN 16 Loading
drivers/scsi/ufs/ufshcd.c +60 −4 Original line number Diff line number Diff line Loading @@ -6058,6 +6058,37 @@ static int ufshcd_get_lu_wp(struct ufs_hba *hba, return ret; } /* * ufshcd_get_wb_alloc_units - returns "dLUNumWriteBoosterBufferAllocUnits" * @hba: per-adapter instance * @lun: UFS device lun id * @d_lun_wbb_au: pointer to buffer to hold the LU's alloc units info * * Returns 0 in case of success and d_lun_wbb_au would be returned * Returns -ENOTSUPP if reading d_lun_wbb_au is not supported. * Returns -EINVAL in case of invalid parameters passed to this function. */ static int ufshcd_get_wb_alloc_units(struct ufs_hba *hba, u8 lun, u8 *d_lun_wbb_au) { int ret; if (!d_lun_wbb_au) ret = -EINVAL; /* WB can be supported only from LU0..LU7 */ else if (lun >= UFS_UPIU_MAX_GENERAL_LUN) ret = -ENOTSUPP; else ret = ufshcd_read_unit_desc_param(hba, lun, UNIT_DESC_PARAM_WB_BUF_ALLOC_UNITS, d_lun_wbb_au, sizeof(*d_lun_wbb_au)); return ret; } /** * ufshcd_get_lu_power_on_wp_status - get LU's power on write protect * status Loading Loading @@ -6847,8 +6878,10 @@ static void ufshcd_bkops_exception_event_handler(struct ufs_hba *hba) static bool ufshcd_wb_sup(struct ufs_hba *hba) { return !!(hba->dev_info.d_ext_ufs_feature_sup & UFS_DEV_WRITE_BOOSTER_SUP); return ((hba->dev_info.d_ext_ufs_feature_sup & UFS_DEV_WRITE_BOOSTER_SUP) && (hba->dev_info.b_wb_buffer_type || hba->dev_info.wb_config_lun)); } static int ufshcd_wb_ctrl(struct ufs_hba *hba, bool enable) Loading Loading @@ -8435,7 +8468,8 @@ static int ufs_get_device_desc(struct ufs_hba *hba, int err; size_t buff_len; u8 model_index; u8 *desc_buf; u8 *desc_buf, wb_buf[4]; u32 lun, res; buff_len = max_t(size_t, hba->desc_size.dev_desc, QUERY_DESC_MAX_SIZE + 1); Loading Loading @@ -8467,7 +8501,7 @@ static int ufs_get_device_desc(struct ufs_hba *hba, if ((dev_desc->wspecversion >= 0x310) || (dev_desc->wmanufacturerid == UFS_VENDOR_TOSHIBA && dev_desc->wspecversion >= 0x300 && hba->desc_size.dev_desc >= 0x59)) hba->desc_size.dev_desc >= 0x59)) { hba->dev_info.d_ext_ufs_feature_sup = desc_buf[DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP] << 24 | Loading @@ -8476,7 +8510,29 @@ static int ufs_get_device_desc(struct ufs_hba *hba, desc_buf[DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP + 2] << 8 | desc_buf[DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP + 3]; hba->dev_info.b_wb_buffer_type = desc_buf[DEVICE_DESC_PARAM_WB_TYPE]; if (hba->dev_info.b_wb_buffer_type) goto skip_unit_desc; hba->dev_info.wb_config_lun = false; for (lun = 0; lun < UFS_UPIU_MAX_GENERAL_LUN; lun++) { memset(wb_buf, 0, sizeof(wb_buf)); err = ufshcd_get_wb_alloc_units(hba, lun, wb_buf); if (err) break; res = wb_buf[0] << 24 | wb_buf[1] << 16 | wb_buf[2] << 8 | wb_buf[3]; if (res) { hba->dev_info.wb_config_lun = true; break; } } } skip_unit_desc: /* Zero-pad entire buffer for string termination. */ memset(desc_buf, 0, buff_len); Loading