driver-ops.h 8.6 KB
Newer Older
1 2 3 4 5
#ifndef __MAC80211_DRIVER_OPS
#define __MAC80211_DRIVER_OPS

#include <net/mac80211.h>
#include "ieee80211_i.h"
6
#include "driver-trace.h"
7 8 9 10 11 12 13 14

static inline int drv_tx(struct ieee80211_local *local, struct sk_buff *skb)
{
	return local->ops->tx(&local->hw, skb);
}

static inline int drv_start(struct ieee80211_local *local)
{
15 16
	int ret;

17 18
	might_sleep();

19 20 21
	local->started = true;
	smp_mb();
	ret = local->ops->start(&local->hw);
22 23
	trace_drv_start(local, ret);
	return ret;
24 25 26 27
}

static inline void drv_stop(struct ieee80211_local *local)
{
28 29
	might_sleep();

30
	local->ops->stop(&local->hw);
31
	trace_drv_stop(local);
32 33 34 35 36 37 38 39

	/* sync away all work on the tasklet before clearing started */
	tasklet_disable(&local->tasklet);
	tasklet_enable(&local->tasklet);

	barrier();

	local->started = false;
40 41 42
}

static inline int drv_add_interface(struct ieee80211_local *local,
43
				    struct ieee80211_vif *vif)
44
{
45 46 47 48 49
	int ret;

	might_sleep();

	ret = local->ops->add_interface(&local->hw, vif);
50
	trace_drv_add_interface(local, vif_to_sdata(vif), ret);
51
	return ret;
52 53 54
}

static inline void drv_remove_interface(struct ieee80211_local *local,
55
					struct ieee80211_vif *vif)
56
{
57 58
	might_sleep();

59 60
	local->ops->remove_interface(&local->hw, vif);
	trace_drv_remove_interface(local, vif_to_sdata(vif));
61 62 63 64
}

static inline int drv_config(struct ieee80211_local *local, u32 changed)
{
65 66 67 68 69
	int ret;

	might_sleep();

	ret = local->ops->config(&local->hw, changed);
70 71
	trace_drv_config(local, changed, ret);
	return ret;
72 73 74
}

static inline void drv_bss_info_changed(struct ieee80211_local *local,
J
Johannes Berg 已提交
75
					struct ieee80211_sub_if_data *sdata,
76 77 78
					struct ieee80211_bss_conf *info,
					u32 changed)
{
79 80
	might_sleep();

81
	if (local->ops->bss_info_changed)
J
Johannes Berg 已提交
82 83
		local->ops->bss_info_changed(&local->hw, &sdata->vif, info, changed);
	trace_drv_bss_info_changed(local, sdata, info, changed);
84 85
}

86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
static inline u64 drv_prepare_multicast(struct ieee80211_local *local,
					int mc_count,
					struct dev_addr_list *mc_list)
{
	u64 ret = 0;

	if (local->ops->prepare_multicast)
		ret = local->ops->prepare_multicast(&local->hw, mc_count,
						    mc_list);

	trace_drv_prepare_multicast(local, mc_count, ret);

	return ret;
}

101 102 103
static inline void drv_configure_filter(struct ieee80211_local *local,
					unsigned int changed_flags,
					unsigned int *total_flags,
104
					u64 multicast)
105
{
106 107
	might_sleep();

108
	local->ops->configure_filter(&local->hw, changed_flags, total_flags,
109
				     multicast);
110
	trace_drv_configure_filter(local, changed_flags, total_flags,
111
				   multicast);
112 113 114 115 116
}

static inline int drv_set_tim(struct ieee80211_local *local,
			      struct ieee80211_sta *sta, bool set)
{
117
	int ret = 0;
118
	if (local->ops->set_tim)
119 120 121
		ret = local->ops->set_tim(&local->hw, sta, set);
	trace_drv_set_tim(local, sta, set, ret);
	return ret;
122 123 124
}

static inline int drv_set_key(struct ieee80211_local *local,
J
Johannes Berg 已提交
125 126
			      enum set_key_cmd cmd,
			      struct ieee80211_sub_if_data *sdata,
127 128 129
			      struct ieee80211_sta *sta,
			      struct ieee80211_key_conf *key)
{
130 131 132 133 134
	int ret;

	might_sleep();

