diff options
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/agg-tx.c | 44 | ||||
-rw-r--r-- | net/mac80211/ieee80211_i.h | 7 | ||||
-rw-r--r-- | net/mac80211/main.c | 9 | ||||
-rw-r--r-- | net/mac80211/sta_info.c | 12 | ||||
-rw-r--r-- | net/mac80211/sta_info.h | 2 | ||||
-rw-r--r-- | net/mac80211/tx.c | 19 | ||||
-rw-r--r-- | net/mac80211/util.c | 58 |
7 files changed, 11 insertions, 140 deletions
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index 64b839bfbf17..947aaaad35d2 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
@@ -131,14 +131,6 @@ static int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
131 | 131 | ||
132 | state = &sta->ampdu_mlme.tid_state_tx[tid]; | 132 | state = &sta->ampdu_mlme.tid_state_tx[tid]; |
133 | 133 | ||
134 | if (local->hw.ampdu_queues) { | ||
135 | /* | ||
136 | * Pretend the driver woke the queue, just in case | ||
137 | * it disabled it before the session was stopped. | ||
138 | */ | ||
139 | ieee80211_wake_queue( | ||
140 | &local->hw, local->hw.queues + sta->tid_to_tx_q[tid]); | ||
141 | } | ||
142 | *state = HT_AGG_STATE_REQ_STOP_BA_MSK | | 134 | *state = HT_AGG_STATE_REQ_STOP_BA_MSK | |
143 | (initiator << HT_AGG_STATE_INITIATOR_SHIFT); | 135 | (initiator << HT_AGG_STATE_INITIATOR_SHIFT); |
144 | 136 | ||
@@ -206,7 +198,7 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) | |||
206 | struct sta_info *sta; | 198 | struct sta_info *sta; |
207 | struct ieee80211_sub_if_data *sdata; | 199 | struct ieee80211_sub_if_data *sdata; |
208 | u8 *state; | 200 | u8 *state; |
209 | int i, qn = -1, ret = 0; | 201 | int ret = 0; |
210 | u16 start_seq_num; | 202 | u16 start_seq_num; |
211 | 203 | ||
212 | if (WARN_ON(!local->ops->ampdu_action)) | 204 | if (WARN_ON(!local->ops->ampdu_action)) |
@@ -275,29 +267,6 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) | |||
275 | goto err_unlock_sta; | 267 | goto err_unlock_sta; |
276 | } | 268 | } |
277 | 269 | ||
278 | if (hw->ampdu_queues) { | ||
279 | spin_lock(&local->queue_stop_reason_lock); | ||
280 | /* reserve a new queue for this session */ | ||
281 | for (i = 0; i < local->hw.ampdu_queues; i++) { | ||
282 | if (local->ampdu_ac_queue[i] < 0) { | ||
283 | qn = i; | ||
284 | local->ampdu_ac_queue[qn] = | ||
285 | ieee80211_ac_from_tid(tid); | ||
286 | break; | ||
287 | } | ||
288 | } | ||
289 | spin_unlock(&local->queue_stop_reason_lock); | ||
290 | |||
291 | if (qn < 0) { | ||
292 | #ifdef CONFIG_MAC80211_HT_DEBUG | ||
293 | printk(KERN_DEBUG "BA request denied - " | ||
294 | "queue unavailable for tid %d\n", tid); | ||
295 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | ||
296 | ret = -ENOSPC; | ||
297 | goto err_unlock_sta; | ||
298 | } | ||
299 | } | ||
300 | |||
301 | /* | 270 | /* |
302 | * While we're asking the driver about the aggregation, | 271 | * While we're asking the driver about the aggregation, |
303 | * stop the AC queue so that we don't have to worry | 272 | * stop the AC queue so that we don't have to worry |
@@ -319,7 +288,7 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) | |||
319 | tid); | 288 | tid); |
320 | #endif | 289 | #endif |
321 | ret = -ENOMEM; | 290 | ret = -ENOMEM; |
322 | goto err_return_queue; | 291 | goto err_wake_queue; |
323 | } | 292 | } |
324 | 293 | ||
325 | skb_queue_head_init(&sta->ampdu_mlme.tid_tx[tid]->pending); | 294 | skb_queue_head_init(&sta->ampdu_mlme.tid_tx[tid]->pending); |
@@ -348,7 +317,6 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) | |||
348 | *state = HT_AGG_STATE_IDLE; | 317 | *state = HT_AGG_STATE_IDLE; |
349 | goto err_free; | 318 | goto err_free; |
350 | } | 319 | } |
351 | sta->tid_to_tx_q[tid] = qn; | ||
352 | 320 | ||
353 | /* Driver vetoed or OKed, but we can take packets again now */ | 321 | /* Driver vetoed or OKed, but we can take packets again now */ |
354 | ieee80211_wake_queue_by_reason( | 322 | ieee80211_wake_queue_by_reason( |
@@ -380,13 +348,7 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) | |||
380 | err_free: | 348 | err_free: |
381 | kfree(sta->ampdu_mlme.tid_tx[tid]); | 349 | kfree(sta->ampdu_mlme.tid_tx[tid]); |
382 | sta->ampdu_mlme.tid_tx[tid] = NULL; | 350 | sta->ampdu_mlme.tid_tx[tid] = NULL; |
383 | err_return_queue: | 351 | err_wake_queue: |
384 | if (qn >= 0) { | ||
385 | /* give queue back to pool */ | ||
386 | spin_lock(&local->queue_stop_reason_lock); | ||
387 | local->ampdu_ac_queue[qn] = -1; | ||
388 | spin_unlock(&local->queue_stop_reason_lock); | ||
389 | } | ||
390 | ieee80211_wake_queue_by_reason( | 352 | ieee80211_wake_queue_by_reason( |
391 | &local->hw, ieee80211_ac_from_tid(tid), | 353 | &local->hw, ieee80211_ac_from_tid(tid), |
392 | IEEE80211_QUEUE_STOP_REASON_AGGREGATION); | 354 | IEEE80211_QUEUE_STOP_REASON_AGGREGATION); |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 32345b479adb..e6ed78cb16b3 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -594,12 +594,7 @@ struct ieee80211_local { | |||
594 | 594 | ||
595 | const struct ieee80211_ops *ops; | 595 | const struct ieee80211_ops *ops; |
596 | 596 | ||
597 | /* AC queue corresponding to each AMPDU queue */ | 597 | unsigned long queue_stop_reasons[IEEE80211_MAX_QUEUES]; |
598 | s8 ampdu_ac_queue[IEEE80211_MAX_AMPDU_QUEUES]; | ||
599 | unsigned int amdpu_ac_stop_refcnt[IEEE80211_MAX_AMPDU_QUEUES]; | ||
600 | |||
601 | unsigned long queue_stop_reasons[IEEE80211_MAX_QUEUES + | ||
602 | IEEE80211_MAX_AMPDU_QUEUES]; | ||
603 | /* also used to protect ampdu_ac_queue and amdpu_ac_stop_refcnt */ | 598 | /* also used to protect ampdu_ac_queue and amdpu_ac_stop_refcnt */ |
604 | spinlock_t queue_stop_reason_lock; | 599 | spinlock_t queue_stop_reason_lock; |
605 | 600 | ||
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 756284e0bbd3..a6f1d8a869bc 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -774,11 +774,6 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, | |||
774 | setup_timer(&local->dynamic_ps_timer, | 774 | setup_timer(&local->dynamic_ps_timer, |
775 | ieee80211_dynamic_ps_timer, (unsigned long) local); | 775 | ieee80211_dynamic_ps_timer, (unsigned long) local); |
776 | 776 | ||
777 | for (i = 0; i < IEEE80211_MAX_AMPDU_QUEUES; i++) | ||
778 | local->ampdu_ac_queue[i] = -1; | ||
779 | /* using an s8 won't work with more than that */ | ||
780 | BUILD_BUG_ON(IEEE80211_MAX_AMPDU_QUEUES > 127); | ||
781 | |||
782 | sta_info_init(local); | 777 | sta_info_init(local); |
783 | 778 | ||
784 | for (i = 0; i < IEEE80211_MAX_QUEUES; i++) | 779 | for (i = 0; i < IEEE80211_MAX_QUEUES; i++) |
@@ -874,10 +869,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
874 | */ | 869 | */ |
875 | if (hw->queues > IEEE80211_MAX_QUEUES) | 870 | if (hw->queues > IEEE80211_MAX_QUEUES) |
876 | hw->queues = IEEE80211_MAX_QUEUES; | 871 | hw->queues = IEEE80211_MAX_QUEUES; |
877 | if (hw->ampdu_queues > IEEE80211_MAX_AMPDU_QUEUES) | ||
878 | hw->ampdu_queues = IEEE80211_MAX_AMPDU_QUEUES; | ||
879 | if (hw->queues < 4) | ||
880 | hw->ampdu_queues = 0; | ||
881 | 872 | ||
882 | mdev = alloc_netdev_mq(sizeof(struct ieee80211_master_priv), | 873 | mdev = alloc_netdev_mq(sizeof(struct ieee80211_master_priv), |
883 | "wmaster%d", ieee80211_master_setup, | 874 | "wmaster%d", ieee80211_master_setup, |
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index dd3593c1fd23..c5f14e6bbde2 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
@@ -203,17 +203,6 @@ void sta_info_destroy(struct sta_info *sta) | |||
203 | if (tid_rx) | 203 | if (tid_rx) |
204 | tid_rx->shutdown = true; | 204 | tid_rx->shutdown = true; |
205 | 205 | ||
206 | /* | ||
207 | * The stop callback cannot find this station any more, but | ||
208 | * it didn't complete its work -- start the queue if necessary | ||
209 | */ | ||
210 | if (sta->ampdu_mlme.tid_state_tx[i] & HT_AGG_STATE_INITIATOR_MSK && | ||
211 | sta->ampdu_mlme.tid_state_tx[i] & HT_AGG_STATE_REQ_STOP_BA_MSK && | ||
212 | local->hw.ampdu_queues) | ||
213 | ieee80211_wake_queue_by_reason(&local->hw, | ||
214 | local->hw.queues + sta->tid_to_tx_q[i], | ||
215 | IEEE80211_QUEUE_STOP_REASON_AGGREGATION); | ||
216 | |||
217 | spin_unlock_bh(&sta->lock); | 206 | spin_unlock_bh(&sta->lock); |
218 | 207 | ||
219 | /* | 208 | /* |
@@ -292,7 +281,6 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, | |||
292 | * enable session_timer's data differentiation. refer to | 281 | * enable session_timer's data differentiation. refer to |
293 | * sta_rx_agg_session_timer_expired for useage */ | 282 | * sta_rx_agg_session_timer_expired for useage */ |
294 | sta->timer_to_tid[i] = i; | 283 | sta->timer_to_tid[i] = i; |
295 | sta->tid_to_tx_q[i] = -1; | ||
296 | /* rx */ | 284 | /* rx */ |
297 | sta->ampdu_mlme.tid_state_rx[i] = HT_AGG_STATE_IDLE; | 285 | sta->ampdu_mlme.tid_state_rx[i] = HT_AGG_STATE_IDLE; |
298 | sta->ampdu_mlme.tid_rx[i] = NULL; | 286 | sta->ampdu_mlme.tid_rx[i] = NULL; |
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index 18fd5d1a4422..5534d489f506 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h | |||
@@ -206,7 +206,6 @@ struct sta_ampdu_mlme { | |||
206 | * @tid_seq: per-TID sequence numbers for sending to this STA | 206 | * @tid_seq: per-TID sequence numbers for sending to this STA |
207 | * @ampdu_mlme: A-MPDU state machine state | 207 | * @ampdu_mlme: A-MPDU state machine state |
208 | * @timer_to_tid: identity mapping to ID timers | 208 | * @timer_to_tid: identity mapping to ID timers |
209 | * @tid_to_tx_q: map tid to tx queue (invalid == negative values) | ||
210 | * @llid: Local link ID | 209 | * @llid: Local link ID |
211 | * @plid: Peer link ID | 210 | * @plid: Peer link ID |
212 | * @reason: Cancel reason on PLINK_HOLDING state | 211 | * @reason: Cancel reason on PLINK_HOLDING state |
@@ -281,7 +280,6 @@ struct sta_info { | |||
281 | */ | 280 | */ |
282 | struct sta_ampdu_mlme ampdu_mlme; | 281 | struct sta_ampdu_mlme ampdu_mlme; |
283 | u8 timer_to_tid[STA_TID_NUM]; | 282 | u8 timer_to_tid[STA_TID_NUM]; |
284 | s8 tid_to_tx_q[STA_TID_NUM]; | ||
285 | 283 | ||
286 | #ifdef CONFIG_MAC80211_MESH | 284 | #ifdef CONFIG_MAC80211_MESH |
287 | /* | 285 | /* |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 906ab785db40..3fb04a86444d 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1145,25 +1145,6 @@ static int __ieee80211_tx(struct ieee80211_local *local, | |||
1145 | info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT | | 1145 | info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT | |
1146 | IEEE80211_TX_CTL_FIRST_FRAGMENT); | 1146 | IEEE80211_TX_CTL_FIRST_FRAGMENT); |
1147 | 1147 | ||
1148 | /* | ||
1149 | * Internally, we need to have the queue mapping point to | ||
1150 | * the real AC queue, not the virtual A-MPDU queue. This | ||
1151 | * now finally sets the queue to what the driver wants. | ||
1152 | * We will later move this down into the only driver that | ||
1153 | * needs it, iwlwifi. | ||
1154 | */ | ||
1155 | if (sta && local->hw.ampdu_queues && | ||
1156 | info->flags & IEEE80211_TX_CTL_AMPDU) { | ||
1157 | unsigned long flags; | ||
1158 | u8 *qc = ieee80211_get_qos_ctl((void *) skb->data); | ||
1159 | int tid = *qc & IEEE80211_QOS_CTL_TID_MASK; | ||
1160 | |||
1161 | spin_lock_irqsave(&sta->lock, flags); | ||
1162 | skb_set_queue_mapping(skb, local->hw.queues + | ||
1163 | sta->tid_to_tx_q[tid]); | ||
1164 | spin_unlock_irqrestore(&sta->lock, flags); | ||
1165 | } | ||
1166 | |||
1167 | next = skb->next; | 1148 | next = skb->next; |
1168 | len = skb->len; | 1149 | len = skb->len; |
1169 | ret = local->ops->tx(local_to_hw(local), skb); | 1150 | ret = local->ops->tx(local_to_hw(local), skb); |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 0247d8022f5f..fdf432f14554 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -339,29 +339,8 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue, | |||
339 | { | 339 | { |
340 | struct ieee80211_local *local = hw_to_local(hw); | 340 | struct ieee80211_local *local = hw_to_local(hw); |
341 | 341 | ||
342 | if (queue >= hw->queues) { | 342 | if (WARN_ON(queue >= hw->queues)) |
343 | if (local->ampdu_ac_queue[queue - hw->queues] < 0) | 343 | return; |
344 | return; | ||
345 | |||
346 | /* | ||
347 | * for virtual aggregation queues, we need to refcount the | ||
348 | * internal mac80211 disable (multiple times!), keep track of | ||
349 | * driver disable _and_ make sure the regular queue is | ||
350 | * actually enabled. | ||
351 | */ | ||
352 | if (reason == IEEE80211_QUEUE_STOP_REASON_AGGREGATION) | ||
353 | local->amdpu_ac_stop_refcnt[queue - hw->queues]--; | ||
354 | else | ||
355 | __clear_bit(reason, &local->queue_stop_reasons[queue]); | ||
356 | |||
357 | if (local->queue_stop_reasons[queue] || | ||
358 | local->amdpu_ac_stop_refcnt[queue - hw->queues]) | ||
359 | return; | ||
360 | |||
361 | /* now go on to treat the corresponding regular queue */ | ||
362 | queue = local->ampdu_ac_queue[queue - hw->queues]; | ||
363 | reason = IEEE80211_QUEUE_STOP_REASON_AGGREGATION; | ||
364 | } | ||
365 | 344 | ||
366 | __clear_bit(reason, &local->queue_stop_reasons[queue]); | 345 | __clear_bit(reason, &local->queue_stop_reasons[queue]); |
367 | 346 | ||
@@ -400,25 +379,8 @@ static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue, | |||
400 | { | 379 | { |
401 | struct ieee80211_local *local = hw_to_local(hw); | 380 | struct ieee80211_local *local = hw_to_local(hw); |
402 | 381 | ||
403 | if (queue >= hw->queues) { | 382 | if (WARN_ON(queue >= hw->queues)) |
404 | if (local->ampdu_ac_queue[queue - hw->queues] < 0) | 383 | return; |
405 | return; | ||
406 | |||
407 | /* | ||
408 | * for virtual aggregation queues, we need to refcount the | ||
409 | * internal mac80211 disable (multiple times!), keep track of | ||
410 | * driver disable _and_ make sure the regular queue is | ||
411 | * actually enabled. | ||
412 | */ | ||
413 | if (reason == IEEE80211_QUEUE_STOP_REASON_AGGREGATION) | ||
414 | local->amdpu_ac_stop_refcnt[queue - hw->queues]++; | ||
415 | else | ||
416 | __set_bit(reason, &local->queue_stop_reasons[queue]); | ||
417 | |||
418 | /* now go on to treat the corresponding regular queue */ | ||
419 | queue = local->ampdu_ac_queue[queue - hw->queues]; | ||
420 | reason = IEEE80211_QUEUE_STOP_REASON_AGGREGATION; | ||
421 | } | ||
422 | 384 | ||
423 | /* | 385 | /* |
424 | * Only stop if it was previously running, this is necessary | 386 | * Only stop if it was previously running, this is necessary |
@@ -474,15 +436,9 @@ EXPORT_SYMBOL(ieee80211_stop_queues); | |||
474 | int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue) | 436 | int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue) |
475 | { | 437 | { |
476 | struct ieee80211_local *local = hw_to_local(hw); | 438 | struct ieee80211_local *local = hw_to_local(hw); |
477 | unsigned long flags; | ||
478 | 439 | ||
479 | if (queue >= hw->queues) { | 440 | if (WARN_ON(queue >= hw->queues)) |
480 | spin_lock_irqsave(&local->queue_stop_reason_lock, flags); | 441 | return true; |
481 | queue = local->ampdu_ac_queue[queue - hw->queues]; | ||
482 | spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); | ||
483 | if (queue < 0) | ||
484 | return true; | ||
485 | } | ||
486 | 442 | ||
487 | return __netif_subqueue_stopped(local->mdev, queue); | 443 | return __netif_subqueue_stopped(local->mdev, queue); |
488 | } | 444 | } |
@@ -497,7 +453,7 @@ void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw, | |||
497 | 453 | ||
498 | spin_lock_irqsave(&local->queue_stop_reason_lock, flags); | 454 | spin_lock_irqsave(&local->queue_stop_reason_lock, flags); |
499 | 455 | ||
500 | for (i = 0; i < hw->queues + hw->ampdu_queues; i++) | 456 | for (i = 0; i < hw->queues; i++) |
501 | __ieee80211_wake_queue(hw, i, reason); | 457 | __ieee80211_wake_queue(hw, i, reason); |
502 | 458 | ||
503 | spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); | 459 | spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); |