diff options
| author | Christian Lamparter <chunkeey@web.de> | 2008-10-14 21:30:06 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2008-10-22 18:11:04 -0400 |
| commit | 4cc683c9adbe644323e978bc63b2ab12606bb3c8 (patch) | |
| tree | 704ad578d9c0de182118b2610eed928c803a1991 | |
| parent | 70458259936e723a4ac02c85bdbaf08dc69edfbe (diff) | |
p54: enable 2.4/5GHz spectrum by eeprom bits.
Badness at /home/proski/src/linux-2.6/net/mac80211/rx.c:2200
NIP: c02bc850 LR: c02ab268 CTR: 00000000
REGS: ef01fcc0 TRAP: 0700 Tainted: G W (2.6.27-wl)
MSR: 00029032 <EE,ME,IR,DR> CR: 22004084 XER: 20000000
TASK = c1a58800[1778] 'p54pci' THREAD: ef01e000
[...]
NIP [c02bc850] __ieee80211_rx+0x17c/0x638
LR [c02ab268] ieee80211_tasklet_handler+0x104/0x120
Call Trace:
[ef01fd70] [c1a0c020] 0xc1a0c020 (unreliable)
[ef01fdb0] [c02ab268] ieee80211_tasklet_handler+0x104/0x120
[...]
the problem was that some older cards are mis-identified and didn't support
5GHz rates, while they have the right MAC & Synth chip.
This patch changes the way how p54 decides if it should enable 11a channels
or not.
Reported-by: Pavel Roskin <proski@gnu.org>
Signed-off-by: Christian Lamparter <chunkeey@web.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | drivers/net/wireless/p54/p54common.c | 28 |
1 files changed, 10 insertions, 18 deletions
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index 117c7d3a52b0..2d022f83774c 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
| @@ -306,8 +306,8 @@ static int p54_convert_rev1(struct ieee80211_hw *dev, | |||
| 306 | return 0; | 306 | return 0; |
| 307 | } | 307 | } |
| 308 | 308 | ||
| 309 | static const char *p54_rf_chips[] = { "NULL", "Indigo?", "Duette", | 309 | static const char *p54_rf_chips[] = { "NULL", "Duette3", "Duette2", |
| 310 | "Frisbee", "Xbow", "Longbow" }; | 310 | "Frisbee", "Xbow", "Longbow", "NULL", "NULL" }; |
| 311 | static int p54_init_xbow_synth(struct ieee80211_hw *dev); | 311 | static int p54_init_xbow_synth(struct ieee80211_hw *dev); |
| 312 | 312 | ||
| 313 | static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len) | 313 | static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len) |
| @@ -319,6 +319,7 @@ static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len) | |||
| 319 | void *tmp; | 319 | void *tmp; |
| 320 | int err; | 320 | int err; |
| 321 | u8 *end = (u8 *)eeprom + len; | 321 | u8 *end = (u8 *)eeprom + len; |
| 322 | u16 synth; | ||
| 322 | DECLARE_MAC_BUF(mac); | 323 | DECLARE_MAC_BUF(mac); |
| 323 | 324 | ||
| 324 | wrap = (struct eeprom_pda_wrap *) eeprom; | 325 | wrap = (struct eeprom_pda_wrap *) eeprom; |
| @@ -400,8 +401,8 @@ static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len) | |||
| 400 | tmp = entry->data; | 401 | tmp = entry->data; |
| 401 | while ((u8 *)tmp < entry->data + data_len) { | 402 | while ((u8 *)tmp < entry->data + data_len) { |
| 402 | struct bootrec_exp_if *exp_if = tmp; | 403 | struct bootrec_exp_if *exp_if = tmp; |
| 403 | if (le16_to_cpu(exp_if->if_id) == 0xF) | 404 | if (le16_to_cpu(exp_if->if_id) == 0xf) |
| 404 | priv->rxhw = le16_to_cpu(exp_if->variant) & 0x07; | 405 | synth = le16_to_cpu(exp_if->variant); |
| 405 | tmp += sizeof(struct bootrec_exp_if); | 406 | tmp += sizeof(struct bootrec_exp_if); |
| 406 | } | 407 | } |
| 407 | break; | 408 | break; |
| @@ -427,22 +428,13 @@ static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len) | |||
| 427 | goto err; | 428 | goto err; |
| 428 | } | 429 | } |
| 429 | 430 | ||
| 430 | switch (priv->rxhw) { | 431 | priv->rxhw = synth & 0x07; |
| 431 | case 4: /* XBow */ | 432 | if (priv->rxhw == 4) |
| 432 | p54_init_xbow_synth(dev); | 433 | p54_init_xbow_synth(dev); |
| 433 | case 1: /* Indigo? */ | 434 | if (!(synth & 0x40)) |
| 434 | case 2: /* Duette */ | ||
| 435 | dev->wiphy->bands[IEEE80211_BAND_5GHZ] = &band_5GHz; | ||
| 436 | case 3: /* Frisbee */ | ||
| 437 | case 5: /* Longbow */ | ||
| 438 | dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &band_2GHz; | 435 | dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &band_2GHz; |
| 439 | break; | 436 | if (!(synth & 0x80)) |
| 440 | default: | 437 | dev->wiphy->bands[IEEE80211_BAND_5GHZ] = &band_5GHz; |
| 441 | printk(KERN_ERR "%s: unsupported RF-Chip\n", | ||
| 442 | wiphy_name(dev->wiphy)); | ||
| 443 | err = -EINVAL; | ||
| 444 | goto err; | ||
| 445 | } | ||
| 446 | 438 | ||
| 447 | if (!is_valid_ether_addr(dev->wiphy->perm_addr)) { | 439 | if (!is_valid_ether_addr(dev->wiphy->perm_addr)) { |
| 448 | u8 perm_addr[ETH_ALEN]; | 440 | u8 perm_addr[ETH_ALEN]; |
