2008-10-13 19:06:11

by Luis R. Rodriguez

[permalink] [raw]
Subject: Re: [Bug 11749] Ath5k driver has too many interrupts per second at idle

On Mon, Oct 13, 2008 at 8:05 AM, <[email protected]> wrote:
> http://bugzilla.kernel.org/show_bug.cgi?id=11749

---
Bug description from kernel.org bugzilla

Latest working kernel version: None
Earliest failing kernel version: Unknow
Distribution: all
Hardware Environment: Atheros wireless chipset
Software Environment: Fedora
Problem Description: ath5k driver has many inperrupts per second although the
system is idle.

I used AspierOne to test it, interrupts are so many that CPU's C3 residence
time is only 20 milliseconds or less, there isn't any valid traffic on my
wireless network except beacon frame.

I tested X61 in the same wireless environment, number of interrupt is only 1
per second, X61 has the latest Intel wireless chipset and 2.6.27 kernel was
running.

So i think ath5k and ath9k should can do as Intel wireless driver does,
otherwise, CPU can't stay at C3 with longer time because of wireless
interrupts.

Steps to reproduce:
1. Enable wireless on platform with Atheros wireless chipset.
2. watch cat /proc/interrupts

---

Folks, ANI is not handled yet in ath5k (and won't be on 2.6.26). What
I recommend is to try disabling MIB interrupts on the stable kernels
where you won't make use of MIB statistics, which you need for ANI.
Once you have ANI please enable the MIB interrupt.

yang.y.yi, please try this patch (also attached for your convenience)
and let us know if you see a difference.

Luis

diff --git a/drivers/net/wireless/ath5k/base.c
b/drivers/net/wireless/ath5k/base.c
index 0676c6d..c18ead9 100644
--- a/drivers/net/wireless/ath5k/base.c
+++ b/drivers/net/wireless/ath5k/base.c
@@ -2246,8 +2246,7 @@ ath5k_init(struct ath5k_softc *sc)
* Enable interrupts.
*/
sc->imask = AR5K_INT_RX | AR5K_INT_TX | AR5K_INT_RXEOL |
- AR5K_INT_RXORN | AR5K_INT_FATAL | AR5K_INT_GLOBAL |
- AR5K_INT_MIB;
+ AR5K_INT_RXORN | AR5K_INT_FATAL | AR5K_INT_GLOBAL;

ath5k_hw_set_intr(sc->ah, sc->imask);
/* Set ack to be sent at low bit-rates */


Attachments:
(No filename) (2.01 kB)
ath5k-disable-mib.patch (551.00 B)
Download all attachments

2008-10-13 19:14:58

by Nick Kossifidis

[permalink] [raw]
Subject: Re: [ath5k-devel] [Bug 11749] Ath5k driver has too many interrupts per second at idle

2008/10/13 Luis R. Rodriguez <[email protected]>:
> On Mon, Oct 13, 2008 at 8:05 AM, <[email protected]> wrote:
>> http://bugzilla.kernel.org/show_bug.cgi?id=11749
>
> ---
> Bug description from kernel.org bugzilla
>
> Latest working kernel version: None
> Earliest failing kernel version: Unknow
> Distribution: all
> Hardware Environment: Atheros wireless chipset
> Software Environment: Fedora
> Problem Description: ath5k driver has many inperrupts per second although the
> system is idle.
>
> I used AspierOne to test it, interrupts are so many that CPU's C3 residence
> time is only 20 milliseconds or less, there isn't any valid traffic on my
> wireless network except beacon frame.
>
> I tested X61 in the same wireless environment, number of interrupt is only 1
> per second, X61 has the latest Intel wireless chipset and 2.6.27 kernel was
> running.
>
> So i think ath5k and ath9k should can do as Intel wireless driver does,
> otherwise, CPU can't stay at C3 with longer time because of wireless
> interrupts.
>
> Steps to reproduce:
> 1. Enable wireless on platform with Atheros wireless chipset.
> 2. watch cat /proc/interrupts
>
> ---
>
> Folks, ANI is not handled yet in ath5k (and won't be on 2.6.26). What
> I recommend is to try disabling MIB interrupts on the stable kernels
> where you won't make use of MIB statistics, which you need for ANI.
> Once you have ANI please enable the MIB interrupt.
>
> yang.y.yi, please try this patch (also attached for your convenience)
> and let us know if you see a difference.
>
> Luis
>
> diff --git a/drivers/net/wireless/ath5k/base.c
> b/drivers/net/wireless/ath5k/base.c
> index 0676c6d..c18ead9 100644
> --- a/drivers/net/wireless/ath5k/base.c
> +++ b/drivers/net/wireless/ath5k/base.c
> @@ -2246,8 +2246,7 @@ ath5k_init(struct ath5k_softc *sc)
> * Enable interrupts.
> */
> sc->imask = AR5K_INT_RX | AR5K_INT_TX | AR5K_INT_RXEOL |
> - AR5K_INT_RXORN | AR5K_INT_FATAL | AR5K_INT_GLOBAL |
> - AR5K_INT_MIB;
> + AR5K_INT_RXORN | AR5K_INT_FATAL | AR5K_INT_GLOBAL;
>
> ath5k_hw_set_intr(sc->ah, sc->imask);
> /* Set ack to be sent at low bit-rates */
>

Acked-by: Nick Kossifidis <[email protected]>

--
GPG ID: 0xD21DB2DB
As you read this post global entropy rises. Have Fun ;-)
Nick

2008-11-20 03:13:24

by Xu, Martin

[permalink] [raw]
Subject: RE: [ath5k-devel] [Bug 11749] Ath5k driver has too many interrupts per second at idle

Hi Bob:
Please review below patch thanks.

From: Martin Xu <[email protected]>
Subject: disable beacon filter when station is not associated with any AP.

Ath5k driver has too many interrupts per second at idle
http://bugzilla.kernel.org/show_bug.cgi?id=11749

Signed-off-by: Martin Xu <[email protected]>

diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
index 34cd1a4..37da7cc 100644
--- a/drivers/net/wireless/ath5k/base.c
+++ b/drivers/net/wireless/ath5k/base.c
@@ -241,6 +241,10 @@ static int ath5k_get_tx_stats(struct ieee80211_hw *hw,
static u64 ath5k_get_tsf(struct ieee80211_hw *hw);
static void ath5k_reset_tsf(struct ieee80211_hw *hw);
static int ath5k_beacon_update(struct ath5k_softc *sc, struct sk_buff *skb);
+static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif,
+ struct ieee80211_bss_conf *bss_conf,
+ u32 changes);

static struct ieee80211_ops ath5k_hw_ops = {
.tx = ath5k_tx,
@@ -2952,7 +2956,7 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
sc->opmode != NL80211_IFTYPE_MESH_POINT &&
test_bit(ATH_STAT_PROMISC, sc->status))
rfilt |= AR5K_RX_FILTER_PROM;
- if (sc->opmode == NL80211_IFTYPE_STATION ||
+ if ((sc->opmode == NL80211_IFTYPE_STATION && sc->assoc) ||
sc->opmode == NL80211_IFTYPE_ADHOC ||
sc->opmode == NL80211_IFTYPE_AP)
rfilt |= AR5K_RX_FILTER_BEACON;
@@ -3092,4 +3096,32 @@ ath5k_beacon_update(struct ath5k_softc *sc, struct sk_buff *skb)

return ret;
}
+static void
+set_beacon_filter(struct ieee80211_hw *hw, bool enable)
+{
+ struct ath5k_softc *sc = hw->priv;
+ struct ath5k_hw *ah = sc->ah;
+ u32 rfilt;
+ rfilt = ath5k_hw_get_rx_filter(ah);
+ if (enable)
+ rfilt |= AR5K_RX_FILTER_BEACON;
+ else
+ rfilt &= ~AR5K_RX_FILTER_BEACON;
+ ath5k_hw_set_rx_filter(ah, rfilt);
+ sc->filter_flags = rfilt;
+}

+static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif,
+ struct ieee80211_bss_conf *bss_conf,
+ u32 changes)
+{
+ struct ath5k_softc *sc = hw->priv;
+ if (changes & BSS_CHANGED_ASSOC) {
+ mutex_lock(&sc->lock);
+ sc->assoc = bss_conf->assoc;
+ if (sc->opmode == NL80211_IFTYPE_STATION)
+ set_beacon_filter(hw, sc->assoc);
+ mutex_unlock(&sc->lock);
+ }
+}
diff --git a/drivers/net/wireless/ath5k/base.h b/drivers/net/wireless/ath5k/base.h
index 06d1054..facc60d 100644
--- a/drivers/net/wireless/ath5k/base.h
+++ b/drivers/net/wireless/ath5k/base.h
@@ -179,6 +179,7 @@ struct ath5k_softc {

struct timer_list calib_tim; /* calibration timer */
int power_level; /* Requested tx power in dbm */
+ bool assoc; /* assocate state */
};

