Skip to content

Commit

Permalink
scsi: Revert "scsi: ufs: core: Initialize devfreq synchronously"
Browse files Browse the repository at this point in the history
This reverts commit 7dafc3e.

This patch introduced a regression [1] where hba->pwr_info is used before
being initialized, which could create issues in ufshcd_scale_gear(). Revert
it until a better solution is found.

[1] https://lore.kernel.org/all/CAGaU9a_PMZhqv+YJ0r3w-hJMsR922oxW6Kg59vw+oen-NZ6Otw@mail.gmail.com

Signed-off-by: Adrien Thierry <athierry@redhat.com>
Link: https://lore.kernel.org/r/20230329205426.46393-1-athierry@redhat.com
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Adrien Thierry authored and Martin K. Petersen committed Apr 3, 2023
1 parent d684a7a commit 86eb94b
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 32 deletions.
47 changes: 16 additions & 31 deletions drivers/ufs/core/ufshcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1409,13 +1409,6 @@ static int ufshcd_devfreq_target(struct device *dev,
struct ufs_clk_info *clki;
unsigned long irq_flags;

/*
* Skip devfreq if UFS initialization is not finished.
* Otherwise ufs could be in a inconsistent state.
*/
if (!smp_load_acquire(&hba->logical_unit_scan_finished))
return 0;

if (!ufshcd_is_clkscaling_supported(hba))
return -EINVAL;

Expand Down Expand Up @@ -8399,6 +8392,22 @@ static int ufshcd_add_lus(struct ufs_hba *hba)
if (ret)
goto out;

/* Initialize devfreq after UFS device is detected */
if (ufshcd_is_clkscaling_supported(hba)) {
memcpy(&hba->clk_scaling.saved_pwr_info.info,
&hba->pwr_info,
sizeof(struct ufs_pa_layer_attr));
hba->clk_scaling.saved_pwr_info.is_valid = true;
hba->clk_scaling.is_allowed = true;

ret = ufshcd_devfreq_init(hba);
if (ret)
goto out;

hba->clk_scaling.is_enabled = true;
ufshcd_init_clk_scaling_sysfs(hba);
}

ufs_bsg_probe(hba);
ufshpb_init(hba);
scsi_scan_host(hba->host);
Expand Down Expand Up @@ -8670,12 +8679,6 @@ static void ufshcd_async_scan(void *data, async_cookie_t cookie)
if (ret) {
pm_runtime_put_sync(hba->dev);
ufshcd_hba_exit(hba);
} else {
/*
* Make sure that when reader code sees UFS initialization has finished,
* all initialization steps have really been executed.
*/
smp_store_release(&hba->logical_unit_scan_finished, true);
}
}

Expand Down Expand Up @@ -10316,30 +10319,12 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
*/
ufshcd_set_ufs_dev_active(hba);

/* Initialize devfreq */
if (ufshcd_is_clkscaling_supported(hba)) {
memcpy(&hba->clk_scaling.saved_pwr_info.info,
&hba->pwr_info,
sizeof(struct ufs_pa_layer_attr));
hba->clk_scaling.saved_pwr_info.is_valid = true;
hba->clk_scaling.is_allowed = true;

err = ufshcd_devfreq_init(hba);
if (err)
goto rpm_put_sync;

hba->clk_scaling.is_enabled = true;
ufshcd_init_clk_scaling_sysfs(hba);
}

async_schedule(ufshcd_async_scan, hba);
ufs_sysfs_add_nodes(hba->dev);

device_enable_async_suspend(dev);
return 0;

rpm_put_sync:
pm_runtime_put_sync(dev);
free_tmf_queue:
blk_mq_destroy_queue(hba->tmf_queue);
blk_put_queue(hba->tmf_queue);
Expand Down
1 change: 0 additions & 1 deletion include/ufs/ufshcd.h
Original file line number Diff line number Diff line change
Expand Up @@ -979,7 +979,6 @@ struct ufs_hba {
struct completion *uic_async_done;

enum ufshcd_state ufshcd_state;
bool logical_unit_scan_finished;
u32 eh_flags;
u32 intr_mask;
u16 ee_ctrl_mask;
Expand Down

0 comments on commit 86eb94b

Please sign in to comment.