diff options
author | Johannes Berg <johannes.berg@intel.com> | 2010-11-10 21:25:46 -0500 |
---|---|---|
committer | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2010-11-16 10:46:18 -0500 |
commit | cfa1da7e9133be9280990b2a64fa7696924c8d9a (patch) | |
tree | 2446eac54ef262d3c7593dbba40fe2b0b1456564 /drivers/net/wireless/iwlwifi | |
parent | ea9b307f8e859186a6791e0d508c5993448ac900 (diff) |
iwlagn: fix PAN queues
Currently, when a PAN queue needs to be
stopped, we erroneously stop queue number 5
(for example) with mac80211 -- which doesn't
even exist!
To avoid that problem, recalculate the swq_id
for all queues when setting up the queues,
and don't use the default identity mapping
that is acceptable for devices which don't
support PAN.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-ucode.c | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c index 8b129e29d341..411a7a20450a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c | |||
@@ -40,30 +40,36 @@ | |||
40 | #include "iwl-agn.h" | 40 | #include "iwl-agn.h" |
41 | #include "iwl-agn-calib.h" | 41 | #include "iwl-agn-calib.h" |
42 | 42 | ||
43 | static const s8 iwlagn_default_queue_to_tx_fifo[] = { | 43 | #define IWL_AC_UNSET -1 |
44 | IWL_TX_FIFO_VO, | 44 | |
45 | IWL_TX_FIFO_VI, | 45 | struct queue_to_fifo_ac { |
46 | IWL_TX_FIFO_BE, | 46 | s8 fifo, ac; |
47 | IWL_TX_FIFO_BK, | 47 | }; |
48 | IWLAGN_CMD_FIFO_NUM, | 48 | |
49 | IWL_TX_FIFO_UNUSED, | 49 | static const struct queue_to_fifo_ac iwlagn_default_queue_to_tx_fifo[] = { |
50 | IWL_TX_FIFO_UNUSED, | 50 | { IWL_TX_FIFO_VO, 0, }, |
51 | IWL_TX_FIFO_UNUSED, | 51 | { IWL_TX_FIFO_VI, 1, }, |
52 | IWL_TX_FIFO_UNUSED, | 52 | { IWL_TX_FIFO_BE, 2, }, |
53 | IWL_TX_FIFO_UNUSED, | 53 | { IWL_TX_FIFO_BK, 3, }, |
54 | { IWLAGN_CMD_FIFO_NUM, IWL_AC_UNSET, }, | ||
55 | { IWL_TX_FIFO_UNUSED, IWL_AC_UNSET, }, | ||
56 | { IWL_TX_FIFO_UNUSED, IWL_AC_UNSET, }, | ||
57 | { IWL_TX_FIFO_UNUSED, IWL_AC_UNSET, }, | ||
58 | { IWL_TX_FIFO_UNUSED, IWL_AC_UNSET, }, | ||
59 | { IWL_TX_FIFO_UNUSED, IWL_AC_UNSET, }, | ||
54 | }; | 60 | }; |
55 | 61 | ||
56 | static const s8 iwlagn_ipan_queue_to_tx_fifo[] = { | 62 | static const struct queue_to_fifo_ac iwlagn_ipan_queue_to_tx_fifo[] = { |
57 | IWL_TX_FIFO_VO, | 63 | { IWL_TX_FIFO_VO, 0, }, |
58 | IWL_TX_FIFO_VI, | 64 | { IWL_TX_FIFO_VI, 1, }, |
59 | IWL_TX_FIFO_BE, | 65 | { IWL_TX_FIFO_BE, 2, }, |
60 | IWL_TX_FIFO_BK, | 66 | { IWL_TX_FIFO_BK, 3, }, |
61 | IWL_TX_FIFO_BK_IPAN, | 67 | { IWL_TX_FIFO_BK_IPAN, 3, }, |
62 | IWL_TX_FIFO_BE_IPAN, | 68 | { IWL_TX_FIFO_BE_IPAN, 2, }, |
63 | IWL_TX_FIFO_VI_IPAN, | 69 | { IWL_TX_FIFO_VI_IPAN, 1, }, |
64 | IWL_TX_FIFO_VO_IPAN, | 70 | { IWL_TX_FIFO_VO_IPAN, 0, }, |
65 | IWL_TX_FIFO_BE_IPAN, | 71 | { IWL_TX_FIFO_BE_IPAN, 2, }, |
66 | IWLAGN_CMD_FIFO_NUM, | 72 | { IWLAGN_CMD_FIFO_NUM, IWL_AC_UNSET, }, |
67 | }; | 73 | }; |
68 | 74 | ||
69 | static struct iwl_wimax_coex_event_entry cu_priorities[COEX_NUM_OF_EVENTS] = { | 75 | static struct iwl_wimax_coex_event_entry cu_priorities[COEX_NUM_OF_EVENTS] = { |
@@ -429,7 +435,7 @@ void iwlagn_send_bt_env(struct iwl_priv *priv, u8 action, u8 type) | |||
429 | 435 | ||
430 | int iwlagn_alive_notify(struct iwl_priv *priv) | 436 | int iwlagn_alive_notify(struct iwl_priv *priv) |
431 | { | 437 | { |
432 | const s8 *queue_to_fifo; | 438 | const struct queue_to_fifo_ac *queue_to_fifo; |
433 | u32 a; | 439 | u32 a; |
434 | unsigned long flags; | 440 | unsigned long flags; |
435 | int i, chan; | 441 | int i, chan; |
@@ -510,13 +516,16 @@ int iwlagn_alive_notify(struct iwl_priv *priv) | |||
510 | BUILD_BUG_ON(ARRAY_SIZE(iwlagn_ipan_queue_to_tx_fifo) != 10); | 516 | BUILD_BUG_ON(ARRAY_SIZE(iwlagn_ipan_queue_to_tx_fifo) != 10); |
511 | 517 | ||
512 | for (i = 0; i < 10; i++) { | 518 | for (i = 0; i < 10; i++) { |
513 | int fifo = queue_to_fifo[i]; | 519 | int fifo = queue_to_fifo[i].fifo; |
520 | int ac = queue_to_fifo[i].ac; | ||
514 | 521 | ||
515 | iwl_txq_ctx_activate(priv, i); | 522 | iwl_txq_ctx_activate(priv, i); |
516 | 523 | ||
517 | if (fifo == IWL_TX_FIFO_UNUSED) | 524 | if (fifo == IWL_TX_FIFO_UNUSED) |
518 | continue; | 525 | continue; |
519 | 526 | ||
527 | if (ac != IWL_AC_UNSET) | ||
528 | iwl_set_swq_id(&priv->txq[i], ac, i); | ||
520 | iwlagn_tx_queue_set_status(priv, &priv->txq[i], fifo, 0); | 529 | iwlagn_tx_queue_set_status(priv, &priv->txq[i], fifo, 0); |
521 | } | 530 | } |
522 | 531 | ||