[source] ath10k: increase bmi timeout to fix OTP on qca99xx boards and add bmi identification through pre-cal file
LEDE Commits
lede-commits at lists.infradead.org
Sat Jun 17 03:20:19 PDT 2017
nbd pushed a commit to source.git, branch master:
https://git.lede-project.org/025cb640cdf27f7c68fc1d89d0698605daa06c43
commit 025cb640cdf27f7c68fc1d89d0698605daa06c43
Author: Pavel Kubelun <be.dissent at gmail.com>
AuthorDate: Thu Jun 1 17:13:04 2017 +0300
ath10k: increase bmi timeout to fix OTP on qca99xx boards and add bmi identification through pre-cal file
Backporting upstream patches.
Signed-off-by: Pavel Kubelun <be.dissent at gmail.com>
Signed-off-by: Felix Fietkau <nbd at nbd.name> [refresh, rename patches]
---
.../patches/327-ath10k-increase-BMI-timeout.patch | 31 +++++++++
...28-ath10k-log-when-longer-bmi-cmds-happen.patch | 74 ++++++++++++++++++++
...BMI-parameters-to-fix-calibration-from-DT.patch | 80 ++++++++++++++++++++++
.../921-ath10k_init_devices_synchronously.patch | 2 +-
.../936-ath10k-fix-otp-failure-result.patch | 2 +-
.../960-0010-ath10k-limit-htt-rx-ring-size.patch | 6 +-
.../960-0011-ath10k-limit-pci-buffer-size.patch | 12 ++--
7 files changed, 196 insertions(+), 11 deletions(-)
diff --git a/package/kernel/mac80211/patches/327-ath10k-increase-BMI-timeout.patch b/package/kernel/mac80211/patches/327-ath10k-increase-BMI-timeout.patch
new file mode 100644
index 0000000..c9f493b
--- /dev/null
+++ b/package/kernel/mac80211/patches/327-ath10k-increase-BMI-timeout.patch
@@ -0,0 +1,31 @@
+From: Ben Greear <greearb at candelatech.com>
+Date: Wed, 31 May 2017 14:21:19 +0300
+Subject: [PATCH] ath10k: increase BMI timeout
+
+When testing a 9888 chipset NIC, I notice it often takes
+almost 2 seconds, and then many times OTP fails, probably due
+to the two-second timeout.
+
+[ 2269.841842] ath10k_pci 0000:05:00.0: bmi cmd took: 1984 jiffies (HZ: 1000), rv: 0
+[ 2273.608185] ath10k_pci 0000:05:00.0: bmi cmd took: 1986 jiffies (HZ: 1000), rv: 0
+[ 2277.294732] ath10k_pci 0000:05:00.0: bmi cmd took: 1989 jiffies (HZ: 1000), rv: 0
+
+So, increase the BMI timeout to 3 seconds.
+
+Signed-off-by: Ben Greear <greearb at candelatech.com>
+Signed-off-by: Kalle Valo <kvalo at qca.qualcomm.com>
+---
+
+--- a/drivers/net/wireless/ath/ath10k/bmi.h
++++ b/drivers/net/wireless/ath/ath10k/bmi.h
+@@ -187,8 +187,8 @@ struct bmi_target_info {
+ u32 type;
+ };
+
+-/* in msec */
+-#define BMI_COMMUNICATION_TIMEOUT_HZ (2 * HZ)
++/* in jiffies */
++#define BMI_COMMUNICATION_TIMEOUT_HZ (3 * HZ)
+
+ #define BMI_CE_NUM_TO_TARG 0
+ #define BMI_CE_NUM_TO_HOST 1
diff --git a/package/kernel/mac80211/patches/328-ath10k-log-when-longer-bmi-cmds-happen.patch b/package/kernel/mac80211/patches/328-ath10k-log-when-longer-bmi-cmds-happen.patch
new file mode 100644
index 0000000..500f72f
--- /dev/null
+++ b/package/kernel/mac80211/patches/328-ath10k-log-when-longer-bmi-cmds-happen.patch
@@ -0,0 +1,74 @@
+From: Ben Greear <greearb at candelatech.com>
+Date: Wed, 31 May 2017 14:21:21 +0300
+Subject: [PATCH] ath10k: log when longer bmi cmds happen
+
+This lets one have a clue that maybe timeouts are happening
+when we just aren't waiting long enough.
+
+Signed-off-by: Ben Greear <greearb at candelatech.com>
+Signed-off-by: Kalle Valo <kvalo at qca.qualcomm.com>
+---
+
+--- a/drivers/net/wireless/ath/ath10k/pci.c
++++ b/drivers/net/wireless/ath/ath10k/pci.c
+@@ -101,7 +101,8 @@ static int ath10k_pci_init_irq(struct at
+ static int ath10k_pci_deinit_irq(struct ath10k *ar);
+ static int ath10k_pci_request_irq(struct ath10k *ar);
+ static void ath10k_pci_free_irq(struct ath10k *ar);
+-static int ath10k_pci_bmi_wait(struct ath10k_ce_pipe *tx_pipe,
++static int ath10k_pci_bmi_wait(struct ath10k *ar,
++ struct ath10k_ce_pipe *tx_pipe,
+ struct ath10k_ce_pipe *rx_pipe,
+ struct bmi_xfer *xfer);
+ static int ath10k_pci_qca99x0_chip_reset(struct ath10k *ar);
+@@ -1843,7 +1844,7 @@ int ath10k_pci_hif_exchange_bmi_msg(stru
+ if (ret)
+ goto err_resp;
+
+- ret = ath10k_pci_bmi_wait(ce_tx, ce_rx, &xfer);
++ ret = ath10k_pci_bmi_wait(ar, ce_tx, ce_rx, &xfer);
+ if (ret) {
+ u32 unused_buffer;
+ unsigned int unused_nbytes;
+@@ -1910,23 +1911,37 @@ static void ath10k_pci_bmi_recv_data(str
+ xfer->rx_done = true;
+ }
+
+-static int ath10k_pci_bmi_wait(struct ath10k_ce_pipe *tx_pipe,
++static int ath10k_pci_bmi_wait(struct ath10k *ar,
++ struct ath10k_ce_pipe *tx_pipe,
+ struct ath10k_ce_pipe *rx_pipe,
+ struct bmi_xfer *xfer)
+ {
+ unsigned long timeout = jiffies + BMI_COMMUNICATION_TIMEOUT_HZ;
++ unsigned long started = jiffies;
++ unsigned long dur;
++ int ret;
+
+ while (time_before_eq(jiffies, timeout)) {
+ ath10k_pci_bmi_send_done(tx_pipe);
+ ath10k_pci_bmi_recv_data(rx_pipe);
+
+- if (xfer->tx_done && (xfer->rx_done == xfer->wait_for_resp))
+- return 0;
++ if (xfer->tx_done && (xfer->rx_done == xfer->wait_for_resp)) {
++ ret = 0;
++ goto out;
++ }
+
+ schedule();
+ }
+
+- return -ETIMEDOUT;
++ ret = -ETIMEDOUT;
++
++out:
++ dur = jiffies - started;
++ if (dur > HZ)
++ ath10k_dbg(ar, ATH10K_DBG_BMI,
++ "bmi cmd took %lu jiffies hz %d ret %d\n",
++ dur, HZ, ret);
++ return ret;
+ }
+
+ /*
diff --git a/package/kernel/mac80211/patches/329-ath10k-add-BMI-parameters-to-fix-calibration-from-DT.patch b/package/kernel/mac80211/patches/329-ath10k-add-BMI-parameters-to-fix-calibration-from-DT.patch
new file mode 100644
index 0000000..3fcf505
--- /dev/null
+++ b/package/kernel/mac80211/patches/329-ath10k-add-BMI-parameters-to-fix-calibration-from-DT.patch
@@ -0,0 +1,80 @@
+From: Anilkumar Kolli <akolli at qti.qualcomm.com>
+Date: Wed, 31 May 2017 14:21:27 +0300
+Subject: [PATCH] ath10k: add BMI parameters to fix calibration from
+ DT/pre-cal
+
+QCA99X0, QCA9888, QCA9984 supports calibration data in
+either OTP or DT/pre-cal file. Current ath10k supports
+Calibration data from OTP only.
+
+If caldata is loaded from DT/pre-cal file, fetching board id
+and applying calibration parameters like tx power gets failed.
+
+error log:
+[ 15.733663] ath10k_pci 0000:01:00.0: failed to fetch board file: -2
+[ 15.741474] ath10k_pci 0000:01:00.0: could not probe fw (-2)
+
+This patch adds calibration data support from DT/pre-cal
+file. Below parameters are used to get board id and
+applying calibration parameters from cal data.
+
+ EEPROM[OTP] FLASH[DT/pre-cal file]
+Cal param 0x700 0x10000
+Board id 0x10 0x8000
+
+Tested on QCA9888 with pre-cal file.
+
+Signed-off-by: Anilkumar Kolli <akolli at qti.qualcomm.com>
+Signed-off-by: Kalle Valo <kvalo at qca.qualcomm.com>
+---
+
+--- a/drivers/net/wireless/ath/ath10k/bmi.h
++++ b/drivers/net/wireless/ath/ath10k/bmi.h
+@@ -83,6 +83,8 @@ enum bmi_cmd_id {
+ #define BMI_NVRAM_SEG_NAME_SZ 16
+
+ #define BMI_PARAM_GET_EEPROM_BOARD_ID 0x10
++#define BMI_PARAM_GET_FLASH_BOARD_ID 0x8000
++#define BMI_PARAM_FLASH_SECTION_ALL 0x10000
+
+ #define ATH10K_BMI_BOARD_ID_FROM_OTP_MASK 0x7c00
+ #define ATH10K_BMI_BOARD_ID_FROM_OTP_LSB 10
+--- a/drivers/net/wireless/ath/ath10k/core.c
++++ b/drivers/net/wireless/ath/ath10k/core.c
+@@ -657,7 +657,7 @@ static int ath10k_core_get_board_id_from
+ {
+ u32 result, address;
+ u8 board_id, chip_id;
+- int ret;
++ int ret, bmi_board_id_param;
+
+ address = ar->hw_params.patch_load_addr;
+
+@@ -681,8 +681,13 @@ static int ath10k_core_get_board_id_from
+ return ret;
+ }
+
+- ret = ath10k_bmi_execute(ar, address, BMI_PARAM_GET_EEPROM_BOARD_ID,
+- &result);
++ if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
++ ar->cal_mode == ATH10K_PRE_CAL_MODE_FILE)
++ bmi_board_id_param = BMI_PARAM_GET_FLASH_BOARD_ID;
++ else
++ bmi_board_id_param = BMI_PARAM_GET_EEPROM_BOARD_ID;
++
++ ret = ath10k_bmi_execute(ar, address, bmi_board_id_param, &result);
+ if (ret) {
+ ath10k_err(ar, "could not execute otp for board id check: %d\n",
+ ret);
+@@ -810,6 +815,11 @@ static int ath10k_download_and_run_otp(s
+ return ret;
+ }
+
++ /* As of now pre-cal is valid for 10_4 variants */
++ if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
++ ar->cal_mode == ATH10K_PRE_CAL_MODE_FILE)
++ bmi_otp_exe_param = BMI_PARAM_FLASH_SECTION_ALL;
++
+ ret = ath10k_bmi_execute(ar, address, bmi_otp_exe_param, &result);
+ if (ret) {
+ ath10k_err(ar, "could not execute otp (%d)\n", ret);
diff --git a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch
index 0c34d96..b966516 100644
--- a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch
+++ b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch
@@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann <sven at open-mesh.com>
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
-@@ -2319,6 +2319,16 @@ int ath10k_core_register(struct ath10k *
+@@ -2329,6 +2329,16 @@ int ath10k_core_register(struct ath10k *
ar->chip_id = chip_id;
queue_work(ar->workqueue, &ar->register_work);
diff --git a/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch b/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch
index e28fa8f..d302a7d 100644
--- a/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch
+++ b/package/kernel/mac80211/patches/936-ath10k-fix-otp-failure-result.patch
@@ -1,6 +1,6 @@
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
-@@ -686,7 +686,7 @@
+@@ -691,7 +691,7 @@ static int ath10k_core_get_board_id_from
if (ret) {
ath10k_err(ar, "could not execute otp for board id check: %d\n",
ret);
diff --git a/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch b/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch
index e36f13b..d49be4d 100644
--- a/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch
+++ b/package/kernel/mac80211/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch
@@ -1,11 +1,11 @@
---- a/drivers/net/wireless/ath/ath10k/htt.h 2016-12-12 16:03:58.491019030 +0100
-+++ b/drivers/net/wireless/ath/ath10k/htt.h 2016-12-12 15:39:45.242298155 +0100
+--- a/drivers/net/wireless/ath/ath10k/htt.h
++++ b/drivers/net/wireless/ath/ath10k/htt.h
@@ -199,7 +199,7 @@ enum htt_rx_ring_flags {
};
#define HTT_RX_RING_SIZE_MIN 128
-+#define HTT_RX_RING_SIZE_MAX 512
-#define HTT_RX_RING_SIZE_MAX 2048
++#define HTT_RX_RING_SIZE_MAX 512
struct htt_rx_ring_setup_ring {
__le32 fw_idx_shadow_reg_paddr;
diff --git a/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch b/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch
index 0bdddae..a101282 100644
--- a/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch
+++ b/package/kernel/mac80211/patches/960-0011-ath10k-limit-pci-buffer-size.patch
@@ -1,6 +1,6 @@
---- a/drivers/net/wireless/ath/ath10k/pci.c 2016-12-12 16:29:42.310053558 +0100
-+++ b/drivers/net/wireless/ath/ath10k/pci.c 2016-12-12 16:34:46.667203800 +0100
-@@ -127,7 +127,7 @@ static struct ce_attr host_ce_config_wla
+--- a/drivers/net/wireless/ath/ath10k/pci.c
++++ b/drivers/net/wireless/ath/ath10k/pci.c
+@@ -128,7 +128,7 @@ static struct ce_attr host_ce_config_wla
.flags = CE_ATTR_FLAGS,
.src_nentries = 0,
.src_sz_max = 2048,
@@ -9,7 +9,7 @@
.recv_cb = ath10k_pci_htt_htc_rx_cb,
},
-@@ -136,7 +136,7 @@ static struct ce_attr host_ce_config_wla
+@@ -137,7 +137,7 @@ static struct ce_attr host_ce_config_wla
.flags = CE_ATTR_FLAGS,
.src_nentries = 0,
.src_sz_max = 2048,
@@ -18,7 +18,7 @@
.recv_cb = ath10k_pci_htc_rx_cb,
},
-@@ -163,7 +163,7 @@ static struct ce_attr host_ce_config_wla
+@@ -164,7 +164,7 @@ static struct ce_attr host_ce_config_wla
.flags = CE_ATTR_FLAGS,
.src_nentries = 0,
.src_sz_max = 512,
@@ -27,7 +27,7 @@
.recv_cb = ath10k_pci_htt_rx_cb,
},
-@@ -188,7 +188,7 @@ static struct ce_attr host_ce_config_wla
+@@ -189,7 +189,7 @@ static struct ce_attr host_ce_config_wla
.flags = CE_ATTR_FLAGS,
.src_nentries = 0,
.src_sz_max = 2048,
More information about the lede-commits
mailing list