mac80211: update to 2013-01-07, add several ath9k stability fixes
SVN-Revision: 35063
This commit is contained in:
parent
4834d09a3f
commit
5c9fd3b2d2
41 changed files with 393 additions and 1839 deletions
|
@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
|
|||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=2012-12-06
|
||||
PKG_VERSION:=2013-01-07
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||
PKG_MD5SUM:=1b2cf615a72ea5f4839796afe43c47b7
|
||||
PKG_MD5SUM:=bc4924720ebd8f3fcd9588e3c0f4db1c
|
||||
|
||||
PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
|
||||
|
@ -1233,6 +1233,7 @@ MAKE_OPTS:= \
|
|||
CONFIG_B43_PHY_LCN=$(if $(CONFIG_PACKAGE_B43_PHY_LCN),y) \
|
||||
CONFIG_B43_BCMA=y \
|
||||
CONFIG_B43_SSB=y \
|
||||
CONFIG_ATH_CARDS=$(if $(CONFIG_PACKAGE_kmod-ath),m) \
|
||||
CONFIG_ATH_COMMON=$(if $(CONFIG_PACKAGE_kmod-ath),m) \
|
||||
CONFIG_ATH_DEBUG=$(if $(CONFIG_PACKAGE_ATH_DEBUG),y) \
|
||||
CONFIG_ATH9K_PKTLOG=$(if $(CONFIG_PACKAGE_ATH_DEBUG),y) \
|
||||
|
@ -1248,6 +1249,7 @@ MAKE_OPTS:= \
|
|||
CONFIG_ATH9K_HW=$(if $(CONFIG_PACKAGE_kmod-ath9k-common),m) \
|
||||
CONFIG_ATH9K_COMMON=$(if $(CONFIG_PACKAGE_kmod-ath9k-common),m) \
|
||||
CONFIG_ATH9K_DEBUGFS=$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),y) \
|
||||
CONFIG_AR5523= \
|
||||
CONFIG_CARL9170=$(if $(CONFIG_PACKAGE_kmod-carl9170),m) \
|
||||
CONFIG_CARL9170_DEBUGFS=$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),y) \
|
||||
CONFIG_COMPAT_ZD1211RW=$(if $(CONFIG_PACKAGE_kmod-zd1211rw),m) \
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,73 +0,0 @@
|
|||
From b4d6c33df61d95fa1e223101ca345f4c797e8823 Mon Sep 17 00:00:00 2001
|
||||
From: Gabor Juhos <juhosg@openwrt.org>
|
||||
Date: Sun, 9 Dec 2012 23:37:13 +0100
|
||||
Subject: [PATCH] ath9k: ar9003: fix OTP register offsets for AR9340
|
||||
|
||||
Trying to access the OTP memory on the AR9340
|
||||
causes a data bus error like this:
|
||||
|
||||
Data bus error, epc == 86e84164, ra == 86e84164
|
||||
Oops[#1]:
|
||||
Cpu 0
|
||||
$ 0 : 00000000 00000061 deadc0de 00000000
|
||||
$ 4 : b8115f18 00015f18 00000007 00000004
|
||||
$ 8 : 00000001 7c7c3c7c 7c7c7c7c 7c7c7c7c
|
||||
$12 : 7c7c3c7c 001f0041 00000000 7c7c7c3c
|
||||
$16 : 86ee0000 00015f18 00000000 00000007
|
||||
$20 : 00000004 00000064 00000004 86d71c44
|
||||
$24 : 00000000 86e6ca00
|
||||
$28 : 86d70000 86d71b20 86ece0c0 86e84164
|
||||
Hi : 00000000
|
||||
Lo : 00000064
|
||||
epc : 86e84164 ath9k_hw_wait+0x58/0xb0 [ath9k_hw]
|
||||
Tainted: G O
|
||||
ra : 86e84164 ath9k_hw_wait+0x58/0xb0 [ath9k_hw]
|
||||
Status: 1100d403 KERNEL EXL IE
|
||||
Cause : 4080801c
|
||||
PrId : 0001974c (MIPS 74Kc)
|
||||
Modules linked in: ath9k(O+) ath9k_common(O) ath9k_hw(O) ath(O) ar934x_nfc
|
||||
mac80211(O) usbcore usb_common scsi_mod nls_base nand nand_ecc nand_ids
|
||||
crc_ccitt cfg80211(O) compat(O) arc4 aes_generic crypto_blkcipher cryptomgr
|
||||
aead crypto_hash crypto_algapi ledtrig_timer ledtrig_default_on leds_gpio
|
||||
Process insmod (pid: 459, threadinfo=86d70000, task=87942140, tls=779ac440)
|
||||
Stack : 802fb500 000200da 804db150 804e0000 87816130 86ee0000 00010000 86d71b88
|
||||
86d71bc0 00000004 00000003 86e9fcd0 80305300 0002c0d0 86e74c50 800b4c20
|
||||
000003e8 00000001 00000000 86ee0000 000003ff 86e9fd64 80305300 80123938
|
||||
fffffffc 00000004 000058bc 00000000 86ea0000 86ee0000 000001ff 878d6000
|
||||
99999999 86e9fdc0 86ee0fcc 86e9e664 0000c0d0 86ee0000 0000700000007000
|
||||
...
|
||||
Call Trace:
|
||||
[<86e84164>] ath9k_hw_wait+0x58/0xb0 [ath9k_hw]
|
||||
[<86e9fcd0>] ath9k_hw_setup_statusring+0x16b8/0x1c7c [ath9k_hw]
|
||||
|
||||
Code: 0000a812 0040f809 00000000 <00531024> 1054000b 24020001 0c05b5dc 2404000a 26520001
|
||||
|
||||
The cause of the error is that the OTP register
|
||||
offsets are different on the AR9340 than the
|
||||
actually used values.
|
||||
|
||||
Cc: <stable@vger.kernel.org> # 3.0+
|
||||
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath9k/ar9003_eeprom.h | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
|
||||
@@ -68,13 +68,13 @@
|
||||
#define AR9300_BASE_ADDR 0x3ff
|
||||
#define AR9300_BASE_ADDR_512 0x1ff
|
||||
|
||||
-#define AR9300_OTP_BASE 0x14000
|
||||
-#define AR9300_OTP_STATUS 0x15f18
|
||||
+#define AR9300_OTP_BASE (AR_SREV_9340(ah) ? 0x30000 : 0x14000)
|
||||
+#define AR9300_OTP_STATUS (AR_SREV_9340(ah) ? 0x30018 : 0x15f18)
|
||||
#define AR9300_OTP_STATUS_TYPE 0x7
|
||||
#define AR9300_OTP_STATUS_VALID 0x4
|
||||
#define AR9300_OTP_STATUS_ACCESS_BUSY 0x2
|
||||
#define AR9300_OTP_STATUS_SM_BUSY 0x1
|
||||
-#define AR9300_OTP_READ_DATA 0x15f1c
|
||||
+#define AR9300_OTP_READ_DATA (AR_SREV_9340(ah) ? 0x3001c : 0x15f1c)
|
||||
|
||||
enum targetPowerHTRates {
|
||||
HT_TARGET_RATE_0_8_16,
|
|
@ -1,83 +0,0 @@
|
|||
From cd3d888d569f5908c4345f7c99018f574c80a32b Mon Sep 17 00:00:00 2001
|
||||
From: Gabor Juhos <juhosg@openwrt.org>
|
||||
Date: Sun, 9 Dec 2012 14:58:56 +0100
|
||||
Subject: [PATCH 1/4] ath9k: move duplicated debug message to
|
||||
'ath9k_hw_nvram_read'
|
||||
|
||||
The fill_eeprom functions are printing the same
|
||||
debug message in case the 'ath9k_hw_nvram_read'
|
||||
function fails. Remove the duplicated code from
|
||||
fill_eeprom functions and add the ath_dbg call
|
||||
directly into 'ath9k_hw_nvram_read'.
|
||||
|
||||
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath9k/eeprom.c | 8 +++++++-
|
||||
drivers/net/wireless/ath/ath9k/eeprom_4k.c | 6 ++----
|
||||
drivers/net/wireless/ath/ath9k/eeprom_9287.c | 5 +----
|
||||
drivers/net/wireless/ath/ath9k/eeprom_def.c | 5 +----
|
||||
4 files changed, 11 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom.c
|
||||
@@ -115,7 +115,13 @@ void ath9k_hw_usb_gen_fill_eeprom(struct
|
||||
|
||||
bool ath9k_hw_nvram_read(struct ath_common *common, u32 off, u16 *data)
|
||||
{
|
||||
- return common->bus_ops->eeprom_read(common, off, data);
|
||||
+ bool ret;
|
||||
+
|
||||
+ ret = common->bus_ops->eeprom_read(common, off, data);
|
||||
+ if (!ret)
|
||||
+ ath_dbg(common, EEPROM, "Unable to read eeprom region\n");
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
void ath9k_hw_fill_vpd_table(u8 pwrMin, u8 pwrMax, u8 *pPwrList,
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||
@@ -37,11 +37,9 @@ static bool __ath9k_hw_4k_fill_eeprom(st
|
||||
int addr, eep_start_loc = 64;
|
||||
|
||||
for (addr = 0; addr < SIZE_EEPROM_4K; addr++) {
|
||||
- if (!ath9k_hw_nvram_read(common, addr + eep_start_loc, eep_data)) {
|
||||
- ath_dbg(common, EEPROM,
|
||||
- "Unable to read eeprom region\n");
|
||||
+ if (!ath9k_hw_nvram_read(common, addr + eep_start_loc,
|
||||
+ eep_data))
|
||||
return false;
|
||||
- }
|
||||
eep_data++;
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||
@@ -40,11 +40,8 @@ static bool __ath9k_hw_ar9287_fill_eepro
|
||||
|
||||
for (addr = 0; addr < SIZE_EEPROM_AR9287; addr++) {
|
||||
if (!ath9k_hw_nvram_read(common, addr + eep_start_loc,
|
||||
- eep_data)) {
|
||||
- ath_dbg(common, EEPROM,
|
||||
- "Unable to read eeprom region\n");
|
||||
+ eep_data))
|
||||
return false;
|
||||
- }
|
||||
eep_data++;
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||
@@ -97,11 +97,8 @@ static bool __ath9k_hw_def_fill_eeprom(s
|
||||
|
||||
for (addr = 0; addr < SIZE_EEPROM_DEF; addr++) {
|
||||
if (!ath9k_hw_nvram_read(common, addr + ar5416_eep_start_loc,
|
||||
- eep_data)) {
|
||||
- ath_err(ath9k_hw_common(ah),
|
||||
- "Unable to read eeprom region\n");
|
||||
+ eep_data))
|
||||
return false;
|
||||
- }
|
||||
eep_data++;
|
||||
}
|
||||
return true;
|
|
@ -1,26 +0,0 @@
|
|||
From 910b74fb0e0369b18aa689ab02c9413235c18f98 Mon Sep 17 00:00:00 2001
|
||||
From: Gabor Juhos <juhosg@openwrt.org>
|
||||
Date: Sun, 9 Dec 2012 16:47:35 +0100
|
||||
Subject: [PATCH 2/4] ath9k: add EEPROM offset to debug message
|
||||
|
||||
Show the EEPROM offset of the failed read operation
|
||||
in 'ath9k_hw_nvram_read'. The debug message is more
|
||||
informative this way.
|
||||
|
||||
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath9k/eeprom.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom.c
|
||||
@@ -119,7 +119,8 @@ bool ath9k_hw_nvram_read(struct ath_comm
|
||||
|
||||
ret = common->bus_ops->eeprom_read(common, off, data);
|
||||
if (!ret)
|
||||
- ath_dbg(common, EEPROM, "Unable to read eeprom region\n");
|
||||
+ ath_dbg(common, EEPROM,
|
||||
+ "unable to read eeprom region at offset %u\n", off);
|
||||
|
||||
return ret;
|
||||
}
|
|
@ -1,203 +0,0 @@
|
|||
From 26c22324cca2db37fa294156fd875100d95438f4 Mon Sep 17 00:00:00 2001
|
||||
From: Gabor Juhos <juhosg@openwrt.org>
|
||||
Date: Sun, 9 Dec 2012 15:19:01 +0100
|
||||
Subject: [PATCH 3/4] ath9k: use 'struct ath_hw *' as the first argument for
|
||||
'ath9k_hw_nvram_read'
|
||||
|
||||
The 'ath9k_hw_nvram_read' function takes a
|
||||
'struct ath_common *' as its first argument.
|
||||
Almost each of its caller has a 'struct ath_hw *'
|
||||
parameter in their argument list, and that is
|
||||
dereferenced in order to get the 'struct ath_common'
|
||||
pointer.
|
||||
|
||||
Change the first argument of 'ath9k_hw_nvram_read'
|
||||
to be a 'struct ath_hw *', and remove the dereference
|
||||
calls from the callers.
|
||||
|
||||
Also change the type of the first argument of the
|
||||
ar9300_eeprom_read_{byte,word} functions.
|
||||
|
||||
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | 17 ++++++++---------
|
||||
drivers/net/wireless/ath/ath9k/eeprom.c | 3 ++-
|
||||
drivers/net/wireless/ath/ath9k/eeprom.h | 2 +-
|
||||
drivers/net/wireless/ath/ath9k/eeprom_4k.c | 6 ++----
|
||||
drivers/net/wireless/ath/ath9k/eeprom_9287.c | 6 ++----
|
||||
drivers/net/wireless/ath/ath9k/eeprom_def.c | 5 ++---
|
||||
6 files changed, 17 insertions(+), 22 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
|
||||
@@ -3005,24 +3005,24 @@ static u32 ath9k_hw_ar9300_get_eeprom(st
|
||||
}
|
||||
}
|
||||
|
||||
-static bool ar9300_eeprom_read_byte(struct ath_common *common, int address,
|
||||
+static bool ar9300_eeprom_read_byte(struct ath_hw *ah, int address,
|
||||
u8 *buffer)
|
||||
{
|
||||
u16 val;
|
||||
|
||||
- if (unlikely(!ath9k_hw_nvram_read(common, address / 2, &val)))
|
||||
+ if (unlikely(!ath9k_hw_nvram_read(ah, address / 2, &val)))
|
||||
return false;
|
||||
|
||||
*buffer = (val >> (8 * (address % 2))) & 0xff;
|
||||
return true;
|
||||
}
|
||||
|
||||
-static bool ar9300_eeprom_read_word(struct ath_common *common, int address,
|
||||
+static bool ar9300_eeprom_read_word(struct ath_hw *ah, int address,
|
||||
u8 *buffer)
|
||||
{
|
||||
u16 val;
|
||||
|
||||
- if (unlikely(!ath9k_hw_nvram_read(common, address / 2, &val)))
|
||||
+ if (unlikely(!ath9k_hw_nvram_read(ah, address / 2, &val)))
|
||||
return false;
|
||||
|
||||
buffer[0] = val >> 8;
|
||||
@@ -3048,14 +3048,14 @@ static bool ar9300_read_eeprom(struct at
|
||||
* the 16-bit word at that address
|
||||
*/
|
||||
if (address % 2 == 0) {
|
||||
- if (!ar9300_eeprom_read_byte(common, address--, buffer++))
|
||||
+ if (!ar9300_eeprom_read_byte(ah, address--, buffer++))
|
||||
goto error;
|
||||
|
||||
count--;
|
||||
}
|
||||
|
||||
for (i = 0; i < count / 2; i++) {
|
||||
- if (!ar9300_eeprom_read_word(common, address, buffer))
|
||||
+ if (!ar9300_eeprom_read_word(ah, address, buffer))
|
||||
goto error;
|
||||
|
||||
address -= 2;
|
||||
@@ -3063,7 +3063,7 @@ static bool ar9300_read_eeprom(struct at
|
||||
}
|
||||
|
||||
if (count % 2)
|
||||
- if (!ar9300_eeprom_read_byte(common, address, buffer))
|
||||
+ if (!ar9300_eeprom_read_byte(ah, address, buffer))
|
||||
goto error;
|
||||
|
||||
return true;
|
||||
@@ -3240,12 +3240,11 @@ static bool ar9300_check_eeprom_header(s
|
||||
static int ar9300_eeprom_restore_flash(struct ath_hw *ah, u8 *mptr,
|
||||
int mdata_size)
|
||||
{
|
||||
- struct ath_common *common = ath9k_hw_common(ah);
|
||||
u16 *data = (u16 *) mptr;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < mdata_size / 2; i++, data++)
|
||||
- ath9k_hw_nvram_read(common, i, data);
|
||||
+ ath9k_hw_nvram_read(ah, i, data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom.c
|
||||
@@ -113,8 +113,9 @@ void ath9k_hw_usb_gen_fill_eeprom(struct
|
||||
}
|
||||
}
|
||||
|
||||
-bool ath9k_hw_nvram_read(struct ath_common *common, u32 off, u16 *data)
|
||||
+bool ath9k_hw_nvram_read(struct ath_hw *ah, u32 off, u16 *data)
|
||||
{
|
||||
+ struct ath_common *common = ath9k_hw_common(ah);
|
||||
bool ret;
|
||||
|
||||
ret = common->bus_ops->eeprom_read(common, off, data);
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom.h
|
||||
@@ -663,7 +663,7 @@ int16_t ath9k_hw_interpolate(u16 target,
|
||||
int16_t targetRight);
|
||||
bool ath9k_hw_get_lower_upper_index(u8 target, u8 *pList, u16 listSize,
|
||||
u16 *indexL, u16 *indexR);
|
||||
-bool ath9k_hw_nvram_read(struct ath_common *common, u32 off, u16 *data);
|
||||
+bool ath9k_hw_nvram_read(struct ath_hw *ah, u32 off, u16 *data);
|
||||
void ath9k_hw_usb_gen_fill_eeprom(struct ath_hw *ah, u16 *eep_data,
|
||||
int eep_start_loc, int size);
|
||||
void ath9k_hw_fill_vpd_table(u8 pwrMin, u8 pwrMax, u8 *pPwrList,
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||
@@ -32,13 +32,11 @@ static int ath9k_hw_4k_get_eeprom_rev(st
|
||||
|
||||
static bool __ath9k_hw_4k_fill_eeprom(struct ath_hw *ah)
|
||||
{
|
||||
- struct ath_common *common = ath9k_hw_common(ah);
|
||||
u16 *eep_data = (u16 *)&ah->eeprom.map4k;
|
||||
int addr, eep_start_loc = 64;
|
||||
|
||||
for (addr = 0; addr < SIZE_EEPROM_4K; addr++) {
|
||||
- if (!ath9k_hw_nvram_read(common, addr + eep_start_loc,
|
||||
- eep_data))
|
||||
+ if (!ath9k_hw_nvram_read(ah, addr + eep_start_loc, eep_data))
|
||||
return false;
|
||||
eep_data++;
|
||||
}
|
||||
@@ -194,7 +192,7 @@ static int ath9k_hw_4k_check_eeprom(stru
|
||||
|
||||
|
||||
if (!ath9k_hw_use_flash(ah)) {
|
||||
- if (!ath9k_hw_nvram_read(common, AR5416_EEPROM_MAGIC_OFFSET,
|
||||
+ if (!ath9k_hw_nvram_read(ah, AR5416_EEPROM_MAGIC_OFFSET,
|
||||
&magic)) {
|
||||
ath_err(common, "Reading Magic # failed\n");
|
||||
return false;
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||
@@ -33,14 +33,12 @@ static int ath9k_hw_ar9287_get_eeprom_re
|
||||
static bool __ath9k_hw_ar9287_fill_eeprom(struct ath_hw *ah)
|
||||
{
|
||||
struct ar9287_eeprom *eep = &ah->eeprom.map9287;
|
||||
- struct ath_common *common = ath9k_hw_common(ah);
|
||||
u16 *eep_data;
|
||||
int addr, eep_start_loc = AR9287_EEP_START_LOC;
|
||||
eep_data = (u16 *)eep;
|
||||
|
||||
for (addr = 0; addr < SIZE_EEPROM_AR9287; addr++) {
|
||||
- if (!ath9k_hw_nvram_read(common, addr + eep_start_loc,
|
||||
- eep_data))
|
||||
+ if (!ath9k_hw_nvram_read(ah, addr + eep_start_loc, eep_data))
|
||||
return false;
|
||||
eep_data++;
|
||||
}
|
||||
@@ -187,7 +185,7 @@ static int ath9k_hw_ar9287_check_eeprom(
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
|
||||
if (!ath9k_hw_use_flash(ah)) {
|
||||
- if (!ath9k_hw_nvram_read(common, AR5416_EEPROM_MAGIC_OFFSET,
|
||||
+ if (!ath9k_hw_nvram_read(ah, AR5416_EEPROM_MAGIC_OFFSET,
|
||||
&magic)) {
|
||||
ath_err(common, "Reading Magic # failed\n");
|
||||
return false;
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||
@@ -91,12 +91,11 @@ static int ath9k_hw_def_get_eeprom_rev(s
|
||||
|
||||
static bool __ath9k_hw_def_fill_eeprom(struct ath_hw *ah)
|
||||
{
|
||||
- struct ath_common *common = ath9k_hw_common(ah);
|
||||
u16 *eep_data = (u16 *)&ah->eeprom.def;
|
||||
int addr, ar5416_eep_start_loc = 0x100;
|
||||
|
||||
for (addr = 0; addr < SIZE_EEPROM_DEF; addr++) {
|
||||
- if (!ath9k_hw_nvram_read(common, addr + ar5416_eep_start_loc,
|
||||
+ if (!ath9k_hw_nvram_read(ah, addr + ar5416_eep_start_loc,
|
||||
eep_data))
|
||||
return false;
|
||||
eep_data++;
|
||||
@@ -268,7 +267,7 @@ static int ath9k_hw_def_check_eeprom(str
|
||||
bool need_swap = false;
|
||||
int i, addr, size;
|
||||
|
||||
- if (!ath9k_hw_nvram_read(common, AR5416_EEPROM_MAGIC_OFFSET, &magic)) {
|
||||
+ if (!ath9k_hw_nvram_read(ah, AR5416_EEPROM_MAGIC_OFFSET, &magic)) {
|
||||
ath_err(common, "Reading Magic # failed\n");
|
||||
return false;
|
||||
}
|
|
@ -1,184 +0,0 @@
|
|||
From ee4581f2f024c601a5e247ec6acab3e7df538f88 Mon Sep 17 00:00:00 2001
|
||||
From: Gabor Juhos <juhosg@openwrt.org>
|
||||
Date: Sun, 9 Dec 2012 17:31:54 +0100
|
||||
Subject: [PATCH 4/4] ath9k: allow to load EEPROM content via firmware API
|
||||
|
||||
The calibration data for devices w/o a separate
|
||||
EEPROM chip can be specified via the 'eeprom_data'
|
||||
field of 'ath9k_platform_data'. The 'eeprom_data'
|
||||
is usually filled from board specific setup
|
||||
functions. It is easy if the EEPROM data is mapped
|
||||
to the memory, but it can be complicated if it is
|
||||
stored elsewhere.
|
||||
|
||||
The patch adds support for loading of the EEPROM
|
||||
data via the firmware API to avoid this limitation.
|
||||
|
||||
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
---
|
||||
drivers/net/wireless/ath/ath9k/eeprom.c | 19 +++++++++-
|
||||
drivers/net/wireless/ath/ath9k/hw.h | 3 ++
|
||||
drivers/net/wireless/ath/ath9k/init.c | 60 ++++++++++++++++++++++++++++++-
|
||||
include/linux/ath9k_platform.h | 2 ++
|
||||
4 files changed, 82 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/eeprom.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom.c
|
||||
@@ -113,12 +113,29 @@ void ath9k_hw_usb_gen_fill_eeprom(struct
|
||||
}
|
||||
}
|
||||
|
||||
+static bool ath9k_hw_nvram_read_blob(struct ath_hw *ah, u32 off,
|
||||
+ u16 *data)
|
||||
+{
|
||||
+ u16 *blob_data;
|
||||
+
|
||||
+ if (off * sizeof(u16) > ah->eeprom_blob->size)
|
||||
+ return false;
|
||||
+
|
||||
+ blob_data = (u16 *)ah->eeprom_blob->data;
|
||||
+ *data = blob_data[off];
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
bool ath9k_hw_nvram_read(struct ath_hw *ah, u32 off, u16 *data)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
bool ret;
|
||||
|
||||
- ret = common->bus_ops->eeprom_read(common, off, data);
|
||||
+ if (ah->eeprom_blob)
|
||||
+ ret = ath9k_hw_nvram_read_blob(ah, off, data);
|
||||
+ else
|
||||
+ ret = common->bus_ops->eeprom_read(common, off, data);
|
||||
+
|
||||
if (!ret)
|
||||
ath_dbg(common, EEPROM,
|
||||
"unable to read eeprom region at offset %u\n", off);
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
+#include <linux/firmware.h>
|
||||
|
||||
#include "mac.h"
|
||||
#include "ani.h"
|
||||
@@ -920,6 +921,8 @@ struct ath_hw {
|
||||
bool is_clk_25mhz;
|
||||
int (*get_mac_revision)(void);
|
||||
int (*external_reset)(void);
|
||||
+
|
||||
+ const struct firmware *eeprom_blob;
|
||||
};
|
||||
|
||||
struct ath_bus_ops {
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -25,6 +25,11 @@
|
||||
|
||||
#include "ath9k.h"
|
||||
|
||||
+struct ath9k_eeprom_ctx {
|
||||
+ struct completion complete;
|
||||
+ struct ath_hw *ah;
|
||||
+};
|
||||
+
|
||||
static char *dev_info = "ath9k";
|
||||
|
||||
MODULE_AUTHOR("Atheros Communications");
|
||||
@@ -508,6 +513,51 @@ static void ath9k_init_misc(struct ath_s
|
||||
sc->ant_comb.count = ATH_ANT_DIV_COMB_INIT_COUNT;
|
||||
}
|
||||
|
||||
+static void ath9k_eeprom_request_cb(const struct firmware *eeprom_blob,
|
||||
+ void *ctx)
|
||||
+{
|
||||
+ struct ath9k_eeprom_ctx *ec = ctx;
|
||||
+
|
||||
+ if (eeprom_blob)
|
||||
+ ec->ah->eeprom_blob = eeprom_blob;
|
||||
+
|
||||
+ complete(&ec->complete);
|
||||
+}
|
||||
+
|
||||
+static int ath9k_eeprom_request(struct ath_softc *sc, const char *name)
|
||||
+{
|
||||
+ struct ath9k_eeprom_ctx ec;
|
||||
+ struct ath_hw *ah = ah = sc->sc_ah;
|
||||
+ int err;
|
||||
+
|
||||
+ /* try to load the EEPROM content asynchronously */
|
||||
+ init_completion(&ec.complete);
|
||||
+ ec.ah = sc->sc_ah;
|
||||
+
|
||||
+ err = request_firmware_nowait(THIS_MODULE, 1, name, sc->dev, GFP_KERNEL,
|
||||
+ &ec, ath9k_eeprom_request_cb);
|
||||
+ if (err < 0) {
|
||||
+ ath_err(ath9k_hw_common(ah),
|
||||
+ "EEPROM request failed\n");
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ wait_for_completion(&ec.complete);
|
||||
+
|
||||
+ if (!ah->eeprom_blob) {
|
||||
+ ath_err(ath9k_hw_common(ah),
|
||||
+ "Unable to load EEPROM file %s\n", name);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void ath9k_eeprom_release(struct ath_softc *sc)
|
||||
+{
|
||||
+ release_firmware(sc->sc_ah->eeprom_blob);
|
||||
+}
|
||||
+
|
||||
static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
|
||||
const struct ath_bus_ops *bus_ops)
|
||||
{
|
||||
@@ -585,6 +635,12 @@ static int ath9k_init_softc(u16 devid, s
|
||||
ath_read_cachesize(common, &csz);
|
||||
common->cachelsz = csz << 2; /* convert to bytes */
|
||||
|
||||
+ if (pdata && pdata->eeprom_name) {
|
||||
+ ret = ath9k_eeprom_request(sc, pdata->eeprom_name);
|
||||
+ if (ret)
|
||||
+ goto err_eeprom;
|
||||
+ }
|
||||
+
|
||||
/* Initializes the hardware for all supported chipsets */
|
||||
ret = ath9k_hw_init(ah);
|
||||
if (ret)
|
||||
@@ -621,7 +677,8 @@ err_btcoex:
|
||||
err_queues:
|
||||
ath9k_hw_deinit(ah);
|
||||
err_hw:
|
||||
-
|
||||
+ ath9k_eeprom_release(sc);
|
||||
+err_eeprom:
|
||||
kfree(ah);
|
||||
sc->sc_ah = NULL;
|
||||
|
||||
@@ -884,6 +941,7 @@ static void ath9k_deinit_softc(struct at
|
||||
if (sc->dfs_detector != NULL)
|
||||
sc->dfs_detector->exit(sc->dfs_detector);
|
||||
|
||||
+ ath9k_eeprom_release(sc);
|
||||
kfree(sc->sc_ah);
|
||||
sc->sc_ah = NULL;
|
||||
}
|
||||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -22,6 +22,8 @@
|
||||
#define ATH9K_PLAT_EEP_MAX_WORDS 2048
|
||||
|
||||
struct ath9k_platform_data {
|
||||
+ const char *eeprom_name;
|
||||
+
|
||||
u16 eeprom_data[ATH9K_PLAT_EEP_MAX_WORDS];
|
||||
u8 *macaddr;
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
From e922d683ca8001ce9a6272d6ab12d74e72c36521 Mon Sep 17 00:00:00 2001
|
||||
From: Gabor Juhos <juhosg@openwrt.org>
|
||||
Date: Tue, 11 Dec 2012 14:15:53 +0100
|
||||
Subject: [PATCH v2] rt2x00: zero-out rx_status
|
||||
|
||||
In commit 'mac80211: support radiotap vendor namespace RX data'
|
||||
new fields were added to 'struct ieee80211_rx_status' and those
|
||||
fileds must be zeroed. However the rt2x00 driver stores driver
|
||||
specific data in the cb array of the rx skbs, so the fields
|
||||
might contain garbage and this can cause unexpected behaviour.
|
||||
|
||||
The rt2x00 driver from the compat-wireless-2012-12-01
|
||||
tarball caused the following warning:
|
||||
|
||||
WARNING: at
|
||||
/devel/ramips/build_dir/target-mipsel_r2_uClibc-0.9.33.2/linux-ramips_rt305x/
|
||||
compat-wireless-2012-12-01/net/mac80211/rx.c:115 ieee80211_rx_irqsafe+0x274/0xbcc
|
||||
[mac80211]()
|
||||
Modules linked in: dwc_otg ledtrig_usbdev nf_nat_irc
|
||||
nf_nat_ftp nf_conntrack_irc nf_conntrack_ftp ipt_MASQUERADE
|
||||
iptable_nat nf_nat pppoe xt_conntrack xt_CT xt_NOTRACK iptable_raw
|
||||
xt_state nf_conntrack_ipv4 nf_defrag_ipv4 nf_conntrack pppox
|
||||
ipt_REJECT xt_TCPMSS xt_comment xt_multiport xt_mac xt_limit
|
||||
iptable_mangle iptable_filter ip_tables xt_tcpudp x_tables ppp_async
|
||||
ppp_generic slhc rt2800pci(O) rt2800lib(O) rt2x00soc(O) rt2x00pci(O)
|
||||
rt2x00lib(O) mac80211(O) usbcore usb_common nls_base crc_itu_t
|
||||
crc_ccitt eeprom_93cx6 cfg80211(O) compat(O) arc4 aes_generic
|
||||
crypto_blkcipher cryptomgr aead crypto_hash crypto_algapi leds_gpio
|
||||
button_hotplug(O) gpio_keys_polled input_polldev input_core
|
||||
Call Trace:
|
||||
[<801e96b4>] dump_stack+0x8/0x34
|
||||
[<80010a9c>] warn_slowpath_common+0x78/0xa4
|
||||
[<80010ae0>] warn_slowpath_null+0x18/0x24
|
||||
[<80a9710c>] ieee80211_rx_irqsafe+0x274/0xbcc [mac80211]
|
||||
|
||||
The patch ensures that each field gets initialized with
|
||||
zeroes.
|
||||
|
||||
Cc: <users@rt2x00.serialmonkey.com>
|
||||
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
---
|
||||
v2:
|
||||
- update the commit message and add a comment to the code
|
||||
- drop the ath5k and p54 patches
|
||||
---
|
||||
drivers/net/wireless/rt2x00/rt2x00dev.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
|
||||
@@ -685,6 +685,14 @@ void rt2x00lib_rxdone(struct queue_entry
|
||||
* to mac80211.
|
||||
*/
|
||||
rx_status = IEEE80211_SKB_RXCB(entry->skb);
|
||||
+
|
||||
+ /* Ensure that all fields of rx_status are initialized
|
||||
+ * properly. The skb->cb array was used for driver
|
||||
+ * specific informations, so rx_status might contain
|
||||
+ * garbage.
|
||||
+ */
|
||||
+ memset(rx_status, 0, sizeof(*rx_status));
|
||||
+
|
||||
rx_status->mactime = rxdesc.timestamp;
|
||||
rx_status->band = rt2x00dev->curr_band;
|
||||
rx_status->freq = rt2x00dev->curr_freq;
|
|
@ -1,6 +1,6 @@
|
|||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -1925,7 +1925,7 @@ static int ieee80211_scan(struct wiphy *
|
||||
@@ -1953,7 +1953,7 @@ static int ieee80211_scan(struct wiphy *
|
||||
* the frames sent while scanning on other channel will be
|
||||
* lost)
|
||||
*/
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/Makefile
|
||||
+++ b/drivers/net/wireless/ath/Makefile
|
||||
@@ -9,7 +9,7 @@ obj-$(CONFIG_ATH_COMMON) += ath.o
|
||||
@@ -10,7 +10,7 @@ obj-$(CONFIG_ATH_COMMON) += ath.o
|
||||
ath-objs := main.o \
|
||||
regd.o \
|
||||
hw.o \
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
--- a/drivers/net/wireless/ath/regd.c
|
||||
+++ b/drivers/net/wireless/ath/regd.c
|
||||
@@ -200,6 +200,10 @@ ath_reg_apply_beaconing_flags(struct wip
|
||||
u32 bandwidth = 0;
|
||||
int r;
|
||||
@@ -198,6 +198,10 @@ ath_reg_apply_beaconing_flags(struct wip
|
||||
struct ieee80211_channel *ch;
|
||||
unsigned int i;
|
||||
|
||||
+#ifdef ATH_USER_REGD
|
||||
+ return;
|
||||
|
@ -11,9 +11,9 @@
|
|||
for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
|
||||
|
||||
if (!wiphy->bands[band])
|
||||
@@ -259,6 +263,10 @@ ath_reg_apply_active_scan_flags(struct w
|
||||
u32 bandwidth = 0;
|
||||
int r;
|
||||
@@ -252,6 +256,10 @@ ath_reg_apply_active_scan_flags(struct w
|
||||
struct ieee80211_channel *ch;
|
||||
const struct ieee80211_reg_rule *reg_rule;
|
||||
|
||||
+#ifdef ATH_USER_REGD
|
||||
+ return;
|
||||
|
@ -22,7 +22,7 @@
|
|||
sband = wiphy->bands[IEEE80211_BAND_2GHZ];
|
||||
if (!sband)
|
||||
return;
|
||||
@@ -308,6 +316,10 @@ static void ath_reg_apply_radar_flags(st
|
||||
@@ -301,6 +309,10 @@ static void ath_reg_apply_radar_flags(st
|
||||
struct ieee80211_channel *ch;
|
||||
unsigned int i;
|
||||
|
||||
|
@ -33,7 +33,7 @@
|
|||
if (!wiphy->bands[IEEE80211_BAND_5GHZ])
|
||||
return;
|
||||
|
||||
@@ -514,6 +526,10 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
@@ -507,6 +519,10 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
{
|
||||
const struct ieee80211_regdomain *regd;
|
||||
|
||||
|
|
|
@ -1,20 +1,19 @@
|
|||
--- a/net/wireless/reg.c
|
||||
+++ b/net/wireless/reg.c
|
||||
@@ -1805,6 +1805,8 @@ void regulatory_hint_11d(struct wiphy *w
|
||||
@@ -1717,6 +1717,8 @@ void regulatory_hint_11d(struct wiphy *w
|
||||
enum environment_cap env = ENVIRON_ANY;
|
||||
struct regulatory_request *request;
|
||||
struct regulatory_request *request, *lr;
|
||||
|
||||
+ return;
|
||||
+
|
||||
mutex_lock(®_mutex);
|
||||
lr = get_last_request();
|
||||
|
||||
if (unlikely(!last_request))
|
||||
@@ -2039,6 +2041,8 @@ static void restore_regulatory_settings(
|
||||
@@ -1913,6 +1915,7 @@ static void restore_regulatory_settings(
|
||||
|
||||
void regulatory_hint_disconnect(void)
|
||||
{
|
||||
+ return;
|
||||
+
|
||||
REG_DBG_PRINT("All devices are disconnected, going to "
|
||||
"restore regulatory settings\n");
|
||||
REG_DBG_PRINT("All devices are disconnected, going to restore regulatory settings\n");
|
||||
restore_regulatory_settings(false);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -735,6 +735,7 @@ static const struct ieee80211_iface_limi
|
||||
@@ -722,6 +722,7 @@ static const struct ieee80211_iface_limi
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) },
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
goto end;
|
||||
--- a/drivers/net/wireless/ath/ath5k/base.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/base.c
|
||||
@@ -1878,7 +1878,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
|
||||
@@ -1867,7 +1867,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
|
||||
}
|
||||
|
||||
if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
|
||||
|
@ -27,7 +27,7 @@
|
|||
ah->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||
u64 tsf = ath5k_hw_get_tsf64(ah);
|
||||
u32 tsftu = TSF_TO_TU(tsf);
|
||||
@@ -1964,7 +1964,7 @@ ath5k_beacon_update_timers(struct ath5k_
|
||||
@@ -1953,7 +1953,7 @@ ath5k_beacon_update_timers(struct ath5k_
|
||||
|
||||
intval = ah->bintval & AR5K_BEACON_PERIOD;
|
||||
if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
|
||||
|
@ -36,7 +36,7 @@
|
|||
intval /= ATH_BCBUF; /* staggered multi-bss beacons */
|
||||
if (intval < 15)
|
||||
ATH5K_WARN(ah, "intval %u is too low, min 15\n",
|
||||
@@ -2428,6 +2428,7 @@ static const struct ieee80211_iface_limi
|
||||
@@ -2417,6 +2417,7 @@ static const struct ieee80211_iface_limi
|
||||
BIT(NL80211_IFTYPE_MESH_POINT) |
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_AP) },
|
||||
|
|
|
@ -71,7 +71,7 @@
|
|||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -705,6 +705,7 @@ enum ath_cal_list {
|
||||
@@ -702,6 +702,7 @@ enum ath_cal_list {
|
||||
#define AH_USE_EEPROM 0x1
|
||||
#define AH_UNPLUGGED 0x2 /* The card has been physically removed. */
|
||||
#define AH_FASTCC 0x4
|
||||
|
@ -81,7 +81,7 @@
|
|||
struct ath_ops reg_ops;
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -591,6 +591,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||
@@ -582,6 +582,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
||||
ah->get_mac_revision = pdata->get_mac_revision;
|
||||
ah->external_reset = pdata->external_reset;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -994,23 +994,23 @@ static int __init ath9k_init(void)
|
||||
@@ -955,23 +955,23 @@ static int __init ath9k_init(void)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1962,8 +1962,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -1954,8 +1954,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
REG_WRITE(ah, AR_OBS, 8);
|
||||
|
||||
if (ah->config.rx_intr_mitigation) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -122,7 +122,7 @@ void ath_descdma_cleanup(struct ath_soft
|
||||
@@ -119,7 +119,7 @@ int ath_descdma_setup(struct ath_softc *
|
||||
/* RX / TX */
|
||||
/***********/
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -679,6 +679,7 @@ struct ath_softc {
|
||||
@@ -674,6 +674,7 @@ struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
|||
struct survey_info *cur_survey;
|
||||
struct survey_info survey[ATH9K_NUM_CHANNELS];
|
||||
|
||||
@@ -751,6 +752,7 @@ struct ath_softc {
|
||||
@@ -746,6 +747,7 @@ struct ath_softc {
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/net/mac80211/iface.c
|
||||
+++ b/net/mac80211/iface.c
|
||||
@@ -1046,6 +1046,7 @@ static const struct net_device_ops ieee8
|
||||
@@ -1033,6 +1033,7 @@ static const struct net_device_ops ieee8
|
||||
static void ieee80211_if_setup(struct net_device *dev)
|
||||
{
|
||||
ether_setup(dev);
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
};
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2105,7 +2105,9 @@ static int ieee80211_get_tx_power(struct
|
||||
@@ -2133,7 +2133,9 @@ static int ieee80211_get_tx_power(struct
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
u8 vendor_radiotap_oui[3];
|
||||
--- a/net/mac80211/sta_info.h
|
||||
+++ b/net/mac80211/sta_info.h
|
||||
@@ -329,6 +329,11 @@ struct sta_info {
|
||||
@@ -335,6 +335,11 @@ struct sta_info {
|
||||
int last_signal;
|
||||
struct ewma avg_signal;
|
||||
int last_ack_signal;
|
||||
|
@ -65,7 +65,7 @@
|
|||
* exchange sequence.
|
||||
--- a/net/mac80211/sta_info.c
|
||||
+++ b/net/mac80211/sta_info.c
|
||||
@@ -324,6 +324,8 @@ struct sta_info *sta_info_alloc(struct i
|
||||
@@ -356,6 +356,8 @@ struct sta_info *sta_info_alloc(struct i
|
||||
do_posix_clock_monotonic_gettime(&uptime);
|
||||
sta->last_connected = uptime.tv_sec;
|
||||
ewma_init(&sta->avg_signal, 1024, 8);
|
||||
|
@ -135,7 +135,7 @@
|
|||
u8 rs_num_delims;
|
||||
--- a/drivers/net/wireless/ath/ath9k/recv.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/recv.c
|
||||
@@ -955,6 +955,7 @@ static int ath9k_rx_skb_preprocess(struc
|
||||
@@ -946,6 +946,7 @@ static int ath9k_rx_skb_preprocess(struc
|
||||
bool *decrypt_error)
|
||||
{
|
||||
struct ath_hw *ah = common->ah;
|
||||
|
@ -143,7 +143,7 @@
|
|||
|
||||
/*
|
||||
* everything but the rate is checked here, the rate check is done
|
||||
@@ -980,6 +981,20 @@ static int ath9k_rx_skb_preprocess(struc
|
||||
@@ -971,6 +972,20 @@ static int ath9k_rx_skb_preprocess(struc
|
||||
if (rx_stats->rs_moreaggr)
|
||||
rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
|
||||
|
||||
|
@ -248,7 +248,7 @@
|
|||
RX_SAMP_DBG(rate) = rs->rs_rate;
|
||||
--- a/include/uapi/linux/nl80211.h
|
||||
+++ b/include/uapi/linux/nl80211.h
|
||||
@@ -1834,6 +1834,8 @@ enum nl80211_sta_bss_param {
|
||||
@@ -1838,6 +1838,8 @@ enum nl80211_sta_bss_param {
|
||||
* @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update.
|
||||
* @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32)
|
||||
* @NL80211_STA_INFO_T_OFFSET: timing offset with respect to this STA (s64)
|
||||
|
@ -257,7 +257,7 @@
|
|||
* @__NL80211_STA_INFO_AFTER_LAST: internal
|
||||
* @NL80211_STA_INFO_MAX: highest possible station info attribute
|
||||
*/
|
||||
@@ -1858,6 +1860,8 @@ enum nl80211_sta_info {
|
||||
@@ -1862,6 +1864,8 @@ enum nl80211_sta_info {
|
||||
NL80211_STA_INFO_STA_FLAGS,
|
||||
NL80211_STA_INFO_BEACON_LOSS,
|
||||
NL80211_STA_INFO_T_OFFSET,
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
u8 ps_dtim_period;
|
||||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -1132,6 +1132,7 @@ struct ieee80211_local {
|
||||
@@ -1144,6 +1144,7 @@ struct ieee80211_local {
|
||||
bool disable_dynamic_ps;
|
||||
|
||||
int user_power_level; /* in dBm, for all interfaces */
|
||||
|
@ -72,7 +72,7 @@
|
|||
u32 tx_ant, rx_ant;
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2127,6 +2127,19 @@ static int ieee80211_get_tx_power(struct
|
||||
@@ -2155,6 +2155,19 @@ static int ieee80211_get_tx_power(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -92,7 +92,7 @@
|
|||
static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *addr)
|
||||
{
|
||||
@@ -3250,6 +3263,7 @@ struct cfg80211_ops mac80211_config_ops
|
||||
@@ -3278,6 +3291,7 @@ struct cfg80211_ops mac80211_config_ops
|
||||
.set_wiphy_params = ieee80211_set_wiphy_params,
|
||||
.set_tx_power = ieee80211_set_tx_power,
|
||||
.get_tx_power = ieee80211_get_tx_power,
|
||||
|
@ -152,7 +152,7 @@
|
|||
local->hw.cur_power_level = power;
|
||||
local->hw.conf.power_level = power;
|
||||
}
|
||||
@@ -646,6 +659,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
|
||||
@@ -582,6 +595,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
|
||||
IEEE80211_RADIOTAP_MCS_HAVE_BW;
|
||||
local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
|
||||
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2836,7 +2836,7 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
@@ -2825,7 +2825,7 @@ void ath9k_hw_apply_txpower(struct ath_h
|
||||
channel = chan->chan;
|
||||
chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
|
||||
new_pwr = min_t(int, chan_pwr, reg->power_limit);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -556,6 +556,9 @@ struct ath9k_wow_pattern {
|
||||
@@ -551,6 +551,9 @@ struct ath9k_wow_pattern {
|
||||
void ath_init_leds(struct ath_softc *sc);
|
||||
void ath_deinit_leds(struct ath_softc *sc);
|
||||
void ath_fill_led_pin(struct ath_softc *sc);
|
||||
|
@ -10,7 +10,7 @@
|
|||
#else
|
||||
static inline void ath_init_leds(struct ath_softc *sc)
|
||||
{
|
||||
@@ -675,6 +678,13 @@ struct ath9k_vif_iter_data {
|
||||
@@ -670,6 +673,13 @@ struct ath9k_vif_iter_data {
|
||||
int nadhocs; /* number of adhoc vifs */
|
||||
};
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
|||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
@@ -716,9 +726,8 @@ struct ath_softc {
|
||||
@@ -711,9 +721,8 @@ struct ath_softc {
|
||||
struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
|
||||
|
||||
#ifdef CONFIG_MAC80211_LEDS
|
||||
|
@ -162,7 +162,7 @@
|
|||
void ath_fill_led_pin(struct ath_softc *sc)
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -878,7 +878,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
@@ -865,7 +865,7 @@ int ath9k_init_device(u16 devid, struct
|
||||
|
||||
#ifdef CONFIG_MAC80211_LEDS
|
||||
/* must be initialized before ieee80211_register_hw */
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/net/mac80211/ieee80211_i.h
|
||||
+++ b/net/mac80211/ieee80211_i.h
|
||||
@@ -761,6 +761,8 @@ struct ieee80211_sub_if_data {
|
||||
@@ -764,6 +764,8 @@ struct ieee80211_sub_if_data {
|
||||
|
||||
/* bitmap of allowed (non-MCS) rate indexes for rate control */
|
||||
u32 rc_rateidx_mask[IEEE80211_NUM_BANDS];
|
||||
|
@ -11,7 +11,7 @@
|
|||
union {
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -2300,9 +2300,20 @@ static int ieee80211_set_bitrate_mask(st
|
||||
@@ -2328,9 +2328,20 @@ static int ieee80211_set_bitrate_mask(st
|
||||
}
|
||||
|
||||
for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
|
||||
|
@ -34,7 +34,7 @@
|
|||
return 0;
|
||||
--- a/include/net/mac80211.h
|
||||
+++ b/include/net/mac80211.h
|
||||
@@ -3968,7 +3968,7 @@ void ieee80211_send_bar(struct ieee80211
|
||||
@@ -3985,7 +3985,7 @@ void ieee80211_send_bar(struct ieee80211
|
||||
* (deprecated; this will be removed once drivers get updated to use
|
||||
* rate_idx_mask)
|
||||
* @rate_idx_mask: user-requested (legacy) rate mask
|
||||
|
@ -43,7 +43,7 @@
|
|||
* @bss: whether this frame is sent out in AP or IBSS mode
|
||||
*/
|
||||
struct ieee80211_tx_rate_control {
|
||||
@@ -3980,7 +3980,7 @@ struct ieee80211_tx_rate_control {
|
||||
@@ -3997,7 +3997,7 @@ struct ieee80211_tx_rate_control {
|
||||
bool rts, short_preamble;
|
||||
u8 max_rate_idx;
|
||||
u32 rate_idx_mask;
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
/* Mesh flags */
|
||||
#define MESH_FLAGS_AE_A4 0x1
|
||||
@@ -830,7 +830,7 @@ struct ieee80211_mgmt {
|
||||
@@ -839,7 +839,7 @@ struct ieee80211_mgmt {
|
||||
} u;
|
||||
} __packed action;
|
||||
} u;
|
||||
|
@ -45,7 +45,7 @@
|
|||
|
||||
/* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */
|
||||
#define BSS_MEMBERSHIP_SELECTOR_HT_PHY 127
|
||||
@@ -861,20 +861,20 @@ struct ieee80211_rts {
|
||||
@@ -870,20 +870,20 @@ struct ieee80211_rts {
|
||||
__le16 duration;
|
||||
u8 ra[6];
|
||||
u8 ta[6];
|
||||
|
|
|
@ -62,7 +62,7 @@
|
|||
debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -498,6 +498,12 @@ enum {
|
||||
@@ -499,6 +499,12 @@ enum {
|
||||
ATH9K_RESET_COLD,
|
||||
};
|
||||
|
||||
|
@ -75,7 +75,7 @@
|
|||
struct ath9k_hw_version {
|
||||
u32 magic;
|
||||
u16 devid;
|
||||
@@ -742,6 +748,8 @@ struct ath_hw {
|
||||
@@ -740,6 +746,8 @@ struct ath_hw {
|
||||
u32 rfkill_polarity;
|
||||
u32 ah_flags;
|
||||
|
||||
|
@ -84,7 +84,7 @@
|
|||
bool reset_power_on;
|
||||
bool htc_reset_init;
|
||||
|
||||
@@ -1010,6 +1018,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
|
||||
@@ -1007,6 +1015,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
|
||||
bool ath9k_hw_check_alive(struct ath_hw *ah);
|
||||
|
||||
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
|
||||
|
@ -94,7 +94,7 @@
|
|||
void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause);
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -1762,6 +1762,20 @@ fail:
|
||||
@@ -1754,6 +1754,20 @@ fail:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -115,7 +115,7 @@
|
|||
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||
struct ath9k_hw_cal_data *caldata, bool fastcc)
|
||||
{
|
||||
@@ -2039,6 +2053,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
@@ -2031,6 +2045,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
|
||||
}
|
||||
|
||||
ath9k_hw_apply_gpio_override(ah);
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.c
|
||||
@@ -2429,17 +2429,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
|
||||
@@ -2421,17 +2421,25 @@ int ath9k_hw_fill_cap_info(struct ath_hw
|
||||
}
|
||||
|
||||
eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
|
||||
|
@ -48,7 +48,7 @@
|
|||
AR_SREV_9285(ah) ||
|
||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||
@@ -930,6 +930,8 @@ struct ath_hw {
|
||||
@@ -927,6 +927,8 @@ struct ath_hw {
|
||||
bool is_clk_25mhz;
|
||||
int (*get_mac_revision)(void);
|
||||
int (*external_reset)(void);
|
||||
|
@ -59,7 +59,7 @@
|
|||
};
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -591,6 +591,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||
@@ -582,6 +582,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
||||
ah->get_mac_revision = pdata->get_mac_revision;
|
||||
ah->external_reset = pdata->external_reset;
|
||||
|
|
|
@ -186,29 +186,34 @@
|
|||
obj-$(CONFIG_RT2X00_LIB_PCI) += rt2x00pci.o
|
||||
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
|
||||
@@ -89,20 +89,10 @@ static void rt2800pci_mcu_status(struct
|
||||
@@ -89,25 +89,11 @@ static void rt2800pci_mcu_status(struct
|
||||
rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
|
||||
}
|
||||
|
||||
-#if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X)
|
||||
static void rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
static int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
- void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE);
|
||||
-
|
||||
- if (!base_addr)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- memcpy_fromio(rt2x00dev->eeprom, base_addr, EEPROM_SIZE);
|
||||
-
|
||||
- iounmap(base_addr);
|
||||
+ memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE);
|
||||
return 0;
|
||||
}
|
||||
-#else
|
||||
-static inline void rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
-static inline int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
-{
|
||||
- return -ENOMEM;
|
||||
-}
|
||||
-#endif /* CONFIG_RALINK_RT288X || CONFIG_RALINK_RT305X */
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
|
||||
@@ -322,6 +312,20 @@ static int rt2800pci_write_firmware(stru
|
||||
@@ -331,6 +317,20 @@ static int rt2800pci_write_firmware(stru
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -229,7 +234,7 @@
|
|||
* Initialization functions.
|
||||
*/
|
||||
static bool rt2800pci_get_entry_state(struct queue_entry *entry)
|
||||
@@ -1033,6 +1037,7 @@ static const struct rt2x00lib_ops rt2800
|
||||
@@ -1046,6 +1046,7 @@ static const struct rt2x00lib_ops rt2800
|
||||
.get_firmware_name = rt2800pci_get_firmware_name,
|
||||
.check_firmware = rt2800_check_firmware,
|
||||
.load_firmware = rt2800_load_firmware,
|
||||
|
|
|
@ -4,22 +4,22 @@
|
|||
rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
|
||||
}
|
||||
|
||||
-static void rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
-static int rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev)
|
||||
+static void rt2800pci_read_eeprom_file(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE);
|
||||
}
|
||||
@@ -976,8 +976,9 @@ static irqreturn_t rt2800pci_interrupt(i
|
||||
*/
|
||||
static void rt2800pci_read_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
return 0;
|
||||
@@ -983,8 +983,9 @@ static int rt2800pci_read_eeprom(struct
|
||||
{
|
||||
int retval;
|
||||
|
||||
- if (rt2x00_is_soc(rt2x00dev))
|
||||
- rt2800pci_read_eeprom_soc(rt2x00dev);
|
||||
- retval = rt2800pci_read_eeprom_soc(rt2x00dev);
|
||||
+ if (rt2x00_is_soc(rt2x00dev) ||
|
||||
+ test_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags))
|
||||
+ rt2800pci_read_eeprom_file(rt2x00dev);
|
||||
else if (rt2800pci_efuse_detect(rt2x00dev))
|
||||
rt2800pci_read_eeprom_efuse(rt2x00dev);
|
||||
retval = rt2800pci_read_eeprom_efuse(rt2x00dev);
|
||||
else
|
||||
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
|
||||
|
|
|
@ -22,90 +22,92 @@
|
|||
rt2800_bbp_write(rt2x00dev, 86, 0);
|
||||
}
|
||||
|
||||
@@ -3890,6 +3893,7 @@ static int rt2800_init_rfcsr(struct rt2x
|
||||
* Init RF calibration.
|
||||
*/
|
||||
@@ -3671,6 +3674,7 @@ static int rt2800_init_bbp(struct rt2x00
|
||||
rt2800_bbp_write(rt2x00dev, 120, 0x50);
|
||||
|
||||
if (rt2x00_rt(rt2x00dev, RT3290) ||
|
||||
+ rt2x00_rt(rt2x00dev, RT3352) ||
|
||||
rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
rt2x00_rt(rt2x00dev, RT5392)) {
|
||||
rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
|
||||
@@ -4076,6 +4080,10 @@ static int rt2800_init_rfcsr(struct rt2x
|
||||
rt2800_rfcsr_write(rt2x00dev, 31, 0x00);
|
||||
return 0;
|
||||
} else if (rt2x00_rt(rt2x00dev, RT3352)) {
|
||||
+ int tx0_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX0,
|
||||
+ &rt2x00dev->cap_flags);
|
||||
+ int tx1_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX1,
|
||||
+ &rt2x00dev->cap_flags);
|
||||
rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
|
||||
rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
|
||||
rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
|
||||
@@ -4109,15 +4117,30 @@ static int rt2800_init_rfcsr(struct rt2x
|
||||
rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
|
||||
rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
|
||||
rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 34, 0x01);
|
||||
+ rfcsr = 0x01;
|
||||
+ if (!tx0_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR34_TX0_EXT_PA, 1);
|
||||
+ if (!tx1_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR34_TX1_EXT_PA, 1);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 34, rfcsr );
|
||||
rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
|
||||
rt2800_rfcsr_write(rt2x00dev, 36, 0xbd);
|
||||
rt2800_rfcsr_write(rt2x00dev, 37, 0x3c);
|
||||
rt2800_rfcsr_write(rt2x00dev, 38, 0x5f);
|
||||
rt2800_rfcsr_write(rt2x00dev, 39, 0xc5);
|
||||
rt2800_rfcsr_write(rt2x00dev, 40, 0x33);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 41, 0x5b);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 42, 0x5b);
|
||||
+ rfcsr = 0x52;
|
||||
+ if (tx0_int_pa) {
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR41_BIT1, 1);
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR41_BIT4, 1);
|
||||
+ }
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 41, rfcsr);
|
||||
+ rfcsr = 0x52;
|
||||
+ if (tx1_int_pa) {
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR42_BIT1, 1);
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR42_BIT4, 1);
|
||||
+ }
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 42, rfcsr);
|
||||
rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
|
||||
rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
|
||||
rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
|
||||
@@ -4125,15 +4148,20 @@ static int rt2800_init_rfcsr(struct rt2x
|
||||
rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
|
||||
rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
|
||||
rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 50, 0x2d);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 51, 0x7f);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 52, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 53, 0x52);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 54, 0x1b);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 55, 0x7f);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 56, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 57, 0x52);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 58, 0x1b);
|
||||
+ rfcsr = 0x2d;
|
||||
+ if (!tx0_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR50_TX0_EXT_PA, 1);
|
||||
+ if (!tx1_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR50_TX1_EXT_PA, 1);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 51, (tx0_int_pa ? 0x7f : 0x52));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 52, (tx0_int_pa ? 0x00 : 0xc0));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 53, (tx0_int_pa ? 0x52 : 0xd2));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 54, (tx0_int_pa ? 0x1b : 0xc0));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 55, (tx1_int_pa ? 0x7f : 0x52));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 56, (tx1_int_pa ? 0x00 : 0xc0));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 57, (tx0_int_pa ? 0x52 : 0x49));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 58, (tx1_int_pa ? 0x1b : 0xc0));
|
||||
rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
|
||||
rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
|
||||
rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
|
||||
@@ -4894,7 +4922,8 @@ static int rt2800_init_eeprom(struct rt2
|
||||
rt2x00_rt(rt2x00dev, RT5392))
|
||||
rt2800_bbp_write(rt2x00dev, 128, 0x12);
|
||||
@@ -3977,6 +3981,12 @@ static void rt2800_init_rfcsr_3290(struc
|
||||
|
||||
static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
+ int tx0_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX0,
|
||||
+ &rt2x00dev->cap_flags);
|
||||
+ int tx1_int_pa = test_bit(CAPABILITY_INTERNAL_PA_TX1,
|
||||
+ &rt2x00dev->cap_flags);
|
||||
+ u8 rfcsr;
|
||||
+
|
||||
rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
|
||||
rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
|
||||
rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
|
||||
@@ -4010,15 +4020,30 @@ static void rt2800_init_rfcsr_3352(struc
|
||||
rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
|
||||
rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
|
||||
rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 34, 0x01);
|
||||
+ rfcsr = 0x01;
|
||||
+ if (!tx0_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR34_TX0_EXT_PA, 1);
|
||||
+ if (!tx1_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR34_TX1_EXT_PA, 1);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 34, rfcsr );
|
||||
rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
|
||||
rt2800_rfcsr_write(rt2x00dev, 36, 0xbd);
|
||||
rt2800_rfcsr_write(rt2x00dev, 37, 0x3c);
|
||||
rt2800_rfcsr_write(rt2x00dev, 38, 0x5f);
|
||||
rt2800_rfcsr_write(rt2x00dev, 39, 0xc5);
|
||||
rt2800_rfcsr_write(rt2x00dev, 40, 0x33);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 41, 0x5b);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 42, 0x5b);
|
||||
+ rfcsr = 0x52;
|
||||
+ if (tx0_int_pa) {
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR41_BIT1, 1);
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR41_BIT4, 1);
|
||||
+ }
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 41, rfcsr);
|
||||
+ rfcsr = 0x52;
|
||||
+ if (tx1_int_pa) {
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR42_BIT1, 1);
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR42_BIT4, 1);
|
||||
+ }
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 42, rfcsr);
|
||||
rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
|
||||
rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
|
||||
rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
|
||||
@@ -4026,15 +4051,20 @@ static void rt2800_init_rfcsr_3352(struc
|
||||
rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
|
||||
rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
|
||||
rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 50, 0x2d);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 51, 0x7f);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 52, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 53, 0x52);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 54, 0x1b);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 55, 0x7f);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 56, 0x00);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 57, 0x52);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 58, 0x1b);
|
||||
+ rfcsr = 0x2d;
|
||||
+ if (!tx0_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR50_TX0_EXT_PA, 1);
|
||||
+ if (!tx1_int_pa)
|
||||
+ rt2x00_set_field8(&rfcsr, RFCSR50_TX1_EXT_PA, 1);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 51, (tx0_int_pa ? 0x7f : 0x52));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 52, (tx0_int_pa ? 0x00 : 0xc0));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 53, (tx0_int_pa ? 0x52 : 0xd2));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 54, (tx0_int_pa ? 0x1b : 0xc0));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 55, (tx1_int_pa ? 0x7f : 0x52));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 56, (tx1_int_pa ? 0x00 : 0xc0));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 57, (tx0_int_pa ? 0x52 : 0x49));
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 58, (tx1_int_pa ? 0x1b : 0xc0));
|
||||
rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
|
||||
rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
|
||||
rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
|
||||
@@ -4950,7 +4980,8 @@ static int rt2800_init_eeprom(struct rt2
|
||||
/*
|
||||
* Detect if this device has Bluetooth co-existence.
|
||||
*/
|
||||
|
@ -115,7 +117,7 @@
|
|||
__set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
|
||||
|
||||
/*
|
||||
@@ -4923,6 +4952,22 @@ static int rt2800_init_eeprom(struct rt2
|
||||
@@ -4979,6 +5010,22 @@ static int rt2800_init_eeprom(struct rt2
|
||||
EIRP_MAX_TX_POWER_LIMIT)
|
||||
__set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
|
||||
@@ -5112,6 +5112,27 @@ static const struct rf_channel rf_vals_3
|
||||
@@ -5170,6 +5170,27 @@ static const struct rf_channel rf_vals_3
|
||||
{173, 0x61, 0, 9},
|
||||
};
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
|||
static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct hw_mode_spec *spec = &rt2x00dev->spec;
|
||||
@@ -5190,7 +5211,6 @@ static int rt2800_probe_hw_mode(struct r
|
||||
@@ -5248,7 +5269,6 @@ static int rt2800_probe_hw_mode(struct r
|
||||
rt2x00_rf(rt2x00dev, RF3022) ||
|
||||
rt2x00_rf(rt2x00dev, RF3290) ||
|
||||
rt2x00_rf(rt2x00dev, RF3320) ||
|
||||
|
@ -36,7 +36,7 @@
|
|||
rt2x00_rf(rt2x00dev, RF5360) ||
|
||||
rt2x00_rf(rt2x00dev, RF5370) ||
|
||||
rt2x00_rf(rt2x00dev, RF5372) ||
|
||||
@@ -5198,6 +5218,12 @@ static int rt2800_probe_hw_mode(struct r
|
||||
@@ -5256,6 +5276,12 @@ static int rt2800_probe_hw_mode(struct r
|
||||
rt2x00_rf(rt2x00dev, RF5392)) {
|
||||
spec->num_channels = 14;
|
||||
spec->channels = rf_vals_3x;
|
||||
|
@ -49,7 +49,7 @@
|
|||
} else if (rt2x00_rf(rt2x00dev, RF3052)) {
|
||||
spec->supported_bands |= SUPPORT_BAND_5GHZ;
|
||||
spec->num_channels = ARRAY_SIZE(rf_vals_3x);
|
||||
@@ -5291,6 +5317,19 @@ static int rt2800_probe_hw_mode(struct r
|
||||
@@ -5349,6 +5375,19 @@ static int rt2800_probe_hw_mode(struct r
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -69,7 +69,7 @@
|
|||
int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
int retval;
|
||||
@@ -5316,6 +5355,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
|
||||
@@ -5374,6 +5413,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
|
||||
rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/mwl8k.c
|
||||
+++ b/drivers/net/wireless/mwl8k.c
|
||||
@@ -5320,6 +5320,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
@@ -5389,6 +5389,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
|
||||
|
||||
static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
--- a/drivers/net/wireless/b43/b43.h
|
||||
+++ b/drivers/net/wireless/b43/b43.h
|
||||
@@ -807,6 +807,7 @@ struct b43_wldev {
|
||||
@@ -812,6 +812,7 @@ struct b43_wldev {
|
||||
bool qos_enabled; /* TRUE, if QoS is used. */
|
||||
bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */
|
||||
bool use_pio; /* TRUE if next init should use PIO */
|
||||
|
@ -22,7 +22,7 @@
|
|||
static int modparam_bad_frames_preempt;
|
||||
module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
|
||||
MODULE_PARM_DESC(bad_frames_preempt,
|
||||
@@ -2712,10 +2717,10 @@ static int b43_gpio_init(struct b43_wlde
|
||||
@@ -2740,10 +2745,10 @@ static int b43_gpio_init(struct b43_wlde
|
||||
u32 mask, set;
|
||||
|
||||
b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
antenna = b43_antenna_to_phyctl(antenna);
|
||||
ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
|
||||
/* We can't send beacons with short preamble. Would get PHY errors. */
|
||||
@@ -3073,8 +3073,8 @@ static int b43_chip_init(struct b43_wlde
|
||||
@@ -3101,8 +3101,8 @@ static int b43_chip_init(struct b43_wlde
|
||||
|
||||
/* Select the antennae */
|
||||
if (phy->ops->set_rx_antenna)
|
||||
|
@ -20,7 +20,7 @@
|
|||
|
||||
if (phy->type == B43_PHYTYPE_B) {
|
||||
value16 = b43_read16(dev, 0x005E);
|
||||
@@ -3818,7 +3818,6 @@ static int b43_op_config(struct ieee8021
|
||||
@@ -3846,7 +3846,6 @@ static int b43_op_config(struct ieee8021
|
||||
struct b43_wldev *dev;
|
||||
struct b43_phy *phy;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
|
@ -28,7 +28,7 @@
|
|||
int err = 0;
|
||||
bool reload_bss = false;
|
||||
|
||||
@@ -3872,11 +3871,9 @@ static int b43_op_config(struct ieee8021
|
||||
@@ -3900,11 +3899,9 @@ static int b43_op_config(struct ieee8021
|
||||
}
|
||||
|
||||
/* Antennas for RX and management frame TX. */
|
||||
|
@ -42,7 +42,7 @@
|
|||
|
||||
if (wl->radio_enabled != phy->radio_on) {
|
||||
if (wl->radio_enabled) {
|
||||
@@ -5002,6 +4999,47 @@ static int b43_op_get_survey(struct ieee
|
||||
@@ -5030,6 +5027,47 @@ static int b43_op_get_survey(struct ieee
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -90,7 +90,7 @@
|
|||
static const struct ieee80211_ops b43_hw_ops = {
|
||||
.tx = b43_op_tx,
|
||||
.conf_tx = b43_op_conf_tx,
|
||||
@@ -5023,6 +5061,8 @@ static const struct ieee80211_ops b43_hw
|
||||
@@ -5051,6 +5089,8 @@ static const struct ieee80211_ops b43_hw
|
||||
.sw_scan_complete = b43_op_sw_scan_complete_notifier,
|
||||
.get_survey = b43_op_get_survey,
|
||||
.rfkill_poll = b43_rfkill_poll,
|
||||
|
@ -99,7 +99,7 @@
|
|||
};
|
||||
|
||||
/* Hard-reset the chip. Do not call this directly.
|
||||
@@ -5269,6 +5309,8 @@ static int b43_one_core_attach(struct b4
|
||||
@@ -5297,6 +5337,8 @@ static int b43_one_core_attach(struct b4
|
||||
if (!wldev)
|
||||
goto out;
|
||||
|
||||
|
@ -108,7 +108,7 @@
|
|||
wldev->use_pio = b43_modparam_pio;
|
||||
wldev->dev = dev;
|
||||
wldev->wl = wl;
|
||||
@@ -5359,6 +5401,9 @@ static struct b43_wl *b43_wireless_init(
|
||||
@@ -5387,6 +5429,9 @@ static struct b43_wl *b43_wireless_init(
|
||||
|
||||
hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
|
||||
|
||||
|
@ -120,7 +120,7 @@
|
|||
SET_IEEE80211_DEV(hw, dev->dev);
|
||||
--- a/drivers/net/wireless/b43/b43.h
|
||||
+++ b/drivers/net/wireless/b43/b43.h
|
||||
@@ -808,6 +808,8 @@ struct b43_wldev {
|
||||
@@ -813,6 +813,8 @@ struct b43_wldev {
|
||||
bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */
|
||||
bool use_pio; /* TRUE if next init should use PIO */
|
||||
int gpiomask; /* GPIO LED mask as a module parameter */
|
||||
|
|
|
@ -19,7 +19,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|||
|
||||
--- a/drivers/net/wireless/b43/b43.h
|
||||
+++ b/drivers/net/wireless/b43/b43.h
|
||||
@@ -1048,6 +1048,32 @@ static inline bool b43_using_pio_transfe
|
||||
@@ -1053,6 +1053,32 @@ static inline bool b43_using_pio_transfe
|
||||
return dev->__using_pio_transfers;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
|
||||
+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
|
||||
@@ -95,6 +95,7 @@ MODULE_FIRMWARE("brcm/bcm43xx_hdr-0.fw")
|
||||
|
||||
/* recognized BCMA Core IDs */
|
||||
static struct bcma_device_id brcms_coreid_table[] = {
|
||||
+ BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 17, BCMA_ANY_CLASS),
|
||||
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 23, BCMA_ANY_CLASS),
|
||||
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 24, BCMA_ANY_CLASS),
|
||||
BCMA_CORETABLE_END
|
||||
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
|
||||
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
|
||||
@@ -719,7 +719,7 @@ static void brcms_c_ucode_bsinit(struct
|
||||
brcms_c_write_mhf(wlc_hw, wlc_hw->band->mhfs);
|
||||
|
||||
/* do band-specific ucode IHR, SHM, and SCR inits */
|
||||
- if (D11REV_IS(wlc_hw->corerev, 23)) {
|
||||
+ if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
|
||||
if (BRCMS_ISNPHY(wlc_hw->band))
|
||||
brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16);
|
||||
else
|
||||
@@ -2266,7 +2266,7 @@ static void brcms_ucode_download(struct
|
||||
if (wlc_hw->ucode_loaded)
|
||||
return;
|
||||
|
||||
- if (D11REV_IS(wlc_hw->corerev, 23)) {
|
||||
+ if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
|
||||
if (BRCMS_ISNPHY(wlc_hw->band)) {
|
||||
brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
|
||||
ucode->bcm43xx_16_mimosz);
|
||||
@@ -3218,7 +3218,7 @@ static void brcms_b_coreinit(struct brcm
|
||||
|
||||
sflags = bcma_aread32(core, BCMA_IOST);
|
||||
|
||||
- if (D11REV_IS(wlc_hw->corerev, 23)) {
|
||||
+ if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
|
||||
if (BRCMS_ISNPHY(wlc_hw->band))
|
||||
brcms_c_write_inits(wlc_hw, ucode->d11n0initvals16);
|
||||
else
|
|
@ -28,7 +28,7 @@
|
|||
if (BRCMS_ISNPHY(wlc_hw->band)) {
|
||||
brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
|
||||
ucode->bcm43xx_16_mimosz);
|
||||
@@ -3218,7 +3218,7 @@ static void brcms_b_coreinit(struct brcm
|
||||
@@ -3217,7 +3217,7 @@ static void brcms_b_coreinit(struct brcm
|
||||
|
||||
sflags = bcma_aread32(core, BCMA_IOST);
|
||||
|
||||
|
@ -37,7 +37,7 @@
|
|||
if (BRCMS_ISNPHY(wlc_hw->band))
|
||||
brcms_c_write_inits(wlc_hw, ucode->d11n0initvals16);
|
||||
else
|
||||
@@ -5675,6 +5675,8 @@ static bool brcms_c_chipmatch_soc(struct
|
||||
@@ -5674,6 +5674,8 @@ static bool brcms_c_chipmatch_soc(struct
|
||||
|
||||
if (chipinfo->id == BCMA_CHIP_ID_BCM4716)
|
||||
return true;
|
|
@ -1,21 +0,0 @@
|
|||
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
|
||||
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
|
||||
@@ -4502,7 +4502,8 @@ static int brcms_b_attach(struct brcms_c
|
||||
|
||||
/* check device id(srom, nvram etc.) to set bands */
|
||||
if (wlc_hw->deviceid == BCM43224_D11N_ID ||
|
||||
- wlc_hw->deviceid == BCM43224_D11N_ID_VEN1)
|
||||
+ wlc_hw->deviceid == BCM43224_D11N_ID_VEN1 ||
|
||||
+ wlc_hw->deviceid == BCM43224_CHIP_ID)
|
||||
/* Dualband boards */
|
||||
wlc_hw->_nbands = 2;
|
||||
else
|
||||
@@ -5655,7 +5656,7 @@ static bool brcms_c_chipmatch_pci(struct
|
||||
return false;
|
||||
}
|
||||
|
||||
- if (device == BCM43224_D11N_ID_VEN1)
|
||||
+ if (device == BCM43224_D11N_ID_VEN1 || device == BCM43224_CHIP_ID)
|
||||
return true;
|
||||
if ((device == BCM43224_D11N_ID) || (device == BCM43225_D11N2G_ID))
|
||||
return true;
|
|
@ -1,11 +0,0 @@
|
|||
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
|
||||
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
|
||||
@@ -2922,7 +2922,7 @@ brcms_b_write_objmem(struct brcms_hardwa
|
||||
if (offset & 2)
|
||||
objoff += 2;
|
||||
|
||||
- bcma_write16(core, objoff, v);
|
||||
+ bcma_wflush16(core, objoff, v);
|
||||
}
|
||||
|
||||
/*
|
Loading…
Reference in a new issue