diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2011-08-26 02:11:22 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-08-29 15:30:31 -0400 |
commit | ba562f71198a2cb03bb8d20640ffdf996275c3f0 (patch) | |
tree | 290875852ea56b90190e92db0a77017b01ca4d6a | |
parent | 2c452297ff3eaafad41d24fa03d54a169ced8de1 (diff) |
iwlagn: set tx_fifo for ampdu in transport layer
the mapping tx_queue -> fifo is really transport related. The upper
layer should be involved in such things.
Note that upon agg_disable, the queue is always mapped to fifo 0, but
this doesn't matter since when the queue will be setup again for a
new BA session, it will be configured to the good fifo anyway.
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-tx.c | 65 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 7 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-shared.h | 46 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans-int-pcie.h | 8 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c | 32 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans.h | 22 |
7 files changed, 89 insertions, 96 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c index 60ba4f84285a..9787f0f2a4fd 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c | |||
@@ -42,43 +42,6 @@ | |||
42 | #include "iwl-agn.h" | 42 | #include "iwl-agn.h" |
43 | #include "iwl-trans.h" | 43 | #include "iwl-trans.h" |
44 | 44 | ||
45 | /* | ||
46 | * mac80211 queues, ACs, hardware queues, FIFOs. | ||
47 | * | ||
48 | * Cf. http://wireless.kernel.org/en/developers/Documentation/mac80211/queues | ||
49 | * | ||
50 | * Mac80211 uses the following numbers, which we get as from it | ||
51 | * by way of skb_get_queue_mapping(skb): | ||
52 | * | ||
53 | * VO 0 | ||
54 | * VI 1 | ||
55 | * BE 2 | ||
56 | * BK 3 | ||
57 | * | ||
58 | * | ||
59 | * Regular (not A-MPDU) frames are put into hardware queues corresponding | ||
60 | * to the FIFOs, see comments in iwl-prph.h. Aggregated frames get their | ||
61 | * own queue per aggregation session (RA/TID combination), such queues are | ||
62 | * set up to map into FIFOs too, for which we need an AC->FIFO mapping. In | ||
63 | * order to map frames to the right queue, we also need an AC->hw queue | ||
64 | * mapping. This is implemented here. | ||
65 | * | ||
66 | * Due to the way hw queues are set up (by the hw specific modules like | ||
67 | * iwl-4965.c, iwl-5000.c etc.), the AC->hw queue mapping is the identity | ||
68 | * mapping. | ||
69 | */ | ||
70 | |||
71 | static const u8 tid_to_ac[] = { | ||
72 | IEEE80211_AC_BE, | ||
73 | IEEE80211_AC_BK, | ||
74 | IEEE80211_AC_BK, | ||
75 | IEEE80211_AC_BE, | ||
76 | IEEE80211_AC_VI, | ||
77 | IEEE80211_AC_VI, | ||
78 | IEEE80211_AC_VO, | ||
79 | IEEE80211_AC_VO | ||
80 | }; | ||
81 | |||
82 | static inline int get_ac_from_tid(u16 tid) | 45 | static inline int get_ac_from_tid(u16 tid) |
83 | { | 46 | { |
84 | if (likely(tid < ARRAY_SIZE(tid_to_ac))) | 47 | if (likely(tid < ARRAY_SIZE(tid_to_ac))) |
@@ -88,15 +51,6 @@ static inline int get_ac_from_tid(u16 tid) | |||
88 | return -EINVAL; | 51 | return -EINVAL; |
89 | } | 52 | } |
90 | 53 | ||
91 | static inline int get_fifo_from_tid(struct iwl_rxon_context *ctx, u16 tid) | ||
92 | { | ||
93 | if (likely(tid < ARRAY_SIZE(tid_to_ac))) | ||
94 | return ctx->ac_to_fifo[tid_to_ac[tid]]; | ||
95 | |||
96 | /* no support for TIDs 8-15 yet */ | ||
97 | return -EINVAL; | ||
98 | } | ||
99 | |||
100 | static int iwlagn_txq_agg_enable(struct iwl_priv *priv, int txq_id, int sta_id, | 54 | static int iwlagn_txq_agg_enable(struct iwl_priv *priv, int txq_id, int sta_id, |
101 | int tid) | 55 | int tid) |
102 | { | 56 | { |
@@ -508,16 +462,11 @@ int iwlagn_tx_agg_start(struct iwl_priv *priv, struct ieee80211_vif *vif, | |||
508 | struct ieee80211_sta *sta, u16 tid, u16 *ssn) | 462 | struct ieee80211_sta *sta, u16 tid, u16 *ssn) |
509 | { | 463 | { |
510 | int sta_id; | 464 | int sta_id; |
511 | int tx_fifo; | ||
512 | int txq_id; | 465 | int txq_id; |
513 | int ret; | 466 | int ret; |
514 | unsigned long flags; | 467 | unsigned long flags; |
515 | struct iwl_tid_data *tid_data; | 468 | struct iwl_tid_data *tid_data; |
516 | 469 | ||
517 | tx_fifo = get_fifo_from_tid(iwl_rxon_ctx_from_vif(vif), tid); | ||
518 | if (unlikely(tx_fifo < 0)) | ||
519 | return tx_fifo; | ||
520 | |||
521 | IWL_DEBUG_HT(priv, "TX AGG request on ra = %pM tid = %d\n", | 470 | IWL_DEBUG_HT(priv, "TX AGG request on ra = %pM tid = %d\n", |
522 | sta->addr, tid); | 471 | sta->addr, tid); |
523 | 472 | ||
@@ -544,7 +493,6 @@ int iwlagn_tx_agg_start(struct iwl_priv *priv, struct ieee80211_vif *vif, | |||
544 | tid_data = &priv->shrd->tid_data[sta_id][tid]; | 493 | tid_data = &priv->shrd->tid_data[sta_id][tid]; |
545 | *ssn = SEQ_TO_SN(tid_data->seq_number); | 494 | *ssn = SEQ_TO_SN(tid_data->seq_number); |
546 | tid_data->agg.txq_id = txq_id; | 495 | tid_data->agg.txq_id = txq_id; |
547 | tid_data->agg.tx_fifo = tx_fifo; | ||
548 | iwl_set_swq_id(&priv->txq[txq_id], get_ac_from_tid(tid), txq_id); | 496 | iwl_set_swq_id(&priv->txq[txq_id], get_ac_from_tid(tid), txq_id); |
549 | spin_unlock_irqrestore(&priv->shrd->sta_lock, flags); | 497 | spin_unlock_irqrestore(&priv->shrd->sta_lock, flags); |
550 | 498 | ||
@@ -570,15 +518,11 @@ int iwlagn_tx_agg_start(struct iwl_priv *priv, struct ieee80211_vif *vif, | |||
570 | int iwlagn_tx_agg_stop(struct iwl_priv *priv, struct ieee80211_vif *vif, | 518 | int iwlagn_tx_agg_stop(struct iwl_priv *priv, struct ieee80211_vif *vif, |
571 | struct ieee80211_sta *sta, u16 tid) | 519 | struct ieee80211_sta *sta, u16 tid) |
572 | { | 520 | { |
573 | int tx_fifo_id, txq_id, sta_id, ssn; | 521 | int txq_id, sta_id, ssn; |
574 | struct iwl_tid_data *tid_data; | 522 | struct iwl_tid_data *tid_data; |
575 | int write_ptr, read_ptr; | 523 | int write_ptr, read_ptr; |
576 | unsigned long flags; | 524 | unsigned long flags; |
577 | 525 | ||
578 | tx_fifo_id = get_fifo_from_tid(iwl_rxon_ctx_from_vif(vif), tid); | ||
579 | if (unlikely(tx_fifo_id < 0)) | ||
580 | return tx_fifo_id; | ||
581 | |||
582 | sta_id = iwl_sta_id(sta); | 526 | sta_id = iwl_sta_id(sta); |
583 | 527 | ||
584 | if (sta_id == IWL_INVALID_STATION) { | 528 | if (sta_id == IWL_INVALID_STATION) { |
@@ -635,7 +579,7 @@ int iwlagn_tx_agg_stop(struct iwl_priv *priv, struct ieee80211_vif *vif, | |||
635 | * to deactivate the uCode queue, just return "success" to allow | 579 | * to deactivate the uCode queue, just return "success" to allow |
636 | * mac80211 to clean up it own data. | 580 | * mac80211 to clean up it own data. |
637 | */ | 581 | */ |
638 | iwl_trans_txq_agg_disable(trans(priv), txq_id, ssn, tx_fifo_id); | 582 | iwl_trans_txq_agg_disable(trans(priv), txq_id); |
639 | spin_unlock_irqrestore(&priv->shrd->lock, flags); | 583 | spin_unlock_irqrestore(&priv->shrd->lock, flags); |
640 | 584 | ||
641 | ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); | 585 | ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); |
@@ -661,11 +605,8 @@ static int iwlagn_txq_check_empty(struct iwl_priv *priv, | |||
661 | /* aggregated HW queue */ | 605 | /* aggregated HW queue */ |
662 | if ((txq_id == tid_data->agg.txq_id) && | 606 | if ((txq_id == tid_data->agg.txq_id) && |
663 | (q->read_ptr == q->write_ptr)) { | 607 | (q->read_ptr == q->write_ptr)) { |
664 | u16 ssn = SEQ_TO_SN(tid_data->seq_number); | ||
665 | int tx_fifo = get_fifo_from_tid(ctx, tid); | ||
666 | IWL_DEBUG_HT(priv, "HW queue empty: continue DELBA flow\n"); | 608 | IWL_DEBUG_HT(priv, "HW queue empty: continue DELBA flow\n"); |
667 | iwl_trans_txq_agg_disable(trans(priv), txq_id, | 609 | iwl_trans_txq_agg_disable(trans(priv), txq_id); |
668 | ssn, tx_fifo); | ||
669 | tid_data->agg.state = IWL_AGG_OFF; | 610 | tid_data->agg.state = IWL_AGG_OFF; |
670 | ieee80211_stop_tx_ba_cb_irqsafe(ctx->vif, addr, tid); | 611 | ieee80211_stop_tx_ba_cb_irqsafe(ctx->vif, addr, tid); |
671 | } | 612 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index e19ff11c8dc8..d3e103c1b1c7 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2534,6 +2534,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw, | |||
2534 | struct iwl_priv *priv = hw->priv; | 2534 | struct iwl_priv *priv = hw->priv; |
2535 | int ret = -EINVAL; | 2535 | int ret = -EINVAL; |
2536 | struct iwl_station_priv *sta_priv = (void *) sta->drv_priv; | 2536 | struct iwl_station_priv *sta_priv = (void *) sta->drv_priv; |
2537 | struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif); | ||
2537 | 2538 | ||
2538 | IWL_DEBUG_HT(priv, "A-MPDU action on addr %pM tid %d\n", | 2539 | IWL_DEBUG_HT(priv, "A-MPDU action on addr %pM tid %d\n", |
2539 | sta->addr, tid); | 2540 | sta->addr, tid); |
@@ -2587,8 +2588,8 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw, | |||
2587 | case IEEE80211_AMPDU_TX_OPERATIONAL: | 2588 | case IEEE80211_AMPDU_TX_OPERATIONAL: |
2588 | buf_size = min_t(int, buf_size, LINK_QUAL_AGG_FRAME_LIMIT_DEF); | 2589 | buf_size = min_t(int, buf_size, LINK_QUAL_AGG_FRAME_LIMIT_DEF); |
2589 | 2590 | ||
2590 | iwl_trans_txq_agg_setup(trans(priv), iwl_sta_id(sta), tid, | 2591 | iwl_trans_txq_agg_setup(trans(priv), ctx->ctxid, iwl_sta_id(sta), |
2591 | buf_size); | 2592 | tid, buf_size); |
2592 | 2593 | ||
2593 | /* | 2594 | /* |
2594 | * If the limit is 0, then it wasn't initialised yet, | 2595 | * If the limit is 0, then it wasn't initialised yet, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index aa56736aebb3..5e79c140ac1a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -961,13 +961,6 @@ struct iwl_notification_wait { | |||
961 | bool triggered, aborted; | 961 | bool triggered, aborted; |
962 | }; | 962 | }; |
963 | 963 | ||
964 | enum iwl_rxon_context_id { | ||
965 | IWL_RXON_CTX_BSS, | ||
966 | IWL_RXON_CTX_PAN, | ||
967 | |||
968 | NUM_IWL_RXON_CTX | ||
969 | }; | ||
970 | |||
971 | struct iwl_rxon_context { | 964 | struct iwl_rxon_context { |
972 | struct ieee80211_vif *vif; | 965 | struct ieee80211_vif *vif; |
973 | 966 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-shared.h b/drivers/net/wireless/iwlwifi/iwl-shared.h index db606a6857c2..4cfa31e2529d 100644 --- a/drivers/net/wireless/iwlwifi/iwl-shared.h +++ b/drivers/net/wireless/iwlwifi/iwl-shared.h | |||
@@ -67,6 +67,7 @@ | |||
67 | #include <linux/spinlock.h> | 67 | #include <linux/spinlock.h> |
68 | #include <linux/mutex.h> | 68 | #include <linux/mutex.h> |
69 | #include <linux/gfp.h> | 69 | #include <linux/gfp.h> |
70 | #include <net/mac80211.h> | ||
70 | 71 | ||
71 | #include "iwl-commands.h" | 72 | #include "iwl-commands.h" |
72 | 73 | ||
@@ -192,7 +193,6 @@ struct iwl_ht_agg { | |||
192 | #define IWL_EMPTYING_HW_QUEUE_ADDBA 2 | 193 | #define IWL_EMPTYING_HW_QUEUE_ADDBA 2 |
193 | #define IWL_EMPTYING_HW_QUEUE_DELBA 3 | 194 | #define IWL_EMPTYING_HW_QUEUE_DELBA 3 |
194 | u8 state; | 195 | u8 state; |
195 | u8 tx_fifo; | ||
196 | }; | 196 | }; |
197 | 197 | ||
198 | struct iwl_tid_data { | 198 | struct iwl_tid_data { |
@@ -284,6 +284,50 @@ struct iwl_rx_mem_buffer { | |||
284 | 284 | ||
285 | #define rxb_addr(r) page_address(r->page) | 285 | #define rxb_addr(r) page_address(r->page) |
286 | 286 | ||
287 | /* | ||
288 | * mac80211 queues, ACs, hardware queues, FIFOs. | ||
289 | * | ||
290 | * Cf. http://wireless.kernel.org/en/developers/Documentation/mac80211/queues | ||
291 | * | ||
292 | * Mac80211 uses the following numbers, which we get as from it | ||
293 | * by way of skb_get_queue_mapping(skb): | ||
294 | * | ||
295 | * VO 0 | ||
296 | * VI 1 | ||
297 | * BE 2 | ||
298 | * BK 3 | ||
299 | * | ||
300 | * | ||
301 | * Regular (not A-MPDU) frames are put into hardware queues corresponding | ||
302 | * to the FIFOs, see comments in iwl-prph.h. Aggregated frames get their | ||
303 | * own queue per aggregation session (RA/TID combination), such queues are | ||
304 | * set up to map into FIFOs too, for which we need an AC->FIFO mapping. In | ||
305 | * order to map frames to the right queue, we also need an AC->hw queue | ||
306 | * mapping. This is implemented here. | ||
307 | * | ||
308 | * Due to the way hw queues are set up (by the hw specific modules like | ||
309 | * iwl-4965.c, iwl-5000.c etc.), the AC->hw queue mapping is the identity | ||
310 | * mapping. | ||
311 | */ | ||
312 | |||
313 | static const u8 tid_to_ac[] = { | ||
314 | IEEE80211_AC_BE, | ||
315 | IEEE80211_AC_BK, | ||
316 | IEEE80211_AC_BK, | ||
317 | IEEE80211_AC_BE, | ||
318 | IEEE80211_AC_VI, | ||
319 | IEEE80211_AC_VI, | ||
320 | IEEE80211_AC_VO, | ||
321 | IEEE80211_AC_VO | ||
322 | }; | ||
323 | |||
324 | enum iwl_rxon_context_id { | ||
325 | IWL_RXON_CTX_BSS, | ||
326 | IWL_RXON_CTX_PAN, | ||
327 | |||
328 | NUM_IWL_RXON_CTX | ||
329 | }; | ||
330 | |||
287 | #ifdef CONFIG_PM | 331 | #ifdef CONFIG_PM |
288 | int iwl_suspend(struct iwl_priv *priv); | 332 | int iwl_suspend(struct iwl_priv *priv); |
289 | int iwl_resume(struct iwl_priv *priv); | 333 | int iwl_resume(struct iwl_priv *priv); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-int-pcie.h b/drivers/net/wireless/iwlwifi/iwl-trans-int-pcie.h index 269d9e3188b3..f443c106291a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans-int-pcie.h +++ b/drivers/net/wireless/iwlwifi/iwl-trans-int-pcie.h | |||
@@ -175,14 +175,14 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb); | |||
175 | void iwl_trans_txq_update_byte_cnt_tbl(struct iwl_trans *trans, | 175 | void iwl_trans_txq_update_byte_cnt_tbl(struct iwl_trans *trans, |
176 | struct iwl_tx_queue *txq, | 176 | struct iwl_tx_queue *txq, |
177 | u16 byte_cnt); | 177 | u16 byte_cnt); |
178 | int iwl_trans_pcie_txq_agg_disable(struct iwl_priv *priv, u16 txq_id, | 178 | int iwl_trans_pcie_txq_agg_disable(struct iwl_priv *priv, u16 txq_id); |
179 | u16 ssn_idx, u8 tx_fifo); | ||
180 | void iwl_trans_set_wr_ptrs(struct iwl_trans *trans, int txq_id, u32 index); | 179 | void iwl_trans_set_wr_ptrs(struct iwl_trans *trans, int txq_id, u32 index); |
181 | void iwl_trans_tx_queue_set_status(struct iwl_priv *priv, | 180 | void iwl_trans_tx_queue_set_status(struct iwl_priv *priv, |
182 | struct iwl_tx_queue *txq, | 181 | struct iwl_tx_queue *txq, |
183 | int tx_fifo_id, int scd_retry); | 182 | int tx_fifo_id, int scd_retry); |
184 | void iwl_trans_pcie_txq_agg_setup(struct iwl_priv *priv, int sta_id, int tid, | 183 | void iwl_trans_pcie_txq_agg_setup(struct iwl_priv *priv, |
185 | int frame_limit); | 184 | enum iwl_rxon_context_id ctx, |
185 | int sta_id, int tid, int frame_limit); | ||
186 | void iwlagn_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq, | 186 | void iwlagn_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq, |
187 | int index); | 187 | int index); |
188 | void iwl_tx_queue_reclaim(struct iwl_trans *trans, int txq_id, int index, | 188 | void iwl_tx_queue_reclaim(struct iwl_trans *trans, int txq_id, int index, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c index cc518afd39e6..96ad0afd185e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c +++ b/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c | |||
@@ -424,8 +424,18 @@ void iwl_trans_tx_queue_set_status(struct iwl_priv *priv, | |||
424 | scd_retry ? "BA" : "AC/CMD", txq_id, tx_fifo_id); | 424 | scd_retry ? "BA" : "AC/CMD", txq_id, tx_fifo_id); |
425 | } | 425 | } |
426 | 426 | ||
427 | void iwl_trans_pcie_txq_agg_setup(struct iwl_priv *priv, int sta_id, int tid, | 427 | static inline int get_fifo_from_tid(struct iwl_rxon_context *ctx, u16 tid) |
428 | int frame_limit) | 428 | { |
429 | if (likely(tid < ARRAY_SIZE(tid_to_ac))) | ||
430 | return ctx->ac_to_fifo[tid_to_ac[tid]]; | ||
431 | |||
432 | /* no support for TIDs 8-15 yet */ | ||
433 | return -EINVAL; | ||
434 | } | ||
435 | |||
436 | void iwl_trans_pcie_txq_agg_setup(struct iwl_priv *priv, | ||
437 | enum iwl_rxon_context_id ctx, int sta_id, | ||
438 | int tid, int frame_limit) | ||
429 | { | 439 | { |
430 | int tx_fifo, txq_id, ssn_idx; | 440 | int tx_fifo, txq_id, ssn_idx; |
431 | u16 ra_tid; | 441 | u16 ra_tid; |
@@ -441,11 +451,16 @@ void iwl_trans_pcie_txq_agg_setup(struct iwl_priv *priv, int sta_id, int tid, | |||
441 | if (WARN_ON(tid >= IWL_MAX_TID_COUNT)) | 451 | if (WARN_ON(tid >= IWL_MAX_TID_COUNT)) |
442 | return; | 452 | return; |
443 | 453 | ||
454 | tx_fifo = get_fifo_from_tid(&priv->contexts[ctx], tid); | ||
455 | if (WARN_ON(tx_fifo < 0)) { | ||
456 | IWL_ERR(trans, "txq_agg_setup, bad fifo: %d\n", tx_fifo); | ||
457 | return; | ||
458 | } | ||
459 | |||
444 | spin_lock_irqsave(&priv->shrd->sta_lock, flags); | 460 | spin_lock_irqsave(&priv->shrd->sta_lock, flags); |
445 | tid_data = &priv->shrd->tid_data[sta_id][tid]; | 461 | tid_data = &priv->shrd->tid_data[sta_id][tid]; |
446 | ssn_idx = SEQ_TO_SN(tid_data->seq_number); | 462 | ssn_idx = SEQ_TO_SN(tid_data->seq_number); |
447 | txq_id = tid_data->agg.txq_id; | 463 | txq_id = tid_data->agg.txq_id; |
448 | tx_fifo = tid_data->agg.tx_fifo; | ||
449 | spin_unlock_irqrestore(&priv->shrd->sta_lock, flags); | 464 | spin_unlock_irqrestore(&priv->shrd->sta_lock, flags); |
450 | 465 | ||
451 | ra_tid = BUILD_RAxTID(sta_id, tid); | 466 | ra_tid = BUILD_RAxTID(sta_id, tid); |
@@ -492,8 +507,7 @@ void iwl_trans_pcie_txq_agg_setup(struct iwl_priv *priv, int sta_id, int tid, | |||
492 | spin_unlock_irqrestore(&priv->shrd->lock, flags); | 507 | spin_unlock_irqrestore(&priv->shrd->lock, flags); |
493 | } | 508 | } |
494 | 509 | ||
495 | int iwl_trans_pcie_txq_agg_disable(struct iwl_priv *priv, u16 txq_id, | 510 | int iwl_trans_pcie_txq_agg_disable(struct iwl_priv *priv, u16 txq_id) |
496 | u16 ssn_idx, u8 tx_fifo) | ||
497 | { | 511 | { |
498 | struct iwl_trans *trans = trans(priv); | 512 | struct iwl_trans *trans = trans(priv); |
499 | if ((IWLAGN_FIRST_AMPDU_QUEUE > txq_id) || | 513 | if ((IWLAGN_FIRST_AMPDU_QUEUE > txq_id) || |
@@ -511,14 +525,14 @@ int iwl_trans_pcie_txq_agg_disable(struct iwl_priv *priv, u16 txq_id, | |||
511 | 525 | ||
512 | iwl_clear_bits_prph(bus(priv), SCD_AGGR_SEL, (1 << txq_id)); | 526 | iwl_clear_bits_prph(bus(priv), SCD_AGGR_SEL, (1 << txq_id)); |
513 | 527 | ||
514 | priv->txq[txq_id].q.read_ptr = (ssn_idx & 0xff); | 528 | priv->txq[txq_id].q.read_ptr = 0; |
515 | priv->txq[txq_id].q.write_ptr = (ssn_idx & 0xff); | 529 | priv->txq[txq_id].q.write_ptr = 0; |
516 | /* supposes that ssn_idx is valid (!= 0xFFF) */ | 530 | /* supposes that ssn_idx is valid (!= 0xFFF) */ |
517 | iwl_trans_set_wr_ptrs(trans, txq_id, ssn_idx); | 531 | iwl_trans_set_wr_ptrs(trans, txq_id, 0); |
518 | 532 | ||
519 | iwl_clear_bits_prph(bus(priv), SCD_INTERRUPT_MASK, (1 << txq_id)); | 533 | iwl_clear_bits_prph(bus(priv), SCD_INTERRUPT_MASK, (1 << txq_id)); |
520 | iwl_txq_ctx_deactivate(priv, txq_id); | 534 | iwl_txq_ctx_deactivate(priv, txq_id); |
521 | iwl_trans_tx_queue_set_status(priv, &priv->txq[txq_id], tx_fifo, 0); | 535 | iwl_trans_tx_queue_set_status(priv, &priv->txq[txq_id], 0, 0); |
522 | 536 | ||
523 | return 0; | 537 | return 0; |
524 | } | 538 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h index 2385de267bb7..011c82444566 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans.h +++ b/drivers/net/wireless/iwlwifi/iwl-trans.h | |||
@@ -123,10 +123,10 @@ struct iwl_trans_ops { | |||
123 | void (*reclaim)(struct iwl_trans *trans, int txq_id, int ssn, | 123 | void (*reclaim)(struct iwl_trans *trans, int txq_id, int ssn, |
124 | u32 status, struct sk_buff_head *skbs); | 124 | u32 status, struct sk_buff_head *skbs); |
125 | 125 | ||
126 | int (*txq_agg_disable)(struct iwl_priv *priv, u16 txq_id, | 126 | int (*txq_agg_disable)(struct iwl_priv *priv, u16 txq_id); |
127 | u16 ssn_idx, u8 tx_fifo); | 127 | void (*txq_agg_setup)(struct iwl_priv *priv, |
128 | void (*txq_agg_setup)(struct iwl_priv *priv, int sta_id, int tid, | 128 | enum iwl_rxon_context_id ctx, int sta_id, |
129 | int frame_limit); | 129 | int tid, int frame_limit); |
130 | 130 | ||
131 | void (*kick_nic)(struct iwl_trans *trans); | 131 | void (*kick_nic)(struct iwl_trans *trans); |
132 | 132 | ||
@@ -209,17 +209,17 @@ static inline void iwl_trans_reclaim(struct iwl_trans *trans, int txq_id, | |||
209 | trans->ops->reclaim(trans, txq_id, ssn, status, skbs); | 209 | trans->ops->reclaim(trans, txq_id, ssn, status, skbs); |
210 | } | 210 | } |
211 | 211 | ||
212 | static inline int iwl_trans_txq_agg_disable(struct iwl_trans *trans, u16 txq_id, | 212 | static inline int iwl_trans_txq_agg_disable(struct iwl_trans *trans, u16 txq_id) |
213 | u16 ssn_idx, u8 tx_fifo) | ||
214 | { | 213 | { |
215 | return trans->ops->txq_agg_disable(priv(trans), txq_id, | 214 | return trans->ops->txq_agg_disable(priv(trans), txq_id); |
216 | ssn_idx, tx_fifo); | ||
217 | } | 215 | } |
218 | 216 | ||
219 | static inline void iwl_trans_txq_agg_setup(struct iwl_trans *trans, int sta_id, | 217 | static inline void iwl_trans_txq_agg_setup(struct iwl_trans *trans, |
220 | int tid, int frame_limit) | 218 | enum iwl_rxon_context_id ctx, |
219 | int sta_id, int tid, | ||
220 | int frame_limit) | ||
221 | { | 221 | { |
222 | trans->ops->txq_agg_setup(priv(trans), sta_id, tid, frame_limit); | 222 | trans->ops->txq_agg_setup(priv(trans), ctx, sta_id, tid, frame_limit); |
223 | } | 223 | } |
224 | 224 | ||
225 | static inline void iwl_trans_kick_nic(struct iwl_trans *trans) | 225 | static inline void iwl_trans_kick_nic(struct iwl_trans *trans) |