Commit 86eb94bf authored by Adrien Thierry's avatar Adrien Thierry Committed by Martin K. Petersen
Browse files

scsi: Revert "scsi: ufs: core: Initialize devfreq synchronously"

This reverts commit 7dafc3e0.

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: default avatarAdrien Thierry <athierry@redhat.com>
Link: https://lore.kernel.org/r/20230329205426.46393-1-athierry@redhat.com


Reviewed-by: default avatarStanley Chu <stanley.chu@mediatek.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent d684a7a2
Loading
Loading
Loading
Loading
+16 −31
Original line number Diff line number Diff line
@@ -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;

@@ -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);
@@ -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);
	}
}

@@ -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);
+0 −1
Original line number Diff line number Diff line
@@ -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;