17453645fSAndriy Voskoboinyk /*- 27453645fSAndriy Voskoboinyk * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr> 37453645fSAndriy Voskoboinyk * Copyright (c) 2015-2016 Andriy Voskoboinyk <avos@FreeBSD.org> 47453645fSAndriy Voskoboinyk * 57453645fSAndriy Voskoboinyk * Permission to use, copy, modify, and distribute this software for any 67453645fSAndriy Voskoboinyk * purpose with or without fee is hereby granted, provided that the above 77453645fSAndriy Voskoboinyk * copyright notice and this permission notice appear in all copies. 87453645fSAndriy Voskoboinyk * 97453645fSAndriy Voskoboinyk * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 107453645fSAndriy Voskoboinyk * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 117453645fSAndriy Voskoboinyk * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 127453645fSAndriy Voskoboinyk * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 137453645fSAndriy Voskoboinyk * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 147453645fSAndriy Voskoboinyk * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 157453645fSAndriy Voskoboinyk * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 167453645fSAndriy Voskoboinyk * 177453645fSAndriy Voskoboinyk * $OpenBSD: if_urtwnreg.h,v 1.3 2010/11/16 18:02:59 damien Exp $ 187453645fSAndriy Voskoboinyk */ 197453645fSAndriy Voskoboinyk 207453645fSAndriy Voskoboinyk #ifndef IF_RTWNVAR_H 217453645fSAndriy Voskoboinyk #define IF_RTWNVAR_H 227453645fSAndriy Voskoboinyk 237453645fSAndriy Voskoboinyk #include "opt_rtwn.h" 247453645fSAndriy Voskoboinyk 257453645fSAndriy Voskoboinyk #define RTWN_TX_DESC_SIZE 64 267453645fSAndriy Voskoboinyk 277453645fSAndriy Voskoboinyk #define RTWN_BCN_MAX_SIZE 512 287453645fSAndriy Voskoboinyk #define RTWN_CAM_ENTRY_LIMIT 64 297453645fSAndriy Voskoboinyk 307453645fSAndriy Voskoboinyk #define RTWN_MACID_BC 1 /* Broadcast. */ 317453645fSAndriy Voskoboinyk #define RTWN_MACID_UNDEFINED 0x7fff 327453645fSAndriy Voskoboinyk #define RTWN_MACID_VALID 0x8000 337453645fSAndriy Voskoboinyk #define RTWN_MACID_LIMIT 128 347453645fSAndriy Voskoboinyk 35d99eb823SAdrian Chadd #define RTWN_TX_TIMEOUT 1000 /* ms */ 367453645fSAndriy Voskoboinyk #define RTWN_MAX_EPOUT 4 377453645fSAndriy Voskoboinyk #define RTWN_PORT_COUNT 2 387453645fSAndriy Voskoboinyk 397453645fSAndriy Voskoboinyk #define RTWN_LED_LINK 0 407453645fSAndriy Voskoboinyk #define RTWN_LED_DATA 1 417453645fSAndriy Voskoboinyk 427453645fSAndriy Voskoboinyk struct rtwn_rx_radiotap_header { 437453645fSAndriy Voskoboinyk struct ieee80211_radiotap_header wr_ihdr; 447453645fSAndriy Voskoboinyk uint64_t wr_tsft; 457453645fSAndriy Voskoboinyk uint8_t wr_flags; 467453645fSAndriy Voskoboinyk uint8_t wr_rate; 477453645fSAndriy Voskoboinyk uint16_t wr_chan_freq; 487453645fSAndriy Voskoboinyk uint16_t wr_chan_flags; 497453645fSAndriy Voskoboinyk int8_t wr_dbm_antsignal; 507453645fSAndriy Voskoboinyk int8_t wr_dbm_antnoise; 517453645fSAndriy Voskoboinyk } __packed __aligned(8); 527453645fSAndriy Voskoboinyk 537453645fSAndriy Voskoboinyk #define RTWN_RX_RADIOTAP_PRESENT \ 547453645fSAndriy Voskoboinyk (1 << IEEE80211_RADIOTAP_TSFT | \ 557453645fSAndriy Voskoboinyk 1 << IEEE80211_RADIOTAP_FLAGS | \ 567453645fSAndriy Voskoboinyk 1 << IEEE80211_RADIOTAP_RATE | \ 577453645fSAndriy Voskoboinyk 1 << IEEE80211_RADIOTAP_CHANNEL | \ 587453645fSAndriy Voskoboinyk 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL | \ 597453645fSAndriy Voskoboinyk 1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) 607453645fSAndriy Voskoboinyk 617453645fSAndriy Voskoboinyk struct rtwn_tx_radiotap_header { 627453645fSAndriy Voskoboinyk struct ieee80211_radiotap_header wt_ihdr; 637453645fSAndriy Voskoboinyk uint8_t wt_flags; 64786ac703SAndriy Voskoboinyk uint8_t wt_pad; 657453645fSAndriy Voskoboinyk uint16_t wt_chan_freq; 667453645fSAndriy Voskoboinyk uint16_t wt_chan_flags; 67786ac703SAndriy Voskoboinyk } __packed; 687453645fSAndriy Voskoboinyk 697453645fSAndriy Voskoboinyk #define RTWN_TX_RADIOTAP_PRESENT \ 707453645fSAndriy Voskoboinyk (1 << IEEE80211_RADIOTAP_FLAGS | \ 717453645fSAndriy Voskoboinyk 1 << IEEE80211_RADIOTAP_CHANNEL) 727453645fSAndriy Voskoboinyk 737453645fSAndriy Voskoboinyk struct rtwn_tx_buf { 747453645fSAndriy Voskoboinyk uint8_t txd[RTWN_TX_DESC_SIZE]; 757453645fSAndriy Voskoboinyk } __attribute__((aligned(4))); 767453645fSAndriy Voskoboinyk 7709606165SAndriy Voskoboinyk #define RTWN_PHY_STATUS_SIZE 32 7809606165SAndriy Voskoboinyk struct rtwn_tx_phystat { 7909606165SAndriy Voskoboinyk uint32_t phydw[RTWN_PHY_STATUS_SIZE / sizeof(uint32_t)]; 8009606165SAndriy Voskoboinyk }; 8109606165SAndriy Voskoboinyk 827453645fSAndriy Voskoboinyk struct rtwn_softc; 837453645fSAndriy Voskoboinyk 847453645fSAndriy Voskoboinyk union sec_param { 857453645fSAndriy Voskoboinyk struct ieee80211_key key; 867453645fSAndriy Voskoboinyk int macid; 877453645fSAndriy Voskoboinyk }; 887453645fSAndriy Voskoboinyk 897453645fSAndriy Voskoboinyk #define CMD_FUNC_PROTO void (*func)(struct rtwn_softc *, \ 907453645fSAndriy Voskoboinyk union sec_param *) 917453645fSAndriy Voskoboinyk 927453645fSAndriy Voskoboinyk struct rtwn_cmdq { 937453645fSAndriy Voskoboinyk union sec_param data; 947453645fSAndriy Voskoboinyk CMD_FUNC_PROTO; 957453645fSAndriy Voskoboinyk }; 967453645fSAndriy Voskoboinyk #define RTWN_CMDQ_SIZE 16 977453645fSAndriy Voskoboinyk 987453645fSAndriy Voskoboinyk struct rtwn_node { 997453645fSAndriy Voskoboinyk struct ieee80211_node ni; /* must be the first */ 1007453645fSAndriy Voskoboinyk int id; 10109606165SAndriy Voskoboinyk 10209606165SAndriy Voskoboinyk struct rtwn_tx_phystat last_physt; 1037453645fSAndriy Voskoboinyk int avg_pwdb; 1047453645fSAndriy Voskoboinyk }; 1057453645fSAndriy Voskoboinyk #define RTWN_NODE(ni) ((struct rtwn_node *)(ni)) 1067453645fSAndriy Voskoboinyk 1077453645fSAndriy Voskoboinyk struct rtwn_vap { 1087453645fSAndriy Voskoboinyk struct ieee80211vap vap; 1097453645fSAndriy Voskoboinyk int id; 1107453645fSAndriy Voskoboinyk #define RTWN_VAP_ID_INVALID -1 1117453645fSAndriy Voskoboinyk int curr_mode; 1127453645fSAndriy Voskoboinyk 1137453645fSAndriy Voskoboinyk struct rtwn_tx_buf bcn_desc; 1147453645fSAndriy Voskoboinyk struct mbuf *bcn_mbuf; 115b8ad00b0SAndriy Voskoboinyk struct timeout_task tx_beacon_csa; 1167453645fSAndriy Voskoboinyk 1177453645fSAndriy Voskoboinyk struct callout tsf_sync_adhoc; 1187453645fSAndriy Voskoboinyk struct task tsf_sync_adhoc_task; 1197453645fSAndriy Voskoboinyk 1207453645fSAndriy Voskoboinyk const struct ieee80211_key *keys[IEEE80211_WEP_NKID]; 1217453645fSAndriy Voskoboinyk 1227453645fSAndriy Voskoboinyk int (*newstate)(struct ieee80211vap *, 1237453645fSAndriy Voskoboinyk enum ieee80211_state, int); 1247453645fSAndriy Voskoboinyk void (*recv_mgmt)(struct ieee80211_node *, 1257453645fSAndriy Voskoboinyk struct mbuf *, int, 1267453645fSAndriy Voskoboinyk const struct ieee80211_rx_stats *, 1277453645fSAndriy Voskoboinyk int, int); 1287453645fSAndriy Voskoboinyk }; 1297453645fSAndriy Voskoboinyk #define RTWN_VAP(vap) ((struct rtwn_vap *)(vap)) 1307453645fSAndriy Voskoboinyk 1317453645fSAndriy Voskoboinyk /* 1327453645fSAndriy Voskoboinyk * Rx data types. 1337453645fSAndriy Voskoboinyk */ 1347453645fSAndriy Voskoboinyk enum { 1357453645fSAndriy Voskoboinyk RTWN_RX_DATA, 136b59017c5SAdrian Chadd RTWN_RX_TX_REPORT, /* Per-packet */ 137b59017c5SAdrian Chadd RTWN_RX_TX_REPORT2, /* Per-MACID summary */ 1387453645fSAndriy Voskoboinyk RTWN_RX_OTHER 1397453645fSAndriy Voskoboinyk }; 1407453645fSAndriy Voskoboinyk 1417453645fSAndriy Voskoboinyk /* 1427453645fSAndriy Voskoboinyk * Firmware reset reasons. 1437453645fSAndriy Voskoboinyk */ 1447453645fSAndriy Voskoboinyk enum { 1457453645fSAndriy Voskoboinyk RTWN_FW_RESET_DOWNLOAD, 1467453645fSAndriy Voskoboinyk RTWN_FW_RESET_CHECKSUM, 1477453645fSAndriy Voskoboinyk RTWN_FW_RESET_SHUTDOWN 1487453645fSAndriy Voskoboinyk }; 1497453645fSAndriy Voskoboinyk 1507453645fSAndriy Voskoboinyk /* 1517453645fSAndriy Voskoboinyk * Rate control algorithm selection. 1527453645fSAndriy Voskoboinyk */ 1537453645fSAndriy Voskoboinyk enum { 1547453645fSAndriy Voskoboinyk RTWN_RATECTL_NONE, 1557453645fSAndriy Voskoboinyk RTWN_RATECTL_NET80211, 1567453645fSAndriy Voskoboinyk RTWN_RATECTL_FW, 1577453645fSAndriy Voskoboinyk RTWN_RATECTL_MAX 1587453645fSAndriy Voskoboinyk }; 1597453645fSAndriy Voskoboinyk 1607453645fSAndriy Voskoboinyk /* 1617453645fSAndriy Voskoboinyk * Control h/w crypto usage. 1627453645fSAndriy Voskoboinyk */ 1637453645fSAndriy Voskoboinyk enum { 1647453645fSAndriy Voskoboinyk RTWN_CRYPTO_SW, 1657453645fSAndriy Voskoboinyk RTWN_CRYPTO_PAIR, 1667453645fSAndriy Voskoboinyk RTWN_CRYPTO_FULL, 1677453645fSAndriy Voskoboinyk RTWN_CRYPTO_MAX, 1687453645fSAndriy Voskoboinyk }; 1697453645fSAndriy Voskoboinyk 1707453645fSAndriy Voskoboinyk struct rtwn_softc { 1717453645fSAndriy Voskoboinyk struct ieee80211com sc_ic; 1727453645fSAndriy Voskoboinyk struct mbufq sc_snd; 1737453645fSAndriy Voskoboinyk device_t sc_dev; 1747453645fSAndriy Voskoboinyk 1757453645fSAndriy Voskoboinyk int sc_ht40; 176fcb5e8d0SAdrian Chadd int sc_ena_tsf64; 1777453645fSAndriy Voskoboinyk uint32_t sc_debug; 1787453645fSAndriy Voskoboinyk int sc_hwcrypto; 1797453645fSAndriy Voskoboinyk int sc_ratectl_sysctl; 1807453645fSAndriy Voskoboinyk int sc_ratectl; 1817ddf1949SAdrian Chadd uint32_t sc_reg_addr; 1827453645fSAndriy Voskoboinyk 1837453645fSAndriy Voskoboinyk uint8_t sc_detached; 1847453645fSAndriy Voskoboinyk uint8_t sc_flags; 1857453645fSAndriy Voskoboinyk /* Device flags */ 1867453645fSAndriy Voskoboinyk #define RTWN_FLAG_CCK_HIPWR 0x01 1877453645fSAndriy Voskoboinyk #define RTWN_FLAG_EXT_HDR 0x02 1887453645fSAndriy Voskoboinyk #define RTWN_FLAG_CAM_FIXED 0x04 1897453645fSAndriy Voskoboinyk /* Driver state */ 1907453645fSAndriy Voskoboinyk #define RTWN_STARTED 0x08 1917453645fSAndriy Voskoboinyk #define RTWN_RUNNING 0x10 1927453645fSAndriy Voskoboinyk #define RTWN_FW_LOADED 0x20 1937453645fSAndriy Voskoboinyk #define RTWN_TEMP_MEASURED 0x40 194c15d8692SAndriy Voskoboinyk #define RTWN_RCR_LOCKED 0x80 1957453645fSAndriy Voskoboinyk 1967453645fSAndriy Voskoboinyk #define RTWN_CHIP_HAS_BCNQ1(_sc) \ 1977453645fSAndriy Voskoboinyk ((_sc)->bcn_status_reg[0] != (_sc)->bcn_status_reg[1]) 1987453645fSAndriy Voskoboinyk 1997453645fSAndriy Voskoboinyk void *sc_priv; 2007453645fSAndriy Voskoboinyk const char *name; 2017453645fSAndriy Voskoboinyk int sc_ant; 2027453645fSAndriy Voskoboinyk 20309606165SAndriy Voskoboinyk struct rtwn_tx_phystat last_physt; 2047453645fSAndriy Voskoboinyk uint8_t thcal_temp; 2057453645fSAndriy Voskoboinyk int cur_bcnq_id; 2067453645fSAndriy Voskoboinyk 2077453645fSAndriy Voskoboinyk int nvaps; 2087453645fSAndriy Voskoboinyk int ap_vaps; 2097453645fSAndriy Voskoboinyk int bcn_vaps; 2107453645fSAndriy Voskoboinyk int mon_vaps; 2117453645fSAndriy Voskoboinyk 2127453645fSAndriy Voskoboinyk int vaps_running; 2137453645fSAndriy Voskoboinyk int monvaps_running; 2147453645fSAndriy Voskoboinyk 2157453645fSAndriy Voskoboinyk uint16_t next_rom_addr; 2164786190dSAndriy Voskoboinyk uint8_t keys_bmap[howmany(RTWN_CAM_ENTRY_LIMIT, NBBY)]; 2177453645fSAndriy Voskoboinyk 2187453645fSAndriy Voskoboinyk struct rtwn_vap *vaps[RTWN_PORT_COUNT]; 2197453645fSAndriy Voskoboinyk struct ieee80211_node *node_list[RTWN_MACID_LIMIT]; 2207453645fSAndriy Voskoboinyk struct mtx nt_mtx; 2217453645fSAndriy Voskoboinyk 2227453645fSAndriy Voskoboinyk struct callout sc_calib_to; 2237453645fSAndriy Voskoboinyk struct callout sc_pwrmode_init; 2247453645fSAndriy Voskoboinyk #ifndef D4054 2257453645fSAndriy Voskoboinyk struct callout sc_watchdog_to; 2267453645fSAndriy Voskoboinyk int sc_tx_timer; 2277453645fSAndriy Voskoboinyk #endif 2287453645fSAndriy Voskoboinyk 2297453645fSAndriy Voskoboinyk struct mtx sc_mtx; 2307453645fSAndriy Voskoboinyk 2317453645fSAndriy Voskoboinyk struct rtwn_cmdq cmdq[RTWN_CMDQ_SIZE]; 2327453645fSAndriy Voskoboinyk struct mtx cmdq_mtx; 2337453645fSAndriy Voskoboinyk struct task cmdq_task; 2347453645fSAndriy Voskoboinyk uint8_t cmdq_first; 2357453645fSAndriy Voskoboinyk uint8_t cmdq_last; 2367453645fSAndriy Voskoboinyk 2377453645fSAndriy Voskoboinyk struct wmeParams cap_wmeParams[WME_NUM_AC]; 2387453645fSAndriy Voskoboinyk 2397453645fSAndriy Voskoboinyk struct rtwn_rx_radiotap_header sc_rxtap; 2407453645fSAndriy Voskoboinyk struct rtwn_tx_radiotap_header sc_txtap; 2417453645fSAndriy Voskoboinyk 2427453645fSAndriy Voskoboinyk int ntxchains; 2437453645fSAndriy Voskoboinyk int nrxchains; 2447453645fSAndriy Voskoboinyk 2457453645fSAndriy Voskoboinyk int ledlink; 2467453645fSAndriy Voskoboinyk uint8_t thermal_meter; 2477453645fSAndriy Voskoboinyk 2487453645fSAndriy Voskoboinyk int sc_tx_n_active; 2497453645fSAndriy Voskoboinyk uint8_t qfullmsk; 2507453645fSAndriy Voskoboinyk 2517453645fSAndriy Voskoboinyk /* Firmware-specific */ 2527453645fSAndriy Voskoboinyk const char *fwname; 2537453645fSAndriy Voskoboinyk uint16_t fwver; 2547453645fSAndriy Voskoboinyk uint16_t fwsig; 2557453645fSAndriy Voskoboinyk int fwcur; 2567453645fSAndriy Voskoboinyk 2577453645fSAndriy Voskoboinyk void (*sc_node_free)(struct ieee80211_node *); 2587453645fSAndriy Voskoboinyk void (*sc_scan_curchan)(struct ieee80211_scan_state *, 2597453645fSAndriy Voskoboinyk unsigned long); 2607453645fSAndriy Voskoboinyk 2617453645fSAndriy Voskoboinyk /* Interface-specific. */ 2627453645fSAndriy Voskoboinyk int (*sc_write_1)(struct rtwn_softc *, uint16_t, 2637453645fSAndriy Voskoboinyk uint8_t); 2647453645fSAndriy Voskoboinyk int (*sc_write_2)(struct rtwn_softc *, uint16_t, 2657453645fSAndriy Voskoboinyk uint16_t); 2667453645fSAndriy Voskoboinyk int (*sc_write_4)(struct rtwn_softc *, uint16_t, 2677453645fSAndriy Voskoboinyk uint32_t); 2687453645fSAndriy Voskoboinyk uint8_t (*sc_read_1)(struct rtwn_softc *, uint16_t); 2697453645fSAndriy Voskoboinyk uint16_t (*sc_read_2)(struct rtwn_softc *, uint16_t); 2707453645fSAndriy Voskoboinyk uint32_t (*sc_read_4)(struct rtwn_softc *, uint16_t); 2717453645fSAndriy Voskoboinyk /* XXX eliminate */ 2727453645fSAndriy Voskoboinyk void (*sc_delay)(struct rtwn_softc *, int); 2737453645fSAndriy Voskoboinyk int (*sc_tx_start)(struct rtwn_softc *, 2747453645fSAndriy Voskoboinyk struct ieee80211_node *, struct mbuf *, uint8_t *, 2757453645fSAndriy Voskoboinyk uint8_t, int); 2767453645fSAndriy Voskoboinyk void (*sc_start_xfers)(struct rtwn_softc *); 2777453645fSAndriy Voskoboinyk void (*sc_reset_lists)(struct rtwn_softc *, 2787453645fSAndriy Voskoboinyk struct ieee80211vap *); 2797453645fSAndriy Voskoboinyk void (*sc_abort_xfers)(struct rtwn_softc *); 2807453645fSAndriy Voskoboinyk int (*sc_fw_write_block)(struct rtwn_softc *, 2817453645fSAndriy Voskoboinyk const uint8_t *, uint16_t, int); 2827453645fSAndriy Voskoboinyk uint16_t (*sc_get_qmap)(struct rtwn_softc *); 2837453645fSAndriy Voskoboinyk void (*sc_set_desc_addr)(struct rtwn_softc *); 2847453645fSAndriy Voskoboinyk void (*sc_drop_incorrect_tx)(struct rtwn_softc *); 285d067ef0fSAndriy Voskoboinyk void (*sc_beacon_update_begin)(struct rtwn_softc *, 286d067ef0fSAndriy Voskoboinyk struct ieee80211vap *); 287d067ef0fSAndriy Voskoboinyk void (*sc_beacon_update_end)(struct rtwn_softc *, 288d067ef0fSAndriy Voskoboinyk struct ieee80211vap *); 289d067ef0fSAndriy Voskoboinyk void (*sc_beacon_unload)(struct rtwn_softc *, int); 290d067ef0fSAndriy Voskoboinyk 291d067ef0fSAndriy Voskoboinyk /* XXX drop checks for PCIe? */ 292d067ef0fSAndriy Voskoboinyk int bcn_check_interval; 2937453645fSAndriy Voskoboinyk 2947453645fSAndriy Voskoboinyk /* Device-specific. */ 2957453645fSAndriy Voskoboinyk uint32_t (*sc_rf_read)(struct rtwn_softc *, int, uint8_t); 2967453645fSAndriy Voskoboinyk void (*sc_rf_write)(struct rtwn_softc *, int, uint8_t, 2977453645fSAndriy Voskoboinyk uint32_t); 2987453645fSAndriy Voskoboinyk int (*sc_check_condition)(struct rtwn_softc *, 2997453645fSAndriy Voskoboinyk const uint8_t[]); 3007453645fSAndriy Voskoboinyk void (*sc_efuse_postread)(struct rtwn_softc *); 3017453645fSAndriy Voskoboinyk void (*sc_parse_rom)(struct rtwn_softc *, uint8_t *); 3027453645fSAndriy Voskoboinyk void (*sc_set_led)(struct rtwn_softc *, int, int); 3037453645fSAndriy Voskoboinyk int (*sc_power_on)(struct rtwn_softc *); 3047453645fSAndriy Voskoboinyk void (*sc_power_off)(struct rtwn_softc *); 3057453645fSAndriy Voskoboinyk #ifndef RTWN_WITHOUT_UCODE 3067453645fSAndriy Voskoboinyk void (*sc_fw_reset)(struct rtwn_softc *, int); 3077453645fSAndriy Voskoboinyk void (*sc_fw_download_enable)(struct rtwn_softc *, int); 3087453645fSAndriy Voskoboinyk #endif 30960b9567dSKevin Lo int (*sc_llt_init)(struct rtwn_softc *); 3107453645fSAndriy Voskoboinyk int (*sc_set_page_size)(struct rtwn_softc *); 3117453645fSAndriy Voskoboinyk void (*sc_lc_calib)(struct rtwn_softc *); 3127453645fSAndriy Voskoboinyk void (*sc_iq_calib)(struct rtwn_softc *); 3137453645fSAndriy Voskoboinyk void (*sc_read_chipid_vendor)(struct rtwn_softc *, 3147453645fSAndriy Voskoboinyk uint32_t); 3157453645fSAndriy Voskoboinyk void (*sc_adj_devcaps)(struct rtwn_softc *); 3167453645fSAndriy Voskoboinyk void (*sc_vap_preattach)(struct rtwn_softc *, 3177453645fSAndriy Voskoboinyk struct ieee80211vap *); 3187453645fSAndriy Voskoboinyk void (*sc_postattach)(struct rtwn_softc *); 3197453645fSAndriy Voskoboinyk void (*sc_detach_private)(struct rtwn_softc *); 3207453645fSAndriy Voskoboinyk void (*sc_fill_tx_desc)(struct rtwn_softc *, 3217453645fSAndriy Voskoboinyk struct ieee80211_node *, struct mbuf *, 32264ecfc27SAdrian Chadd void *, uint8_t, bool, int); 3237453645fSAndriy Voskoboinyk void (*sc_fill_tx_desc_raw)(struct rtwn_softc *, 3247453645fSAndriy Voskoboinyk struct ieee80211_node *, struct mbuf *, 3257453645fSAndriy Voskoboinyk void *, const struct ieee80211_bpf_params *); 3267453645fSAndriy Voskoboinyk void (*sc_fill_tx_desc_null)(struct rtwn_softc *, 3277453645fSAndriy Voskoboinyk void *, int, int, int); 3287453645fSAndriy Voskoboinyk void (*sc_dump_tx_desc)(struct rtwn_softc *, const void *); 3297453645fSAndriy Voskoboinyk uint8_t (*sc_tx_radiotap_flags)(const void *); 3307453645fSAndriy Voskoboinyk uint8_t (*sc_rx_radiotap_flags)(const void *); 3317453645fSAndriy Voskoboinyk void (*sc_beacon_init)(struct rtwn_softc *, void *, int); 3327453645fSAndriy Voskoboinyk void (*sc_beacon_enable)(struct rtwn_softc *, int, int); 3339efd2154SAdrian Chadd void (*sc_sta_beacon_enable)(struct rtwn_softc *, int, 3349efd2154SAdrian Chadd bool); 3357453645fSAndriy Voskoboinyk void (*sc_beacon_set_rate)(void *, int); 3367453645fSAndriy Voskoboinyk void (*sc_beacon_select)(struct rtwn_softc *, int); 3377453645fSAndriy Voskoboinyk void (*sc_set_chan)(struct rtwn_softc *, 3387453645fSAndriy Voskoboinyk struct ieee80211_channel *); 3397453645fSAndriy Voskoboinyk void (*sc_set_media_status)(struct rtwn_softc *, int); 3407453645fSAndriy Voskoboinyk #ifndef RTWN_WITHOUT_UCODE 3417453645fSAndriy Voskoboinyk int (*sc_set_rsvd_page)(struct rtwn_softc *, int, int, 3427453645fSAndriy Voskoboinyk int); 3437453645fSAndriy Voskoboinyk int (*sc_set_pwrmode)(struct rtwn_softc *, 3447453645fSAndriy Voskoboinyk struct ieee80211vap *, int); 3457453645fSAndriy Voskoboinyk void (*sc_set_rssi)(struct rtwn_softc *); 3467453645fSAndriy Voskoboinyk #endif 34709606165SAndriy Voskoboinyk void (*sc_get_rx_stats)(struct rtwn_softc *, 34809606165SAndriy Voskoboinyk struct ieee80211_rx_stats *, const void *, 34909606165SAndriy Voskoboinyk const void *); 3507453645fSAndriy Voskoboinyk int8_t (*sc_get_rssi_cck)(struct rtwn_softc *, void *); 3517453645fSAndriy Voskoboinyk int8_t (*sc_get_rssi_ofdm)(struct rtwn_softc *, void *); 3527453645fSAndriy Voskoboinyk int (*sc_classify_intr)(struct rtwn_softc *, void *, int); 3537453645fSAndriy Voskoboinyk void (*sc_handle_tx_report)(struct rtwn_softc *, uint8_t *, 3547453645fSAndriy Voskoboinyk int); 355b59017c5SAdrian Chadd void (*sc_handle_tx_report2)(struct rtwn_softc *, uint8_t *, 356b59017c5SAdrian Chadd int); 3577453645fSAndriy Voskoboinyk void (*sc_handle_c2h_report)(struct rtwn_softc *, 3587453645fSAndriy Voskoboinyk uint8_t *, int); 3597453645fSAndriy Voskoboinyk int (*sc_check_frame)(struct rtwn_softc *, struct mbuf *); 3607453645fSAndriy Voskoboinyk void (*sc_temp_measure)(struct rtwn_softc *); 3617453645fSAndriy Voskoboinyk uint8_t (*sc_temp_read)(struct rtwn_softc *); 3627453645fSAndriy Voskoboinyk void (*sc_init_tx_agg)(struct rtwn_softc *); 3637453645fSAndriy Voskoboinyk void (*sc_init_rx_agg)(struct rtwn_softc *); 3647453645fSAndriy Voskoboinyk void (*sc_init_intr)(struct rtwn_softc *); 3657453645fSAndriy Voskoboinyk void (*sc_init_ampdu)(struct rtwn_softc *); 3667453645fSAndriy Voskoboinyk void (*sc_init_edca)(struct rtwn_softc *); 3677453645fSAndriy Voskoboinyk void (*sc_init_bb)(struct rtwn_softc *); 3687453645fSAndriy Voskoboinyk void (*sc_init_rf)(struct rtwn_softc *); 3697453645fSAndriy Voskoboinyk void (*sc_init_antsel)(struct rtwn_softc *); 3707453645fSAndriy Voskoboinyk void (*sc_post_init)(struct rtwn_softc *); 3717453645fSAndriy Voskoboinyk int (*sc_init_bcnq1_boundary)(struct rtwn_softc *); 372b71805e9SAdrian Chadd int (*sc_set_tx_power)(struct rtwn_softc *, 373b71805e9SAdrian Chadd struct ieee80211vap *); 3747453645fSAndriy Voskoboinyk 3757453645fSAndriy Voskoboinyk const uint8_t *chan_list_5ghz[3]; 3767453645fSAndriy Voskoboinyk int chan_num_5ghz[3]; 3777453645fSAndriy Voskoboinyk 3787453645fSAndriy Voskoboinyk const struct rtwn_mac_prog *mac_prog; 3797453645fSAndriy Voskoboinyk int mac_size; 3807453645fSAndriy Voskoboinyk const struct rtwn_bb_prog *bb_prog; 3817453645fSAndriy Voskoboinyk int bb_size; 3827453645fSAndriy Voskoboinyk const struct rtwn_agc_prog *agc_prog; 3837453645fSAndriy Voskoboinyk int agc_size; 3847453645fSAndriy Voskoboinyk const struct rtwn_rf_prog *rf_prog; 3857453645fSAndriy Voskoboinyk 3867453645fSAndriy Voskoboinyk int page_count; 3877453645fSAndriy Voskoboinyk int pktbuf_count; 3887453645fSAndriy Voskoboinyk 3897453645fSAndriy Voskoboinyk int ackto; 3907453645fSAndriy Voskoboinyk 3917453645fSAndriy Voskoboinyk int npubqpages; 3927453645fSAndriy Voskoboinyk int nhqpages; 3937453645fSAndriy Voskoboinyk int nnqpages; 3947453645fSAndriy Voskoboinyk int nlqpages; 3957453645fSAndriy Voskoboinyk int page_size; 3967453645fSAndriy Voskoboinyk 3977453645fSAndriy Voskoboinyk int txdesc_len; 3987453645fSAndriy Voskoboinyk int efuse_maxlen; 3997453645fSAndriy Voskoboinyk int efuse_maplen; 4007453645fSAndriy Voskoboinyk 4017453645fSAndriy Voskoboinyk uint16_t rx_dma_size; 4027453645fSAndriy Voskoboinyk 4037453645fSAndriy Voskoboinyk int macid_limit; 404af2e102cSAdrian Chadd int macid_rpt2_max_num; 4057453645fSAndriy Voskoboinyk int cam_entry_limit; 4067453645fSAndriy Voskoboinyk int fwsize_limit; 4077453645fSAndriy Voskoboinyk int temp_delta; 4087453645fSAndriy Voskoboinyk 4097453645fSAndriy Voskoboinyk uint16_t bcn_status_reg[RTWN_PORT_COUNT]; 4107453645fSAndriy Voskoboinyk uint32_t rcr; /* Rx filter */ 4117453645fSAndriy Voskoboinyk }; 4127453645fSAndriy Voskoboinyk MALLOC_DECLARE(M_RTWN_PRIV); 4137453645fSAndriy Voskoboinyk 4147453645fSAndriy Voskoboinyk #define RTWN_LOCK(sc) mtx_lock(&(sc)->sc_mtx) 4157453645fSAndriy Voskoboinyk #define RTWN_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) 4167453645fSAndriy Voskoboinyk #define RTWN_ASSERT_LOCKED(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) 4177453645fSAndriy Voskoboinyk 4187453645fSAndriy Voskoboinyk #define RTWN_CMDQ_LOCK_INIT(sc) \ 4197453645fSAndriy Voskoboinyk mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF) 4207453645fSAndriy Voskoboinyk #define RTWN_CMDQ_LOCK(sc) mtx_lock(&(sc)->cmdq_mtx) 4217453645fSAndriy Voskoboinyk #define RTWN_CMDQ_UNLOCK(sc) mtx_unlock(&(sc)->cmdq_mtx) 4227453645fSAndriy Voskoboinyk #define RTWN_CMDQ_LOCK_INITIALIZED(sc) mtx_initialized(&(sc)->cmdq_mtx) 4237453645fSAndriy Voskoboinyk #define RTWN_CMDQ_LOCK_DESTROY(sc) mtx_destroy(&(sc)->cmdq_mtx) 4247453645fSAndriy Voskoboinyk 4257453645fSAndriy Voskoboinyk #define RTWN_NT_LOCK_INIT(sc) \ 4267453645fSAndriy Voskoboinyk mtx_init(&(sc)->nt_mtx, "node table lock", NULL, MTX_DEF) 4277453645fSAndriy Voskoboinyk #define RTWN_NT_LOCK(sc) mtx_lock(&(sc)->nt_mtx) 4287453645fSAndriy Voskoboinyk #define RTWN_NT_UNLOCK(sc) mtx_unlock(&(sc)->nt_mtx) 4297453645fSAndriy Voskoboinyk #define RTWN_NT_LOCK_INITIALIZED(sc) mtx_initialized(&(sc)->nt_mtx) 4307453645fSAndriy Voskoboinyk #define RTWN_NT_LOCK_DESTROY(sc) mtx_destroy(&(sc)->nt_mtx) 4317453645fSAndriy Voskoboinyk 4327453645fSAndriy Voskoboinyk void rtwn_sysctlattach(struct rtwn_softc *); 4337453645fSAndriy Voskoboinyk 4347453645fSAndriy Voskoboinyk int rtwn_attach(struct rtwn_softc *); 4357453645fSAndriy Voskoboinyk void rtwn_detach(struct rtwn_softc *); 4367453645fSAndriy Voskoboinyk void rtwn_resume(struct rtwn_softc *); 4377453645fSAndriy Voskoboinyk void rtwn_suspend(struct rtwn_softc *); 4387453645fSAndriy Voskoboinyk 439*ec07af2aSAdrian Chadd void rtwn_attach_vht_cap_info_mcs(struct rtwn_softc *); 440*ec07af2aSAdrian Chadd 4417453645fSAndriy Voskoboinyk /* Interface-specific. */ 4427453645fSAndriy Voskoboinyk #define rtwn_write_1(_sc, _addr, _val) \ 4437453645fSAndriy Voskoboinyk (((_sc)->sc_write_1)((_sc), (_addr), (_val))) 4447453645fSAndriy Voskoboinyk #define rtwn_write_2(_sc, _addr, _val) \ 4457453645fSAndriy Voskoboinyk (((_sc)->sc_write_2)((_sc), (_addr), (_val))) 4467453645fSAndriy Voskoboinyk #define rtwn_write_4(_sc, _addr, _val) \ 4477453645fSAndriy Voskoboinyk (((_sc)->sc_write_4)((_sc), (_addr), (_val))) 4487453645fSAndriy Voskoboinyk #define rtwn_read_1(_sc, _addr) \ 4497453645fSAndriy Voskoboinyk (((_sc)->sc_read_1)((_sc), (_addr))) 4507453645fSAndriy Voskoboinyk #define rtwn_read_2(_sc, _addr) \ 4517453645fSAndriy Voskoboinyk (((_sc)->sc_read_2)((_sc), (_addr))) 4527453645fSAndriy Voskoboinyk #define rtwn_read_4(_sc, _addr) \ 4537453645fSAndriy Voskoboinyk (((_sc)->sc_read_4)((_sc), (_addr))) 4547453645fSAndriy Voskoboinyk #define rtwn_delay(_sc, _usec) \ 4557453645fSAndriy Voskoboinyk (((_sc)->sc_delay)((_sc), (_usec))) 4567453645fSAndriy Voskoboinyk #define rtwn_tx_start(_sc, _ni, _m, _desc, _type, _id) \ 4577453645fSAndriy Voskoboinyk (((_sc)->sc_tx_start)((_sc), (_ni), (_m), (_desc), (_type), (_id))) 4587453645fSAndriy Voskoboinyk #define rtwn_start_xfers(_sc) \ 4597453645fSAndriy Voskoboinyk (((_sc)->sc_start_xfers)((_sc))) 4607453645fSAndriy Voskoboinyk #define rtwn_reset_lists(_sc, _vap) \ 4617453645fSAndriy Voskoboinyk (((_sc)->sc_reset_lists)((_sc), (_vap))) 4627453645fSAndriy Voskoboinyk #define rtwn_abort_xfers(_sc) \ 4637453645fSAndriy Voskoboinyk (((_sc)->sc_abort_xfers)((_sc))) 4647453645fSAndriy Voskoboinyk #define rtwn_fw_write_block(_sc, _buf, _reg, _len) \ 4657453645fSAndriy Voskoboinyk (((_sc)->sc_fw_write_block)((_sc), (_buf), (_reg), (_len))) 4667453645fSAndriy Voskoboinyk #define rtwn_get_qmap(_sc) \ 4677453645fSAndriy Voskoboinyk (((_sc)->sc_get_qmap)((_sc))) 4687453645fSAndriy Voskoboinyk #define rtwn_set_desc_addr(_sc) \ 4697453645fSAndriy Voskoboinyk (((_sc)->sc_set_desc_addr)((_sc))) 4707453645fSAndriy Voskoboinyk #define rtwn_drop_incorrect_tx(_sc) \ 4717453645fSAndriy Voskoboinyk (((_sc)->sc_drop_incorrect_tx)((_sc))) 472d067ef0fSAndriy Voskoboinyk #define rtwn_beacon_update_begin(_sc, _vap) \ 473d067ef0fSAndriy Voskoboinyk (((_sc)->sc_beacon_update_begin)((_sc), (_vap))) 474d067ef0fSAndriy Voskoboinyk #define rtwn_beacon_update_end(_sc, _vap) \ 475d067ef0fSAndriy Voskoboinyk (((_sc)->sc_beacon_update_end)((_sc), (_vap))) 476d067ef0fSAndriy Voskoboinyk #define rtwn_beacon_unload(_sc, _id) \ 477d067ef0fSAndriy Voskoboinyk (((_sc)->sc_beacon_unload)((_sc), (_id))) 4787453645fSAndriy Voskoboinyk 4797453645fSAndriy Voskoboinyk /* Aliases. */ 4807453645fSAndriy Voskoboinyk #define rtwn_bb_write rtwn_write_4 4817453645fSAndriy Voskoboinyk #define rtwn_bb_read rtwn_read_4 4827453645fSAndriy Voskoboinyk #define rtwn_bb_setbits rtwn_setbits_4 4837453645fSAndriy Voskoboinyk 4847453645fSAndriy Voskoboinyk /* Device-specific. */ 4857453645fSAndriy Voskoboinyk #define rtwn_rf_read(_sc, _chain, _addr) \ 4867453645fSAndriy Voskoboinyk (((_sc)->sc_rf_read)((_sc), (_chain), (_addr))) 4877453645fSAndriy Voskoboinyk #define rtwn_rf_write(_sc, _chain, _addr, _val) \ 4887453645fSAndriy Voskoboinyk (((_sc)->sc_rf_write)((_sc), (_chain), (_addr), (_val))) 4897453645fSAndriy Voskoboinyk #define rtwn_check_condition(_sc, _cond) \ 4907453645fSAndriy Voskoboinyk (((_sc)->sc_check_condition)((_sc), (_cond))) 4917453645fSAndriy Voskoboinyk #define rtwn_efuse_postread(_sc) \ 4927453645fSAndriy Voskoboinyk (((_sc)->sc_efuse_postread)((_sc))) 4937453645fSAndriy Voskoboinyk #define rtwn_parse_rom(_sc, _rom) \ 4947453645fSAndriy Voskoboinyk (((_sc)->sc_parse_rom)((_sc), (_rom))) 4957453645fSAndriy Voskoboinyk #define rtwn_set_led(_sc, _led, _on) \ 4967453645fSAndriy Voskoboinyk (((_sc)->sc_set_led)((_sc), (_led), (_on))) 49709606165SAndriy Voskoboinyk #define rtwn_get_rx_stats(_sc, _rxs, _desc, _physt) \ 49809606165SAndriy Voskoboinyk (((_sc)->sc_get_rx_stats((_sc), (_rxs), (_desc), (_physt)))) 4997453645fSAndriy Voskoboinyk #define rtwn_get_rssi_cck(_sc, _physt) \ 5007453645fSAndriy Voskoboinyk (((_sc)->sc_get_rssi_cck)((_sc), (_physt))) 5017453645fSAndriy Voskoboinyk #define rtwn_get_rssi_ofdm(_sc, _physt) \ 5027453645fSAndriy Voskoboinyk (((_sc)->sc_get_rssi_ofdm)((_sc), (_physt))) 5037453645fSAndriy Voskoboinyk #define rtwn_power_on(_sc) \ 5047453645fSAndriy Voskoboinyk (((_sc)->sc_power_on)((_sc))) 5057453645fSAndriy Voskoboinyk #define rtwn_power_off(_sc) \ 5067453645fSAndriy Voskoboinyk (((_sc)->sc_power_off)((_sc))) 5077453645fSAndriy Voskoboinyk #ifndef RTWN_WITHOUT_UCODE 5087453645fSAndriy Voskoboinyk #define rtwn_fw_reset(_sc, _reason) \ 5097453645fSAndriy Voskoboinyk (((_sc)->sc_fw_reset)((_sc), (_reason))) 5107453645fSAndriy Voskoboinyk #define rtwn_fw_download_enable(_sc, _enable) \ 5117453645fSAndriy Voskoboinyk (((_sc)->sc_fw_download_enable)((_sc), (_enable))) 5127453645fSAndriy Voskoboinyk #endif 51360b9567dSKevin Lo #define rtwn_llt_init(_sc) \ 51460b9567dSKevin Lo (((_sc)->sc_llt_init)((_sc))) 5157453645fSAndriy Voskoboinyk #define rtwn_set_page_size(_sc) \ 5167453645fSAndriy Voskoboinyk (((_sc)->sc_set_page_size)((_sc))) 5177453645fSAndriy Voskoboinyk #define rtwn_lc_calib(_sc) \ 5187453645fSAndriy Voskoboinyk (((_sc)->sc_lc_calib)((_sc))) 5197453645fSAndriy Voskoboinyk #define rtwn_iq_calib(_sc) \ 5207453645fSAndriy Voskoboinyk (((_sc)->sc_iq_calib)((_sc))) 5217453645fSAndriy Voskoboinyk #define rtwn_read_chipid_vendor(_sc, _reg) \ 5227453645fSAndriy Voskoboinyk (((_sc)->sc_read_chipid_vendor)((_sc), (_reg))) 5237453645fSAndriy Voskoboinyk #define rtwn_adj_devcaps(_sc) \ 5247453645fSAndriy Voskoboinyk (((_sc)->sc_adj_devcaps)((_sc))) 5257453645fSAndriy Voskoboinyk #define rtwn_vap_preattach(_sc, _vap) \ 5267453645fSAndriy Voskoboinyk (((_sc)->sc_vap_preattach)((_sc), (_vap))) 5277453645fSAndriy Voskoboinyk #define rtwn_postattach(_sc) \ 5287453645fSAndriy Voskoboinyk (((_sc)->sc_postattach)((_sc))) 5297453645fSAndriy Voskoboinyk #define rtwn_detach_private(_sc) \ 5307453645fSAndriy Voskoboinyk (((_sc)->sc_detach_private)((_sc))) 5317453645fSAndriy Voskoboinyk #define rtwn_fill_tx_desc(_sc, _ni, _m, \ 53264ecfc27SAdrian Chadd _buf, _ridx, _force, _maxretry) \ 5337453645fSAndriy Voskoboinyk (((_sc)->sc_fill_tx_desc)((_sc), (_ni), \ 53464ecfc27SAdrian Chadd (_m), (_buf), (_ridx), (_force), (_maxretry))) 5357453645fSAndriy Voskoboinyk #define rtwn_fill_tx_desc_raw(_sc, _ni, _m, \ 5367453645fSAndriy Voskoboinyk _buf, _params) \ 5377453645fSAndriy Voskoboinyk (((_sc)->sc_fill_tx_desc_raw)((_sc), (_ni), \ 5387453645fSAndriy Voskoboinyk (_m), (_buf), (_params))) 5397453645fSAndriy Voskoboinyk #define rtwn_fill_tx_desc_null(_sc, _buf, _11b, _qos, _id) \ 5407453645fSAndriy Voskoboinyk (((_sc)->sc_fill_tx_desc_null)((_sc), \ 5417453645fSAndriy Voskoboinyk (_buf), (_11b), (_qos), (_id))) 5427453645fSAndriy Voskoboinyk #define rtwn_dump_tx_desc(_sc, _desc) \ 5437453645fSAndriy Voskoboinyk (((_sc)->sc_dump_tx_desc)((_sc), (_desc))) 5447453645fSAndriy Voskoboinyk #define rtwn_tx_radiotap_flags(_sc, _buf) \ 5457453645fSAndriy Voskoboinyk (((_sc)->sc_tx_radiotap_flags)((_buf))) 5467453645fSAndriy Voskoboinyk #define rtwn_rx_radiotap_flags(_sc, _buf) \ 5477453645fSAndriy Voskoboinyk (((_sc)->sc_rx_radiotap_flags)((_buf))) 5487453645fSAndriy Voskoboinyk #define rtwn_set_chan(_sc, _c) \ 5497453645fSAndriy Voskoboinyk (((_sc)->sc_set_chan)((_sc), (_c))) 5507453645fSAndriy Voskoboinyk #ifndef RTWN_WITHOUT_UCODE 5517453645fSAndriy Voskoboinyk #define rtwn_set_rsvd_page(_sc, _resp, _null, _qos_null) \ 5527453645fSAndriy Voskoboinyk (((_sc)->sc_set_rsvd_page)((_sc), \ 5537453645fSAndriy Voskoboinyk (_resp), (_null), (_qos_null))) 5547453645fSAndriy Voskoboinyk #define rtwn_set_pwrmode(_sc, _vap, _off) \ 5557453645fSAndriy Voskoboinyk (((_sc)->sc_set_pwrmode)((_sc), (_vap), (_off))) 5567453645fSAndriy Voskoboinyk #define rtwn_set_rssi(_sc) \ 5577453645fSAndriy Voskoboinyk (((_sc)->sc_set_rssi)((_sc))) 5587453645fSAndriy Voskoboinyk #endif 5597453645fSAndriy Voskoboinyk #define rtwn_classify_intr(_sc, _buf, _len) \ 5607453645fSAndriy Voskoboinyk (((_sc)->sc_classify_intr)((_sc), (_buf), (_len))) 5617453645fSAndriy Voskoboinyk #define rtwn_handle_tx_report(_sc, _buf, _len) \ 5627453645fSAndriy Voskoboinyk (((_sc)->sc_handle_tx_report)((_sc), (_buf), (_len))) 563b59017c5SAdrian Chadd #define rtwn_handle_tx_report2(_sc, _buf, _len) \ 564b59017c5SAdrian Chadd (((_sc)->sc_handle_tx_report2)((_sc), (_buf), (_len))) 5657453645fSAndriy Voskoboinyk #define rtwn_handle_c2h_report(_sc, _buf, _len) \ 5667453645fSAndriy Voskoboinyk (((_sc)->sc_handle_c2h_report)((_sc), (_buf), (_len))) 5677453645fSAndriy Voskoboinyk #define rtwn_check_frame(_sc, _m) \ 5687453645fSAndriy Voskoboinyk (((_sc)->sc_check_frame)((_sc), (_m))) 5697453645fSAndriy Voskoboinyk #define rtwn_beacon_init(_sc, _buf, _id) \ 5707453645fSAndriy Voskoboinyk (((_sc)->sc_beacon_init)((_sc), (_buf), (_id))) 5717453645fSAndriy Voskoboinyk #define rtwn_beacon_enable(_sc, _id, _enable) \ 5727453645fSAndriy Voskoboinyk (((_sc)->sc_beacon_enable)((_sc), (_id), (_enable))) 5739efd2154SAdrian Chadd #define rtwn_sta_beacon_enable(_sc, _id, _enable) \ 5749efd2154SAdrian Chadd (((_sc)->sc_sta_beacon_enable)((_sc), (_id), (_enable))) 5757453645fSAndriy Voskoboinyk #define rtwn_beacon_set_rate(_sc, _buf, _is5ghz) \ 5767453645fSAndriy Voskoboinyk (((_sc)->sc_beacon_set_rate)((_buf), (_is5ghz))) 5777453645fSAndriy Voskoboinyk #define rtwn_beacon_select(_sc, _id) \ 5787453645fSAndriy Voskoboinyk (((_sc)->sc_beacon_select)((_sc), (_id))) 5797453645fSAndriy Voskoboinyk #define rtwn_temp_measure(_sc) \ 5807453645fSAndriy Voskoboinyk (((_sc)->sc_temp_measure)((_sc))) 5817453645fSAndriy Voskoboinyk #define rtwn_temp_read(_sc) \ 5827453645fSAndriy Voskoboinyk (((_sc)->sc_temp_read)((_sc))) 5837453645fSAndriy Voskoboinyk #define rtwn_init_tx_agg(_sc) \ 5847453645fSAndriy Voskoboinyk (((_sc)->sc_init_tx_agg)((_sc))) 5857453645fSAndriy Voskoboinyk #define rtwn_init_rx_agg(_sc) \ 5867453645fSAndriy Voskoboinyk (((_sc)->sc_init_rx_agg)((_sc))) 5877453645fSAndriy Voskoboinyk #define rtwn_init_intr(_sc) \ 5887453645fSAndriy Voskoboinyk (((_sc)->sc_init_intr)((_sc))) 5897453645fSAndriy Voskoboinyk #define rtwn_init_ampdu(_sc) \ 5907453645fSAndriy Voskoboinyk (((_sc)->sc_init_ampdu)((_sc))) 5917453645fSAndriy Voskoboinyk #define rtwn_init_edca(_sc) \ 5927453645fSAndriy Voskoboinyk (((_sc)->sc_init_edca)((_sc))) 5937453645fSAndriy Voskoboinyk #define rtwn_init_bb(_sc) \ 5947453645fSAndriy Voskoboinyk (((_sc)->sc_init_bb)((_sc))) 5957453645fSAndriy Voskoboinyk #define rtwn_init_rf(_sc) \ 5967453645fSAndriy Voskoboinyk (((_sc)->sc_init_rf)((_sc))) 5977453645fSAndriy Voskoboinyk #define rtwn_init_antsel(_sc) \ 5987453645fSAndriy Voskoboinyk (((_sc)->sc_init_antsel)((_sc))) 5997453645fSAndriy Voskoboinyk #define rtwn_post_init(_sc) \ 6007453645fSAndriy Voskoboinyk (((_sc)->sc_post_init)((_sc))) 6017453645fSAndriy Voskoboinyk #define rtwn_init_bcnq1_boundary(_sc) \ 6027453645fSAndriy Voskoboinyk (((_sc)->sc_init_bcnq1_boundary)((_sc))) 603b71805e9SAdrian Chadd #define rtwn_set_tx_power(_sc, _vap) \ 604b71805e9SAdrian Chadd (((_sc)->sc_set_tx_power)((_sc), (_vap))) 6057453645fSAndriy Voskoboinyk 6067453645fSAndriy Voskoboinyk /* 6077453645fSAndriy Voskoboinyk * Methods to access subfields in registers. 6087453645fSAndriy Voskoboinyk */ 6097453645fSAndriy Voskoboinyk static __inline int 6107453645fSAndriy Voskoboinyk rtwn_setbits_1(struct rtwn_softc *sc, uint16_t addr, uint8_t clr, 6117453645fSAndriy Voskoboinyk uint8_t set) 6127453645fSAndriy Voskoboinyk { 6137453645fSAndriy Voskoboinyk return (rtwn_write_1(sc, addr, 6147453645fSAndriy Voskoboinyk (rtwn_read_1(sc, addr) & ~clr) | set)); 6157453645fSAndriy Voskoboinyk } 6167453645fSAndriy Voskoboinyk 6177453645fSAndriy Voskoboinyk static __inline int 6187453645fSAndriy Voskoboinyk rtwn_setbits_1_shift(struct rtwn_softc *sc, uint16_t addr, uint32_t clr, 6197453645fSAndriy Voskoboinyk uint32_t set, int shift) 6207453645fSAndriy Voskoboinyk { 6217453645fSAndriy Voskoboinyk return (rtwn_setbits_1(sc, addr + shift, clr >> shift * NBBY, 6227453645fSAndriy Voskoboinyk set >> shift * NBBY)); 6237453645fSAndriy Voskoboinyk } 6247453645fSAndriy Voskoboinyk 6257453645fSAndriy Voskoboinyk static __inline int 6267453645fSAndriy Voskoboinyk rtwn_setbits_2(struct rtwn_softc *sc, uint16_t addr, uint16_t clr, 6277453645fSAndriy Voskoboinyk uint16_t set) 6287453645fSAndriy Voskoboinyk { 6297453645fSAndriy Voskoboinyk return (rtwn_write_2(sc, addr, 6307453645fSAndriy Voskoboinyk (rtwn_read_2(sc, addr) & ~clr) | set)); 6317453645fSAndriy Voskoboinyk } 6327453645fSAndriy Voskoboinyk 6337453645fSAndriy Voskoboinyk static __inline int 6347453645fSAndriy Voskoboinyk rtwn_setbits_4(struct rtwn_softc *sc, uint16_t addr, uint32_t clr, 6357453645fSAndriy Voskoboinyk uint32_t set) 6367453645fSAndriy Voskoboinyk { 6377453645fSAndriy Voskoboinyk return (rtwn_write_4(sc, addr, 6387453645fSAndriy Voskoboinyk (rtwn_read_4(sc, addr) & ~clr) | set)); 6397453645fSAndriy Voskoboinyk } 6407453645fSAndriy Voskoboinyk 6417453645fSAndriy Voskoboinyk static __inline void 6427453645fSAndriy Voskoboinyk rtwn_rf_setbits(struct rtwn_softc *sc, int chain, uint8_t addr, 6437453645fSAndriy Voskoboinyk uint32_t clr, uint32_t set) 6447453645fSAndriy Voskoboinyk { 6457453645fSAndriy Voskoboinyk rtwn_rf_write(sc, chain, addr, 6467453645fSAndriy Voskoboinyk (rtwn_rf_read(sc, chain, addr) & ~clr) | set); 6477453645fSAndriy Voskoboinyk } 6487453645fSAndriy Voskoboinyk 6497453645fSAndriy Voskoboinyk #endif /* IF_RTWNVAR_H */ 650