#define ath5k_hw_hasbssidmask(_ah) \

2008-11-23 22:28:49

by Bob Copeland

[permalink] [raw]
Subject: Re: [ath5k-devel] [Bug 11749] Ath5k driver has too many interrupts per second at idle

On Fri, Nov 21, 2008 at 03:27:34PM -0500, John W. Linville wrote:
> > +static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
> > + struct ieee80211_vif *vif,
> > + struct ieee80211_bss_conf *bss_conf,
> > + u32 changes);
>
> This patch defines ath5k_bss_info_changed, but doesn't use it.
> Is that really what you meant to do?

The first version of this patch set .bss_info_changed but it looks
like it got lost along the way. Martin?

--
Bob Copeland %% http://www.bobcopeland.com


2008-11-13 16:26:27

by Bob Copeland

[permalink] [raw]
Subject: Re: [ath5k-devel] [Bug 11749] Ath5k driver has too many interrupts per second at idle

On Thu, Nov 13, 2008 at 1:12 AM, Xu, Martin <[email protected]> wrote:
> Hi all:
> I have a patch that can be used to fix the bug.
> The patch resolved the issue by disabling the beacon filter when disassociated with AP and enabling beacon when associate with AP.
> See http://bugzilla.kernel.org/show_bug.cgi?id=11749
> Please review it. Thanks!

Thanks for the patch!

I think the basic idea is ok (we only have beacons if PRBRESP_PROMISC is set
or if we are in STA mode _and_ associated, or in IBSS mode). However, there
are lots of CodingStyle issues with the patch. Please run
scripts/checkpatch.pl on it and fix the corresponding whitespace issues.

+static void
+enable_beacon_filter(struct ieee80211_hw *hw)
+{
+ struct ath5k_softc *sc = hw->priv;
+ struct ath5k_hw *ah = sc->ah;
+ u32 rfilt;
+ rfilt = ath5k_hw_get_rx_filter(ah);
+ if ( !(rfilt & AR5K_RX_FILTER_BEACON) ){

Probably not worth it to do the test, since this isn't going to get
called that often.

+ rfilt |= AR5K_RX_FILTER_BEACON;
+ ath5k_hw_set_rx_filter(ah,rfilt);
+ sc->filter_flags = rfilt;
+ }
+ rfilt = ath5k_hw_get_rx_filter(ah);
+ return;

Above two lines are unnecessary.

+}

You remove a heap of code by making this set_beacon_filter(hw, bool enable)
and cleaning up the branches in bss_info_changed. I believe this can race
with configure_filter as well (but configure_filter already races with
anything that touches sc->status...).

> @@ -179,6 +179,7 @@ struct ath5k_softc {
>
> struct timer_list calib_tim; /* calibration timer */
> int power_level; /* Requested tx power in dbm */
> + bool assoc; /* assocate state */
> };

s/assocate/associate. Also in ath5k we sometimes use sc->status for such
flags, though this could go either way.

--
Bob Copeland %% http://www.bobcopeland.com

2008-11-24 02:49:35

by Xu, Martin

[permalink] [raw]
Subject: RE: [ath5k-devel] [Bug 11749] Ath5k driver has too many interrupts per second at idle

