1 #ifndef __MAC80211_DRIVER_OPS 2 #define __MAC80211_DRIVER_OPS 3 4 #include <net/mac80211.h> 5 #include "ieee80211_i.h" 6 #include "driver-trace.h" 7 8 static inline int drv_tx(struct ieee80211_local *local, struct sk_buff *skb) 9 { 10 return local->ops->tx(&local->hw, skb); 11 } 12 13 static inline int drv_start(struct ieee80211_local *local) 14 { 15 int ret; 16 17 might_sleep(); 18 19 local->started = true; 20 smp_mb(); 21 ret = local->ops->start(&local->hw); 22 trace_drv_start(local, ret); 23 return ret; 24 } 25 26 static inline void drv_stop(struct ieee80211_local *local) 27 { 28 might_sleep(); 29 30 local->ops->stop(&local->hw); 31 trace_drv_stop(local); 32 33 /* sync away all work on the tasklet before clearing started */ 34 tasklet_disable(&local->tasklet); 35 tasklet_enable(&local->tasklet); 36 37 barrier(); 38 39 local->started = false; 40 } 41 42 static inline int drv_add_interface(struct ieee80211_local *local, 43 struct ieee80211_vif *vif) 44 { 45 int ret; 46 47 might_sleep(); 48 49 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 might_sleep(); 58 59 local->ops->remove_interface(&local->hw, vif); 60 trace_drv_remove_interface(local, vif_to_sdata(vif)); 61 } 62 63 static inline int drv_config(struct ieee80211_local *local, u32 changed) 64 { 65 int ret; 66 67 might_sleep(); 68 69 ret = local->ops->config(&local->hw, changed); 70 trace_drv_config(local, changed, ret); 71 return ret; 72 } 73 74 static inline void drv_bss_info_changed(struct ieee80211_local *local, 75 struct ieee80211_sub_if_data *sdata, 76 struct ieee80211_bss_conf *info, 77 u32 changed) 78 { 79 might_sleep(); 80 81 if (local->ops->bss_info_changed) 82 local->ops->bss_info_changed(&local->hw, &sdata->vif, info, changed); 83 trace_drv_bss_info_changed(local, sdata, info, changed); 84 } 85 86 static inline u64 drv_prepare_multicast(struct ieee80211_local *local, 87 struct netdev_hw_addr_list *mc_list) 88 { 89 u64 ret = 0; 90 91 if (local->ops->prepare_multicast) 92 ret = local->ops->prepare_multicast(&local->hw, mc_list); 93 94 trace_drv_prepare_multicast(local, mc_list->count, ret); 95 96 return ret; 97 } 98 99 static inline void drv_configure_filter(struct ieee80211_local *local, 100 unsigned int changed_flags, 101 unsigned int *total_flags, 102 u64 multicast) 103 { 104 might_sleep(); 105 106 local->ops->configure_filter(&local->hw, changed_flags, total_flags, 107 multicast); 108 trace_drv_configure_filter(local, changed_flags, total_flags, 109 multicast); 110 } 111 112 static inline int drv_set_tim(struct ieee80211_local *local, 113 struct ieee80211_sta *sta, bool set) 114 { 115 int ret = 0; 116 if (local->ops->set_tim) 117 ret = local->ops->set_tim(&local->hw, sta, set); 118 trace_drv_set_tim(local, sta, set, ret); 119 return ret; 120 } 121 122 static inline int drv_set_key(struct ieee80211_local *local, 123 enum set_key_cmd cmd, 124 struct ieee80211_sub_if_data *sdata, 125 struct ieee80211_sta *sta, 126 struct ieee80211_key_conf *key) 127 { 128 int ret; 129 130 might_sleep(); 131 132 ret = local->ops->set_key(&local->hw, cmd, &sdata->vif, sta, key); 133 trace_drv_set_key(local, cmd, sdata, sta, key, ret); 134 return ret; 135 } 136 137 static inline void drv_update_tkip_key(struct ieee80211_local *local, 138 struct ieee80211_sub_if_data *sdata, 139 struct ieee80211_key_conf *conf, 140 struct sta_info *sta, u32 iv32, 141 u16 *phase1key) 142 { 143 struct ieee80211_sta *ista = NULL; 144 145 if (sta) 146 ista = &sta->sta; 147 148 if (local->ops->update_tkip_key) 149 local->ops->update_tkip_key(&local->hw, &sdata->vif, conf, 150 ista, iv32, phase1key); 151 trace_drv_update_tkip_key(local, sdata, conf, ista, iv32); 152 } 153 154 static inline int drv_hw_scan(struct ieee80211_local *local, 155 struct ieee80211_sub_if_data *sdata, 156 struct cfg80211_scan_request *req) 157 { 158 int ret; 159 160 might_sleep(); 161 162 ret = local->ops->hw_scan(&local->hw, &sdata->vif, req); 163 trace_drv_hw_scan(local, sdata, req, ret); 164 return ret; 165 } 166 167 static inline void drv_sw_scan_start(struct ieee80211_local *local) 168 { 169 might_sleep(); 170 171 if (local->ops->sw_scan_start) 172 local->ops->sw_scan_start(&local->hw); 173 trace_drv_sw_scan_start(local); 174 } 175 176 static inline void drv_sw_scan_complete(struct ieee80211_local *local) 177 { 178 might_sleep(); 179 180 if (local->ops->sw_scan_complete) 181 local->ops->sw_scan_complete(&local->hw); 182 trace_drv_sw_scan_complete(local); 183 } 184 185 static inline int drv_get_stats(struct ieee80211_local *local, 186 struct ieee80211_low_level_stats *stats) 187 { 188 int ret = -EOPNOTSUPP; 189 190 might_sleep(); 191 192 if (local->ops->get_stats) 193 ret = local->ops->get_stats(&local->hw, stats); 194 trace_drv_get_stats(local, stats, ret); 195 196 return ret; 197 } 198 199 static inline void drv_get_tkip_seq(struct ieee80211_local *local, 200 u8 hw_key_idx, u32 *iv32, u16 *iv16) 201 { 202 if (local->ops->get_tkip_seq) 203 local->ops->get_tkip_seq(&local->hw, hw_key_idx, iv32, iv16); 204 trace_drv_get_tkip_seq(local, hw_key_idx, iv32, iv16); 205 } 206 207 static inline int drv_set_rts_threshold(struct ieee80211_local *local, 208 u32 value) 209 { 210 int ret = 0; 211 212 might_sleep(); 213 214 if (local->ops->set_rts_threshold) 215 ret = local->ops->set_rts_threshold(&local->hw, value); 216 trace_drv_set_rts_threshold(local, value, ret); 217 return ret; 218 } 219 220 static inline int drv_set_coverage_class(struct ieee80211_local *local, 221 u8 value) 222 { 223 int ret = 0; 224 might_sleep(); 225 226 if (local->ops->set_coverage_class) 227 local->ops->set_coverage_class(&local->hw, value); 228 else 229 ret = -EOPNOTSUPP; 230 231 trace_drv_set_coverage_class(local, value, ret); 232 return ret; 233 } 234 235 static inline void drv_sta_notify(struct ieee80211_local *local, 236 struct ieee80211_sub_if_data *sdata, 237 enum sta_notify_cmd cmd, 238 struct ieee80211_sta *sta) 239 { 240 if (local->ops->sta_notify) 241 local->ops->sta_notify(&local->hw, &sdata->vif, cmd, sta); 242 trace_drv_sta_notify(local, sdata, cmd, sta); 243 } 244 245 static inline int drv_sta_add(struct ieee80211_local *local, 246 struct ieee80211_sub_if_data *sdata, 247 struct ieee80211_sta *sta) 248 { 249 int ret = 0; 250 251 might_sleep(); 252 253 if (local->ops->sta_add) 254 ret = local->ops->sta_add(&local->hw, &sdata->vif, sta); 255 else if (local->ops->sta_notify) 256 local->ops->sta_notify(&local->hw, &sdata->vif, 257 STA_NOTIFY_ADD, sta); 258 259 trace_drv_sta_add(local, sdata, sta, ret); 260 261 return ret; 262 } 263 264 static inline void drv_sta_remove(struct ieee80211_local *local, 265 struct ieee80211_sub_if_data *sdata, 266 struct ieee80211_sta *sta) 267 { 268 might_sleep(); 269 270 if (local->ops->sta_remove) 271 local->ops->sta_remove(&local->hw, &sdata->vif, sta); 272 else if (local->ops->sta_notify) 273 local->ops->sta_notify(&local->hw, &sdata->vif, 274 STA_NOTIFY_REMOVE, sta); 275 276 trace_drv_sta_remove(local, sdata, sta); 277 } 278 279 static inline int drv_conf_tx(struct ieee80211_local *local, u16 queue, 280 const struct ieee80211_tx_queue_params *params) 281 { 282 int ret = -EOPNOTSUPP; 283 284 might_sleep(); 285 286 if (local->ops->conf_tx) 287 ret = local->ops->conf_tx(&local->hw, queue, params); 288 trace_drv_conf_tx(local, queue, params, ret); 289 return ret; 290 } 291 292 static inline u64 drv_get_tsf(struct ieee80211_local *local) 293 { 294 u64 ret = -1ULL; 295 296 might_sleep(); 297 298 if (local->ops->get_tsf) 299 ret = local->ops->get_tsf(&local->hw); 300 trace_drv_get_tsf(local, ret); 301 return ret; 302 } 303 304 static inline void drv_set_tsf(struct ieee80211_local *local, u64 tsf) 305 { 306 might_sleep(); 307 308 if (local->ops->set_tsf) 309 local->ops->set_tsf(&local->hw, tsf); 310 trace_drv_set_tsf(local, tsf); 311 } 312 313 static inline void drv_reset_tsf(struct ieee80211_local *local) 314 { 315 might_sleep(); 316 317 if (local->ops->reset_tsf) 318 local->ops->reset_tsf(&local->hw); 319 trace_drv_reset_tsf(local); 320 } 321 322 static inline int drv_tx_last_beacon(struct ieee80211_local *local) 323 { 324 int ret = 1; 325 326 might_sleep(); 327 328 if (local->ops->tx_last_beacon) 329 ret = local->ops->tx_last_beacon(&local->hw); 330 trace_drv_tx_last_beacon(local, ret); 331 return ret; 332 } 333 334 static inline int drv_ampdu_action(struct ieee80211_local *local, 335 struct ieee80211_sub_if_data *sdata, 336 enum ieee80211_ampdu_mlme_action action, 337 struct ieee80211_sta *sta, u16 tid, 338 u16 *ssn) 339 { 340 int ret = -EOPNOTSUPP; 341 if (local->ops->ampdu_action) 342 ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action, 343 sta, tid, ssn); 344 trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, ret); 345 return ret; 346 } 347 348 static inline int drv_get_survey(struct ieee80211_local *local, int idx, 349 struct survey_info *survey) 350 { 351 int ret = -EOPNOTSUPP; 352 if (local->ops->get_survey) 353 ret = local->ops->get_survey(&local->hw, idx, survey); 354 /* trace_drv_get_survey(local, idx, survey, ret); */ 355 return ret; 356 } 357 358 static inline void drv_rfkill_poll(struct ieee80211_local *local) 359 { 360 might_sleep(); 361 362 if (local->ops->rfkill_poll) 363 local->ops->rfkill_poll(&local->hw); 364 } 365 366 static inline void drv_flush(struct ieee80211_local *local, bool drop) 367 { 368 might_sleep(); 369 370 trace_drv_flush(local, drop); 371 if (local->ops->flush) 372 local->ops->flush(&local->hw, drop); 373 } 374 375 static inline void drv_channel_switch(struct ieee80211_local *local, 376 struct ieee80211_channel_switch *ch_switch) 377 { 378 might_sleep(); 379 380 local->ops->channel_switch(&local->hw, ch_switch); 381 382 trace_drv_channel_switch(local, ch_switch); 383 } 384 385 #endif /* __MAC80211_DRIVER_OPS */ 386