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