On 03/31/10 20:38, Gertjan van Wingerde wrote: > On 03/31/10 19:41, Matthijs Kooijman wrote: >> Hi Ondrej, >> >>> phy0 -> rt2500pci_set_device_state: Error - Device failed to enter state 1 (-16). >> I've been running with your patches (applied to 2.6.32.7) for a day of normal >> work, and the steady stream of these errors has stopped. During the entire >> day, I've seen the error once, perhaps a corner case here or there? >> >> Overall, I have the feeling that connectivity is a bit more unstable with >> these two patches, however. On a few occasions, my SSH connections would hang >> for a bit. Sometimes pinging would be ok (and sometimes it wouldn't), so I >> haven't quite figured out if these problems were actually caused by the >> driver, or some other cause). Once I seemd to solve the problem by turning off >> powersaving, but that might have been a coincidence. Other times the problems >> went away by themselves. >> >> Is there anything else I can do at the moment I'm seeing connection problems? >> Make a register dump or check some command? >> >> I'll do some more testing, tonight on another (probably more stable) >> connection. > > Could you try the attached patch on top of Ondrej's? > > The legacy Ralink drivers do not go to sleep when there are still active entries > in the TX queues. This patch mimics that behavior by refusing to go to sleep if > there still are active entries in any of the TX queues. Sorry, I got confused on which driver we were working on. Find attached the correct patch, now for the rt2500pci driver instead of the rt2500usb driver. --- Gertjan
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index b0c9502..a0441fa 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c @@ -558,9 +558,17 @@ static void rt2500pci_config_ps(struct rt2x00_dev *rt2x00dev, enum dev_state state = (libconf->conf->flags & IEEE80211_CONF_PS) ? STATE_SLEEP : STATE_AWAKE; + struct data_queue *queue; u32 reg; if (state == STATE_SLEEP) { + /* + * Don't go to sleep when the TX queues are not empty. + */ + tx_queue_for_each(rt2x00dev, queue) + if (!rt2x00queue_empty(queue)) + return; + rt2x00pci_register_read(rt2x00dev, CSR20, ®); rt2x00_set_field32(®, CSR20_DELAY_AFTER_TBCN, (rt2x00dev->beacon_int - 20) * 16);