Hi Johannes,

On 02/20/2013 04:01 PM, Johannes Berg wrote:
> On Mon, 2013-02-18 at 17:08 +0100, Marco Porsch wrote:
>
>> +/**
>> + * ieee80211_mps_init - register callbacks for mesh powersave mode
>> + *
>> + * @hw: the hardware
>> + * @ops: callbacks for this device
>> + *
>> + * called by driver on mesh interface add/remove
>> + */
>> +#ifdef CONFIG_MAC80211_MESH
>> +void ieee80211_mps_init(struct ieee80211_hw *hw,
>> +                    const struct ieee80211_mps_ops *ops);
>> +#else
>> +static inline void ieee80211_mps_init(struct ieee80211_hw *hw,
>> +                                  const struct ieee80211_mps_ops *ops)
>> +{ return; }
>> +#endif
>
> The "return" there is spurious. Is it really worth providing a static
> inline? It seems drivers might want to #ifdef it anyway so they don't
> have carry around the ops struct and the called functions if mesh isn't
> compiled in.

Ok, that seems reasonable. And that one function would be gone if I just 
use additional ieee80211_ops (see below).

>> +static bool mps_doze_check_sta(struct ieee80211_local *local, u64 *nexttbtt)
>> +{
>> +       struct sta_info *sta;
>> +       bool allow = true;
>> +       u64 nexttbtt_min = ULLONG_MAX;
>> +
>> +       mutex_lock(&local->sta_mtx);
>> +       list_for_each_entry(sta, &local->sta_list, list) {
>> +               if (!ieee80211_vif_is_mesh(&sta->sdata->vif) ||
>> +                   !ieee80211_sdata_running(sta->sdata) ||
>> +                   sta->plink_state != NL80211_PLINK_ESTAB) {
>> +                       continue;
>
> This is strange, why bother with the else if there's a continue?

I don't quite get this comment. The current logic is like this:

if (unrelated cases) {
        continue;
} else if (related and blocking) {
        allow = false;
        break;
} else if (related, non-blocking and new minimum) {
        min = sta->nexttbtt;
}

>> +               } else if (test_sta_flag(sta, WLAN_STA_MPS_WAIT_FOR_CAB) ||
>> +                          test_sta_flag(sta, WLAN_STA_MPSP_OWNER) ||
>> +                          test_sta_flag(sta, WLAN_STA_MPSP_RECIPIENT) ||
>> +                          !timer_pending(&sta->nexttbtt_timer) ||
>> +                          time_after(jiffies, sta->nexttbtt_jiffies)) {
>
> Are you sure jiffies are good enough? Some systems have HZ=33 or so I
> think, which makes a jiffy like 30ms.

Hm, jiffies is what I have available easily. Using the TSF would be 
obvious but may suffer from delay when obtaining it. Umm... hrtimers again?

>> +                       allow = false;
>> +                       break;
>> +               } else if (sta->nexttbtt_tsf < nexttbtt_min) {
>> +                       nexttbtt_min = sta->nexttbtt_tsf;
>> +               }
>
> ditto, why bother with else after break?
>
>> +       if (nexttbtt_min != ULLONG_MAX)
>> +               *nexttbtt = nexttbtt_min;
>
> The API of this function is very strange. Sometimes it might set it,
> sometimes it might leave it, but that's not even consistent with the
> "allow" return value ... It seems it'd be better to always set it.

Alright. Will just have to make sure to hand out zero as invalid value, 
not ULLONG_MAX.

>> +/**
>> + * ieee80211_mps_doze - trigger radio doze state after checking conditions
>> + *
>> + * @local: local interface data
>
> "interface"? hardly.

* @local: mac80211 hw info struct

>> +void ieee80211_mps_doze(struct ieee80211_local *local)
>> +{
>> +    u64 nexttbtt = 0;
>
> and get rid of the assignment here.
>
>> +
>> +void ieee80211_mps_init(struct ieee80211_hw *hw,
>> +                    const struct ieee80211_mps_ops *ops)
>> +{
>> +    struct ieee80211_local *local = hw_to_local(hw);
>> +
>> +    if (!ops)
>> +            local->mps_enabled = false;
>
> Allowing that seems pointless ... in fact, why is there this assignment
> function anyway? It seems these are pretty normal, if #ifdef MESH,
> driver callbacks?

So may I just add them to the ieee80211_ops under #ifdef? That would 
certainly make things easier. I would add a HW capability flag for MPS 
doze as well.

--Marco
_______________________________________________
ath9k-devel mailing list
ath9k-devel@lists.ath9k.org
https://lists.ath9k.org/mailman/listinfo/ath9k-devel

Reply via email to