Commit 9214ad7f authored by Johannes Berg's avatar Johannes Berg

mac80211: call driver method when restart completes

When the driver requests a restart (reconfiguration) it
gets all the normal method calls, but can't really tell
why they're happening. Call a new restart_complete op
in the driver when the restart completes, so it could
keep its own state about the restart and clear it there.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 60762cbf
...@@ -2400,6 +2400,10 @@ enum ieee80211_rate_control_changed { ...@@ -2400,6 +2400,10 @@ enum ieee80211_rate_control_changed {
* just "paused" for scanning/ROC, which is indicated by the beacon being * just "paused" for scanning/ROC, which is indicated by the beacon being
* disabled/enabled via @bss_info_changed. * disabled/enabled via @bss_info_changed.
* @stop_ap: Stop operation on the AP interface. * @stop_ap: Stop operation on the AP interface.
*
* @restart_complete: Called after a call to ieee80211_restart_hw(), when the
* reconfiguration has completed. This can help the driver implement the
* reconfiguration step. This callback may sleep.
*/ */
struct ieee80211_ops { struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw, void (*tx)(struct ieee80211_hw *hw,
...@@ -2561,6 +2565,8 @@ struct ieee80211_ops { ...@@ -2561,6 +2565,8 @@ struct ieee80211_ops {
void (*unassign_vif_chanctx)(struct ieee80211_hw *hw, void (*unassign_vif_chanctx)(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_chanctx_conf *ctx); struct ieee80211_chanctx_conf *ctx);
void (*restart_complete)(struct ieee80211_hw *hw);
}; };
/** /**
......
...@@ -961,4 +961,14 @@ static inline void drv_stop_ap(struct ieee80211_local *local, ...@@ -961,4 +961,14 @@ static inline void drv_stop_ap(struct ieee80211_local *local,
trace_drv_return_void(local); trace_drv_return_void(local);
} }
static inline void drv_restart_complete(struct ieee80211_local *local)
{
might_sleep();
trace_drv_restart_complete(local);
if (local->ops->restart_complete)
local->ops->restart_complete(&local->hw);
trace_drv_return_void(local);
}
#endif /* __MAC80211_DRIVER_OPS */ #endif /* __MAC80211_DRIVER_OPS */
...@@ -1411,6 +1411,11 @@ DEFINE_EVENT(local_sdata_evt, drv_stop_ap, ...@@ -1411,6 +1411,11 @@ DEFINE_EVENT(local_sdata_evt, drv_stop_ap,
TP_ARGS(local, sdata) TP_ARGS(local, sdata)
); );
DEFINE_EVENT(local_only_evt, drv_restart_complete,
TP_PROTO(struct ieee80211_local *local),
TP_ARGS(local)
);
/* /*
* Tracing for API calls that drivers call. * Tracing for API calls that drivers call.
*/ */
......
...@@ -1599,8 +1599,10 @@ int ieee80211_reconfig(struct ieee80211_local *local) ...@@ -1599,8 +1599,10 @@ int ieee80211_reconfig(struct ieee80211_local *local)
* If this is for hw restart things are still running. * If this is for hw restart things are still running.
* We may want to change that later, however. * We may want to change that later, however.
*/ */
if (!local->suspended) if (!local->suspended) {
drv_restart_complete(local);
return 0; return 0;
}
#ifdef CONFIG_PM #ifdef CONFIG_PM
/* first set suspended false, then resuming */ /* first set suspended false, then resuming */
......
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