| From d494c575a9beff9ffea4a24887c0c4a08cfcea28 Mon Sep 17 00:00:00 2001 |
| From: Felix Fietkau <nbd@openwrt.org> |
| Date: Sun, 11 Jul 2010 12:48:39 +0200 |
| Subject: [PATCH] ath9k_hw: fix antenna diversity on AR9285 |
| |
| commit 601e0cb165e65dc185b31fe7ebd2c0169ea47306 upstream. |
| |
| 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. |
| |
| [PG: drop ar9003_eeprom.c change; v2.6.34 doesn't have it yet] |
| |
| Signed-off-by: Felix Fietkau <nbd@openwrt.org> |
| Signed-off-by: John W. Linville <linville@tuxdriver.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/wireless/ath/ath9k/eeprom.h b/drivers/net/wireless/ath/ath9k/eeprom.h |
| index 104e3ea..b64b3e5 100644 |
| --- a/drivers/net/wireless/ath/ath9k/eeprom.h |
| +++ b/drivers/net/wireless/ath/ath9k/eeprom.h |
| @@ -670,7 +670,7 @@ struct eeprom_ops { |
| int (*get_eeprom_ver)(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); |
| - u16 (*get_eeprom_antenna_cfg)(struct ath_hw *hw, |
| + u32 (*get_eeprom_antenna_cfg)(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); |
| diff --git a/drivers/net/wireless/ath/ath9k/eeprom_4k.c b/drivers/net/wireless/ath/ath9k/eeprom_4k.c |
| index 68db166..73cd4db 100644 |
| --- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c |
| +++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c |
| @@ -1138,13 +1138,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 ar5416_eeprom_4k *eep = &ah->eeprom.map4k; |
| 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, |
| diff --git a/drivers/net/wireless/ath/ath9k/eeprom_9287.c b/drivers/net/wireless/ath/ath9k/eeprom_9287.c |
| index 839d05a..c6f77ce 100644 |
| --- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c |
| +++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c |
| @@ -1130,13 +1130,13 @@ static u8 ath9k_hw_AR9287_get_num_ant_config(struct ath_hw *ah, |
| 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 ar9287_eeprom *eep = &ah->eeprom.map9287; |
| 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, |
| diff --git a/drivers/net/wireless/ath/ath9k/eeprom_def.c b/drivers/net/wireless/ath/ath9k/eeprom_def.c |
| index 1644b1a..e61823e 100644 |
| --- a/drivers/net/wireless/ath/ath9k/eeprom_def.c |
| +++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c |
| @@ -1431,14 +1431,14 @@ static u8 ath9k_hw_def_get_num_ant_config(struct ath_hw *ah, |
| 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 ar5416_eeprom_def *eep = &ah->eeprom.def; |
| struct modal_eep_header *pModal = |
| &(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) |
| -- |
| 1.7.4.4 |
| |