linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ivo van Doorn <ivdoorn@gmail.com>
To: "John W. Linville" <linville@tuxdriver.com>
Cc: users@rt2x00.serialmonkey.com, linux-wireless@vger.kernel.org,
	Helmut Schaa <helmut.schaa@googlemail.com>,
	Gertjan van Wingerde <gwingerde@gmail.com>
Subject: [PATCH 17/21] rt2x00: fix beacon reset on rt2800
Date: Tue, 29 Jun 2010 21:48:06 +0200	[thread overview]
Message-ID: <201006292148.07594.IvDoorn@gmail.com> (raw)
In-Reply-To: <201006292147.38367.IvDoorn@gmail.com>

From: Helmut Schaa <helmut.schaa@googlemail.com>

When an interface is removed the according beacon entry should be reset.
The current approach to only clear the first word is not enough to stop
the device from sending out the beacon, hence resulting in beacons being
sent out for already removed interfaces.

Fix this by invalidating the entire TXWI in front of the beacon instead
of only the first word.

Also clear all beacons during startup in the same way.

Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2800lib.c |   42 +++++++++++++++++-------------
 1 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index f7e9e76..5125315 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -432,6 +432,20 @@ void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
 }
 EXPORT_SYMBOL(rt2800_write_beacon);
 
+static void inline rt2800_clear_beacon(struct rt2x00_dev *rt2x00dev,
+				       unsigned int beacon_base)
+{
+	int i;
+
+	/*
+	 * For the Beacon base registers we only need to clear
+	 * the whole TXWI which (when set to 0) will invalidate
+	 * the entire beacon.
+	 */
+	for (i = 0; i < TXWI_DESC_SIZE; i += sizeof(__le32))
+		rt2800_register_write(rt2x00dev, beacon_base + i, 0);
+}
+
 #ifdef CONFIG_RT2X00_LIB_DEBUGFS
 const struct rt2x00debug rt2800_rt2x00debug = {
 	.owner	= THIS_MODULE,
@@ -733,19 +747,14 @@ EXPORT_SYMBOL_GPL(rt2800_config_filter);
 void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf,
 			struct rt2x00intf_conf *conf, const unsigned int flags)
 {
-	unsigned int beacon_base;
 	u32 reg;
 
 	if (flags & CONFIG_UPDATE_TYPE) {
 		/*
 		 * Clear current synchronisation setup.
-		 * For the Beacon base registers we only need to clear
-		 * the first byte since that byte contains the VALID and OWNER
-		 * bits which (when set to 0) will invalidate the entire beacon.
 		 */
-		beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx);
-		rt2800_register_write(rt2x00dev, beacon_base, 0);
-
+		rt2800_clear_beacon(rt2x00dev,
+				    HW_BEACON_OFFSET(intf->beacon->entry_idx));
 		/*
 		 * Enable synchronisation.
 		 */
@@ -1565,18 +1574,15 @@ int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
 
 	/*
 	 * Clear all beacons
-	 * For the Beacon base registers we only need to clear
-	 * the first byte since that byte contains the VALID and OWNER
-	 * bits which (when set to 0) will invalidate the entire beacon.
 	 */
-	rt2800_register_write(rt2x00dev, HW_BEACON_BASE0, 0);
-	rt2800_register_write(rt2x00dev, HW_BEACON_BASE1, 0);
-	rt2800_register_write(rt2x00dev, HW_BEACON_BASE2, 0);
-	rt2800_register_write(rt2x00dev, HW_BEACON_BASE3, 0);
-	rt2800_register_write(rt2x00dev, HW_BEACON_BASE4, 0);
-	rt2800_register_write(rt2x00dev, HW_BEACON_BASE5, 0);
-	rt2800_register_write(rt2x00dev, HW_BEACON_BASE6, 0);
-	rt2800_register_write(rt2x00dev, HW_BEACON_BASE7, 0);
+	rt2800_clear_beacon(rt2x00dev, HW_BEACON_BASE0);
+	rt2800_clear_beacon(rt2x00dev, HW_BEACON_BASE1);
+	rt2800_clear_beacon(rt2x00dev, HW_BEACON_BASE2);
+	rt2800_clear_beacon(rt2x00dev, HW_BEACON_BASE3);
+	rt2800_clear_beacon(rt2x00dev, HW_BEACON_BASE4);
+	rt2800_clear_beacon(rt2x00dev, HW_BEACON_BASE5);
+	rt2800_clear_beacon(rt2x00dev, HW_BEACON_BASE6);
+	rt2800_clear_beacon(rt2x00dev, HW_BEACON_BASE7);
 
 	if (rt2x00_is_usb(rt2x00dev)) {
 		rt2800_register_read(rt2x00dev, US_CYC_CNT, &reg);
-- 
1.6.6.1


  reply	other threads:[~2010-06-29 19:51 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-29 19:38 [PATCH 01/21] rt2x00: Implement tx mpdu aggregation Ivo van Doorn
2010-06-29 19:38 ` [PATCH 02/21] rt2x00: Write the BSSID to register when interface is added Ivo van Doorn
2010-06-29 19:39   ` [PATCH 03/21] rt2x00: Remove unneeded variable Ivo van Doorn
2010-06-29 19:40     ` [PATCH 04/21] rt2x00: Fix frame dumping for USB devices Ivo van Doorn
2010-06-29 19:40       ` [PATCH 05/21] rt2x00: Move filling of TX URB to rt2x00usb_kick_tx_entry function Ivo van Doorn
2010-06-29 19:41         ` [PATCH 06/21] rt2x00: Merge PCI and USB versions of write_tx_data into single function Ivo van Doorn
2010-06-29 19:41           ` [PATCH 07/21] rt2x00: Move common txdone handling to rt2x00lib_txdone Ivo van Doorn
2010-06-29 19:42             ` [PATCH 08/21] rt2x00: Rename driver write_tx_datadesc callback function Ivo van Doorn
2010-06-29 19:43               ` [PATCH 09/21] rt2x00: Split of TXWI writing to write_tx_data callback in rt2800usb Ivo van Doorn
2010-06-29 19:43                 ` [PATCH 10/21] eeprom_93cx6: Add support for 93c86 EEPROMs Ivo van Doorn
2010-06-29 19:44                   ` [PATCH 11/21] rt2x00: Correctly detect 93C86 EEPROMs in rt2800pci Ivo van Doorn
2010-06-29 19:44                     ` [PATCH 12/21] rt2x00: Align rt2800 EEPROM validation to Ralink vendor driver Ivo van Doorn
2010-06-29 19:45                       ` [PATCH 13/21] rt2x00: Enable multiBSS in rt2800 Ivo van Doorn
2010-06-29 19:46                         ` [PATCH 14/21] rt2x00: Fix beacon updates in rt2800pci Ivo van Doorn
2010-06-29 19:47                           ` [PATCH 15/21] rt2x00: Fix beacon updates in rt61pci Ivo van Doorn
2010-06-29 19:47                             ` [PATCH 16/21] rt2x00: Disable link tuning in AP mode Ivo van Doorn
2010-06-29 19:48                               ` Ivo van Doorn [this message]
2010-06-29 19:48                                 ` [PATCH 18/21] rt2x00: Fix IEEE80211_HT_CAP_RX_STBC assignment Ivo van Doorn
2010-06-29 19:49                                   ` [PATCH 19/21] rt2x00: Fix antenna initialization Ivo van Doorn
2010-06-29 19:49                                     ` [PATCH 20/21] rt2x00: Always set BBP_CSR_CFG_BBP_RW_MODE to 1 Ivo van Doorn
2010-06-29 19:49                                       ` [PATCH 21/21] rt2x00: Fix compile warning when debug disabled Ivo van Doorn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201006292148.07594.IvDoorn@gmail.com \
    --to=ivdoorn@gmail.com \
    --cc=gwingerde@gmail.com \
    --cc=helmut.schaa@googlemail.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    --cc=users@rt2x00.serialmonkey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).