aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/550-ath9k-Add-a-define-for-the-EEPROM-eepmisc-endianness.patch
diff options
context:
space:
mode:
authorMartin Blumenstingl <martin.blumenstingl@googlemail.com>2016-11-26 01:01:13 +0100
committerMathias Kresin <dev@kresin.me>2016-11-29 21:40:16 +0100
commit3f889418a504b9c5d5781c2248bc3b3dc515ff03 (patch)
tree29af20d775cb4717ac325764fd70def3d3cfd2ce /package/kernel/mac80211/patches/550-ath9k-Add-a-define-for-the-EEPROM-eepmisc-endianness.patch
parent1847248fc1560d10cb49c88b343598c9cb673f38 (diff)
downloadupstream-3f889418a504b9c5d5781c2248bc3b3dc515ff03.tar.gz
upstream-3f889418a504b9c5d5781c2248bc3b3dc515ff03.tar.bz2
upstream-3f889418a504b9c5d5781c2248bc3b3dc515ff03.zip
kernel: mac80211: add pending ath9k EEPROM swapping patches
There are two types of swapping the EEPROM data in the ath9k driver. Before this series one type of swapping could not be used without the other. The first type of swapping looks at the "magic bytes" at the start of the EEPROM data and performs swab16 on the EEPROM contents if needed. The second type of swapping is EEPROM format specific and swaps specific fields within the EEPROM itself (swab16, swab32 - depends on the EEPROM format). With this series the second part now looks at the EEPMISC register inside the EEPROM, which uses a bit to indicate if the EEPROM data is Big Endian (this is also done by the FreeBSD kernel). This has a nice advantage: currently there are some out-of-tree hacks (in OpenWrt and LEDE) where the EEPROM has a Big Endian header on a Big Endian system (= no swab16 is performed) but the EEPROM itself indicates that it's data is Little Endian. Until now the out-of-tree code simply did a swab16 before passing the data to ath9k, so ath9k first did the swab16 - this also enabled the format specific swapping. These out-of-tree hacks are still working with the new logic, but it is recommended to remove them. This implementation is based on a discussion with Arnd Bergmann who raised concerns about the robustness and portability of the swapping logic in the original OF support patch review, see [0]. After a second round of patches (= v1 of this series) neither Arnd Bergmann nor I were really happy with the complexity of the EEPROM swapping logic. Based on a discussion (see [1] and [2]) we decided that ath9k should use a defined format (specifying the endianness of the data - I went with __le16 and __le32) when accessing the EEPROM fields. A benefit of this is that we enable the EEPMISC based swapping logic by default, just like the FreeBSD driver, see [3]. On the devices which I have tested (see below) ath9k now works without having to specify the "endian_check" field in ath9k_platform_data (or a similar logic which could provide this via devicetree) as ath9k now detects the endianness automatically. Only EEPROMs which are mangled by some out-of-tree code still need the endian_check flag (or one can simply remove that mangling from the out-of-tree code). [0] http://www.spinics.net/lists/linux-wireless/msg152634.html [1] https://marc.info/?l=linux-wireless&m=147250597503174&w=2 [2] https://marc.info/?l=linux-wireless&m=147254388611344&w=2 [3] https://github.com/freebsd/freebsd/blob/50719b56d9ce8d7d4beb53b16e9edb2e9a4a7a18/sys/dev/ath/ath_hal/ah_eeprom_9287.c#L351 Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Diffstat (limited to 'package/kernel/mac80211/patches/550-ath9k-Add-a-define-for-the-EEPROM-eepmisc-endianness.patch')
-rw-r--r--package/kernel/mac80211/patches/550-ath9k-Add-a-define-for-the-EEPROM-eepmisc-endianness.patch95
1 files changed, 95 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/550-ath9k-Add-a-define-for-the-EEPROM-eepmisc-endianness.patch b/package/kernel/mac80211/patches/550-ath9k-Add-a-define-for-the-EEPROM-eepmisc-endianness.patch
new file mode 100644
index 0000000000..a17f95682f
--- /dev/null
+++ b/package/kernel/mac80211/patches/550-ath9k-Add-a-define-for-the-EEPROM-eepmisc-endianness.patch
@@ -0,0 +1,95 @@
+From 9692ab1ff30ae0abc1000d11b2f929b6e2e4cb7f Mon Sep 17 00:00:00 2001
+From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Date: Mon, 3 Oct 2016 00:29:07 +0200
+Subject: [v2 PATCH 1/7] ath9k: Add a #define for the EEPROM "eepmisc" endianness
+ bit
+
+This replaces a magic number with a named #define. Additionally it
+removes two "eeprom format" specific #defines for the "big endianness"
+bit which are the same on all eeprom formats.
+
+Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+---
+ drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | 3 ++-
+ drivers/net/wireless/ath/ath9k/ar9003_eeprom.h | 1 -
+ drivers/net/wireless/ath/ath9k/eeprom.h | 4 +++-
+ drivers/net/wireless/ath/ath9k/eeprom_4k.c | 2 +-
+ drivers/net/wireless/ath/ath9k/eeprom_9287.c | 2 +-
+ drivers/net/wireless/ath/ath9k/eeprom_def.c | 2 +-
+ 6 files changed, 8 insertions(+), 6 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
++++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
+@@ -3468,7 +3468,8 @@ static u32 ath9k_hw_ar9003_dump_eeprom(s
+ AR5416_OPFLAGS_N_5G_HT20));
+ PR_EEP("Disable 5Ghz HT40", !!(pBase->opCapFlags.opFlags &
+ AR5416_OPFLAGS_N_5G_HT40));
+- PR_EEP("Big Endian", !!(pBase->opCapFlags.eepMisc & 0x01));
++ PR_EEP("Big Endian", !!(pBase->opCapFlags.eepMisc &
++ AR5416_EEPMISC_BIG_ENDIAN));
+ PR_EEP("RF Silent", pBase->rfSilent);
+ PR_EEP("BT option", pBase->blueToothOptions);
+ PR_EEP("Device Cap", pBase->deviceCap);
+--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
++++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
+@@ -38,7 +38,6 @@
+ #define AR9300_NUM_CTLS_2G 12
+ #define AR9300_NUM_BAND_EDGES_5G 8
+ #define AR9300_NUM_BAND_EDGES_2G 4
+-#define AR9300_EEPMISC_BIG_ENDIAN 0x01
+ #define AR9300_EEPMISC_WOW 0x02
+ #define AR9300_CUSTOMER_DATA_SIZE 20
+
+--- a/drivers/net/wireless/ath/ath9k/eeprom.h
++++ b/drivers/net/wireless/ath/ath9k/eeprom.h
+@@ -161,6 +161,9 @@
+ #define AR5416_EEP_TXGAIN_ORIGINAL 0
+ #define AR5416_EEP_TXGAIN_HIGH_POWER 1
+
++/* Endianness of EEPROM content */
++#define AR5416_EEPMISC_BIG_ENDIAN 0x01
++
+ #define AR5416_EEP4K_START_LOC 64
+ #define AR5416_EEP4K_NUM_2G_CAL_PIERS 3
+ #define AR5416_EEP4K_NUM_2G_CCK_TARGET_POWERS 3
+@@ -191,7 +194,6 @@
+ #define AR9287_NUM_CTLS 12
+ #define AR9287_NUM_BAND_EDGES 4
+ #define AR9287_PD_GAIN_ICEPTS 1
+-#define AR9287_EEPMISC_BIG_ENDIAN 0x01
+ #define AR9287_EEPMISC_WOW 0x02
+ #define AR9287_MAX_CHAINS 2
+ #define AR9287_ANT_16S 32
+--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
++++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
+@@ -154,7 +154,7 @@ static u32 ath9k_hw_4k_dump_eeprom(struc
+ AR5416_OPFLAGS_N_5G_HT20));
+ PR_EEP("Disable 5Ghz HT40", !!(pBase->opCapFlags &
+ AR5416_OPFLAGS_N_5G_HT40));
+- PR_EEP("Big Endian", !!(pBase->eepMisc & 0x01));
++ PR_EEP("Big Endian", !!(pBase->eepMisc & AR5416_EEPMISC_BIG_ENDIAN));
+ PR_EEP("Cal Bin Major Ver", (pBase->binBuildNumber >> 24) & 0xFF);
+ PR_EEP("Cal Bin Minor Ver", (pBase->binBuildNumber >> 16) & 0xFF);
+ PR_EEP("Cal Bin Build", (pBase->binBuildNumber >> 8) & 0xFF);
+--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
++++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
+@@ -150,7 +150,7 @@ static u32 ath9k_hw_ar9287_dump_eeprom(s
+ AR5416_OPFLAGS_N_5G_HT20));
+ PR_EEP("Disable 5Ghz HT40", !!(pBase->opCapFlags &
+ AR5416_OPFLAGS_N_5G_HT40));
+- PR_EEP("Big Endian", !!(pBase->eepMisc & 0x01));
++ PR_EEP("Big Endian", !!(pBase->eepMisc & AR5416_EEPMISC_BIG_ENDIAN));
+ PR_EEP("Cal Bin Major Ver", (pBase->binBuildNumber >> 24) & 0xFF);
+ PR_EEP("Cal Bin Minor Ver", (pBase->binBuildNumber >> 16) & 0xFF);
+ PR_EEP("Cal Bin Build", (pBase->binBuildNumber >> 8) & 0xFF);
+--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
++++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
+@@ -232,7 +232,7 @@ static u32 ath9k_hw_def_dump_eeprom(stru
+ AR5416_OPFLAGS_N_5G_HT20));
+ PR_EEP("Disable 5Ghz HT40", !!(pBase->opCapFlags &
+ AR5416_OPFLAGS_N_5G_HT40));
+- PR_EEP("Big Endian", !!(pBase->eepMisc & 0x01));
++ PR_EEP("Big Endian", !!(pBase->eepMisc & AR5416_EEPMISC_BIG_ENDIAN));
+ PR_EEP("Cal Bin Major Ver", (pBase->binBuildNumber >> 24) & 0xFF);
+ PR_EEP("Cal Bin Minor Ver", (pBase->binBuildNumber >> 16) & 0xFF);
+ PR_EEP("Cal Bin Build", (pBase->binBuildNumber >> 8) & 0xFF);