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@gmail.com> Acked-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
3dc3fc52ea
commit
9655a6ec19
|
@ -926,7 +926,7 @@ static void rt2400pci_disable_radio(struct rt2x00_dev *rt2x00dev)
|
||||||
static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
|
static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||||
enum dev_state state)
|
enum dev_state state)
|
||||||
{
|
{
|
||||||
u32 reg;
|
u32 reg, reg2;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
char put_to_sleep;
|
char put_to_sleep;
|
||||||
char bbp_state;
|
char bbp_state;
|
||||||
|
@ -947,11 +947,12 @@ static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||||
* device has entered the correct state.
|
* device has entered the correct state.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||||
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®);
|
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®2);
|
||||||
bbp_state = rt2x00_get_field32(reg, PWRCSR1_BBP_CURR_STATE);
|
bbp_state = rt2x00_get_field32(reg2, PWRCSR1_BBP_CURR_STATE);
|
||||||
rf_state = rt2x00_get_field32(reg, PWRCSR1_RF_CURR_STATE);
|
rf_state = rt2x00_get_field32(reg2, PWRCSR1_RF_CURR_STATE);
|
||||||
if (bbp_state == state && rf_state == state)
|
if (bbp_state == state && rf_state == state)
|
||||||
return 0;
|
return 0;
|
||||||
|
rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
|
||||||
msleep(10);
|
msleep(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1084,7 +1084,7 @@ static void rt2500pci_disable_radio(struct rt2x00_dev *rt2x00dev)
|
||||||
static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
|
static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||||
enum dev_state state)
|
enum dev_state state)
|
||||||
{
|
{
|
||||||
u32 reg;
|
u32 reg, reg2;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
char put_to_sleep;
|
char put_to_sleep;
|
||||||
char bbp_state;
|
char bbp_state;
|
||||||
|
@ -1105,11 +1105,12 @@ static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||||
* device has entered the correct state.
|
* device has entered the correct state.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||||
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®);
|
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®2);
|
||||||
bbp_state = rt2x00_get_field32(reg, PWRCSR1_BBP_CURR_STATE);
|
bbp_state = rt2x00_get_field32(reg2, PWRCSR1_BBP_CURR_STATE);
|
||||||
rf_state = rt2x00_get_field32(reg, PWRCSR1_RF_CURR_STATE);
|
rf_state = rt2x00_get_field32(reg2, PWRCSR1_RF_CURR_STATE);
|
||||||
if (bbp_state == state && rf_state == state)
|
if (bbp_state == state && rf_state == state)
|
||||||
return 0;
|
return 0;
|
||||||
|
rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
|
||||||
msleep(10);
|
msleep(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1689,7 +1689,7 @@ static void rt61pci_disable_radio(struct rt2x00_dev *rt2x00dev)
|
||||||
|
|
||||||
static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
||||||
{
|
{
|
||||||
u32 reg;
|
u32 reg, reg2;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
char put_to_sleep;
|
char put_to_sleep;
|
||||||
|
|
||||||
|
@ -1706,10 +1706,11 @@ static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
||||||
* device has entered the correct state.
|
* device has entered the correct state.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||||
rt2x00pci_register_read(rt2x00dev, MAC_CSR12, ®);
|
rt2x00pci_register_read(rt2x00dev, MAC_CSR12, ®2);
|
||||||
state = rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE);
|
state = rt2x00_get_field32(reg2, MAC_CSR12_BBP_CURRENT_STATE);
|
||||||
if (state == !put_to_sleep)
|
if (state == !put_to_sleep)
|
||||||
return 0;
|
return 0;
|
||||||
|
rt2x00pci_register_write(rt2x00dev, MAC_CSR12, reg);
|
||||||
msleep(10);
|
msleep(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1366,7 +1366,7 @@ static void rt73usb_disable_radio(struct rt2x00_dev *rt2x00dev)
|
||||||
|
|
||||||
static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
||||||
{
|
{
|
||||||
u32 reg;
|
u32 reg, reg2;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
char put_to_sleep;
|
char put_to_sleep;
|
||||||
|
|
||||||
|
@ -1383,10 +1383,11 @@ static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
||||||
* device has entered the correct state.
|
* device has entered the correct state.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||||
rt2x00usb_register_read(rt2x00dev, MAC_CSR12, ®);
|
rt2x00usb_register_read(rt2x00dev, MAC_CSR12, ®2);
|
||||||
state = rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE);
|
state = rt2x00_get_field32(reg2, MAC_CSR12_BBP_CURRENT_STATE);
|
||||||
if (state == !put_to_sleep)
|
if (state == !put_to_sleep)
|
||||||
return 0;
|
return 0;
|
||||||
|
rt2x00usb_register_write(rt2x00dev, MAC_CSR12, reg);
|
||||||
msleep(10);
|
msleep(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue