mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-24 02:34:06 +02:00
mac80211: ath9k: allow to load EEPROM data via firmware API
Signed-off-by: Gabor Juhos <juhosg@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34606 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
beeef9a363
commit
dea54ca840
@ -0,0 +1,83 @@
|
|||||||
|
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;
|
@ -0,0 +1,26 @@
|
|||||||
|
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;
|
||||||
|
}
|
@ -0,0 +1,203 @@
|
|||||||
|
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;
|
||||||
|
}
|
@ -0,0 +1,184 @@
|
|||||||
|
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->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,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||||
@@ -40,7 +40,7 @@ int ath9k_modparam_nohwcrypt;
|
@@ -45,7 +45,7 @@ int ath9k_modparam_nohwcrypt;
|
||||||
module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
|
module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
|
||||||
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
|
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||||
@@ -678,6 +678,7 @@ static const struct ieee80211_iface_limi
|
@@ -735,6 +735,7 @@ static const struct ieee80211_iface_limi
|
||||||
#endif
|
#endif
|
||||||
BIT(NL80211_IFTYPE_AP) |
|
BIT(NL80211_IFTYPE_AP) |
|
||||||
BIT(NL80211_IFTYPE_P2P_GO) },
|
BIT(NL80211_IFTYPE_P2P_GO) },
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
||||||
@@ -266,7 +266,7 @@ static int ath9k_hw_def_check_eeprom(str
|
@@ -262,7 +262,7 @@ static int ath9k_hw_def_check_eeprom(str
|
||||||
{
|
{
|
||||||
struct ar5416_eeprom_def *eep = &ah->eeprom.def;
|
struct ar5416_eeprom_def *eep = &ah->eeprom.def;
|
||||||
struct ath_common *common = ath9k_hw_common(ah);
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
@ -9,7 +9,7 @@
|
|||||||
u32 sum = 0, el;
|
u32 sum = 0, el;
|
||||||
bool need_swap = false;
|
bool need_swap = false;
|
||||||
int i, addr, size;
|
int i, addr, size;
|
||||||
@@ -276,27 +276,16 @@ static int ath9k_hw_def_check_eeprom(str
|
@@ -272,27 +272,16 @@ static int ath9k_hw_def_check_eeprom(str
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,29 +49,29 @@
|
|||||||
|
|
||||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
||||||
@@ -195,7 +195,7 @@ static int ath9k_hw_4k_check_eeprom(stru
|
@@ -57,7 +57,7 @@ static bool ath9k_hw_4k_fill_eeprom(stru
|
||||||
int i, addr;
|
{
|
||||||
|
|
||||||
|
|
||||||
- if (!ath9k_hw_use_flash(ah)) {
|
|
||||||
+ if (!(ah->ah_flags & AH_NO_EEP_SWAP)) {
|
|
||||||
if (!ath9k_hw_nvram_read(common, AR5416_EEPROM_MAGIC_OFFSET,
|
|
||||||
&magic)) {
|
|
||||||
ath_err(common, "Reading Magic # failed\n");
|
|
||||||
--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
|
||||||
@@ -189,7 +189,7 @@ static int ath9k_hw_ar9287_check_eeprom(
|
|
||||||
struct ar9287_eeprom *eep = &ah->eeprom.map9287;
|
|
||||||
struct ath_common *common = ath9k_hw_common(ah);
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
|
||||||
- if (!ath9k_hw_use_flash(ah)) {
|
- if (!ath9k_hw_use_flash(ah)) {
|
||||||
+ if (!(ah->ah_flags & AH_NO_EEP_SWAP)) {
|
+ if (!(ah->ah_flags & AH_NO_EEP_SWAP)) {
|
||||||
if (!ath9k_hw_nvram_read(common, AR5416_EEPROM_MAGIC_OFFSET,
|
ath_dbg(common, EEPROM, "Reading from EEPROM, not flash\n");
|
||||||
&magic)) {
|
}
|
||||||
ath_err(common, "Reading Magic # failed\n");
|
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
||||||
|
@@ -60,7 +60,7 @@ static bool ath9k_hw_ar9287_fill_eeprom(
|
||||||
|
{
|
||||||
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
|
||||||
|
- if (!ath9k_hw_use_flash(ah)) {
|
||||||
|
+ if (!(ah->ah_flags & AH_NO_EEP_SWAP)) {
|
||||||
|
ath_dbg(common, EEPROM, "Reading from EEPROM, not flash\n");
|
||||||
|
}
|
||||||
|
|
||||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
@@ -704,6 +704,7 @@ enum ath_cal_list {
|
@@ -705,6 +705,7 @@ enum ath_cal_list {
|
||||||
#define AH_USE_EEPROM 0x1
|
#define AH_USE_EEPROM 0x1
|
||||||
#define AH_UNPLUGGED 0x2 /* The card has been physically removed. */
|
#define AH_UNPLUGGED 0x2 /* The card has been physically removed. */
|
||||||
#define AH_FASTCC 0x4
|
#define AH_FASTCC 0x4
|
||||||
@ -81,7 +81,7 @@
|
|||||||
struct ath_ops reg_ops;
|
struct ath_ops reg_ops;
|
||||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||||
@@ -541,6 +541,8 @@ static int ath9k_init_softc(u16 devid, s
|
@@ -591,6 +591,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||||
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
||||||
ah->get_mac_revision = pdata->get_mac_revision;
|
ah->get_mac_revision = pdata->get_mac_revision;
|
||||||
ah->external_reset = pdata->external_reset;
|
ah->external_reset = pdata->external_reset;
|
||||||
@ -92,7 +92,7 @@
|
|||||||
common = ath9k_hw_common(ah);
|
common = ath9k_hw_common(ah);
|
||||||
--- a/include/linux/ath9k_platform.h
|
--- a/include/linux/ath9k_platform.h
|
||||||
+++ b/include/linux/ath9k_platform.h
|
+++ b/include/linux/ath9k_platform.h
|
||||||
@@ -29,6 +29,7 @@ struct ath9k_platform_data {
|
@@ -31,6 +31,7 @@ struct ath9k_platform_data {
|
||||||
u32 gpio_mask;
|
u32 gpio_mask;
|
||||||
u32 gpio_val;
|
u32 gpio_val;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||||
@@ -936,23 +936,23 @@ static int __init ath9k_init(void)
|
@@ -994,23 +994,23 @@ static int __init ath9k_init(void)
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,10 +47,11 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* policy for the key attributes */
|
/* policy for the key attributes */
|
||||||
@@ -1652,6 +1653,22 @@ static int nl80211_set_wiphy(struct sk_b
|
@@ -1651,6 +1652,22 @@ static int nl80211_set_wiphy(struct sk_b
|
||||||
|
if (result)
|
||||||
goto bad_res;
|
goto bad_res;
|
||||||
}
|
}
|
||||||
|
+
|
||||||
+ if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) {
|
+ if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) {
|
||||||
+ int idx, dbi = 0;
|
+ int idx, dbi = 0;
|
||||||
+
|
+
|
||||||
@ -66,10 +67,9 @@
|
|||||||
+ if (result)
|
+ if (result)
|
||||||
+ goto bad_res;
|
+ goto bad_res;
|
||||||
+ }
|
+ }
|
||||||
+
|
|
||||||
if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
|
if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
|
||||||
info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
|
info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
|
||||||
u32 tx_ant, rx_ant;
|
|
||||||
--- a/net/mac80211/cfg.c
|
--- a/net/mac80211/cfg.c
|
||||||
+++ b/net/mac80211/cfg.c
|
+++ b/net/mac80211/cfg.c
|
||||||
@@ -2118,6 +2118,19 @@ static int ieee80211_get_tx_power(struct
|
@@ -2118,6 +2118,19 @@ static int ieee80211_get_tx_power(struct
|
||||||
|
@ -162,7 +162,7 @@
|
|||||||
void ath_fill_led_pin(struct ath_softc *sc)
|
void ath_fill_led_pin(struct ath_softc *sc)
|
||||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||||
@@ -821,7 +821,7 @@ int ath9k_init_device(u16 devid, struct
|
@@ -878,7 +878,7 @@ int ath9k_init_device(u16 devid, struct
|
||||||
|
|
||||||
#ifdef CONFIG_MAC80211_LEDS
|
#ifdef CONFIG_MAC80211_LEDS
|
||||||
/* must be initialized before ieee80211_register_hw */
|
/* must be initialized before ieee80211_register_hw */
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/include/linux/ath9k_platform.h
|
--- a/include/linux/ath9k_platform.h
|
||||||
+++ b/include/linux/ath9k_platform.h
|
+++ b/include/linux/ath9k_platform.h
|
||||||
@@ -33,6 +33,9 @@ struct ath9k_platform_data {
|
@@ -35,6 +35,9 @@ struct ath9k_platform_data {
|
||||||
bool is_clk_25mhz;
|
bool is_clk_25mhz;
|
||||||
int (*get_mac_revision)(void);
|
int (*get_mac_revision)(void);
|
||||||
int (*external_reset)(void);
|
int (*external_reset)(void);
|
||||||
|
@ -62,7 +62,7 @@
|
|||||||
debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
|
debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
|
||||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
@@ -497,6 +497,12 @@ enum {
|
@@ -498,6 +498,12 @@ enum {
|
||||||
ATH9K_RESET_COLD,
|
ATH9K_RESET_COLD,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -75,7 +75,7 @@
|
|||||||
struct ath9k_hw_version {
|
struct ath9k_hw_version {
|
||||||
u32 magic;
|
u32 magic;
|
||||||
u16 devid;
|
u16 devid;
|
||||||
@@ -741,6 +747,8 @@ struct ath_hw {
|
@@ -742,6 +748,8 @@ struct ath_hw {
|
||||||
u32 rfkill_polarity;
|
u32 rfkill_polarity;
|
||||||
u32 ah_flags;
|
u32 ah_flags;
|
||||||
|
|
||||||
@ -84,7 +84,7 @@
|
|||||||
bool reset_power_on;
|
bool reset_power_on;
|
||||||
bool htc_reset_init;
|
bool htc_reset_init;
|
||||||
|
|
||||||
@@ -1007,6 +1015,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
|
@@ -1010,6 +1018,7 @@ void ath9k_hw_set_sta_beacon_timers(stru
|
||||||
bool ath9k_hw_check_alive(struct ath_hw *ah);
|
bool ath9k_hw_check_alive(struct ath_hw *ah);
|
||||||
|
|
||||||
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
|
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- a/include/linux/ath9k_platform.h
|
--- a/include/linux/ath9k_platform.h
|
||||||
+++ b/include/linux/ath9k_platform.h
|
+++ b/include/linux/ath9k_platform.h
|
||||||
@@ -31,6 +31,9 @@ struct ath9k_platform_data {
|
@@ -33,6 +33,9 @@ struct ath9k_platform_data {
|
||||||
|
|
||||||
bool endian_check;
|
bool endian_check;
|
||||||
bool is_clk_25mhz;
|
bool is_clk_25mhz;
|
||||||
@ -48,18 +48,18 @@
|
|||||||
AR_SREV_9285(ah) ||
|
AR_SREV_9285(ah) ||
|
||||||
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
--- a/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
+++ b/drivers/net/wireless/ath/ath9k/hw.h
|
||||||
@@ -929,6 +929,8 @@ struct ath_hw {
|
@@ -930,6 +930,8 @@ struct ath_hw {
|
||||||
bool is_clk_25mhz;
|
bool is_clk_25mhz;
|
||||||
int (*get_mac_revision)(void);
|
int (*get_mac_revision)(void);
|
||||||
int (*external_reset)(void);
|
int (*external_reset)(void);
|
||||||
+ bool disable_2ghz;
|
+ bool disable_2ghz;
|
||||||
+ bool disable_5ghz;
|
+ bool disable_5ghz;
|
||||||
};
|
|
||||||
|
|
||||||
struct ath_bus_ops {
|
const struct firmware *eeprom_blob;
|
||||||
|
};
|
||||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||||
@@ -541,6 +541,8 @@ static int ath9k_init_softc(u16 devid, s
|
@@ -591,6 +591,8 @@ static int ath9k_init_softc(u16 devid, s
|
||||||
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
ah->is_clk_25mhz = pdata->is_clk_25mhz;
|
||||||
ah->get_mac_revision = pdata->get_mac_revision;
|
ah->get_mac_revision = pdata->get_mac_revision;
|
||||||
ah->external_reset = pdata->external_reset;
|
ah->external_reset = pdata->external_reset;
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
#define ATH9K_PLAT_EEP_MAX_WORDS 2048
|
#define ATH9K_PLAT_EEP_MAX_WORDS 2048
|
||||||
|
|
||||||
struct ath9k_platform_data {
|
struct ath9k_platform_data {
|
||||||
|
const char *eeprom_name;
|
||||||
|
|
||||||
u16 eeprom_data[ATH9K_PLAT_EEP_MAX_WORDS];
|
u16 eeprom_data[ATH9K_PLAT_EEP_MAX_WORDS];
|
||||||
u8 *macaddr;
|
u8 *macaddr;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user