	ret = local->ops->set_key(&local->hw, cmd, &sdata->vif, sta, key);
J
Johannes Berg 已提交
135
	trace_drv_set_key(local, cmd, sdata, sta, key, ret);
136
	return ret;
137 138 139
}

static inline void drv_update_tkip_key(struct ieee80211_local *local,
140
				       struct ieee80211_sub_if_data *sdata,
141
				       struct ieee80211_key_conf *conf,
142
				       struct sta_info *sta, u32 iv32,
143 144
				       u16 *phase1key)
{
145 146 147 148 149
	struct ieee80211_sta *ista = NULL;

	if (sta)
		ista = &sta->sta;

150
	if (local->ops->update_tkip_key)
151 152 153
		local->ops->update_tkip_key(&local->hw, &sdata->vif, conf,
					    ista, iv32, phase1key);
	trace_drv_update_tkip_key(local, sdata, conf, ista, iv32);
154 155 156 157 158
}

static inline int drv_hw_scan(struct ieee80211_local *local,
			      struct cfg80211_scan_request *req)
{
159 160 161 162 163
	int ret;

	might_sleep();

	ret = local->ops->hw_scan(&local->hw, req);
164 165
	trace_drv_hw_scan(local, req, ret);
	return ret;
166 167 168 169
}

static inline void drv_sw_scan_start(struct ieee80211_local *local)
{
170 171
	might_sleep();

172 173
	if (local->ops->sw_scan_start)
		local->ops->sw_scan_start(&local->hw);
174
	trace_drv_sw_scan_start(local);
175 176 177 178
}

static inline void drv_sw_scan_complete(struct ieee80211_local *local)
{
179 180
	might_sleep();

181 182
	if (local->ops->sw_scan_complete)
		local->ops->sw_scan_complete(&local->hw);
183
	trace_drv_sw_scan_complete(local);
184 185 186 187 188
}

static inline int drv_get_stats(struct ieee80211_local *local,
				struct ieee80211_low_level_stats *stats)
{
189 190
	int ret = -EOPNOTSUPP;

191 192
	might_sleep();

193 194 195 196 197
	if (local->ops->get_stats)
		ret = local->ops->get_stats(&local->hw, stats);
	trace_drv_get_stats(local, stats, ret);

	return ret;
198 199 200 201 202 203 204
}

static inline void drv_get_tkip_seq(struct ieee80211_local *local,
				    u8 hw_key_idx, u32 *iv32, u16 *iv16)
{
	if (local->ops->get_tkip_seq)
		local->ops->get_tkip_seq(&local->hw, hw_key_idx, iv32, iv16);
205
	trace_drv_get_tkip_seq(local, hw_key_idx, iv32, iv16);
206 207 208 209 210
}

static inline int drv_set_rts_threshold(struct ieee80211_local *local,
					u32 value)
{
211
	int ret = 0;
212 213 214

	might_sleep();

215
	if (local->ops->set_rts_threshold)
216 217 218
		ret = local->ops->set_rts_threshold(&local->hw, value);
	trace_drv_set_rts_threshold(local, value, ret);
	return ret;
219 220
}

221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
static inline int drv_set_coverage_class(struct ieee80211_local *local,
					 u8 value)
{
	int ret = 0;
	might_sleep();

	if (local->ops->set_coverage_class)
		local->ops->set_coverage_class(&local->hw, value);
	else
		ret = -EOPNOTSUPP;

	trace_drv_set_coverage_class(local, value, ret);
	return ret;
}

236
static inline void drv_sta_notify(struct ieee80211_local *local,
J
Johannes Berg 已提交
237
				  struct ieee80211_sub_if_data *sdata,
238 239 240 241
				  enum sta_notify_cmd cmd,
				  struct ieee80211_sta *sta)
{
	if (local->ops->sta_notify)
J
Johannes Berg 已提交
242 243
		local->ops->sta_notify(&local->hw, &sdata->vif, cmd, sta);
	trace_drv_sta_notify(local, sdata, cmd, sta);
244 245
}

246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
static inline int drv_sta_add(struct ieee80211_local *local,
			      struct ieee80211_sub_if_data *sdata,
			      struct ieee80211_sta *sta)
{
	int ret = 0;

	might_sleep();

