From: Ansuel Smith <ansuelsmth@gmail.com> To: Kalle Valo <kvalo@codeaurora.org> Cc: Ansuel Smith <ansuelsmth@gmail.com>, "David S. Miller" <davem@davemloft.net>, Jakub Kicinski <kuba@kernel.org>, Rob Herring <robh+dt@kernel.org>, linux-wireless@vger.kernel.org, netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, ath10k@lists.infradead.org Subject: [PATCH] ath10k: Introduce download cal from mtd Date: Fri, 18 Sep 2020 18:29:27 +0200 [thread overview] Message-ID: <20200918162928.14335-1-ansuelsmth@gmail.com> (raw) Most of routers that have the ath10k wifi chip integrated in the Soc have the pre-cal data stored in the art (or equivalent) mtd partition. Introduce a new function to directly extract and use it based on what is set in the dt if the system have mtd support. Pre-cal file have still priority to everything else. Tested-on: QCA9984 hw1.0 PCI 10.4 Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> --- drivers/net/wireless/ath/ath10k/core.c | 74 ++++++++++++++++++++++++++ drivers/net/wireless/ath/ath10k/core.h | 3 ++ 2 files changed, 77 insertions(+) diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c index 5f4e12196..eef00d657 100644 --- a/drivers/net/wireless/ath/ath10k/core.c +++ b/drivers/net/wireless/ath/ath10k/core.c @@ -13,6 +13,7 @@ #include <linux/ctype.h> #include <linux/pm_qos.h> #include <asm/byteorder.h> +#include <linux/mtd/mtd.h> #include "core.h" #include "mac.h" @@ -1701,6 +1702,69 @@ static int ath10k_download_and_run_otp(struct ath10k *ar) return 0; } +static int ath10k_download_cal_mtd(struct ath10k *ar) +{ +#ifdef CONFIG_MTD + struct device_node *node, *mtd_node = NULL; + struct mtd_info *mtd; + const __be32 *list; + u32 offset, size; + const char *part; + phandle phandle; + size_t retlen; + char *file; + int ret; + + node = ar->dev->of_node; + if (!node) + return -ENOENT; + + list = of_get_property(node, "qcom,ath10k-pre-calibration-data-mtd", &size); + if (!list || (size != (3 * sizeof(*list)))) + return -EINVAL; + + phandle = be32_to_cpup(list++); + if (phandle) + mtd_node = of_find_node_by_phandle(phandle); + + if (!mtd_node) + return -ENODEV; + + part = of_get_property(mtd_node, "label", NULL); + if (!part) + part = mtd_node->name; + + mtd = get_mtd_device_nm(part); + if (IS_ERR(mtd)) + return -ENODEV; + + offset = be32_to_cpup(list++); + size = be32_to_cpup(list); + + file = kzalloc(size, GFP_KERNEL); + if (!file) + return -ENOMEM; + + ret = mtd_read(mtd, offset, size, &retlen, file); + put_mtd_device(mtd); + + ret = ath10k_download_board_data(ar, file, size); + if (ret) { + ath10k_err(ar, "failed to download cal_file data: %d\n", ret); + goto err; + } + + ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot cal file downloaded\n"); + + return 0; + +err: + kfree(file); + return ret; +#endif + return -EOPNOTSUPP; +} + static int ath10k_download_cal_file(struct ath10k *ar, const struct firmware *file) { @@ -2047,6 +2111,16 @@ static int ath10k_core_pre_cal_download(struct ath10k *ar) goto success; } + ath10k_dbg(ar, ATH10K_DBG_BOOT, + "boot did not find a pre calibration file, try MTD next: %d\n", + ret); + + ret = ath10k_download_cal_mtd(ar); + if (ret == 0) { + ar->cal_mode = ATH10K_PRE_CAL_MODE_MTD; + goto success; + } + ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot did not find a pre calibration file, try DT next: %d\n", ret); diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h index 4cf5bd489..3ca158605 100644 --- a/drivers/net/wireless/ath/ath10k/core.h +++ b/drivers/net/wireless/ath/ath10k/core.h @@ -864,6 +864,7 @@ enum ath10k_cal_mode { ATH10K_CAL_MODE_OTP, ATH10K_CAL_MODE_DT, ATH10K_PRE_CAL_MODE_FILE, + ATH10K_PRE_CAL_MODE_MTD, ATH10K_PRE_CAL_MODE_DT, ATH10K_CAL_MODE_EEPROM, }; @@ -886,6 +887,8 @@ static inline const char *ath10k_cal_mode_str(enum ath10k_cal_mode mode) return "dt"; case ATH10K_PRE_CAL_MODE_FILE: return "pre-cal-file"; + case ATH10K_PRE_CAL_MODE_MTD: + return "pre-cal-mtd"; case ATH10K_PRE_CAL_MODE_DT: return "pre-cal-dt"; case ATH10K_CAL_MODE_EEPROM: -- 2.27.0
WARNING: multiple messages have this Message-ID (diff)
From: Ansuel Smith <ansuelsmth@gmail.com> To: Kalle Valo <kvalo@codeaurora.org> Cc: devicetree@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, ath10k@lists.infradead.org, "David S. Miller" <davem@davemloft.net>, Rob Herring <robh+dt@kernel.org>, Jakub Kicinski <kuba@kernel.org>, Ansuel Smith <ansuelsmth@gmail.com> Subject: [PATCH] ath10k: Introduce download cal from mtd Date: Fri, 18 Sep 2020 18:29:27 +0200 [thread overview] Message-ID: <20200918162928.14335-1-ansuelsmth@gmail.com> (raw) Most of routers that have the ath10k wifi chip integrated in the Soc have the pre-cal data stored in the art (or equivalent) mtd partition. Introduce a new function to directly extract and use it based on what is set in the dt if the system have mtd support. Pre-cal file have still priority to everything else. Tested-on: QCA9984 hw1.0 PCI 10.4 Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> --- drivers/net/wireless/ath/ath10k/core.c | 74 ++++++++++++++++++++++++++ drivers/net/wireless/ath/ath10k/core.h | 3 ++ 2 files changed, 77 insertions(+) diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c index 5f4e12196..eef00d657 100644 --- a/drivers/net/wireless/ath/ath10k/core.c +++ b/drivers/net/wireless/ath/ath10k/core.c @@ -13,6 +13,7 @@ #include <linux/ctype.h> #include <linux/pm_qos.h> #include <asm/byteorder.h> +#include <linux/mtd/mtd.h> #include "core.h" #include "mac.h" @@ -1701,6 +1702,69 @@ static int ath10k_download_and_run_otp(struct ath10k *ar) return 0; } +static int ath10k_download_cal_mtd(struct ath10k *ar) +{ +#ifdef CONFIG_MTD + struct device_node *node, *mtd_node = NULL; + struct mtd_info *mtd; + const __be32 *list; + u32 offset, size; + const char *part; + phandle phandle; + size_t retlen; + char *file; + int ret; + + node = ar->dev->of_node; + if (!node) + return -ENOENT; + + list = of_get_property(node, "qcom,ath10k-pre-calibration-data-mtd", &size); + if (!list || (size != (3 * sizeof(*list)))) + return -EINVAL; + + phandle = be32_to_cpup(list++); + if (phandle) + mtd_node = of_find_node_by_phandle(phandle); + + if (!mtd_node) + return -ENODEV; + + part = of_get_property(mtd_node, "label", NULL); + if (!part) + part = mtd_node->name; + + mtd = get_mtd_device_nm(part); + if (IS_ERR(mtd)) + return -ENODEV; + + offset = be32_to_cpup(list++); + size = be32_to_cpup(list); + + file = kzalloc(size, GFP_KERNEL); + if (!file) + return -ENOMEM; + + ret = mtd_read(mtd, offset, size, &retlen, file); + put_mtd_device(mtd); + + ret = ath10k_download_board_data(ar, file, size); + if (ret) { + ath10k_err(ar, "failed to download cal_file data: %d\n", ret); + goto err; + } + + ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot cal file downloaded\n"); + + return 0; + +err: + kfree(file); + return ret; +#endif + return -EOPNOTSUPP; +} + static int ath10k_download_cal_file(struct ath10k *ar, const struct firmware *file) { @@ -2047,6 +2111,16 @@ static int ath10k_core_pre_cal_download(struct ath10k *ar) goto success; } + ath10k_dbg(ar, ATH10K_DBG_BOOT, + "boot did not find a pre calibration file, try MTD next: %d\n", + ret); + + ret = ath10k_download_cal_mtd(ar); + if (ret == 0) { + ar->cal_mode = ATH10K_PRE_CAL_MODE_MTD; + goto success; + } + ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot did not find a pre calibration file, try DT next: %d\n", ret); diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h index 4cf5bd489..3ca158605 100644 --- a/drivers/net/wireless/ath/ath10k/core.h +++ b/drivers/net/wireless/ath/ath10k/core.h @@ -864,6 +864,7 @@ enum ath10k_cal_mode { ATH10K_CAL_MODE_OTP, ATH10K_CAL_MODE_DT, ATH10K_PRE_CAL_MODE_FILE, + ATH10K_PRE_CAL_MODE_MTD, ATH10K_PRE_CAL_MODE_DT, ATH10K_CAL_MODE_EEPROM, }; @@ -886,6 +887,8 @@ static inline const char *ath10k_cal_mode_str(enum ath10k_cal_mode mode) return "dt"; case ATH10K_PRE_CAL_MODE_FILE: return "pre-cal-file"; + case ATH10K_PRE_CAL_MODE_MTD: + return "pre-cal-mtd"; case ATH10K_PRE_CAL_MODE_DT: return "pre-cal-dt"; case ATH10K_CAL_MODE_EEPROM: -- 2.27.0 _______________________________________________ ath10k mailing list ath10k@lists.infradead.org http://lists.infradead.org/mailman/listinfo/ath10k
next reply other threads:[~2020-09-18 16:29 UTC|newest] Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-09-18 16:29 Ansuel Smith [this message] 2020-09-18 16:29 ` [PATCH] ath10k: Introduce download cal from mtd Ansuel Smith 2020-09-18 16:29 ` [PATCH 2/2] dt: bindings: ath10k: Document qcom,ath10k-pre-calibration-data-mtd Ansuel Smith 2020-09-18 16:29 ` [PATCH 2/2] dt: bindings: ath10k: Document qcom, ath10k-pre-calibration-data-mtd Ansuel Smith 2020-09-18 16:53 ` Christian Lamparter 2020-09-18 16:53 ` Christian Lamparter 2020-09-18 16:53 ` Christian Lamparter 2020-09-18 18:08 ` R: " ansuelsmth 2020-09-18 18:08 ` ansuelsmth 2020-09-18 18:08 ` ansuelsmth 2020-09-18 18:31 ` ansuelsmth 2020-09-18 18:31 ` ansuelsmth 2020-09-18 18:31 ` ansuelsmth 2020-09-18 18:55 ` Christian Lamparter 2020-09-18 18:55 ` Christian Lamparter 2020-09-18 18:55 ` Christian Lamparter
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=20200918162928.14335-1-ansuelsmth@gmail.com \ --to=ansuelsmth@gmail.com \ --cc=ath10k@lists.infradead.org \ --cc=davem@davemloft.net \ --cc=devicetree@vger.kernel.org \ --cc=kuba@kernel.org \ --cc=kvalo@codeaurora.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-wireless@vger.kernel.org \ --cc=netdev@vger.kernel.org \ --cc=robh+dt@kernel.org \ /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: linkBe 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.