On Wed, 2013-02-06 at 12:48 +0100, Marco Porsch wrote:
> For mesh Awake Windows wakeup on SWBA (beacon_get_tim) and start
> a timer which triggers a doze call on expiry.
That seems questionable -- drivers are not required to request each
beacon. I know you only want to make it work on ath9k, but I don't think
"stretching" the API, without even documenting it, is a good idea.
> +static inline void mps_queue_work(struct ieee80211_sub_if_data *sdata,
> + enum mesh_deferred_task_flags flag)
> +{
> + set_bit(flag, &sdata->u.mesh.wrkq_flags);
> + ieee80211_queue_work(&sdata->local->hw, &sdata->work);
> +}
Doing any sort of wakeup from here is also undesirable -- the workqueue
might actually sometimes be blocked for quite a while, I believe.
> +/**
> + * ieee80211_mps_hw_conf - check conditions for mesh PS and configure driver
> + *
> + * @sdata: local mesh subif
> + */
> +void ieee80211_mps_hw_conf(struct ieee80211_sub_if_data *sdata)
> +{
> + struct ieee80211_local *local = sdata->local;
> + bool enable;
> +
> + enable = mps_hw_conf_check(local);
> +
> + if (local->mps_enabled == enable)
> + return;
> +
> + if (enable) {
> + mps_hw_conf_sta_prepare(local);
> + local->hw.conf.flags |= IEEE80211_CONF_PS;
> + } else {
> + local->hw.conf.flags &= ~IEEE80211_CONF_PS;
> + }
> +
> + ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
For some reason I thought this was supposed to be covered by the new
mesh PS callbacks, why do you still need hw conf?
Or wait -- this is only for general enable/disable, depending on the
other interfaces? I guess that's ok.
> + /* simple Deep Sleep implementation: only wake up for DTIM beacons */
> + if (sta->local_pm == NL80211_MESH_POWER_DEEP_SLEEP)
> + skip = tim->dtim_count ? tim->dtim_count : tim->dtim_period;
> + /*
> + * determine time to peer TBTT (TSF % beacon_interval = 0).
> + * This approach is robust to delayed beacons.
> + */
> + tsf_peer = tsf_local + sta->t_offset;
> + nexttbtt_interval = sta->beacon_interval * skip -
> + do_div(tsf_peer, sta->beacon_interval * skip);
> +
> + mps_dbg(sta->sdata, "updating %pM next TBTT in %dus (%lldus awake)\n",
> + sta->sta.addr, nexttbtt_interval,
> + (long long) tsf_local - sta->nexttbtt_tsf);
> +
> + sta->nexttbtt_tsf = tsf_local + nexttbtt_interval;
> + sta->nexttbtt_jiffies = jiffies + usecs_to_jiffies(nexttbtt_interval);
> +
> + mod_timer(&sta->nexttbtt_timer, sta->nexttbtt_jiffies +
> + usecs_to_jiffies(BEACON_TIMEOUT));
Is that some sort of recovery? jiffies can be up to 20ms (I think, in
that order of magnitude anyway) inaccurate.
johannes
_______________________________________________
Devel mailing list
[email protected]
http://lists.open80211s.org/cgi-bin/mailman/listinfo/devel