Qm9iOg0KWW91IGFyZSByaWdodCwgdGhlIGJzc19pbmZvcl9jaGFuZ2VkIGlzIGxvc3Qgb24gdGhl
IHdheS4NClBsZWFzZSByZXZpZXcgYmVsb3cgcGF0Y2g6DQoNCkZyb206IE1hcnRpbiBYdSA8bWFy
dGluLnh1QGludGVsLmNvbT4NClN1YmplY3Q6IGRpc2FibGUgYmVhY29uIGZpbHRlciB3aGVuIHN0
YXRpb24gaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgQVAuDQoNCkF0aDVrIGRyaXZlciBoYXMg
dG9vIG1hbnkgaW50ZXJydXB0cyBwZXIgc2Vjb25kIGF0IGlkbGUNCmh0dHA6Ly9idWd6aWxsYS5r
ZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTc0OQ0KDQpTaWduZWQtb2ZmLWJ5OiBNYXJ0aW4g
WHUgPG1hcnRpbi54dUBpbnRlbC5jb20+DQoNCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJl
bGVzcy9hdGg1ay9iYXNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9iYXNlLmMNCmlu
ZGV4IDM0Y2QxYTQuLjViNTBmYTMgMTAwNjQ0DQotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9h
dGg1ay9iYXNlLmMNCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2Jhc2UuYw0KQEAg
LTI0MSw2ICsyNDEsMTAgQEAgc3RhdGljIGludCBhdGg1a19nZXRfdHhfc3RhdHMoc3RydWN0IGll
ZWU4MDIxMV9odyAqaHcsDQogc3RhdGljIHU2NCBhdGg1a19nZXRfdHNmKHN0cnVjdCBpZWVlODAy
MTFfaHcgKmh3KTsNCiBzdGF0aWMgdm9pZCBhdGg1a19yZXNldF90c2Yoc3RydWN0IGllZWU4MDIx
MV9odyAqaHcpOw0KIHN0YXRpYyBpbnQgYXRoNWtfYmVhY29uX3VwZGF0ZShzdHJ1Y3QgYXRoNWtf
c29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsNCitzdGF0aWMgdm9pZCBhdGg1a19ic3Nf
aW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCQlzdHJ1Y3QgaWVlZTgw
MjExX3ZpZiAqdmlmLA0KKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiwN
CisJCQkJdTMyIGNoYW5nZXMpOw0KIA0KIHN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX29wcyBhdGg1
a19od19vcHMgPSB7DQogCS50eCAJCT0gYXRoNWtfdHgsDQpAQCAtMjU3LDYgKzI2MSw3IEBAIHN0
YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX29wcyBhdGg1a19od19vcHMgPSB7DQogCS5nZXRfdHhfc3Rh
dHMgCT0gYXRoNWtfZ2V0X3R4X3N0YXRzLA0KIAkuZ2V0X3RzZiAJPSBhdGg1a19nZXRfdHNmLA0K
IAkucmVzZXRfdHNmIAk9IGF0aDVrX3Jlc2V0X3RzZiwNCisJLmJzc19pbmZvX2NoYW5nZWQgPSBh
dGg1a19ic3NfaW5mb19jaGFuZ2VkLA0KIH07DQogDQogLyoNCkBAIC0yOTUyLDcgKzI5NTcsNyBA
QCBzdGF0aWMgdm9pZCBhdGg1a19jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcg
Kmh3LA0KIAkJc2MtPm9wbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UICYmDQogCQl0
ZXN0X2JpdChBVEhfU1RBVF9QUk9NSVNDLCBzYy0+c3RhdHVzKSkNCiAJCXJmaWx0IHw9IEFSNUtf
UlhfRklMVEVSX1BST007DQotCWlmIChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJ
T04gfHwNCisJaWYgKChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYgc2Mt
PmFzc29jKSB8fA0KIAkJc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyB8fA0KIAkJ
c2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkNCiAJCXJmaWx0IHw9IEFSNUtfUlhfRklM
VEVSX0JFQUNPTjsNCkBAIC0zMDkyLDQgKzMwOTcsMzIgQEAgYXRoNWtfYmVhY29uX3VwZGF0ZShz
dHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQ0KIA0KIAlyZXR1cm4g
cmV0Ow0KIH0NCitzdGF0aWMgdm9pZA0KK3NldF9iZWFjb25fZmlsdGVyKHN0cnVjdCBpZWVlODAy
MTFfaHcgKmh3LCBib29sIGVuYWJsZSkNCit7DQorCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBo
dy0+cHJpdjsNCisJc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsNCisJdTMyIHJmaWx0Ow0K
KwlyZmlsdCA9IGF0aDVrX2h3X2dldF9yeF9maWx0ZXIoYWgpOw0KKwlpZiAoZW5hYmxlKQ0KKwkJ
cmZpbHQgfD0gQVI1S19SWF9GSUxURVJfQkVBQ09OOw0KKwllbHNlDQorCQlyZmlsdCAmPSB+QVI1
S19SWF9GSUxURVJfQkVBQ09OOw0KKwlhdGg1a19od19zZXRfcnhfZmlsdGVyKGFoLCByZmlsdCk7
DQorCXNjLT5maWx0ZXJfZmxhZ3MgPSByZmlsdDsNCit9DQogDQorc3RhdGljIHZvaWQgYXRoNWtf
YnNzX2luZm9fY2hhbmdlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJICAgIHN0cnVj
dCBpZWVlODAyMTFfdmlmICp2aWYsDQorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25m
ICpic3NfY29uZiwNCisJCQkJICAgIHUzMiBjaGFuZ2VzKQ0KK3sNCisJc3RydWN0IGF0aDVrX3Nv
ZnRjICpzYyA9IGh3LT5wcml2Ow0KKwlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0FTU09DKSB7
DQorCQltdXRleF9sb2NrKCZzYy0+bG9jayk7DQorCQlzYy0+YXNzb2MgPSBic3NfY29uZi0+YXNz
b2M7DQorCQlpZiAoc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQ0KKwkJCXNl
dF9iZWFjb25fZmlsdGVyKGh3LCBzYy0+YXNzb2MpOw0KKwkJbXV0ZXhfdW5sb2NrKCZzYy0+bG9j
ayk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvYmFz
ZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvYmFzZS5oDQppbmRleCAwNmQxMDU0Li5m
YWNjNjBkIDEwMDY0NA0KLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvYmFzZS5oDQor
KysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9iYXNlLmgNCkBAIC0xNzksNiArMTc5LDcg
QEAgc3RydWN0IGF0aDVrX3NvZnRjIHsNCiANCiAJc3RydWN0IHRpbWVyX2xpc3QJY2FsaWJfdGlt
OwkvKiBjYWxpYnJhdGlvbiB0aW1lciAqLw0KIAlpbnQgCQkJcG93ZXJfbGV2ZWw7CS8qIFJlcXVl
c3RlZCB0eCBwb3dlciBpbiBkYm0gKi8NCisJYm9vbAkJCWFzc29jOwkJLyogYXNzb2NhdGUgc3Rh
dGUgKi8NCiB9Ow0KIA0KICNkZWZpbmUgYXRoNWtfaHdfaGFzYnNzaWRtYXNrKF9haCkgXA0KDQot
LS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KRnJvbTogbGludXgtd2lyZWxlc3Mtb3duZXJAdmdl
ci5rZXJuZWwub3JnIFttYWlsdG86bGludXgtd2lyZWxlc3Mtb3duZXJAdmdlci5rZXJuZWwub3Jn
XSBPbiBCZWhhbGYgT2YgQm9iIENvcGVsYW5kDQpTZW50OiAyMDA4xOoxMdTCMjTI1SA2OjI4DQpU
bzogSm9obiBXLiBMaW52aWxsZQ0KQ2M6IFh1LCBNYXJ0aW47IE5pY2sgS29zc2lmaWRpczsgTHVp
cyBSLiBSb2RyaWd1ZXo7IGxpbnV4LXdpcmVsZXNzOyB5YW5nLnkueWlAZ21haWwuY29tOyBWaWty
YW0gS2FuZHVrdXJpOyBKb3RoaWt1bWFyIE1vdGhpbGFsOyBhdGg1ay1kZXZlbEBsaXN0cy5hdGg1
ay5vcmc7IExpdSwgQmluZyBXZWk7IFNlbGJhaywgUm9sbGEgTjsgV2FuZywgWW9uZyBZDQpTdWJq
ZWN0OiBSZTogW2F0aDVrLWRldmVsXSBbQnVnIDExNzQ5XSBBdGg1ayBkcml2ZXIgaGFzIHRvbyBt
YW55IGludGVycnVwdHMgcGVyIHNlY29uZCBhdCBpZGxlDQoNCk9uIEZyaSwgTm92IDIxLCAyMDA4
IGF0IDAzOjI3OjM0UE0gLTA1MDAsIEpvaG4gVy4gTGludmlsbGUgd3JvdGU6DQo+ID4gK3N0YXRp
YyB2b2lkIGF0aDVrX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQo+
ID4gKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KPiA+ICsJCQkJc3RydWN0IGllZWU4
MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYsDQo+ID4gKwkJCQl1MzIgY2hhbmdlcyk7DQo+IA0KPiBU
aGlzIHBhdGNoIGRlZmluZXMgYXRoNWtfYnNzX2luZm9fY2hhbmdlZCwgYnV0IGRvZXNuJ3QgdXNl
IGl0Lg0KPiBJcyB0aGF0IHJlYWxseSB3aGF0IHlvdSBtZWFudCB0byBkbz8NCg0KVGhlIGZpcnN0
IHZlcnNpb24gb2YgdGhpcyBwYXRjaCBzZXQgLmJzc19pbmZvX2NoYW5nZWQgYnV0IGl0IGxvb2tz
DQpsaWtlIGl0IGdvdCBsb3N0IGFsb25nIHRoZSB3YXkuICBNYXJ0aW4/DQoNCi0tIA0KQm9iIENv
cGVsYW5kICUlIHd3dy5ib2Jjb3BlbGFuZC5jb20NCg0KLS0NClRvIHVuc3Vic2NyaWJlIGZyb20g
dGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBsaW51eC13aXJlbGVzcyIgaW4N
CnRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQpNb3Jl
IG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZv
Lmh0bWwNCg==

