123 lines
4.8 KiB
Diff
123 lines
4.8 KiB
Diff
From sgruszka@redhat.com Wed Oct 20 10:35:00 2010
|
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
To: stable@kernel.org
|
|
Subject: [PATCH -stable 2.6.34 1/2] rt2x00: Disable auto wakeup before waking up device.
|
|
Date: Wed, 20 Oct 2010 16:37:27 +0200
|
|
|
|
From: Gertjan van Wingerde <gwingerde@gmail.com>
|
|
|
|
commit 5731858d0047cad309d334c4cd6ccb6199bf28fe upstream.
|
|
|
|
Together with "rt2x00: Fix failed SLEEP->AWAKE and AWAKE->SLEEP
|
|
transitions" fix kernel oops/hang reported here:
|
|
https://bugzilla.redhat.com/show_bug.cgi?id=642031
|
|
|
|
In all drivers ensure that auto wakeup is disabled before waking up the device.
|
|
This is needed to prevent connection stability issues and problems in waking up
|
|
the device.
|
|
|
|
Based upon a patch from Ondrej Zary <linux@rainbow-software.org>
|
|
|
|
Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com>
|
|
Cc: Ondrej Zary <linux@rainbow-software.org>
|
|
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
|
---
|
|
drivers/net/wireless/rt2x00/rt2400pci.c | 4 ++++
|
|
drivers/net/wireless/rt2x00/rt2500pci.c | 4 ++++
|
|
drivers/net/wireless/rt2x00/rt2500usb.c | 4 ++++
|
|
drivers/net/wireless/rt2x00/rt2800lib.c | 4 ++--
|
|
drivers/net/wireless/rt2x00/rt73usb.c | 6 +++---
|
|
5 files changed, 17 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
|
|
index c22b040..08a4789 100644
|
|
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
|
|
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
|
|
@@ -525,6 +525,10 @@ static void rt2400pci_config_ps(struct rt2x00_dev *rt2x00dev,
|
|
|
|
rt2x00_set_field32(®, CSR20_AUTOWAKE, 1);
|
|
rt2x00pci_register_write(rt2x00dev, CSR20, reg);
|
|
+ } else {
|
|
+ rt2x00pci_register_read(rt2x00dev, CSR20, ®);
|
|
+ rt2x00_set_field32(®, CSR20_AUTOWAKE, 0);
|
|
+ rt2x00pci_register_write(rt2x00dev, CSR20, reg);
|
|
}
|
|
|
|
rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
|
|
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
|
|
index 52bbcf1..d084d70 100644
|
|
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
|
|
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
|
|
@@ -573,6 +573,10 @@ static void rt2500pci_config_ps(struct rt2x00_dev *rt2x00dev,
|
|
|
|
rt2x00_set_field32(®, CSR20_AUTOWAKE, 1);
|
|
rt2x00pci_register_write(rt2x00dev, CSR20, reg);
|
|
+ } else {
|
|
+ rt2x00pci_register_read(rt2x00dev, CSR20, ®);
|
|
+ rt2x00_set_field32(®, CSR20_AUTOWAKE, 0);
|
|
+ rt2x00pci_register_write(rt2x00dev, CSR20, reg);
|
|
}
|
|
|
|
rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
|
|
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
|
|
index ee34c13..c1eec17 100644
|
|
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
|
|
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
|
|
@@ -648,6 +648,10 @@ static void rt2500usb_config_ps(struct rt2x00_dev *rt2x00dev,
|
|
|
|
rt2x00_set_field16(®, MAC_CSR18_AUTO_WAKE, 1);
|
|
rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);
|
|
+ } else {
|
|
+ rt2500usb_register_read(rt2x00dev, MAC_CSR18, ®);
|
|
+ rt2x00_set_field16(®, MAC_CSR18_AUTO_WAKE, 0);
|
|
+ rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg);
|
|
}
|
|
|
|
rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
|
|
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
|
|
index 18d4d8e..d169491 100644
|
|
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
|
|
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
|
|
@@ -1014,13 +1014,13 @@ static void rt2800_config_ps(struct rt2x00_dev *rt2x00dev,
|
|
|
|
rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
|
|
} else {
|
|
- rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
|
|
-
|
|
rt2800_register_read(rt2x00dev, AUTOWAKEUP_CFG, ®);
|
|
rt2x00_set_field32(®, AUTOWAKEUP_CFG_AUTO_LEAD_TIME, 0);
|
|
rt2x00_set_field32(®, AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE, 0);
|
|
rt2x00_set_field32(®, AUTOWAKEUP_CFG_AUTOWAKE, 0);
|
|
rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, reg);
|
|
+
|
|
+ rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
|
|
index 47f3e4a..7ebe14b 100644
|
|
--- a/drivers/net/wireless/rt2x00/rt73usb.c
|
|
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
|
|
@@ -860,15 +860,15 @@ static void rt73usb_config_ps(struct rt2x00_dev *rt2x00dev,
|
|
rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0,
|
|
USB_MODE_SLEEP, REGISTER_TIMEOUT);
|
|
} else {
|
|
- rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0,
|
|
- USB_MODE_WAKEUP, REGISTER_TIMEOUT);
|
|
-
|
|
rt2x00usb_register_read(rt2x00dev, MAC_CSR11, ®);
|
|
rt2x00_set_field32(®, MAC_CSR11_DELAY_AFTER_TBCN, 0);
|
|
rt2x00_set_field32(®, MAC_CSR11_TBCN_BEFORE_WAKEUP, 0);
|
|
rt2x00_set_field32(®, MAC_CSR11_AUTOWAKE, 0);
|
|
rt2x00_set_field32(®, MAC_CSR11_WAKEUP_LATENCY, 0);
|
|
rt2x00usb_register_write(rt2x00dev, MAC_CSR11, reg);
|
|
+
|
|
+ rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0,
|
|
+ USB_MODE_WAKEUP, REGISTER_TIMEOUT);
|
|
}
|
|
}
|
|
|
|
--
|
|
1.7.2.3
|
|
|