[LUCID SRU] Bug#539794 [PATCH] rt2x00: Fix failed SLEEP->AWAKE and AWAKE->SLEEP transitions.

Manoj Iyer manoj.iyer at canonical.com
Wed Jun 30 18:56:18 UTC 2010


SRU Justification: rt2500pci wireless regression in lucid causes wireless 
not to work. Network manager does not display any wireless networks. After 
about 5 minutes, the main home wireless network is sometimes displayed. 
However no other wireless networks is displayed.

TEST: Originator has tested the patch reports some success in #38 on bug 
report.

FIX: Ralink devices do not properly go to sleep or wake up, with timeouts 
occurring. Fix this by retrying telling the device that it has to wake up 
or sleep. Cherry picked patch from upstream. Fix is driver specific and 
not in common code.

The following changes since commit 
1bb2b36688ab7e879e279667e48e05d118ad0880:
   Manoj Iyer (1):
         rt2x00: Fix failed SLEEP->AWAKE and AWAKE->SLEEP transitions.

are available in the git repository at:

git://kernel.ubuntu.com/manjo/ubuntu-lucid.git  lp539794

>From 1bb2b36688ab7e879e279667e48e05d118ad0880 Mon Sep 17 00:00:00 2001
From: Manoj Iyer <manoj.iyer at canonical.com>
Date: Thu, 13 May 2010 21:16:03 +0200
Subject: [PATCH] rt2x00: Fix failed SLEEP->AWAKE and AWAKE->SLEEP transitions.

(Based on a patch created by Ondrej Zary)

In some circumstances the Ralink devices do not properly go to sleep
or wake up, with timeouts occurring.
Fix this by retrying telling the device that it has to wake up or
sleep.

Signed-off-by: Gertjan van Wingerde <gwingerde at gmail.com>
Acked-by: Ivo van Doorn <IvDoorn at gmail.com>
Signed-off-by: John W. Linville <linville at tuxdriver.com>
(cherry picked from commit 9655a6ec19ca656af246fb80817aa337892aefbf)

Signed-off-by: Manoj Iyer <manoj.iyer at canonical.com>

BugLink: http://launchpad.net/bugs/539794
---
  drivers/net/wireless/rt2x00/rt2400pci.c |    9 +++++----
  drivers/net/wireless/rt2x00/rt2500pci.c |    9 +++++----
  drivers/net/wireless/rt2x00/rt61pci.c   |    7 ++++---
  drivers/net/wireless/rt2x00/rt73usb.c   |    7 ++++---
  4 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 4020bad..37475e8 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -925,7 +925,7 @@ static void rt2400pci_disable_radio(struct rt2x00_dev *rt2x00dev)
  static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
  			       enum dev_state state)
  {
-	u32 reg;
+	u32 reg, reg2;
  	unsigned int i;
  	char put_to_sleep;
  	char bbp_state;
@@ -946,11 +946,12 @@ static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
  	 * device has entered the correct state.
  	 */
  	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
-		rt2x00pci_register_read(rt2x00dev, PWRCSR1, &reg);
-		bbp_state = rt2x00_get_field32(reg, PWRCSR1_BBP_CURR_STATE);
-		rf_state = rt2x00_get_field32(reg, PWRCSR1_RF_CURR_STATE);
+		rt2x00pci_register_read(rt2x00dev, PWRCSR1, &reg2);
+		bbp_state = rt2x00_get_field32(reg2, PWRCSR1_BBP_CURR_STATE);
+		rf_state = rt2x00_get_field32(reg2, PWRCSR1_RF_CURR_STATE);
  		if (bbp_state == state && rf_state == state)
  			return 0;
+		rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
  		msleep(10);
  	}

diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 8f15e41..30526f0 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1084,7 +1084,7 @@ static void rt2500pci_disable_radio(struct rt2x00_dev *rt2x00dev)
  static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
  			       enum dev_state state)
  {
-	u32 reg;
+	u32 reg, reg2;
  	unsigned int i;
  	char put_to_sleep;
  	char bbp_state;
@@ -1105,11 +1105,12 @@ static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
  	 * device has entered the correct state.
  	 */
  	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
-		rt2x00pci_register_read(rt2x00dev, PWRCSR1, &reg);
-		bbp_state = rt2x00_get_field32(reg, PWRCSR1_BBP_CURR_STATE);
-		rf_state = rt2x00_get_field32(reg, PWRCSR1_RF_CURR_STATE);
+		rt2x00pci_register_read(rt2x00dev, PWRCSR1, &reg2);
+		bbp_state = rt2x00_get_field32(reg2, PWRCSR1_BBP_CURR_STATE);
+		rf_state = rt2x00_get_field32(reg2, PWRCSR1_RF_CURR_STATE);
  		if (bbp_state == state && rf_state == state)
  			return 0;
+		rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
  		msleep(10);
  	}

diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 9a6ceb4..68317d7 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -1690,7 +1690,7 @@ static void rt61pci_disable_radio(struct rt2x00_dev *rt2x00dev)

  static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
  {
-	u32 reg;
+	u32 reg, reg2;
  	unsigned int i;
  	char put_to_sleep;

@@ -1707,10 +1707,11 @@ static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
  	 * device has entered the correct state.
  	 */
  	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
-		rt2x00pci_register_read(rt2x00dev, MAC_CSR12, &reg);
-		state = rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE);
+		rt2x00pci_register_read(rt2x00dev, MAC_CSR12, &reg2);
+		state = rt2x00_get_field32(reg2, MAC_CSR12_BBP_CURRENT_STATE);
  		if (state == !put_to_sleep)
  			return 0;
+		rt2x00pci_register_write(rt2x00dev, MAC_CSR12, reg);
  		msleep(10);
  	}

diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 0a0c095..dbf650a 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -1369,7 +1369,7 @@ static void rt73usb_disable_radio(struct rt2x00_dev *rt2x00dev)

  static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
  {
-	u32 reg;
+	u32 reg, reg2;
  	unsigned int i;
  	char put_to_sleep;

@@ -1386,10 +1386,11 @@ static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
  	 * device has entered the correct state.
  	 */
  	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
-		rt2x00usb_register_read(rt2x00dev, MAC_CSR12, &reg);
-		state = rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE);
+		rt2x00usb_register_read(rt2x00dev, MAC_CSR12, &reg2);
+		state = rt2x00_get_field32(reg2, MAC_CSR12_BBP_CURRENT_STATE);
  		if (state == !put_to_sleep)
  			return 0;
+		rt2x00usb_register_write(rt2x00dev, MAC_CSR12, reg);
  		msleep(10);
  	}

-- 
1.7.0.4



Cheers
--- manjo




More information about the kernel-team mailing list