mirror of https://gitee.com/openkylin/linux.git
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:
parent
ea9b307f8e
commit
cfa1da7e91
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue