Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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);
};

/**
+10 −0
Original line number Diff line number Diff line
@@ -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 */
+5 −0
Original line number Diff line number Diff line
@@ -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.
 */
+3 −1
Original line number Diff line number Diff line
@@ -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 */