Commit 9f17b318 authored by Tomas Winkler's avatar Tomas Winkler Committed by John W. Linville

iwlwifi: differentiate 4965 and 5000 hw ampdu queues number

This patch asks to allocate the correct amount of sw queues according
to hw ampdu queues number.
Signed-off-by: default avatarRon Rindjunsky <ron.rindjunsky@intel.com>
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 1ff50bda
...@@ -819,6 +819,7 @@ enum { ...@@ -819,6 +819,7 @@ enum {
#define IWL49_NUM_FIFOS 7 #define IWL49_NUM_FIFOS 7
#define IWL49_CMD_FIFO_NUM 4 #define IWL49_CMD_FIFO_NUM 4
#define IWL49_NUM_QUEUES 16 #define IWL49_NUM_QUEUES 16
#define IWL49_NUM_AMPDU_QUEUES 8
/** /**
* struct iwl_tfd_frame_data * struct iwl_tfd_frame_data
......
...@@ -52,6 +52,7 @@ static int iwl4965_hw_get_temperature(const struct iwl_priv *priv); ...@@ -52,6 +52,7 @@ static int iwl4965_hw_get_temperature(const struct iwl_priv *priv);
/* module parameters */ /* module parameters */
static struct iwl_mod_params iwl4965_mod_params = { static struct iwl_mod_params iwl4965_mod_params = {
.num_of_queues = IWL49_NUM_QUEUES, .num_of_queues = IWL49_NUM_QUEUES,
.num_of_ampdu_queues = IWL49_NUM_AMPDU_QUEUES,
.enable_qos = 1, .enable_qos = 1,
.amsdu_size_8K = 1, .amsdu_size_8K = 1,
.restart_fw = 1, .restart_fw = 1,
...@@ -1943,9 +1944,11 @@ static int iwl4965_txq_agg_disable(struct iwl_priv *priv, u16 txq_id, ...@@ -1943,9 +1944,11 @@ static int iwl4965_txq_agg_disable(struct iwl_priv *priv, u16 txq_id,
{ {
int ret = 0; int ret = 0;
if (IWL49_FIRST_AMPDU_QUEUE > txq_id) { if ((IWL49_FIRST_AMPDU_QUEUE > txq_id) ||
IWL_WARNING("queue number too small: %d, must be > %d\n", (IWL49_FIRST_AMPDU_QUEUE + IWL49_NUM_AMPDU_QUEUES <= txq_id)) {
txq_id, IWL49_FIRST_AMPDU_QUEUE); IWL_WARNING("queue number out of range: %d, must be %d to %d\n",
txq_id, IWL49_FIRST_AMPDU_QUEUE,
IWL49_FIRST_AMPDU_QUEUE + IWL49_NUM_AMPDU_QUEUES - 1);
return -EINVAL; return -EINVAL;
} }
...@@ -2012,9 +2015,13 @@ static int iwl4965_txq_agg_enable(struct iwl_priv *priv, int txq_id, ...@@ -2012,9 +2015,13 @@ static int iwl4965_txq_agg_enable(struct iwl_priv *priv, int txq_id,
int ret; int ret;
u16 ra_tid; u16 ra_tid;
if (IWL49_FIRST_AMPDU_QUEUE > txq_id) if ((IWL49_FIRST_AMPDU_QUEUE > txq_id) ||
IWL_WARNING("queue number too small: %d, must be > %d\n", (IWL49_FIRST_AMPDU_QUEUE + IWL49_NUM_AMPDU_QUEUES <= txq_id)) {
txq_id, IWL49_FIRST_AMPDU_QUEUE); IWL_WARNING("queue number out of range: %d, must be %d to %d\n",
txq_id, IWL49_FIRST_AMPDU_QUEUE,
IWL49_FIRST_AMPDU_QUEUE + IWL49_NUM_AMPDU_QUEUES - 1);
return -EINVAL;
}
ra_tid = BUILD_RAxTID(sta_id, tid); ra_tid = BUILD_RAxTID(sta_id, tid);
......
...@@ -81,6 +81,7 @@ ...@@ -81,6 +81,7 @@
#define IWL50_QUEUE_SIZE 256 #define IWL50_QUEUE_SIZE 256
#define IWL50_CMD_FIFO_NUM 7 #define IWL50_CMD_FIFO_NUM 7
#define IWL50_NUM_QUEUES 20 #define IWL50_NUM_QUEUES 20
#define IWL50_NUM_AMPDU_QUEUES 10
#define IWL50_FIRST_AMPDU_QUEUE 10 #define IWL50_FIRST_AMPDU_QUEUE 10
#define IWL_sta_id_POS 12 #define IWL_sta_id_POS 12
......
...@@ -1016,9 +1016,13 @@ static int iwl5000_txq_agg_enable(struct iwl_priv *priv, int txq_id, ...@@ -1016,9 +1016,13 @@ static int iwl5000_txq_agg_enable(struct iwl_priv *priv, int txq_id,
int ret; int ret;
u16 ra_tid; u16 ra_tid;
if (IWL50_FIRST_AMPDU_QUEUE > txq_id) if ((IWL50_FIRST_AMPDU_QUEUE > txq_id) ||
IWL_WARNING("queue number too small: %d, must be > %d\n", (IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES <= txq_id)) {
txq_id, IWL50_FIRST_AMPDU_QUEUE); IWL_WARNING("queue number out of range: %d, must be %d to %d\n",
txq_id, IWL50_FIRST_AMPDU_QUEUE,
IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES - 1);
return -EINVAL;
}
ra_tid = BUILD_RAxTID(sta_id, tid); ra_tid = BUILD_RAxTID(sta_id, tid);
...@@ -1077,9 +1081,11 @@ static int iwl5000_txq_agg_disable(struct iwl_priv *priv, u16 txq_id, ...@@ -1077,9 +1081,11 @@ static int iwl5000_txq_agg_disable(struct iwl_priv *priv, u16 txq_id,
{ {
int ret; int ret;
if (IWL50_FIRST_AMPDU_QUEUE > txq_id) { if ((IWL50_FIRST_AMPDU_QUEUE > txq_id) ||
IWL_WARNING("queue number too small: %d, must be > %d\n", (IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES <= txq_id)) {
txq_id, IWL50_FIRST_AMPDU_QUEUE); IWL_WARNING("queue number out of range: %d, must be %d to %d\n",
txq_id, IWL50_FIRST_AMPDU_QUEUE,
IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES - 1);
return -EINVAL; return -EINVAL;
} }
...@@ -1501,6 +1507,7 @@ static struct iwl_ops iwl5000_ops = { ...@@ -1501,6 +1507,7 @@ static struct iwl_ops iwl5000_ops = {
static struct iwl_mod_params iwl50_mod_params = { static struct iwl_mod_params iwl50_mod_params = {
.num_of_queues = IWL50_NUM_QUEUES, .num_of_queues = IWL50_NUM_QUEUES,
.num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES,
.enable_qos = 1, .enable_qos = 1,
.amsdu_size_8K = 1, .amsdu_size_8K = 1,
.restart_fw = 1, .restart_fw = 1,
......
...@@ -825,7 +825,7 @@ int iwl_setup_mac(struct iwl_priv *priv) ...@@ -825,7 +825,7 @@ int iwl_setup_mac(struct iwl_priv *priv)
hw->queues = 4; hw->queues = 4;
/* queues to support 11n aggregation */ /* queues to support 11n aggregation */
if (priv->cfg->sku & IWL_SKU_N) if (priv->cfg->sku & IWL_SKU_N)
hw->ampdu_queues = 12; hw->ampdu_queues = priv->cfg->mod_params->num_of_ampdu_queues;
hw->conf.beacon_int = 100; hw->conf.beacon_int = 100;
......
...@@ -159,6 +159,7 @@ struct iwl_mod_params { ...@@ -159,6 +159,7 @@ struct iwl_mod_params {
int debug; /* def: 0 = minimal debug log messages */ int debug; /* def: 0 = minimal debug log messages */
int disable_hw_scan; /* def: 0 = use h/w scan */ int disable_hw_scan; /* def: 0 = use h/w scan */
int num_of_queues; /* def: HW dependent */ int num_of_queues; /* def: HW dependent */
int num_of_ampdu_queues;/* def: HW dependent */
int enable_qos; /* def: 1 = use quality of service */ int enable_qos; /* def: 1 = use quality of service */
int disable_11n; /* def: 0 = disable 11n capabilities */ int disable_11n; /* def: 0 = disable 11n capabilities */
int amsdu_size_8K; /* def: 1 = enable 8K amsdu size */ int amsdu_size_8K; /* def: 1 = enable 8K amsdu size */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment