diff options
author | Michal Kazior <michal.kazior@tieto.com> | 2014-07-21 14:03:09 -0400 |
---|---|---|
committer | Kalle Valo <kvalo@qca.qualcomm.com> | 2014-07-22 11:53:52 -0400 |
commit | 4b6045586f31c7cc49b641a7ad5298b0c379a1c7 (patch) | |
tree | d1e55edf2c17f713346e688991c1344af98ca286 /drivers/net/wireless/ath | |
parent | 708b9bde5d8462d7ce47c1c8ddfc84dd2539e39a (diff) |
ath10k: simplify tx helpers
It always bugged me how tid is computed and stored
in a temporary var before written to the control
buffer. It was confusing and it made it difficult
to work with tx helpers.
While at it rename the qos workaround function as
it was misleading - it's not a workaround but
preparation for nwifi tx mode.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
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 | ||