提交 305d236e 编写于 作者: E Eliad Peller 提交者: Emmanuel Grumbach

iwlwifi: mvm: cleanup roc te on restart cleanup

iwl_mvm_restart_cleanup() calls ieee80211_remain_on_channel_expired()
on cleanup, but it doesn't clean the actual roc time
events, resulting in failure of further ROC attempts.

Refactor iwl_mvm_stop_roc() a bit, and add a new function
to only cleanup the roc time events (without sending further
commands).
Signed-off-by: NEliad Peller <eliadx.peller@intel.com>
Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
上级 95a451c5
...@@ -967,6 +967,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm) ...@@ -967,6 +967,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
mvm->calibrating = false; mvm->calibrating = false;
/* just in case one was running */ /* just in case one was running */
iwl_mvm_cleanup_roc_te(mvm);
ieee80211_remain_on_channel_expired(mvm->hw); ieee80211_remain_on_channel_expired(mvm->hw);
/* /*
......
...@@ -792,11 +792,9 @@ int iwl_mvm_start_p2p_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif, ...@@ -792,11 +792,9 @@ int iwl_mvm_start_p2p_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
return iwl_mvm_time_event_send_add(mvm, vif, te_data, &time_cmd); return iwl_mvm_time_event_send_add(mvm, vif, te_data, &time_cmd);
} }
void iwl_mvm_stop_roc(struct iwl_mvm *mvm) static struct iwl_mvm_time_event_data *iwl_mvm_get_roc_te(struct iwl_mvm *mvm)
{ {
struct iwl_mvm_vif *mvmvif = NULL;
struct iwl_mvm_time_event_data *te_data; struct iwl_mvm_time_event_data *te_data;
bool is_p2p = false;
lockdep_assert_held(&mvm->mutex); lockdep_assert_held(&mvm->mutex);
...@@ -810,11 +808,8 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm) ...@@ -810,11 +808,8 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm)
* request * request
*/ */
list_for_each_entry(te_data, &mvm->time_event_list, list) { list_for_each_entry(te_data, &mvm->time_event_list, list) {
if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE) { if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE)
mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif); goto out;
is_p2p = true;
goto remove_te;
}
} }
/* There can only be at most one AUX ROC time event, we just use the /* There can only be at most one AUX ROC time event, we just use the
...@@ -823,18 +818,35 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm) ...@@ -823,18 +818,35 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm)
te_data = list_first_entry_or_null(&mvm->aux_roc_te_list, te_data = list_first_entry_or_null(&mvm->aux_roc_te_list,
struct iwl_mvm_time_event_data, struct iwl_mvm_time_event_data,
list); list);
out:
spin_unlock_bh(&mvm->time_event_lock);
return te_data;
}
void iwl_mvm_cleanup_roc_te(struct iwl_mvm *mvm)
{
struct iwl_mvm_time_event_data *te_data;
u32 uid;
te_data = iwl_mvm_get_roc_te(mvm);
if (te_data) if (te_data)
mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif); __iwl_mvm_remove_time_event(mvm, te_data, &uid);
}
remove_te: void iwl_mvm_stop_roc(struct iwl_mvm *mvm)
spin_unlock_bh(&mvm->time_event_lock); {
struct iwl_mvm_vif *mvmvif;
struct iwl_mvm_time_event_data *te_data;
if (!mvmvif) { te_data = iwl_mvm_get_roc_te(mvm);
if (!te_data) {
IWL_WARN(mvm, "No remain on channel event\n"); IWL_WARN(mvm, "No remain on channel event\n");
return; return;
} }
if (is_p2p) mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif);
if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE)
iwl_mvm_remove_time_event(mvm, mvmvif, te_data); iwl_mvm_remove_time_event(mvm, mvmvif, te_data);
else else
iwl_mvm_remove_aux_roc_te(mvm, mvmvif, te_data); iwl_mvm_remove_aux_roc_te(mvm, mvmvif, te_data);
......
...@@ -215,6 +215,7 @@ void iwl_mvm_remove_time_event(struct iwl_mvm *mvm, ...@@ -215,6 +215,7 @@ void iwl_mvm_remove_time_event(struct iwl_mvm *mvm,
void iwl_mvm_te_clear_data(struct iwl_mvm *mvm, void iwl_mvm_te_clear_data(struct iwl_mvm *mvm,
struct iwl_mvm_time_event_data *te_data); struct iwl_mvm_time_event_data *te_data);
void iwl_mvm_cleanup_roc_te(struct iwl_mvm *mvm);
void iwl_mvm_roc_done_wk(struct work_struct *wk); void iwl_mvm_roc_done_wk(struct work_struct *wk);
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册