>From Ivo van Doorn <[EMAIL PROTECTED]>
Fix problems with waking up the device at initialization time.
The debug message should be more descriptive of the problem,
when the device fails to wake up.
Signed-off-by: Ivo van Doorn <[EMAIL PROTECTED]>
---
diff -rU3 wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
--- wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
2006-07-23
18:16:35.000000000 +0200
+++ wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
2006-07-23 18:34:06.000000000 +0200
@@ -857,7 +857,9 @@
msleep(10);
}
- NOTICE("Device failed to %s.\n" , put_to_sleep ? "suspend" : "resume");
+ NOTICE("Device failed to enter state %d, "
+ "current device state: bbp %d and rf %d.\n",
+ state, bbp_state, rf_state);
return -EBUSY;
}
diff -rU3 wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
--- wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
2006-07-23
18:16:41.000000000 +0200
+++ wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
2006-07-23 18:34:14.000000000 +0200
@@ -930,7 +930,9 @@
msleep(10);
}
- NOTICE("Device failed to %s.\n" , put_to_sleep ? "suspend" : "resume");
+ NOTICE("Device failed to enter state %d, "
+ "current device state: bbp %d and rf %d.\n",
+ state, bbp_state, rf_state);
return -EBUSY;
}
diff -rU3 wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
--- wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
2006-07-23
18:15:52.000000000 +0200
+++ wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
2006-07-23 18:36:12.000000000 +0200
@@ -731,6 +731,7 @@
enum dev_state state)
{
u16 reg;
+ u16 reg2;
unsigned int i;
char put_to_sleep;
char bbp_state;
@@ -739,11 +740,12 @@
put_to_sleep = (state != STATE_AWAKE);
rt2x00_register_read(rt2x00dev, MAC_CSR17, ®);
- rt2x00_set_field16_nb(®, MAC_CSR17_SET_STATE, 1);
rt2x00_set_field16_nb(®, MAC_CSR17_BBP_DESIRE_STATE, state);
rt2x00_set_field16_nb(®, MAC_CSR17_RF_DESIRE_STATE, state);
rt2x00_set_field16_nb(®, MAC_CSR17_PUT_TO_SLEEP, put_to_sleep);
rt2x00_register_write(rt2x00dev, MAC_CSR17, reg);
+ rt2x00_set_field16_nb(®, MAC_CSR17_SET_STATE, 1);
+ rt2x00_register_write(rt2x00dev, MAC_CSR17, reg);
/*
* Device is not guarenteed to be in the requested state yet.
@@ -751,16 +753,20 @@
* device has entered the correct state.
*/
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
- rt2x00_register_read(rt2x00dev, MAC_CSR17, ®);
- bbp_state = rt2x00_get_field16_nb(
- reg, MAC_CSR17_BBP_CURR_STATE);
- rf_state = rt2x00_get_field16_nb(reg, MAC_CSR17_RF_CURR_STATE);
+ rt2x00_register_read(rt2x00dev, MAC_CSR17, ®2);
+ bbp_state = rt2x00_get_field16_nb(reg2,
+ MAC_CSR17_BBP_CURR_STATE);
+ rf_state = rt2x00_get_field16_nb(reg2,
+ MAC_CSR17_RF_CURR_STATE);
if (bbp_state == state && rf_state == state)
return 0;
+ rt2x00_register_write(rt2x00dev, MAC_CSR17, reg);
msleep(10);
}
- NOTICE("Device failed to %s.\n" , put_to_sleep ? "suspend" : "resume");
+ NOTICE("Device failed to enter state %d, "
+ "current device state: bbp %d and rf %d.\n",
+ state, bbp_state, rf_state);
return -EBUSY;
}
diff -rU3 wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt61pci.c
wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt61pci.c
--- wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt61pci.c
2006-07-23
18:16:51.000000000 +0200
+++ wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt61pci.c
2006-07-23
19:22:41.000000000 +0200
@@ -1169,19 +1169,33 @@
u32 reg;
unsigned int i;
char put_to_sleep;
+ char current_state;
put_to_sleep = (state != STATE_AWAKE);
- if (!put_to_sleep)
- rt2x00_mcu_request(rt2x00dev, MCU_WAKEUP, 0xff, 0x00, 0x00);
-
rt2x00_register_read(rt2x00dev, MAC_CSR12, ®);
rt2x00_set_field32(®, MAC_CSR12_FORCE_WAKEUP, !put_to_sleep);
rt2x00_set_field32(®, MAC_CSR12_PUT_TO_SLEEP, put_to_sleep);
rt2x00_register_write(rt2x00dev, MAC_CSR12, reg);
- if (put_to_sleep)
+ if (put_to_sleep) {
+ rt2x00_register_write(rt2x00dev,
+ SOFT_RESET_CSR, cpu_to_le32(0x00000005));
+ rt2x00_register_write(rt2x00dev,
+ IO_CNTL_CSR, cpu_to_le32(0x0000001c));
+ rt2x00_register_write(rt2x00dev,
+ PCI_USEC_CSR, cpu_to_le32(0x00000060));
+
rt2x00_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0x00, 0x00);
+ } else {
+ rt2x00_register_write(rt2x00dev,
+ SOFT_RESET_CSR, cpu_to_le32(0x00000007));
+ rt2x00_register_write(rt2x00dev,
+ IO_CNTL_CSR, cpu_to_le32(0x00000018));
+ rt2x00_register_write(rt2x00dev,
+ PCI_USEC_CSR, cpu_to_le32(0x00000020));
+ rt2x00_mcu_request(rt2x00dev, MCU_WAKEUP, 0xff, 0x00, 0x00);
+ }
/*
* Device is not guarenteed to be in the requested state yet.
@@ -1190,13 +1204,15 @@
*/
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
rt2x00_register_read(rt2x00dev, MAC_CSR12, ®);
- if (rt2x00_get_field32(
- reg, MAC_CSR12_CURRENT_STATE) == !put_to_sleep)
+ current_state = rt2x00_get_field32(reg,
+ MAC_CSR12_BBP_CURRENT_STATE);
+ if (current_state == !put_to_sleep)
return 0;
msleep(10);
}
- NOTICE("Device failed to %s.\n" , put_to_sleep ? "suspend" : "resume");
+ NOTICE("Device failed to enter state %d, "
+ "current device state %d.\n", !put_to_sleep, current_state);
return -EBUSY;
}
diff -rU3 wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt61pci.h
wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt61pci.h
--- wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt61pci.h
2006-07-23
17:16:49.000000000 +0200
+++ wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt61pci.h
2006-07-23
18:33:18.000000000 +0200
@@ -311,11 +311,13 @@
* MAC_CSR12: Manual power control / status register (merge CSR20 & PWRCSR1).
* CURRENT_STATE: 0:sleep, 1:awake.
* FORCE_WAKEUP: This has higher priority than PUT_TO_SLEEP.
+ * BBP_CURRENT_STATE: 0: BBP sleep, 1: BBP awake.
*/
#define MAC_CSR12 0x3030
#define MAC_CSR12_CURRENT_STATE FIELD32(0x00000001)
#define MAC_CSR12_PUT_TO_SLEEP FIELD32(0x00000002)
#define MAC_CSR12_FORCE_WAKEUP FIELD32(0x00000004)
+#define MAC_CSR12_BBP_CURRENT_STATE FIELD32(0x00000008)
/*
* MAC_CSR13: GPIO.
diff -rU3 wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt73usb.c
wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt73usb.c
--- wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt73usb.c
2006-07-23
18:17:01.000000000 +0200
+++ wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt73usb.c
2006-07-23
19:23:14.000000000 +0200
@@ -895,6 +895,7 @@
u32 reg;
unsigned int i;
char put_to_sleep;
+ char current_state;
put_to_sleep = (state != STATE_AWAKE);
@@ -920,13 +921,15 @@
*/
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
rt2x00_register_read(rt2x00dev, MAC_CSR12, ®);
- if (rt2x00_get_field32(
- reg, MAC_CSR12_CURRENT_STATE) == !put_to_sleep)
+ current_state = rt2x00_get_field32(reg,
+ MAC_CSR12_BBP_CURRENT_STATE);
+ if (current_state == !put_to_sleep)
return 0;
msleep(10);
}
- NOTICE("Device failed to %s.\n" , put_to_sleep ? "suspend" : "resume");
+ NOTICE("Device failed to enter state %d, "
+ "current device state %d.\n", !put_to_sleep, current_state);
return -EBUSY;
}
diff -rU3 wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt73usb.h
wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt73usb.h
--- wireless-dev-rts/drivers/net/wireless/d80211/rt2x00/rt73usb.h
2006-07-23
17:17:09.000000000 +0200
+++ wireless-dev-state/drivers/net/wireless/d80211/rt2x00/rt73usb.h
2006-07-23
18:33:18.000000000 +0200
@@ -218,11 +218,13 @@
* MAC_CSR12: Manual power control / status register (merge CSR20 & PWRCSR1).
* CURRENT_STATE: 0:sleep, 1:awake.
* FORCE_WAKEUP: This has higher priority than PUT_TO_SLEEP.
+ * BBP_CURRENT_STATE: 0: BBP sleep, 1: BBP awake.
*/
#define MAC_CSR12 0x3030
#define MAC_CSR12_CURRENT_STATE FIELD32(0x00000001)
#define MAC_CSR12_PUT_TO_SLEEP FIELD32(0x00000002)
#define MAC_CSR12_FORCE_WAKEUP FIELD32(0x00000004)
+#define MAC_CSR12_BBP_CURRENT_STATE FIELD32(0x00000008)
/*
* MAC_CSR13: GPIO.
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html