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

Commit c6e3cdbe authored by Yue Ma's avatar Yue Ma
Browse files

cnss2: Get MSI base data directly from MSI description



Instead of reading from PCI config space, get MSI base data directly
from MSI description of PCI framework. This can avoid knowing the
device capability (32-bit or 64-bit) which results different config
space offset for driver to read.

Change-Id: Id52f2f3f85928f269da9f01aaf4bc22c5d1cf581
CRs-fixed: 2025945
Signed-off-by: default avatarYue Ma <yuem@codeaurora.org>
parent a0f202dd
Loading
Loading
Loading
Loading
+19 −4
Original line number Diff line number Diff line
@@ -11,7 +11,9 @@
 */

#include <linux/firmware.h>
#include <linux/irq.h>
#include <linux/module.h>
#include <linux/msi.h>
#include <linux/of.h>
#include <linux/pm_runtime.h>

@@ -806,7 +808,7 @@ static int cnss_pci_enable_msi(struct cnss_pci_data *pci_priv)
	struct pci_dev *pci_dev = pci_priv->pci_dev;
	int num_vectors;
	struct cnss_msi_config *msi_config;
	uint32_t ep_base_data;
	struct msi_desc *msi_desc;

	ret = cnss_pci_get_msi_assignment(pci_priv);
	if (ret) {
@@ -831,12 +833,25 @@ static int cnss_pci_enable_msi(struct cnss_pci_data *pci_priv)
		goto reset_msi_config;
	}

	pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_DATA_64,
			      &ep_base_data);
	pci_priv->msi_ep_base_data = ep_base_data & 0xFFFF;
	msi_desc = irq_get_msi_desc(pci_dev->irq);
	if (!msi_desc) {
		cnss_pr_err("msi_desc is NULL!\n");
		ret = -EINVAL;
		goto disable_msi;
	}

	pci_priv->msi_ep_base_data = msi_desc->msg.data;
	if (!pci_priv->msi_ep_base_data) {
		cnss_pr_err("Got 0 MSI base data!\n");
		CNSS_ASSERT(0);
	}

	cnss_pr_dbg("MSI base data is %d\n", pci_priv->msi_ep_base_data);

	return 0;

disable_msi:
	pci_disable_msi(pci_priv->pci_dev);
reset_msi_config:
	pci_priv->msi_config = NULL;
out: