All of lore.kernel.org
 help / color / mirror / Atom feed
From: 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,
	equu@openmail.cc, kernel test robot <lkp@intel.com>
Subject: [PATCH v6 3/3] wifi: ath10k: only load compatible DT cal data
Date: Thu,  9 Feb 2023 12:50:27 +0800	[thread overview]
Message-ID: <20230209045026.1806587-4-equu@openmail.cc> (raw)
In-Reply-To: <ab8ff515-19ec-fe3f-0237-c30275e9744d@openmail.cc>

From: Edward Chow <equu@openmail.cc>

ath10k might also be sensitive to the issue reported on
https://github.com/openwrt/openwrt/pull/11345 , loading calibration
data from a device tree node declared incompatible.

ath10k will first check whether the device tree node is compatible
with it, using the functionality introduced with the first patch of
this series, ("PCI: of: Match pci devices or drivers against OF DT
nodes") and only proceed loading calibration data from compatible node.

Signed-off-by: Edward Chow <equu@openmail.cc>
Reported-by: kernel test robot <lkp@intel.com>
---
 drivers/net/wireless/ath/ath10k/core.c | 31 ++++++++++++++++++++++++++
 drivers/net/wireless/ath/ath10k/hw.h   |  4 ++++
 drivers/net/wireless/ath/ath10k/pci.c  | 18 ++++++++++++++-
 drivers/net/wireless/ath/ath10k/pci.h  |  2 ++
 4 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
index 5eb131ab916f..4c9e8140aeff 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -13,6 +13,8 @@
 #include <linux/ctype.h>
 #include <linux/pm_qos.h>
 #include <linux/nvmem-consumer.h>
+#include <linux/of_pci.h>
+#include <linux/pci.h>
 #include <asm/byteorder.h>
 
 #include "core.h"
@@ -26,6 +28,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 +1961,34 @@ 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 ath10k 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_get_match_data(ar->dev) ||
+	     !(((const struct ath10k_hw_misc_flags *)
+		of_device_get_match_data(ar->dev))->need_calibration) ||
+	     !of_pci_node_match_driver(ar->dev->of_node,
+				       &ath10k_pci_driver)))
+		return -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/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
index 9643031a4427..8e19fa637905 100644
--- a/drivers/net/wireless/ath/ath10k/hw.h
+++ b/drivers/net/wireless/ath/ath10k/hw.h
@@ -384,6 +384,10 @@ struct ath10k_hw_values {
 	bool rfkill_on_level;
 };
 
+struct ath10k_hw_misc_flags {
+	bool need_calibration;
+};
+
 extern const struct ath10k_hw_values qca988x_values;
 extern const struct ath10k_hw_values qca6174_values;
 extern const struct ath10k_hw_values qca99x0_values;
diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c
index 728d607289c3..b6ea40631e1b 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -97,6 +97,22 @@ static const struct ath10k_pci_supp_chip ath10k_pci_supp_chips[] = {
 	{ QCA9887_1_0_DEVICE_ID, QCA9887_HW_1_0_CHIP_ID_REV },
 };
 
+static const struct ath10k_hw_misc_flags ath10k_pci_of_flag = {
+	.need_calibration = true,
+}
+
+static const struct of_device_id ath10k_pci_of_match[] = {
+	/* OF DT nodes for a generic ath10k pci devices
+	 * usually use this compatibility string.
+	 */
+	{ .compatible = "qcom,ath10k",
+	  .data = &ath10k_pci_of_flag
+	},
+	{ }
+};
+
+MODULE_DEVICE_TABLE(of, ath10k_pci_of_match);
+
 static void ath10k_pci_buffer_cleanup(struct ath10k *ar);
 static int ath10k_pci_cold_reset(struct ath10k *ar);
 static int ath10k_pci_safe_chip_reset(struct ath10k *ar);
@@ -3780,7 +3796,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.1


WARNING: multiple messages have this Message-ID (diff)
From: 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,
	equu@openmail.cc, kernel test robot <lkp@intel.com>
Subject: [PATCH v6 3/3] wifi: ath10k: only load compatible DT cal data
Date: Thu,  9 Feb 2023 12:50:27 +0800	[thread overview]
Message-ID: <20230209045026.1806587-4-equu@openmail.cc> (raw)
In-Reply-To: <ab8ff515-19ec-fe3f-0237-c30275e9744d@openmail.cc>

From: Edward Chow <equu@openmail.cc>

ath10k might also be sensitive to the issue reported on
https://github.com/openwrt/openwrt/pull/11345 , loading calibration
data from a device tree node declared incompatible.

ath10k will first check whether the device tree node is compatible
with it, using the functionality introduced with the first patch of
this series, ("PCI: of: Match pci devices or drivers against OF DT
nodes") and only proceed loading calibration data from compatible node.

Signed-off-by: Edward Chow <equu@openmail.cc>
Reported-by: kernel test robot <lkp@intel.com>
---
 drivers/net/wireless/ath/ath10k/core.c | 31 ++++++++++++++++++++++++++
 drivers/net/wireless/ath/ath10k/hw.h   |  4 ++++
 drivers/net/wireless/ath/ath10k/pci.c  | 18 ++++++++++++++-
 drivers/net/wireless/ath/ath10k/pci.h  |  2 ++
 4 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
index 5eb131ab916f..4c9e8140aeff 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -13,6 +13,8 @@
 #include <linux/ctype.h>
 #include <linux/pm_qos.h>
 #include <linux/nvmem-consumer.h>
+#include <linux/of_pci.h>
+#include <linux/pci.h>
 #include <asm/byteorder.h>
 
 #include "core.h"
@@ -26,6 +28,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 +1961,34 @@ 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 ath10k 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_get_match_data(ar->dev) ||
+	     !(((const struct ath10k_hw_misc_flags *)
+		of_device_get_match_data(ar->dev))->need_calibration) ||
+	     !of_pci_node_match_driver(ar->dev->of_node,
+				       &ath10k_pci_driver)))
+		return -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/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
index 9643031a4427..8e19fa637905 100644
--- a/drivers/net/wireless/ath/ath10k/hw.h
+++ b/drivers/net/wireless/ath/ath10k/hw.h
@@ -384,6 +384,10 @@ struct ath10k_hw_values {
 	bool rfkill_on_level;
 };
 
+struct ath10k_hw_misc_flags {
+	bool need_calibration;
+};
+
 extern const struct ath10k_hw_values qca988x_values;
 extern const struct ath10k_hw_values qca6174_values;
 extern const struct ath10k_hw_values qca99x0_values;
diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c
index 728d607289c3..b6ea40631e1b 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -97,6 +97,22 @@ static const struct ath10k_pci_supp_chip ath10k_pci_supp_chips[] = {
 	{ QCA9887_1_0_DEVICE_ID, QCA9887_HW_1_0_CHIP_ID_REV },
 };
 
+static const struct ath10k_hw_misc_flags ath10k_pci_of_flag = {
+	.need_calibration = true,
+}
+
+static const struct of_device_id ath10k_pci_of_match[] = {
+	/* OF DT nodes for a generic ath10k pci devices
+	 * usually use this compatibility string.
+	 */
+	{ .compatible = "qcom,ath10k",
+	  .data = &ath10k_pci_of_flag
+	},
+	{ }
+};
+
+MODULE_DEVICE_TABLE(of, ath10k_pci_of_match);
+
 static void ath10k_pci_buffer_cleanup(struct ath10k *ar);
 static int ath10k_pci_cold_reset(struct ath10k *ar);
 static int ath10k_pci_safe_chip_reset(struct ath10k *ar);
@@ -3780,7 +3796,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.1


_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k

  parent reply	other threads:[~2023-02-09  4:51 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-07 15:14 [PATCH] pci: Add functions to match pci dev or driver against OF DT node Mad Horse
2023-01-10 15:24 ` Bjorn Helgaas
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   ` Edward Chow
2023-01-17  9:27 ` [PATCH 2/3] wifi: ath9k: stop loading incompatible DT cal data Edward Chow
2023-01-17  9:27   ` Edward Chow
2023-01-17 19:46   ` Bjorn Helgaas
2023-01-17 19:46     ` Bjorn Helgaas
2023-02-01  3:02     ` Mad Horse
2023-02-01  3:02       ` Mad Horse
2023-02-01 21:43       ` Bjorn Helgaas
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         ` 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           ` equu
2023-02-02  4:18         ` [PATCH v2 2/3] wifi: ath9k: stop loading incompatible DT cal data equu
2023-02-02  4:18           ` equu
2023-02-02  4:18         ` [PATCH v2 3/3] wifi: ath10k: only load compatible " equu
2023-02-02  4:18           ` equu
2023-02-02  7:26           ` kernel test robot
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         ` equu
2023-02-02  7:55         ` [PATCH v3 1/3] PCI: of: Match pci devices or drivers against OF " equu
2023-02-02  7:55           ` equu
2023-02-03  8:23           ` kernel test robot
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-02  7:55           ` equu
2023-02-03  9:56           ` kernel test robot
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-02  7:55           ` equu
2023-02-03 11:38           ` kernel test robot
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         ` 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           ` equu
2023-02-03  8:37         ` [PATCH v4 2/3] wifi: ath9k: stop loading incompatible DT cal data equu
2023-02-03  8:37           ` equu
2023-02-03  8:37         ` [PATCH v4 3/3] wifi: ath10k: only load compatible " equu
2023-02-03  8:37           ` 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         ` 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           ` equu
2023-02-03 10:48         ` [PATCH v5 2/3] wifi: ath9k: stop loading incompatible DT cal data equu
2023-02-03 10:48           ` equu
2023-02-03 10:48         ` [PATCH v5 3/3] wifi: ath10k: only load compatible " equu
2023-02-03 10:48           ` equu
2023-02-03 15:57           ` Rob Herring
2023-02-03 15:57             ` Rob Herring
2023-02-03 17:15             ` equu
2023-02-03 17:15               ` equu
2023-02-03 18:45               ` Rob Herring
2023-02-03 18:45                 ` Rob Herring
2023-02-04  4:26                 ` equu
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         ` 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         ` equu
2023-02-09  4:50       ` [PATCH v6 2/3] wifi: ath9k: stop loading incompatible DT cal data equu
2023-02-09  4:50         ` equu
2023-02-09  4:50       ` equu [this message]
2023-02-09  4:50         ` [PATCH v6 3/3] wifi: ath10k: only load compatible " equu
2023-02-09 16:09         ` Rob Herring
2023-02-09 16:09           ` Rob Herring
2023-01-17  9:28 ` [PATCH " Edward Chow
2023-01-17  9:28   ` 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:01   ` 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
2023-01-17 10:02 ` [PATCH 3/3] wifi: ath10k: only load compatible " Mad Horse
2023-01-17 10:02   ` Mad Horse
2023-01-17 10:29 ` [PATCH 1/3] PCI: of: Match pci devices or drivers against OF DT nodes Mad Horse
2023-01-17 10:29   ` Mad Horse
2023-01-21 10:00 ` [PATCH 2/3] wifi: ath9k: stop loading incompatible DT cal data persmule
2023-01-21 10:00   ` persmule
2023-01-21 10:06 ` [PATCH 3/3] wifi: ath10k: only load compatible " persmule
2023-01-21 10:06   ` 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=20230209045026.1806587-4-equu@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=lkp@intel.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.