iwlwifi: mvm: don't disable power management due to P2P device
authorAlexander Bondar <alexander.bondar@intel.com>
Tue, 5 Mar 2013 08:16:40 +0000 (10:16 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 3 Apr 2013 20:49:14 +0000 (22:49 +0200)
Currently power management is supported only when only a single
virtual interface is present. The driver verifies number of created
interfaces and disables power management when multiple interfaces
present. However, this rule does not extend to a P2P device that is
handled differently in the firmware. If a P2P device is added power
management can remain enabled.

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/mac80211.c
drivers/net/wireless/iwlwifi/mvm/mvm.h

index 9baa3d53ffee40f80c8418146adeb98be894147f..c0043fca836d7e666db40112db2c5c4f7a8db355 100644 (file)
@@ -502,11 +502,15 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
        /*
         * TODO: remove this temporary code.
         * Currently MVM FW supports power management only on single MAC.
-        * Iterate and disable PM on all active interfaces.
+        * If new interface added, disable PM on existing interface.
+        * P2P device is a special case, since it is handled by FW similary to
+        * scan. If P2P deviced is added, PM remains enabled on existing
+        * interface.
         * Note: the method below does not count the new interface being added
         * at this moment.
         */
-       mvm->vif_count++;
+       if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
+               mvm->vif_count++;
        if (mvm->vif_count > 1) {
                IWL_DEBUG_MAC80211(mvm,
                                   "Disable power on existing interfaces\n");
@@ -576,10 +580,11 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
        /*
         * TODO: remove this temporary code.
         * Currently MVM FW supports power management only on single MAC.
-        * Check if only one additional interface remains after rereasing
+        * Check if only one additional interface remains after releasing
         * current one. Update power mode on the remaining interface.
         */
-       mvm->vif_count--;
+       if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
+               mvm->vif_count--;
        IWL_DEBUG_MAC80211(mvm, "Currently %d interfaces active\n",
                           mvm->vif_count);
        if (mvm->vif_count == 1) {
@@ -666,7 +671,7 @@ static void iwl_mvm_mac_remove_interface(struct ieee80211_hw *hw,
         * Check if only one additional interface remains after removing
         * current one. Update power mode on the remaining interface.
         */
-       if (mvm->vif_count)
+       if (mvm->vif_count && vif->type != NL80211_IFTYPE_P2P_DEVICE)
                mvm->vif_count--;
        IWL_DEBUG_MAC80211(mvm, "Currently %d interfaces active\n",
                           mvm->vif_count);
index e4bf0b59cebbe583cc520c1cc2aee324f444c252..9b5318e8cacdb02444173375c2b2b9924c3b4cdf 100644 (file)
@@ -322,6 +322,13 @@ struct iwl_mvm {
         * can hold 16 keys at most. Reflect this fact.
         */
        unsigned long fw_key_table[BITS_TO_LONGS(STA_KEY_MAX_NUM)];
+
+       /*
+        * This counter of created interfaces is referenced only in conjunction
+        * with FW limitation related to power management. Currently PM is
+        * supported only on a single interface.
+        * IMPORTANT: this variable counts all interfaces except P2P device.
+        */
        u8 vif_count;
 
        struct led_classdev led;