xref: /openbmc/linux/net/mac80211/driver-ops.h (revision 0b01f030)
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