aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c11
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,
1871static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb) 1871static 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
1885static void ath10k_tx_wep_key_work(struct work_struct *work) 1896static void ath10k_tx_wep_key_work(struct work_struct *work)