iwlwifi: mvm: downgrade to old power management API
authorAlexander Bondar <alexander.bondar@intel.com>
Sun, 3 Feb 2013 19:26:44 +0000 (21:26 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 3 Apr 2013 20:49:13 +0000 (22:49 +0200)
Current available FW still doesn't support new PM API.
Therefore, to enable basic power management with the
existing firmware, change the API in the driver back
to the API used in the current firmware.

Signed-off-by: Alexander Bondar <alexander.bondar@intel.com>
Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
drivers/net/wireless/iwlwifi/mvm/power.c

index 127051891e9b7e19a06c56eb09c76612ea72b594..f77d823cbad09d14dd1cee269887d23b44b1bffb 100644 (file)
 
 /**
  * enum iwl_scan_flags - masks for power table command flags
+ * @POWER_FLAGS_POWER_SAVE_ENA_MSK: '1' Allow to save power by turning off
+ *             receiver and transmitter. '0' - does not allow.
  * @POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK: '0' Driver disables power management,
  *             '1' Driver enables PM (use rest of parameters)
  * @POWER_FLAGS_SLEEP_OVER_DTIM_MSK: '0' PM have to walk up every DTIM,
  *             '1' PM could sleep over DTIM till listen Interval.
- * @POWER_FLAGS_LPRX_ENA_MSK: Low Power RX enable.
- * @POWER_FLAGS_SNOOZE_ENA_MSK: Enable snoozing only if uAPSD is enabled and all
- *             access categories are both delivery and trigger enabled.
- * @POWER_FLAGS_BT_SCO_ENA: Enable BT SCO coex only if uAPSD and
- *             PBW Snoozing enabled
  * @POWER_FLAGS_ADVANCE_PM_ENA_MSK: Advanced PM (uAPSD) enable mask
+ * @POWER_FLAGS_LPRX_ENA_MSK: Low Power RX enable.
 */
 enum iwl_power_flags {
-       POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK    = BIT(0),
-       POWER_FLAGS_SLEEP_OVER_DTIM_MSK         = BIT(1),
-       POWER_FLAGS_LPRX_ENA_MSK                = BIT(2),
-       POWER_FLAGS_SNOOZE_ENA_MSK              = BIT(3),
-       POWER_FLAGS_BT_SCO_ENA                  = BIT(4),
-       POWER_FLAGS_ADVANCE_PM_ENA_MSK          = BIT(5)
+       POWER_FLAGS_POWER_SAVE_ENA_MSK          = BIT(0),
+       POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK    = BIT(1),
+       POWER_FLAGS_SLEEP_OVER_DTIM_MSK         = BIT(2),
+       POWER_FLAGS_ADVANCE_PM_ENA_MSK          = BIT(9),
+       POWER_FLAGS_LPRX_ENA_MSK                = BIT(11),
 };
 
+#define IWL_POWER_VEC_SIZE 5
+
 /**
  * struct iwl_powertable_cmd - Power Table Command
  * POWER_TABLE_CMD = 0x77 (command, has simple generic response)
  *
- * @id_and_color:      MAC contex identifier
- * @action:            Action on context - no action, add new,
- *                     modify existent, remove
  * @flags:             Power table command flags from POWER_FLAGS_*
  * @keep_alive_seconds: Keep alive period in seconds. Default - 25 sec.
  *                     Minimum allowed:- 3 * DTIM
@@ -102,39 +98,21 @@ enum iwl_power_flags {
  *                     PSM transition - legacy PM
  * @tx_data_timeout:    Minimum time (usec) from last Tx packet for AM to
  *                     PSM transition - legacy PM
- * @rx_data_timeout_uapsd: Minimum time (usec) from last Rx packet for AM to
- *                     PSM transition - uAPSD
- * @tx_data_timeout_uapsd: Minimum time (usec) from last Tx packet for AM to
- *                     PSM transition - uAPSD
+ * @sleep_interval:    not in use
+ * @keep_alive_beacons:        not in use
  * @lprx_rssi_threshold: Signal strength up to which LP RX can be enabled.
  *                     Default: 80dbm
- * @num_skip_dtim:      Number of DTIMs to skip if Skip over DTIM flag is set
- * @snooze_interval:    TBD
- * @snooze_window:      TBD
- * @snooze_step:        TBD
- * @qndp_tid:           TBD
- * @uapsd_ac_flags:     TBD
- * @uapsd_max_sp:       TBD
  */
 struct iwl_powertable_cmd {
-       /* COMMON_INDEX_HDR_API_S_VER_1 */
-       __le32 id_and_color;
-       __le32 action;
+       /* PM_POWER_TABLE_CMD_API_S_VER_5 */
        __le16 flags;
-       u8 reserved;
-       __le16 keep_alive_seconds;
+       u8 keep_alive_seconds;
+       u8 debug_flags;
        __le32 rx_data_timeout;
        __le32 tx_data_timeout;
-       __le32 rx_data_timeout_uapsd;
-       __le32 tx_data_timeout_uapsd;
-       u8 lprx_rssi_threshold;
-       u8 num_skip_dtim;
-       __le16 snooze_interval;
-       __le16 snooze_window;
-       u8 snooze_step;
-       u8 qndp_tid;
-       u8 uapsd_ac_flags;
-       u8 uapsd_max_sp;
+       __le32 sleep_interval[IWL_POWER_VEC_SIZE];
+       __le32 keep_alive_beacons;
+       __le32 lprx_rssi_threshold;
 } __packed;
 
 #endif
index efb9a6f3faac1448d6004fe7d3d4feecc8fcd74a..55eee6e505d205dc60c3071ccff6fb10439ade7b 100644 (file)
@@ -79,22 +79,18 @@ static void iwl_power_build_cmd(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                                struct iwl_powertable_cmd *cmd)
 {
        struct ieee80211_hw *hw = mvm->hw;
-       struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
        struct ieee80211_chanctx_conf *chanctx_conf;
        struct ieee80211_channel *chan;
        int dtimper, dtimper_msec;
        int keep_alive;
        bool radar_detect = false;
 
-       cmd->id_and_color = cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id,
-                                                           mvmvif->color));
-       cmd->action = cpu_to_le32(FW_CTXT_ACTION_MODIFY);
-
        if ((!vif->bss_conf.ps) ||
            (iwlmvm_mod_params.power_scheme == IWL_POWER_SCHEME_CAM))
                return;
 
