diff options
Diffstat (limited to 'package/kernel/mac80211/patches/303-ath10k-enable-adaptive-CCA.patch')
-rw-r--r-- | package/kernel/mac80211/patches/303-ath10k-enable-adaptive-CCA.patch | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/303-ath10k-enable-adaptive-CCA.patch b/package/kernel/mac80211/patches/303-ath10k-enable-adaptive-CCA.patch new file mode 100644 index 0000000000..dea65bbaf2 --- /dev/null +++ b/package/kernel/mac80211/patches/303-ath10k-enable-adaptive-CCA.patch @@ -0,0 +1,239 @@ +From: Maharaja <c_mkenna@qti.qualcomm.com> +Date: Wed, 21 Oct 2015 11:49:18 +0300 +Subject: [PATCH] ath10k: enable adaptive CCA + +European Union has made it mandatory that all devices working in 2.4 GHz +has to adhere to the ETSI specification (ETSI EN 300 328 V1.9.1) +beginnig this year. The standard basically speaks about interferences +in 2.4Ghz band. +For example, when 802.11 device detects interference, TX must be stopped +as long as interference is present. + +Adaptive CCA is a feature, when enabled the device learns from the +environment and configures CCA levels adaptively. This will improve +detecting interferences and the device can stop trasmissions till the +interference is present eventually leading to good performances in +varying interference conditions. + +The patch includes code for enabling adaptive CCA for 10.2.4 firmware on +QCA988X. + +Signed-off-by: Maharaja <c_mkenna@qti.qualcomm.com> +Signed-off-by: Manikanta Pubbisetty <c_mpubbi@qti.qualcomm.com> +Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> +--- + +--- a/drivers/net/wireless/ath/ath10k/core.c ++++ b/drivers/net/wireless/ath/ath10k/core.c +@@ -151,6 +151,7 @@ static const char *const ath10k_core_fw_ + [ATH10K_FW_FEATURE_NO_NWIFI_DECAP_4ADDR_PADDING] = "no-4addr-pad", + [ATH10K_FW_FEATURE_SUPPORTS_SKIP_CLOCK_INIT] = "skip-clock-init", + [ATH10K_FW_FEATURE_RAW_MODE_SUPPORT] = "raw-mode", ++ [ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA] = "adaptive-cca", + }; + + static unsigned int ath10k_core_get_fw_feature_str(char *buf, +--- a/drivers/net/wireless/ath/ath10k/core.h ++++ b/drivers/net/wireless/ath/ath10k/core.h +@@ -497,6 +497,9 @@ enum ath10k_fw_features { + */ + ATH10K_FW_FEATURE_RAW_MODE_SUPPORT = 10, + ++ /* Firmware Supports Adaptive CCA*/ ++ ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA = 11, ++ + /* keep last */ + ATH10K_FW_FEATURE_COUNT, + }; +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -3905,6 +3905,18 @@ static int ath10k_start(struct ieee80211 + goto err_core_stop; + } + ++ if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA, ++ ar->fw_features)) { ++ ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1, ++ WMI_CCA_DETECT_LEVEL_AUTO, ++ WMI_CCA_DETECT_MARGIN_AUTO); ++ if (ret) { ++ ath10k_warn(ar, "failed to enable adaptive cca: %d\n", ++ ret); ++ goto err_core_stop; ++ } ++ } ++ + ret = ath10k_wmi_pdev_set_param(ar, + ar->wmi.pdev_param->ani_enable, 1); + if (ret) { +--- a/drivers/net/wireless/ath/ath10k/wmi-ops.h ++++ b/drivers/net/wireless/ath/ath10k/wmi-ops.h +@@ -182,6 +182,10 @@ struct wmi_ops { + void (*fw_stats_fill)(struct ath10k *ar, + struct ath10k_fw_stats *fw_stats, + char *buf); ++ struct sk_buff *(*gen_pdev_enable_adaptive_cca)(struct ath10k *ar, ++ u8 enable, ++ u32 detect_level, ++ u32 detect_margin); + }; + + int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id); +@@ -1302,4 +1306,25 @@ ath10k_wmi_fw_stats_fill(struct ath10k * + ar->wmi.ops->fw_stats_fill(ar, fw_stats, buf); + return 0; + } ++ ++static inline int ++ath10k_wmi_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable, ++ u32 detect_level, u32 detect_margin) ++{ ++ struct sk_buff *skb; ++ ++ if (!ar->wmi.ops->gen_pdev_enable_adaptive_cca) ++ return -EOPNOTSUPP; ++ ++ skb = ar->wmi.ops->gen_pdev_enable_adaptive_cca(ar, enable, ++ detect_level, ++ detect_margin); ++ ++ if (IS_ERR(skb)) ++ return PTR_ERR(skb); ++ ++ return ath10k_wmi_cmd_send(ar, skb, ++ ar->wmi.cmd->pdev_enable_adaptive_cca_cmdid); ++} ++ + #endif +--- a/drivers/net/wireless/ath/ath10k/wmi.c ++++ b/drivers/net/wireless/ath/ath10k/wmi.c +@@ -148,6 +148,7 @@ static struct wmi_cmd_map wmi_cmd_map = + .gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID, + .gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID, + .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, ++ .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED, + .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, + .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, + .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, +@@ -313,6 +314,7 @@ static struct wmi_cmd_map wmi_10x_cmd_ma + .gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID, + .gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID, + .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, ++ .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED, + .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, + .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, + .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, +@@ -477,6 +479,7 @@ static struct wmi_cmd_map wmi_10_2_4_cmd + .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID, + .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID, + .pdev_get_temperature_cmdid = WMI_10_2_PDEV_GET_TEMPERATURE_CMDID, ++ .pdev_enable_adaptive_cca_cmdid = WMI_10_2_SET_CCA_PARAMS, + .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, + .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, + .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, +@@ -1407,6 +1410,7 @@ static struct wmi_cmd_map wmi_10_2_cmd_m + .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID, + .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID, + .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, ++ .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED, + .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, + .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, + .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, +@@ -6996,6 +7000,28 @@ unlock: + buf[len] = 0; + } + ++static struct sk_buff * ++ath10k_wmi_op_gen_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable, ++ u32 detect_level, u32 detect_margin) ++{ ++ struct wmi_pdev_set_adaptive_cca_params *cmd; ++ struct sk_buff *skb; ++ ++ skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); ++ if (!skb) ++ return ERR_PTR(-ENOMEM); ++ ++ cmd = (struct wmi_pdev_set_adaptive_cca_params *)skb->data; ++ cmd->enable = __cpu_to_le32(enable); ++ cmd->cca_detect_level = __cpu_to_le32(detect_level); ++ cmd->cca_detect_margin = __cpu_to_le32(detect_margin); ++ ++ ath10k_dbg(ar, ATH10K_DBG_WMI, ++ "wmi pdev set adaptive cca params enable:%d detection level:%d detection margin:%d\n", ++ enable, detect_level, detect_margin); ++ return skb; ++} ++ + static const struct wmi_ops wmi_ops = { + .rx = ath10k_wmi_op_rx, + .map_svc = wmi_main_svc_map, +@@ -7059,6 +7085,7 @@ static const struct wmi_ops wmi_ops = { + /* .gen_prb_tmpl not implemented */ + /* .gen_p2p_go_bcn_ie not implemented */ + /* .gen_adaptive_qcs not implemented */ ++ /* .gen_pdev_enable_adaptive_cca not implemented */ + }; + + static const struct wmi_ops wmi_10_1_ops = { +@@ -7125,6 +7152,7 @@ static const struct wmi_ops wmi_10_1_ops + /* .gen_prb_tmpl not implemented */ + /* .gen_p2p_go_bcn_ie not implemented */ + /* .gen_adaptive_qcs not implemented */ ++ /* .gen_pdev_enable_adaptive_cca not implemented */ + }; + + static const struct wmi_ops wmi_10_2_ops = { +@@ -7188,6 +7216,7 @@ static const struct wmi_ops wmi_10_2_ops + .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, + .gen_delba_send = ath10k_wmi_op_gen_delba_send, + .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, ++ /* .gen_pdev_enable_adaptive_cca not implemented */ + }; + + static const struct wmi_ops wmi_10_2_4_ops = { +@@ -7251,6 +7280,8 @@ static const struct wmi_ops wmi_10_2_4_o + .gen_delba_send = ath10k_wmi_op_gen_delba_send, + .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config, + .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, ++ .gen_pdev_enable_adaptive_cca = ++ ath10k_wmi_op_gen_pdev_enable_adaptive_cca, + /* .gen_bcn_tmpl not implemented */ + /* .gen_prb_tmpl not implemented */ + /* .gen_p2p_go_bcn_ie not implemented */ +--- a/drivers/net/wireless/ath/ath10k/wmi.h ++++ b/drivers/net/wireless/ath/ath10k/wmi.h +@@ -772,6 +772,7 @@ struct wmi_cmd_map { + u32 mu_cal_start_cmdid; + u32 set_cca_params_cmdid; + u32 pdev_bss_chan_info_request_cmdid; ++ u32 pdev_enable_adaptive_cca_cmdid; + }; + + /* +@@ -1381,6 +1382,9 @@ enum wmi_10_2_cmd_id { + WMI_10_2_VDEV_ATF_REQUEST_CMDID, + WMI_10_2_PEER_ATF_REQUEST_CMDID, + WMI_10_2_PDEV_GET_TEMPERATURE_CMDID, ++ WMI_10_2_MU_CAL_START_CMDID, ++ WMI_10_2_SET_LTEU_CONFIG_CMDID, ++ WMI_10_2_SET_CCA_PARAMS, + WMI_10_2_PDEV_UTF_CMDID = WMI_10_2_END_CMDID - 1, + }; + +@@ -6094,6 +6098,15 @@ enum wmi_txbf_conf { + WMI_TXBF_CONF_AFTER_ASSOC, + }; + ++#define WMI_CCA_DETECT_LEVEL_AUTO 0 ++#define WMI_CCA_DETECT_MARGIN_AUTO 0 ++ ++struct wmi_pdev_set_adaptive_cca_params { ++ __le32 enable; ++ __le32 cca_detect_level; ++ __le32 cca_detect_margin; ++} __packed; ++ + struct ath10k; + struct ath10k_vif; + struct ath10k_fw_stats_pdev; |