linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mad Horse <equu@openmail.cc>
To: lpieralisi@kernel.org, toke@toke.dk, kvalo@kernel.org
Cc: linux-pci@vger.kernel.org, robh@kernel.org,
	linux-wireless@vger.kernel.org, ath10k@lists.infradead.org,
	Edward Chow <equu@openmail.cc>
Subject: [PATCH 3/3] wifi: ath10k: only load compatible DT cal data
Date: Tue, 17 Jan 2023 18:02:45 +0800	[thread overview]
Message-ID: <8a9332b2-47ff-7f5f-cb11-667e6d6f5d9d@openmail.cc> (raw)
In-Reply-To: <ea4e2fed-383d-829d-8a2a-9239768ccd94@openmail.cc>

Loading calibration data from an OF device tree node not declared
compatible with the device (e.g. a PCI device with calibration data
from corresponding DT node gets replaced, so the newly installed
device become incompatible with the node) or driver may lead to fatal
result, e.g. kernel panic.

The driver should check whether the DT node corresponding to the
device compatible with it, and load calibration data only from
compatible node.

Signed-off-by: Edward Chow <equu@openmail.cc>
---
drivers/net/wireless/ath/ath10k/core.c | 28 ++++++++++++++++++++++++++
drivers/net/wireless/ath/ath10k/pci.c | 2 +-
drivers/net/wireless/ath/ath10k/pci.h | 2 ++
3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.c 
b/drivers/net/wireless/ath/ath10k/core.c
index 5eb131ab916f..e4d7ec7f3b59 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -26,6 +26,7 @@
#include "testmode.h"
#include "wmi-ops.h"
#include "coredump.h"
+#include "pci.h"
unsigned int ath10k_debug_mask;
EXPORT_SYMBOL(ath10k_debug_mask);
@@ -1958,6 +1959,33 @@ static int ath10k_download_cal_nvmem(struct 
ath10k *ar, const char *cell_name)
size_t len;
int ret;
+ /* devm_nvmem_cell_get() will get a cell first from the OF
+ * DT node representing the given device with nvmem-cell-name
+ * "calibration", and from the global lookup table as a fallback,
+ * and an ath9k device could be either a pci one or a platform one.
+ *
+ * If the OF DT node is not compatible with the real device, the
+ * calibration data got from the node should not be applied.
+ *
+ * dev_is_pci(ar->dev) && ( no OF node || caldata not from node
+ * || not compatible ) -> do not use caldata .
+ *
+ * !dev_is_pci(ar->dev) -> always use caldata .
+ *
+ * The judgement for compatibility differs with ath9k for many
+ * DT using "qcom,ath10k" as compatibility string.
+ */
+ if (dev_is_pci(ar->dev) &&
+ (!ar->dev->of_node ||
+ (of_property_match_string(ar->dev->of_node,
+ "nvmem-cell-names",
+ cell_name) < 0) ||
+ !of_device_is_compatible(ar->dev->of_node,
+ "qcom,ath10k") ||
+ !of_pci_node_match_device(ar->dev->of_node,
+ &ath10k_pci_driver)))
+ return ERR_PTR(-ENOENT);
+
cell = devm_nvmem_cell_get(ar->dev, cell_name);
if (IS_ERR(cell)) {
ret = PTR_ERR(cell);
diff --git a/drivers/net/wireless/ath/ath10k/pci.c 
b/drivers/net/wireless/ath/ath10k/pci.c
index 728d607289c3..5d9f6046f8cf 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -3780,7 +3780,7 @@ static SIMPLE_DEV_PM_OPS(ath10k_pci_pm_ops,
ath10k_pci_pm_suspend,
ath10k_pci_pm_resume);
-static struct pci_driver ath10k_pci_driver = {
+struct pci_driver ath10k_pci_driver = {
.name = "ath10k_pci",
.id_table = ath10k_pci_id_table,
.probe = ath10k_pci_probe,
diff --git a/drivers/net/wireless/ath/ath10k/pci.h 
b/drivers/net/wireless/ath/ath10k/pci.h
index 480cd97ab739..de676797b736 100644
--- a/drivers/net/wireless/ath/ath10k/pci.h
+++ b/drivers/net/wireless/ath/ath10k/pci.h
@@ -209,6 +209,8 @@ static inline struct ath10k_pci 
*ath10k_pci_priv(struct ath10k *ar)
#define DIAG_ACCESS_CE_TIMEOUT_US 10000 /* 10 ms */
#define DIAG_ACCESS_CE_WAIT_US 50
+extern struct pci_driver ath10k_pci_driver;
+
void ath10k_pci_write32(struct ath10k *ar, u32 offset, u32 value);
void ath10k_pci_soc_write32(struct ath10k *ar, u32 addr, u32 val);
void ath10k_pci_reg_write32(struct ath10k *ar, u32 addr, u32 val);

-- 
2.39.0


  parent reply	other threads:[~2023-01-17 10:03 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <ea4e2fed-383d-829d-8a2a-9239768ccd94@openmail.cc>
2023-01-17  9:27 ` [PATCH 1/3] PCI: of: Match pci devices or drivers against OF DT nodes Edward Chow
2023-01-17  9:27 ` [PATCH 2/3] wifi: ath9k: stop loading incompatible DT cal data Edward Chow
2023-01-17 19:46   ` Bjorn Helgaas
2023-02-01  3:02     ` Mad Horse
2023-02-01 21:43       ` Bjorn Helgaas
2023-02-02  4:18       ` [PATCH v2 0/3] PCI: of: Load extra data only from compatible DT nodes equu
2023-02-02  4:18         ` [PATCH v2 1/3] PCI: of: Match pci devices or drivers against OF " equu
2023-02-02  4:18         ` [PATCH v2 2/3] wifi: ath9k: stop loading incompatible DT cal data equu
2023-02-02  4:18         ` [PATCH v2 3/3] wifi: ath10k: only load compatible " equu
2023-02-02  7:26           ` kernel test robot
2023-02-02  7:55       ` [PATCH v3 0/3] PCI: of: Load extra data only from compatible DT nodes equu
2023-02-02  7:55         ` [PATCH v3 1/3] PCI: of: Match pci devices or drivers against OF " equu
2023-02-03  8:23           ` kernel test robot
2023-02-02  7:55         ` [PATCH v3 2/3] wifi: ath9k: stop loading incompatible DT cal data equu
2023-02-03  9:56           ` kernel test robot
2023-02-02  7:55         ` [PATCH v3 3/3] wifi: ath10k: only load compatible " equu
2023-02-03 11:38           ` kernel test robot
2023-02-03  8:37       ` [PATCH v4 0/3] PCI: of: Load extra data only from compatible DT nodes equu
2023-02-03  8:37         ` [PATCH v4 1/3] PCI: of: Match pci devices or drivers against OF " equu
2023-02-03  8:37         ` [PATCH v4 2/3] wifi: ath9k: stop loading incompatible DT cal data equu
2023-02-03  8:37         ` [PATCH v4 3/3] wifi: ath10k: only load compatible " equu
2023-02-03 10:48       ` [PATCH v5 0/3] PCI: of: Load extra data only from compatible DT nodes equu
2023-02-03 10:48         ` [PATCH v5 1/3] PCI: of: Match pci devices or drivers against OF " equu
2023-02-03 10:48         ` [PATCH v5 2/3] wifi: ath9k: stop loading incompatible DT cal data equu
2023-02-03 10:48         ` [PATCH v5 3/3] wifi: ath10k: only load compatible " equu
2023-02-03 15:57           ` Rob Herring
2023-02-03 17:15             ` equu
2023-02-03 18:45               ` Rob Herring
2023-02-04  4:26                 ` equu
2023-02-09  4:50       ` [PATCH v6 0/3] PCI: of: Load extra data only from compatible DT nodes equu
2023-02-09  4:50       ` [PATCH v6 1/3] PCI: of: Match pci devices or drivers against OF " equu
2023-02-09  4:50       ` [PATCH v6 2/3] wifi: ath9k: stop loading incompatible DT cal data equu
2023-02-09  4:50       ` [PATCH v6 3/3] wifi: ath10k: only load compatible " equu
2023-02-09 16:09         ` Rob Herring
2023-01-17  9:28 ` [PATCH " Edward Chow
2023-01-17 10:01 ` [PATCH 1/3] PCI: of: Match pci devices or drivers against OF DT nodes Mad Horse
2023-01-17 10:02 ` [PATCH 2/3] wifi: ath9k: stop loading incompatible DT cal data Mad Horse
2023-01-17 10:02 ` Mad Horse [this message]
2023-01-17 10:29 ` [PATCH 1/3] PCI: of: Match pci devices or drivers against OF DT nodes Mad Horse
2023-01-21 10:00 ` [PATCH 2/3] wifi: ath9k: stop loading incompatible DT cal data persmule
2023-01-21 10:06 ` [PATCH 3/3] wifi: ath10k: only load compatible " persmule

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8a9332b2-47ff-7f5f-cb11-667e6d6f5d9d@openmail.cc \
    --to=equu@openmail.cc \
    --cc=ath10k@lists.infradead.org \
    --cc=kvalo@kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=lpieralisi@kernel.org \
    --cc=robh@kernel.org \
    --cc=toke@toke.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).