124487981SJohannes Berg #ifndef __MAC80211_DRIVER_OPS 224487981SJohannes Berg #define __MAC80211_DRIVER_OPS 324487981SJohannes Berg 424487981SJohannes Berg #include <net/mac80211.h> 524487981SJohannes Berg #include "ieee80211_i.h" 60a2b8bb2SJohannes Berg #include "driver-trace.h" 724487981SJohannes Berg 824487981SJohannes Berg static inline int drv_tx(struct ieee80211_local *local, struct sk_buff *skb) 924487981SJohannes Berg { 1024487981SJohannes Berg return local->ops->tx(&local->hw, skb); 1124487981SJohannes Berg } 1224487981SJohannes Berg 1324487981SJohannes Berg static inline int drv_start(struct ieee80211_local *local) 1424487981SJohannes Berg { 15ea77f12fSJohannes Berg int ret; 16ea77f12fSJohannes Berg 17e1781ed3SKalle Valo might_sleep(); 18e1781ed3SKalle Valo 194efc76bdSJohannes Berg trace_drv_start(local); 20ea77f12fSJohannes Berg local->started = true; 21ea77f12fSJohannes Berg smp_mb(); 22ea77f12fSJohannes Berg ret = local->ops->start(&local->hw); 234efc76bdSJohannes Berg trace_drv_return_int(local, ret); 240a2b8bb2SJohannes Berg return ret; 2524487981SJohannes Berg } 2624487981SJohannes Berg 2724487981SJohannes Berg static inline void drv_stop(struct ieee80211_local *local) 2824487981SJohannes Berg { 29e1781ed3SKalle Valo might_sleep(); 30e1781ed3SKalle Valo 310a2b8bb2SJohannes Berg trace_drv_stop(local); 324efc76bdSJohannes Berg local->ops->stop(&local->hw); 334efc76bdSJohannes Berg trace_drv_return_void(local); 34ea77f12fSJohannes Berg 35ea77f12fSJohannes Berg /* sync away all work on the tasklet before clearing started */ 36ea77f12fSJohannes Berg tasklet_disable(&local->tasklet); 37ea77f12fSJohannes Berg tasklet_enable(&local->tasklet); 38ea77f12fSJohannes Berg 39ea77f12fSJohannes Berg barrier(); 40ea77f12fSJohannes Berg 41ea77f12fSJohannes Berg local->started = false; 4224487981SJohannes Berg } 4324487981SJohannes Berg 4424487981SJohannes Berg static inline int drv_add_interface(struct ieee80211_local *local, 451ed32e4fSJohannes Berg struct ieee80211_vif *vif) 4624487981SJohannes Berg { 47e1781ed3SKalle Valo int ret; 48e1781ed3SKalle Valo 49e1781ed3SKalle Valo might_sleep(); 50e1781ed3SKalle Valo 514efc76bdSJohannes Berg trace_drv_add_interface(local, vif_to_sdata(vif)); 52e1781ed3SKalle Valo ret = local->ops->add_interface(&local->hw, vif); 534efc76bdSJohannes Berg trace_drv_return_int(local, ret); 540a2b8bb2SJohannes Berg return ret; 5524487981SJohannes Berg } 5624487981SJohannes Berg 5734d4bc4dSJohannes Berg static inline int drv_change_interface(struct ieee80211_local *local, 5834d4bc4dSJohannes Berg struct ieee80211_sub_if_data *sdata, 592ca27bcfSJohannes Berg enum nl80211_iftype type, bool p2p) 6034d4bc4dSJohannes Berg { 6134d4bc4dSJohannes Berg int ret; 6234d4bc4dSJohannes Berg 6334d4bc4dSJohannes Berg might_sleep(); 6434d4bc4dSJohannes Berg 652ca27bcfSJohannes Berg trace_drv_change_interface(local, sdata, type, p2p); 662ca27bcfSJohannes Berg ret = local->ops->change_interface(&local->hw, &sdata->vif, type, p2p); 6734d4bc4dSJohannes Berg trace_drv_return_int(local, ret); 6834d4bc4dSJohannes Berg return ret; 6934d4bc4dSJohannes Berg } 7034d4bc4dSJohannes Berg 7124487981SJohannes Berg static inline void drv_remove_interface(struct ieee80211_local *local, 721ed32e4fSJohannes Berg struct ieee80211_vif *vif) 7324487981SJohannes Berg { 74e1781ed3SKalle Valo might_sleep(); 75e1781ed3SKalle Valo 761ed32e4fSJohannes Berg trace_drv_remove_interface(local, vif_to_sdata(vif)); 774efc76bdSJohannes Berg local->ops->remove_interface(&local->hw, vif); 784efc76bdSJohannes Berg trace_drv_return_void(local); 7924487981SJohannes Berg } 8024487981SJohannes Berg 8124487981SJohannes Berg static inline int drv_config(struct ieee80211_local *local, u32 changed) 8224487981SJohannes Berg { 83e1781ed3SKalle Valo int ret; 84e1781ed3SKalle Valo 85e1781ed3SKalle Valo might_sleep(); 86e1781ed3SKalle Valo 874efc76bdSJohannes Berg trace_drv_config(local, changed); 88e1781ed3SKalle Valo ret = local->ops->config(&local->hw, changed); 894efc76bdSJohannes Berg trace_drv_return_int(local, ret); 900a2b8bb2SJohannes Berg return ret; 9124487981SJohannes Berg } 9224487981SJohannes Berg 9324487981SJohannes Berg static inline void drv_bss_info_changed(struct ieee80211_local *local, 9412375ef9SJohannes Berg struct ieee80211_sub_if_data *sdata, 9524487981SJohannes Berg struct ieee80211_bss_conf *info, 9624487981SJohannes Berg u32 changed) 9724487981SJohannes Berg { 98e1781ed3SKalle Valo might_sleep(); 99e1781ed3SKalle Valo 1004efc76bdSJohannes Berg trace_drv_bss_info_changed(local, sdata, info, changed); 10124487981SJohannes Berg if (local->ops->bss_info_changed) 10212375ef9SJohannes Berg local->ops->bss_info_changed(&local->hw, &sdata->vif, info, changed); 1034efc76bdSJohannes Berg trace_drv_return_void(local); 10424487981SJohannes Berg } 10524487981SJohannes Berg 1063ac64beeSJohannes Berg static inline u64 drv_prepare_multicast(struct ieee80211_local *local, 10722bedad3SJiri Pirko struct netdev_hw_addr_list *mc_list) 10824487981SJohannes Berg { 1093ac64beeSJohannes Berg u64 ret = 0; 1103ac64beeSJohannes Berg 1114efc76bdSJohannes Berg trace_drv_prepare_multicast(local, mc_list->count); 1124efc76bdSJohannes Berg 1133ac64beeSJohannes Berg if (local->ops->prepare_multicast) 11422bedad3SJiri Pirko ret = local->ops->prepare_multicast(&local->hw, mc_list); 1153ac64beeSJohannes Berg 1164efc76bdSJohannes Berg trace_drv_return_u64(local, ret); 1173ac64beeSJohannes Berg 1183ac64beeSJohannes Berg return ret; 1193ac64beeSJohannes Berg } 1203ac64beeSJohannes Berg 1213ac64beeSJohannes Berg static inline void drv_configure_filter(struct ieee80211_local *local, 1223ac64beeSJohannes Berg unsigned int changed_flags, 1233ac64beeSJohannes Berg unsigned int *total_flags, 1243ac64beeSJohannes Berg u64 multicast) 1253ac64beeSJohannes Berg { 1263ac64beeSJohannes Berg might_sleep(); 1273ac64beeSJohannes Berg 1280a2b8bb2SJohannes Berg trace_drv_configure_filter(local, changed_flags, total_flags, 1293ac64beeSJohannes Berg multicast); 1304efc76bdSJohannes Berg local->ops->configure_filter(&local->hw, changed_flags, total_flags, 1314efc76bdSJohannes Berg multicast); 1324efc76bdSJohannes Berg trace_drv_return_void(local); 13324487981SJohannes Berg } 13424487981SJohannes Berg 13524487981SJohannes Berg static inline int drv_set_tim(struct ieee80211_local *local, 13624487981SJohannes Berg struct ieee80211_sta *sta, bool set) 13724487981SJohannes Berg { 1380a2b8bb2SJohannes Berg int ret = 0; 1394efc76bdSJohannes Berg trace_drv_set_tim(local, sta, set); 14024487981SJohannes Berg if (local->ops->set_tim) 1410a2b8bb2SJohannes Berg ret = local->ops->set_tim(&local->hw, sta, set); 1424efc76bdSJohannes Berg trace_drv_return_int(local, ret); 1430a2b8bb2SJohannes Berg return ret; 14424487981SJohannes Berg } 14524487981SJohannes Berg 14624487981SJohannes Berg static inline int drv_set_key(struct ieee80211_local *local, 14712375ef9SJohannes Berg enum set_key_cmd cmd, 14812375ef9SJohannes Berg struct ieee80211_sub_if_data *sdata, 14924487981SJohannes Berg struct ieee80211_sta *sta, 15024487981SJohannes Berg struct ieee80211_key_conf *key) 15124487981SJohannes Berg { 152e1781ed3SKalle Valo int ret; 153e1781ed3SKalle Valo 154e1781ed3SKalle Valo might_sleep(); 155e1781ed3SKalle Valo 1564efc76bdSJohannes Berg trace_drv_set_key(local, cmd, sdata, sta, key); 157e1781ed3SKalle Valo ret = local->ops->set_key(&local->hw, cmd, &sdata->vif, sta, key); 1584efc76bdSJohannes Berg trace_drv_return_int(local, ret); 1590a2b8bb2SJohannes Berg return ret; 16024487981SJohannes Berg } 16124487981SJohannes Berg 16224487981SJohannes Berg static inline void drv_update_tkip_key(struct ieee80211_local *local, 163b3fbdcf4SJohannes Berg struct ieee80211_sub_if_data *sdata, 16424487981SJohannes Berg struct ieee80211_key_conf *conf, 165b3fbdcf4SJohannes Berg struct sta_info *sta, u32 iv32, 16624487981SJohannes Berg u16 *phase1key) 16724487981SJohannes Berg { 168b3fbdcf4SJohannes Berg struct ieee80211_sta *ista = NULL; 169b3fbdcf4SJohannes Berg 170b3fbdcf4SJohannes Berg if (sta) 171b3fbdcf4SJohannes Berg ista = &sta->sta; 172b3fbdcf4SJohannes Berg 1734efc76bdSJohannes Berg trace_drv_update_tkip_key(local, sdata, conf, ista, iv32); 17424487981SJohannes Berg if (local->ops->update_tkip_key) 175b3fbdcf4SJohannes Berg local->ops->update_tkip_key(&local->hw, &sdata->vif, conf, 176b3fbdcf4SJohannes Berg ista, iv32, phase1key); 1774efc76bdSJohannes Berg trace_drv_return_void(local); 17824487981SJohannes Berg } 17924487981SJohannes Berg 18024487981SJohannes Berg static inline int drv_hw_scan(struct ieee80211_local *local, 181a060bbfeSJohannes Berg struct ieee80211_sub_if_data *sdata, 18224487981SJohannes Berg struct cfg80211_scan_request *req) 18324487981SJohannes Berg { 184e1781ed3SKalle Valo int ret; 185e1781ed3SKalle Valo 186e1781ed3SKalle Valo might_sleep(); 187e1781ed3SKalle Valo 1884efc76bdSJohannes Berg trace_drv_hw_scan(local, sdata, req); 189a060bbfeSJohannes Berg ret = local->ops->hw_scan(&local->hw, &sdata->vif, req); 1904efc76bdSJohannes Berg trace_drv_return_int(local, ret); 1910a2b8bb2SJohannes Berg return ret; 19224487981SJohannes Berg } 19324487981SJohannes Berg 19424487981SJohannes Berg static inline void drv_sw_scan_start(struct ieee80211_local *local) 19524487981SJohannes Berg { 196e1781ed3SKalle Valo might_sleep(); 197e1781ed3SKalle Valo 1984efc76bdSJohannes Berg trace_drv_sw_scan_start(local); 19924487981SJohannes Berg if (local->ops->sw_scan_start) 20024487981SJohannes Berg local->ops->sw_scan_start(&local->hw); 2014efc76bdSJohannes Berg trace_drv_return_void(local); 20224487981SJohannes Berg } 20324487981SJohannes Berg 20424487981SJohannes Berg static inline void drv_sw_scan_complete(struct ieee80211_local *local) 20524487981SJohannes Berg { 206e1781ed3SKalle Valo might_sleep(); 207e1781ed3SKalle Valo 2084efc76bdSJohannes Berg trace_drv_sw_scan_complete(local); 20924487981SJohannes Berg if (local->ops->sw_scan_complete) 21024487981SJohannes Berg local->ops->sw_scan_complete(&local->hw); 2114efc76bdSJohannes Berg trace_drv_return_void(local); 21224487981SJohannes Berg } 21324487981SJohannes Berg 21424487981SJohannes Berg static inline int drv_get_stats(struct ieee80211_local *local, 21524487981SJohannes Berg struct ieee80211_low_level_stats *stats) 21624487981SJohannes Berg { 2170a2b8bb2SJohannes Berg int ret = -EOPNOTSUPP; 2180a2b8bb2SJohannes Berg 219e1781ed3SKalle Valo might_sleep(); 220e1781ed3SKalle Valo 2210a2b8bb2SJohannes Berg if (local->ops->get_stats) 2220a2b8bb2SJohannes Berg ret = local->ops->get_stats(&local->hw, stats); 2230a2b8bb2SJohannes Berg trace_drv_get_stats(local, stats, ret); 2240a2b8bb2SJohannes Berg 2250a2b8bb2SJohannes Berg return ret; 22624487981SJohannes Berg } 22724487981SJohannes Berg 22824487981SJohannes Berg static inline void drv_get_tkip_seq(struct ieee80211_local *local, 22924487981SJohannes Berg u8 hw_key_idx, u32 *iv32, u16 *iv16) 23024487981SJohannes Berg { 23124487981SJohannes Berg if (local->ops->get_tkip_seq) 23224487981SJohannes Berg local->ops->get_tkip_seq(&local->hw, hw_key_idx, iv32, iv16); 2330a2b8bb2SJohannes Berg trace_drv_get_tkip_seq(local, hw_key_idx, iv32, iv16); 23424487981SJohannes Berg } 23524487981SJohannes Berg 236f23a4780SArik Nemtsov static inline int drv_set_frag_threshold(struct ieee80211_local *local, 237f23a4780SArik Nemtsov u32 value) 238f23a4780SArik Nemtsov { 239f23a4780SArik Nemtsov int ret = 0; 240f23a4780SArik Nemtsov 241f23a4780SArik Nemtsov might_sleep(); 242f23a4780SArik Nemtsov 243f23a4780SArik Nemtsov trace_drv_set_frag_threshold(local, value); 244f23a4780SArik Nemtsov if (local->ops->set_frag_threshold) 245f23a4780SArik Nemtsov ret = local->ops->set_frag_threshold(&local->hw, value); 246f23a4780SArik Nemtsov trace_drv_return_int(local, ret); 247f23a4780SArik Nemtsov return ret; 248f23a4780SArik Nemtsov } 249f23a4780SArik Nemtsov 25024487981SJohannes Berg static inline int drv_set_rts_threshold(struct ieee80211_local *local, 25124487981SJohannes Berg u32 value) 25224487981SJohannes Berg { 2530a2b8bb2SJohannes Berg int ret = 0; 254e1781ed3SKalle Valo 255e1781ed3SKalle Valo might_sleep(); 256e1781ed3SKalle Valo 2574efc76bdSJohannes Berg trace_drv_set_rts_threshold(local, value); 25824487981SJohannes Berg if (local->ops->set_rts_threshold) 2590a2b8bb2SJohannes Berg ret = local->ops->set_rts_threshold(&local->hw, value); 2604efc76bdSJohannes Berg trace_drv_return_int(local, ret); 2610a2b8bb2SJohannes Berg return ret; 26224487981SJohannes Berg } 26324487981SJohannes Berg 264310bc676SLukáš Turek static inline int drv_set_coverage_class(struct ieee80211_local *local, 265310bc676SLukáš Turek u8 value) 266310bc676SLukáš Turek { 267310bc676SLukáš Turek int ret = 0; 268310bc676SLukáš Turek might_sleep(); 269310bc676SLukáš Turek 2704efc76bdSJohannes Berg trace_drv_set_coverage_class(local, value); 271310bc676SLukáš Turek if (local->ops->set_coverage_class) 272310bc676SLukáš Turek local->ops->set_coverage_class(&local->hw, value); 273310bc676SLukáš Turek else 274310bc676SLukáš Turek ret = -EOPNOTSUPP; 275310bc676SLukáš Turek 2764efc76bdSJohannes Berg trace_drv_return_int(local, ret); 277310bc676SLukáš Turek return ret; 278310bc676SLukáš Turek } 279310bc676SLukáš Turek 28024487981SJohannes Berg static inline void drv_sta_notify(struct ieee80211_local *local, 28112375ef9SJohannes Berg struct ieee80211_sub_if_data *sdata, 28224487981SJohannes Berg enum sta_notify_cmd cmd, 28324487981SJohannes Berg struct ieee80211_sta *sta) 28424487981SJohannes Berg { 2854efc76bdSJohannes Berg trace_drv_sta_notify(local, sdata, cmd, sta); 28624487981SJohannes Berg if (local->ops->sta_notify) 28712375ef9SJohannes Berg local->ops->sta_notify(&local->hw, &sdata->vif, cmd, sta); 2884efc76bdSJohannes Berg trace_drv_return_void(local); 28924487981SJohannes Berg } 29024487981SJohannes Berg 29134e89507SJohannes Berg static inline int drv_sta_add(struct ieee80211_local *local, 29234e89507SJohannes Berg struct ieee80211_sub_if_data *sdata, 29334e89507SJohannes Berg struct ieee80211_sta *sta) 29434e89507SJohannes Berg { 29534e89507SJohannes Berg int ret = 0; 29634e89507SJohannes Berg 29734e89507SJohannes Berg might_sleep(); 29834e89507SJohannes Berg 2994efc76bdSJohannes Berg trace_drv_sta_add(local, sdata, sta); 30034e89507SJohannes Berg if (local->ops->sta_add) 30134e89507SJohannes Berg ret = local->ops->sta_add(&local->hw, &sdata->vif, sta); 30234e89507SJohannes Berg 3034efc76bdSJohannes Berg trace_drv_return_int(local, ret); 30434e89507SJohannes Berg 30534e89507SJohannes Berg return ret; 30634e89507SJohannes Berg } 30734e89507SJohannes Berg 30834e89507SJohannes Berg static inline void drv_sta_remove(struct ieee80211_local *local, 30934e89507SJohannes Berg struct ieee80211_sub_if_data *sdata, 31034e89507SJohannes Berg struct ieee80211_sta *sta) 31134e89507SJohannes Berg { 31234e89507SJohannes Berg might_sleep(); 31334e89507SJohannes Berg 3144efc76bdSJohannes Berg trace_drv_sta_remove(local, sdata, sta); 31534e89507SJohannes Berg if (local->ops->sta_remove) 31634e89507SJohannes Berg local->ops->sta_remove(&local->hw, &sdata->vif, sta); 31734e89507SJohannes Berg 3184efc76bdSJohannes Berg trace_drv_return_void(local); 31934e89507SJohannes Berg } 32034e89507SJohannes Berg 32124487981SJohannes Berg static inline int drv_conf_tx(struct ieee80211_local *local, u16 queue, 32224487981SJohannes Berg const struct ieee80211_tx_queue_params *params) 32324487981SJohannes Berg { 3240a2b8bb2SJohannes Berg int ret = -EOPNOTSUPP; 325e1781ed3SKalle Valo 326e1781ed3SKalle Valo might_sleep(); 327e1781ed3SKalle Valo 3284efc76bdSJohannes Berg trace_drv_conf_tx(local, queue, params); 32924487981SJohannes Berg if (local->ops->conf_tx) 3300a2b8bb2SJohannes Berg ret = local->ops->conf_tx(&local->hw, queue, params); 3314efc76bdSJohannes Berg trace_drv_return_int(local, ret); 3320a2b8bb2SJohannes Berg return ret; 33324487981SJohannes Berg } 33424487981SJohannes Berg 33524487981SJohannes Berg static inline u64 drv_get_tsf(struct ieee80211_local *local) 33624487981SJohannes Berg { 3370a2b8bb2SJohannes Berg u64 ret = -1ULL; 338e1781ed3SKalle Valo 339e1781ed3SKalle Valo might_sleep(); 340e1781ed3SKalle Valo 3414efc76bdSJohannes Berg trace_drv_get_tsf(local); 34224487981SJohannes Berg if (local->ops->get_tsf) 3430a2b8bb2SJohannes Berg ret = local->ops->get_tsf(&local->hw); 3444efc76bdSJohannes Berg trace_drv_return_u64(local, ret); 3450a2b8bb2SJohannes Berg return ret; 34624487981SJohannes Berg } 34724487981SJohannes Berg 34824487981SJohannes Berg static inline void drv_set_tsf(struct ieee80211_local *local, u64 tsf) 34924487981SJohannes Berg { 350e1781ed3SKalle Valo might_sleep(); 351e1781ed3SKalle Valo 3524efc76bdSJohannes Berg trace_drv_set_tsf(local, tsf); 35324487981SJohannes Berg if (local->ops->set_tsf) 35424487981SJohannes Berg local->ops->set_tsf(&local->hw, tsf); 3554efc76bdSJohannes Berg trace_drv_return_void(local); 35624487981SJohannes Berg } 35724487981SJohannes Berg 35824487981SJohannes Berg static inline void drv_reset_tsf(struct ieee80211_local *local) 35924487981SJohannes Berg { 360e1781ed3SKalle Valo might_sleep(); 361e1781ed3SKalle Valo 3624efc76bdSJohannes Berg trace_drv_reset_tsf(local); 36324487981SJohannes Berg if (local->ops->reset_tsf) 36424487981SJohannes Berg local->ops->reset_tsf(&local->hw); 3654efc76bdSJohannes Berg trace_drv_return_void(local); 36624487981SJohannes Berg } 36724487981SJohannes Berg 36824487981SJohannes Berg static inline int drv_tx_last_beacon(struct ieee80211_local *local) 36924487981SJohannes Berg { 37091f44b02STim Harvey int ret = 0; /* default unsuported op for less congestion */ 371e1781ed3SKalle Valo 372e1781ed3SKalle Valo might_sleep(); 373e1781ed3SKalle Valo 3744efc76bdSJohannes Berg trace_drv_tx_last_beacon(local); 37524487981SJohannes Berg if (local->ops->tx_last_beacon) 3760a2b8bb2SJohannes Berg ret = local->ops->tx_last_beacon(&local->hw); 3774efc76bdSJohannes Berg trace_drv_return_int(local, ret); 3780a2b8bb2SJohannes Berg return ret; 37924487981SJohannes Berg } 38024487981SJohannes Berg 38124487981SJohannes Berg static inline int drv_ampdu_action(struct ieee80211_local *local, 38212375ef9SJohannes Berg struct ieee80211_sub_if_data *sdata, 38324487981SJohannes Berg enum ieee80211_ampdu_mlme_action action, 38424487981SJohannes Berg struct ieee80211_sta *sta, u16 tid, 3850b01f030SJohannes Berg u16 *ssn, u8 buf_size) 38624487981SJohannes Berg { 3870a2b8bb2SJohannes Berg int ret = -EOPNOTSUPP; 388cfcdbde3SJohannes Berg 389cfcdbde3SJohannes Berg might_sleep(); 390cfcdbde3SJohannes Berg 3910b01f030SJohannes Berg trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, buf_size); 3924efc76bdSJohannes Berg 39324487981SJohannes Berg if (local->ops->ampdu_action) 39412375ef9SJohannes Berg ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action, 3950b01f030SJohannes Berg sta, tid, ssn, buf_size); 39685ad181eSJohannes Berg 3974efc76bdSJohannes Berg trace_drv_return_int(local, ret); 3984efc76bdSJohannes Berg 3990a2b8bb2SJohannes Berg return ret; 40024487981SJohannes Berg } 4011f87f7d3SJohannes Berg 4021289723eSHolger Schurig static inline int drv_get_survey(struct ieee80211_local *local, int idx, 4031289723eSHolger Schurig struct survey_info *survey) 4041289723eSHolger Schurig { 4051289723eSHolger Schurig int ret = -EOPNOTSUPP; 406c466d4efSJohn W. Linville 407c466d4efSJohn W. Linville trace_drv_get_survey(local, idx, survey); 408c466d4efSJohn W. Linville 40935dd0509SHolger Schurig if (local->ops->get_survey) 4101289723eSHolger Schurig ret = local->ops->get_survey(&local->hw, idx, survey); 411c466d4efSJohn W. Linville 412c466d4efSJohn W. Linville trace_drv_return_int(local, ret); 413c466d4efSJohn W. Linville 4141289723eSHolger Schurig return ret; 4151289723eSHolger Schurig } 4161f87f7d3SJohannes Berg 4171f87f7d3SJohannes Berg static inline void drv_rfkill_poll(struct ieee80211_local *local) 4181f87f7d3SJohannes Berg { 419e1781ed3SKalle Valo might_sleep(); 420e1781ed3SKalle Valo 4211f87f7d3SJohannes Berg if (local->ops->rfkill_poll) 4221f87f7d3SJohannes Berg local->ops->rfkill_poll(&local->hw); 4231f87f7d3SJohannes Berg } 424a80f7c0bSJohannes Berg 425a80f7c0bSJohannes Berg static inline void drv_flush(struct ieee80211_local *local, bool drop) 426a80f7c0bSJohannes Berg { 427e1781ed3SKalle Valo might_sleep(); 428e1781ed3SKalle Valo 429a80f7c0bSJohannes Berg trace_drv_flush(local, drop); 430a80f7c0bSJohannes Berg if (local->ops->flush) 431a80f7c0bSJohannes Berg local->ops->flush(&local->hw, drop); 4324efc76bdSJohannes Berg trace_drv_return_void(local); 433a80f7c0bSJohannes Berg } 4345ce6e438SJohannes Berg 4355ce6e438SJohannes Berg static inline void drv_channel_switch(struct ieee80211_local *local, 4365ce6e438SJohannes Berg struct ieee80211_channel_switch *ch_switch) 4375ce6e438SJohannes Berg { 4385ce6e438SJohannes Berg might_sleep(); 4395ce6e438SJohannes Berg 4405ce6e438SJohannes Berg trace_drv_channel_switch(local, ch_switch); 4414efc76bdSJohannes Berg local->ops->channel_switch(&local->hw, ch_switch); 4424efc76bdSJohannes Berg trace_drv_return_void(local); 4435ce6e438SJohannes Berg } 4445ce6e438SJohannes Berg 44515d96753SBruno Randolf 44615d96753SBruno Randolf static inline int drv_set_antenna(struct ieee80211_local *local, 44715d96753SBruno Randolf u32 tx_ant, u32 rx_ant) 44815d96753SBruno Randolf { 44915d96753SBruno Randolf int ret = -EOPNOTSUPP; 45015d96753SBruno Randolf might_sleep(); 45115d96753SBruno Randolf if (local->ops->set_antenna) 45215d96753SBruno Randolf ret = local->ops->set_antenna(&local->hw, tx_ant, rx_ant); 45315d96753SBruno Randolf trace_drv_set_antenna(local, tx_ant, rx_ant, ret); 45415d96753SBruno Randolf return ret; 45515d96753SBruno Randolf } 45615d96753SBruno Randolf 45715d96753SBruno Randolf static inline int drv_get_antenna(struct ieee80211_local *local, 45815d96753SBruno Randolf u32 *tx_ant, u32 *rx_ant) 45915d96753SBruno Randolf { 46015d96753SBruno Randolf int ret = -EOPNOTSUPP; 46115d96753SBruno Randolf might_sleep(); 46215d96753SBruno Randolf if (local->ops->get_antenna) 46315d96753SBruno Randolf ret = local->ops->get_antenna(&local->hw, tx_ant, rx_ant); 46415d96753SBruno Randolf trace_drv_get_antenna(local, *tx_ant, *rx_ant, ret); 46515d96753SBruno Randolf return ret; 46615d96753SBruno Randolf } 46715d96753SBruno Randolf 46821f83589SJohannes Berg static inline int drv_remain_on_channel(struct ieee80211_local *local, 46921f83589SJohannes Berg struct ieee80211_channel *chan, 47021f83589SJohannes Berg enum nl80211_channel_type chantype, 47121f83589SJohannes Berg unsigned int duration) 47221f83589SJohannes Berg { 47321f83589SJohannes Berg int ret; 47421f83589SJohannes Berg 47521f83589SJohannes Berg might_sleep(); 47621f83589SJohannes Berg 47721f83589SJohannes Berg trace_drv_remain_on_channel(local, chan, chantype, duration); 47821f83589SJohannes Berg ret = local->ops->remain_on_channel(&local->hw, chan, chantype, 47921f83589SJohannes Berg duration); 48021f83589SJohannes Berg trace_drv_return_int(local, ret); 48121f83589SJohannes Berg 48221f83589SJohannes Berg return ret; 48321f83589SJohannes Berg } 48421f83589SJohannes Berg 48521f83589SJohannes Berg static inline int drv_cancel_remain_on_channel(struct ieee80211_local *local) 48621f83589SJohannes Berg { 48721f83589SJohannes Berg int ret; 48821f83589SJohannes Berg 48921f83589SJohannes Berg might_sleep(); 49021f83589SJohannes Berg 49121f83589SJohannes Berg trace_drv_cancel_remain_on_channel(local); 49221f83589SJohannes Berg ret = local->ops->cancel_remain_on_channel(&local->hw); 49321f83589SJohannes Berg trace_drv_return_int(local, ret); 49421f83589SJohannes Berg 49521f83589SJohannes Berg return ret; 49621f83589SJohannes Berg } 49721f83589SJohannes Berg 49824487981SJohannes Berg #endif /* __MAC80211_DRIVER_OPS */ 499