Hi,
This patchset applies some driver cleanups and performance improvement
in ufs host drivers by making the delay for host enabling customizable
according to vendors' requirements.
v4 -> v5
- Collect review tags in v4
- Fix patch #7: Fix typo "initializatoin" in title
v3 -> v4
- Collect review tags in v2
- In patch #8, fix incorrect condition of customized delay for host enabling
v2 -> v3
- Remove /arch/arm64/configs/defconfig chnage because it is for local test only
v1 -> v2
- Add patch #1 "scsi: ufs: fix uninitialized tx_lanes in ufshcd_disable_tx_lcc"
- Remove struct ufs_init_prefetch in patch #2 "scsi: ufs: remove init_prefetch_data in struct ufs_hba"
- Introduce common delay function in patch #4
- Replace all delay places by common delay function in ufs-mediatek in patch #5
- Use common delay function instead for host enabling delay in patch #6
- Add patch #7 "scsi: ufs: make HCE polling more compact to improve initializatoin latency"
- In patch #8, customize the delay in ufs_mtk_hce_enable_notify callback instead of ufs_mtk_init (Avri)
Stanley Chu (8):
scsi: ufs: fix uninitialized tx_lanes in ufshcd_disable_tx_lcc()
scsi: ufs: remove init_prefetch_data in struct ufs_hba
scsi: ufs: use an enum for host capabilities
scsi: ufs: introduce common delay function
scsi: ufs-mediatek: replace all delay places by common delay function
scsi: ufs: allow customized delay for host enabling
scsi: ufs: make HCE polling more compact to improve initialization
latency
scsi: ufs-mediatek: customize the delay for host enabling
drivers/scsi/ufs/ufs-mediatek.c | 64 ++++++++++++++++-----------
drivers/scsi/ufs/ufs-mediatek.h | 1 +
drivers/scsi/ufs/ufshcd.c | 47 +++++++++++---------
drivers/scsi/ufs/ufshcd.h | 78 ++++++++++++++++-----------------
4 files changed, 106 insertions(+), 84 deletions(-)
--
2.18.0
Struct init_prefetch_data currently is used privately in
ufshcd_init_icc_levels(), thus it can be removed from struct ufs_hba.
Signed-off-by: Stanley Chu <[email protected]>
Reviewed-by: Asutosh Das <[email protected]>
Reviewed-by: Avri Altman <[email protected]>
---
drivers/scsi/ufs/ufshcd.c | 15 ++++++---------
drivers/scsi/ufs/ufshcd.h | 11 -----------
2 files changed, 6 insertions(+), 20 deletions(-)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 314e808b0d4e..b4988b9ee36c 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -6501,6 +6501,7 @@ static void ufshcd_init_icc_levels(struct ufs_hba *hba)
{
int ret;
int buff_len = hba->desc_size.pwr_desc;
+ u32 icc_level;
u8 *desc_buf;
desc_buf = kmalloc(buff_len, GFP_KERNEL);
@@ -6516,21 +6517,17 @@ static void ufshcd_init_icc_levels(struct ufs_hba *hba)
goto out;
}
- hba->init_prefetch_data.icc_level =
- ufshcd_find_max_sup_active_icc_level(hba,
- desc_buf, buff_len);
- dev_dbg(hba->dev, "%s: setting icc_level 0x%x",
- __func__, hba->init_prefetch_data.icc_level);
+ icc_level =
+ ufshcd_find_max_sup_active_icc_level(hba, desc_buf, buff_len);
+ dev_dbg(hba->dev, "%s: setting icc_level 0x%x", __func__, icc_level);
ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR,
- QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0,
- &hba->init_prefetch_data.icc_level);
+ QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0, &icc_level);
if (ret)
dev_err(hba->dev,
"%s: Failed configuring bActiveICCLevel = %d ret = %d",
- __func__, hba->init_prefetch_data.icc_level , ret);
-
+ __func__, icc_level, ret);
out:
kfree(desc_buf);
}
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 5c10777154fc..5cf79d2319a6 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -402,15 +402,6 @@ struct ufs_clk_scaling {
bool is_suspended;
};
-/**
- * struct ufs_init_prefetch - contains data that is pre-fetched once during
- * initialization
- * @icc_level: icc level which was read during initialization
- */
-struct ufs_init_prefetch {
- u32 icc_level;
-};
-
#define UFS_ERR_REG_HIST_LENGTH 8
/**
* struct ufs_err_reg_hist - keeps history of errors
@@ -541,7 +532,6 @@ enum ufshcd_quirks {
* @intr_mask: Interrupt Mask Bits
* @ee_ctrl_mask: Exception event control mask
* @is_powered: flag to check if HBA is powered
- * @init_prefetch_data: data pre-fetched during initialization
* @eh_work: Worker to handle UFS errors that require s/w attention
* @eeh_work: Worker to handle exception events
* @errors: HBA errors
@@ -627,7 +617,6 @@ struct ufs_hba {
u32 intr_mask;
u16 ee_ctrl_mask;
bool is_powered;
- struct ufs_init_prefetch init_prefetch_data;
/* Work Queues */
struct work_struct eh_work;
--
2.18.0
On 2020-03-16 11:42, Stanley Chu wrote:
> Struct init_prefetch_data currently is used privately in
> ufshcd_init_icc_levels(), thus it can be removed from struct ufs_hba.
>
> Signed-off-by: Stanley Chu <[email protected]>
> Reviewed-by: Asutosh Das <[email protected]>
> Reviewed-by: Avri Altman <[email protected]>
Hi Stanley,
Earlier, I have one similar patch for this, but it does more than this.
Please check the mail I just sent.
Thanks,
Can Guo.
> ---
> drivers/scsi/ufs/ufshcd.c | 15 ++++++---------
> drivers/scsi/ufs/ufshcd.h | 11 -----------
> 2 files changed, 6 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index 314e808b0d4e..b4988b9ee36c 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -6501,6 +6501,7 @@ static void ufshcd_init_icc_levels(struct ufs_hba
> *hba)
> {
> int ret;
> int buff_len = hba->desc_size.pwr_desc;
> + u32 icc_level;
> u8 *desc_buf;
>
> desc_buf = kmalloc(buff_len, GFP_KERNEL);
> @@ -6516,21 +6517,17 @@ static void ufshcd_init_icc_levels(struct
> ufs_hba *hba)
> goto out;
> }
>
> - hba->init_prefetch_data.icc_level =
> - ufshcd_find_max_sup_active_icc_level(hba,
> - desc_buf, buff_len);
> - dev_dbg(hba->dev, "%s: setting icc_level 0x%x",
> - __func__, hba->init_prefetch_data.icc_level);
> + icc_level =
> + ufshcd_find_max_sup_active_icc_level(hba, desc_buf, buff_len);
> + dev_dbg(hba->dev, "%s: setting icc_level 0x%x", __func__, icc_level);
>
> ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR,
> - QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0,
> - &hba->init_prefetch_data.icc_level);
> + QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0, &icc_level);
>
> if (ret)
> dev_err(hba->dev,
> "%s: Failed configuring bActiveICCLevel = %d ret = %d",
> - __func__, hba->init_prefetch_data.icc_level , ret);
> -
> + __func__, icc_level, ret);
> out:
> kfree(desc_buf);
> }
> diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
> index 5c10777154fc..5cf79d2319a6 100644
> --- a/drivers/scsi/ufs/ufshcd.h
> +++ b/drivers/scsi/ufs/ufshcd.h
> @@ -402,15 +402,6 @@ struct ufs_clk_scaling {
> bool is_suspended;
> };
>
> -/**
> - * struct ufs_init_prefetch - contains data that is pre-fetched once
> during
> - * initialization
> - * @icc_level: icc level which was read during initialization
> - */
> -struct ufs_init_prefetch {
> - u32 icc_level;
> -};
> -
> #define UFS_ERR_REG_HIST_LENGTH 8
> /**
> * struct ufs_err_reg_hist - keeps history of errors
> @@ -541,7 +532,6 @@ enum ufshcd_quirks {
> * @intr_mask: Interrupt Mask Bits
> * @ee_ctrl_mask: Exception event control mask
> * @is_powered: flag to check if HBA is powered
> - * @init_prefetch_data: data pre-fetched during initialization
> * @eh_work: Worker to handle UFS errors that require s/w attention
> * @eeh_work: Worker to handle exception events
> * @errors: HBA errors
> @@ -627,7 +617,6 @@ struct ufs_hba {
> u32 intr_mask;
> u16 ee_ctrl_mask;
> bool is_powered;
> - struct ufs_init_prefetch init_prefetch_data;
>
> /* Work Queues */
> struct work_struct eh_work;
Hi Can,
On Mon, 2020-03-16 at 14:25 +0800, Can Guo wrote:
> On 2020-03-16 11:42, Stanley Chu wrote:
> > Struct init_prefetch_data currently is used privately in
> > ufshcd_init_icc_levels(), thus it can be removed from struct ufs_hba.
> >
> > Signed-off-by: Stanley Chu <[email protected]>
> > Reviewed-by: Asutosh Das <[email protected]>
> > Reviewed-by: Avri Altman <[email protected]>
>
> Hi Stanley,
>
> Earlier, I have one similar patch for this, but it does more than this.
> Please check the mail I just sent.
>
> Thanks,
> Can Guo.
OK! Thanks to remind me this. Then I can drop this cleanup patch #2 in
its series to not conflict with your proposed one.
Thanks,
Stanley Chu
Hi Stanley,
On 2020-03-16 15:08, Stanley Chu wrote:
> Hi Can,
>
> On Mon, 2020-03-16 at 14:25 +0800, Can Guo wrote:
>> On 2020-03-16 11:42, Stanley Chu wrote:
>> > Struct init_prefetch_data currently is used privately in
>> > ufshcd_init_icc_levels(), thus it can be removed from struct ufs_hba.
>> >
>> > Signed-off-by: Stanley Chu <[email protected]>
>> > Reviewed-by: Asutosh Das <[email protected]>
>> > Reviewed-by: Avri Altman <[email protected]>
>>
>> Hi Stanley,
>>
>> Earlier, I have one similar patch for this, but it does more than
>> this.
>> Please check the mail I just sent.
>>
>> Thanks,
>> Can Guo.
>
> OK! Thanks to remind me this. Then I can drop this cleanup patch #2 in
> its series to not conflict with your proposed one.
>
> Thanks,
> Stanley Chu
Sure, thank you for your quick response.
Best regards,
Can Guo