Commit aa776721 authored by Ivo van Doorn's avatar Ivo van Doorn Committed by John W. Linville

rt2x00: Fix basic rate initialization

The basic rate which is configured in the register
should not match all supported rates, but only the _basic_ rates.

Fix this by adding a new flag to the rt2x00_rate structure
and whenever the mode is changed, loop over all available rates
for that band to get the basic rate mask.
Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent fd3c91c5
...@@ -441,8 +441,8 @@ struct rt2x00lib_conf { ...@@ -441,8 +441,8 @@ struct rt2x00lib_conf {
enum ieee80211_band band; enum ieee80211_band band;
int basic_rates; u32 basic_rates;
int slot_time; u32 slot_time;
short sifs; short sifs;
short pifs; short pifs;
......
...@@ -145,12 +145,26 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, ...@@ -145,12 +145,26 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK); rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK);
} }
static u32 rt2x00lib_get_basic_rates(struct ieee80211_supported_band *band)
{
const struct rt2x00_rate *rate;
unsigned int i;
u32 mask = 0;
for (i = 0; i < band->n_bitrates; i++) {
rate = rt2x00_get_rate(band->bitrates[i].hw_value);
if (rate->flags & DEV_RATE_BASIC)
mask |= rate->ratemask;
}
return mask;
}
void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
struct ieee80211_conf *conf, const int force_config) struct ieee80211_conf *conf, const int force_config)
{ {
struct rt2x00lib_conf libconf; struct rt2x00lib_conf libconf;
struct ieee80211_supported_band *band; struct ieee80211_supported_band *band;
struct ieee80211_rate *rate;
struct antenna_setup *default_ant = &rt2x00dev->default_ant; struct antenna_setup *default_ant = &rt2x00dev->default_ant;
struct antenna_setup *active_ant = &rt2x00dev->link.ant.active; struct antenna_setup *active_ant = &rt2x00dev->link.ant.active;
int flags = 0; int flags = 0;
...@@ -227,10 +241,9 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, ...@@ -227,10 +241,9 @@ void rt2x00lib_config(struct rt2x00_dev *rt2x00dev,
if (flags & CONFIG_UPDATE_PHYMODE) { if (flags & CONFIG_UPDATE_PHYMODE) {
band = &rt2x00dev->bands[conf->channel->band]; band = &rt2x00dev->bands[conf->channel->band];
rate = &band->bitrates[band->n_bitrates - 1];
libconf.band = conf->channel->band; libconf.band = conf->channel->band;
libconf.basic_rates = rt2x00_get_rate(rate->hw_value)->ratemask; libconf.basic_rates = rt2x00lib_get_basic_rates(band);
} }
if (flags & CONFIG_UPDATE_CHANNEL) { if (flags & CONFIG_UPDATE_CHANNEL) {
......
...@@ -766,75 +766,75 @@ EXPORT_SYMBOL_GPL(rt2x00lib_write_tx_desc); ...@@ -766,75 +766,75 @@ EXPORT_SYMBOL_GPL(rt2x00lib_write_tx_desc);
*/ */
const struct rt2x00_rate rt2x00_supported_rates[12] = { const struct rt2x00_rate rt2x00_supported_rates[12] = {
{ {
.flags = DEV_RATE_CCK, .flags = DEV_RATE_CCK | DEV_RATE_BASIC,
.bitrate = 10, .bitrate = 10,
.ratemask = DEV_RATEMASK_1MB, .ratemask = BIT(0),
.plcp = 0x00, .plcp = 0x00,
}, },
{ {
.flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE, .flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE | DEV_RATE_BASIC,
.bitrate = 20, .bitrate = 20,
.ratemask = DEV_RATEMASK_2MB, .ratemask = BIT(1),
.plcp = 0x01, .plcp = 0x01,
}, },
{ {
.flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE, .flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE | DEV_RATE_BASIC,
.bitrate = 55, .bitrate = 55,
.ratemask = DEV_RATEMASK_5_5MB, .ratemask = BIT(2),
.plcp = 0x02, .plcp = 0x02,
}, },
{ {
.flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE, .flags = DEV_RATE_CCK | DEV_RATE_SHORT_PREAMBLE | DEV_RATE_BASIC,
.bitrate = 110, .bitrate = 110,
.ratemask = DEV_RATEMASK_11MB, .ratemask = BIT(3),
.plcp = 0x03, .plcp = 0x03,
}, },
{ {
.flags = DEV_RATE_OFDM, .flags = DEV_RATE_OFDM | DEV_RATE_BASIC,
.bitrate = 60, .bitrate = 60,
.ratemask = DEV_RATEMASK_6MB, .ratemask = BIT(4),
.plcp = 0x0b, .plcp = 0x0b,
}, },
{ {
.flags = DEV_RATE_OFDM, .flags = DEV_RATE_OFDM,
.bitrate = 90, .bitrate = 90,
.ratemask = DEV_RATEMASK_9MB, .ratemask = BIT(5),
.plcp = 0x0f, .plcp = 0x0f,
}, },
{ {
.flags = DEV_RATE_OFDM, .flags = DEV_RATE_OFDM | DEV_RATE_BASIC,
.bitrate = 120, .bitrate = 120,
.ratemask = DEV_RATEMASK_12MB, .ratemask = BIT(6),
.plcp = 0x0a, .plcp = 0x0a,
}, },
{ {
.flags = DEV_RATE_OFDM, .flags = DEV_RATE_OFDM,
.bitrate = 180, .bitrate = 180,
.ratemask = DEV_RATEMASK_18MB, .ratemask = BIT(7),
.plcp = 0x0e, .plcp = 0x0e,
}, },
{ {
.flags = DEV_RATE_OFDM, .flags = DEV_RATE_OFDM | DEV_RATE_BASIC,
.bitrate = 240, .bitrate = 240,
.ratemask = DEV_RATEMASK_24MB, .ratemask = BIT(8),
.plcp = 0x09, .plcp = 0x09,
}, },
{ {
.flags = DEV_RATE_OFDM, .flags = DEV_RATE_OFDM,
.bitrate = 360, .bitrate = 360,
.ratemask = DEV_RATEMASK_36MB, .ratemask = BIT(9),
.plcp = 0x0d, .plcp = 0x0d,
}, },
{ {
.flags = DEV_RATE_OFDM, .flags = DEV_RATE_OFDM,
.bitrate = 480, .bitrate = 480,
.ratemask = DEV_RATEMASK_48MB, .ratemask = BIT(10),
.plcp = 0x08, .plcp = 0x08,
}, },
{ {
.flags = DEV_RATE_OFDM, .flags = DEV_RATE_OFDM,
.bitrate = 540, .bitrate = 540,
.ratemask = DEV_RATEMASK_54MB, .ratemask = BIT(11),
.plcp = 0x0c, .plcp = 0x0c,
}, },
}; };
......
...@@ -41,22 +41,10 @@ struct rt2x00_rate { ...@@ -41,22 +41,10 @@ struct rt2x00_rate {
#define DEV_RATE_CCK 0x0001 #define DEV_RATE_CCK 0x0001
#define DEV_RATE_OFDM 0x0002 #define DEV_RATE_OFDM 0x0002
#define DEV_RATE_SHORT_PREAMBLE 0x0004 #define DEV_RATE_SHORT_PREAMBLE 0x0004
#define DEV_RATE_BASIC 0x0008
unsigned short bitrate; /* In 100kbit/s */ unsigned short bitrate; /* In 100kbit/s */
unsigned short ratemask; unsigned short ratemask;
#define DEV_RATEMASK_1MB ( (1 << 1) - 1 )
#define DEV_RATEMASK_2MB ( (1 << 2) - 1 )
#define DEV_RATEMASK_5_5MB ( (1 << 3) - 1 )
#define DEV_RATEMASK_11MB ( (1 << 4) - 1 )
#define DEV_RATEMASK_6MB ( (1 << 5) - 1 )
#define DEV_RATEMASK_9MB ( (1 << 6) - 1 )
#define DEV_RATEMASK_12MB ( (1 << 7) - 1 )
#define DEV_RATEMASK_18MB ( (1 << 8) - 1 )
#define DEV_RATEMASK_24MB ( (1 << 9) - 1 )
#define DEV_RATEMASK_36MB ( (1 << 10) - 1 )
#define DEV_RATEMASK_48MB ( (1 << 11) - 1 )
#define DEV_RATEMASK_54MB ( (1 << 12) - 1 )
unsigned short plcp; unsigned short plcp;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment