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

Commit 3571dd55 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cnss2: Load firmware image based on WLAN device version"

parents abd5bd59 32ee778c
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -1188,6 +1188,7 @@ int of_register_mhi_controller(struct mhi_controller *mhi_cntrl)
	struct mhi_chan *mhi_chan;
	struct mhi_cmd *mhi_cmd;
	struct mhi_device *mhi_dev;
	u32 soc_info;

	if (!mhi_cntrl->of_node)
		return -EINVAL;
@@ -1253,6 +1254,27 @@ int of_register_mhi_controller(struct mhi_controller *mhi_cntrl)
		mhi_cntrl->unmap_single = mhi_unmap_single_no_bb;
	}

	/* read the device info if possible */
	if (mhi_cntrl->regs) {
		ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs,
				   SOC_HW_VERSION_OFFS, &soc_info);
		if (ret)
			goto error_alloc_dev;

		mhi_cntrl->family_number =
			(soc_info & SOC_HW_VERSION_FAM_NUM_BMSK) >>
			SOC_HW_VERSION_FAM_NUM_SHFT;
		mhi_cntrl->device_number =
			(soc_info & SOC_HW_VERSION_DEV_NUM_BMSK) >>
			SOC_HW_VERSION_DEV_NUM_SHFT;
		mhi_cntrl->major_version =
			(soc_info & SOC_HW_VERSION_MAJOR_VER_BMSK) >>
			SOC_HW_VERSION_MAJOR_VER_SHFT;
		mhi_cntrl->minor_version =
			(soc_info & SOC_HW_VERSION_MINOR_VER_BMSK) >>
			SOC_HW_VERSION_MINOR_VER_SHFT;
	}

	/* register controller with mhi_bus */
	mhi_dev = mhi_alloc_device(mhi_cntrl);
	if (!mhi_dev) {
+10 −0
Original line number Diff line number Diff line
@@ -215,6 +215,16 @@ extern struct bus_type mhi_bus_type;
#define BHIE_RXVECSTATUS_STATUS_XFER_COMPL (0x02)
#define BHIE_RXVECSTATUS_STATUS_ERROR (0x03)

#define SOC_HW_VERSION_OFFS (0x224)
#define SOC_HW_VERSION_FAM_NUM_BMSK (0xF0000000)
#define SOC_HW_VERSION_FAM_NUM_SHFT (28)
#define SOC_HW_VERSION_DEV_NUM_BMSK (0x0FFF0000)
#define SOC_HW_VERSION_DEV_NUM_SHFT (16)
#define SOC_HW_VERSION_MAJOR_VER_BMSK (0x0000FF00)
#define SOC_HW_VERSION_MAJOR_VER_SHFT (8)
#define SOC_HW_VERSION_MINOR_VER_BMSK (0x000000FF)
#define SOC_HW_VERSION_MINOR_VER_SHFT (0)

/* convert ticks to micro seconds by dividing by 19.2 */
#define TIME_TICKS_TO_US(x) (div_u64((x) * 10, 192))

+1 −0
Original line number Diff line number Diff line
@@ -275,6 +275,7 @@ struct cnss_plat_data {
	struct notifier_block modem_nb;
	struct cnss_platform_cap cap;
	struct pm_qos_request qos_request;
	struct cnss_device_version device_version;
	unsigned long device_id;
	enum cnss_driver_status driver_status;
	u32 recovery_count;
+38 −0
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@
#define MAX_M3_FILE_NAME_LENGTH		13
#define DEFAULT_M3_FILE_NAME		"m3.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"

@@ -1950,13 +1952,21 @@ EXPORT_SYMBOL(cnss_smmu_map);
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_plat_data *plat_priv;

	if (!pci_priv)
		return -ENODEV;

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

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

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

	return 0;
}
EXPORT_SYMBOL(cnss_get_soc_info);
@@ -2546,6 +2556,32 @@ static int cnss_pci_get_mhi_msi(struct cnss_pci_data *pci_priv)
	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) {
		scnprintf(plat_priv->firmware_name,
			  sizeof(plat_priv->firmware_name), FW_V2_FILE_NAME);
		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)
{
	int ret = 0;
@@ -2611,6 +2647,8 @@ static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv)
		return ret;
	}

	cnss_pci_update_fw_name(pci_priv);

	return 0;
}

+4 −0
Original line number Diff line number Diff line
@@ -201,6 +201,10 @@ struct mhi_controller {
	u32 domain;
	u32 bus;
	u32 slot;
	u32 family_number;
	u32 device_number;
	u32 major_version;
	u32 minor_version;

	/* addressing window */
	dma_addr_t iova_start;