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 void drv_tx(struct ieee80211_local *local, struct sk_buff *skb) 9 { 10 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 trace_drv_start(local); 20 local->started = true; 21 smp_mb(); 22 ret = local->ops->start(&local->hw); 23 trace_drv_return_int(local, ret); 24 return ret; 25 } 26 27 static inline void drv_stop(struct ieee80211_local *local) 28 { 29 might_sleep(); 30 31 trace_drv_stop(local); 32 local->ops->stop(&local->hw); 33 trace_drv_return_void(local); 34 35 /* sync away all work on the tasklet before clearing started */ 36 tasklet_disable(&local->tasklet); 37 tasklet_enable(&local->tasklet); 38 39 barrier(); 40 41 local->started = false; 42 } 43 44 #ifdef CONFIG_PM 45 static inline int drv_suspend(struct ieee80211_local *local, 46 struct cfg80211_wowlan *wowlan) 47 { 48 int ret; 49 50 might_sleep(); 51 52 trace_drv_suspend(local); 53 ret = local->ops->suspend(&local->hw, wowlan); 54 trace_drv_return_int(local, ret); 55 return ret; 56 } 57 58 static inline int drv_resume(struct ieee80211_local *local) 59 { 60 int ret; 61 62 might_sleep(); 63 64 trace_drv_resume(local); 65 ret = local->ops->resume(&local->hw); 66 trace_drv_return_int(local, ret); 67 return ret; 68 } 69 #endif 70 71 static inline int drv_add_interface(struct ieee80211_local *local, 72 struct ieee80211_vif *vif) 73 { 74 int ret; 75 76 might_sleep(); 77 78 trace_drv_add_interface(local, vif_to_sdata(vif)); 79 ret = local->ops->add_interface(&local->hw, vif); 80 trace_drv_return_int(local, ret); 81 return ret; 82 } 83 84 static inline int drv_change_interface(struct ieee80211_local *local, 85 struct ieee80211_sub_if_data *sdata, 86 enum nl80211_iftype type, bool p2p) 87 { 88 int ret; 89 90 might_sleep(); 91 92 trace_drv_change_interface(local, sdata, type, p2p); 93 ret = local->ops->change_interface(&local->hw, &sdata->vif, type, p2p); 94 trace_drv_return_int(local, ret); 95 return ret; 96 } 97 98 static inline void drv_remove_interface(struct ieee80211_local *local, 99 struct ieee80211_vif *vif) 100 { 101 might_sleep(); 102 103 trace_drv_remove_interface(local, vif_to_sdata(vif)); 104 local->ops->remove_interface(&local->hw, vif); 105 trace_drv_return_void(local); 106 } 107 108 static inline int drv_config(struct ieee80211_local *local, u32 changed) 109 { 110 int ret; 111 112 might_sleep(); 113 114 trace_drv_config(local, changed); 115 ret = local->ops->config(&local->hw, changed); 116 trace_drv_return_int(local, ret); 117 return ret; 118 } 119 120 static inline void drv_bss_info_changed(struct ieee80211_local *local, 121 struct ieee80211_sub_if_data *sdata, 122 struct ieee80211_bss_conf *info, 123 u32 changed) 124 { 125 might_sleep(); 126 127 trace_drv_bss_info_changed(local, sdata, info, changed); 128 if (local->ops->bss_info_changed) 129 local->ops->bss_info_changed(&local->hw, &sdata->vif, info, changed); 130 trace_drv_return_void(local); 131 } 132 133 static inline int drv_tx_sync(struct ieee80211_local *local, 134 struct ieee80211_sub_if_data *sdata, 135 const u8 *bssid, 136 enum ieee80211_tx_sync_type type) 137 { 138 int ret = 0; 139 140 might_sleep(); 141 142 trace_drv_tx_sync(local, sdata, bssid, type); 143 if (local->ops->tx_sync) 144 ret = local->ops->tx_sync(&local->hw, &sdata->vif, 145 bssid, type); 146 trace_drv_return_int(local, ret); 147 return ret; 148 } 149 150 static inline void drv_finish_tx_sync(struct ieee80211_local *local, 151 struct ieee80211_sub_if_data *sdata, 152 const u8 *bssid, 153 enum ieee80211_tx_sync_type type) 154 { 155 might_sleep(); 156 157 trace_drv_finish_tx_sync(local, sdata, bssid, type); 158 if (local->ops->finish_tx_sync) 159 local->ops->finish_tx_sync(&local->hw, &sdata->vif, 160 bssid, type); 161 trace_drv_return_void(local); 162 } 163 164 static inline u64 drv_prepare_multicast(struct ieee80211_local *local, 165 struct netdev_hw_addr_list *mc_list) 166 { 167 u64 ret = 0; 168 169 trace_drv_prepare_multicast(local, mc_list->count); 170 171 if (local->ops->prepare_multicast) 172 ret = local->ops->prepare_multicast(&local->hw, mc_list); 173 174 trace_drv_return_u64(local, ret); 175 176 return ret; 177 } 178 179 static inline void drv_configure_filter(struct ieee80211_local *local, 180 unsigned int changed_flags, 181 unsigned int *total_flags, 182 u64 multicast) 183 { 184 might_sleep(); 185 186 trace_drv_configure_filter(local, changed_flags, total_flags, 187 multicast); 188 local->ops->configure_filter(&local->hw, changed_flags, total_flags, 189 multicast); 190 trace_drv_return_void(local); 191 } 192 193 static inline int drv_set_tim(struct ieee80211_local *local, 194 struct ieee80211_sta *sta, bool set) 195 { 196 int ret = 0; 197 trace_drv_set_tim(local, sta, set); 198 if (local->ops->set_tim) 199 ret = local->ops->set_tim(&local->hw, sta, set); 200 trace_drv_return_int(local, ret); 201 return ret; 202 } 203 204 static inline int drv_set_key(struct ieee80211_local *local, 205 enum set_key_cmd cmd, 206 struct ieee80211_sub_if_data *sdata, 207 struct ieee80211_sta *sta, 208 struct ieee80211_key_conf *key) 209 { 210 int ret; 211 212 might_sleep(); 213 214 trace_drv_set_key(local, cmd, sdata, sta, key); 215 ret = local->ops->set_key(&local->hw, cmd, &sdata->vif, sta, key); 216 trace_drv_return_int(local, ret); 217 return ret; 218 } 219 220 static inline void drv_update_tkip_key(struct ieee80211_local *local, 221 struct ieee80211_sub_if_data *sdata, 222 struct ieee80211_key_conf *conf, 223 struct sta_info *sta, u32 iv32, 224 u16 *phase1key) 225 { 226 struct ieee80211_sta *ista = NULL; 227 228 if (sta) 229 ista = &sta->sta; 230 231 trace_drv_update_tkip_key(local, sdata, conf, ista, iv32); 232 if (local->ops->update_tkip_key) 233 local->ops->update_tkip_key(&local->hw, &sdata->vif, conf, 234 ista, iv32, phase1key); 235 trace_drv_return_void(local); 236 } 237 238 static inline int drv_hw_scan(struct ieee80211_local *local, 239 struct ieee80211_sub_if_data *sdata, 240 struct cfg80211_scan_request *req) 241 { 242 int ret; 243 244 might_sleep(); 245 246 trace_drv_hw_scan(local, sdata); 247 ret = local->ops->hw_scan(&local->hw, &sdata->vif, req); 248 trace_drv_return_int(local, ret); 249 return ret; 250 } 251 252 static inline void drv_cancel_hw_scan(struct ieee80211_local *local, 253 struct ieee80211_sub_if_data *sdata) 254 { 255 might_sleep(); 256 257 trace_drv_cancel_hw_scan(local, sdata); 258 local->ops->cancel_hw_scan(&local->hw, &sdata->vif); 259 trace_drv_return_void(local); 260 } 261 262 static inline int 263 drv_sched_scan_start(struct ieee80211_local *local, 264 struct ieee80211_sub_if_data *sdata, 265 struct cfg80211_sched_scan_request *req, 266 struct ieee80211_sched_scan_ies *ies) 267 { 268 int ret; 269 270 might_sleep(); 271 272 trace_drv_sched_scan_start(local, sdata); 273 ret = local->ops->sched_scan_start(&local->hw, &sdata->vif, 274 req, ies); 275 trace_drv_return_int(local, ret); 276 return ret; 277 } 278 279 static inline void drv_sched_scan_stop(struct ieee80211_local *local, 280 struct ieee80211_sub_if_data *sdata) 281 { 282 might_sleep(); 283 284 trace_drv_sched_scan_stop(local, sdata); 285 local->ops->sched_scan_stop(&local->hw, &sdata->vif); 286 trace_drv_return_void(local); 287 } 288 289 static inline void drv_sw_scan_start(struct ieee80211_local *local) 290 { 291 might_sleep(); 292 293 trace_drv_sw_scan_start(local); 294 if (local->ops->sw_scan_start) 295 local->ops->sw_scan_start(&local->hw); 296 trace_drv_return_void(local); 297 } 298 299 static inline void drv_sw_scan_complete(struct ieee80211_local *local) 300 { 301 might_sleep(); 302 303 trace_drv_sw_scan_complete(local); 304 if (local->ops->sw_scan_complete) 305 local->ops->sw_scan_complete(&local->hw); 306 trace_drv_return_void(local); 307 } 308 309 static inline int drv_get_stats(struct ieee80211_local *local, 310 struct ieee80211_low_level_stats *stats) 311 { 312 int ret = -EOPNOTSUPP; 313 314 might_sleep(); 315 316 if (local->ops->get_stats) 317 ret = local->ops->get_stats(&local->hw, stats); 318 trace_drv_get_stats(local, stats, ret); 319 320 return ret; 321 } 322 323 static inline void drv_get_tkip_seq(struct ieee80211_local *local, 324 u8 hw_key_idx, u32 *iv32, u16 *iv16) 325 { 326 if (local->ops->get_tkip_seq) 327 local->ops->get_tkip_seq(&local->hw, hw_key_idx, iv32, iv16); 328 trace_drv_get_tkip_seq(local, hw_key_idx, iv32, iv16); 329 } 330 331 static inline int drv_set_frag_threshold(struct ieee80211_local *local, 332 u32 value) 333 { 334 int ret = 0; 335 336 might_sleep(); 337 338 trace_drv_set_frag_threshold(local, value); 339 if (local->ops->set_frag_threshold) 340 ret = local->ops->set_frag_threshold(&local->hw, value); 341 trace_drv_return_int(local, ret); 342 return ret; 343 } 344 345 static inline int drv_set_rts_threshold(struct ieee80211_local *local, 346 u32 value) 347 { 348 int ret = 0; 349 350 might_sleep(); 351 352 trace_drv_set_rts_threshold(local, value); 353 if (local->ops->set_rts_threshold) 354 ret = local->ops->set_rts_threshold(&local->hw, value); 355 trace_drv_return_int(local, ret); 356 return ret; 357 } 358 359 static inline int drv_set_coverage_class(struct ieee80211_local *local, 360 u8 value) 361 { 362 int ret = 0; 363 might_sleep(); 364 365 trace_drv_set_coverage_class(local, value); 366 if (local->ops->set_coverage_class) 367 local->ops->set_coverage_class(&local->hw, value); 368 else 369 ret = -EOPNOTSUPP; 370 371 trace_drv_return_int(local, ret); 372 return ret; 373 } 374 375 static inline void drv_sta_notify(struct ieee80211_local *local, 376 struct ieee80211_sub_if_data *sdata, 377 enum sta_notify_cmd cmd, 378 struct ieee80211_sta *sta) 379 { 380 trace_drv_sta_notify(local, sdata, cmd, sta); 381 if (local->ops->sta_notify) 382 local->ops->sta_notify(&local->hw, &sdata->vif, cmd, sta); 383 trace_drv_return_void(local); 384 } 385 386 static inline int drv_sta_add(struct ieee80211_local *local, 387 struct ieee80211_sub_if_data *sdata, 388 struct ieee80211_sta *sta) 389 { 390 int ret = 0; 391 392 might_sleep(); 393 394 trace_drv_sta_add(local, sdata, sta); 395 if (local->ops->sta_add) 396 ret = local->ops->sta_add(&local->hw, &sdata->vif, sta); 397 398 trace_drv_return_int(local, ret); 399 400 return ret; 401 } 402 403 static inline void drv_sta_remove(struct ieee80211_local *local, 404 struct ieee80211_sub_if_data *sdata, 405 struct ieee80211_sta *sta) 406 { 407 might_sleep(); 408 409 trace_drv_sta_remove(local, sdata, sta); 410 if (local->ops->sta_remove) 411 local->ops->sta_remove(&local->hw, &sdata->vif, sta); 412 413 trace_drv_return_void(local); 414 } 415 416 static inline int drv_conf_tx(struct ieee80211_local *local, u16 queue, 417 const struct ieee80211_tx_queue_params *params) 418 { 419 int ret = -EOPNOTSUPP; 420 421 might_sleep(); 422 423 trace_drv_conf_tx(local, queue, params); 424 if (local->ops->conf_tx) 425 ret = local->ops->conf_tx(&local->hw, queue, params); 426 trace_drv_return_int(local, ret); 427 return ret; 428 } 429 430 static inline u64 drv_get_tsf(struct ieee80211_local *local) 431 { 432 u64 ret = -1ULL; 433 434 might_sleep(); 435 436 trace_drv_get_tsf(local); 437 if (local->ops->get_tsf) 438 ret = local->ops->get_tsf(&local->hw); 439 trace_drv_return_u64(local, ret); 440 return ret; 441 } 442 443 static inline void drv_set_tsf(struct ieee80211_local *local, u64 tsf) 444 { 445 might_sleep(); 446 447 trace_drv_set_tsf(local, tsf); 448 if (local->ops->set_tsf) 449 local->ops->set_tsf(&local->hw, tsf); 450 trace_drv_return_void(local); 451 } 452 453 static inline void drv_reset_tsf(struct ieee80211_local *local) 454 { 455 might_sleep(); 456 457 trace_drv_reset_tsf(local); 458 if (local->ops->reset_tsf) 459 local->ops->reset_tsf(&local->hw); 460 trace_drv_return_void(local); 461 } 462 463 static inline int drv_tx_last_beacon(struct ieee80211_local *local) 464 { 465 int ret = 0; /* default unsuported op for less congestion */ 466 467 might_sleep(); 468 469 trace_drv_tx_last_beacon(local); 470 if (local->ops->tx_last_beacon) 471 ret = local->ops->tx_last_beacon(&local->hw); 472 trace_drv_return_int(local, ret); 473 return ret; 474 } 475 476 static inline int drv_ampdu_action(struct ieee80211_local *local, 477 struct ieee80211_sub_if_data *sdata, 478 enum ieee80211_ampdu_mlme_action action, 479 struct ieee80211_sta *sta, u16 tid, 480 u16 *ssn, u8 buf_size) 481 { 482 int ret = -EOPNOTSUPP; 483 484 might_sleep(); 485 486 trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, buf_size); 487 488 if (local->ops->ampdu_action) 489 ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action, 490 sta, tid, ssn, buf_size); 491 492 trace_drv_return_int(local, ret); 493 494 return ret; 495 } 496 497 static inline int drv_get_survey(struct ieee80211_local *local, int idx, 498 struct survey_info *survey) 499 { 500 int ret = -EOPNOTSUPP; 501 502 trace_drv_get_survey(local, idx, survey); 503 504 if (local->ops->get_survey) 505 ret = local->ops->get_survey(&local->hw, idx, survey); 506 507 trace_drv_return_int(local, ret); 508 509 return ret; 510 } 511 512 static inline void drv_rfkill_poll(struct ieee80211_local *local) 513 { 514 might_sleep(); 515 516 if (local->ops->rfkill_poll) 517 local->ops->rfkill_poll(&local->hw); 518 } 519 520 static inline void drv_flush(struct ieee80211_local *local, bool drop) 521 { 522 might_sleep(); 523 524 trace_drv_flush(local, drop); 525 if (local->ops->flush) 526 local->ops->flush(&local->hw, drop); 527 trace_drv_return_void(local); 528 } 529 530 static inline void drv_channel_switch(struct ieee80211_local *local, 531 struct ieee80211_channel_switch *ch_switch) 532 { 533 might_sleep(); 534 535 trace_drv_channel_switch(local, ch_switch); 536 local->ops->channel_switch(&local->hw, ch_switch); 537 trace_drv_return_void(local); 538 } 539 540 541 static inline int drv_set_antenna(struct ieee80211_local *local, 542 u32 tx_ant, u32 rx_ant) 543 { 544 int ret = -EOPNOTSUPP; 545 might_sleep(); 546 if (local->ops->set_antenna) 547 ret = local->ops->set_antenna(&local->hw, tx_ant, rx_ant); 548 trace_drv_set_antenna(local, tx_ant, rx_ant, ret); 549 return ret; 550 } 551 552 static inline int drv_get_antenna(struct ieee80211_local *local, 553 u32 *tx_ant, u32 *rx_ant) 554 { 555 int ret = -EOPNOTSUPP; 556 might_sleep(); 557 if (local->ops->get_antenna) 558 ret = local->ops->get_antenna(&local->hw, tx_ant, rx_ant); 559 trace_drv_get_antenna(local, *tx_ant, *rx_ant, ret); 560 return ret; 561 } 562 563 static inline int drv_remain_on_channel(struct ieee80211_local *local, 564 struct ieee80211_channel *chan, 565 enum nl80211_channel_type chantype, 566 unsigned int duration) 567 { 568 int ret; 569 570 might_sleep(); 571 572 trace_drv_remain_on_channel(local, chan, chantype, duration); 573 ret = local->ops->remain_on_channel(&local->hw, chan, chantype, 574 duration); 575 trace_drv_return_int(local, ret); 576 577 return ret; 578 } 579 580 static inline int drv_cancel_remain_on_channel(struct ieee80211_local *local) 581 { 582 int ret; 583 584 might_sleep(); 585 586 trace_drv_cancel_remain_on_channel(local); 587 ret = local->ops->cancel_remain_on_channel(&local->hw); 588 trace_drv_return_int(local, ret); 589 590 return ret; 591 } 592 593 static inline int drv_offchannel_tx(struct ieee80211_local *local, 594 struct sk_buff *skb, 595 struct ieee80211_channel *chan, 596 enum nl80211_channel_type channel_type, 597 unsigned int wait) 598 { 599 int ret; 600 601 might_sleep(); 602 603 trace_drv_offchannel_tx(local, skb, chan, channel_type, wait); 604 ret = local->ops->offchannel_tx(&local->hw, skb, chan, 605 channel_type, wait); 606 trace_drv_return_int(local, ret); 607 608 return ret; 609 } 610 611 static inline int drv_offchannel_tx_cancel_wait(struct ieee80211_local *local) 612 { 613 int ret; 614 615 might_sleep(); 616 617 trace_drv_offchannel_tx_cancel_wait(local); 618 ret = local->ops->offchannel_tx_cancel_wait(&local->hw); 619 trace_drv_return_int(local, ret); 620 621 return ret; 622 } 623 624 static inline int drv_set_ringparam(struct ieee80211_local *local, 625 u32 tx, u32 rx) 626 { 627 int ret = -ENOTSUPP; 628 629 might_sleep(); 630 631 trace_drv_set_ringparam(local, tx, rx); 632 if (local->ops->set_ringparam) 633 ret = local->ops->set_ringparam(&local->hw, tx, rx); 634 trace_drv_return_int(local, ret); 635 636 return ret; 637 } 638 639 static inline void drv_get_ringparam(struct ieee80211_local *local, 640 u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max) 641 { 642 might_sleep(); 643 644 trace_drv_get_ringparam(local, tx, tx_max, rx, rx_max); 645 if (local->ops->get_ringparam) 646 local->ops->get_ringparam(&local->hw, tx, tx_max, rx, rx_max); 647 trace_drv_return_void(local); 648 } 649 650 static inline bool drv_tx_frames_pending(struct ieee80211_local *local) 651 { 652 bool ret = false; 653 654 might_sleep(); 655 656 trace_drv_tx_frames_pending(local); 657 if (local->ops->tx_frames_pending) 658 ret = local->ops->tx_frames_pending(&local->hw); 659 trace_drv_return_bool(local, ret); 660 661 return ret; 662 } 663 664 static inline int drv_set_bitrate_mask(struct ieee80211_local *local, 665 struct ieee80211_sub_if_data *sdata, 666 const struct cfg80211_bitrate_mask *mask) 667 { 668 int ret = -EOPNOTSUPP; 669 670 might_sleep(); 671 672 trace_drv_set_bitrate_mask(local, sdata, mask); 673 if (local->ops->set_bitrate_mask) 674 ret = local->ops->set_bitrate_mask(&local->hw, 675 &sdata->vif, mask); 676 trace_drv_return_int(local, ret); 677 678 return ret; 679 } 680 681 static inline void drv_set_rekey_data(struct ieee80211_local *local, 682 struct ieee80211_sub_if_data *sdata, 683 struct cfg80211_gtk_rekey_data *data) 684 { 685 trace_drv_set_rekey_data(local, sdata, data); 686 if (local->ops->set_rekey_data) 687 local->ops->set_rekey_data(&local->hw, &sdata->vif, data); 688 trace_drv_return_void(local); 689 } 690 691 static inline void drv_rssi_callback(struct ieee80211_local *local, 692 const enum ieee80211_rssi_event event) 693 { 694 trace_drv_rssi_callback(local, event); 695 if (local->ops->rssi_callback) 696 local->ops->rssi_callback(&local->hw, event); 697 trace_drv_return_void(local); 698 } 699 #endif /* __MAC80211_DRIVER_OPS */ 700