RE: [EXT] [PATCH v1 1/4] scsi: ufs: allow legacy UFS devices to enable WriteBooster
From: Bean Huo (beanhuo)
Date: Wed Apr 29 2020 - 06:18:55 EST
> -----Original Message-----
> From: Stanley Chu <stanley.chu@xxxxxxxxxxxx>
> Sent: Tuesday, April 28, 2020 1:14 PM
> To: linux-scsi@xxxxxxxxxxxxxxx; martin.petersen@xxxxxxxxxx;
> avri.altman@xxxxxxx; alim.akhtar@xxxxxxxxxxx; jejb@xxxxxxxxxxxxx;
> asutoshd@xxxxxxxxxxxxxx
> Cc: Bean Huo (beanhuo) <beanhuo@xxxxxxxxxx>; cang@xxxxxxxxxxxxxx;
> matthias.bgg@xxxxxxxxx; bvanassche@xxxxxxx; linux-
> mediatek@xxxxxxxxxxxxxxxxxxx; linux-arm-kernel@xxxxxxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx; kuohong.wang@xxxxxxxxxxxx;
> peter.wang@xxxxxxxxxxxx; chun-hung.wu@xxxxxxxxxxxx;
> andy.teng@xxxxxxxxxxxx; Stanley Chu <stanley.chu@xxxxxxxxxxxx>
> Subject: [EXT] [PATCH v1 1/4] scsi: ufs: allow legacy UFS devices to enable
> WriteBooster
>
> 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@xxxxxxxxxxxx>
> ---
> drivers/scsi/ufs/ufshcd.c | 19 +++++++++++++------
> 1 file changed, 13 insertions(+), 6 deletions(-)
>
> 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,
> --
> 2.18.0
Reviewed-by: Bean Huo <beanhuo@xxxxxxxxxx>