1 /*- 2 * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr> 3 * Copyright (c) 2015-2016 Andriy Voskoboinyk <avos@FreeBSD.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 * 17 * $OpenBSD: if_urtwnreg.h,v 1.3 2010/11/16 18:02:59 damien Exp $ 18 */ 19 20 #ifndef IF_RTWNVAR_H 21 #define IF_RTWNVAR_H 22 23 #include "opt_rtwn.h" 24 25 #define RTWN_TX_DESC_SIZE 64 26 27 #define RTWN_BCN_MAX_SIZE 512 28 #define RTWN_CAM_ENTRY_LIMIT 64 29 30 #define RTWN_MACID_BC 1 /* Broadcast. */ 31 #define RTWN_MACID_UNDEFINED 0x7fff 32 #define RTWN_MACID_VALID 0x8000 33 #define RTWN_MACID_LIMIT 128 34 35 #define RTWN_TX_TIMEOUT 1000 /* ms */ 36 #define RTWN_MAX_EPOUT 4 37 #define RTWN_PORT_COUNT 2 38 39 #define RTWN_LED_LINK 0 40 #define RTWN_LED_DATA 1 41 42 struct rtwn_rx_radiotap_header { 43 struct ieee80211_radiotap_header wr_ihdr; 44 uint64_t wr_tsft; 45 uint8_t wr_flags; 46 uint8_t wr_rate; 47 uint16_t wr_chan_freq; 48 uint16_t wr_chan_flags; 49 int8_t wr_dbm_antsignal; 50 int8_t wr_dbm_antnoise; 51 } __packed __aligned(8); 52 53 #define RTWN_RX_RADIOTAP_PRESENT \ 54 (1 << IEEE80211_RADIOTAP_TSFT | \ 55 1 << IEEE80211_RADIOTAP_FLAGS | \ 56 1 << IEEE80211_RADIOTAP_RATE | \ 57 1 << IEEE80211_RADIOTAP_CHANNEL | \ 58 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL | \ 59 1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) 60 61 struct rtwn_tx_radiotap_header { 62 struct ieee80211_radiotap_header wt_ihdr; 63 uint8_t wt_flags; 64 uint8_t wt_pad; 65 uint16_t wt_chan_freq; 66 uint16_t wt_chan_flags; 67 } __packed; 68 69 #define RTWN_TX_RADIOTAP_PRESENT \ 70 (1 << IEEE80211_RADIOTAP_FLAGS | \ 71 1 << IEEE80211_RADIOTAP_CHANNEL) 72 73 struct rtwn_tx_buf { 74 uint8_t txd[RTWN_TX_DESC_SIZE]; 75 } __attribute__((aligned(4))); 76 77 #define RTWN_PHY_STATUS_SIZE 32 78 struct rtwn_tx_phystat { 79 uint32_t phydw[RTWN_PHY_STATUS_SIZE / sizeof(uint32_t)]; 80 }; 81 82 struct rtwn_softc; 83 84 union sec_param { 85 struct ieee80211_key key; 86 int macid; 87 }; 88 89 #define CMD_FUNC_PROTO void (*func)(struct rtwn_softc *, \ 90 union sec_param *) 91 92 struct rtwn_cmdq { 93 union sec_param data; 94 CMD_FUNC_PROTO; 95 }; 96 #define RTWN_CMDQ_SIZE 16 97 98 struct rtwn_node { 99 struct ieee80211_node ni; /* must be the first */ 100 int id; 101 102 struct rtwn_tx_phystat last_physt; 103 int avg_pwdb; 104 }; 105 #define RTWN_NODE(ni) ((struct rtwn_node *)(ni)) 106 107 struct rtwn_vap { 108 struct ieee80211vap vap; 109 int id; 110 #define RTWN_VAP_ID_INVALID -1 111 int curr_mode; 112 113 struct rtwn_tx_buf bcn_desc; 114 struct mbuf *bcn_mbuf; 115 struct timeout_task tx_beacon_csa; 116 117 struct callout tsf_sync_adhoc; 118 struct task tsf_sync_adhoc_task; 119 120 const struct ieee80211_key *keys[IEEE80211_WEP_NKID]; 121 122 int (*newstate)(struct ieee80211vap *, 123 enum ieee80211_state, int); 124 void (*recv_mgmt)(struct ieee80211_node *, 125 struct mbuf *, int, 126 const struct ieee80211_rx_stats *, 127 int, int); 128 }; 129 #define RTWN_VAP(vap) ((struct rtwn_vap *)(vap)) 130 131 /* 132 * Rx data types. 133 */ 134 enum { 135 RTWN_RX_DATA, 136 RTWN_RX_TX_REPORT, /* Per-packet */ 137 RTWN_RX_TX_REPORT2, /* Per-MACID summary */ 138 RTWN_RX_OTHER 139 }; 140 141 /* 142 * Firmware reset reasons. 143 */ 144 enum { 145 RTWN_FW_RESET_DOWNLOAD, 146 RTWN_FW_RESET_CHECKSUM, 147 RTWN_FW_RESET_SHUTDOWN 148 }; 149 150 /* 151 * Rate control algorithm selection. 152 */ 153 enum { 154 RTWN_RATECTL_NONE, 155 RTWN_RATECTL_NET80211, 156 RTWN_RATECTL_FW, 157 RTWN_RATECTL_MAX 158 }; 159 160 /* 161 * Control h/w crypto usage. 162 */ 163 enum { 164 RTWN_CRYPTO_SW, 165 RTWN_CRYPTO_PAIR, 166 RTWN_CRYPTO_FULL, 167 RTWN_CRYPTO_MAX, 168 }; 169 170 struct rtwn_softc { 171 struct ieee80211com sc_ic; 172 struct mbufq sc_snd; 173 device_t sc_dev; 174 175 int sc_ht40; 176 int sc_ena_tsf64; 177 uint32_t sc_debug; 178 int sc_hwcrypto; 179 int sc_ratectl_sysctl; 180 int sc_ratectl; 181 182 uint8_t sc_detached; 183 uint8_t sc_flags; 184 /* Device flags */ 185 #define RTWN_FLAG_CCK_HIPWR 0x01 186 #define RTWN_FLAG_EXT_HDR 0x02 187 #define RTWN_FLAG_CAM_FIXED 0x04 188 /* Driver state */ 189 #define RTWN_STARTED 0x08 190 #define RTWN_RUNNING 0x10 191 #define RTWN_FW_LOADED 0x20 192 #define RTWN_TEMP_MEASURED 0x40 193 #define RTWN_RCR_LOCKED 0x80 194 195 #define RTWN_CHIP_HAS_BCNQ1(_sc) \ 196 ((_sc)->bcn_status_reg[0] != (_sc)->bcn_status_reg[1]) 197 198 void *sc_priv; 199 const char *name; 200 int sc_ant; 201 202 struct rtwn_tx_phystat last_physt; 203 uint8_t thcal_temp; 204 int cur_bcnq_id; 205 206 int nvaps; 207 int ap_vaps; 208 int bcn_vaps; 209 int mon_vaps; 210 211 int vaps_running; 212 int monvaps_running; 213 214 uint16_t next_rom_addr; 215 uint8_t keys_bmap[howmany(RTWN_CAM_ENTRY_LIMIT, NBBY)]; 216 217 struct rtwn_vap *vaps[RTWN_PORT_COUNT]; 218 struct ieee80211_node *node_list[RTWN_MACID_LIMIT]; 219 struct mtx nt_mtx; 220 221 struct callout sc_calib_to; 222 struct callout sc_pwrmode_init; 223 #ifndef D4054 224 struct callout sc_watchdog_to; 225 int sc_tx_timer; 226 #endif 227 228 struct mtx sc_mtx; 229 230 struct rtwn_cmdq cmdq[RTWN_CMDQ_SIZE]; 231 struct mtx cmdq_mtx; 232 struct task cmdq_task; 233 uint8_t cmdq_first; 234 uint8_t cmdq_last; 235 236 struct wmeParams cap_wmeParams[WME_NUM_AC]; 237 238 struct rtwn_rx_radiotap_header sc_rxtap; 239 struct rtwn_tx_radiotap_header sc_txtap; 240 241 int ntxchains; 242 int nrxchains; 243 244 int ledlink; 245 uint8_t thermal_meter; 246 247 int sc_tx_n_active; 248 uint8_t qfullmsk; 249 250 /* Firmware-specific */ 251 const char *fwname; 252 uint16_t fwver; 253 uint16_t fwsig; 254 int fwcur; 255 256 void (*sc_node_free)(struct ieee80211_node *); 257 void (*sc_scan_curchan)(struct ieee80211_scan_state *, 258 unsigned long); 259 260 /* Interface-specific. */ 261 int (*sc_write_1)(struct rtwn_softc *, uint16_t, 262 uint8_t); 263 int (*sc_write_2)(struct rtwn_softc *, uint16_t, 264 uint16_t); 265 int (*sc_write_4)(struct rtwn_softc *, uint16_t, 266 uint32_t); 267 uint8_t (*sc_read_1)(struct rtwn_softc *, uint16_t); 268 uint16_t (*sc_read_2)(struct rtwn_softc *, uint16_t); 269 uint32_t (*sc_read_4)(struct rtwn_softc *, uint16_t); 270 /* XXX eliminate */ 271 void (*sc_delay)(struct rtwn_softc *, int); 272 int (*sc_tx_start)(struct rtwn_softc *, 273 struct ieee80211_node *, struct mbuf *, uint8_t *, 274 uint8_t, int); 275 void (*sc_start_xfers)(struct rtwn_softc *); 276 void (*sc_reset_lists)(struct rtwn_softc *, 277 struct ieee80211vap *); 278 void (*sc_abort_xfers)(struct rtwn_softc *); 279 int (*sc_fw_write_block)(struct rtwn_softc *, 280 const uint8_t *, uint16_t, int); 281 uint16_t (*sc_get_qmap)(struct rtwn_softc *); 282 void (*sc_set_desc_addr)(struct rtwn_softc *); 283 void (*sc_drop_incorrect_tx)(struct rtwn_softc *); 284 void (*sc_beacon_update_begin)(struct rtwn_softc *, 285 struct ieee80211vap *); 286 void (*sc_beacon_update_end)(struct rtwn_softc *, 287 struct ieee80211vap *); 288 void (*sc_beacon_unload)(struct rtwn_softc *, int); 289 290 /* XXX drop checks for PCIe? */ 291 int bcn_check_interval; 292 293 /* Device-specific. */ 294 uint32_t (*sc_rf_read)(struct rtwn_softc *, int, uint8_t); 295 void (*sc_rf_write)(struct rtwn_softc *, int, uint8_t, 296 uint32_t); 297 int (*sc_check_condition)(struct rtwn_softc *, 298 const uint8_t[]); 299 void (*sc_efuse_postread)(struct rtwn_softc *); 300 void (*sc_parse_rom)(struct rtwn_softc *, uint8_t *); 301 void (*sc_set_led)(struct rtwn_softc *, int, int); 302 int (*sc_power_on)(struct rtwn_softc *); 303 void (*sc_power_off)(struct rtwn_softc *); 304 #ifndef RTWN_WITHOUT_UCODE 305 void (*sc_fw_reset)(struct rtwn_softc *, int); 306 void (*sc_fw_download_enable)(struct rtwn_softc *, int); 307 #endif 308 int (*sc_llt_init)(struct rtwn_softc *); 309 int (*sc_set_page_size)(struct rtwn_softc *); 310 void (*sc_lc_calib)(struct rtwn_softc *); 311 void (*sc_iq_calib)(struct rtwn_softc *); 312 void (*sc_read_chipid_vendor)(struct rtwn_softc *, 313 uint32_t); 314 void (*sc_adj_devcaps)(struct rtwn_softc *); 315 void (*sc_vap_preattach)(struct rtwn_softc *, 316 struct ieee80211vap *); 317 void (*sc_postattach)(struct rtwn_softc *); 318 void (*sc_detach_private)(struct rtwn_softc *); 319 void (*sc_fill_tx_desc)(struct rtwn_softc *, 320 struct ieee80211_node *, struct mbuf *, 321 void *, uint8_t, int); 322 void (*sc_fill_tx_desc_raw)(struct rtwn_softc *, 323 struct ieee80211_node *, struct mbuf *, 324 void *, const struct ieee80211_bpf_params *); 325 void (*sc_fill_tx_desc_null)(struct rtwn_softc *, 326 void *, int, int, int); 327 void (*sc_dump_tx_desc)(struct rtwn_softc *, const void *); 328 uint8_t (*sc_tx_radiotap_flags)(const void *); 329 uint8_t (*sc_rx_radiotap_flags)(const void *); 330 void (*sc_beacon_init)(struct rtwn_softc *, void *, int); 331 void (*sc_beacon_enable)(struct rtwn_softc *, int, int); 332 void (*sc_sta_beacon_enable)(struct rtwn_softc *, int, 333 bool); 334 void (*sc_beacon_set_rate)(void *, int); 335 void (*sc_beacon_select)(struct rtwn_softc *, int); 336 void (*sc_set_chan)(struct rtwn_softc *, 337 struct ieee80211_channel *); 338 void (*sc_set_media_status)(struct rtwn_softc *, int); 339 #ifndef RTWN_WITHOUT_UCODE 340 int (*sc_set_rsvd_page)(struct rtwn_softc *, int, int, 341 int); 342 int (*sc_set_pwrmode)(struct rtwn_softc *, 343 struct ieee80211vap *, int); 344 void (*sc_set_rssi)(struct rtwn_softc *); 345 #endif 346 void (*sc_get_rx_stats)(struct rtwn_softc *, 347 struct ieee80211_rx_stats *, const void *, 348 const void *); 349 int8_t (*sc_get_rssi_cck)(struct rtwn_softc *, void *); 350 int8_t (*sc_get_rssi_ofdm)(struct rtwn_softc *, void *); 351 int (*sc_classify_intr)(struct rtwn_softc *, void *, int); 352 void (*sc_handle_tx_report)(struct rtwn_softc *, uint8_t *, 353 int); 354 void (*sc_handle_tx_report2)(struct rtwn_softc *, uint8_t *, 355 int); 356 void (*sc_handle_c2h_report)(struct rtwn_softc *, 357 uint8_t *, int); 358 int (*sc_check_frame)(struct rtwn_softc *, struct mbuf *); 359 void (*sc_temp_measure)(struct rtwn_softc *); 360 uint8_t (*sc_temp_read)(struct rtwn_softc *); 361 void (*sc_init_tx_agg)(struct rtwn_softc *); 362 void (*sc_init_rx_agg)(struct rtwn_softc *); 363 void (*sc_init_intr)(struct rtwn_softc *); 364 void (*sc_init_ampdu)(struct rtwn_softc *); 365 void (*sc_init_edca)(struct rtwn_softc *); 366 void (*sc_init_bb)(struct rtwn_softc *); 367 void (*sc_init_rf)(struct rtwn_softc *); 368 void (*sc_init_antsel)(struct rtwn_softc *); 369 void (*sc_post_init)(struct rtwn_softc *); 370 int (*sc_init_bcnq1_boundary)(struct rtwn_softc *); 371 int (*sc_set_tx_power)(struct rtwn_softc *, 372 struct ieee80211vap *); 373 374 const uint8_t *chan_list_5ghz[3]; 375 int chan_num_5ghz[3]; 376 377 const struct rtwn_mac_prog *mac_prog; 378 int mac_size; 379 const struct rtwn_bb_prog *bb_prog; 380 int bb_size; 381 const struct rtwn_agc_prog *agc_prog; 382 int agc_size; 383 const struct rtwn_rf_prog *rf_prog; 384 385 int page_count; 386 int pktbuf_count; 387 388 int ackto; 389 390 int npubqpages; 391 int nhqpages; 392 int nnqpages; 393 int nlqpages; 394 int page_size; 395 396 int txdesc_len; 397 int efuse_maxlen; 398 int efuse_maplen; 399 400 uint16_t rx_dma_size; 401 402 int macid_limit; 403 int cam_entry_limit; 404 int fwsize_limit; 405 int temp_delta; 406 407 uint16_t bcn_status_reg[RTWN_PORT_COUNT]; 408 uint32_t rcr; /* Rx filter */ 409 }; 410 MALLOC_DECLARE(M_RTWN_PRIV); 411 412 #define RTWN_LOCK(sc) mtx_lock(&(sc)->sc_mtx) 413 #define RTWN_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) 414 #define RTWN_ASSERT_LOCKED(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) 415 416 #define RTWN_CMDQ_LOCK_INIT(sc) \ 417 mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF) 418 #define RTWN_CMDQ_LOCK(sc) mtx_lock(&(sc)->cmdq_mtx) 419 #define RTWN_CMDQ_UNLOCK(sc) mtx_unlock(&(sc)->cmdq_mtx) 420 #define RTWN_CMDQ_LOCK_INITIALIZED(sc) mtx_initialized(&(sc)->cmdq_mtx) 421 #define RTWN_CMDQ_LOCK_DESTROY(sc) mtx_destroy(&(sc)->cmdq_mtx) 422 423 #define RTWN_NT_LOCK_INIT(sc) \ 424 mtx_init(&(sc)->nt_mtx, "node table lock", NULL, MTX_DEF) 425 #define RTWN_NT_LOCK(sc) mtx_lock(&(sc)->nt_mtx) 426 #define RTWN_NT_UNLOCK(sc) mtx_unlock(&(sc)->nt_mtx) 427 #define RTWN_NT_LOCK_INITIALIZED(sc) mtx_initialized(&(sc)->nt_mtx) 428 #define RTWN_NT_LOCK_DESTROY(sc) mtx_destroy(&(sc)->nt_mtx) 429 430 void rtwn_sysctlattach(struct rtwn_softc *); 431 432 int rtwn_attach(struct rtwn_softc *); 433 void rtwn_detach(struct rtwn_softc *); 434 void rtwn_resume(struct rtwn_softc *); 435 void rtwn_suspend(struct rtwn_softc *); 436 437 /* Interface-specific. */ 438 #define rtwn_write_1(_sc, _addr, _val) \ 439 (((_sc)->sc_write_1)((_sc), (_addr), (_val))) 440 #define rtwn_write_2(_sc, _addr, _val) \ 441 (((_sc)->sc_write_2)((_sc), (_addr), (_val))) 442 #define rtwn_write_4(_sc, _addr, _val) \ 443 (((_sc)->sc_write_4)((_sc), (_addr), (_val))) 444 #define rtwn_read_1(_sc, _addr) \ 445 (((_sc)->sc_read_1)((_sc), (_addr))) 446 #define rtwn_read_2(_sc, _addr) \ 447 (((_sc)->sc_read_2)((_sc), (_addr))) 448 #define rtwn_read_4(_sc, _addr) \ 449 (((_sc)->sc_read_4)((_sc), (_addr))) 450 #define rtwn_delay(_sc, _usec) \ 451 (((_sc)->sc_delay)((_sc), (_usec))) 452 #define rtwn_tx_start(_sc, _ni, _m, _desc, _type, _id) \ 453 (((_sc)->sc_tx_start)((_sc), (_ni), (_m), (_desc), (_type), (_id))) 454 #define rtwn_start_xfers(_sc) \ 455 (((_sc)->sc_start_xfers)((_sc))) 456 #define rtwn_reset_lists(_sc, _vap) \ 457 (((_sc)->sc_reset_lists)((_sc), (_vap))) 458 #define rtwn_abort_xfers(_sc) \ 459 (((_sc)->sc_abort_xfers)((_sc))) 460 #define rtwn_fw_write_block(_sc, _buf, _reg, _len) \ 461 (((_sc)->sc_fw_write_block)((_sc), (_buf), (_reg), (_len))) 462 #define rtwn_get_qmap(_sc) \ 463 (((_sc)->sc_get_qmap)((_sc))) 464 #define rtwn_set_desc_addr(_sc) \ 465 (((_sc)->sc_set_desc_addr)((_sc))) 466 #define rtwn_drop_incorrect_tx(_sc) \ 467 (((_sc)->sc_drop_incorrect_tx)((_sc))) 468 #define rtwn_beacon_update_begin(_sc, _vap) \ 469 (((_sc)->sc_beacon_update_begin)((_sc), (_vap))) 470 #define rtwn_beacon_update_end(_sc, _vap) \ 471 (((_sc)->sc_beacon_update_end)((_sc), (_vap))) 472 #define rtwn_beacon_unload(_sc, _id) \ 473 (((_sc)->sc_beacon_unload)((_sc), (_id))) 474 475 /* Aliases. */ 476 #define rtwn_bb_write rtwn_write_4 477 #define rtwn_bb_read rtwn_read_4 478 #define rtwn_bb_setbits rtwn_setbits_4 479 480 /* Device-specific. */ 481 #define rtwn_rf_read(_sc, _chain, _addr) \ 482 (((_sc)->sc_rf_read)((_sc), (_chain), (_addr))) 483 #define rtwn_rf_write(_sc, _chain, _addr, _val) \ 484 (((_sc)->sc_rf_write)((_sc), (_chain), (_addr), (_val))) 485 #define rtwn_check_condition(_sc, _cond) \ 486 (((_sc)->sc_check_condition)((_sc), (_cond))) 487 #define rtwn_efuse_postread(_sc) \ 488 (((_sc)->sc_efuse_postread)((_sc))) 489 #define rtwn_parse_rom(_sc, _rom) \ 490 (((_sc)->sc_parse_rom)((_sc), (_rom))) 491 #define rtwn_set_led(_sc, _led, _on) \ 492 (((_sc)->sc_set_led)((_sc), (_led), (_on))) 493 #define rtwn_get_rx_stats(_sc, _rxs, _desc, _physt) \ 494 (((_sc)->sc_get_rx_stats((_sc), (_rxs), (_desc), (_physt)))) 495 #define rtwn_get_rssi_cck(_sc, _physt) \ 496 (((_sc)->sc_get_rssi_cck)((_sc), (_physt))) 497 #define rtwn_get_rssi_ofdm(_sc, _physt) \ 498 (((_sc)->sc_get_rssi_ofdm)((_sc), (_physt))) 499 #define rtwn_power_on(_sc) \ 500 (((_sc)->sc_power_on)((_sc))) 501 #define rtwn_power_off(_sc) \ 502 (((_sc)->sc_power_off)((_sc))) 503 #ifndef RTWN_WITHOUT_UCODE 504 #define rtwn_fw_reset(_sc, _reason) \ 505 (((_sc)->sc_fw_reset)((_sc), (_reason))) 506 #define rtwn_fw_download_enable(_sc, _enable) \ 507 (((_sc)->sc_fw_download_enable)((_sc), (_enable))) 508 #endif 509 #define rtwn_llt_init(_sc) \ 510 (((_sc)->sc_llt_init)((_sc))) 511 #define rtwn_set_page_size(_sc) \ 512 (((_sc)->sc_set_page_size)((_sc))) 513 #define rtwn_lc_calib(_sc) \ 514 (((_sc)->sc_lc_calib)((_sc))) 515 #define rtwn_iq_calib(_sc) \ 516 (((_sc)->sc_iq_calib)((_sc))) 517 #define rtwn_read_chipid_vendor(_sc, _reg) \ 518 (((_sc)->sc_read_chipid_vendor)((_sc), (_reg))) 519 #define rtwn_adj_devcaps(_sc) \ 520 (((_sc)->sc_adj_devcaps)((_sc))) 521 #define rtwn_vap_preattach(_sc, _vap) \ 522 (((_sc)->sc_vap_preattach)((_sc), (_vap))) 523 #define rtwn_postattach(_sc) \ 524 (((_sc)->sc_postattach)((_sc))) 525 #define rtwn_detach_private(_sc) \ 526 (((_sc)->sc_detach_private)((_sc))) 527 #define rtwn_fill_tx_desc(_sc, _ni, _m, \ 528 _buf, _ridx, _maxretry) \ 529 (((_sc)->sc_fill_tx_desc)((_sc), (_ni), \ 530 (_m), (_buf), (_ridx), (_maxretry))) 531 #define rtwn_fill_tx_desc_raw(_sc, _ni, _m, \ 532 _buf, _params) \ 533 (((_sc)->sc_fill_tx_desc_raw)((_sc), (_ni), \ 534 (_m), (_buf), (_params))) 535 #define rtwn_fill_tx_desc_null(_sc, _buf, _11b, _qos, _id) \ 536 (((_sc)->sc_fill_tx_desc_null)((_sc), \ 537 (_buf), (_11b), (_qos), (_id))) 538 #define rtwn_dump_tx_desc(_sc, _desc) \ 539 (((_sc)->sc_dump_tx_desc)((_sc), (_desc))) 540 #define rtwn_tx_radiotap_flags(_sc, _buf) \ 541 (((_sc)->sc_tx_radiotap_flags)((_buf))) 542 #define rtwn_rx_radiotap_flags(_sc, _buf) \ 543 (((_sc)->sc_rx_radiotap_flags)((_buf))) 544 #define rtwn_set_chan(_sc, _c) \ 545 (((_sc)->sc_set_chan)((_sc), (_c))) 546 #ifndef RTWN_WITHOUT_UCODE 547 #define rtwn_set_rsvd_page(_sc, _resp, _null, _qos_null) \ 548 (((_sc)->sc_set_rsvd_page)((_sc), \ 549 (_resp), (_null), (_qos_null))) 550 #define rtwn_set_pwrmode(_sc, _vap, _off) \ 551 (((_sc)->sc_set_pwrmode)((_sc), (_vap), (_off))) 552 #define rtwn_set_rssi(_sc) \ 553 (((_sc)->sc_set_rssi)((_sc))) 554 #endif 555 #define rtwn_classify_intr(_sc, _buf, _len) \ 556 (((_sc)->sc_classify_intr)((_sc), (_buf), (_len))) 557 #define rtwn_handle_tx_report(_sc, _buf, _len) \ 558 (((_sc)->sc_handle_tx_report)((_sc), (_buf), (_len))) 559 #define rtwn_handle_tx_report2(_sc, _buf, _len) \ 560 (((_sc)->sc_handle_tx_report2)((_sc), (_buf), (_len))) 561 #define rtwn_handle_c2h_report(_sc, _buf, _len) \ 562 (((_sc)->sc_handle_c2h_report)((_sc), (_buf), (_len))) 563 #define rtwn_check_frame(_sc, _m) \ 564 (((_sc)->sc_check_frame)((_sc), (_m))) 565 #define rtwn_beacon_init(_sc, _buf, _id) \ 566 (((_sc)->sc_beacon_init)((_sc), (_buf), (_id))) 567 #define rtwn_beacon_enable(_sc, _id, _enable) \ 568 (((_sc)->sc_beacon_enable)((_sc), (_id), (_enable))) 569 #define rtwn_sta_beacon_enable(_sc, _id, _enable) \ 570 (((_sc)->sc_sta_beacon_enable)((_sc), (_id), (_enable))) 571 #define rtwn_beacon_set_rate(_sc, _buf, _is5ghz) \ 572 (((_sc)->sc_beacon_set_rate)((_buf), (_is5ghz))) 573 #define rtwn_beacon_select(_sc, _id) \ 574 (((_sc)->sc_beacon_select)((_sc), (_id))) 575 #define rtwn_temp_measure(_sc) \ 576 (((_sc)->sc_temp_measure)((_sc))) 577 #define rtwn_temp_read(_sc) \ 578 (((_sc)->sc_temp_read)((_sc))) 579 #define rtwn_init_tx_agg(_sc) \ 580 (((_sc)->sc_init_tx_agg)((_sc))) 581 #define rtwn_init_rx_agg(_sc) \ 582 (((_sc)->sc_init_rx_agg)((_sc))) 583 #define rtwn_init_intr(_sc) \ 584 (((_sc)->sc_init_intr)((_sc))) 585 #define rtwn_init_ampdu(_sc) \ 586 (((_sc)->sc_init_ampdu)((_sc))) 587 #define rtwn_init_edca(_sc) \ 588 (((_sc)->sc_init_edca)((_sc))) 589 #define rtwn_init_bb(_sc) \ 590 (((_sc)->sc_init_bb)((_sc))) 591 #define rtwn_init_rf(_sc) \ 592 (((_sc)->sc_init_rf)((_sc))) 593 #define rtwn_init_antsel(_sc) \ 594 (((_sc)->sc_init_antsel)((_sc))) 595 #define rtwn_post_init(_sc) \ 596 (((_sc)->sc_post_init)((_sc))) 597 #define rtwn_init_bcnq1_boundary(_sc) \ 598 (((_sc)->sc_init_bcnq1_boundary)((_sc))) 599 #define rtwn_set_tx_power(_sc, _vap) \ 600 (((_sc)->sc_set_tx_power)((_sc), (_vap))) 601 602 /* 603 * Methods to access subfields in registers. 604 */ 605 static __inline int 606 rtwn_setbits_1(struct rtwn_softc *sc, uint16_t addr, uint8_t clr, 607 uint8_t set) 608 { 609 return (rtwn_write_1(sc, addr, 610 (rtwn_read_1(sc, addr) & ~clr) | set)); 611 } 612 613 static __inline int 614 rtwn_setbits_1_shift(struct rtwn_softc *sc, uint16_t addr, uint32_t clr, 615 uint32_t set, int shift) 616 { 617 return (rtwn_setbits_1(sc, addr + shift, clr >> shift * NBBY, 618 set >> shift * NBBY)); 619 } 620 621 static __inline int 622 rtwn_setbits_2(struct rtwn_softc *sc, uint16_t addr, uint16_t clr, 623 uint16_t set) 624 { 625 return (rtwn_write_2(sc, addr, 626 (rtwn_read_2(sc, addr) & ~clr) | set)); 627 } 628 629 static __inline int 630 rtwn_setbits_4(struct rtwn_softc *sc, uint16_t addr, uint32_t clr, 631 uint32_t set) 632 { 633 return (rtwn_write_4(sc, addr, 634 (rtwn_read_4(sc, addr) & ~clr) | set)); 635 } 636 637 static __inline void 638 rtwn_rf_setbits(struct rtwn_softc *sc, int chain, uint8_t addr, 639 uint32_t clr, uint32_t set) 640 { 641 rtwn_rf_write(sc, chain, addr, 642 (rtwn_rf_read(sc, chain, addr) & ~clr) | set); 643 } 644 645 #endif /* IF_RTWNVAR_H */ 646