Commit 8bd22e7b authored by Eliad Peller's avatar Eliad Peller Committed by Emmanuel Grumbach

iwlwifi: mvm: configure protocol offloading on D0i3

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: default avatarEliad Peller <eliadx.peller@intel.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent b2492501
...@@ -1031,7 +1031,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw, ...@@ -1031,7 +1031,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
if (ret) if (ret)
goto out; goto out;
ret = iwl_mvm_send_proto_offload(mvm, vif); ret = iwl_mvm_send_proto_offload(mvm, vif, false, CMD_SYNC);
if (ret) if (ret)
goto out; goto out;
......
...@@ -906,7 +906,10 @@ iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm, struct ieee80211_vif *vif) ...@@ -906,7 +906,10 @@ iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
#endif #endif
void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta, void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta,
struct iwl_wowlan_config_cmd_v2 *cmd); 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 */ /* D0i3 */
void iwl_mvm_ref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type); void iwl_mvm_ref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type);
......
...@@ -81,7 +81,10 @@ void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta, ...@@ -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 { union {
struct iwl_proto_offload_cmd_v1 v1; 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) ...@@ -91,7 +94,7 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
} cmd = {}; } cmd = {};
struct iwl_host_cmd hcmd = { struct iwl_host_cmd hcmd = {
.id = PROT_OFFLOAD_CONFIG_CMD, .id = PROT_OFFLOAD_CONFIG_CMD,
.flags = CMD_SYNC, .flags = cmd_flags,
.data[0] = &cmd, .data[0] = &cmd,
.dataflags[0] = IWL_HCMD_DFL_DUP, .dataflags[0] = IWL_HCMD_DFL_DUP,
}; };
...@@ -204,9 +207,7 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm, struct ieee80211_vif *vif) ...@@ -204,9 +207,7 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
memcpy(common->arp_mac_addr, vif->addr, ETH_ALEN); memcpy(common->arp_mac_addr, vif->addr, ETH_ALEN);
} }
if (!enabled) if (!disable_offloading)
return 0;
common->enabled = cpu_to_le32(enabled); common->enabled = cpu_to_le32(enabled);
hcmd.len[0] = size; hcmd.len[0] = size;
......
...@@ -905,6 +905,7 @@ static void iwl_mvm_enter_d0i3_iterator(void *_data, u8 *mac, ...@@ -905,6 +905,7 @@ static void iwl_mvm_enter_d0i3_iterator(void *_data, u8 *mac,
data->disable_offloading = true; data->disable_offloading = true;
iwl_mvm_update_d0i3_power_mode(mvm, vif, true, flags); 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 * on init/association, mvm already configures POWER_TABLE_CMD
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment