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>
This commit is contained in:
Johannes Berg 2010-11-10 18:25:46 -08:00 committed by Wey-Yi Guy
parent ea9b307f8e
commit cfa1da7e91
1 changed files with 33 additions and 24 deletions

View File

@ -40,30 +40,36 @@
#include "iwl-agn.h" #include "iwl-agn.h"
#include "iwl-agn-calib.h" #include "iwl-agn-calib.h"
static const s8 iwlagn_default_queue_to_tx_fifo[] = { #define IWL_AC_UNSET -1
IWL_TX_FIFO_VO,
IWL_TX_FIFO_VI, struct queue_to_fifo_ac {
IWL_TX_FIFO_BE, s8 fifo, ac;
IWL_TX_FIFO_BK,
IWLAGN_CMD_FIFO_NUM,
IWL_TX_FIFO_UNUSED,
IWL_TX_FIFO_UNUSED,
IWL_TX_FIFO_UNUSED,
IWL_TX_FIFO_UNUSED,
IWL_TX_FIFO_UNUSED,
}; };
static const s8 iwlagn_ipan_queue_to_tx_fifo[] = { static const struct queue_to_fifo_ac iwlagn_default_queue_to_tx_fifo[] = {
IWL_TX_FIFO_VO, { IWL_TX_FIFO_VO, 0, },
IWL_TX_FIFO_VI, { IWL_TX_FIFO_VI, 1, },
IWL_TX_FIFO_BE, { IWL_TX_FIFO_BE, 2, },
IWL_TX_FIFO_BK, { IWL_TX_FIFO_BK, 3, },
IWL_TX_FIFO_BK_IPAN, { IWLAGN_CMD_FIFO_NUM, IWL_AC_UNSET, },
IWL_TX_FIFO_BE_IPAN, { IWL_TX_FIFO_UNUSED, IWL_AC_UNSET, },
IWL_TX_FIFO_VI_IPAN, { IWL_TX_FIFO_UNUSED, IWL_AC_UNSET, },
IWL_TX_FIFO_VO_IPAN, { IWL_TX_FIFO_UNUSED, IWL_AC_UNSET, },
IWL_TX_FIFO_BE_IPAN, { IWL_TX_FIFO_UNUSED, IWL_AC_UNSET, },
IWLAGN_CMD_FIFO_NUM, { IWL_TX_FIFO_UNUSED, IWL_AC_UNSET, },
};
static const struct queue_to_fifo_ac iwlagn_ipan_queue_to_tx_fifo[] = {
{ IWL_TX_FIFO_VO, 0, },
{ IWL_TX_FIFO_VI, 1, },
{ IWL_TX_FIFO_BE, 2, },
{ IWL_TX_FIFO_BK, 3, },
{ IWL_TX_FIFO_BK_IPAN, 3, },
{ IWL_TX_FIFO_BE_IPAN, 2, },
{ IWL_TX_FIFO_VI_IPAN, 1, },
{ IWL_TX_FIFO_VO_IPAN, 0, },
{ IWL_TX_FIFO_BE_IPAN, 2, },
{ IWLAGN_CMD_FIFO_NUM, IWL_AC_UNSET, },
}; };
static struct iwl_wimax_coex_event_entry cu_priorities[COEX_NUM_OF_EVENTS] = { 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)
int iwlagn_alive_notify(struct iwl_priv *priv) int iwlagn_alive_notify(struct iwl_priv *priv)
{ {
const s8 *queue_to_fifo; const struct queue_to_fifo_ac *queue_to_fifo;
u32 a; u32 a;
unsigned long flags; unsigned long flags;
int i, chan; int i, chan;
@ -510,13 +516,16 @@ int iwlagn_alive_notify(struct iwl_priv *priv)
BUILD_BUG_ON(ARRAY_SIZE(iwlagn_ipan_queue_to_tx_fifo) != 10); BUILD_BUG_ON(ARRAY_SIZE(iwlagn_ipan_queue_to_tx_fifo) != 10);
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
int fifo = queue_to_fifo[i]; int fifo = queue_to_fifo[i].fifo;
int ac = queue_to_fifo[i].ac;
iwl_txq_ctx_activate(priv, i); iwl_txq_ctx_activate(priv, i);
if (fifo == IWL_TX_FIFO_UNUSED) if (fifo == IWL_TX_FIFO_UNUSED)
continue; continue;
if (ac != IWL_AC_UNSET)
iwl_set_swq_id(&priv->txq[i], ac, i);
iwlagn_tx_queue_set_status(priv, &priv->txq[i], fifo, 0); iwlagn_tx_queue_set_status(priv, &priv->txq[i], fifo, 0);
} }