aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/380-0001-ath10k-wmi-modify-svc-bitmap-parsing-for-wcn3990.patch
diff options
context:
space:
mode:
authorAnsuel Smith <ansuelsmth@gmail.com>2018-07-08 16:04:15 +0200
committerJo-Philipp Wich <jo@mein.io>2018-07-22 22:25:33 +0200
commit2dcd955aea1ab715d048910322b05d1af0b69748 (patch)
tree9f7e269a5a6a886bfe625aa9a42be536e84a20c9 /package/kernel/mac80211/patches/380-0001-ath10k-wmi-modify-svc-bitmap-parsing-for-wcn3990.patch
parent57b808ec88315db6743b3159a04dbb16097597ea (diff)
downloadupstream-2dcd955aea1ab715d048910322b05d1af0b69748.tar.gz
upstream-2dcd955aea1ab715d048910322b05d1af0b69748.tar.bz2
upstream-2dcd955aea1ab715d048910322b05d1af0b69748.zip
mac80211: backport and update patches for ath10k
This commit refreshes and updates the VHT160 ath10k support fix patches and adds a number of backports from ath-next: * 8ed05ed06fca ath10k: handle tdls peer events * 229329ff345f ath10k: wmi: modify svc bitmap parsing for wcn3990 * 14d65775687c ath10k: advertise TDLS wider bandwidth support for 5GHz * bc64d05220f3 ath10k: debugfs support to get final TPC stats for 10.4 variants * 8b2d93dd2261 ath10k: Fix kernel panic while using worker (ath10k_sta_rc_update_wk) * 4b190675ad06 ath10k: fix kernel panic while reading tpc_stats * be8cce96f14d ath10k: add support to configure channel dwell time * f40105e67478 ath: add support to get the detected radar specifications * 6f6eb1bcbeff ath10k: DFS Host Confirmation * 260e629bbf44 ath10k: fix memory leak of tpc_stats * 38441fb6fcbb ath10k: support use of channel 173 * 2e9bcd0d7324 ath10k: fix spectral scan for QCA9984 and QCA9888 chipsets Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> [move backported patches in the 3xx number space, bring in upstream order, replace incomplete patch files with git format-patch ones, rewrite commit message, fix subject] Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'package/kernel/mac80211/patches/380-0001-ath10k-wmi-modify-svc-bitmap-parsing-for-wcn3990.patch')
-rw-r--r--package/kernel/mac80211/patches/380-0001-ath10k-wmi-modify-svc-bitmap-parsing-for-wcn3990.patch215
1 files changed, 215 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/380-0001-ath10k-wmi-modify-svc-bitmap-parsing-for-wcn3990.patch b/package/kernel/mac80211/patches/380-0001-ath10k-wmi-modify-svc-bitmap-parsing-for-wcn3990.patch
new file mode 100644
index 0000000000..6788136273
--- /dev/null
+++ b/package/kernel/mac80211/patches/380-0001-ath10k-wmi-modify-svc-bitmap-parsing-for-wcn3990.patch
@@ -0,0 +1,215 @@
+From 229329ff345f80c95202eaf2d7a0f2910c06144e Mon Sep 17 00:00:00 2001
+From: Rakesh Pillai <pillair@qti.qualcomm.com>
+Date: Mon, 11 Dec 2017 19:52:52 +0530
+Subject: [PATCH] ath10k: wmi: modify svc bitmap parsing for wcn3990
+
+Due to the limitation of wmi tlv parsing logic, if there are
+two parameters in a wmi event with same tlv tag, we can get only
+the last value, as it overwrites the prev value of the same tlv tag.
+
+The service ready event in wcn3990 contains two parameters of the
+same tag UINT32, due to which the svc bitmap is overwritten with the
+DBS support parameter.
+
+Refactor the service ready event parsing to allow parsing two tlv
+of the same tag UINT32 for wcn3990.
+
+Signed-off-by: Rakesh Pillai <pillair@qti.qualcomm.com>
+Signed-off-by: Govind Singh <govinds@qti.qualcomm.com>
+Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
+---
+ drivers/net/wireless/ath/ath10k/mac.c | 4 +-
+ drivers/net/wireless/ath/ath10k/wmi-tlv.c | 61 ++++++++++++++++++++++++-------
+ drivers/net/wireless/ath/ath10k/wmi-tlv.h | 46 +++++++++++++++++++++++
+ drivers/net/wireless/ath/ath10k/wmi.h | 1 +
+ 4 files changed, 97 insertions(+), 15 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath10k/mac.c
++++ b/drivers/net/wireless/ath/ath10k/mac.c
+@@ -3574,7 +3574,9 @@ ath10k_mac_tx_h_get_txpath(struct ath10k
+ return ATH10K_MAC_TX_HTT;
+ case ATH10K_HW_TXRX_MGMT:
+ if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
+- ar->running_fw->fw_file.fw_features))
++ ar->running_fw->fw_file.fw_features) ||
++ test_bit(WMI_SERVICE_MGMT_TX_WMI,
++ ar->wmi.svc_map))
+ return ATH10K_MAC_TX_WMI_MGMT;
+ else if (ar->htt.target_version_major >= 3)
+ return ATH10K_MAC_TX_HTT;
+--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
++++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
+@@ -917,33 +917,69 @@ ath10k_wmi_tlv_parse_mem_reqs(struct ath
+ return -ENOMEM;
+ }
+
++struct wmi_tlv_svc_rdy_parse {
++ const struct hal_reg_capabilities *reg;
++ const struct wmi_tlv_svc_rdy_ev *ev;
++ const __le32 *svc_bmap;
++ const struct wlan_host_mem_req *mem_reqs;
++ bool svc_bmap_done;
++ bool dbs_hw_mode_done;
++};
++
++static int ath10k_wmi_tlv_svc_rdy_parse(struct ath10k *ar, u16 tag, u16 len,
++ const void *ptr, void *data)
++{
++ struct wmi_tlv_svc_rdy_parse *svc_rdy = data;
++
++ switch (tag) {
++ case WMI_TLV_TAG_STRUCT_SERVICE_READY_EVENT:
++ svc_rdy->ev = ptr;
++ break;
++ case WMI_TLV_TAG_STRUCT_HAL_REG_CAPABILITIES:
++ svc_rdy->reg = ptr;
++ break;
++ case WMI_TLV_TAG_ARRAY_STRUCT:
++ svc_rdy->mem_reqs = ptr;
++ break;
++ case WMI_TLV_TAG_ARRAY_UINT32:
++ if (!svc_rdy->svc_bmap_done) {
++ svc_rdy->svc_bmap_done = true;
++ svc_rdy->svc_bmap = ptr;
++ } else if (!svc_rdy->dbs_hw_mode_done) {
++ svc_rdy->dbs_hw_mode_done = true;
++ }
++ break;
++ default:
++ break;
++ }
++ return 0;
++}
++
+ static int ath10k_wmi_tlv_op_pull_svc_rdy_ev(struct ath10k *ar,
+ struct sk_buff *skb,
+ struct wmi_svc_rdy_ev_arg *arg)
+ {
+- const void **tb;
+ const struct hal_reg_capabilities *reg;
+ const struct wmi_tlv_svc_rdy_ev *ev;
+ const __le32 *svc_bmap;
+ const struct wlan_host_mem_req *mem_reqs;
++ struct wmi_tlv_svc_rdy_parse svc_rdy = { };
+ int ret;
+
+- tb = ath10k_wmi_tlv_parse_alloc(ar, skb->data, skb->len, GFP_ATOMIC);
+- if (IS_ERR(tb)) {
+- ret = PTR_ERR(tb);
++ ret = ath10k_wmi_tlv_iter(ar, skb->data, skb->len,
++ ath10k_wmi_tlv_svc_rdy_parse, &svc_rdy);
++ if (ret) {
+ ath10k_warn(ar, "failed to parse tlv: %d\n", ret);
+ return ret;
+ }
+
+- ev = tb[WMI_TLV_TAG_STRUCT_SERVICE_READY_EVENT];
+- reg = tb[WMI_TLV_TAG_STRUCT_HAL_REG_CAPABILITIES];
+- svc_bmap = tb[WMI_TLV_TAG_ARRAY_UINT32];
+- mem_reqs = tb[WMI_TLV_TAG_ARRAY_STRUCT];
++ ev = svc_rdy.ev;
++ reg = svc_rdy.reg;
++ svc_bmap = svc_rdy.svc_bmap;
++ mem_reqs = svc_rdy.mem_reqs;
+
+- if (!ev || !reg || !svc_bmap || !mem_reqs) {
+- kfree(tb);
++ if (!ev || !reg || !svc_bmap || !mem_reqs)
+ return -EPROTO;
+- }
+
+ /* This is an internal ABI compatibility check for WMI TLV so check it
+ * here instead of the generic WMI code.
+@@ -961,7 +997,6 @@ static int ath10k_wmi_tlv_op_pull_svc_rd
+ __le32_to_cpu(ev->abi.abi_ver_ns1) != WMI_TLV_ABI_VER_NS1 ||
+ __le32_to_cpu(ev->abi.abi_ver_ns2) != WMI_TLV_ABI_VER_NS2 ||
+ __le32_to_cpu(ev->abi.abi_ver_ns3) != WMI_TLV_ABI_VER_NS3) {
+- kfree(tb);
+ return -ENOTSUPP;
+ }
+
+@@ -982,12 +1017,10 @@ static int ath10k_wmi_tlv_op_pull_svc_rd
+ ret = ath10k_wmi_tlv_iter(ar, mem_reqs, ath10k_wmi_tlv_len(mem_reqs),
+ ath10k_wmi_tlv_parse_mem_reqs, arg);
+ if (ret) {
+- kfree(tb);
+ ath10k_warn(ar, "failed to parse mem_reqs tlv: %d\n", ret);
+ return ret;
+ }
+
+- kfree(tb);
+ return 0;
+ }
+
+--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.h
++++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.h
+@@ -965,6 +965,50 @@ enum wmi_tlv_service {
+ WMI_TLV_SERVICE_STA_RX_IPA_OFFLOAD_SUPPORT,
+ WMI_TLV_SERVICE_MDNS_OFFLOAD,
+ WMI_TLV_SERVICE_SAP_AUTH_OFFLOAD,
++ WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT,
++ WMI_TLV_SERVICE_OCB,
++ WMI_TLV_SERVICE_AP_ARPNS_OFFLOAD,
++ WMI_TLV_SERVICE_PER_BAND_CHAINMASK_SUPPORT,
++ WMI_TLV_SERVICE_PACKET_FILTER_OFFLOAD,
++ WMI_TLV_SERVICE_MGMT_TX_HTT,
++ WMI_TLV_SERVICE_MGMT_TX_WMI,
++ WMI_TLV_SERVICE_EXT_MSG,
++ WMI_TLV_SERVICE_MAWC,
++ WMI_TLV_SERVICE_PEER_ASSOC_CONF,
++ WMI_TLV_SERVICE_EGAP,
++ WMI_TLV_SERVICE_STA_PMF_OFFLOAD,
++ WMI_TLV_SERVICE_UNIFIED_WOW_CAPABILITY,
++ WMI_TLV_SERVICE_ENHANCED_PROXY_STA,
++ WMI_TLV_SERVICE_ATF,
++ WMI_TLV_SERVICE_COEX_GPIO,
++ WMI_TLV_SERVICE_AUX_SPECTRAL_INTF,
++ WMI_TLV_SERVICE_AUX_CHAN_LOAD_INTF,
++ WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64,
++ WMI_TLV_SERVICE_ENTERPRISE_MESH,
++ WMI_TLV_SERVICE_RESTRT_CHNL_SUPPORT,
++ WMI_TLV_SERVICE_BPF_OFFLOAD,
++ WMI_TLV_SERVICE_SYNC_DELETE_CMDS,
++ WMI_TLV_SERVICE_SMART_ANTENNA_SW_SUPPORT,
++ WMI_TLV_SERVICE_SMART_ANTENNA_HW_SUPPORT,
++ WMI_TLV_SERVICE_RATECTRL_LIMIT_MAX_MIN_RATES,
++ WMI_TLV_SERVICE_NAN_DATA,
++ WMI_TLV_SERVICE_NAN_RTT,
++ WMI_TLV_SERVICE_11AX,
++ WMI_TLV_SERVICE_DEPRECATED_REPLACE,
++ WMI_TLV_SERVICE_TDLS_CONN_TRACKER_IN_HOST_MODE,
++ WMI_TLV_SERVICE_ENHANCED_MCAST_FILTER,
++ WMI_TLV_SERVICE_PERIODIC_CHAN_STAT_SUPPORT,
++ WMI_TLV_SERVICE_MESH_11S,
++ WMI_TLV_SERVICE_HALF_RATE_QUARTER_RATE_SUPPORT,
++ WMI_TLV_SERVICE_VDEV_RX_FILTER,
++ WMI_TLV_SERVICE_P2P_LISTEN_OFFLOAD_SUPPORT,
++ WMI_TLV_SERVICE_MARK_FIRST_WAKEUP_PACKET,
++ WMI_TLV_SERVICE_MULTIPLE_MCAST_FILTER_SET,
++ WMI_TLV_SERVICE_HOST_MANAGED_RX_REORDER,
++ WMI_TLV_SERVICE_FLASH_RDWR_SUPPORT,
++ WMI_TLV_SERVICE_WLAN_STATS_REPORT,
++ WMI_TLV_SERVICE_TX_MSDU_ID_NEW_PARTITION_SUPPORT,
++ WMI_TLV_SERVICE_DFS_PHYERR_OFFLOAD,
+ };
+
+ #define WMI_SERVICE_IS_ENABLED(wmi_svc_bmap, svc_id, len) \
+@@ -1121,6 +1165,8 @@ wmi_tlv_svc_map(const __le32 *in, unsign
+ WMI_SERVICE_MDNS_OFFLOAD, len);
+ SVCMAP(WMI_TLV_SERVICE_SAP_AUTH_OFFLOAD,
+ WMI_SERVICE_SAP_AUTH_OFFLOAD, len);
++ SVCMAP(WMI_TLV_SERVICE_MGMT_TX_WMI,
++ WMI_SERVICE_MGMT_TX_WMI, len);
+ }
+
+ #undef SVCMAP
+--- a/drivers/net/wireless/ath/ath10k/wmi.h
++++ b/drivers/net/wireless/ath/ath10k/wmi.h
+@@ -195,6 +195,7 @@ enum wmi_service {
+ WMI_SERVICE_SMART_LOGGING_SUPPORT,
+ WMI_SERVICE_TDLS_CONN_TRACKER_IN_HOST_MODE,
+ WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY,
++ WMI_SERVICE_MGMT_TX_WMI,
+
+ /* keep last */
+ WMI_SERVICE_MAX,