xref: /linux/drivers/net/wireless/ath/ath9k/hw-ops.h (revision e5451c8f8330e03ad3cfa16048b4daf961af434f)
1d70357d5SLuis R. Rodriguez /*
25b68138eSSujith Manoharan  * Copyright (c) 2010-2011 Atheros Communications Inc.
3d70357d5SLuis R. Rodriguez  *
4d70357d5SLuis R. Rodriguez  * Permission to use, copy, modify, and/or distribute this software for any
5d70357d5SLuis R. Rodriguez  * purpose with or without fee is hereby granted, provided that the above
6d70357d5SLuis R. Rodriguez  * copyright notice and this permission notice appear in all copies.
7d70357d5SLuis R. Rodriguez  *
8d70357d5SLuis R. Rodriguez  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9d70357d5SLuis R. Rodriguez  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10d70357d5SLuis R. Rodriguez  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11d70357d5SLuis R. Rodriguez  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12d70357d5SLuis R. Rodriguez  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13d70357d5SLuis R. Rodriguez  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14d70357d5SLuis R. Rodriguez  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15d70357d5SLuis R. Rodriguez  */
16d70357d5SLuis R. Rodriguez 
17d70357d5SLuis R. Rodriguez #ifndef ATH9K_HW_OPS_H
18d70357d5SLuis R. Rodriguez #define ATH9K_HW_OPS_H
19d70357d5SLuis R. Rodriguez 
20d70357d5SLuis R. Rodriguez #include "hw.h"
21d70357d5SLuis R. Rodriguez 
22d70357d5SLuis R. Rodriguez /* Hardware core and driver accessible callbacks */
23d70357d5SLuis R. Rodriguez 
24d70357d5SLuis R. Rodriguez static inline void ath9k_hw_configpcipowersave(struct ath_hw *ah,
2584c87dc8SStanislaw Gruszka 					       bool power_off)
26d70357d5SLuis R. Rodriguez {
2723677ce3SJoe Perches 	if (!ah->aspm_enabled)
283b9cf1beSStanislaw Gruszka 		return;
293b9cf1beSStanislaw Gruszka 
3084c87dc8SStanislaw Gruszka 	ath9k_hw_ops(ah)->config_pci_powersave(ah, power_off);
31d70357d5SLuis R. Rodriguez }
32d70357d5SLuis R. Rodriguez 
33cee1f625SVasanthakumar Thiagarajan static inline void ath9k_hw_rxena(struct ath_hw *ah)
34cee1f625SVasanthakumar Thiagarajan {
35cee1f625SVasanthakumar Thiagarajan 	ath9k_hw_ops(ah)->rx_enable(ah);
36cee1f625SVasanthakumar Thiagarajan }
37cee1f625SVasanthakumar Thiagarajan 
3887d5efbbSVasanthakumar Thiagarajan static inline void ath9k_hw_set_desc_link(struct ath_hw *ah, void *ds,
3987d5efbbSVasanthakumar Thiagarajan 					  u32 link)
4087d5efbbSVasanthakumar Thiagarajan {
4187d5efbbSVasanthakumar Thiagarajan 	ath9k_hw_ops(ah)->set_desc_link(ds, link);
4287d5efbbSVasanthakumar Thiagarajan }
4387d5efbbSVasanthakumar Thiagarajan 
447b8aaeadSFelix Fietkau static inline int ath9k_hw_calibrate(struct ath_hw *ah,
45795f5e2cSLuis R. Rodriguez 				     struct ath9k_channel *chan,
467b8aaeadSFelix Fietkau 				     u8 rxchainmask, bool longcal)
47795f5e2cSLuis R. Rodriguez {
48795f5e2cSLuis R. Rodriguez 	return ath9k_hw_ops(ah)->calibrate(ah, chan, rxchainmask, longcal);
49795f5e2cSLuis R. Rodriguez }
50795f5e2cSLuis R. Rodriguez 
516a4d05dcSFelix Fietkau static inline bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked,
526a4d05dcSFelix Fietkau 				   u32 *sync_cause_p)
5355e82df4SVasanthakumar Thiagarajan {
546a4d05dcSFelix Fietkau 	return ath9k_hw_ops(ah)->get_isr(ah, masked, sync_cause_p);
5555e82df4SVasanthakumar Thiagarajan }
5655e82df4SVasanthakumar Thiagarajan 
572b63a41dSFelix Fietkau static inline void ath9k_hw_set_txdesc(struct ath_hw *ah, void *ds,
582b63a41dSFelix Fietkau 				       struct ath_tx_info *i)
592b63a41dSFelix Fietkau {
602b63a41dSFelix Fietkau 	return ath9k_hw_ops(ah)->set_txdesc(ah, ds, i);
612b63a41dSFelix Fietkau }
622b63a41dSFelix Fietkau 
63cc610ac0SVasanthakumar Thiagarajan static inline int ath9k_hw_txprocdesc(struct ath_hw *ah, void *ds,
64cc610ac0SVasanthakumar Thiagarajan 				      struct ath_tx_status *ts)
65cc610ac0SVasanthakumar Thiagarajan {
66cc610ac0SVasanthakumar Thiagarajan 	return ath9k_hw_ops(ah)->proc_txdesc(ah, ds, ts);
67cc610ac0SVasanthakumar Thiagarajan }
68cc610ac0SVasanthakumar Thiagarajan 
69315dd114SFelix Fietkau static inline int ath9k_hw_get_duration(struct ath_hw *ah, const void *ds,
70315dd114SFelix Fietkau 					int index)
71315dd114SFelix Fietkau {
72315dd114SFelix Fietkau 	return ath9k_hw_ops(ah)->get_duration(ah, ds, index);
73315dd114SFelix Fietkau }
74315dd114SFelix Fietkau 
7569de3721SMohammed Shafi Shajakhan static inline void ath9k_hw_antdiv_comb_conf_get(struct ath_hw *ah,
7669de3721SMohammed Shafi Shajakhan 		struct ath_hw_antcomb_conf *antconf)
7769de3721SMohammed Shafi Shajakhan {
7869de3721SMohammed Shafi Shajakhan 	ath9k_hw_ops(ah)->antdiv_comb_conf_get(ah, antconf);
7969de3721SMohammed Shafi Shajakhan }
8069de3721SMohammed Shafi Shajakhan 
8169de3721SMohammed Shafi Shajakhan static inline void ath9k_hw_antdiv_comb_conf_set(struct ath_hw *ah,
8269de3721SMohammed Shafi Shajakhan 		struct ath_hw_antcomb_conf *antconf)
8369de3721SMohammed Shafi Shajakhan {
8469de3721SMohammed Shafi Shajakhan 	ath9k_hw_ops(ah)->antdiv_comb_conf_set(ah, antconf);
8569de3721SMohammed Shafi Shajakhan }
8669de3721SMohammed Shafi Shajakhan 
8789f927afSLuis R. Rodriguez static inline void ath9k_hw_tx99_start(struct ath_hw *ah, u32 qnum)
8889f927afSLuis R. Rodriguez {
8989f927afSLuis R. Rodriguez 	ath9k_hw_ops(ah)->tx99_start(ah, qnum);
9089f927afSLuis R. Rodriguez }
9189f927afSLuis R. Rodriguez 
9289f927afSLuis R. Rodriguez static inline void ath9k_hw_tx99_stop(struct ath_hw *ah)
9389f927afSLuis R. Rodriguez {
9489f927afSLuis R. Rodriguez 	ath9k_hw_ops(ah)->tx99_stop(ah);
9589f927afSLuis R. Rodriguez }
9689f927afSLuis R. Rodriguez 
9789f927afSLuis R. Rodriguez static inline void ath9k_hw_tx99_set_txpower(struct ath_hw *ah, u8 power)
9889f927afSLuis R. Rodriguez {
9989f927afSLuis R. Rodriguez 	if (ath9k_hw_ops(ah)->tx99_set_txpower)
10089f927afSLuis R. Rodriguez 		ath9k_hw_ops(ah)->tx99_set_txpower(ah, power);
10189f927afSLuis R. Rodriguez }
10289f927afSLuis R. Rodriguez 
10336e8825eSSujith Manoharan #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
10436e8825eSSujith Manoharan 
105d8d7744bSSujith Manoharan static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
106362cd03fSSujith Manoharan {
107d8d7744bSSujith Manoharan 	if (ath9k_hw_ops(ah)->set_bt_ant_diversity)
108d8d7744bSSujith Manoharan 		ath9k_hw_ops(ah)->set_bt_ant_diversity(ah, enable);
109362cd03fSSujith Manoharan }
110362cd03fSSujith Manoharan 
111*637625f2SSujith Manoharan static inline bool ath9k_hw_is_aic_enabled(struct ath_hw *ah)
112*637625f2SSujith Manoharan {
113*637625f2SSujith Manoharan 	if (ath9k_hw_private_ops(ah)->is_aic_enabled)
114*637625f2SSujith Manoharan 		return ath9k_hw_private_ops(ah)->is_aic_enabled(ah);
115*637625f2SSujith Manoharan 
116*637625f2SSujith Manoharan 	return false;
117*637625f2SSujith Manoharan }
118*637625f2SSujith Manoharan 
11936e8825eSSujith Manoharan #endif
12036e8825eSSujith Manoharan 
1218fe65368SLuis R. Rodriguez /* Private hardware call ops */
1228fe65368SLuis R. Rodriguez 
1234598702dSSujith Manoharan static inline void ath9k_hw_init_hang_checks(struct ath_hw *ah)
1244598702dSSujith Manoharan {
1254598702dSSujith Manoharan 	ath9k_hw_private_ops(ah)->init_hang_checks(ah);
1264598702dSSujith Manoharan }
1274598702dSSujith Manoharan 
128990de2b2SSujith Manoharan static inline bool ath9k_hw_detect_mac_hang(struct ath_hw *ah)
129990de2b2SSujith Manoharan {
130990de2b2SSujith Manoharan 	return ath9k_hw_private_ops(ah)->detect_mac_hang(ah);
131990de2b2SSujith Manoharan }
132990de2b2SSujith Manoharan 
133990de2b2SSujith Manoharan static inline bool ath9k_hw_detect_bb_hang(struct ath_hw *ah)
134990de2b2SSujith Manoharan {
135990de2b2SSujith Manoharan 	return ath9k_hw_private_ops(ah)->detect_bb_hang(ah);
136990de2b2SSujith Manoharan }
137990de2b2SSujith Manoharan 
1388fe65368SLuis R. Rodriguez /* PHY ops */
1398fe65368SLuis R. Rodriguez 
1408fe65368SLuis R. Rodriguez static inline int ath9k_hw_rf_set_freq(struct ath_hw *ah,
1418fe65368SLuis R. Rodriguez 				       struct ath9k_channel *chan)
1428fe65368SLuis R. Rodriguez {
1438fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->rf_set_freq(ah, chan);
1448fe65368SLuis R. Rodriguez }
1458fe65368SLuis R. Rodriguez 
1468fe65368SLuis R. Rodriguez static inline void ath9k_hw_spur_mitigate_freq(struct ath_hw *ah,
1478fe65368SLuis R. Rodriguez 					       struct ath9k_channel *chan)
1488fe65368SLuis R. Rodriguez {
1498fe65368SLuis R. Rodriguez 	ath9k_hw_private_ops(ah)->spur_mitigate_freq(ah, chan);
1508fe65368SLuis R. Rodriguez }
1518fe65368SLuis R. Rodriguez 
1528fe65368SLuis R. Rodriguez static inline bool ath9k_hw_set_rf_regs(struct ath_hw *ah,
1538fe65368SLuis R. Rodriguez 					struct ath9k_channel *chan,
1548fe65368SLuis R. Rodriguez 					u16 modesIndex)
1558fe65368SLuis R. Rodriguez {
1568fe65368SLuis R. Rodriguez 	if (!ath9k_hw_private_ops(ah)->set_rf_regs)
1578fe65368SLuis R. Rodriguez 		return true;
1588fe65368SLuis R. Rodriguez 
1598fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->set_rf_regs(ah, chan, modesIndex);
1608fe65368SLuis R. Rodriguez }
1618fe65368SLuis R. Rodriguez 
1628fe65368SLuis R. Rodriguez static inline void ath9k_hw_init_bb(struct ath_hw *ah,
1638fe65368SLuis R. Rodriguez 				    struct ath9k_channel *chan)
1648fe65368SLuis R. Rodriguez {
1658fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->init_bb(ah, chan);
1668fe65368SLuis R. Rodriguez }
1678fe65368SLuis R. Rodriguez 
1688fe65368SLuis R. Rodriguez static inline void ath9k_hw_set_channel_regs(struct ath_hw *ah,
1698fe65368SLuis R. Rodriguez 					     struct ath9k_channel *chan)
1708fe65368SLuis R. Rodriguez {
1718fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->set_channel_regs(ah, chan);
1728fe65368SLuis R. Rodriguez }
1738fe65368SLuis R. Rodriguez 
1748fe65368SLuis R. Rodriguez static inline int ath9k_hw_process_ini(struct ath_hw *ah,
1758fe65368SLuis R. Rodriguez 					struct ath9k_channel *chan)
1768fe65368SLuis R. Rodriguez {
1778fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->process_ini(ah, chan);
1788fe65368SLuis R. Rodriguez }
1798fe65368SLuis R. Rodriguez 
1808fe65368SLuis R. Rodriguez static inline void ath9k_olc_init(struct ath_hw *ah)
1818fe65368SLuis R. Rodriguez {
1828fe65368SLuis R. Rodriguez 	if (!ath9k_hw_private_ops(ah)->olc_init)
1838fe65368SLuis R. Rodriguez 		return;
1848fe65368SLuis R. Rodriguez 
1858fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->olc_init(ah);
1868fe65368SLuis R. Rodriguez }
1878fe65368SLuis R. Rodriguez 
1888fe65368SLuis R. Rodriguez static inline void ath9k_hw_set_rfmode(struct ath_hw *ah,
1898fe65368SLuis R. Rodriguez 				       struct ath9k_channel *chan)
1908fe65368SLuis R. Rodriguez {
1918fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->set_rfmode(ah, chan);
1928fe65368SLuis R. Rodriguez }
1938fe65368SLuis R. Rodriguez 
1948fe65368SLuis R. Rodriguez static inline void ath9k_hw_mark_phy_inactive(struct ath_hw *ah)
1958fe65368SLuis R. Rodriguez {
1968fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->mark_phy_inactive(ah);
1978fe65368SLuis R. Rodriguez }
1988fe65368SLuis R. Rodriguez 
1998fe65368SLuis R. Rodriguez static inline void ath9k_hw_set_delta_slope(struct ath_hw *ah,
2008fe65368SLuis R. Rodriguez 					    struct ath9k_channel *chan)
2018fe65368SLuis R. Rodriguez {
2028fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->set_delta_slope(ah, chan);
2038fe65368SLuis R. Rodriguez }
2048fe65368SLuis R. Rodriguez 
2058fe65368SLuis R. Rodriguez static inline bool ath9k_hw_rfbus_req(struct ath_hw *ah)
2068fe65368SLuis R. Rodriguez {
2078fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->rfbus_req(ah);
2088fe65368SLuis R. Rodriguez }
2098fe65368SLuis R. Rodriguez 
2108fe65368SLuis R. Rodriguez static inline void ath9k_hw_rfbus_done(struct ath_hw *ah)
2118fe65368SLuis R. Rodriguez {
2128fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->rfbus_done(ah);
2138fe65368SLuis R. Rodriguez }
2148fe65368SLuis R. Rodriguez 
2158fe65368SLuis R. Rodriguez static inline void ath9k_hw_restore_chainmask(struct ath_hw *ah)
2168fe65368SLuis R. Rodriguez {
2178fe65368SLuis R. Rodriguez 	if (!ath9k_hw_private_ops(ah)->restore_chainmask)
2188fe65368SLuis R. Rodriguez 		return;
2198fe65368SLuis R. Rodriguez 
2208fe65368SLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->restore_chainmask(ah);
2218fe65368SLuis R. Rodriguez }
2228fe65368SLuis R. Rodriguez 
223c16fcb49SFelix Fietkau static inline bool ath9k_hw_ani_control(struct ath_hw *ah,
224c16fcb49SFelix Fietkau 					enum ath9k_ani_cmd cmd, int param)
225c16fcb49SFelix Fietkau {
226c16fcb49SFelix Fietkau 	return ath9k_hw_private_ops(ah)->ani_control(ah, cmd, param);
227c16fcb49SFelix Fietkau }
228c16fcb49SFelix Fietkau 
229641d9921SFelix Fietkau static inline void ath9k_hw_do_getnf(struct ath_hw *ah,
230641d9921SFelix Fietkau 				     int16_t nfarray[NUM_NF_READINGS])
231641d9921SFelix Fietkau {
232795f5e2cSLuis R. Rodriguez 	ath9k_hw_private_ops(ah)->do_getnf(ah, nfarray);
233795f5e2cSLuis R. Rodriguez }
234795f5e2cSLuis R. Rodriguez 
235795f5e2cSLuis R. Rodriguez static inline bool ath9k_hw_init_cal(struct ath_hw *ah,
236795f5e2cSLuis R. Rodriguez 				     struct ath9k_channel *chan)
237795f5e2cSLuis R. Rodriguez {
238795f5e2cSLuis R. Rodriguez 	return ath9k_hw_private_ops(ah)->init_cal(ah, chan);
239795f5e2cSLuis R. Rodriguez }
240795f5e2cSLuis R. Rodriguez 
241795f5e2cSLuis R. Rodriguez static inline void ath9k_hw_setup_calibration(struct ath_hw *ah,
242795f5e2cSLuis R. Rodriguez 					      struct ath9k_cal_list *currCal)
243795f5e2cSLuis R. Rodriguez {
244795f5e2cSLuis R. Rodriguez 	ath9k_hw_private_ops(ah)->setup_calibration(ah, currCal);
245795f5e2cSLuis R. Rodriguez }
246795f5e2cSLuis R. Rodriguez 
2475f0c04eaSRajkumar Manoharan static inline int ath9k_hw_fast_chan_change(struct ath_hw *ah,
2485f0c04eaSRajkumar Manoharan 					    struct ath9k_channel *chan,
2495f0c04eaSRajkumar Manoharan 					    u8 *ini_reloaded)
2505f0c04eaSRajkumar Manoharan {
2515f0c04eaSRajkumar Manoharan 	return ath9k_hw_private_ops(ah)->fast_chan_change(ah, chan,
2525f0c04eaSRajkumar Manoharan 							  ini_reloaded);
2535f0c04eaSRajkumar Manoharan }
2549a66af33SZefir Kurtisi 
2559a66af33SZefir Kurtisi static inline void ath9k_hw_set_radar_params(struct ath_hw *ah)
2569a66af33SZefir Kurtisi {
2579a66af33SZefir Kurtisi 	if (!ath9k_hw_private_ops(ah)->set_radar_params)
2589a66af33SZefir Kurtisi 		return;
2599a66af33SZefir Kurtisi 
2609a66af33SZefir Kurtisi 	ath9k_hw_private_ops(ah)->set_radar_params(ah, &ah->radar_conf);
2619a66af33SZefir Kurtisi }
2629a66af33SZefir Kurtisi 
263e4ef2763SSujith Manoharan static inline void ath9k_hw_init_cal_settings(struct ath_hw *ah)
264e4ef2763SSujith Manoharan {
265e4ef2763SSujith Manoharan 	ath9k_hw_private_ops(ah)->init_cal_settings(ah);
266e4ef2763SSujith Manoharan }
267e4ef2763SSujith Manoharan 
268e4ef2763SSujith Manoharan static inline u32 ath9k_hw_compute_pll_control(struct ath_hw *ah,
269e4ef2763SSujith Manoharan 					       struct ath9k_channel *chan)
270e4ef2763SSujith Manoharan {
271e4ef2763SSujith Manoharan 	return ath9k_hw_private_ops(ah)->compute_pll_control(ah, chan);
272e4ef2763SSujith Manoharan }
273e4ef2763SSujith Manoharan 
274e4ef2763SSujith Manoharan static inline void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah)
275e4ef2763SSujith Manoharan {
276e4ef2763SSujith Manoharan 	if (!ath9k_hw_private_ops(ah)->init_mode_gain_regs)
277e4ef2763SSujith Manoharan 		return;
278e4ef2763SSujith Manoharan 
279e4ef2763SSujith Manoharan 	ath9k_hw_private_ops(ah)->init_mode_gain_regs(ah);
280e4ef2763SSujith Manoharan }
281e4ef2763SSujith Manoharan 
282e4ef2763SSujith Manoharan static inline void ath9k_hw_ani_cache_ini_regs(struct ath_hw *ah)
283e4ef2763SSujith Manoharan {
284e4ef2763SSujith Manoharan 	if (!ath9k_hw_private_ops(ah)->ani_cache_ini_regs)
285e4ef2763SSujith Manoharan 		return;
286e4ef2763SSujith Manoharan 
287e4ef2763SSujith Manoharan 	ath9k_hw_private_ops(ah)->ani_cache_ini_regs(ah);
288e4ef2763SSujith Manoharan }
289e4ef2763SSujith Manoharan 
290d70357d5SLuis R. Rodriguez #endif /* ATH9K_HW_OPS_H */
291