Message ID | 20200429135610.23750-2-stanley.chu@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | scsi: ufs: support LU Dedicated buffer type for WriteBooster | expand |
Hi Stanley, > > WriteBooster feature may be supported by some legacy UFS devices > (i.e., < 3.1) by upgrading firmware. > > To enable WriteBooster feature in such devices, relax the entrance > condition of ufshcd_wb_probe() to allow host driver to check those > devices' WriteBooster capability. > > WriteBooster feature can be available if below both conditions are > satisfied, > > 1. Device descriptor has dExtendedUFSFeaturesSupport field. > 2. WriteBooster support is specified in above field. > > Signed-off-by: Stanley Chu <stanley.chu@mediatek.com> > Reviewed-by: Bean Huo <beanhuo@micron.com> WB was first introduced as part of UFS3.1, and lately as part of UFS2.2. Any non-standard behavior should be classified as a quirk. Thanks, Avri
Hi Avri, On Thu, 2020-04-30 at 07:44 +0000, Avri Altman wrote: > Hi Stanley, > > > > > WriteBooster feature may be supported by some legacy UFS devices > > (i.e., < 3.1) by upgrading firmware. > > > > To enable WriteBooster feature in such devices, relax the entrance > > condition of ufshcd_wb_probe() to allow host driver to check those > > devices' WriteBooster capability. > > > > WriteBooster feature can be available if below both conditions are > > satisfied, > > > > 1. Device descriptor has dExtendedUFSFeaturesSupport field. > > 2. WriteBooster support is specified in above field. > > > > Signed-off-by: Stanley Chu <stanley.chu@mediatek.com> > > Reviewed-by: Bean Huo <beanhuo@micron.com> > WB was first introduced as part of UFS3.1, and lately as part of UFS2.2. > Any non-standard behavior should be classified as a quirk. OK! I will try to revise this patch to allow only standard devices handled by normal path and non-standard devices handled by device quirks. Thanks, Stanley Chu
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 915e963398c4..111812c5304a 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -6800,9 +6800,16 @@ static int ufshcd_scsi_add_wlus(struct ufs_hba *hba) static void ufshcd_wb_probe(struct ufs_hba *hba, u8 *desc_buf) { + if (hba->desc_size.dev_desc <= DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP) + goto wb_disabled; + hba->dev_info.d_ext_ufs_feature_sup = get_unaligned_be32(desc_buf + DEVICE_DESC_PARAM_EXT_UFS_FEATURE_SUP); + + if (!(hba->dev_info.d_ext_ufs_feature_sup & UFS_DEV_WRITE_BOOSTER_SUP)) + goto wb_disabled; + /* * WB may be supported but not configured while provisioning. * The spec says, in dedicated wb buffer mode, @@ -6818,11 +6825,12 @@ static void ufshcd_wb_probe(struct ufs_hba *hba, u8 *desc_buf) hba->dev_info.b_presrv_uspc_en = desc_buf[DEVICE_DESC_PARAM_WB_PRESRV_USRSPC_EN]; - if (!((hba->dev_info.d_ext_ufs_feature_sup & - UFS_DEV_WRITE_BOOSTER_SUP) && - hba->dev_info.b_wb_buffer_type && + if (!(hba->dev_info.b_wb_buffer_type && hba->dev_info.d_wb_alloc_units)) - hba->caps &= ~UFSHCD_CAP_WB_EN; + goto wb_disabled; + +wb_disabled: + hba->caps &= ~UFSHCD_CAP_WB_EN; } static int ufs_get_device_desc(struct ufs_hba *hba) @@ -6862,8 +6870,7 @@ static int ufs_get_device_desc(struct ufs_hba *hba) model_index = desc_buf[DEVICE_DESC_PARAM_PRDCT_NAME]; - /* Enable WB only for UFS-3.1 */ - if (dev_info->wspecversion >= 0x310) + if (ufshcd_is_wb_allowed(hba)) ufshcd_wb_probe(hba, desc_buf); err = ufshcd_read_string_desc(hba, model_index,