diff options
author | Sujith Manoharan <c_manoha@qca.qualcomm.com> | 2012-06-04 06:57:30 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-06-06 15:20:25 -0400 |
commit | 5955b2b0ef208e03188ef1c2810c004bde493253 (patch) | |
tree | e71d756ab768640a0771e98798d420b9af0c5a74 | |
parent | 83c7a52dcce256fc20cd43dbf6866e3e05f2bf71 (diff) |
ath9k_hw: Fix MCI usage
MCI has to be handled only when BTCOEX is actually enabled.
Check for this condition before calling MCI related functions
from various reset/calibration call-sites.
Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_calib.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_mci.h | 8 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.h | 9 |
4 files changed, 18 insertions, 19 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c index 9fdd70fcaf5b..f83a4a2e1da2 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c | |||
@@ -901,7 +901,6 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah, | |||
901 | bool is_reusable = true, status = true; | 901 | bool is_reusable = true, status = true; |
902 | bool run_rtt_cal = false, run_agc_cal; | 902 | bool run_rtt_cal = false, run_agc_cal; |
903 | bool rtt = !!(ah->caps.hw_caps & ATH9K_HW_CAP_RTT); | 903 | bool rtt = !!(ah->caps.hw_caps & ATH9K_HW_CAP_RTT); |
904 | bool mci = !!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI); | ||
905 | u32 agc_ctrl = 0, agc_supp_cals = AR_PHY_AGC_CONTROL_OFFSET_CAL | | 904 | u32 agc_ctrl = 0, agc_supp_cals = AR_PHY_AGC_CONTROL_OFFSET_CAL | |
906 | AR_PHY_AGC_CONTROL_FLTR_CAL | | 905 | AR_PHY_AGC_CONTROL_FLTR_CAL | |
907 | AR_PHY_AGC_CONTROL_PKDET_CAL; | 906 | AR_PHY_AGC_CONTROL_PKDET_CAL; |
@@ -970,7 +969,7 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah, | |||
970 | } else if (caldata && !caldata->done_txiqcal_once) | 969 | } else if (caldata && !caldata->done_txiqcal_once) |
971 | run_agc_cal = true; | 970 | run_agc_cal = true; |
972 | 971 | ||
973 | if (mci && IS_CHAN_2GHZ(chan) && run_agc_cal) | 972 | if (ath9k_hw_mci_is_enabled(ah) && IS_CHAN_2GHZ(chan) && run_agc_cal) |
974 | ar9003_mci_init_cal_req(ah, &is_reusable); | 973 | ar9003_mci_init_cal_req(ah, &is_reusable); |
975 | 974 | ||
976 | if (!(IS_CHAN_HALF_RATE(chan) || IS_CHAN_QUARTER_RATE(chan))) { | 975 | if (!(IS_CHAN_HALF_RATE(chan) || IS_CHAN_QUARTER_RATE(chan))) { |
@@ -993,7 +992,7 @@ skip_tx_iqcal: | |||
993 | 0, AH_WAIT_TIMEOUT); | 992 | 0, AH_WAIT_TIMEOUT); |
994 | } | 993 | } |
995 | 994 | ||
996 | if (mci && IS_CHAN_2GHZ(chan) && run_agc_cal) | 995 | if (ath9k_hw_mci_is_enabled(ah) && IS_CHAN_2GHZ(chan) && run_agc_cal) |
997 | ar9003_mci_init_cal_done(ah); | 996 | ar9003_mci_init_cal_done(ah); |
998 | 997 | ||
999 | if (rtt && !run_rtt_cal) { | 998 | if (rtt && !run_rtt_cal) { |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.h b/drivers/net/wireless/ath/ath9k/ar9003_mci.h index 4842f6c06b8c..652ab8c39e2b 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mci.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.h | |||
@@ -273,10 +273,6 @@ void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr, | |||
273 | 273 | ||
274 | #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT | 274 | #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT |
275 | 275 | ||
276 | static inline bool ar9003_mci_is_ready(struct ath_hw *ah) | ||
277 | { | ||
278 | return ah->btcoex_hw.mci.ready; | ||
279 | } | ||
280 | void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep); | 276 | void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep); |
281 | void ar9003_mci_init_cal_req(struct ath_hw *ah, bool *is_reusable); | 277 | void ar9003_mci_init_cal_req(struct ath_hw *ah, bool *is_reusable); |
282 | void ar9003_mci_init_cal_done(struct ath_hw *ah); | 278 | void ar9003_mci_init_cal_done(struct ath_hw *ah); |
@@ -292,10 +288,6 @@ void ar9003_mci_get_isr(struct ath_hw *ah, enum ath9k_int *masked); | |||
292 | 288 | ||
293 | #else | 289 | #else |
294 | 290 | ||
295 | static inline bool ar9003_mci_is_ready(struct ath_hw *ah) | ||
296 | { | ||
297 | return false; | ||
298 | } | ||
299 | static inline void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep) | 291 | static inline void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep) |
300 | { | 292 | { |
301 | } | 293 | } |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 42cf3c8db95b..a7231cadec40 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -1707,7 +1707,7 @@ static int ath9k_hw_do_fastcc(struct ath_hw *ah, struct ath9k_channel *chan) | |||
1707 | ath9k_hw_loadnf(ah, ah->curchan); | 1707 | ath9k_hw_loadnf(ah, ah->curchan); |
1708 | ath9k_hw_start_nfcal(ah, true); | 1708 | ath9k_hw_start_nfcal(ah, true); |
1709 | 1709 | ||
1710 | if ((ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && ar9003_mci_is_ready(ah)) | 1710 | if (ath9k_hw_mci_is_enabled(ah)) |
1711 | ar9003_mci_2g5g_switch(ah, true); | 1711 | ar9003_mci_2g5g_switch(ah, true); |
1712 | 1712 | ||
1713 | if (AR_SREV_9271(ah)) | 1713 | if (AR_SREV_9271(ah)) |
@@ -1728,10 +1728,9 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
1728 | u64 tsf = 0; | 1728 | u64 tsf = 0; |
1729 | int i, r; | 1729 | int i, r; |
1730 | bool start_mci_reset = false; | 1730 | bool start_mci_reset = false; |
1731 | bool mci = !!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI); | ||
1732 | bool save_fullsleep = ah->chip_fullsleep; | 1731 | bool save_fullsleep = ah->chip_fullsleep; |
1733 | 1732 | ||
1734 | if (mci) { | 1733 | if (ath9k_hw_mci_is_enabled(ah)) { |
1735 | start_mci_reset = ar9003_mci_start_reset(ah, chan); | 1734 | start_mci_reset = ar9003_mci_start_reset(ah, chan); |
1736 | if (start_mci_reset) | 1735 | if (start_mci_reset) |
1737 | return 0; | 1736 | return 0; |
@@ -1760,7 +1759,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
1760 | return r; | 1759 | return r; |
1761 | } | 1760 | } |
1762 | 1761 | ||
1763 | if (mci) | 1762 | if (ath9k_hw_mci_is_enabled(ah)) |
1764 | ar9003_mci_stop_bt(ah, save_fullsleep); | 1763 | ar9003_mci_stop_bt(ah, save_fullsleep); |
1765 | 1764 | ||
1766 | saveDefAntenna = REG_READ(ah, AR_DEF_ANTENNA); | 1765 | saveDefAntenna = REG_READ(ah, AR_DEF_ANTENNA); |
@@ -1818,7 +1817,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
1818 | if (r) | 1817 | if (r) |
1819 | return r; | 1818 | return r; |
1820 | 1819 | ||
1821 | if (mci) | 1820 | if (ath9k_hw_mci_is_enabled(ah)) |
1822 | ar9003_mci_reset(ah, false, IS_CHAN_2GHZ(chan), save_fullsleep); | 1821 | ar9003_mci_reset(ah, false, IS_CHAN_2GHZ(chan), save_fullsleep); |
1823 | 1822 | ||
1824 | /* | 1823 | /* |
@@ -1937,7 +1936,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
1937 | ath9k_hw_loadnf(ah, chan); | 1936 | ath9k_hw_loadnf(ah, chan); |
1938 | ath9k_hw_start_nfcal(ah, true); | 1937 | ath9k_hw_start_nfcal(ah, true); |
1939 | 1938 | ||
1940 | if (mci && ar9003_mci_end_reset(ah, chan, caldata)) | 1939 | if (ath9k_hw_mci_is_enabled(ah) && ar9003_mci_end_reset(ah, chan, caldata)) |
1941 | return -EIO; | 1940 | return -EIO; |
1942 | 1941 | ||
1943 | ENABLE_REGWRITE_BUFFER(ah); | 1942 | ENABLE_REGWRITE_BUFFER(ah); |
@@ -1982,7 +1981,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
1982 | if (ath9k_hw_btcoex_is_enabled(ah)) | 1981 | if (ath9k_hw_btcoex_is_enabled(ah)) |
1983 | ath9k_hw_btcoex_enable(ah); | 1982 | ath9k_hw_btcoex_enable(ah); |
1984 | 1983 | ||
1985 | if (mci) | 1984 | if (ath9k_hw_mci_is_enabled(ah)) |
1986 | ar9003_mci_check_bt(ah); | 1985 | ar9003_mci_check_bt(ah); |
1987 | 1986 | ||
1988 | if (AR_SREV_9300_20_OR_LATER(ah)) { | 1987 | if (AR_SREV_9300_20_OR_LATER(ah)) { |
@@ -2166,7 +2165,7 @@ bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode) | |||
2166 | status = ath9k_hw_set_power_awake(ah, setChip); | 2165 | status = ath9k_hw_set_power_awake(ah, setChip); |
2167 | break; | 2166 | break; |
2168 | case ATH9K_PM_FULL_SLEEP: | 2167 | case ATH9K_PM_FULL_SLEEP: |
2169 | if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) | 2168 | if (ath9k_hw_mci_is_enabled(ah)) |
2170 | ar9003_mci_set_full_sleep(ah); | 2169 | ar9003_mci_set_full_sleep(ah); |
2171 | 2170 | ||
2172 | ath9k_set_power_sleep(ah, setChip); | 2171 | ath9k_set_power_sleep(ah, setChip); |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index b620c557c2a6..3740aab864f4 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -1037,6 +1037,11 @@ static inline bool ath9k_hw_btcoex_is_enabled(struct ath_hw *ah) | |||
1037 | { | 1037 | { |
1038 | return ah->btcoex_hw.enabled; | 1038 | return ah->btcoex_hw.enabled; |
1039 | } | 1039 | } |
1040 | static inline bool ath9k_hw_mci_is_enabled(struct ath_hw *ah) | ||
1041 | { | ||
1042 | return ah->btcoex_hw.enabled && (ah->caps.hw_caps & ATH9K_HW_CAP_MCI); | ||
1043 | |||
1044 | } | ||
1040 | void ath9k_hw_btcoex_enable(struct ath_hw *ah); | 1045 | void ath9k_hw_btcoex_enable(struct ath_hw *ah); |
1041 | static inline enum ath_btcoex_scheme | 1046 | static inline enum ath_btcoex_scheme |
1042 | ath9k_hw_get_btcoex_scheme(struct ath_hw *ah) | 1047 | ath9k_hw_get_btcoex_scheme(struct ath_hw *ah) |
@@ -1048,6 +1053,10 @@ static inline bool ath9k_hw_btcoex_is_enabled(struct ath_hw *ah) | |||
1048 | { | 1053 | { |
1049 | return false; | 1054 | return false; |
1050 | } | 1055 | } |
1056 | static inline bool ath9k_hw_mci_is_enabled(struct ath_hw *ah) | ||
1057 | { | ||
1058 | return false; | ||
1059 | } | ||
1051 | static inline void ath9k_hw_btcoex_enable(struct ath_hw *ah) | 1060 | static inline void ath9k_hw_btcoex_enable(struct ath_hw *ah) |
1052 | { | 1061 | { |
1053 | } | 1062 | } |