aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-5000.c
diff options
context:
space:
mode:
authorWey-Yi Guy <wey-yi.w.guy@intel.com>2009-10-09 16:20:28 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-10-27 16:47:59 -0400
commit88804e2b33b6ab3974ff2330cd045ca53d6750c5 (patch)
tree1e8d7f27f59774c159e80ad0a9f3bfd6100a525f /drivers/net/wireless/iwlwifi/iwl-5000.c
parent008a9e3e3c37abd7f56d2478fe92d5874de3630a (diff)
iwlwifi: dynamic allocate tx queue structure
Instead of always allocate the max number of tx queue structure, use dynamic allocation based on the number of queues in device configuration. With these changes, device does not have to allocate more memory than the h/w can support. Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-5000.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index a9d1aa3ad57..ab5b9d8d66b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -749,18 +749,16 @@ int iwl5000_alive_notify(struct iwl_priv *priv)
749 749
750int iwl5000_hw_set_hw_params(struct iwl_priv *priv) 750int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
751{ 751{
752 if ((priv->cfg->mod_params->num_of_queues > IWL50_NUM_QUEUES) || 752 if (priv->cfg->mod_params->num_of_queues >= IWL_MIN_NUM_QUEUES &&
753 (priv->cfg->mod_params->num_of_queues < IWL_MIN_NUM_QUEUES)) { 753 priv->cfg->mod_params->num_of_queues <= IWL50_NUM_QUEUES)
754 IWL_ERR(priv, 754 priv->cfg->num_of_queues =
755 "invalid queues_num, should be between %d and %d\n", 755 priv->cfg->mod_params->num_of_queues;
756 IWL_MIN_NUM_QUEUES, IWL50_NUM_QUEUES);
757 return -EINVAL;
758 }
759 756
760 priv->hw_params.max_txq_num = priv->cfg->mod_params->num_of_queues; 757 priv->hw_params.max_txq_num = priv->cfg->num_of_queues;
761 priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM; 758 priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM;
762 priv->hw_params.scd_bc_tbls_size = 759 priv->hw_params.scd_bc_tbls_size =
763 IWL50_NUM_QUEUES * sizeof(struct iwl5000_scd_bc_tbl); 760 priv->cfg->num_of_queues *
761 sizeof(struct iwl5000_scd_bc_tbl);
764 priv->hw_params.tfd_size = sizeof(struct iwl_tfd); 762 priv->hw_params.tfd_size = sizeof(struct iwl_tfd);
765 priv->hw_params.max_stations = IWL5000_STATION_COUNT; 763 priv->hw_params.max_stations = IWL5000_STATION_COUNT;
766 priv->hw_params.bcast_sta_id = IWL5000_BROADCAST_ID; 764 priv->hw_params.bcast_sta_id = IWL5000_BROADCAST_ID;
@@ -912,11 +910,13 @@ int iwl5000_txq_agg_enable(struct iwl_priv *priv, int txq_id,
912 u16 ra_tid; 910 u16 ra_tid;
913 911
914 if ((IWL50_FIRST_AMPDU_QUEUE > txq_id) || 912 if ((IWL50_FIRST_AMPDU_QUEUE > txq_id) ||
915 (IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES <= txq_id)) { 913 (IWL50_FIRST_AMPDU_QUEUE + priv->cfg->num_of_ampdu_queues
914 <= txq_id)) {
916 IWL_WARN(priv, 915 IWL_WARN(priv,
917 "queue number out of range: %d, must be %d to %d\n", 916 "queue number out of range: %d, must be %d to %d\n",
918 txq_id, IWL50_FIRST_AMPDU_QUEUE, 917 txq_id, IWL50_FIRST_AMPDU_QUEUE,
919 IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES - 1); 918 IWL50_FIRST_AMPDU_QUEUE +
919 priv->cfg->num_of_ampdu_queues - 1);
920 return -EINVAL; 920 return -EINVAL;
921 } 921 }
922 922
@@ -970,11 +970,13 @@ int iwl5000_txq_agg_disable(struct iwl_priv *priv, u16 txq_id,
970 u16 ssn_idx, u8 tx_fifo) 970 u16 ssn_idx, u8 tx_fifo)
971{ 971{
972 if ((IWL50_FIRST_AMPDU_QUEUE > txq_id) || 972 if ((IWL50_FIRST_AMPDU_QUEUE > txq_id) ||
973 (IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES <= txq_id)) { 973 (IWL50_FIRST_AMPDU_QUEUE + priv->cfg->num_of_ampdu_queues
974 <= txq_id)) {
974 IWL_ERR(priv, 975 IWL_ERR(priv,
975 "queue number out of range: %d, must be %d to %d\n", 976 "queue number out of range: %d, must be %d to %d\n",
976 txq_id, IWL50_FIRST_AMPDU_QUEUE, 977 txq_id, IWL50_FIRST_AMPDU_QUEUE,
977 IWL50_FIRST_AMPDU_QUEUE + IWL50_NUM_AMPDU_QUEUES - 1); 978 IWL50_FIRST_AMPDU_QUEUE +
979 priv->cfg->num_of_ampdu_queues - 1);
978 return -EINVAL; 980 return -EINVAL;
979 } 981 }
980 982
@@ -1584,8 +1586,6 @@ static struct iwl_ops iwl5150_ops = {
1584}; 1586};
1585 1587
1586struct iwl_mod_params iwl50_mod_params = { 1588struct iwl_mod_params iwl50_mod_params = {
1587 .num_of_queues = IWL50_NUM_QUEUES,
1588 .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES,
1589 .amsdu_size_8K = 1, 1589 .amsdu_size_8K = 1,
1590 .restart_fw = 1, 1590 .restart_fw = 1,
1591 /* the rest are 0 by default */ 1591 /* the rest are 0 by default */
@@ -1602,6 +1602,8 @@ struct iwl_cfg iwl5300_agn_cfg = {
1602 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, 1602 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
1603 .eeprom_ver = EEPROM_5000_EEPROM_VERSION, 1603 .eeprom_ver = EEPROM_5000_EEPROM_VERSION,
1604 .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, 1604 .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
1605 .num_of_queues = IWL50_NUM_QUEUES,
1606 .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES,
1605 .mod_params = &iwl50_mod_params, 1607 .mod_params = &iwl50_mod_params,
1606 .valid_tx_ant = ANT_ABC, 1608 .valid_tx_ant = ANT_ABC,
1607 .valid_rx_ant = ANT_ABC, 1609 .valid_rx_ant = ANT_ABC,
@@ -1621,6 +1623,8 @@ struct iwl_cfg iwl5100_bg_cfg = {
1621 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, 1623 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
1622 .eeprom_ver = EEPROM_5000_EEPROM_VERSION, 1624 .eeprom_ver = EEPROM_5000_EEPROM_VERSION,
1623 .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, 1625 .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
1626 .num_of_queues = IWL50_NUM_QUEUES,
1627 .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES,
1624 .mod_params = &iwl50_mod_params, 1628 .mod_params = &iwl50_mod_params,
1625 .valid_tx_ant = ANT_B, 1629 .valid_tx_ant = ANT_B,
1626 .valid_rx_ant = ANT_AB, 1630 .valid_rx_ant = ANT_AB,
@@ -1640,6 +1644,8 @@ struct iwl_cfg iwl5100_abg_cfg = {
1640 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, 1644 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
1641 .eeprom_ver = EEPROM_5000_EEPROM_VERSION, 1645 .eeprom_ver = EEPROM_5000_EEPROM_VERSION,
1642 .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, 1646 .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
1647 .num_of_queues = IWL50_NUM_QUEUES,
1648 .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES,
1643 .mod_params = &iwl50_mod_params, 1649 .mod_params = &iwl50_mod_params,
1644 .valid_tx_ant = ANT_B, 1650 .valid_tx_ant = ANT_B,
1645 .valid_rx_ant = ANT_AB, 1651 .valid_rx_ant = ANT_AB,
@@ -1659,6 +1665,8 @@ struct iwl_cfg iwl5100_agn_cfg = {
1659 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, 1665 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
1660 .eeprom_ver = EEPROM_5000_EEPROM_VERSION, 1666 .eeprom_ver = EEPROM_5000_EEPROM_VERSION,
1661 .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, 1667 .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION,
1668 .num_of_queues = IWL50_NUM_QUEUES,
1669 .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES,
1662 .mod_params = &iwl50_mod_params, 1670 .mod_params = &iwl50_mod_params,
1663 .valid_tx_ant = ANT_B, 1671 .valid_tx_ant = ANT_B,
1664 .valid_rx_ant = ANT_AB, 1672 .valid_rx_ant = ANT_AB,
@@ -1678,6 +1686,8 @@ struct iwl_cfg iwl5350_agn_cfg = {
1678 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, 1686 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
1679 .eeprom_ver = EEPROM_5050_EEPROM_VERSION, 1687 .eeprom_ver = EEPROM_5050_EEPROM_VERSION,
1680 .eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION, 1688 .eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION,
1689 .num_of_queues = IWL50_NUM_QUEUES,
1690 .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES,
1681 .mod_params = &iwl50_mod_params, 1691 .mod_params = &iwl50_mod_params,
1682 .valid_tx_ant = ANT_ABC, 1692 .valid_tx_ant = ANT_ABC,
1683 .valid_rx_ant = ANT_ABC, 1693 .valid_rx_ant = ANT_ABC,
@@ -1697,6 +1707,8 @@ struct iwl_cfg iwl5150_agn_cfg = {
1697 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, 1707 .eeprom_size = IWL_5000_EEPROM_IMG_SIZE,
1698 .eeprom_ver = EEPROM_5050_EEPROM_VERSION, 1708 .eeprom_ver = EEPROM_5050_EEPROM_VERSION,
1699 .eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION, 1709 .eeprom_calib_ver = EEPROM_5050_TX_POWER_VERSION,
1710 .num_of_queues = IWL50_NUM_QUEUES,
1711 .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES,
1700 .mod_params = &iwl50_mod_params, 1712 .mod_params = &iwl50_mod_params,
1701 .valid_tx_ant = ANT_A, 1713 .valid_tx_ant = ANT_A,
1702 .valid_rx_ant = ANT_AB, 1714 .valid_rx_ant = ANT_AB,