aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/tx.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index ee1b77f8a804..b909e4090e93 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1084,9 +1084,10 @@ static int ieee80211_tx_prepare(struct ieee80211_local *local,
1084} 1084}
1085 1085
1086static int __ieee80211_tx(struct ieee80211_local *local, 1086static int __ieee80211_tx(struct ieee80211_local *local,
1087 struct ieee80211_tx_data *tx) 1087 struct sk_buff **skbp,
1088 struct sta_info *sta)
1088{ 1089{
1089 struct sk_buff *skb = tx->skb, *next; 1090 struct sk_buff *skb = *skbp, *next;
1090 struct ieee80211_tx_info *info; 1091 struct ieee80211_tx_info *info;
1091 int ret; 1092 int ret;
1092 bool fragm = false; 1093 bool fragm = false;
@@ -1111,23 +1112,23 @@ static int __ieee80211_tx(struct ieee80211_local *local,
1111 * We will later move this down into the only driver that 1112 * We will later move this down into the only driver that
1112 * needs it, iwlwifi. 1113 * needs it, iwlwifi.
1113 */ 1114 */
1114 if (tx->sta && local->hw.ampdu_queues && 1115 if (sta && local->hw.ampdu_queues &&
1115 info->flags & IEEE80211_TX_CTL_AMPDU) { 1116 info->flags & IEEE80211_TX_CTL_AMPDU) {
1116 unsigned long flags; 1117 unsigned long flags;
1117 u8 *qc = ieee80211_get_qos_ctl((void *) skb->data); 1118 u8 *qc = ieee80211_get_qos_ctl((void *) skb->data);
1118 int tid = *qc & IEEE80211_QOS_CTL_TID_MASK; 1119 int tid = *qc & IEEE80211_QOS_CTL_TID_MASK;
1119 1120
1120 spin_lock_irqsave(&tx->sta->lock, flags); 1121 spin_lock_irqsave(&sta->lock, flags);
1121 skb_set_queue_mapping(skb, local->hw.queues + 1122 skb_set_queue_mapping(skb, local->hw.queues +
1122 tx->sta->tid_to_tx_q[tid]); 1123 sta->tid_to_tx_q[tid]);
1123 spin_unlock_irqrestore(&tx->sta->lock, flags); 1124 spin_unlock_irqrestore(&sta->lock, flags);
1124 } 1125 }
1125 1126
1126 next = skb->next; 1127 next = skb->next;
1127 ret = local->ops->tx(local_to_hw(local), skb); 1128 ret = local->ops->tx(local_to_hw(local), skb);
1128 if (ret != NETDEV_TX_OK) 1129 if (ret != NETDEV_TX_OK)
1129 return IEEE80211_TX_AGAIN; 1130 return IEEE80211_TX_AGAIN;
1130 tx->skb = skb = next; 1131 *skbp = skb = next;
1131 ieee80211_led_tx(local, 1); 1132 ieee80211_led_tx(local, 1);
1132 fragm = true; 1133 fragm = true;
1133 } 1134 }
@@ -1223,7 +1224,7 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb)
1223 1224
1224 retries = 0; 1225 retries = 0;
1225 retry: 1226 retry:
1226 ret = __ieee80211_tx(local, &tx); 1227 ret = __ieee80211_tx(local, &tx.skb, tx.sta);
1227 switch (ret) { 1228 switch (ret) {
1228 case IEEE80211_TX_OK: 1229 case IEEE80211_TX_OK:
1229 break; 1230 break;
@@ -1831,7 +1832,6 @@ void ieee80211_tx_pending(unsigned long data)
1831 struct net_device *dev = local->mdev; 1832 struct net_device *dev = local->mdev;
1832 struct ieee80211_hdr *hdr; 1833 struct ieee80211_hdr *hdr;
1833 unsigned long flags; 1834 unsigned long flags;
1834 struct ieee80211_tx_data tx;
1835 int i, ret; 1835 int i, ret;
1836 bool next; 1836 bool next;
1837 1837
@@ -1862,14 +1862,15 @@ void ieee80211_tx_pending(unsigned long data)
1862 netif_start_subqueue(local->mdev, i); 1862 netif_start_subqueue(local->mdev, i);
1863 1863
1864 while (!skb_queue_empty(&local->pending[i])) { 1864 while (!skb_queue_empty(&local->pending[i])) {
1865 tx.flags = 0; 1865 struct sk_buff *skb = skb_dequeue(&local->pending[i]);
1866 tx.skb = skb_dequeue(&local->pending[i]); 1866 struct sta_info *sta;
1867 hdr = (struct ieee80211_hdr *)tx.skb->data; 1867
1868 tx.sta = sta_info_get(local, hdr->addr1); 1868 hdr = (struct ieee80211_hdr *)skb->data;
1869 sta = sta_info_get(local, hdr->addr1);
1869 1870
1870 ret = __ieee80211_tx(local, &tx); 1871 ret = __ieee80211_tx(local, &skb, sta);
1871 if (ret != IEEE80211_TX_OK) { 1872 if (ret != IEEE80211_TX_OK) {
1872 skb_queue_head(&local->pending[i], tx.skb); 1873 skb_queue_head(&local->pending[i], skb);
1873 break; 1874 break;
1874 } 1875 }
1875 } 1876 }