ath10k: configure access category for arp
authorMarek Puzyniak <marek.puzyniak@tieto.com>
Wed, 29 Jan 2014 13:03:31 +0000 (15:03 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 30 Jan 2014 08:12:22 +0000 (10:12 +0200)
ARP frames exchange does not work properly for UAPSD enabled AP.
ARP requests which arrives with access category 0 are processed
by network stack and send back with access category 0. FW changes
access category to 6. This is causing problems when UAPSD associated
STA is sleeping after has sent ARP request. Configure ARP access
category in FW to best effort (0) solves this problem. ARP frames
will be send with access category 0.

Simplify arp ac override functionality by removing redundant entry in
pdev param maping table. There should be only one entry in pdev param
map but enum has different name for different FW.

kvalo: change the warning message

Signed-off-by: Marek Puzyniak <marek.puzyniak@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/wmi.c
drivers/net/wireless/ath/ath10k/wmi.h

index ce91d5c9d60a4835221b3b8f688677d73828ea3c..144b4d605267df6291f483690fc97e699ef0498a 100644 (file)
@@ -2186,6 +2186,23 @@ static int ath10k_start(struct ieee80211_hw *hw)
                ath10k_warn("could not init WMI_PDEV_PARAM_DYNAMIC_BW (%d)\n",
                            ret);
 
+       /*
+        * By default FW set ARP frames ac to voice (6). In that case ARP
+        * exchange is not working properly for UAPSD enabled AP. ARP requests
+        * which arrives with access category 0 are processed by network stack
+        * and send back with access category 0, but FW changes access category
+        * to 6. Set ARP frames access category to best effort (0) solves
+        * this problem.
+        */
+
+       ret = ath10k_wmi_pdev_set_param(ar,
+                                       ar->wmi.pdev_param->arp_ac_override, 0);
+       if (ret) {
+               ath10k_warn("could not set arp ac override parameter: %d\n",
+                           ret);
+               goto exit;
+       }
+
        ath10k_regd_update(ar);
        ret = 0;
 
index bd01f0a7dafbc13734e4880fa13bc23805394a17..7298c0677b0b32b1236d0271f763957ffafb174c 100644 (file)
@@ -420,7 +420,6 @@ static struct wmi_pdev_param_map wmi_pdev_param_map = {
        .bcnflt_stats_update_period = WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
        .pmf_qos = WMI_PDEV_PARAM_PMF_QOS,
        .arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
-       .arpdhcp_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
        .dcs = WMI_PDEV_PARAM_DCS,
        .ani_enable = WMI_PDEV_PARAM_ANI_ENABLE,
        .ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD,
@@ -472,8 +471,7 @@ static struct wmi_pdev_param_map wmi_10x_pdev_param_map = {
        .bcnflt_stats_update_period =
                                WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
        .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
-       .arp_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
-       .arpdhcp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
+       .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
        .dcs = WMI_10X_PDEV_PARAM_DCS,
        .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
        .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
index 9d9a81bfbb36bf5fd80334c3f758c20993da761e..083079f3fdd41955164b388752126c058c95d701 100644 (file)
@@ -2277,7 +2277,6 @@ struct wmi_pdev_param_map {
        u32 bcnflt_stats_update_period;
        u32 pmf_qos;
        u32 arp_ac_override;
-       u32 arpdhcp_ac_override;
        u32 dcs;
        u32 ani_enable;
        u32 ani_poll_period;