From 4496c2c620e835e1de713ed969e87ecbb50940b4 Mon Sep 17 00:00:00 2001 From: Tomas Winkler Date: Fri, 17 Aug 2007 10:33:02 +0800 Subject: [PATCH 01/31] iwlwifi: adding queues_num module parameter This patch adds configuration of number of NICs HW TX queues through module paremeters. Minimal number of queues is 4 to support AC queues and maximum is limited by HW capabilities. This patch also cleans queue number defines. Signed-off-by: Gregory Greenman Signed-off-by: Tomas Winkler Signed-off-by: Zhu Yi --- drivers/net/wireless/iwl-3945-hw.h | 1 + drivers/net/wireless/iwl-4965-hw.h | 4 ++-- drivers/net/wireless/iwl-4965.c | 16 ++++++++-------- drivers/net/wireless/iwl-base.c | 12 ++++++++++++ drivers/net/wireless/iwlwifi.h | 6 +++--- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/drivers/net/wireless/iwl-3945-hw.h b/drivers/net/wireless/iwl-3945-hw.h index cba2c68..1b5e72f 100644 --- a/drivers/net/wireless/iwl-3945-hw.h +++ b/drivers/net/wireless/iwl-3945-hw.h @@ -75,6 +75,7 @@ #define IWL_MAX_BSM_SIZE ALM_RTC_INST_SIZE #define IWL_MAX_INST_SIZE ALM_RTC_INST_SIZE #define IWL_MAX_DATA_SIZE ALM_RTC_DATA_SIZE +#define IWL_MAX_NUM_QUEUES 8 static inline int iwl_hw_valid_rtc_data_addr(u32 addr) { diff --git a/drivers/net/wireless/iwl-4965-hw.h b/drivers/net/wireless/iwl-4965-hw.h index 1cf1d4c..ca17ea4 100644 --- a/drivers/net/wireless/iwl-4965-hw.h +++ b/drivers/net/wireless/iwl-4965-hw.h @@ -898,7 +898,7 @@ struct iwl_tfd_frame { #define IWL4965_MAX_WIN_SIZE 64 #define IWL4965_QUEUE_SIZE 256 #define IWL4965_NUM_FIFOS 7 -#define IWL4965_NUM_QUEUES 16 +#define IWL_MAX_NUM_QUEUES 16 struct iwl4965_queue_byte_cnt_entry { __le16 val; @@ -921,7 +921,7 @@ struct iwl4965_sched_queue_byte_cnt_tbl { * and &iwl_shared.val0 is provided to FH_RSCSR_CHNL0_STTS_WPTR_REG */ struct iwl_shared { struct iwl4965_sched_queue_byte_cnt_tbl - queues_byte_cnt_tbls[IWL4965_NUM_QUEUES]; + queues_byte_cnt_tbls[IWL_MAX_NUM_QUEUES]; __le32 val0; /* __le32 rb_closed_stts_rb_num:12; */ diff --git a/drivers/net/wireless/iwl-4965.c b/drivers/net/wireless/iwl-4965.c index 5f9b699..c09db49 100644 --- a/drivers/net/wireless/iwl-4965.c +++ b/drivers/net/wireless/iwl-4965.c @@ -393,7 +393,7 @@ static int iwl4965_txq_ctx_reset(struct iwl_priv *priv) } /* Tx queue(s) */ - for (txq_id = 0; txq_id < priv->hw_setting.max_queue_number; txq_id++) { + for (txq_id = 0; txq_id < priv->hw_setting.max_txq_num; txq_id++) { slots_num = (txq_id == IWL_CMD_QUEUE_NUM) ? TFD_CMD_SLOTS : TFD_TX_CMD_SLOTS; rc = iwl_tx_queue_init(priv, &priv->txq[txq_id], slots_num, @@ -601,7 +601,7 @@ void iwl_hw_txq_ctx_stop(struct iwl_priv *priv) unsigned long flags; /* reset TFD queues */ - for (txq_id = 0; txq_id < IWL4965_NUM_QUEUES; txq_id++) { + for (txq_id = 0; txq_id < priv->hw_setting.max_txq_num; txq_id++) { spin_lock_irqsave(&priv->lock, flags); if (iwl_grab_restricted_access(priv)) { spin_unlock_irqrestore(&priv->lock, flags); @@ -1657,7 +1657,7 @@ int iwl4965_alive_notify(struct iwl_priv *priv) iwl_write_restricted_mem(priv, a, 0); for (; a < priv->scd_base_addr + SCD_TRANSLATE_TBL_OFFSET; a += 4) iwl_write_restricted_mem(priv, a, 0); - for (; a < sizeof(u16) * IWL4965_NUM_QUEUES; a += 4) + for (; a < sizeof(u16) * priv->hw_setting.max_txq_num; a += 4) iwl_write_restricted_mem(priv, a, 0); iwl_write_restricted_reg(priv, SCD_DRAM_BASE_ADDR, @@ -1666,7 +1666,7 @@ int iwl4965_alive_notify(struct iwl_priv *priv) iwl_write_restricted_reg(priv, SCD_QUEUECHAIN_SEL, 0); /* initiate the queues */ - for (i = 0; i < IWL4965_NUM_QUEUES; i++) { + for (i = 0; i < priv->hw_setting.max_txq_num; i++) { iwl_write_restricted_reg(priv, SCD_QUEUE_RDPTR(i), 0); iwl_write_restricted(priv, HBUS_TARG_WRPTR, 0 | (i << 8)); iwl_write_restricted_mem(priv, priv->scd_base_addr + @@ -1683,7 +1683,7 @@ int iwl4965_alive_notify(struct iwl_priv *priv) } iwl_write_restricted_reg(priv, SCD_INTERRUPT_MASK, - (1 << IWL4965_NUM_QUEUES) - 1); + (1 << priv->hw_setting.max_txq_num) - 1); iwl_write_restricted_reg(priv, SCD_TXFACT, SCD_TXFACT_REG_TXFIFO_MASK(0, 7)); @@ -1717,7 +1717,7 @@ int iwl_hw_set_hw_setting(struct iwl_priv *priv) memset(priv->hw_setting.shared_virt, 0, sizeof(struct iwl_shared)); - priv->hw_setting.max_queue_number = IWL4965_NUM_QUEUES; + priv->hw_setting.max_txq_num = iwl_param_queues_num; priv->hw_setting.ac_queue_count = AC_NUM; priv->hw_setting.cck_flag = RATE_MCS_CCK_MSK; @@ -1738,7 +1738,7 @@ void iwl_hw_txq_ctx_free(struct iwl_priv *priv) int txq_id; /* Tx queues */ - for (txq_id = 0; txq_id < priv->hw_setting.max_queue_number; txq_id++) + for (txq_id = 0; txq_id < priv->hw_setting.max_txq_num; txq_id++) iwl_tx_queue_free(priv, &priv->txq[txq_id]); iwl4965_kw_free(priv); @@ -4567,7 +4567,7 @@ static int iwl_txq_ctx_activate_free(struct iwl_priv *priv) { int txq_id; - for (txq_id = 0; txq_id < IWL4965_NUM_QUEUES; txq_id++) + for (txq_id = 0; txq_id < priv->hw_setting.max_txq_num; txq_id++) if (!test_and_set_bit(txq_id, &priv->txq_ctx_active_msk)) return txq_id; return -1; diff --git a/drivers/net/wireless/iwl-base.c b/drivers/net/wireless/iwl-base.c index 02ae2f0..45a3474 100644 --- a/drivers/net/wireless/iwl-base.c +++ b/drivers/net/wireless/iwl-base.c @@ -78,6 +78,7 @@ int iwl_param_disable; /* def: enable radio */ int iwl_param_antenna; /* def: 0 = both antennas (use diversity) */ int iwl_param_hwcrypto; /* def: using software encryption */ int iwl_param_qos_enable = 1; +int iwl_param_queues_num = IWL_MAX_NUM_QUEUES; /* * module name, copyright, version, etc. @@ -9136,6 +9137,14 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) iwl_hw_ops.hw_scan = NULL; } + if ((iwl_param_queues_num > IWL_MAX_NUM_QUEUES) || + (iwl_param_queues_num < IWL_MIN_NUM_QUEUES)) { + IWL_ERROR("invalid queues_num, should be between %d and %d\n", + IWL_MIN_NUM_QUEUES, IWL_MAX_NUM_QUEUES); + err = -EINVAL; + goto out; + } + /* mac80211 allocates memory for this device instance, including * space for this driver's private structure */ hw = ieee80211_alloc_hw(sizeof(struct iwl_priv), &iwl_hw_ops); @@ -9595,6 +9604,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); module_param_named(disable_hw_scan, iwl_param_disable_hw_scan, int, 0444); MODULE_PARM_DESC(disable_hw_scan, "disable hardware scanning (default 0)"); +module_param_named(queues_num, iwl_param_queues_num, int, 0444); +MODULE_PARM_DESC(queues_num, "number of hw queues."); + /* QoS */ module_param_named(qos_enable, iwl_param_qos_enable, int, 0444); MODULE_PARM_DESC(qos_enable, "enable all QoS functionality"); diff --git a/drivers/net/wireless/iwlwifi.h b/drivers/net/wireless/iwlwifi.h index dc451bd..2fbfc0f 100644 --- a/drivers/net/wireless/iwlwifi.h +++ b/drivers/net/wireless/iwlwifi.h @@ -80,7 +80,7 @@ extern int iwl_param_disable; extern int iwl_param_antenna; extern int iwl_param_hwcrypto; extern int iwl_param_qos_enable; - +extern int iwl_param_queues_num; enum iwl_antenna { IWL_ANTENNA_DIVERSITY, @@ -192,7 +192,7 @@ struct iwl_tx_queue { #define IWL_TX_QUEUE_HCCA_1 5 #define IWL_TX_QUEUE_HCCA_2 6 #define IWL_TX_QUEUE_NONE 7 -#define IWL_MAX_NUM_QUEUES 16 +#define IWL_MIN_NUM_QUEUES 4 /* Power management (not Tx power) structures */ @@ -531,7 +531,7 @@ struct iwl_ibss_seq { }; struct iwl_driver_hw_info { - u16 max_queue_number; + u16 max_txq_num; u16 ac_queue_count; u32 rx_buffer_size; u16 tx_cmd_len; -- 1.5.2