2008-11-21 20:31:21

by John W. Linville

[permalink] [raw]
Subject: Re: [ath5k-devel] [Bug 11749] Ath5k driver has too many interrupts per second at idle

On Thu, Nov 20, 2008 at 11:13:18AM +0800, Xu, Martin wrote:
> Hi Bob:
> Please review below patch thanks.
>
> From: Martin Xu <[email protected]>
> Subject: disable beacon filter when station is not associated with any AP.
>
> Ath5k driver has too many interrupts per second at idle
> http://bugzilla.kernel.org/show_bug.cgi?id=11749
>
> Signed-off-by: Martin Xu <[email protected]>
>
> diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
> index 34cd1a4..37da7cc 100644
> --- a/drivers/net/wireless/ath5k/base.c
> +++ b/drivers/net/wireless/ath5k/base.c
> @@ -241,6 +241,10 @@ static int ath5k_get_tx_stats(struct ieee80211_hw *hw,
> static u64 ath5k_get_tsf(struct ieee80211_hw *hw);
> static void ath5k_reset_tsf(struct ieee80211_hw *hw);
> static int ath5k_beacon_update(struct ath5k_softc *sc, struct sk_buff *skb);
> +static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
> + struct ieee80211_vif *vif,
> + struct ieee80211_bss_conf *bss_conf,
> + u32 changes);
>
> static struct ieee80211_ops ath5k_hw_ops = {
> .tx = ath5k_tx,

This patch defines ath5k_bss_info_changed, but doesn't use it.
Is that really what you meant to do?

John
--
John W. Linville Linux should be at the core
[email protected] of your literate lifestyle.

2008-11-17 13:38:41

by Bob Copeland

[permalink] [raw]
Subject: Re: [ath5k-devel] [Bug 11749] Ath5k driver has too many interrupts per second at idle

On Mon, Nov 17, 2008 at 03:35:07PM +0800, Xu, Martin wrote:
> Hi bob??
> Please review below patch which has been modified according to your comments.

Thanks, looks a lot better. I still have a few minor comments:

> +static void
> +set_beacon_filter(struct ieee80211_hw *hw, bool enable)
> +{
[...]
> + return;
> +}

Please don't use 'return' for void functions.

> +static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
> + struct ieee80211_vif *vif,
> + struct ieee80211_bss_conf *bss_conf,
> + u32 changes)
> +{
> + struct ath5k_softc *sc = hw->priv;
> + if (changes & BSS_CHANGED_ASSOC) {
> + mutex_lock(&sc->lock);
> + sc->assoc = bss_conf->assoc;
> + if (sc->opmode == NL80211_IFTYPE_STATION) {
> + if (sc->assoc)
> + set_beacon_filter(hw, 1);
> + else
> + set_beacon_filter(hw, 0);

No need for test:
set_beacon_filter(hw, sc->assoc);

> + }
> + mutex_unlock(&sc->lock);
> + }
> + return;

ditto above comment

Thanks,
Bob

--
Bob Copeland %% http://www.bobcopeland.com


2008-11-20 22:41:07

by Luis R. Rodriguez

[permalink] [raw]
Subject: Re: [ath5k-devel] [Bug 11749] Ath5k driver has too many interrupts per second at idle

On Thu, Nov 20, 2008 at 02:01:19PM -0800, Bob Copeland wrote:
> Hi Martin,
>
> > From: Martin Xu <[email protected]>
> > Subject: disable beacon filter when station is not associated with any AP.
> >
> > Ath5k driver has too many interrupts per second at idle
> > http://bugzilla.kernel.org/show_bug.cgi?id=11749
> >
> > Signed-off-by: Martin Xu <[email protected]>
>
> Thanks for the cleanups. I don't have any objections to the patch.
> Anyone else want to weigh in?

Acked-by: Luis R. Rodriguez <[email protected]>

Please close the bug report too.

Luis

2008-11-20 22:01:21

by Bob Copeland

[permalink] [raw]
Subject: Re: [ath5k-devel] [Bug 11749] Ath5k driver has too many interrupts per second at idle

Hi Martin,

> From: Martin Xu <[email protected]>
> Subject: disable beacon filter when station is not associated with any AP.
>
> Ath5k driver has too many interrupts per second at idle
> http://bugzilla.kernel.org/show_bug.cgi?id=11749
>
> Signed-off-by: Martin Xu <[email protected]>

Thanks for the cleanups. I don't have any objections to the patch.
Anyone else want to weigh in?

Patch reproduced here:

>
> diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
> index 34cd1a4..37da7cc 100644
> --- a/drivers/net/wireless/ath5k/base.c
> +++ b/drivers/net/wireless/ath5k/base.c
> @@ -241,6 +241,10 @@ static int ath5k_get_tx_stats(struct ieee80211_hw *hw,
> static u64 ath5k_get_tsf(struct ieee80211_hw *hw);
> static void ath5k_reset_tsf(struct ieee80211_hw *hw);
> static int ath5k_beacon_update(struct ath5k_softc *sc, struct sk_buff *skb);
> +static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
> + struct ieee80211_vif *vif,
> + struct ieee80211_bss_conf *bss_conf,
> + u32 changes);
>
> static struct ieee80211_ops ath5k_hw_ops = {
> .tx = ath5k_tx,
> @@ -2952,7 +2956,7 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
> sc->opmode != NL80211_IFTYPE_MESH_POINT &&
> test_bit(ATH_STAT_PROMISC, sc->status))
> rfilt |= AR5K_RX_FILTER_PROM;
> - if (sc->opmode == NL80211_IFTYPE_STATION ||
> + if ((sc->opmode == NL80211_IFTYPE_STATION && sc->assoc) ||
> sc->opmode == NL80211_IFTYPE_ADHOC ||
> sc->opmode == NL80211_IFTYPE_AP)
> rfilt |= AR5K_RX_FILTER_BEACON;
> @@ -3092,4 +3096,32 @@ ath5k_beacon_update(struct ath5k_softc *sc, struct sk_buff *skb)
>
> return ret;
> }
> +static void
> +set_beacon_filter(struct ieee80211_hw *hw, bool enable)
> +{
> + struct ath5k_softc *sc = hw->priv;
> + struct ath5k_hw *ah = sc->ah;
> + u32 rfilt;
> + rfilt = ath5k_hw_get_rx_filter(ah);
> + if (enable)
> + rfilt |= AR5K_RX_FILTER_BEACON;
> + else
> + rfilt &= ~AR5K_RX_FILTER_BEACON;
> + ath5k_hw_set_rx_filter(ah, rfilt);
> + sc->filter_flags = rfilt;
> +}
>
> +static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
> + struct ieee80211_vif *vif,
> + struct ieee80211_bss_conf *bss_conf,
> + u32 changes)
> +{
> + struct ath5k_softc *sc = hw->priv;
> + if (changes & BSS_CHANGED_ASSOC) {
> + mutex_lock(&sc->lock);
> + sc->assoc = bss_conf->assoc;
> + if (sc->opmode == NL80211_IFTYPE_STATION)
> + set_beacon_filter(hw, sc->assoc);
> + mutex_unlock(&sc->lock);
> + }
> +}
> diff --git a/drivers/net/wireless/ath5k/base.h b/drivers/net/wireless/ath5k/base.h
> index 06d1054..facc60d 100644
> --- a/drivers/net/wireless/ath5k/base.h
> +++ b/drivers/net/wireless/ath5k/base.h
> @@ -179,6 +179,7 @@ struct ath5k_softc {
>
> struct timer_list calib_tim; /* calibration timer */
> int power_level; /* Requested tx power in dbm */
> + bool assoc; /* assocate state */
> };
>
> #define ath5k_hw_hasbssidmask(_ah) \
> _______________________________________________
> ath5k-devel mailing list
> [email protected]
> https://lists.ath5k.org/mailman/listinfo/ath5k-devel
>



--
Bob Copeland %% http://www.bobcopeland.com

2008-11-17 07:35:33

by Xu, Martin

[permalink] [raw]
Subject: RE: [ath5k-devel] [Bug 11749] Ath5k driver has too many interrupts per second at idle

SGkgYm9io7oNClBsZWFzZSByZXZpZXcgYmVsb3cgcGF0Y2ggd2hpY2ggaGFzIGJlZW4gbW9kaWZp
ZWQgYWNjb3JkaW5nIHRvIHlvdXIgY29tbWVudHMuDQoNCg0KRnJvbTogTWFydGluIFh1IDxtYXJ0
aW4ueHVAaW50ZWwuY29tPg0KU3ViamVjdDogZGlzYWJsZSBiZWFjb24gZmlsdGVyIHdoZW4gc3Rh
dGlvbiBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBBUC4NCg0KQXRoNWsgZHJpdmVyIGhhcyB0
b28gbWFueSBpbnRlcnJ1cHRzIHBlciBzZWNvbmQgYXQgaWRsZQ0KaHR0cDovL2J1Z3ppbGxhLmtl
cm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTExNzQ5DQoNClNpZ25lZC1vZmYtYnk6IE1hcnRpbiBY
dSA8bWFydGluLnh1QGludGVsLmNvbT4NCg0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVs
ZXNzL2F0aDVrL2Jhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2Jhc2UuYw0KaW5k
ZXggMzRjZDFhNC4uYmVkMTM3NiAxMDA2NDQNCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0
aDVrL2Jhc2UuYw0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvYmFzZS5jDQpAQCAt
MjQxLDYgKzI0MSwxMCBAQCBzdGF0aWMgaW50IGF0aDVrX2dldF90eF9zdGF0cyhzdHJ1Y3QgaWVl
ZTgwMjExX2h3ICpodywNCiBzdGF0aWMgdTY0IGF0aDVrX2dldF90c2Yoc3RydWN0IGllZWU4MDIx
MV9odyAqaHcpOw0KIHN0YXRpYyB2b2lkIGF0aDVrX3Jlc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjEx
X2h3ICpodyk7DQogc3RhdGljIGludCBhdGg1a19iZWFjb25fdXBkYXRlKHN0cnVjdCBhdGg1a19z
b2Z0YyAqc2MsIHN0cnVjdCBza19idWZmICpza2IpOw0KK3N0YXRpYyB2b2lkIGF0aDVrX2Jzc19p
bmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCXN0cnVjdCBpZWVlODAy
MTFfdmlmICp2aWYsDQorCQkJCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLA0K
KwkJCQl1MzIgY2hhbmdlcyk7DQogDQogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfb3BzIGF0aDVr
X2h3X29wcyA9IHsNCiAJLnR4IAkJPSBhdGg1a190eCwNCkBAIC0yOTUyLDcgKzI5NTYsNyBAQCBz
dGF0aWMgdm9pZCBhdGg1a19jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3
LA0KIAkJc2MtPm9wbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UICYmDQogCQl0ZXN0
X2JpdChBVEhfU1RBVF9QUk9NSVNDLCBzYy0+c3RhdHVzKSkNCiAJCXJmaWx0IHw9IEFSNUtfUlhf
RklMVEVSX1BST007DQotCWlmIChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04g
fHwNCisJaWYgKChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYgc2MtPmFz
c29jKSB8fA0KIAkJc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyB8fA0KIAkJc2Mt
Pm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkNCiAJCXJmaWx0IHw9IEFSNUtfUlhfRklMVEVS
X0JFQUNPTjsNCkBAIC0zMDkyLDQgKzMwOTYsMzkgQEAgYXRoNWtfYmVhY29uX3VwZGF0ZShzdHJ1
Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQ0KIA0KIAlyZXR1cm4gcmV0
Ow0KIH0NCitzdGF0aWMgdm9pZA0KK3NldF9iZWFjb25fZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFf
aHcgKmh3LCBib29sIGVuYWJsZSkNCit7DQorCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+
cHJpdjsNCisJc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsNCisJdTMyIHJmaWx0Ow0KKwly
ZmlsdCA9IGF0aDVrX2h3X2dldF9yeF9maWx0ZXIoYWgpOw0KKwlpZiAoZW5hYmxlKQ0KKwkJcmZp
bHQgfD0gQVI1S19SWF9GSUxURVJfQkVBQ09OOw0KKwllbHNlDQorCQlyZmlsdCAmPSB+QVI1S19S
WF9GSUxURVJfQkVBQ09OOw0KKwlhdGg1a19od19zZXRfcnhfZmlsdGVyKGFoLCByZmlsdCk7DQor
CXNjLT5maWx0ZXJfZmxhZ3MgPSByZmlsdDsNCisJcmV0dXJuOw0KK30NCisNCitzdGF0aWMgdm9p
ZCBhdGg1a19ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCQkg
ICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwNCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFf
YnNzX2NvbmYgKmJzc19jb25mLA0KKwkJCQkgICAgdTMyIGNoYW5nZXMpDQorew0KKwlzdHJ1Y3Qg
YXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7DQorCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURf
QVNTT0MpIHsNCisJCW11dGV4X2xvY2soJnNjLT5sb2NrKTsNCisJCXNjLT5hc3NvYyA9IGJzc19j
b25mLT5hc3NvYzsNCisJCWlmIChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04p
IHsNCisJCQlpZiAoc2MtPmFzc29jKQ0KKwkJCQlzZXRfYmVhY29uX2ZpbHRlcihodywgMSk7DQor
CQkJZWxzZQ0KKwkJCQlzZXRfYmVhY29uX2ZpbHRlcihodywgMCk7DQorCQl9DQorCQltdXRleF91
bmxvY2soJnNjLT5sb2NrKTsNCisJfQ0KKwlyZXR1cm47DQorfQ0KIA0KZGlmZiAtLWdpdCBhL2Ry
aXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2Jhc2UuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0
aDVrL2Jhc2UuaA0KaW5kZXggMDZkMTA1NC4uZmFjYzYwZCAxMDA2NDQNCi0tLSBhL2RyaXZlcnMv
bmV0L3dpcmVsZXNzL2F0aDVrL2Jhc2UuaA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRo
NWsvYmFzZS5oDQpAQCAtMTc5LDYgKzE3OSw3IEBAIHN0cnVjdCBhdGg1a19zb2Z0YyB7DQogDQog
CXN0cnVjdCB0aW1lcl9saXN0CWNhbGliX3RpbTsJLyogY2FsaWJyYXRpb24gdGltZXIgKi8NCiAJ
aW50IAkJCXBvd2VyX2xldmVsOwkvKiBSZXF1ZXN0ZWQgdHggcG93ZXIgaW4gZGJtICovDQorCWJv
b2wJCQlhc3NvYzsJCS8qIGFzc29jYXRlIHN0YXRlICovDQogfTsNCiANCiAjZGVmaW5lIGF0aDVr
X2h3X2hhc2Jzc2lkbWFzayhfYWgpIFwNCg0KLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCkZy
b206IGJjb3BlbGFuZEBnbWFpbC5jb20gW21haWx0bzpiY29wZWxhbmRAZ21haWwuY29tXSBPbiBC
ZWhhbGYgT2YgQm9iIENvcGVsYW5kDQpTZW50OiAyMDA4xOoxMdTCMTTI1SAwOjI2DQpUbzogWHUs
IE1hcnRpbg0KQ2M6IE5pY2sgS29zc2lmaWRpczsgTHVpcyBSLiBSb2RyaWd1ZXo7IGxpbnV4LXdp
cmVsZXNzOyB5YW5nLnkueWlAZ21haWwuY29tOyBWaWtyYW0gS2FuZHVrdXJpOyBKb3RoaWt1bWFy
IE1vdGhpbGFsOyBhdGg1ay1kZXZlbEBsaXN0cy5hdGg1ay5vcmc7IExpdSwgQmluZyBXZWk7IFNl
bGJhaywgUm9sbGEgTjsgV2FuZywgWW9uZyBZDQpTdWJqZWN0OiBSZTogW2F0aDVrLWRldmVsXSBb
QnVnIDExNzQ5XSBBdGg1ayBkcml2ZXIgaGFzIHRvbyBtYW55IGludGVycnVwdHMgcGVyIHNlY29u
ZCBhdCBpZGxlDQoNCk9uIFRodSwgTm92IDEzLCAyMDA4IGF0IDE6MTIgQU0sIFh1LCBNYXJ0aW4g
PG1hcnRpbi54dUBpbnRlbC5jb20+IHdyb3RlOg0KPiBIaSBhbGw6DQo+IEkgaGF2ZSBhIHBhdGNo
IHRoYXQgY2FuIGJlIHVzZWQgdG8gZml4IHRoZSBidWcuDQo+IFRoZSBwYXRjaCByZXNvbHZlZCB0
aGUgaXNzdWUgYnkgZGlzYWJsaW5nIHRoZSBiZWFjb24gZmlsdGVyIHdoZW4gZGlzYXNzb2NpYXRl
ZCB3aXRoIEFQIGFuZCBlbmFibGluZyBiZWFjb24gd2hlbiBhc3NvY2lhdGUgd2l0aCBBUC4NCj4g
U2VlIGh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTc0OQ0KPiBQ
bGVhc2UgcmV2aWV3IGl0LiBUaGFua3MhDQoNClRoYW5rcyBmb3IgdGhlIHBhdGNoIQ0KDQpJIHRo
aW5rIHRoZSBiYXNpYyBpZGVhIGlzIG9rICh3ZSBvbmx5IGhhdmUgYmVhY29ucyBpZiBQUkJSRVNQ
X1BST01JU0MgaXMgc2V0DQpvciBpZiB3ZSBhcmUgaW4gU1RBIG1vZGUgX2FuZF8gYXNzb2NpYXRl
ZCwgb3IgaW4gSUJTUyBtb2RlKS4gIEhvd2V2ZXIsIHRoZXJlDQphcmUgbG90cyBvZiBDb2RpbmdT
dHlsZSBpc3N1ZXMgd2l0aCB0aGUgcGF0Y2guICBQbGVhc2UgcnVuDQpzY3JpcHRzL2NoZWNrcGF0
Y2gucGwgb24gaXQgYW5kIGZpeCB0aGUgY29ycmVzcG9uZGluZyB3aGl0ZXNwYWNlIGlzc3Vlcy4N
Cg0KK3N0YXRpYyB2b2lkDQorZW5hYmxlX2JlYWNvbl9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9o
dyAqaHcpDQorew0KKyAgICAgICAgc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2Ow0K
KyAgICAgICAgc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsNCisgICAgICAgIHUzMiByZmls
dDsNCisgICAgICAgIHJmaWx0ID0gYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlcihhaCk7DQorICAgICAg
ICBpZiAoICEocmZpbHQgJiBBUjVLX1JYX0ZJTFRFUl9CRUFDT04pICl7DQoNClByb2JhYmx5IG5v
dCB3b3J0aCBpdCB0byBkbyB0aGUgdGVzdCwgc2luY2UgdGhpcyBpc24ndCBnb2luZyB0byBnZXQN
CmNhbGxlZCB0aGF0IG9mdGVuLg0KDQorICAgICAgICAgICAgICAgIHJmaWx0IHw9IEFSNUtfUlhf
RklMVEVSX0JFQUNPTjsNCisgICAgICAgICAgICAgICAgYXRoNWtfaHdfc2V0X3J4X2ZpbHRlcihh
aCxyZmlsdCk7DQorICAgICAgICAgICAgICAgIHNjLT5maWx0ZXJfZmxhZ3MgPSByZmlsdDsNCisg
ICAgICAgIH0NCisgICAgICAgIHJmaWx0ID0gYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlcihhaCk7DQor
ICAgICAgICByZXR1cm47DQoNCkFib3ZlIHR3byBsaW5lcyBhcmUgdW5uZWNlc3NhcnkuDQoNCit9
DQoNCllvdSByZW1vdmUgYSBoZWFwIG9mIGNvZGUgYnkgbWFraW5nIHRoaXMgc2V0X2JlYWNvbl9m
aWx0ZXIoaHcsIGJvb2wgZW5hYmxlKQ0KYW5kIGNsZWFuaW5nIHVwIHRoZSBicmFuY2hlcyBpbiBi
c3NfaW5mb19jaGFuZ2VkLiAgSSBiZWxpZXZlIHRoaXMgY2FuIHJhY2UNCndpdGggY29uZmlndXJl
X2ZpbHRlciBhcyB3ZWxsIChidXQgY29uZmlndXJlX2ZpbHRlciBhbHJlYWR5IHJhY2VzIHdpdGgN
CmFueXRoaW5nIHRoYXQgdG91Y2hlcyBzYy0+c3RhdHVzLi4uKS4NCg0KPiBAQCAtMTc5LDYgKzE3
OSw3IEBAIHN0cnVjdCBhdGg1a19zb2Z0YyB7DQo+DQo+ICAgICAgICBzdHJ1Y3QgdGltZXJfbGlz
dCAgICAgICBjYWxpYl90aW07ICAgICAgLyogY2FsaWJyYXRpb24gdGltZXIgKi8NCj4gICAgICAg
IGludCAgICAgICAgICAgICAgICAgICAgIHBvd2VyX2xldmVsOyAgICAvKiBSZXF1ZXN0ZWQgdHgg
cG93ZXIgaW4gZGJtICovDQo+ICsgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgYXNzb2M7
ICAgICAgICAgIC8qIGFzc29jYXRlIHN0YXRlICovDQo+ICB9Ow0KDQpzL2Fzc29jYXRlL2Fzc29j
aWF0ZS4gIEFsc28gaW4gYXRoNWsgd2Ugc29tZXRpbWVzIHVzZSBzYy0+c3RhdHVzIGZvciBzdWNo
DQpmbGFncywgdGhvdWdoIHRoaXMgY291bGQgZ28gZWl0aGVyIHdheS4NCg0KLS0gDQpCb2IgQ29w
ZWxhbmQgJSUgd3d3LmJvYmNvcGVsYW5kLmNvbQ0K

