mac80211: call driver method when restart completes
authorJohannes Berg <johannes.berg@intel.com>
Tue, 6 Nov 2012 18:18:13 +0000 (19:18 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 9 Nov 2012 16:34:35 +0000 (17:34 +0100)
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: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/driver-ops.h
net/mac80211/trace.h
net/mac80211/util.c

index 23803addca3ccd488b1bd22f328b5e16391c588f..e1d830992319df8bc72b160669db4f8c3283f1b7 100644 (file)
@@ -2400,6 +2400,10 @@ enum ieee80211_rate_control_changed {
  *     just "paused" for scanning/ROC, which is indicated by the beacon being
  *     disabled/enabled via @bss_info_changed.
  * @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 {
        void (*tx)(struct ieee80211_hw *hw,
@@ -2561,6 +2565,8 @@ struct ieee80211_ops {
        void (*unassign_vif_chanctx)(struct ieee80211_hw *hw,
                                     struct ieee80211_vif *vif,
                                     struct ieee80211_chanctx_conf *ctx);
+
+       void (*restart_complete)(struct ieee80211_hw *hw);
 };
 
 /**
index 1701ad7013a442e0fb717a4c88200bb9309caa77..4dc2577886ff0b5b2ac2973eab28cd6781d4879a 100644 (file)
@@ -961,4 +961,14 @@ static inline void drv_stop_ap(struct ieee80211_local *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 */
index 06a69ebcaede884b811028692cb1c1b2aed20910..758836c85a8010e8eeae237ccab5e1b44197eeda 100644 (file)
@@ -1411,6 +1411,11 @@ DEFINE_EVENT(local_sdata_evt, drv_stop_ap,
        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.
  */
index 1a511afbdf074fc799db08e59ce284aabe1050f8..84858a14c8bf8e068b1494dd80d407f3389a3122 100644 (file)
@@ -1599,8 +1599,10 @@ int ieee80211_reconfig(struct ieee80211_local *local)
         * If this is for hw restart things are still running.
         * We may want to change that later, however.
         */
-       if (!local->suspended)
+       if (!local->suspended) {
+               drv_restart_complete(local);
                return 0;
+       }
 
 #ifdef CONFIG_PM
        /* first set suspended false, then resuming */