	if (local->ops->sta_add)
		ret = local->ops->sta_add(&local->hw, &sdata->vif, sta);
	else if (local->ops->sta_notify)
		local->ops->sta_notify(&local->hw, &sdata->vif,
					STA_NOTIFY_ADD, sta);

	trace_drv_sta_add(local, sdata, sta, ret);

	return ret;
}

static inline void drv_sta_remove(struct ieee80211_local *local,
				  struct ieee80211_sub_if_data *sdata,
				  struct ieee80211_sta *sta)
{
	might_sleep();

	if (local->ops->sta_remove)
		local->ops->sta_remove(&local->hw, &sdata->vif, sta);
	else if (local->ops->sta_notify)
		local->ops->sta_notify(&local->hw, &sdata->vif,
					STA_NOTIFY_REMOVE, sta);

	trace_drv_sta_remove(local, sdata, sta);
}

280 281 282
static inline int drv_conf_tx(struct ieee80211_local *local, u16 queue,
			      const struct ieee80211_tx_queue_params *params)
{
283
	int ret = -EOPNOTSUPP;
284 285 286

	might_sleep();

287
	if (local->ops->conf_tx)
288 289 290
		ret = local->ops->conf_tx(&local->hw, queue, params);
	trace_drv_conf_tx(local, queue, params, ret);
	return ret;
291 292 293 294
}

static inline u64 drv_get_tsf(struct ieee80211_local *local)
{
295
	u64 ret = -1ULL;
296 297 298

	might_sleep();

299
	if (local->ops->get_tsf)
300 301 302
		ret = local->ops->get_tsf(&local->hw);
	trace_drv_get_tsf(local, ret);
	return ret;
303 304 305 306
}

static inline void drv_set_tsf(struct ieee80211_local *local, u64 tsf)
{
307 308
	might_sleep();

309 310
	if (local->ops->set_tsf)
		local->ops->set_tsf(&local->hw, tsf);
311
	trace_drv_set_tsf(local, tsf);
312 313 314 315
}

static inline void drv_reset_tsf(struct ieee80211_local *local)
{
316 317
	might_sleep();

318 319
	if (local->ops->reset_tsf)
		local->ops->reset_tsf(&local->hw);
320
	trace_drv_reset_tsf(local);
321 322 323 324
}

static inline int drv_tx_last_beacon(struct ieee80211_local *local)
{
325
	int ret = 1;
326 327 328

	might_sleep();

329
	if (local->ops->tx_last_beacon)
330 331 332
		ret = local->ops->tx_last_beacon(&local->hw);
	trace_drv_tx_last_beacon(local, ret);
	return ret;
333 334 335
}

static inline int drv_ampdu_action(struct ieee80211_local *local,
J
Johannes Berg 已提交
336
				   struct ieee80211_sub_if_data *sdata,
337 338 339 340
				   enum ieee80211_ampdu_mlme_action action,
				   struct ieee80211_sta *sta, u16 tid,
				   u16 *ssn)
{
341
	int ret = -EOPNOTSUPP;
342
	if (local->ops->ampdu_action)
J
Johannes Berg 已提交
343
		ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action,
344
					       sta, tid, ssn);
J
Johannes Berg 已提交
345
	trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, ret);
346
	return ret;
347
}
J
Johannes Berg 已提交
348

349 350 351 352 353 354 355 356 357
static inline int drv_get_survey(struct ieee80211_local *local, int idx,
				struct survey_info *survey)
{
	int ret = -EOPNOTSUPP;
	if (local->ops->conf_tx)
		ret = local->ops->get_survey(&local->hw, idx, survey);
	/* trace_drv_get_survey(local, idx, survey, ret); */
	return ret;
}
J
Johannes Berg 已提交
358 359 360

static inline void drv_rfkill_poll(struct ieee80211_local *local)
{
361 362
	might_sleep();

J
Johannes Berg 已提交
363 364 365
	if (local->ops->rfkill_poll)
		local->ops->rfkill_poll(&local->hw);
}
366 367 368

static inline void drv_flush(struct ieee80211_local *local, bool drop)
{
369 370
	might_sleep();

371 372 373 374
	trace_drv_flush(local, drop);
	if (local->ops->flush)
		local->ops->flush(&local->hw, drop);
}
375
#endif /* __MAC80211_DRIVER_OPS */