-       cmd->flags |= cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK);
+       cmd->flags |= cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK |
+                                 POWER_FLAGS_POWER_SAVE_ENA_MSK);
 
        dtimper = hw->conf.ps_dtim_period ?: 1;
 
@@ -110,10 +106,8 @@ static void iwl_power_build_cmd(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
 
        /* Check skip over DTIM conditions */
        if (!radar_detect && (dtimper <= 10) &&
-           (iwlmvm_mod_params.power_scheme == IWL_POWER_SCHEME_LP)) {
+           (iwlmvm_mod_params.power_scheme == IWL_POWER_SCHEME_LP))
                cmd->flags |= cpu_to_le16(POWER_FLAGS_SLEEP_OVER_DTIM_MSK);
-               cmd->num_skip_dtim = 2;
-       }
 
        /* Check that keep alive period is at least 3 * DTIM */
        dtimper_msec = dtimper * vif->bss_conf.beacon_int;
@@ -121,7 +115,7 @@ static void iwl_power_build_cmd(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                           MSEC_PER_SEC * POWER_KEEP_ALIVE_PERIOD_SEC);
        keep_alive = DIV_ROUND_UP(keep_alive, MSEC_PER_SEC);
 
-       cmd->keep_alive_seconds = cpu_to_le16(keep_alive);
+       cmd->keep_alive_seconds = keep_alive;
 
        if (iwlmvm_mod_params.power_scheme == IWL_POWER_SCHEME_LP) {
                /* TODO: Also for D3 (device sleep / WoWLAN) */
@@ -148,24 +142,18 @@ int iwl_mvm_power_update_mode(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
        iwl_power_build_cmd(mvm, vif, &cmd);
 
        IWL_DEBUG_POWER(mvm,
-                       "Sending power table command on mac id 0x%X for power level %d, flags = 0x%X\n",
-                       cmd.id_and_color, iwlmvm_mod_params.power_scheme,
-                       le16_to_cpu(cmd.flags));
+                       "Sending power table command for power level %d, flags = 0x%X\n",
+                       iwlmvm_mod_params.power_scheme, le16_to_cpu(cmd.flags));
 
        if (cmd.flags & cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK)) {
                IWL_DEBUG_POWER(mvm, "Keep alive = %u sec\n",
-                               le16_to_cpu(cmd.keep_alive_seconds));
+                               cmd.keep_alive_seconds);
                IWL_DEBUG_POWER(mvm, "Rx timeout = %u usec\n",
                                le32_to_cpu(cmd.rx_data_timeout));
                IWL_DEBUG_POWER(mvm, "Tx timeout = %u usec\n",
                                le32_to_cpu(cmd.tx_data_timeout));
-               IWL_DEBUG_POWER(mvm, "Rx timeout (uAPSD) = %u usec\n",
-                               le32_to_cpu(cmd.rx_data_timeout_uapsd));
-               IWL_DEBUG_POWER(mvm, "Tx timeout = %u usec\n",
-                               le32_to_cpu(cmd.tx_data_timeout_uapsd));
                IWL_DEBUG_POWER(mvm, "LP RX RSSI threshold = %u\n",
                                cmd.lprx_rssi_threshold);
-               IWL_DEBUG_POWER(mvm, "DTIMs to skip = %u\n", cmd.num_skip_dtim);
        }
 
        return iwl_mvm_send_cmd_pdu(mvm, POWER_TABLE_CMD, CMD_SYNC,
@@ -175,7 +163,6 @@ int iwl_mvm_power_update_mode(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
 int iwl_mvm_power_disable(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
 {
        struct iwl_powertable_cmd cmd = {};
-       struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
 
        if (!iwlwifi_mod_params.power_save) {
                IWL_DEBUG_POWER(mvm, "Power management is not allowed\n");
@@ -185,14 +172,9 @@ int iwl_mvm_power_disable(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
        if (vif->type != NL80211_IFTYPE_STATION || vif->p2p)
                return 0;
 
-       cmd.id_and_color = cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id,
-                                                           mvmvif->color));
-       cmd.action = cpu_to_le32(FW_CTXT_ACTION_MODIFY);
-
        IWL_DEBUG_POWER(mvm,
-                       "Sending power table command on mac id 0x%X for power level %d, flags = 0x%X\n",
-                       cmd.id_and_color, iwlmvm_mod_params.power_scheme,
-                       le16_to_cpu(cmd.flags));
+                       "Sending power table command power level %d, flags = 0x%X\n",
+                       iwlmvm_mod_params.power_scheme, le16_to_cpu(cmd.flags));
 
        return iwl_mvm_send_cmd_pdu(mvm, POWER_TABLE_CMD, CMD_ASYNC,
                                    sizeof(cmd), &cmd);