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

Commit dc0ecaca authored by Yue Ma's avatar Yue Ma Committed by Gerrit - the friendly Code Review server
Browse files

cnss2: Set initial target PCIe link speed to Gen2 for QCA6490



Since there may be link issues if QCA6490 device boots up with Gen3
link speed, always set initial target PCIe link speed to Gen2. Device
is able to change it (back) later at any time if needed.

Change-Id: I9d617d71926fe98e59e67aff772984878e0a2689
Signed-off-by: default avatarYue Ma <yuem@codeaurora.org>
parent d0cb56ec
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. */
/* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. */

#ifndef _CNSS_MAIN_H
#define _CNSS_MAIN_H
@@ -418,6 +418,7 @@ struct cnss_plat_data {
	struct cnss_platform_cap cap;
	struct pm_qos_request qos_request;
	struct cnss_device_version device_version;
	u32 rc_num;
	unsigned long device_id;
	enum cnss_driver_status driver_status;
	u32 recovery_count;
+34 −5
Original line number Diff line number Diff line
@@ -4895,22 +4895,36 @@ static int cnss_mhi_bw_scale(struct mhi_controller *mhi_ctrl,
			     struct mhi_link_info *link_info)
{
	struct cnss_pci_data *pci_priv = mhi_ctrl->priv_data;
	struct cnss_plat_data *plat_priv = pci_priv->plat_priv;
	int ret = 0;

	ret = msm_pcie_set_link_bandwidth(pci_priv->pci_dev,
	cnss_pr_dbg("Setting link speed:0x%x, width:0x%x\n",
		    link_info->target_link_speed,
		    link_info->target_link_width);

	/* It has to set target link speed here before setting link bandwidth
	 * when device requests link speed change. This can avoid setting link
	 * bandwidth getting rejected if requested link speed is higher than
	 * current one.
	 */
	ret = msm_pcie_set_target_link_speed(plat_priv->rc_num,
					     link_info->target_link_speed);
	if (ret)
		cnss_pr_err("Failed to set target link speed to 0x%x, err = %d\n",
			    link_info->target_link_speed, ret);

	ret = msm_pcie_set_link_bandwidth(pci_priv->pci_dev,
					  link_info->target_link_speed,
					  link_info->target_link_width);

	if (ret) {
		cnss_pr_err("Failed to set link bandwidth, err = %d\n", ret);
		return ret;
	}

	pci_priv->def_link_speed = link_info->target_link_speed;
	pci_priv->def_link_width = link_info->target_link_width;

	cnss_pr_dbg("Setting link speed:0x%x, width:0x%x\n",
		    link_info->target_link_speed,
		    link_info->target_link_width);

	return 0;
}

@@ -5273,6 +5287,21 @@ int cnss_pci_init(struct cnss_plat_data *plat_priv)
		goto out;
	}

	plat_priv->rc_num = rc_num;

	/* Always set initial target PCIe link speed to Gen2 for QCA6490 device
	 * since there may be link issues if it boots up with Gen3 link speed.
	 * Device is able to change it later at any time. It will be rejected
	 * if requested speed is higher than the one specified in PCIe DT.
	 */
	if (plat_priv->device_id == QCA6490_DEVICE_ID) {
		ret = msm_pcie_set_target_link_speed(rc_num,
						     PCI_EXP_LNKSTA_CLS_5_0GB);
		if (ret)
			cnss_pr_err("Failed to set target PCIe link speed to Gen2, err = %d\n",
				    ret);
	}

retry:
	ret = msm_pcie_enumerate(rc_num);
	if (ret) {