diff options
Diffstat (limited to 'drivers/net/wireless/ath')
-rw-r--r-- | drivers/net/wireless/ath/ath10k/mac.c | 49 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath10k/mac.h | 4 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath10k/wmi.c | 2 |
3 files changed, 23 insertions, 32 deletions
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c index b8314a534972..bbce3a0f8a39 100644 --- a/drivers/net/wireless/ath/ath10k/mac.c +++ b/drivers/net/wireless/ath/ath10k/mac.c | |||
@@ -1865,13 +1865,10 @@ static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, | |||
1865 | return 0; | 1865 | return 0; |
1866 | } | 1866 | } |
1867 | 1867 | ||
1868 | /* | 1868 | /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS |
1869 | * Frames sent to the FW have to be in "Native Wifi" format. | 1869 | * Control in the header. |
1870 | * Strip the QoS field from the 802.11 header. | ||
1871 | */ | 1870 | */ |
1872 | static void ath10k_tx_h_qos_workaround(struct ieee80211_hw *hw, | 1871 | static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb) |
1873 | struct ieee80211_tx_control *control, | ||
1874 | struct sk_buff *skb) | ||
1875 | { | 1872 | { |
1876 | struct ieee80211_hdr *hdr = (void *)skb->data; | 1873 | struct ieee80211_hdr *hdr = (void *)skb->data; |
1877 | u8 *qos_ctl; | 1874 | u8 *qos_ctl; |
@@ -1919,14 +1916,13 @@ unlock: | |||
1919 | mutex_unlock(&arvif->ar->conf_mutex); | 1916 | mutex_unlock(&arvif->ar->conf_mutex); |
1920 | } | 1917 | } |
1921 | 1918 | ||
1922 | static void ath10k_tx_h_update_wep_key(struct sk_buff *skb) | 1919 | static void ath10k_tx_h_update_wep_key(struct ieee80211_vif *vif, |
1920 | struct ieee80211_key_conf *key, | ||
1921 | struct sk_buff *skb) | ||
1923 | { | 1922 | { |
1924 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
1925 | struct ieee80211_vif *vif = info->control.vif; | ||
1926 | struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); | 1923 | struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); |
1927 | struct ath10k *ar = arvif->ar; | 1924 | struct ath10k *ar = arvif->ar; |
1928 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 1925 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
1929 | struct ieee80211_key_conf *key = info->control.hw_key; | ||
1930 | 1926 | ||
1931 | if (!ieee80211_has_protected(hdr->frame_control)) | 1927 | if (!ieee80211_has_protected(hdr->frame_control)) |
1932 | return; | 1928 | return; |
@@ -1948,11 +1944,11 @@ static void ath10k_tx_h_update_wep_key(struct sk_buff *skb) | |||
1948 | ieee80211_queue_work(ar->hw, &arvif->wep_key_work); | 1944 | ieee80211_queue_work(ar->hw, &arvif->wep_key_work); |
1949 | } | 1945 | } |
1950 | 1946 | ||
1951 | static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, struct sk_buff *skb) | 1947 | static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, |
1948 | struct ieee80211_vif *vif, | ||
1949 | struct sk_buff *skb) | ||
1952 | { | 1950 | { |
1953 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 1951 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
1954 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
1955 | struct ieee80211_vif *vif = info->control.vif; | ||
1956 | struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); | 1952 | struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); |
1957 | 1953 | ||
1958 | /* This is case only for P2P_GO */ | 1954 | /* This is case only for P2P_GO */ |
@@ -2254,33 +2250,28 @@ static void ath10k_tx(struct ieee80211_hw *hw, | |||
2254 | struct ieee80211_tx_control *control, | 2250 | struct ieee80211_tx_control *control, |
2255 | struct sk_buff *skb) | 2251 | struct sk_buff *skb) |
2256 | { | 2252 | { |
2253 | struct ath10k *ar = hw->priv; | ||
2257 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 2254 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
2255 | struct ieee80211_vif *vif = info->control.vif; | ||
2256 | struct ieee80211_key_conf *key = info->control.hw_key; | ||
2258 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 2257 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
2259 | struct ath10k *ar = hw->priv; | ||
2260 | u8 tid, vdev_id; | ||
2261 | 2258 | ||
2262 | /* We should disable CCK RATE due to P2P */ | 2259 | /* We should disable CCK RATE due to P2P */ |
2263 | if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE) | 2260 | if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE) |
2264 | ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n"); | 2261 | ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n"); |
2265 | 2262 | ||
2266 | /* we must calculate tid before we apply qos workaround | 2263 | ATH10K_SKB_CB(skb)->htt.is_offchan = false; |
2267 | * as we'd lose the qos control field */ | 2264 | ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr); |
2268 | tid = ath10k_tx_h_get_tid(hdr); | 2265 | ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, info); |
2269 | vdev_id = ath10k_tx_h_get_vdev_id(ar, info); | ||
2270 | 2266 | ||
2271 | /* it makes no sense to process injected frames like that */ | 2267 | /* it makes no sense to process injected frames like that */ |
2272 | if (info->control.vif && | 2268 | if (vif && vif->type != NL80211_IFTYPE_MONITOR) { |
2273 | info->control.vif->type != NL80211_IFTYPE_MONITOR) { | 2269 | ath10k_tx_h_nwifi(hw, skb); |
2274 | ath10k_tx_h_qos_workaround(hw, control, skb); | 2270 | ath10k_tx_h_update_wep_key(vif, key, skb); |
2275 | ath10k_tx_h_update_wep_key(skb); | 2271 | ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb); |
2276 | ath10k_tx_h_add_p2p_noa_ie(ar, skb); | 2272 | ath10k_tx_h_seq_no(vif, skb); |
2277 | ath10k_tx_h_seq_no(skb); | ||
2278 | } | 2273 | } |
2279 | 2274 | ||
2280 | ATH10K_SKB_CB(skb)->vdev_id = vdev_id; | ||
2281 | ATH10K_SKB_CB(skb)->htt.is_offchan = false; | ||
2282 | ATH10K_SKB_CB(skb)->htt.tid = tid; | ||
2283 | |||
2284 | if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) { | 2275 | if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) { |
2285 | spin_lock_bh(&ar->data_lock); | 2276 | spin_lock_bh(&ar->data_lock); |
2286 | ATH10K_SKB_CB(skb)->htt.is_offchan = true; | 2277 | ATH10K_SKB_CB(skb)->htt.is_offchan = true; |
diff --git a/drivers/net/wireless/ath/ath10k/mac.h b/drivers/net/wireless/ath/ath10k/mac.h index ba1021997b8f..ef4f84376d7c 100644 --- a/drivers/net/wireless/ath/ath10k/mac.h +++ b/drivers/net/wireless/ath/ath10k/mac.h | |||
@@ -43,11 +43,11 @@ static inline struct ath10k_vif *ath10k_vif_to_arvif(struct ieee80211_vif *vif) | |||
43 | return (struct ath10k_vif *)vif->drv_priv; | 43 | return (struct ath10k_vif *)vif->drv_priv; |
44 | } | 44 | } |
45 | 45 | ||
46 | static inline void ath10k_tx_h_seq_no(struct sk_buff *skb) | 46 | static inline void ath10k_tx_h_seq_no(struct ieee80211_vif *vif, |
47 | struct sk_buff *skb) | ||
47 | { | 48 | { |
48 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 49 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
49 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 50 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
50 | struct ieee80211_vif *vif = info->control.vif; | ||
51 | struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); | 51 | struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); |
52 | 52 | ||
53 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { | 53 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { |
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c index 6f83cae57655..c2c87c916b5a 100644 --- a/drivers/net/wireless/ath/ath10k/wmi.c +++ b/drivers/net/wireless/ath/ath10k/wmi.c | |||
@@ -1432,7 +1432,7 @@ static void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb) | |||
1432 | continue; | 1432 | continue; |
1433 | } | 1433 | } |
1434 | 1434 | ||
1435 | ath10k_tx_h_seq_no(bcn); | 1435 | ath10k_tx_h_seq_no(arvif->vif, bcn); |
1436 | ath10k_wmi_update_tim(ar, arvif, bcn, bcn_info); | 1436 | ath10k_wmi_update_tim(ar, arvif, bcn, bcn_info); |
1437 | ath10k_wmi_update_noa(ar, arvif, bcn, bcn_info); | 1437 | ath10k_wmi_update_noa(ar, arvif, bcn, bcn_info); |
1438 | 1438 | ||