Search Linux Wireless

Re: [PATCH] [RFC] rt2500pci: fix powersaving

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.

---
Gertjan
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index c6d3f2c..a7ff006 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -633,9 +633,17 @@ static void rt2500usb_config_ps(struct rt2x00_dev *rt2x00dev,
 	enum dev_state state =
 	    (libconf->conf->flags & IEEE80211_CONF_PS) ?
 		STATE_SLEEP : STATE_AWAKE;
+	struct data_queue *queue;
 	u16 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;
+
 		rt2500usb_register_read(rt2x00dev, MAC_CSR18, &reg);
 		rt2x00_set_field16(&reg, MAC_CSR18_DELAY_AFTER_BEACON,
 				   rt2x00dev->beacon_int - 20);

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux