diff mbox

mwl8k: remove nonstandard rate 72 Mbps

Message ID 1365941518-4963-1-git-send-email-jogo@openwrt.org (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Jonas Gorski April 14, 2013, 12:11 p.m. UTC
This rate causes an overflow in the extended rates IE's data rate field,
with the overflowing bit setting the Basic Rate Set membership. This
results in a bogus 8 Mpbs basic rate, making clients checking them refuse
association.

Since the rate is likely unused anyway (HT will yield better rates between
supporting chips), we can just remove it.

This fixes association from wpa_supplicant and Android 4.x and newer.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
---
Changes from RFC -> v1
 * only remove 72 Mbps, as that's the problematic one
 * reword everything, add real cause

 drivers/net/wireless/mwl8k.c |   10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

Comments

yogeshp April 15, 2013, 6:38 a.m. UTC | #1
On Sun, Apr 14, 2013 at 05:11:58AM -0700, Jonas Gorski wrote:
> This rate causes an overflow in the extended rates IE's data rate field,
> with the overflowing bit setting the Basic Rate Set membership. This
> results in a bogus 8 Mpbs basic rate, making clients checking them refuse
> association.
> 
> Since the rate is likely unused anyway (HT will yield better rates between
> supporting chips), we can just remove it.
> 
> This fixes association from wpa_supplicant and Android 4.x and newer.

Hi Jonas,

If you are using hostapd, have you tried using 'supported_rates' and/or
'basic_rates' being set to correct rates in the hostapd.conf.

Thanks
Yogesh
--
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
Jonas Gorski April 15, 2013, 7:53 a.m. UTC | #2
On Mon, 15 Apr 2013 12:08:38 +0530
Yogesh Ashok Powar <yogeshp@marvell.com> wrote:

> On Sun, Apr 14, 2013 at 05:11:58AM -0700, Jonas Gorski wrote:
> > This rate causes an overflow in the extended rates IE's data rate
> > field, with the overflowing bit setting the Basic Rate Set
> > membership. This results in a bogus 8 Mpbs basic rate, making
> > clients checking them refuse association.
> > 
> > Since the rate is likely unused anyway (HT will yield better rates
> > between supporting chips), we can just remove it.
> > 
> > This fixes association from wpa_supplicant and Android 4.x and
> > newer.
> 
> Hi Jonas,
> 
> If you are using hostapd, have you tried using 'supported_rates'
> and/or 'basic_rates' being set to correct rates in the hostapd.conf.

Not sure if that helps. The main problem is that this rate is
unadvertisable in Beacons, as (Extended) Supported Rates (802.11-2012
8.4.2.3) encodes the rates as u8, with seven bits for the rate in units
of 500 kb/s, which isn't enough for 72 Mbps; the maximum is 63.5 Mbps.
The result is that it spills into the MSB, marking it as a "Basic Rate"
even though it isn't marked as such by hostapd. It's just that 72 Mbps
=> 0x90 => "8 Mbps, Basic Rate".
This is partially a bug in hostapd, it should probably reject rates not
encodable.
So AFAICT the only way to use it in hostapd is to not use it.

Which makes me wonder how or if this rate is usable at all in 802.11
context, without a proprietary way of telling the other end that this
rate is available, and therefore if it even makes sense to keep.


Jonas
--
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
diff mbox

Patch

diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
index ee1778c..6820fce 100644
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
@@ -193,10 +193,10 @@  struct mwl8k_priv {
 	struct rxd_ops *rxd_ops;
 	struct ieee80211_supported_band band_24;
 	struct ieee80211_channel channels_24[14];
-	struct ieee80211_rate rates_24[14];
+	struct ieee80211_rate rates_24[13];
 	struct ieee80211_supported_band band_50;
 	struct ieee80211_channel channels_50[4];
-	struct ieee80211_rate rates_50[9];
+	struct ieee80211_rate rates_50[8];
 	u32 ap_macids_supported;
 	u32 sta_macids_supported;
 
@@ -366,7 +366,6 @@  static const struct ieee80211_rate mwl8k_rates_24[] = {
 	{ .bitrate = 360, .hw_value = 72, },
 	{ .bitrate = 480, .hw_value = 96, },
 	{ .bitrate = 540, .hw_value = 108, },
-	{ .bitrate = 720, .hw_value = 144, },
 };
 
 static const struct ieee80211_channel mwl8k_channels_50[] = {
@@ -385,7 +384,6 @@  static const struct ieee80211_rate mwl8k_rates_50[] = {
 	{ .bitrate = 360, .hw_value = 72, },
 	{ .bitrate = 480, .hw_value = 96, },
 	{ .bitrate = 540, .hw_value = 108, },
-	{ .bitrate = 720, .hw_value = 144, },
 };
 
 /* Set or get info from Firmware */
@@ -3083,11 +3081,11 @@  static void legacy_rate_mask_to_array(u8 *rates, u32 mask)
 	int j;
 
 	/*
-	 * Clear nonstandard rates 4 and 13.
+	 * Clear nonstandard rate 4.
 	 */
 	mask &= 0x1fef;
 
-	for (i = 0, j = 0; i < 14; i++) {
+	for (i = 0, j = 0; i < 13; i++) {
 		if (mask & (1 << i))
 			rates[j++] = mwl8k_rates_24[i].hw_value;
 	}