2008-11-13 06:12:25

by Xu, Martin

[permalink] [raw]
Subject: RE: [ath5k-devel] [Bug 11749] Ath5k driver has too many interrupts per second at idle

Hi all:
I have a patch that can be used to fix the bug.
The patch resolved the issue by disabling the beacon filter when disassociated with AP and enabling beacon when associate with AP.
See http://bugzilla.kernel.org/show_bug.cgi?id=11749
Please review it. Thanks!

diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
index 34cd1a4..d774a6a 100644
--- a/drivers/net/wireless/ath5k/base.c
+++ b/drivers/net/wireless/ath5k/base.c
@@ -241,6 +241,10 @@ static int ath5k_get_tx_stats(struct ieee80211_hw *hw,
static u64 ath5k_get_tsf(struct ieee80211_hw *hw);
static void ath5k_reset_tsf(struct ieee80211_hw *hw);
static int ath5k_beacon_update(struct ath5k_softc *sc, struct sk_buff *skb);
+static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif,
+ struct ieee80211_bss_conf *bss_conf,
+ u32 changes);

static struct ieee80211_ops ath5k_hw_ops = {
.tx = ath5k_tx,
@@ -257,6 +261,7 @@ static struct ieee80211_ops ath5k_hw_ops = {
.get_tx_stats = ath5k_get_tx_stats,
.get_tsf = ath5k_get_tsf,
.reset_tsf = ath5k_reset_tsf,
+ .bss_info_changed = ath5k_bss_info_changed,
};

/*
@@ -2952,7 +2957,7 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
sc->opmode != NL80211_IFTYPE_MESH_POINT &&
test_bit(ATH_STAT_PROMISC, sc->status))
rfilt |= AR5K_RX_FILTER_PROM;
- if (sc->opmode == NL80211_IFTYPE_STATION ||
+ if ( (sc->opmode == NL80211_IFTYPE_STATION && sc->assoc) ||
sc->opmode == NL80211_IFTYPE_ADHOC ||
sc->opmode == NL80211_IFTYPE_AP)
rfilt |= AR5K_RX_FILTER_BEACON;
@@ -3093,3 +3098,54 @@ ath5k_beacon_update(struct ath5k_softc *sc, struct sk_buff *skb)
return ret;
}

+static void
+enable_beacon_filter(struct ieee80211_hw *hw)
+{
+ struct ath5k_softc *sc = hw->priv;
+ struct ath5k_hw *ah = sc->ah;
+ u32 rfilt;
+ rfilt = ath5k_hw_get_rx_filter(ah);
+ if ( !(rfilt & AR5K_RX_FILTER_BEACON) ){
+ rfilt |= AR5K_RX_FILTER_BEACON;
+ ath5k_hw_set_rx_filter(ah,rfilt);
+ sc->filter_flags = rfilt;
+ }
+ rfilt = ath5k_hw_get_rx_filter(ah);
+ return;
+}
+
+static void
+disable_beacon_filter(struct ieee80211_hw *hw)
+{
+ struct ath5k_softc *sc = hw->priv;
+ struct ath5k_hw *ah = sc->ah;
+ u32 rfilt;
+ rfilt = ath5k_hw_get_rx_filter(ah);
+ if ( rfilt & AR5K_RX_FILTER_BEACON ){
+ rfilt &= ~AR5K_RX_FILTER_BEACON;
+ ath5k_hw_set_rx_filter(ah,rfilt);
+ sc->filter_flags = rfilt;
+ }
+
+ return;
+}
+
+static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif,
+ struct ieee80211_bss_conf *bss_conf,
+ u32 changes)
+{
+ struct ath5k_softc *sc = hw->priv;
+ if (changes & BSS_CHANGED_ASSOC){
+ mutex_lock(&sc->lock);
+ sc->assoc = bss_conf->assoc;
+ if ( sc->opmode == NL80211_IFTYPE_STATION && sc-> assoc){
+ enable_beacon_filter(hw);
+ }
+ if ( sc->opmode == NL80211_IFTYPE_STATION && !sc-> assoc ){
+ disable_beacon_filter(hw);
+ }
+ mutex_unlock(&sc->lock);
+ }
+ return;
+}
diff --git a/drivers/net/wireless/ath5k/base.h b/drivers/net/wireless/ath5k/base.h
index 06d1054..facc60d 100644
--- a/drivers/net/wireless/ath5k/base.h
+++ b/drivers/net/wireless/ath5k/base.h
@@ -179,6 +179,7 @@ struct ath5k_softc {

struct timer_list calib_tim; /* calibration timer */
int power_level; /* Requested tx power in dbm */
+ bool assoc; /* assocate state */
};

#define ath5k_hw_hasbssidmask(_ah) \