Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
[pandora-kernel.git] / drivers / net / wireless / iwlwifi / iwl-power.c
index 595c930..64ff40a 100644 (file)
 
 #include "iwl-eeprom.h"
 #include "iwl-dev.h"
+#include "iwl-agn.h"
 #include "iwl-core.h"
 #include "iwl-io.h"
 #include "iwl-commands.h"
 #include "iwl-debug.h"
 #include "iwl-power.h"
+#include "iwl-trans.h"
 
 /*
  * Setting power level allows the card to go to sleep when not busy.
  * also use pre-defined power levels.
  */
 
-/*
- * For now, keep using power level 1 instead of automatically
- * adjusting ...
- */
-bool no_sleep_autoadjust = true;
-module_param(no_sleep_autoadjust, bool, S_IRUGO);
-MODULE_PARM_DESC(no_sleep_autoadjust,
-                "don't automatically adjust sleep level "
-                "according to maximum network latency");
-
 /*
  * This defines the old power levels. They are still used by default
  * (level 1) and for thermal throttle (levels 3 through 5)
@@ -254,7 +246,7 @@ static void iwl_static_sleep_cmd(struct iwl_priv *priv,
                }
        }
 
-       if (priv->power_data.pci_pm)
+       if (priv->power_data.bus_pm)
                cmd->flags |= IWL_POWER_PCI_PM_MSK;
        else
                cmd->flags &= ~IWL_POWER_PCI_PM_MSK;
@@ -269,7 +261,7 @@ static void iwl_power_sleep_cam_cmd(struct iwl_priv *priv,
 {
        memset(cmd, 0, sizeof(*cmd));
 
-       if (priv->power_data.pci_pm)
+       if (priv->power_data.bus_pm)
                cmd->flags |= IWL_POWER_PCI_PM_MSK;
 
        IWL_DEBUG_POWER(priv, "Sleep command for CAM\n");
@@ -305,7 +297,7 @@ static void iwl_power_fill_sleep_cmd(struct iwl_priv *priv,
        cmd->flags = IWL_POWER_DRIVER_ALLOW_SLEEP_MSK |
                     IWL_POWER_FAST_PD; /* no use seeing frames for others */
 
-       if (priv->power_data.pci_pm)
+       if (priv->power_data.bus_pm)
                cmd->flags |= IWL_POWER_PCI_PM_MSK;
 
        if (priv->cfg->base_params->shadow_reg_enable)
@@ -343,7 +335,7 @@ static int iwl_set_power(struct iwl_priv *priv, struct iwl_powertable_cmd *cmd)
                        le32_to_cpu(cmd->sleep_interval[3]),
                        le32_to_cpu(cmd->sleep_interval[4]));
 
-       return iwl_send_cmd_pdu(priv, POWER_TABLE_CMD,
+       return trans_send_cmd_pdu(priv, POWER_TABLE_CMD, CMD_SYNC,
                                sizeof(struct iwl_powertable_cmd), cmd);
 }
 
@@ -367,9 +359,15 @@ static void iwl_power_build_cmd(struct iwl_priv *priv,
                iwl_static_sleep_cmd(priv, cmd,
                                     priv->power_data.debug_sleep_level_override,
                                     dtimper);
-       else if (no_sleep_autoadjust)
-               iwl_static_sleep_cmd(priv, cmd, IWL_POWER_INDEX_1, dtimper);
-       else
+       else if (iwlagn_mod_params.no_sleep_autoadjust) {
+               if (iwlagn_mod_params.power_level > IWL_POWER_INDEX_1 &&
+                   iwlagn_mod_params.power_level <= IWL_POWER_INDEX_5)
+                       iwl_static_sleep_cmd(priv, cmd,
+                               iwlagn_mod_params.power_level, dtimper);
+               else
+                       iwl_static_sleep_cmd(priv, cmd,
+                               IWL_POWER_INDEX_1, dtimper);
+       } else
                iwl_power_fill_sleep_cmd(priv, cmd,
                                         priv->hw->conf.dynamic_ps_timeout,
                                         priv->hw->conf.max_sleep_period);
@@ -408,9 +406,9 @@ int iwl_power_set_mode(struct iwl_priv *priv, struct iwl_powertable_cmd *cmd,
                if (!(cmd->flags & IWL_POWER_DRIVER_ALLOW_SLEEP_MSK))
                        clear_bit(STATUS_POWER_PMI, &priv->status);
 
-               if (priv->cfg->ops->lib->update_chain_flags && update_chains)
-                       priv->cfg->ops->lib->update_chain_flags(priv);
-               else if (priv->cfg->ops->lib->update_chain_flags)
+               if (update_chains)
+                       iwl_update_chain_flags(priv);
+               else
                        IWL_DEBUG_POWER(priv,
                                        "Cannot update the power, chain noise "
                                        "calibration running: %d\n",
@@ -434,9 +432,7 @@ int iwl_power_update_mode(struct iwl_priv *priv, bool force)
 /* initialize to default */
 void iwl_power_initialize(struct iwl_priv *priv)
 {
-       u16 lctl = iwl_pcie_link_ctl(priv);
-
-       priv->power_data.pci_pm = !(lctl & PCI_CFG_LINK_CTRL_VAL_L0S_EN);
+       priv->power_data.bus_pm = priv->bus.ops->get_pm_support(&priv->bus);
 
        priv->power_data.debug_sleep_level_override = -1;