iwlwifi: mvm: configure protocol offloading on D0i3
authorEliad Peller <eliad@wizery.com>
Sun, 3 Nov 2013 17:48:50 +0000 (19:48 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Sun, 16 Mar 2014 11:45:33 +0000 (13:45 +0200)
Enable protocol offloading (arp and NS) on D0i3.

The offloading allows the fw answer NS and arp requests
without waking up the host.

Since protocol offloading is saved between D0i3
entries, we have to explicitly disable it in
case we don't want it.

Signed-off-by: Eliad Peller <eliadx.peller@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/mvm/d3.c
drivers/net/wireless/iwlwifi/mvm/mvm.h
drivers/net/wireless/iwlwifi/mvm/offloading.c
drivers/net/wireless/iwlwifi/mvm/ops.c

index 02fb950c031c17cd34601ac5a09486e1a018ea4a..e56f5a0edf855331a1411e76406a143176b5e9d5 100644 (file)
@@ -1031,7 +1031,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
        if (ret)
                goto out;
 
-       ret = iwl_mvm_send_proto_offload(mvm, vif);
+       ret = iwl_mvm_send_proto_offload(mvm, vif, false, CMD_SYNC);
        if (ret)
                goto out;
 
index d4f3c95a129e500980675bc03a332396e558a259..46fe817029631c6fc19b28d7402b3f4e6854c832 100644 (file)
@@ -906,7 +906,10 @@ iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
 #endif
 void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta,
                                struct iwl_wowlan_config_cmd_v2 *cmd);
-int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
+int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
+                              struct ieee80211_vif *vif,
+                              bool disable_offloading,
+                              u32 cmd_flags);
 
 /* D0i3 */
 void iwl_mvm_ref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type);
index 9ec5a5991e3a65ae3e118a0a1416f6f046713b1e..9bfb95e89cfbbdab1b446c55d5423a795eb87e03 100644 (file)
@@ -81,7 +81,10 @@ void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta,
        }
 }
 
-int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
+int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
+                              struct ieee80211_vif *vif,
+                              bool disable_offloading,
+                              u32 cmd_flags)
 {
        union {
                struct iwl_proto_offload_cmd_v1 v1;
@@ -91,7 +94,7 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
        } cmd = {};
        struct iwl_host_cmd hcmd = {
                .id = PROT_OFFLOAD_CONFIG_CMD,
-               .flags = CMD_SYNC,
+               .flags = cmd_flags,
                .data[0] = &cmd,
                .dataflags[0] = IWL_HCMD_DFL_DUP,
        };
@@ -204,10 +207,8 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
                memcpy(common->arp_mac_addr, vif->addr, ETH_ALEN);
        }
 
-       if (!enabled)
-               return 0;
-
-       common->enabled = cpu_to_le32(enabled);
+       if (!disable_offloading)
+               common->enabled = cpu_to_le32(enabled);
 
        hcmd.len[0] = size;
        return iwl_mvm_send_cmd(mvm, &hcmd);
index a3e21f1ee315f77b717c3a282cd4f6cedc91b96d..10846b648d70beeb60d10b157b920f0b49b98c17 100644 (file)
@@ -905,6 +905,7 @@ static void iwl_mvm_enter_d0i3_iterator(void *_data, u8 *mac,
                data->disable_offloading = true;
 
        iwl_mvm_update_d0i3_power_mode(mvm, vif, true, flags);
+       iwl_mvm_send_proto_offload(mvm, vif, data->disable_offloading, flags);
 
        /*
         * on init/association, mvm already configures POWER_TABLE_CMD