Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a74135c0 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "scsi: ufs: perform ice_init as part of UFS initialization"

parents 5ebfd8ac d63fc7fa
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -362,6 +362,13 @@ int ufs_qcom_ice_reset(struct ufs_qcom_host *qcom_host)
		err = -ETIMEDOUT;
	}

	if (qcom_host->ice.state != UFS_QCOM_ICE_STATE_ACTIVE) {
		dev_err(qcom_host->hba->dev,
			"%s: error. ice.state (%d) is not in active state\n",
			__func__, qcom_host->ice.state);
		err = -EINVAL;
	}

out:
	return err;
}
+24 −16
Original line number Diff line number Diff line
@@ -304,18 +304,20 @@ static int ufs_qcom_hce_enable_notify(struct ufs_hba *hba, bool status)
		 * is initialized.
		 */
		err = ufs_qcom_enable_lane_clks(host);
		if (!err && host->ice.pdev) {
			err = ufs_qcom_ice_init(host);
			if (err) {
				dev_err(hba->dev, "%s: ICE init failed (%d)\n",
					__func__, err);
				err = -EINVAL;
			}
		}

		break;
	case POST_CHANGE:
		/* check if UFS PHY moved from DISABLED to HIBERN8 */
		err = ufs_qcom_check_hibern8(hba);
		ufs_qcom_enable_hw_clk_gating(hba);
		if (!err) {
			err = ufs_qcom_ice_reset(host);
			if (err)
				dev_err(hba->dev,
					"%s: ufs_qcom_ice_reset() failed %d\n",
					__func__, err);
		}

		break;
	default:
@@ -612,6 +614,20 @@ out:
	return err;
}

static
int ufs_qcom_crytpo_engine_reset(struct ufs_hba *hba)
{
	struct ufs_qcom_host *host = hba->priv;
	int err = 0;

	if (!host->ice.pdev)
		goto out;

	err = ufs_qcom_ice_reset(host);
out:
	return err;
}

static int ufs_qcom_crypto_engine_eh(struct ufs_hba *hba)
{
	struct ufs_qcom_host *host = hba->priv;
@@ -1175,15 +1191,6 @@ static int ufs_qcom_init(struct ufs_hba *hba)
	hba->caps |= UFSHCD_CAP_AUTO_BKOPS_SUSPEND;
	hba->caps |= UFSHCD_CAP_HIBERN8_ENTER_ON_IDLE;
	ufs_qcom_setup_clocks(hba, true);
	if (host->ice.pdev) {
		err = ufs_qcom_ice_init(host);
		if (err) {
			dev_err(dev, "%s: ICE driver initialization failed (%d)\n",
				__func__, err);
			device_remove_file(dev, &host->bus_vote.max_bus_bw);
			goto out_disable_phy;
		}
	}

	if (hba->dev->id < MAX_UFS_QCOM_HOSTS)
		ufs_qcom_hosts[hba->dev->id] = host;
@@ -1351,6 +1358,7 @@ const struct ufs_hba_variant_ops ufs_hba_qcom_vops = {
	.resume			= ufs_qcom_resume,
	.update_sec_cfg		= ufs_qcom_update_sec_cfg,
	.crypto_engine_cfg	= ufs_qcom_crytpo_engine_cfg,
	.crypto_engine_reset	= ufs_qcom_crytpo_engine_reset,
	.crypto_engine_eh	= ufs_qcom_crypto_engine_eh,
	.crypto_engine_get_err	= ufs_qcom_crypto_engine_get_err,
	.crypto_engine_reset_err = ufs_qcom_crypto_engine_reset_err,
+14 −1
Original line number Diff line number Diff line
@@ -5853,8 +5853,21 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba *hba)
	/* Establish the link again and restore the device */
	err = ufshcd_probe_hba(hba);

	if (!err && (hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL))
	if (!err && (hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL)) {
		err = -EIO;
		goto out;
	}

	if (hba->vops->crypto_engine_reset) {
		err = hba->vops->crypto_engine_reset(hba);
		if (err) {
			dev_err(hba->dev,
				"%s: failed to reset crypto engine %d\n",
				__func__, err);
			goto out;
		}
	}

out:
	if (err)
		dev_err(hba->dev, "%s: Host init failed %d\n", __func__, err);
+1 −0
Original line number Diff line number Diff line
@@ -397,6 +397,7 @@ struct ufs_hba_variant_ops {
	int     (*resume)(struct ufs_hba *, enum ufs_pm_op);
	int	(*update_sec_cfg)(struct ufs_hba *hba, bool restore_sec_cfg);
	int	(*crypto_engine_cfg)(struct ufs_hba *, unsigned int);
	int	(*crypto_engine_reset)(struct ufs_hba *);
	int	(*crypto_engine_eh)(struct ufs_hba *);
	int	(*crypto_engine_get_err)(struct ufs_hba *);
	void	(*crypto_engine_reset_err)(struct ufs_hba *);