diff options
Diffstat (limited to 'freebsd/sys/dev/rtwn/if_rtwnvar.h')
-rw-r--r-- | freebsd/sys/dev/rtwn/if_rtwnvar.h | 624 |
1 files changed, 624 insertions, 0 deletions
diff --git a/freebsd/sys/dev/rtwn/if_rtwnvar.h b/freebsd/sys/dev/rtwn/if_rtwnvar.h new file mode 100644 index 00000000..0c010adb --- /dev/null +++ b/freebsd/sys/dev/rtwn/if_rtwnvar.h @@ -0,0 +1,624 @@ +/*- + * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr> + * Copyright (c) 2015-2016 Andriy Voskoboinyk <avos@FreeBSD.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $OpenBSD: if_urtwnreg.h,v 1.3 2010/11/16 18:02:59 damien Exp $ + * $FreeBSD$ + */ + +#ifndef IF_RTWNVAR_H +#define IF_RTWNVAR_H + +#include <rtems/bsd/local/opt_rtwn.h> + +#define RTWN_TX_DESC_SIZE 64 + +#define RTWN_TXBUFSZ (16 * 1024) + +#define RTWN_BCN_MAX_SIZE 512 +#define RTWN_CAM_ENTRY_LIMIT 64 + +#define RTWN_MACID_BC 1 /* Broadcast. */ +#define RTWN_MACID_UNDEFINED 0x7fff +#define RTWN_MACID_VALID 0x8000 +#define RTWN_MACID_LIMIT 128 + +#define RTWN_TX_TIMEOUT 5000 /* ms */ +#define RTWN_MAX_EPOUT 4 +#define RTWN_PORT_COUNT 2 + +#define RTWN_LED_LINK 0 +#define RTWN_LED_DATA 1 + +struct rtwn_rx_radiotap_header { + struct ieee80211_radiotap_header wr_ihdr; + uint64_t wr_tsft; + uint8_t wr_flags; + uint8_t wr_rate; + uint16_t wr_chan_freq; + uint16_t wr_chan_flags; + int8_t wr_dbm_antsignal; + int8_t wr_dbm_antnoise; +} __packed __aligned(8); + +#define RTWN_RX_RADIOTAP_PRESENT \ + (1 << IEEE80211_RADIOTAP_TSFT | \ + 1 << IEEE80211_RADIOTAP_FLAGS | \ + 1 << IEEE80211_RADIOTAP_RATE | \ + 1 << IEEE80211_RADIOTAP_CHANNEL | \ + 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL | \ + 1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) + +struct rtwn_tx_radiotap_header { + struct ieee80211_radiotap_header wt_ihdr; + uint8_t wt_flags; + uint16_t wt_chan_freq; + uint16_t wt_chan_flags; +} __packed __aligned(8); + +#define RTWN_TX_RADIOTAP_PRESENT \ + (1 << IEEE80211_RADIOTAP_FLAGS | \ + 1 << IEEE80211_RADIOTAP_CHANNEL) + +struct rtwn_tx_buf { + uint8_t txd[RTWN_TX_DESC_SIZE]; +} __attribute__((aligned(4))); + +struct rtwn_softc; + +union sec_param { + struct ieee80211_key key; + int macid; +}; + +#define CMD_FUNC_PROTO void (*func)(struct rtwn_softc *, \ + union sec_param *) + +struct rtwn_cmdq { + union sec_param data; + CMD_FUNC_PROTO; +}; +#define RTWN_CMDQ_SIZE 16 + +struct rtwn_node { + struct ieee80211_node ni; /* must be the first */ + int id; + int8_t last_rssi; + int avg_pwdb; +}; +#define RTWN_NODE(ni) ((struct rtwn_node *)(ni)) + +struct rtwn_vap { + struct ieee80211vap vap; + int id; +#define RTWN_VAP_ID_INVALID -1 + int curr_mode; + + struct rtwn_tx_buf bcn_desc; + struct mbuf *bcn_mbuf; + struct timeout_task tx_beacon_csa; + + struct callout tsf_sync_adhoc; + struct task tsf_sync_adhoc_task; + + const struct ieee80211_key *keys[IEEE80211_WEP_NKID]; + + int (*newstate)(struct ieee80211vap *, + enum ieee80211_state, int); + void (*recv_mgmt)(struct ieee80211_node *, + struct mbuf *, int, + const struct ieee80211_rx_stats *, + int, int); +}; +#define RTWN_VAP(vap) ((struct rtwn_vap *)(vap)) + +/* + * Rx data types. + */ +enum { + RTWN_RX_DATA, + RTWN_RX_TX_REPORT, + RTWN_RX_OTHER +}; + +/* + * Firmware reset reasons. + */ +enum { + RTWN_FW_RESET_DOWNLOAD, + RTWN_FW_RESET_CHECKSUM, + RTWN_FW_RESET_SHUTDOWN +}; + +/* + * Rate control algorithm selection. + */ +enum { + RTWN_RATECTL_NONE, + RTWN_RATECTL_NET80211, + RTWN_RATECTL_FW, + RTWN_RATECTL_MAX +}; + +/* + * Control h/w crypto usage. + */ +enum { + RTWN_CRYPTO_SW, + RTWN_CRYPTO_PAIR, + RTWN_CRYPTO_FULL, + RTWN_CRYPTO_MAX, +}; + +struct rtwn_softc { + struct ieee80211com sc_ic; + struct mbufq sc_snd; + device_t sc_dev; + +#if 1 + int sc_ht40; +#endif + uint32_t sc_debug; + int sc_hwcrypto; + int sc_ratectl_sysctl; + int sc_ratectl; + + uint8_t sc_detached; + uint8_t sc_flags; +/* Device flags */ +#define RTWN_FLAG_CCK_HIPWR 0x01 +#define RTWN_FLAG_EXT_HDR 0x02 +#define RTWN_FLAG_CAM_FIXED 0x04 +/* Driver state */ +#define RTWN_STARTED 0x08 +#define RTWN_RUNNING 0x10 +#define RTWN_FW_LOADED 0x20 +#define RTWN_TEMP_MEASURED 0x40 +#define RTWN_RCR_LOCKED 0x80 + +#define RTWN_CHIP_HAS_BCNQ1(_sc) \ + ((_sc)->bcn_status_reg[0] != (_sc)->bcn_status_reg[1]) + + void *sc_priv; + const char *name; + int sc_ant; + + int8_t last_rssi; + uint8_t thcal_temp; + int cur_bcnq_id; + + int nvaps; + int ap_vaps; + int bcn_vaps; + int mon_vaps; + + int vaps_running; + int monvaps_running; + + uint16_t next_rom_addr; + uint8_t keys_bmap[howmany(RTWN_CAM_ENTRY_LIMIT, NBBY)]; + + struct rtwn_vap *vaps[RTWN_PORT_COUNT]; + struct ieee80211_node *node_list[RTWN_MACID_LIMIT]; + struct mtx nt_mtx; + + struct callout sc_calib_to; + struct callout sc_pwrmode_init; +#ifndef D4054 + struct callout sc_watchdog_to; + int sc_tx_timer; +#endif + + struct mtx sc_mtx; + + struct rtwn_cmdq cmdq[RTWN_CMDQ_SIZE]; + struct mtx cmdq_mtx; + struct task cmdq_task; + uint8_t cmdq_first; + uint8_t cmdq_last; + + struct wmeParams cap_wmeParams[WME_NUM_AC]; + + struct rtwn_rx_radiotap_header sc_rxtap; + struct rtwn_tx_radiotap_header sc_txtap; + + int ntxchains; + int nrxchains; + + int ledlink; + uint8_t thermal_meter; + + int sc_tx_n_active; + uint8_t qfullmsk; + + /* Firmware-specific */ + const char *fwname; + uint16_t fwver; + uint16_t fwsig; + int fwcur; + + void (*sc_node_free)(struct ieee80211_node *); + void (*sc_scan_curchan)(struct ieee80211_scan_state *, + unsigned long); + + /* Interface-specific. */ + int (*sc_write_1)(struct rtwn_softc *, uint16_t, + uint8_t); + int (*sc_write_2)(struct rtwn_softc *, uint16_t, + uint16_t); + int (*sc_write_4)(struct rtwn_softc *, uint16_t, + uint32_t); + uint8_t (*sc_read_1)(struct rtwn_softc *, uint16_t); + uint16_t (*sc_read_2)(struct rtwn_softc *, uint16_t); + uint32_t (*sc_read_4)(struct rtwn_softc *, uint16_t); + /* XXX eliminate */ + void (*sc_delay)(struct rtwn_softc *, int); + int (*sc_tx_start)(struct rtwn_softc *, + struct ieee80211_node *, struct mbuf *, uint8_t *, + uint8_t, int); + void (*sc_start_xfers)(struct rtwn_softc *); + void (*sc_reset_lists)(struct rtwn_softc *, + struct ieee80211vap *); + void (*sc_abort_xfers)(struct rtwn_softc *); + int (*sc_fw_write_block)(struct rtwn_softc *, + const uint8_t *, uint16_t, int); + uint16_t (*sc_get_qmap)(struct rtwn_softc *); + void (*sc_set_desc_addr)(struct rtwn_softc *); + void (*sc_drop_incorrect_tx)(struct rtwn_softc *); + void (*sc_beacon_update_begin)(struct rtwn_softc *, + struct ieee80211vap *); + void (*sc_beacon_update_end)(struct rtwn_softc *, + struct ieee80211vap *); + void (*sc_beacon_unload)(struct rtwn_softc *, int); + + /* XXX drop checks for PCIe? */ + int bcn_check_interval; + + /* Device-specific. */ + uint32_t (*sc_rf_read)(struct rtwn_softc *, int, uint8_t); + void (*sc_rf_write)(struct rtwn_softc *, int, uint8_t, + uint32_t); + int (*sc_check_condition)(struct rtwn_softc *, + const uint8_t[]); + void (*sc_efuse_postread)(struct rtwn_softc *); + void (*sc_parse_rom)(struct rtwn_softc *, uint8_t *); + void (*sc_set_led)(struct rtwn_softc *, int, int); + int (*sc_power_on)(struct rtwn_softc *); + void (*sc_power_off)(struct rtwn_softc *); +#ifndef RTWN_WITHOUT_UCODE + void (*sc_fw_reset)(struct rtwn_softc *, int); + void (*sc_fw_download_enable)(struct rtwn_softc *, int); +#endif + int (*sc_set_page_size)(struct rtwn_softc *); + void (*sc_lc_calib)(struct rtwn_softc *); + void (*sc_iq_calib)(struct rtwn_softc *); + void (*sc_read_chipid_vendor)(struct rtwn_softc *, + uint32_t); + void (*sc_adj_devcaps)(struct rtwn_softc *); + void (*sc_vap_preattach)(struct rtwn_softc *, + struct ieee80211vap *); + void (*sc_postattach)(struct rtwn_softc *); + void (*sc_detach_private)(struct rtwn_softc *); + void (*sc_fill_tx_desc)(struct rtwn_softc *, + struct ieee80211_node *, struct mbuf *, + void *, uint8_t, int); + void (*sc_fill_tx_desc_raw)(struct rtwn_softc *, + struct ieee80211_node *, struct mbuf *, + void *, const struct ieee80211_bpf_params *); + void (*sc_fill_tx_desc_null)(struct rtwn_softc *, + void *, int, int, int); + void (*sc_dump_tx_desc)(struct rtwn_softc *, const void *); + uint8_t (*sc_tx_radiotap_flags)(const void *); + uint8_t (*sc_rx_radiotap_flags)(const void *); + void (*sc_beacon_init)(struct rtwn_softc *, void *, int); + void (*sc_beacon_enable)(struct rtwn_softc *, int, int); + void (*sc_beacon_set_rate)(void *, int); + void (*sc_beacon_select)(struct rtwn_softc *, int); + void (*sc_set_chan)(struct rtwn_softc *, + struct ieee80211_channel *); + void (*sc_set_media_status)(struct rtwn_softc *, int); +#ifndef RTWN_WITHOUT_UCODE + int (*sc_set_rsvd_page)(struct rtwn_softc *, int, int, + int); + int (*sc_set_pwrmode)(struct rtwn_softc *, + struct ieee80211vap *, int); + void (*sc_set_rssi)(struct rtwn_softc *); +#endif + int8_t (*sc_get_rssi_cck)(struct rtwn_softc *, void *); + int8_t (*sc_get_rssi_ofdm)(struct rtwn_softc *, void *); + int (*sc_classify_intr)(struct rtwn_softc *, void *, int); + void (*sc_handle_tx_report)(struct rtwn_softc *, uint8_t *, + int); + void (*sc_handle_c2h_report)(struct rtwn_softc *, + uint8_t *, int); + int (*sc_check_frame)(struct rtwn_softc *, struct mbuf *); + void (*sc_temp_measure)(struct rtwn_softc *); + uint8_t (*sc_temp_read)(struct rtwn_softc *); + void (*sc_init_tx_agg)(struct rtwn_softc *); + void (*sc_init_rx_agg)(struct rtwn_softc *); + void (*sc_init_intr)(struct rtwn_softc *); + void (*sc_init_ampdu)(struct rtwn_softc *); + void (*sc_init_edca)(struct rtwn_softc *); + void (*sc_init_bb)(struct rtwn_softc *); + void (*sc_init_rf)(struct rtwn_softc *); + void (*sc_init_antsel)(struct rtwn_softc *); + void (*sc_post_init)(struct rtwn_softc *); + int (*sc_init_bcnq1_boundary)(struct rtwn_softc *); + + const uint8_t *chan_list_5ghz[3]; + int chan_num_5ghz[3]; + + const struct rtwn_mac_prog *mac_prog; + int mac_size; + const struct rtwn_bb_prog *bb_prog; + int bb_size; + const struct rtwn_agc_prog *agc_prog; + int agc_size; + const struct rtwn_rf_prog *rf_prog; + + int page_count; + int pktbuf_count; + + int ackto; + + int npubqpages; + int nhqpages; + int nnqpages; + int nlqpages; + int page_size; + + int txdesc_len; + int efuse_maxlen; + int efuse_maplen; + + uint16_t rx_dma_size; + + int macid_limit; + int cam_entry_limit; + int fwsize_limit; + int temp_delta; + + uint16_t bcn_status_reg[RTWN_PORT_COUNT]; + uint32_t rcr; /* Rx filter */ +}; +MALLOC_DECLARE(M_RTWN_PRIV); + +#define RTWN_LOCK(sc) mtx_lock(&(sc)->sc_mtx) +#define RTWN_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) +#define RTWN_ASSERT_LOCKED(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) + +#define RTWN_CMDQ_LOCK_INIT(sc) \ + mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF) +#define RTWN_CMDQ_LOCK(sc) mtx_lock(&(sc)->cmdq_mtx) +#define RTWN_CMDQ_UNLOCK(sc) mtx_unlock(&(sc)->cmdq_mtx) +#define RTWN_CMDQ_LOCK_INITIALIZED(sc) mtx_initialized(&(sc)->cmdq_mtx) +#define RTWN_CMDQ_LOCK_DESTROY(sc) mtx_destroy(&(sc)->cmdq_mtx) + +#define RTWN_NT_LOCK_INIT(sc) \ + mtx_init(&(sc)->nt_mtx, "node table lock", NULL, MTX_DEF) +#define RTWN_NT_LOCK(sc) mtx_lock(&(sc)->nt_mtx) +#define RTWN_NT_UNLOCK(sc) mtx_unlock(&(sc)->nt_mtx) +#define RTWN_NT_LOCK_INITIALIZED(sc) mtx_initialized(&(sc)->nt_mtx) +#define RTWN_NT_LOCK_DESTROY(sc) mtx_destroy(&(sc)->nt_mtx) + + +void rtwn_sysctlattach(struct rtwn_softc *); + +int rtwn_attach(struct rtwn_softc *); +void rtwn_detach(struct rtwn_softc *); +void rtwn_resume(struct rtwn_softc *); +void rtwn_suspend(struct rtwn_softc *); + + +/* Interface-specific. */ +#define rtwn_write_1(_sc, _addr, _val) \ + (((_sc)->sc_write_1)((_sc), (_addr), (_val))) +#define rtwn_write_2(_sc, _addr, _val) \ + (((_sc)->sc_write_2)((_sc), (_addr), (_val))) +#define rtwn_write_4(_sc, _addr, _val) \ + (((_sc)->sc_write_4)((_sc), (_addr), (_val))) +#define rtwn_read_1(_sc, _addr) \ + (((_sc)->sc_read_1)((_sc), (_addr))) +#define rtwn_read_2(_sc, _addr) \ + (((_sc)->sc_read_2)((_sc), (_addr))) +#define rtwn_read_4(_sc, _addr) \ + (((_sc)->sc_read_4)((_sc), (_addr))) +#define rtwn_delay(_sc, _usec) \ + (((_sc)->sc_delay)((_sc), (_usec))) +#define rtwn_tx_start(_sc, _ni, _m, _desc, _type, _id) \ + (((_sc)->sc_tx_start)((_sc), (_ni), (_m), (_desc), (_type), (_id))) +#define rtwn_start_xfers(_sc) \ + (((_sc)->sc_start_xfers)((_sc))) +#define rtwn_reset_lists(_sc, _vap) \ + (((_sc)->sc_reset_lists)((_sc), (_vap))) +#define rtwn_abort_xfers(_sc) \ + (((_sc)->sc_abort_xfers)((_sc))) +#define rtwn_fw_write_block(_sc, _buf, _reg, _len) \ + (((_sc)->sc_fw_write_block)((_sc), (_buf), (_reg), (_len))) +#define rtwn_get_qmap(_sc) \ + (((_sc)->sc_get_qmap)((_sc))) +#define rtwn_set_desc_addr(_sc) \ + (((_sc)->sc_set_desc_addr)((_sc))) +#define rtwn_drop_incorrect_tx(_sc) \ + (((_sc)->sc_drop_incorrect_tx)((_sc))) +#define rtwn_beacon_update_begin(_sc, _vap) \ + (((_sc)->sc_beacon_update_begin)((_sc), (_vap))) +#define rtwn_beacon_update_end(_sc, _vap) \ + (((_sc)->sc_beacon_update_end)((_sc), (_vap))) +#define rtwn_beacon_unload(_sc, _id) \ + (((_sc)->sc_beacon_unload)((_sc), (_id))) + +/* Aliases. */ +#define rtwn_bb_write rtwn_write_4 +#define rtwn_bb_read rtwn_read_4 +#define rtwn_bb_setbits rtwn_setbits_4 + +/* Device-specific. */ +#define rtwn_rf_read(_sc, _chain, _addr) \ + (((_sc)->sc_rf_read)((_sc), (_chain), (_addr))) +#define rtwn_rf_write(_sc, _chain, _addr, _val) \ + (((_sc)->sc_rf_write)((_sc), (_chain), (_addr), (_val))) +#define rtwn_check_condition(_sc, _cond) \ + (((_sc)->sc_check_condition)((_sc), (_cond))) +#define rtwn_efuse_postread(_sc) \ + (((_sc)->sc_efuse_postread)((_sc))) +#define rtwn_parse_rom(_sc, _rom) \ + (((_sc)->sc_parse_rom)((_sc), (_rom))) +#define rtwn_set_led(_sc, _led, _on) \ + (((_sc)->sc_set_led)((_sc), (_led), (_on))) +#define rtwn_get_rssi_cck(_sc, _physt) \ + (((_sc)->sc_get_rssi_cck)((_sc), (_physt))) +#define rtwn_get_rssi_ofdm(_sc, _physt) \ + (((_sc)->sc_get_rssi_ofdm)((_sc), (_physt))) +#define rtwn_power_on(_sc) \ + (((_sc)->sc_power_on)((_sc))) +#define rtwn_power_off(_sc) \ + (((_sc)->sc_power_off)((_sc))) +#ifndef RTWN_WITHOUT_UCODE +#define rtwn_fw_reset(_sc, _reason) \ + (((_sc)->sc_fw_reset)((_sc), (_reason))) +#define rtwn_fw_download_enable(_sc, _enable) \ + (((_sc)->sc_fw_download_enable)((_sc), (_enable))) +#endif +#define rtwn_set_page_size(_sc) \ + (((_sc)->sc_set_page_size)((_sc))) +#define rtwn_lc_calib(_sc) \ + (((_sc)->sc_lc_calib)((_sc))) +#define rtwn_iq_calib(_sc) \ + (((_sc)->sc_iq_calib)((_sc))) +#define rtwn_read_chipid_vendor(_sc, _reg) \ + (((_sc)->sc_read_chipid_vendor)((_sc), (_reg))) +#define rtwn_adj_devcaps(_sc) \ + (((_sc)->sc_adj_devcaps)((_sc))) +#define rtwn_vap_preattach(_sc, _vap) \ + (((_sc)->sc_vap_preattach)((_sc), (_vap))) +#define rtwn_postattach(_sc) \ + (((_sc)->sc_postattach)((_sc))) +#define rtwn_detach_private(_sc) \ + (((_sc)->sc_detach_private)((_sc))) +#define rtwn_fill_tx_desc(_sc, _ni, _m, \ + _buf, _ridx, _maxretry) \ + (((_sc)->sc_fill_tx_desc)((_sc), (_ni), \ + (_m), (_buf), (_ridx), (_maxretry))) +#define rtwn_fill_tx_desc_raw(_sc, _ni, _m, \ + _buf, _params) \ + (((_sc)->sc_fill_tx_desc_raw)((_sc), (_ni), \ + (_m), (_buf), (_params))) +#define rtwn_fill_tx_desc_null(_sc, _buf, _11b, _qos, _id) \ + (((_sc)->sc_fill_tx_desc_null)((_sc), \ + (_buf), (_11b), (_qos), (_id))) +#define rtwn_dump_tx_desc(_sc, _desc) \ + (((_sc)->sc_dump_tx_desc)((_sc), (_desc))) +#define rtwn_tx_radiotap_flags(_sc, _buf) \ + (((_sc)->sc_tx_radiotap_flags)((_buf))) +#define rtwn_rx_radiotap_flags(_sc, _buf) \ + (((_sc)->sc_rx_radiotap_flags)((_buf))) +#define rtwn_set_chan(_sc, _c) \ + (((_sc)->sc_set_chan)((_sc), (_c))) +#ifndef RTWN_WITHOUT_UCODE +#define rtwn_set_rsvd_page(_sc, _resp, _null, _qos_null) \ + (((_sc)->sc_set_rsvd_page)((_sc), \ + (_resp), (_null), (_qos_null))) +#define rtwn_set_pwrmode(_sc, _vap, _off) \ + (((_sc)->sc_set_pwrmode)((_sc), (_vap), (_off))) +#define rtwn_set_rssi(_sc) \ + (((_sc)->sc_set_rssi)((_sc))) +#endif +#define rtwn_classify_intr(_sc, _buf, _len) \ + (((_sc)->sc_classify_intr)((_sc), (_buf), (_len))) +#define rtwn_handle_tx_report(_sc, _buf, _len) \ + (((_sc)->sc_handle_tx_report)((_sc), (_buf), (_len))) +#define rtwn_handle_c2h_report(_sc, _buf, _len) \ + (((_sc)->sc_handle_c2h_report)((_sc), (_buf), (_len))) +#define rtwn_check_frame(_sc, _m) \ + (((_sc)->sc_check_frame)((_sc), (_m))) +#define rtwn_beacon_init(_sc, _buf, _id) \ + (((_sc)->sc_beacon_init)((_sc), (_buf), (_id))) +#define rtwn_beacon_enable(_sc, _id, _enable) \ + (((_sc)->sc_beacon_enable)((_sc), (_id), (_enable))) +#define rtwn_beacon_set_rate(_sc, _buf, _is5ghz) \ + (((_sc)->sc_beacon_set_rate)((_buf), (_is5ghz))) +#define rtwn_beacon_select(_sc, _id) \ + (((_sc)->sc_beacon_select)((_sc), (_id))) +#define rtwn_temp_measure(_sc) \ + (((_sc)->sc_temp_measure)((_sc))) +#define rtwn_temp_read(_sc) \ + (((_sc)->sc_temp_read)((_sc))) +#define rtwn_init_tx_agg(_sc) \ + (((_sc)->sc_init_tx_agg)((_sc))) +#define rtwn_init_rx_agg(_sc) \ + (((_sc)->sc_init_rx_agg)((_sc))) +#define rtwn_init_intr(_sc) \ + (((_sc)->sc_init_intr)((_sc))) +#define rtwn_init_ampdu(_sc) \ + (((_sc)->sc_init_ampdu)((_sc))) +#define rtwn_init_edca(_sc) \ + (((_sc)->sc_init_edca)((_sc))) +#define rtwn_init_bb(_sc) \ + (((_sc)->sc_init_bb)((_sc))) +#define rtwn_init_rf(_sc) \ + (((_sc)->sc_init_rf)((_sc))) +#define rtwn_init_antsel(_sc) \ + (((_sc)->sc_init_antsel)((_sc))) +#define rtwn_post_init(_sc) \ + (((_sc)->sc_post_init)((_sc))) +#define rtwn_init_bcnq1_boundary(_sc) \ + (((_sc)->sc_init_bcnq1_boundary)((_sc))) + + +/* + * Methods to access subfields in registers. + */ +static __inline int +rtwn_setbits_1(struct rtwn_softc *sc, uint16_t addr, uint8_t clr, + uint8_t set) +{ + return (rtwn_write_1(sc, addr, + (rtwn_read_1(sc, addr) & ~clr) | set)); +} + +static __inline int +rtwn_setbits_1_shift(struct rtwn_softc *sc, uint16_t addr, uint32_t clr, + uint32_t set, int shift) +{ + return (rtwn_setbits_1(sc, addr + shift, clr >> shift * NBBY, + set >> shift * NBBY)); +} + +static __inline int +rtwn_setbits_2(struct rtwn_softc *sc, uint16_t addr, uint16_t clr, + uint16_t set) +{ + return (rtwn_write_2(sc, addr, + (rtwn_read_2(sc, addr) & ~clr) | set)); +} + +static __inline int +rtwn_setbits_4(struct rtwn_softc *sc, uint16_t addr, uint32_t clr, + uint32_t set) +{ + return (rtwn_write_4(sc, addr, + (rtwn_read_4(sc, addr) & ~clr) | set)); +} + +static __inline void +rtwn_rf_setbits(struct rtwn_softc *sc, int chain, uint8_t addr, + uint32_t clr, uint32_t set) +{ + rtwn_rf_write(sc, chain, addr, + (rtwn_rf_read(sc, chain, addr) & ~clr) | set); +} + +#endif /* IF_RTWNVAR_H */ |