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

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

cnss2: Load firmware image based on WLAN device version



Populate WLAN device version info from MHI and load firmware image
based on it. Also expose the same info to WLAN host driver.

Change-Id: Iab8e9219b37da8c75c80928b4bef9a76719e540c
Signed-off-by: default avatarYue Ma <yuem@codeaurora.org>
Signed-off-by: default avatarKai Liu <kaliu@codeaurora.org>
parent 0abb3e81
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -277,6 +277,7 @@ struct cnss_plat_data {
	struct notifier_block modem_nb;
	struct notifier_block modem_nb;
	struct cnss_platform_cap cap;
	struct cnss_platform_cap cap;
	struct pm_qos_request qos_request;
	struct pm_qos_request qos_request;
	struct cnss_device_version device_version;
	unsigned long device_id;
	unsigned long device_id;
	enum cnss_driver_status driver_status;
	enum cnss_driver_status driver_status;
	u32 recovery_count;
	u32 recovery_count;
+46 −3
Original line number Original line Diff line number Diff line
@@ -46,6 +46,8 @@


#define DEFAULT_M3_FILE_NAME		"m3.bin"
#define DEFAULT_M3_FILE_NAME		"m3.bin"
#define DEFAULT_FW_FILE_NAME		"amss.bin"
#define DEFAULT_FW_FILE_NAME		"amss.bin"
#define FW_V2_FILE_NAME			"amss20.bin"
#define FW_V2_NUMBER			2


#define WAKE_MSI_NAME			"WAKE"
#define WAKE_MSI_NAME			"WAKE"


@@ -2041,13 +2043,21 @@ EXPORT_SYMBOL(cnss_smmu_map);
int cnss_get_soc_info(struct device *dev, struct cnss_soc_info *info)
int cnss_get_soc_info(struct device *dev, struct cnss_soc_info *info)
{
{
	struct cnss_pci_data *pci_priv = cnss_get_pci_priv(to_pci_dev(dev));
	struct cnss_pci_data *pci_priv = cnss_get_pci_priv(to_pci_dev(dev));
	struct cnss_plat_data *plat_priv;


	if (!pci_priv)
	if (!pci_priv)
		return -ENODEV;
		return -ENODEV;


	plat_priv = pci_priv->plat_priv;
	if (!plat_priv)
		return -ENODEV;

	info->va = pci_priv->bar;
	info->va = pci_priv->bar;
	info->pa = pci_resource_start(pci_priv->pci_dev, PCI_BAR_NUM);
	info->pa = pci_resource_start(pci_priv->pci_dev, PCI_BAR_NUM);


	memcpy(&info->device_version, &plat_priv->device_version,
	       sizeof(plat_priv->device_version));

	return 0;
	return 0;
}
}
EXPORT_SYMBOL(cnss_get_soc_info);
EXPORT_SYMBOL(cnss_get_soc_info);
@@ -2630,6 +2640,33 @@ static int cnss_pci_get_mhi_msi(struct cnss_pci_data *pci_priv)
	return 0;
	return 0;
}
}


static void cnss_pci_update_fw_name(struct cnss_pci_data *pci_priv)
{
	struct cnss_plat_data *plat_priv = pci_priv->plat_priv;
	struct mhi_controller *mhi_ctrl = pci_priv->mhi_ctrl;

	plat_priv->device_version.family_number = mhi_ctrl->family_number;
	plat_priv->device_version.device_number = mhi_ctrl->device_number;
	plat_priv->device_version.major_version = mhi_ctrl->major_version;
	plat_priv->device_version.minor_version = mhi_ctrl->minor_version;

	cnss_pr_dbg("Get device version info, family number: 0x%x, device number: 0x%x, major version: 0x%x, minor version: 0x%x\n",
		    plat_priv->device_version.family_number,
		    plat_priv->device_version.device_number,
		    plat_priv->device_version.major_version,
		    plat_priv->device_version.minor_version);

	if (pci_priv->device_id == QCA6390_DEVICE_ID &&
	    plat_priv->device_version.major_version >= FW_V2_NUMBER) {
		snprintf(plat_priv->firmware_name,
			 sizeof(plat_priv->firmware_name),
			 "%s" FW_V2_FILE_NAME, cnss_get_fw_path(plat_priv));
		mhi_ctrl->fw_image = plat_priv->firmware_name;
	}

	cnss_pr_dbg("Firmware name is %s\n", mhi_ctrl->fw_image);
}

static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv)
static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv)
{
{
	int ret = 0;
	int ret = 0;
@@ -3081,9 +3118,6 @@ static int cnss_pci_probe(struct pci_dev *pci_dev,
	plat_priv->device_id = pci_dev->device;
	plat_priv->device_id = pci_dev->device;
	plat_priv->bus_priv = pci_priv;
	plat_priv->bus_priv = pci_priv;


	snprintf(plat_priv->firmware_name, sizeof(plat_priv->firmware_name),
		 "%s" DEFAULT_FW_FILE_NAME, cnss_get_fw_path(plat_priv));

	ret = cnss_pci_get_dev_cfg_node(plat_priv);
	ret = cnss_pci_get_dev_cfg_node(plat_priv);
	if (ret) {
	if (ret) {
		cnss_pr_err("Failed to get device cfg node, err = %d\n", ret);
		cnss_pr_err("Failed to get device cfg node, err = %d\n", ret);
@@ -3146,11 +3180,20 @@ static int cnss_pci_probe(struct pci_dev *pci_dev,
		ret = cnss_pci_enable_msi(pci_priv);
		ret = cnss_pci_enable_msi(pci_priv);
		if (ret)
		if (ret)
			goto disable_bus;
			goto disable_bus;

		snprintf(plat_priv->firmware_name,
			 sizeof(plat_priv->firmware_name),
			 "%s" DEFAULT_FW_FILE_NAME,
			 cnss_get_fw_path(plat_priv));

		ret = cnss_pci_register_mhi(pci_priv);
		ret = cnss_pci_register_mhi(pci_priv);
		if (ret) {
		if (ret) {
			cnss_pci_disable_msi(pci_priv);
			cnss_pci_disable_msi(pci_priv);
			goto disable_bus;
			goto disable_bus;
		}
		}
		/* Update fw name according to different chip subtype */
		cnss_pci_update_fw_name(pci_priv);

		if (EMULATION_HW)
		if (EMULATION_HW)
			break;
			break;
		ret = cnss_suspend_pci_link(pci_priv);
		ret = cnss_suspend_pci_link(pci_priv);