diff options
-rw-r--r-- | drivers/net/wireless/ath/ath10k/mac.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c index bbce3a0f8a39..3f9afaa93cca 100644 --- a/drivers/net/wireless/ath/ath10k/mac.c +++ b/drivers/net/wireless/ath/ath10k/mac.c | |||
@@ -1871,6 +1871,7 @@ static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, | |||
1871 | static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb) | 1871 | static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb) |
1872 | { | 1872 | { |
1873 | struct ieee80211_hdr *hdr = (void *)skb->data; | 1873 | struct ieee80211_hdr *hdr = (void *)skb->data; |
1874 | struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb); | ||
1874 | u8 *qos_ctl; | 1875 | u8 *qos_ctl; |
1875 | 1876 | ||
1876 | if (!ieee80211_is_data_qos(hdr->frame_control)) | 1877 | if (!ieee80211_is_data_qos(hdr->frame_control)) |
@@ -1880,6 +1881,16 @@ static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
1880 | memmove(skb->data + IEEE80211_QOS_CTL_LEN, | 1881 | memmove(skb->data + IEEE80211_QOS_CTL_LEN, |
1881 | skb->data, (void *)qos_ctl - (void *)skb->data); | 1882 | skb->data, (void *)qos_ctl - (void *)skb->data); |
1882 | skb_pull(skb, IEEE80211_QOS_CTL_LEN); | 1883 | skb_pull(skb, IEEE80211_QOS_CTL_LEN); |
1884 | |||
1885 | /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc | ||
1886 | * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are | ||
1887 | * used only for CQM purposes (e.g. hostapd station keepalive ping) so | ||
1888 | * it is safe to downgrade to NullFunc. | ||
1889 | */ | ||
1890 | if (ieee80211_is_qos_nullfunc(hdr->frame_control)) { | ||
1891 | hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA); | ||
1892 | cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST; | ||
1893 | } | ||
1883 | } | 1894 | } |
1884 | 1895 | ||
1885 | static void ath10k_tx_wep_key_work(struct work_struct *work) | 1896 | static void ath10k_tx_wep_key_work(struct work_struct *work) |