diff mbox

Slow receive with rtl8192cu (usb ew-7811Un)

Message ID 4DD074E3.3090502@lwfinger.net (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Larry Finger May 16, 2011, 12:50 a.m. UTC
On 05/14/2011 12:01 PM, Rob Browning wrote:
>
> I'm seeing very slow receive rates (~63kb/s) with an EW-7811Un USB
> adapter which appears to load the rtl8192cu driver.  Is that a known
> problem?
>
> I'm currently running the Debian 2.6.39-rc7-amd64 kernel from unstable;
> I believe rc7 may be the first Debian kernel to work with this adapter.
>
> I also needed to patch Debian's firmware-realtek package to include the
> relevant firmware as detailed here:
>
>    http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=625614.
>
> With respect to the connection quality I see:
>
>    Channel:1
>    Frequency:2.412 GHz (Channel 1)
>    Quality=65/70  Signal level=-45 dBm
>
> And during transfers "iw event -t" shows nothing other than the
> occasional scan started/finished pair.

You are using the correct firmware.

Could you please try the attached patch to see if it improves your throughput?

In addition, please file a Bugzilla report for this problem at 
http:bugzilla.kernel.org.

Thanks,

Larry

Comments

Rob Browning May 16, 2011, 2:26 a.m. UTC | #1
Larry Finger <Larry.Finger@lwfinger.net> writes:

> Could you please try the attached patch to see if it improves your
> throughput?

Certainly.  Can I patch one of the linux-wireless trees, or should I get
the source and build the whole kernel?

> In addition, please file a Bugzilla report for this problem at
> http:bugzilla.kernel.org.

Will do.

Thanks
Larry Finger May 16, 2011, 3:39 a.m. UTC | #2
On 05/15/2011 09:26 PM, Rob Browning wrote:
> Larry Finger<Larry.Finger@lwfinger.net>  writes:
>
>> Could you please try the attached patch to see if it improves your
>> throughput?
>
> Certainly.  Can I patch one of the linux-wireless trees, or should I get
> the source and build the whole kernel?
>
>> In addition, please file a Bugzilla report for this problem at
>> http:bugzilla.kernel.org.

You could patch either the linux-2.6 kernel (2.6.39-rc7), the wireless-testing 
git tree, or get the source from your distro. You will have to build the entire 
kernel as I do not have the necessary make files to build the driver as an out 
of kernel module.

Larry
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rob Browning May 16, 2011, 5:18 a.m. UTC | #3
Larry Finger <Larry.Finger@lwfinger.net> writes:

> You could patch either the linux-2.6 kernel (2.6.39-rc7), the
> wireless-testing git tree, or get the source from your distro. You
> will have to build the entire kernel as I do not have the necessary
> make files to build the driver as an out of kernel module.

That patch didn't seem to have an effect -- the receive rate still
settles at about 60Kb/s.

I patched the Debian linux-2.6 source package and rebuilt the kernel.
The Debian kernel appeared to already have the wifi.h diff.

Please let me know if I can help further.

Thanks
Larry Finger May 16, 2011, 3:12 p.m. UTC | #4
On 05/16/2011 12:18 AM, Rob Browning wrote:
> Larry Finger<Larry.Finger@lwfinger.net>  writes:
>
>> You could patch either the linux-2.6 kernel (2.6.39-rc7), the
>> wireless-testing git tree, or get the source from your distro. You
>> will have to build the entire kernel as I do not have the necessary
>> make files to build the driver as an out of kernel module.
>
> That patch didn't seem to have an effect -- the receive rate still
> settles at about 60Kb/s.
>
> I patched the Debian linux-2.6 source package and rebuilt the kernel.
> The Debian kernel appeared to already have the wifi.h diff.
>
> Please let me know if I can help further.

Strange. With that patch in my system running with the current wireless-testing 
kernel, I get 19.8 Mbps download and 17.3 Mbps upload using tcpperf. The box at 
the other end is wired to my router/AP. The wireless connection is configured 
for 270 Mbps, thus rtl8192cu is not driving it at full rates, but that 
performance should be satisfactory.

Please run the following command for a couple of minutes to see what rate you get:

wget 
http://ftp.utexas.edu/opensuse/factory/iso/openSUSE-NET-x86_64-Build0018-Media.iso

That mirror might not be the best one for you to use, but that should be the 
best one to duplicate my results.

On my system, the instantaneous download rate ranges between 250 and 700 K/s. 
Without the patch, the rate is 48 K/s.

Larry
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rob Browning May 17, 2011, 3:41 a.m. UTC | #5
Larry Finger <Larry.Finger@lwfinger.net> writes:

> Strange. With that patch in my system running with the current
> wireless-testing kernel, I get 19.8 Mbps download and 17.3 Mbps upload
> using tcpperf. The box at the other end is wired to my router/AP. The
> wireless connection is configured for 270 Mbps, thus rtl8192cu is not
> driving it at full rates, but that performance should be satisfactory.
>
> Please run the following command for a couple of minutes to see what rate you get:
>
> wget
> http://ftp.utexas.edu/opensuse/factory/iso/openSUSE-NET-x86_64-Build0018-Media.iso

So that command ran at essentially the rates you report for 10-20
seconds.  Then I killed it and tried another test I'd been using, which
was to lftp to ftp.kernel.org and get -c linux-2.6.39-rc7.tar.bz2.  That
transfer started at a high rate, but settled fairly quickly at about
60KB/s.  So I killed that transfer and restarted the wget, and it ran
steadily at ~60KB/s.

One question.  While I'm fairly certain that I'm running your patch,
would there be an easy way for me to be certain?  Perhaps I could add a
log message?

Thanks
Rob Browning May 17, 2011, 3:57 a.m. UTC | #6
Rob Browning <rlb@defaultvalue.org> writes:

> So that command ran at essentially the rates you report for 10-20
> seconds.  Then I killed it and tried another test I'd been using, which
> was to lftp to ftp.kernel.org and get -c linux-2.6.39-rc7.tar.bz2.  That
> transfer started at a high rate, but settled fairly quickly at about
> 60KB/s.  So I killed that transfer and restarted the wget, and it ran
> steadily at ~60KB/s.

In case it helps, it also looks like the 60KB/s is an aggregate limit.
Once it gets into the "lower bandwidth" state, if I run multiple
transfers, the total won't go above that.
Larry Finger May 17, 2011, 4:34 p.m. UTC | #7
On 05/16/2011 10:57 PM, Rob Browning wrote:
> Rob Browning<rlb@defaultvalue.org>  writes:
>
>> So that command ran at essentially the rates you report for 10-20
>> seconds.  Then I killed it and tried another test I'd been using, which
>> was to lftp to ftp.kernel.org and get -c linux-2.6.39-rc7.tar.bz2.  That
>> transfer started at a high rate, but settled fairly quickly at about
>> 60KB/s.  So I killed that transfer and restarted the wget, and it ran
>> steadily at ~60KB/s.
>
> In case it helps, it also looks like the 60KB/s is an aggregate limit.
> Once it gets into the "lower bandwidth" state, if I run multiple
> transfers, the total won't go above that.

I can duplicate your result. To me, it appears to be a problem with bufferbloat. 
If that is correct, then there is little I can do with rtl8192cu to fix the 
problem. I see exactly the same slow rate with rt2800usb using an Ralink RT3070 
device. In addition, I see that rate when connected to my router with a wired 
100 Mbps connection.

What up/down rates do you see if you test with www.speedtest.net? I get 0.48 
Mbps up and 12.03 Mbps down. The up rate is a little slower than the 512 Kbps 
that my ISP provides. My nominal down rate is 7 Mbps with burst rates above 10 
if the bandwidth is available. Apparently it was this morning.

Larry
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rob Browning May 17, 2011, 11:04 p.m. UTC | #8
Larry Finger <Larry.Finger@lwfinger.net> writes:

> I can duplicate your result. To me, it appears to be a problem with
> bufferbloat. If that is correct, then there is little I can do with
> rtl8192cu to fix the problem. I see exactly the same slow rate with
> rt2800usb using an Ralink RT3070 device. In addition, I see that rate
> when connected to my router with a wired 100 Mbps connection.

I suppose that's possible, but I get much higher rates (300K/s+) when
connecting to the same AP using the built-in wireless chipset (BCM4322)
from another, very similar laptop, and 6.0Mbps when testing from a third
client.

I also get 800K/s+ when running the wget command you suggested over a
wired connection to my primary router.

Unfortunately, can't double-check the second laptop's wireless rate
right now, but it got 300K/s+ for a long time, and I just tested the
6Mbps client.  It was only when I migrated to the newer laptop and the
rtl8192cu usb adapter that I saw the much slower ~60K/s rate.

Thanks again
Rob Browning May 24, 2011, 6:18 a.m. UTC | #9
I just tested Debian's 2.6.38-1 kernel, and it has the same problem,
though I just noticed something potentially interesting.

Right after booting the system, I started a wget which ran at a steady
800+K/s.  Then I started an "lftp get -c" to grab a kernel image, and
both connections settled at about 400K/s.

After a minute or so, I killed the ftp connection; from then on all
transfers were limited to 60K/s.

Now that I think about it, that's consistent with what I've seen up to
this point.

Hope this helps
Rob Browning June 4, 2011, 8:32 p.m. UTC | #10
Rob Browning <rlb@defaultvalue.org> writes:

> Rob Browning <rlb@defaultvalue.org> writes:
>
>> So that command ran at essentially the rates you report for 10-20
>> seconds.  Then I killed it and tried another test I'd been using, which
>> was to lftp to ftp.kernel.org and get -c linux-2.6.39-rc7.tar.bz2.  That
>> transfer started at a high rate, but settled fairly quickly at about
>> 60KB/s.  So I killed that transfer and restarted the wget, and it ran
>> steadily at ~60KB/s.
>
> In case it helps, it also looks like the 60KB/s is an aggregate limit.
> Once it gets into the "lower bandwidth" state, if I run multiple
> transfers, the total won't go above that.

As another data point, I just tested the same device on a second machine
(a desktop), and saw the same behavior -- initially high transfer rates
trailing off to about 60K/s.

Thanks
Rob Browning June 8, 2011, 2:38 a.m. UTC | #11
Rob Browning <rlb@defaultvalue.org> writes:

> As another data point, I just tested the same device on a second machine
> (a desktop), and saw the same behavior -- initially high transfer rates
> trailing off to about 60K/s.

...and another data point.  Just to be sure it wasn't that particular
usb device, I got another that I think is the same hardware (this time
the Airlink 101), and I see exactly the same behavior.

Next I'll try a different access point -- I'll let you know what I find.
And if there's anything else I can do to help test, please let me know.

Thanks
Rob Browning June 12, 2011, 6:06 p.m. UTC | #12
Rob Browning <rlb@defaultvalue.org> writes:

> Next I'll try a different access point -- I'll let you know what I find.
> And if there's anything else I can do to help test, please let me know.

Instead, I was able to test an ath9k_htc based adapter (netgear n150),
which doesn't appear to have trouble in the same environment, but I'd
still prefer to use the much smaller rtl8192cu device if we can figure
out what's wrong.

Thanks
Rob Browning July 10, 2011, 8:24 p.m. UTC | #13
Rob Browning <rlb@defaultvalue.org> writes:

> Instead, I was able to test an ath9k_htc based adapter (netgear n150),
> which doesn't appear to have trouble in the same environment, but I'd
> still prefer to use the much smaller rtl8192cu device if we can figure
> out what's wrong.

Actually, I just realized I quoted the wrong model number above.  The
device that works well is the WNA1100.

The rtl8192cu devices still struggle, after a short initial period of
reasonable behavior.

Thanks
diff mbox

Patch

Index: linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c
===================================================================
--- linux-2.6.orig/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c
+++ linux-2.6/drivers/net/wireless/rtlwifi/rtl8192cu/dm.c
@@ -34,6 +34,27 @@ 
 #include "phy.h"
 #include "dm.h"
 
+static void _rtl92c_dm_restore_power_index(struct ieee80211_hw *hw)
+{
+	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	u8 index;
+	u32 power_index_reg[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
+
+	for(index = 0; index< 6; index++)
+		rtl_write_byte(rtlpriv, power_index_reg[index],
+			       rtlpriv->dm.power_index_backup[index]);
+}
+
+static void _rtl92c_dm_write_power_index(struct ieee80211_hw *hw,u8 value)
+{
+	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	u8 index;
+	u32 power_index_reg[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
+
+	for(index = 0; index< 6; index++)
+		rtl_write_byte(rtlpriv, power_index_reg[index], value);
+}
+
 void rtl92cu_dm_dynamic_txpower(struct ieee80211_hw *hw)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -107,6 +128,17 @@  void rtl92cu_dm_dynamic_txpower(struct i
 			 ("PHY_SetTxPowerLevel8192S() Channel = %d\n",
 			  rtlphy->current_channel));
 		rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
+
+		if(rtlpriv->dm.dynamic_txhighpower_lvl == TXHIGHPWRLEVEL_NORMAL)
+			/* HP1 -> Normal  or HP2 -> Normal */
+			 _rtl92c_dm_restore_power_index(hw);
+		else if(rtlpriv->dm.dynamic_txhighpower_lvl ==
+			TXHIGHPWRLEVEL_LEVEL1)
+			_rtl92c_dm_write_power_index(hw,0x14);
+		else if(rtlpriv->dm.dynamic_txhighpower_lvl ==
+			TXHIGHPWRLEVEL_LEVEL2)
+			_rtl92c_dm_write_power_index(hw,0x10);
+
 	}
 
 	rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
Index: linux-2.6/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
===================================================================
--- linux-2.6.orig/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
+++ linux-2.6/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
@@ -503,11 +503,33 @@  static void rtl92c_dm_dig(struct ieee802
 
 }
 
+static void _rtl92c_dm_save_power_index(struct ieee80211_hw *hw)
+{
+	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	u8 index;
+	u32 power_index_reg[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
+
+	for(index = 0; index< 6; index++)
+		rtlpriv->dm.power_index_backup[index] =
+				 rtl_read_byte(rtlpriv, power_index_reg[index]);
+}
+
 static void rtl92c_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
+	struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
 
-	rtlpriv->dm.dynamic_txpower_enable = false;
+	if (rtlhal->interface == INTF_PCI) {
+		rtlpriv->dm.dynamic_txpower_enable = false;
+	} else {
+		if (rtlefuse->external_pa) {
+			_rtl92c_dm_save_power_index(hw);
+			rtlpriv->dm.dynamic_txpower_enable = true;
+		} else {
+			rtlpriv->dm.dynamic_txpower_enable = false;
+		}
+	}
 
 	rtlpriv->dm.last_dtp_lvl = TXHIGHPWRLEVEL_NORMAL;
 	rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
@@ -541,8 +563,6 @@  static void rtl92c_dm_pwdb_monitor(struc
 
 	u8 h2c_parameter[3] = { 0 };
 
-	return;
-
 	if (tmpentry_max_pwdb != 0) {
 		rtlpriv->dm.entry_max_undecoratedsmoothed_pwdb =
 		    tmpentry_max_pwdb;
Index: linux-2.6/drivers/net/wireless/rtlwifi/wifi.h
===================================================================
--- linux-2.6.orig/drivers/net/wireless/rtlwifi/wifi.h
+++ linux-2.6/drivers/net/wireless/rtlwifi/wifi.h
@@ -1105,6 +1105,7 @@  struct rtl_dm {
 	bool disable_tx_int;
 	char ofdm_index[2];
 	char cck_index;
+	u8 power_index_backup[6];
 };
 
 #define	EFUSE_MAX_LOGICAL_SIZE			256