Skip to contentSkip to conversation

Ath5k driver has too many interrupts per second at idle

Bug 11749 Luis R. Rodriguez 6 participants 12 messages Oct 13, 2008 – Nov 24, 2008 2 messages not in the archive Networking drivers (wireless)

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]/

A message that is not in the archive (sent off-list or not yet received): [email protected]

#2 lore raw
Quoted 1 line · 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

(quoted diff) +0 -0

b/drivers/net/wireless/ath5k/base.c
index 0676c6d..c18ead9 100644

drivers/net/wireless/ath5k/base.c +1 -2
@@ -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 */
drivers/net/wireless/ath5k/base.c +1 -2
index 0676c6d..c18ead9 100644
@@ -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 */
#3 lore raw

2008/10/13 Luis R. Rodriguez <[email protected]>:

Quoted 49 lines · On Mon, Oct 13, 2008 at 8:05 AM, <[email protected]> wrote:
Quoted 1 line

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

drivers/net/wireless/ath5k/base.c +0 -0
index 0676c6d..c18ead9 100644

drivers/net/wireless/ath5k/base.c ath5k_init(struct ath5k_softc *sc) · line 2252

Quoted 9 lines
drivers/net/wireless/ath5k/base.c +1 -2
@@ -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 */
Signature · 3 lines
GPG ID: 0xD21DB2DB
As you read this post global entropy rises. Have Fun ;-)
Nick
#4 lore raw

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!

drivers/net/wireless/ath5k/base.c +57 -1
index 34cd1a4..d774a6a 100644
@@ -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;
+}
drivers/net/wireless/ath5k/base.h +1 -0
index 06d1054..facc60d 100644
@@ -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) \
#5 lore raw
Quoted 5 lines · Martin

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...).

drivers/net/wireless/ath5k/base.h struct ath5k_softc { · line 183

Quoted 6 lines
drivers/net/wireless/ath5k/base.h +1 -0
@@ -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.

Signature · 1 line
Bob Copeland %% www.bobcopeland.com
#6 lore raw

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

#7 lore raw
Quoted 2 lines · Martin

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:

Quoted 3 lines
drivers/net/wireless/ath5k/base.c +3 -0
+static void
+set_beacon_filter(struct ieee80211_hw *hw, bool enable)
+{

[...]

Review

Quoted 2 lines
(quoted diff) +2 -0
+	return;
+}

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

Quoted 4 lines
drivers/net/wireless/ath5k/base.c +4 -0
+static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
+				    struct ieee80211_vif *vif,
+				    struct ieee80211_bss_conf *bss_conf,
+				    u32 changes)

drivers/net/wireless/ath5k/base.c ath5k_beacon_update(struct ath5k_softc *sc, struct sk_buff *skb)

Quoted 10 lines
drivers/net/wireless/ath5k/base.c +10 -0
+{
+	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);

drivers/net/wireless/ath5k/base.c ath5k_beacon_update(struct ath5k_softc *sc, struct sk_buff *skb) · line 3150

Quoted 4 lines
drivers/net/wireless/ath5k/base.c +4 -0
+		}
+		mutex_unlock(&sc->lock);
+	}
+	return;

ditto above comment

Thanks,
Bob

Signature · 1 line
Bob Copeland %% www.bobcopeland.com
#8 lore raw

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

drivers/net/wireless/ath5k/base.c +33 -1
index 34cd1a4..37da7cc 100644
@@ -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);
+	}
+}
drivers/net/wireless/ath5k/base.h +1 -0
index 06d1054..facc60d 100644
@@ -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) \
#9 lore raw

Hi Martin,

Quoted 7 lines

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

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

Patch reproduced here:

Quoted 75 lines
drivers/net/wireless/ath5k/base.c +33 -1
index 34cd1a4..37da7cc 100644
@@ -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);
+       }
+}
drivers/net/wireless/ath5k/base.h +1 -0
index 06d1054..facc60d 100644
@@ -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

Signature · 1 line
Bob Copeland %% www.bobcopeland.com
#10 lore raw
Quoted 5 lines · Bob Copeland

Hi Martin,

Quoted 3 lines

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

Quoted 7 lines
Quoted 4 lines

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

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

Please close the bug report too.

Luis

#11 lore raw
In reply to Xu, Martin
Quoted 16 lines · Martin

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

drivers/net/wireless/ath5k/base.c +0 -0
index 34cd1a4..37da7cc 100644

drivers/net/wireless/ath5k/base.c static int ath5k_get_tx_stats(struct ieee80211_hw *hw, · line 250

Quoted 10 lines
drivers/net/wireless/ath5k/base.c +4 -0
@@ -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

Signature · 2 lines
John W. Linville		Linux should be at the core
[email protected]			of your literate lifestyle.
#12 lore raw
Quoted 7 lines · John W. Linville

drivers/net/wireless/ath5k/base.c static int ath5k_get_tx_stats(struct ieee80211_hw *hw, · line 247

Quoted 4 lines
drivers/net/wireless/ath5k/base.c +4 -0
+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?

Signature · 1 line
Bob Copeland %% www.bobcopeland.com
#13 lore raw

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==