iwlwifi: differentiate 4965 and 5000 hw ampdu queues number
authorTomas Winkler <tomas.winkler@intel.com>
Fri, 11 Jul 2008 03:53:35 +0000 (11:53 +0800)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 14 Jul 2008 18:52:59 +0000 (14:52 -0400)
This patch asks to allocate the correct amount of sw queues according
to hw ampdu queues number.

Signed-off-by: Ron Rindjunsky <ron.rindjunsky@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-4965-hw.h
drivers/net/wireless/iwlwifi/iwl-4965.c
drivers/net/wireless/iwlwifi/iwl-5000-hw.h
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-core.h

index 10f630e1afa633274fd0967dee7fd856aa59194d..fce950f4163c16327321118fb13fff7a6e86ad9a 100644 (file)
@@ -819,6 +819,7 @@ enum {
 #define IWL49_NUM_FIFOS        7
 #define IWL49_CMD_FIFO_NUM     4
 #define IWL49_NUM_QUEUES       16
+#define IWL49_NUM_AMPDU_QUEUES 8
 
 /**
  * struct iwl_tfd_frame_data
index e0e43bdb05e077c24b48f8b461cc5ef4d546d5d8..a20adab6163a678d78ffceb519076f7c1b3b7799 100644 (file)
@@ -52,6 +52,7 @@ static int iwl4965_hw_get_temperature(const struct iwl_priv *priv);
 /* module parameters */
 static struct iwl_mod_params iwl4965_mod_params = {
        .num_of_queues = IWL49_NUM_QUEUES,
+       .num_of_ampdu_queues = IWL49_NUM_AMPDU_QUEUES,
        .enable_qos = 1,
        .amsdu_size_8K = 1,
        .restart_fw = 1,
@@ -1943,9 +1944,11 @@ static int iwl4965_txq_agg_disable(struct iwl_priv *priv, u16 txq_id,
 {
        int ret = 0;
 
-       if (IWL49_FIRST_AMPDU_QUEUE > txq_id) {
-               IWL_WARNING("queue number too small: %d, must be > %d\n",
-                               txq_id, IWL49_FIRST_AMPDU_QUEUE);
+       if ((IWL49_FIRST_AMPDU_QUEUE > txq_id) ||
+           (IWL49_FIRST_AMPDU_QUEUE + IWL49_NUM_AMPDU_QUEUES <= txq_id)) {
+               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;
        }
 
@@ -2012,9 +2015,13 @@ static int iwl4965_txq_agg_enable(struct iwl_priv *priv, int txq_id,
        int ret;
        u16 ra_tid;
 
-       if (IWL49_FIRST_AMPDU_QUEUE > txq_id)
-               IWL_WARNING("queue number too small: %d, must be > %d\n",
-                       txq_id, IWL49_FIRST_AMPDU_QUEUE);
+       if ((IWL49_FIRST_AMPDU_QUEUE > txq_id) ||
+           (IWL49_FIRST_AMPDU_QUEUE + IWL49_NUM_AMPDU_QUEUES <= txq_id)) {
+               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);
 
index 4efe0c06b5b268ebfb4aeb15852dbd4b134a795b..17d4f31c59345ce9c2883ef01afd44820bb1d931 100644 (file)
@@ -81,6 +81,7 @@
 #define IWL50_QUEUE_SIZE                 256
 #define IWL50_CMD_FIFO_NUM                 7
 #define IWL50_NUM_QUEUES                  20
+#define IWL50_NUM_AMPDU_QUEUES           10
 #define IWL50_FIRST_AMPDU_QUEUE                  10
 
 #define IWL_sta_id_POS 12
index b518792c7231ddb9337e5254debed2012aca7de8..878d6193b232d71c541afa4680b5cd3396a6de45 100644 (file)
@@ -1016,9 +1016,13 @@ static int iwl5000_txq_agg_enable(struct iwl_priv *priv, int txq_id,
        int ret;
        u16 ra_tid;
 
-       if (IWL50_FIRST_AMPDU_QUEUE > txq_id)
-               IWL_WARNING("queue number too small: %d, must be > %d\n",
-                       txq_id, IWL50_FIRST_AMPDU_QUEUE);
+       if ((IWL50_FIRST_AMPDU_QUEUE > txq_id) ||
+           (IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES <= txq_id)) {
+               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);
 
@@ -1077,9 +1081,11 @@ static int iwl5000_txq_agg_disable(struct iwl_priv *priv, u16 txq_id,
 {
        int ret;
 
-       if (IWL50_FIRST_AMPDU_QUEUE > txq_id) {
-               IWL_WARNING("queue number too small: %d, must be > %d\n",
-                               txq_id, IWL50_FIRST_AMPDU_QUEUE);
+       if ((IWL50_FIRST_AMPDU_QUEUE > txq_id) ||
+           (IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES <= txq_id)) {
+               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;
        }
 
@@ -1501,6 +1507,7 @@ static struct iwl_ops iwl5000_ops = {
 
 static struct iwl_mod_params iwl50_mod_params = {
        .num_of_queues = IWL50_NUM_QUEUES,
+       .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES,
        .enable_qos = 1,
        .amsdu_size_8K = 1,
        .restart_fw = 1,
index eee220cf52a252a9294b20834347628f68cd01bb..a44188bf4459dcb299edea84988e08139ef5514a 100644 (file)
@@ -825,7 +825,7 @@ int iwl_setup_mac(struct iwl_priv *priv)
        hw->queues = 4;
        /* queues to support 11n aggregation */
        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;
 
index 8d18227dc4b623f909032611a79478bf6d50ba11..0293ae91c350160ed40a514cb245c9667deee320 100644 (file)
@@ -159,6 +159,7 @@ struct iwl_mod_params {
        int debug;              /* def: 0 = minimal debug log messages */
        int disable_hw_scan;    /* def: 0 = use h/w scan */
        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 disable_11n;        /* def: 0 = disable 11n capabilities */
        int amsdu_size_8K;      /* def: 1 = enable 8K amsdu size */