3f889418a5
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] 50719b56d9/sys/dev/ath/ath_hal/ah_eeprom_9287.c (L351)
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
117 lines
4.2 KiB
Diff
117 lines
4.2 KiB
Diff
From 9f247f908d5166e16e1cc6a50b0901e0f6733410 Mon Sep 17 00:00:00 2001
|
|
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
|
Date: Mon, 3 Oct 2016 00:29:10 +0200
|
|
Subject: [v2 PATCH 4/7] ath9k: replace eeprom_param EEP_MINOR_REV with
|
|
get_eeprom_rev
|
|
|
|
get_eeprom(ah, EEP_MINOR_REV) and get_eeprom_rev(ah) are both doing the
|
|
same thing: returning the EEPROM revision (12 lowest bits). Make the
|
|
code consistent by using get_eeprom_rev(ah) everywhere.
|
|
|
|
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
|
---
|
|
drivers/net/wireless/ath/ath9k/ar5008_phy.c | 2 +-
|
|
drivers/net/wireless/ath/ath9k/ar9002_hw.c | 6 ++----
|
|
drivers/net/wireless/ath/ath9k/eeprom.h | 1 -
|
|
drivers/net/wireless/ath/ath9k/eeprom_4k.c | 5 -----
|
|
drivers/net/wireless/ath/ath9k/eeprom_9287.c | 6 +-----
|
|
drivers/net/wireless/ath/ath9k/eeprom_def.c | 2 --
|
|
6 files changed, 4 insertions(+), 18 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
|
|
@@ -524,7 +524,7 @@ static bool ar5008_hw_set_rf_regs(struct
|
|
return true;
|
|
|
|
/* Setup rf parameters */
|
|
- eepMinorRev = ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV);
|
|
+ eepMinorRev = ah->eep_ops->get_eeprom_rev(ah);
|
|
|
|
for (i = 0; i < ah->iniBank6.ia_rows; i++)
|
|
ah->analogBank6Data[i] = INI_RA(&ah->iniBank6, i, modesIndex);
|
|
--- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c
|
|
@@ -108,8 +108,7 @@ static void ar9280_20_hw_init_rxgain_ini
|
|
{
|
|
u32 rxgain_type;
|
|
|
|
- if (ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV) >=
|
|
- AR5416_EEP_MINOR_VER_17) {
|
|
+ if (ah->eep_ops->get_eeprom_rev(ah) >= AR5416_EEP_MINOR_VER_17) {
|
|
rxgain_type = ah->eep_ops->get_eeprom(ah, EEP_RXGAIN_TYPE);
|
|
|
|
if (rxgain_type == AR5416_EEP_RXGAIN_13DB_BACKOFF)
|
|
@@ -129,8 +128,7 @@ static void ar9280_20_hw_init_rxgain_ini
|
|
|
|
static void ar9280_20_hw_init_txgain_ini(struct ath_hw *ah, u32 txgain_type)
|
|
{
|
|
- if (ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV) >=
|
|
- AR5416_EEP_MINOR_VER_19) {
|
|
+ if (ah->eep_ops->get_eeprom_rev(ah) >= AR5416_EEP_MINOR_VER_19) {
|
|
if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER)
|
|
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
|
ar9280Modes_high_power_tx_gain_9280_2);
|
|
--- a/drivers/net/wireless/ath/ath9k/eeprom.h
|
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom.h
|
|
@@ -230,7 +230,6 @@ enum eeprom_param {
|
|
EEP_DB_5,
|
|
EEP_OB_2,
|
|
EEP_DB_2,
|
|
- EEP_MINOR_REV,
|
|
EEP_TX_MASK,
|
|
EEP_RX_MASK,
|
|
EEP_FSTCLK_5G,
|
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
|
|
@@ -254,9 +254,6 @@ static u32 ath9k_hw_4k_get_eeprom(struct
|
|
struct ar5416_eeprom_4k *eep = &ah->eeprom.map4k;
|
|
struct modal_eep_4k_header *pModal = &eep->modalHeader;
|
|
struct base_eep_header_4k *pBase = &eep->baseEepHeader;
|
|
- u16 ver_minor;
|
|
-
|
|
- ver_minor = pBase->version & AR5416_EEP_VER_MINOR_MASK;
|
|
|
|
switch (param) {
|
|
case EEP_NFTHRESH_2:
|
|
@@ -279,8 +276,6 @@ static u32 ath9k_hw_4k_get_eeprom(struct
|
|
return pModal->ob_0;
|
|
case EEP_DB_2:
|
|
return pModal->db1_1;
|
|
- case EEP_MINOR_REV:
|
|
- return ver_minor;
|
|
case EEP_TX_MASK:
|
|
return pBase->txMask;
|
|
case EEP_RX_MASK:
|
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
|
|
@@ -250,9 +250,7 @@ static u32 ath9k_hw_ar9287_get_eeprom(st
|
|
struct ar9287_eeprom *eep = &ah->eeprom.map9287;
|
|
struct modal_eep_ar9287_header *pModal = &eep->modalHeader;
|
|
struct base_eep_ar9287_header *pBase = &eep->baseEepHeader;
|
|
- u16 ver_minor;
|
|
-
|
|
- ver_minor = pBase->version & AR9287_EEP_VER_MINOR_MASK;
|
|
+ u16 ver_minor = ath9k_hw_ar9287_get_eeprom_rev(ah);
|
|
|
|
switch (param) {
|
|
case EEP_NFTHRESH_2:
|
|
@@ -271,8 +269,6 @@ static u32 ath9k_hw_ar9287_get_eeprom(st
|
|
return pBase->opCapFlags;
|
|
case EEP_RF_SILENT:
|
|
return pBase->rfSilent;
|
|
- case EEP_MINOR_REV:
|
|
- return ver_minor;
|
|
case EEP_TX_MASK:
|
|
return pBase->txMask;
|
|
case EEP_RX_MASK:
|
|
--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
|
|
@@ -380,8 +380,6 @@ static u32 ath9k_hw_def_get_eeprom(struc
|
|
return pModal[1].ob;
|
|
case EEP_DB_2:
|
|
return pModal[1].db;
|
|
- case EEP_MINOR_REV:
|
|
- return AR5416_VER_MASK;
|
|
case EEP_TX_MASK:
|
|
return pBase->txMask;
|
|
case EEP_RX_MASK:
|