driver-ops.h 8.7 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
}

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

	might_sleep();

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

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

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

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

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

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

192 193
	might_sleep();

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

	return ret;
199 200 201 202 203 204 205
}

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);
206
	trace_drv_get_tkip_seq(local, hw_key_idx, iv32, iv16);
207 208 209 210 211
}

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

	might_sleep();

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

222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
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;
}

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

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

	might_sleep();

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

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

	might_sleep();

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

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

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

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

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

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

	might_sleep();

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

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

350 351 352 353 354 355 356 357 358
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 已提交
359 360 361

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

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

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

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