Search Linux Wireless

Re: [RFC PATCH 2/2] mac80211: Reset dynamic ps timer in Rx path.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Feb 4, 2010 at 2:29 PM, Kalle Valo <kalle.valo@xxxxxx> wrote:
>> If there is a continuous Rx UDP traffic with power save enabled,
>> there is some loss of packets with ath9k as Atheros chipsets
>> need to be awake to do Rx, unlike other vendor chipsets.
>
> Most probably this problem is related to ath9k staying awake after
> PS-Poll frame. Maybe we need to change mac80211 disable PS (but not
> send nullfunc!) when sending PS-Poll frames. But that might break p54,
> I don't know.
>
The issue I observed is related to dynamic power save getting triggered
by mac80211 eventhough there might be a continuous Rx traffic.

>> The current mac80211 implementation enables power save if there is
>> no Tx traffic for a specific timeout. This adversely affects ath9k
>> when there is a continuous Rx UDP traffic going on since it depends
>> only on the tim bit in the next beacon to awake. Fix this by
>> restarting the dynamic ps timer on receiving every data packet.

> But received multicast frames powersave should not disable powersave,
> otherwise on a busy network we would wakeup way too often.
Yes, this has been taken care in the patch.

>>  ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
>>  {
>>       struct ieee80211_sub_if_data *sdata = rx->sdata;
>> +     struct ieee80211_local *local = rx->local;
>>       struct net_device *dev = sdata->dev;
>>       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
>>       __le16 fc = hdr->frame_control;
>> @@ -1750,6 +1751,15 @@ ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
>>       dev->stats.rx_packets++;
>>       dev->stats.rx_bytes += rx->skb->len;
>>
>> +     if ((local->hw.flags & IEEE80211_HW_NEEDS_RX_PS_RESET) &&
>> +         ieee80211_is_data(hdr->frame_control) &&
>> +         !is_multicast_ether_addr(hdr->addr1)) {
>> +             if (local->hw.conf.dynamic_ps_timeout > 0 && local->ps_sdata) {
>> +                     mod_timer(&local->dynamic_ps_timer, jiffies +
>> +                      msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout));
>> +             }
>> +     }
>
> What if CONF_PS is set? You need to take that into account here and
> disable powersave when it's enabled.

With ath9k, for a data frame(non-multicast) to reach mac80211, CONF_PS
should have been disabled. in other words,a data packet will not reach mac80211
when CONF_PS is set. Hence that check might be redundant here.

Thanks
Vivek.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux