mac80211: ath9k: allow to load EEPROM data via firmware API
Signed-off-by: Gabor Juhos <juhosg@openwrt.org> SVN-Revision: 34606
This commit is contained in:
		@@ -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
 | 
			
		||||
+++ 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_PARM_DESC(nohwcrypt, "Disable hardware encryption");
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/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
 | 
			
		||||
 				 BIT(NL80211_IFTYPE_AP) |
 | 
			
		||||
 				 BIT(NL80211_IFTYPE_P2P_GO) },
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/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 ath_common *common = ath9k_hw_common(ah);
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 	u32 sum = 0, el;
 | 
			
		||||
 	bool need_swap = false;
 | 
			
		||||
 	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;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
@@ -49,29 +49,29 @@
 | 
			
		||||
 
 | 
			
		||||
--- a/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
 | 
			
		||||
 	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;
 | 
			
		||||
@@ -57,7 +57,7 @@ static bool ath9k_hw_4k_fill_eeprom(stru
 | 
			
		||||
 {
 | 
			
		||||
 	struct ath_common *common = ath9k_hw_common(ah);
 | 
			
		||||
 
 | 
			
		||||
-	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");
 | 
			
		||||
 		ath_dbg(common, EEPROM, "Reading from EEPROM, not flash\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
 | 
			
		||||
+++ 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_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
 | 
			
		||||
@@ -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->get_mac_revision = pdata->get_mac_revision;
 | 
			
		||||
 		ah->external_reset = pdata->external_reset;
 | 
			
		||||
@@ -92,7 +92,7 @@
 | 
			
		||||
 	common = ath9k_hw_common(ah);
 | 
			
		||||
--- a/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_val;
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/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;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -47,10 +47,11 @@
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /* 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;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
+
 | 
			
		||||
+	if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) {
 | 
			
		||||
+		int idx, dbi = 0;
 | 
			
		||||
+
 | 
			
		||||
@@ -66,10 +67,9 @@
 | 
			
		||||
+		if (result)
 | 
			
		||||
+			goto bad_res;
 | 
			
		||||
+	}
 | 
			
		||||
+
 | 
			
		||||
 
 | 
			
		||||
 	if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
 | 
			
		||||
 	    info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
 | 
			
		||||
 		u32 tx_ant, rx_ant;
 | 
			
		||||
--- a/net/mac80211/cfg.c
 | 
			
		||||
+++ b/net/mac80211/cfg.c
 | 
			
		||||
@@ -2118,6 +2118,19 @@ static int ieee80211_get_tx_power(struct
 | 
			
		||||
@@ -92,7 +92,7 @@
 | 
			
		||||
 static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
 				  const u8 *addr)
 | 
			
		||||
 {
 | 
			
		||||
@@ -3241,6 +3254,7 @@ struct cfg80211_ops mac80211_config_ops 
 | 
			
		||||
@@ -3241,6 +3254,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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -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
 | 
			
		||||
 	/* must be initialized before ieee80211_register_hw */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/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;
 | 
			
		||||
 	int (*get_mac_revision)(void);
 | 
			
		||||
 	int (*external_reset)(void);
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -497,6 +497,12 @@ enum {
 | 
			
		||||
@@ -498,6 +498,12 @@ enum {
 | 
			
		||||
 	ATH9K_RESET_COLD,
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@
 | 
			
		||||
 struct ath9k_hw_version {
 | 
			
		||||
 	u32 magic;
 | 
			
		||||
 	u16 devid;
 | 
			
		||||
@@ -741,6 +747,8 @@ struct ath_hw {
 | 
			
		||||
@@ -742,6 +748,8 @@ struct ath_hw {
 | 
			
		||||
 	u32 rfkill_polarity;
 | 
			
		||||
 	u32 ah_flags;
 | 
			
		||||
 
 | 
			
		||||
@@ -84,7 +84,7 @@
 | 
			
		||||
 	bool reset_power_on;
 | 
			
		||||
 	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_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
--- a/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 is_clk_25mhz;
 | 
			
		||||
@@ -48,18 +48,18 @@
 | 
			
		||||
 	    AR_SREV_9285(ah) ||
 | 
			
		||||
--- a/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;
 | 
			
		||||
 	int (*get_mac_revision)(void);
 | 
			
		||||
 	int (*external_reset)(void);
 | 
			
		||||
+	bool disable_2ghz;
 | 
			
		||||
+	bool disable_5ghz;
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 struct ath_bus_ops {
 | 
			
		||||
 	const struct firmware *eeprom_blob;
 | 
			
		||||
 };
 | 
			
		||||
--- a/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->get_mac_revision = pdata->get_mac_revision;
 | 
			
		||||
 		ah->external_reset = pdata->external_reset;
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user