162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright (c) 2010-2011 Atheros Communications Inc. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Permission to use, copy, modify, and/or distribute this software for any 562306a36Sopenharmony_ci * purpose with or without fee is hereby granted, provided that the above 662306a36Sopenharmony_ci * copyright notice and this permission notice appear in all copies. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 962306a36Sopenharmony_ci * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1062306a36Sopenharmony_ci * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1162306a36Sopenharmony_ci * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1262306a36Sopenharmony_ci * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1362306a36Sopenharmony_ci * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1462306a36Sopenharmony_ci * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#ifndef ATH9K_HW_OPS_H 1862306a36Sopenharmony_ci#define ATH9K_HW_OPS_H 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include "hw.h" 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* Hardware core and driver accessible callbacks */ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistatic inline void ath9k_hw_configpcipowersave(struct ath_hw *ah, 2562306a36Sopenharmony_ci bool power_off) 2662306a36Sopenharmony_ci{ 2762306a36Sopenharmony_ci if (!ah->aspm_enabled) 2862306a36Sopenharmony_ci return; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci ath9k_hw_ops(ah)->config_pci_powersave(ah, power_off); 3162306a36Sopenharmony_ci} 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic inline void ath9k_hw_rxena(struct ath_hw *ah) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci ath9k_hw_ops(ah)->rx_enable(ah); 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic inline void ath9k_hw_set_desc_link(struct ath_hw *ah, void *ds, 3962306a36Sopenharmony_ci u32 link) 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci ath9k_hw_ops(ah)->set_desc_link(ds, link); 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic inline int ath9k_hw_calibrate(struct ath_hw *ah, 4562306a36Sopenharmony_ci struct ath9k_channel *chan, 4662306a36Sopenharmony_ci u8 rxchainmask, bool longcal) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci return ath9k_hw_ops(ah)->calibrate(ah, chan, rxchainmask, longcal); 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic inline bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked, 5262306a36Sopenharmony_ci u32 *sync_cause_p) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci return ath9k_hw_ops(ah)->get_isr(ah, masked, sync_cause_p); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic inline void ath9k_hw_set_txdesc(struct ath_hw *ah, void *ds, 5862306a36Sopenharmony_ci struct ath_tx_info *i) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci return ath9k_hw_ops(ah)->set_txdesc(ah, ds, i); 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistatic inline int ath9k_hw_txprocdesc(struct ath_hw *ah, void *ds, 6462306a36Sopenharmony_ci struct ath_tx_status *ts) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci return ath9k_hw_ops(ah)->proc_txdesc(ah, ds, ts); 6762306a36Sopenharmony_ci} 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistatic inline int ath9k_hw_get_duration(struct ath_hw *ah, const void *ds, 7062306a36Sopenharmony_ci int index) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci return ath9k_hw_ops(ah)->get_duration(ah, ds, index); 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic inline void ath9k_hw_antdiv_comb_conf_get(struct ath_hw *ah, 7662306a36Sopenharmony_ci struct ath_hw_antcomb_conf *antconf) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci ath9k_hw_ops(ah)->antdiv_comb_conf_get(ah, antconf); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistatic inline void ath9k_hw_antdiv_comb_conf_set(struct ath_hw *ah, 8262306a36Sopenharmony_ci struct ath_hw_antcomb_conf *antconf) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci ath9k_hw_ops(ah)->antdiv_comb_conf_set(ah, antconf); 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistatic inline void ath9k_hw_tx99_start(struct ath_hw *ah, u32 qnum) 8862306a36Sopenharmony_ci{ 8962306a36Sopenharmony_ci ath9k_hw_ops(ah)->tx99_start(ah, qnum); 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistatic inline void ath9k_hw_tx99_stop(struct ath_hw *ah) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci ath9k_hw_ops(ah)->tx99_stop(ah); 9562306a36Sopenharmony_ci} 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistatic inline void ath9k_hw_tx99_set_txpower(struct ath_hw *ah, u8 power) 9862306a36Sopenharmony_ci{ 9962306a36Sopenharmony_ci if (ath9k_hw_ops(ah)->tx99_set_txpower) 10062306a36Sopenharmony_ci ath9k_hw_ops(ah)->tx99_set_txpower(ah, power); 10162306a36Sopenharmony_ci} 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistatic inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable) 10662306a36Sopenharmony_ci{ 10762306a36Sopenharmony_ci if (ath9k_hw_ops(ah)->set_bt_ant_diversity) 10862306a36Sopenharmony_ci ath9k_hw_ops(ah)->set_bt_ant_diversity(ah, enable); 10962306a36Sopenharmony_ci} 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic inline bool ath9k_hw_is_aic_enabled(struct ath_hw *ah) 11262306a36Sopenharmony_ci{ 11362306a36Sopenharmony_ci if (ath9k_hw_private_ops(ah)->is_aic_enabled) 11462306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->is_aic_enabled(ah); 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci return false; 11762306a36Sopenharmony_ci} 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci#endif 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci/* Private hardware call ops */ 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cistatic inline void ath9k_hw_init_hang_checks(struct ath_hw *ah) 12462306a36Sopenharmony_ci{ 12562306a36Sopenharmony_ci ath9k_hw_private_ops(ah)->init_hang_checks(ah); 12662306a36Sopenharmony_ci} 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistatic inline bool ath9k_hw_detect_mac_hang(struct ath_hw *ah) 12962306a36Sopenharmony_ci{ 13062306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->detect_mac_hang(ah); 13162306a36Sopenharmony_ci} 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistatic inline bool ath9k_hw_detect_bb_hang(struct ath_hw *ah) 13462306a36Sopenharmony_ci{ 13562306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->detect_bb_hang(ah); 13662306a36Sopenharmony_ci} 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci/* PHY ops */ 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistatic inline int ath9k_hw_rf_set_freq(struct ath_hw *ah, 14162306a36Sopenharmony_ci struct ath9k_channel *chan) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->rf_set_freq(ah, chan); 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistatic inline void ath9k_hw_spur_mitigate_freq(struct ath_hw *ah, 14762306a36Sopenharmony_ci struct ath9k_channel *chan) 14862306a36Sopenharmony_ci{ 14962306a36Sopenharmony_ci ath9k_hw_private_ops(ah)->spur_mitigate_freq(ah, chan); 15062306a36Sopenharmony_ci} 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cistatic inline bool ath9k_hw_set_rf_regs(struct ath_hw *ah, 15362306a36Sopenharmony_ci struct ath9k_channel *chan, 15462306a36Sopenharmony_ci u16 modesIndex) 15562306a36Sopenharmony_ci{ 15662306a36Sopenharmony_ci if (!ath9k_hw_private_ops(ah)->set_rf_regs) 15762306a36Sopenharmony_ci return true; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->set_rf_regs(ah, chan, modesIndex); 16062306a36Sopenharmony_ci} 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cistatic inline void ath9k_hw_init_bb(struct ath_hw *ah, 16362306a36Sopenharmony_ci struct ath9k_channel *chan) 16462306a36Sopenharmony_ci{ 16562306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->init_bb(ah, chan); 16662306a36Sopenharmony_ci} 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_cistatic inline void ath9k_hw_set_channel_regs(struct ath_hw *ah, 16962306a36Sopenharmony_ci struct ath9k_channel *chan) 17062306a36Sopenharmony_ci{ 17162306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->set_channel_regs(ah, chan); 17262306a36Sopenharmony_ci} 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cistatic inline int ath9k_hw_process_ini(struct ath_hw *ah, 17562306a36Sopenharmony_ci struct ath9k_channel *chan) 17662306a36Sopenharmony_ci{ 17762306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->process_ini(ah, chan); 17862306a36Sopenharmony_ci} 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistatic inline void ath9k_olc_init(struct ath_hw *ah) 18162306a36Sopenharmony_ci{ 18262306a36Sopenharmony_ci if (!ath9k_hw_private_ops(ah)->olc_init) 18362306a36Sopenharmony_ci return; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->olc_init(ah); 18662306a36Sopenharmony_ci} 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistatic inline void ath9k_hw_set_rfmode(struct ath_hw *ah, 18962306a36Sopenharmony_ci struct ath9k_channel *chan) 19062306a36Sopenharmony_ci{ 19162306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->set_rfmode(ah, chan); 19262306a36Sopenharmony_ci} 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cistatic inline void ath9k_hw_mark_phy_inactive(struct ath_hw *ah) 19562306a36Sopenharmony_ci{ 19662306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->mark_phy_inactive(ah); 19762306a36Sopenharmony_ci} 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistatic inline void ath9k_hw_set_delta_slope(struct ath_hw *ah, 20062306a36Sopenharmony_ci struct ath9k_channel *chan) 20162306a36Sopenharmony_ci{ 20262306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->set_delta_slope(ah, chan); 20362306a36Sopenharmony_ci} 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_cistatic inline bool ath9k_hw_rfbus_req(struct ath_hw *ah) 20662306a36Sopenharmony_ci{ 20762306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->rfbus_req(ah); 20862306a36Sopenharmony_ci} 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistatic inline void ath9k_hw_rfbus_done(struct ath_hw *ah) 21162306a36Sopenharmony_ci{ 21262306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->rfbus_done(ah); 21362306a36Sopenharmony_ci} 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_cistatic inline void ath9k_hw_restore_chainmask(struct ath_hw *ah) 21662306a36Sopenharmony_ci{ 21762306a36Sopenharmony_ci if (!ath9k_hw_private_ops(ah)->restore_chainmask) 21862306a36Sopenharmony_ci return; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->restore_chainmask(ah); 22162306a36Sopenharmony_ci} 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_cistatic inline bool ath9k_hw_ani_control(struct ath_hw *ah, 22462306a36Sopenharmony_ci enum ath9k_ani_cmd cmd, int param) 22562306a36Sopenharmony_ci{ 22662306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->ani_control(ah, cmd, param); 22762306a36Sopenharmony_ci} 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_cistatic inline void ath9k_hw_do_getnf(struct ath_hw *ah, 23062306a36Sopenharmony_ci int16_t nfarray[NUM_NF_READINGS]) 23162306a36Sopenharmony_ci{ 23262306a36Sopenharmony_ci ath9k_hw_private_ops(ah)->do_getnf(ah, nfarray); 23362306a36Sopenharmony_ci} 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_cistatic inline bool ath9k_hw_init_cal(struct ath_hw *ah, 23662306a36Sopenharmony_ci struct ath9k_channel *chan) 23762306a36Sopenharmony_ci{ 23862306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->init_cal(ah, chan); 23962306a36Sopenharmony_ci} 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistatic inline void ath9k_hw_setup_calibration(struct ath_hw *ah, 24262306a36Sopenharmony_ci struct ath9k_cal_list *currCal) 24362306a36Sopenharmony_ci{ 24462306a36Sopenharmony_ci ath9k_hw_private_ops(ah)->setup_calibration(ah, currCal); 24562306a36Sopenharmony_ci} 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_cistatic inline int ath9k_hw_fast_chan_change(struct ath_hw *ah, 24862306a36Sopenharmony_ci struct ath9k_channel *chan, 24962306a36Sopenharmony_ci u8 *ini_reloaded) 25062306a36Sopenharmony_ci{ 25162306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->fast_chan_change(ah, chan, 25262306a36Sopenharmony_ci ini_reloaded); 25362306a36Sopenharmony_ci} 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cistatic inline void ath9k_hw_set_radar_params(struct ath_hw *ah) 25662306a36Sopenharmony_ci{ 25762306a36Sopenharmony_ci if (!ath9k_hw_private_ops(ah)->set_radar_params) 25862306a36Sopenharmony_ci return; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci ath9k_hw_private_ops(ah)->set_radar_params(ah, &ah->radar_conf); 26162306a36Sopenharmony_ci} 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_cistatic inline void ath9k_hw_init_cal_settings(struct ath_hw *ah) 26462306a36Sopenharmony_ci{ 26562306a36Sopenharmony_ci ath9k_hw_private_ops(ah)->init_cal_settings(ah); 26662306a36Sopenharmony_ci} 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_cistatic inline u32 ath9k_hw_compute_pll_control(struct ath_hw *ah, 26962306a36Sopenharmony_ci struct ath9k_channel *chan) 27062306a36Sopenharmony_ci{ 27162306a36Sopenharmony_ci return ath9k_hw_private_ops(ah)->compute_pll_control(ah, chan); 27262306a36Sopenharmony_ci} 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistatic inline void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah) 27562306a36Sopenharmony_ci{ 27662306a36Sopenharmony_ci if (!ath9k_hw_private_ops(ah)->init_mode_gain_regs) 27762306a36Sopenharmony_ci return; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci ath9k_hw_private_ops(ah)->init_mode_gain_regs(ah); 28062306a36Sopenharmony_ci} 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_cistatic inline void ath9k_hw_ani_cache_ini_regs(struct ath_hw *ah) 28362306a36Sopenharmony_ci{ 28462306a36Sopenharmony_ci if (!ath9k_hw_private_ops(ah)->ani_cache_ini_regs) 28562306a36Sopenharmony_ci return; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci ath9k_hw_private_ops(ah)->ani_cache_ini_regs(ah); 28862306a36Sopenharmony_ci} 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci#endif /* ATH9K_HW_OPS_H */ 291