aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorSujith Manoharan <c_manoha@qca.qualcomm.com>2012-06-04 06:57:30 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-06-06 15:20:25 -0400
commit5955b2b0ef208e03188ef1c2810c004bde493253 (patch)
treee71d756ab768640a0771e98798d420b9af0c5a74 /drivers/net
parent83c7a52dcce256fc20cd43dbf6866e3e05f2bf71 (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>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_calib.c5
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_mci.h8
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.c15
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.h9
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
276static inline bool ar9003_mci_is_ready(struct ath_hw *ah)
277{
278 return ah->btcoex_hw.mci.ready;
279}
280void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep); 276void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep);
281void ar9003_mci_init_cal_req(struct ath_hw *ah, bool *is_reusable); 277void ar9003_mci_init_cal_req(struct ath_hw *ah, bool *is_reusable);
282void ar9003_mci_init_cal_done(struct ath_hw *ah); 278void 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
295static inline bool ar9003_mci_is_ready(struct ath_hw *ah)
296{
297 return false;
298}
299static inline void ar9003_mci_stop_bt(struct ath_hw *ah, bool save_fullsleep) 291static 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}
1040static 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}
1040void ath9k_hw_btcoex_enable(struct ath_hw *ah); 1045void ath9k_hw_btcoex_enable(struct ath_hw *ah);
1041static inline enum ath_btcoex_scheme 1046static inline enum ath_btcoex_scheme
1042ath9k_hw_get_btcoex_scheme(struct ath_hw *ah) 1047ath9k_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}
1056static inline bool ath9k_hw_mci_is_enabled(struct ath_hw *ah)
1057{
1058 return false;
1059}
1051static inline void ath9k_hw_btcoex_enable(struct ath_hw *ah) 1060static inline void ath9k_hw_btcoex_enable(struct ath_hw *ah)
1052{ 1061{
1053} 1062}