|
@@ -3988,6 +3988,8 @@ static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
|
|
|
u16 ac, bool enable)
|
|
|
{
|
|
|
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
|
|
|
+ struct wmi_sta_uapsd_auto_trig_arg arg = {};
|
|
|
+ u32 prio = 0, acc = 0;
|
|
|
u32 value = 0;
|
|
|
int ret = 0;
|
|
|
|
|
@@ -4000,18 +4002,26 @@ static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
|
|
|
case IEEE80211_AC_VO:
|
|
|
value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
|
|
|
WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
|
|
|
+ prio = 7;
|
|
|
+ acc = 3;
|
|
|
break;
|
|
|
case IEEE80211_AC_VI:
|
|
|
value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
|
|
|
WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
|
|
|
+ prio = 5;
|
|
|
+ acc = 2;
|
|
|
break;
|
|
|
case IEEE80211_AC_BE:
|
|
|
value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
|
|
|
WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
|
|
|
+ prio = 2;
|
|
|
+ acc = 1;
|
|
|
break;
|
|
|
case IEEE80211_AC_BK:
|
|
|
value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
|
|
|
WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
|
|
|
+ prio = 0;
|
|
|
+ acc = 0;
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -4053,6 +4063,29 @@ static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
|
|
|
+ test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
|
|
|
+ /* Only userspace can make an educated decision when to send
|
|
|
+ * trigger frame. The following effectively disables u-UAPSD
|
|
|
+ * autotrigger in firmware (which is enabled by default
|
|
|
+ * provided the autotrigger service is available).
|
|
|
+ */
|
|
|
+
|
|
|
+ arg.wmm_ac = acc;
|
|
|
+ arg.user_priority = prio;
|
|
|
+ arg.service_interval = 0;
|
|
|
+ arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
|
|
|
+ arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
|
|
|
+
|
|
|
+ ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
|
|
|
+ arvif->bssid, &arg, 1);
|
|
|
+ if (ret) {
|
|
|
+ ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
|
|
|
+ ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
exit:
|
|
|
return ret;
|
|
|
}
|