ath9k_hw: fix antenna diversity on AR9285
On AR9285, the antenna switch configuration register uses more than just 16 bits. Because of an arbitrary mask applied to the EEPROM value that stores this configuration, diversity was broken in some cases, leading to a significant degradation in signal strength. Fix this by changing the callback to return a 32 bit value and remove the arbitrary mask. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Cc: stable@kernel.org Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
e796643eaf
commit
601e0cb165
|
@ -951,7 +951,7 @@ static u8 ath9k_hw_ar9300_get_num_ant_config(struct ath_hw *ah,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 ath9k_hw_ar9300_get_eeprom_antenna_cfg(struct ath_hw *ah,
|
static u32 ath9k_hw_ar9300_get_eeprom_antenna_cfg(struct ath_hw *ah,
|
||||||
struct ath9k_channel *chan)
|
struct ath9k_channel *chan)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -670,7 +670,7 @@ struct eeprom_ops {
|
||||||
int (*get_eeprom_ver)(struct ath_hw *hw);
|
int (*get_eeprom_ver)(struct ath_hw *hw);
|
||||||
int (*get_eeprom_rev)(struct ath_hw *hw);
|
int (*get_eeprom_rev)(struct ath_hw *hw);
|
||||||
u8 (*get_num_ant_config)(struct ath_hw *hw, enum ieee80211_band band);
|
u8 (*get_num_ant_config)(struct ath_hw *hw, enum ieee80211_band band);
|
||||||
u16 (*get_eeprom_antenna_cfg)(struct ath_hw *hw,
|
u32 (*get_eeprom_antenna_cfg)(struct ath_hw *hw,
|
||||||
struct ath9k_channel *chan);
|
struct ath9k_channel *chan);
|
||||||
void (*set_board_values)(struct ath_hw *hw, struct ath9k_channel *chan);
|
void (*set_board_values)(struct ath_hw *hw, struct ath9k_channel *chan);
|
||||||
void (*set_addac)(struct ath_hw *hw, struct ath9k_channel *chan);
|
void (*set_addac)(struct ath_hw *hw, struct ath9k_channel *chan);
|
||||||
|
|
|
@ -1150,13 +1150,13 @@ static void ath9k_hw_4k_set_board_values(struct ath_hw *ah,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 ath9k_hw_4k_get_eeprom_antenna_cfg(struct ath_hw *ah,
|
static u32 ath9k_hw_4k_get_eeprom_antenna_cfg(struct ath_hw *ah,
|
||||||
struct ath9k_channel *chan)
|
struct ath9k_channel *chan)
|
||||||
{
|
{
|
||||||
struct ar5416_eeprom_4k *eep = &ah->eeprom.map4k;
|
struct ar5416_eeprom_4k *eep = &ah->eeprom.map4k;
|
||||||
struct modal_eep_4k_header *pModal = &eep->modalHeader;
|
struct modal_eep_4k_header *pModal = &eep->modalHeader;
|
||||||
|
|
||||||
return pModal->antCtrlCommon & 0xFFFF;
|
return pModal->antCtrlCommon;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 ath9k_hw_4k_get_num_ant_config(struct ath_hw *ah,
|
static u8 ath9k_hw_4k_get_num_ant_config(struct ath_hw *ah,
|
||||||
|
|
|
@ -1130,13 +1130,13 @@ static u8 ath9k_hw_ar9287_get_num_ant_config(struct ath_hw *ah,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 ath9k_hw_ar9287_get_eeprom_antenna_cfg(struct ath_hw *ah,
|
static u32 ath9k_hw_ar9287_get_eeprom_antenna_cfg(struct ath_hw *ah,
|
||||||
struct ath9k_channel *chan)
|
struct ath9k_channel *chan)
|
||||||
{
|
{
|
||||||
struct ar9287_eeprom *eep = &ah->eeprom.map9287;
|
struct ar9287_eeprom *eep = &ah->eeprom.map9287;
|
||||||
struct modal_eep_ar9287_header *pModal = &eep->modalHeader;
|
struct modal_eep_ar9287_header *pModal = &eep->modalHeader;
|
||||||
|
|
||||||
return pModal->antCtrlCommon & 0xFFFF;
|
return pModal->antCtrlCommon;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 ath9k_hw_ar9287_get_spur_channel(struct ath_hw *ah,
|
static u16 ath9k_hw_ar9287_get_spur_channel(struct ath_hw *ah,
|
||||||
|
|
|
@ -1438,14 +1438,14 @@ static u8 ath9k_hw_def_get_num_ant_config(struct ath_hw *ah,
|
||||||
return num_ant_config;
|
return num_ant_config;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 ath9k_hw_def_get_eeprom_antenna_cfg(struct ath_hw *ah,
|
static u32 ath9k_hw_def_get_eeprom_antenna_cfg(struct ath_hw *ah,
|
||||||
struct ath9k_channel *chan)
|
struct ath9k_channel *chan)
|
||||||
{
|
{
|
||||||
struct ar5416_eeprom_def *eep = &ah->eeprom.def;
|
struct ar5416_eeprom_def *eep = &ah->eeprom.def;
|
||||||
struct modal_eep_header *pModal =
|
struct modal_eep_header *pModal =
|
||||||
&(eep->modalHeader[IS_CHAN_2GHZ(chan)]);
|
&(eep->modalHeader[IS_CHAN_2GHZ(chan)]);
|
||||||
|
|
||||||
return pModal->antCtrlCommon & 0xFFFF;
|
return pModal->antCtrlCommon;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 ath9k_hw_def_get_spur_channel(struct ath_hw *ah, u16 i, bool is2GHz)
|
static u16 ath9k_hw_def_get_spur_channel(struct ath_hw *ah, u16 i, bool is2GHz)
|
||||||
|
|
Loading…
Reference in a new issue