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 uint32_t sc_reg_addr;
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, bool, 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_sta_beacon_enable)(struct rtwn_softc *, int,
334 bool);
335 void (*sc_beacon_set_rate)(void *, int);
336 void (*sc_beacon_select)(struct rtwn_softc *, int);
337 void (*sc_set_chan)(struct rtwn_softc *,
338 struct ieee80211_channel *);
339 void (*sc_set_media_status)(struct rtwn_softc *, int);
340 #ifndef RTWN_WITHOUT_UCODE
341 int (*sc_set_rsvd_page)(struct rtwn_softc *, int, int,
342 int);
343 int (*sc_set_pwrmode)(struct rtwn_softc *,
344 struct ieee80211vap *, int);
345 void (*sc_set_rssi)(struct rtwn_softc *);
346 #endif
347 void (*sc_get_rx_stats)(struct rtwn_softc *,
348 struct ieee80211_rx_stats *, const void *,
349 const void *);
350 int8_t (*sc_get_rssi_cck)(struct rtwn_softc *, void *);
351 int8_t (*sc_get_rssi_ofdm)(struct rtwn_softc *, void *);
352 int (*sc_classify_intr)(struct rtwn_softc *, void *, int);
353 void (*sc_handle_tx_report)(struct rtwn_softc *, uint8_t *,
354 int);
355 void (*sc_handle_tx_report2)(struct rtwn_softc *, uint8_t *,
356 int);
357 void (*sc_handle_c2h_report)(struct rtwn_softc *,
358 uint8_t *, int);
359 int (*sc_check_frame)(struct rtwn_softc *, struct mbuf *);
360 void (*sc_temp_measure)(struct rtwn_softc *);
361 uint8_t (*sc_temp_read)(struct rtwn_softc *);
362 void (*sc_init_tx_agg)(struct rtwn_softc *);
363 void (*sc_init_rx_agg)(struct rtwn_softc *);
364 void (*sc_init_intr)(struct rtwn_softc *);
365 void (*sc_init_ampdu)(struct rtwn_softc *);
366 void (*sc_init_edca)(struct rtwn_softc *);
367 void (*sc_init_bb)(struct rtwn_softc *);
368 void (*sc_init_rf)(struct rtwn_softc *);
369 void (*sc_init_antsel)(struct rtwn_softc *);
370 void (*sc_post_init)(struct rtwn_softc *);
371 int (*sc_init_bcnq1_boundary)(struct rtwn_softc *);
372 int (*sc_set_tx_power)(struct rtwn_softc *,
373 struct ieee80211vap *);
374
375 const uint8_t *chan_list_5ghz[3];
376 int chan_num_5ghz[3];
377
378 const struct rtwn_mac_prog *mac_prog;
379 int mac_size;
380 const struct rtwn_bb_prog *bb_prog;
381 int bb_size;
382 const struct rtwn_agc_prog *agc_prog;
383 int agc_size;
384 const struct rtwn_rf_prog *rf_prog;
385
386 int page_count;
387 int pktbuf_count;
388
389 int ackto;
390
391 int npubqpages;
392 int nhqpages;
393 int nnqpages;
394 int nlqpages;
395 int page_size;
396
397 int txdesc_len;
398 int efuse_maxlen;
399 int efuse_maplen;
400
401 uint16_t rx_dma_size;
402
403 int macid_limit;
404 int macid_rpt2_max_num;
405 int cam_entry_limit;
406 int fwsize_limit;
407 int temp_delta;
408
409 uint16_t bcn_status_reg[RTWN_PORT_COUNT];
410 uint32_t rcr; /* Rx filter */
411 };
412 MALLOC_DECLARE(M_RTWN_PRIV);
413
414 #define RTWN_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
415 #define RTWN_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
416 #define RTWN_ASSERT_LOCKED(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED)
417
418 #define RTWN_CMDQ_LOCK_INIT(sc) \
419 mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF)
420 #define RTWN_CMDQ_LOCK(sc) mtx_lock(&(sc)->cmdq_mtx)
421 #define RTWN_CMDQ_UNLOCK(sc) mtx_unlock(&(sc)->cmdq_mtx)
422 #define RTWN_CMDQ_LOCK_INITIALIZED(sc) mtx_initialized(&(sc)->cmdq_mtx)
423 #define RTWN_CMDQ_LOCK_DESTROY(sc) mtx_destroy(&(sc)->cmdq_mtx)
424
425 #define RTWN_NT_LOCK_INIT(sc) \
426 mtx_init(&(sc)->nt_mtx, "node table lock", NULL, MTX_DEF)
427 #define RTWN_NT_LOCK(sc) mtx_lock(&(sc)->nt_mtx)
428 #define RTWN_NT_UNLOCK(sc) mtx_unlock(&(sc)->nt_mtx)
429 #define RTWN_NT_LOCK_INITIALIZED(sc) mtx_initialized(&(sc)->nt_mtx)
430 #define RTWN_NT_LOCK_DESTROY(sc) mtx_destroy(&(sc)->nt_mtx)
431
432 void rtwn_sysctlattach(struct rtwn_softc *);
433
434 int rtwn_attach(struct rtwn_softc *);
435 void rtwn_detach(struct rtwn_softc *);
436 void rtwn_resume(struct rtwn_softc *);
437 void rtwn_suspend(struct rtwn_softc *);
438
439 void rtwn_attach_vht_cap_info_mcs(struct rtwn_softc *);
440
441 /* Interface-specific. */
442 #define rtwn_write_1(_sc, _addr, _val) \
443 (((_sc)->sc_write_1)((_sc), (_addr), (_val)))
444 #define rtwn_write_2(_sc, _addr, _val) \
445 (((_sc)->sc_write_2)((_sc), (_addr), (_val)))
446 #define rtwn_write_4(_sc, _addr, _val) \
447 (((_sc)->sc_write_4)((_sc), (_addr), (_val)))
448 #define rtwn_read_1(_sc, _addr) \
449 (((_sc)->sc_read_1)((_sc), (_addr)))
450 #define rtwn_read_2(_sc, _addr) \
451 (((_sc)->sc_read_2)((_sc), (_addr)))
452 #define rtwn_read_4(_sc, _addr) \
453 (((_sc)->sc_read_4)((_sc), (_addr)))
454 #define rtwn_delay(_sc, _usec) \
455 (((_sc)->sc_delay)((_sc), (_usec)))
456 #define rtwn_tx_start(_sc, _ni, _m, _desc, _type, _id) \
457 (((_sc)->sc_tx_start)((_sc), (_ni), (_m), (_desc), (_type), (_id)))
458 #define rtwn_start_xfers(_sc) \
459 (((_sc)->sc_start_xfers)((_sc)))
460 #define rtwn_reset_lists(_sc, _vap) \
461 (((_sc)->sc_reset_lists)((_sc), (_vap)))
462 #define rtwn_abort_xfers(_sc) \
463 (((_sc)->sc_abort_xfers)((_sc)))
464 #define rtwn_fw_write_block(_sc, _buf, _reg, _len) \
465 (((_sc)->sc_fw_write_block)((_sc), (_buf), (_reg), (_len)))
466 #define rtwn_get_qmap(_sc) \
467 (((_sc)->sc_get_qmap)((_sc)))
468 #define rtwn_set_desc_addr(_sc) \
469 (((_sc)->sc_set_desc_addr)((_sc)))
470 #define rtwn_drop_incorrect_tx(_sc) \
471 (((_sc)->sc_drop_incorrect_tx)((_sc)))
472 #define rtwn_beacon_update_begin(_sc, _vap) \
473 (((_sc)->sc_beacon_update_begin)((_sc), (_vap)))
474 #define rtwn_beacon_update_end(_sc, _vap) \
475 (((_sc)->sc_beacon_update_end)((_sc), (_vap)))
476 #define rtwn_beacon_unload(_sc, _id) \
477 (((_sc)->sc_beacon_unload)((_sc), (_id)))
478
479 /* Aliases. */
480 #define rtwn_bb_write rtwn_write_4
481 #define rtwn_bb_read rtwn_read_4
482 #define rtwn_bb_setbits rtwn_setbits_4
483
484 /* Device-specific. */
485 #define rtwn_rf_read(_sc, _chain, _addr) \
486 (((_sc)->sc_rf_read)((_sc), (_chain), (_addr)))
487 #define rtwn_rf_write(_sc, _chain, _addr, _val) \
488 (((_sc)->sc_rf_write)((_sc), (_chain), (_addr), (_val)))
489 #define rtwn_check_condition(_sc, _cond) \
490 (((_sc)->sc_check_condition)((_sc), (_cond)))
491 #define rtwn_efuse_postread(_sc) \
492 (((_sc)->sc_efuse_postread)((_sc)))
493 #define rtwn_parse_rom(_sc, _rom) \
494 (((_sc)->sc_parse_rom)((_sc), (_rom)))
495 #define rtwn_set_led(_sc, _led, _on) \
496 (((_sc)->sc_set_led)((_sc), (_led), (_on)))
497 #define rtwn_get_rx_stats(_sc, _rxs, _desc, _physt) \
498 (((_sc)->sc_get_rx_stats((_sc), (_rxs), (_desc), (_physt))))
499 #define rtwn_get_rssi_cck(_sc, _physt) \
500 (((_sc)->sc_get_rssi_cck)((_sc), (_physt)))
501 #define rtwn_get_rssi_ofdm(_sc, _physt) \
502 (((_sc)->sc_get_rssi_ofdm)((_sc), (_physt)))
503 #define rtwn_power_on(_sc) \
504 (((_sc)->sc_power_on)((_sc)))
505 #define rtwn_power_off(_sc) \
506 (((_sc)->sc_power_off)((_sc)))
507 #ifndef RTWN_WITHOUT_UCODE
508 #define rtwn_fw_reset(_sc, _reason) \
509 (((_sc)->sc_fw_reset)((_sc), (_reason)))
510 #define rtwn_fw_download_enable(_sc, _enable) \
511 (((_sc)->sc_fw_download_enable)((_sc), (_enable)))
512 #endif
513 #define rtwn_llt_init(_sc) \
514 (((_sc)->sc_llt_init)((_sc)))
515 #define rtwn_set_page_size(_sc) \
516 (((_sc)->sc_set_page_size)((_sc)))
517 #define rtwn_lc_calib(_sc) \
518 (((_sc)->sc_lc_calib)((_sc)))
519 #define rtwn_iq_calib(_sc) \
520 (((_sc)->sc_iq_calib)((_sc)))
521 #define rtwn_read_chipid_vendor(_sc, _reg) \
522 (((_sc)->sc_read_chipid_vendor)((_sc), (_reg)))
523 #define rtwn_adj_devcaps(_sc) \
524 (((_sc)->sc_adj_devcaps)((_sc)))
525 #define rtwn_vap_preattach(_sc, _vap) \
526 (((_sc)->sc_vap_preattach)((_sc), (_vap)))
527 #define rtwn_postattach(_sc) \
528 (((_sc)->sc_postattach)((_sc)))
529 #define rtwn_detach_private(_sc) \
530 (((_sc)->sc_detach_private)((_sc)))
531 #define rtwn_fill_tx_desc(_sc, _ni, _m, \
532 _buf, _ridx, _force, _maxretry) \
533 (((_sc)->sc_fill_tx_desc)((_sc), (_ni), \
534 (_m), (_buf), (_ridx), (_force), (_maxretry)))
535 #define rtwn_fill_tx_desc_raw(_sc, _ni, _m, \
536 _buf, _params) \
537 (((_sc)->sc_fill_tx_desc_raw)((_sc), (_ni), \
538 (_m), (_buf), (_params)))
539 #define rtwn_fill_tx_desc_null(_sc, _buf, _11b, _qos, _id) \
540 (((_sc)->sc_fill_tx_desc_null)((_sc), \
541 (_buf), (_11b), (_qos), (_id)))
542 #define rtwn_dump_tx_desc(_sc, _desc) \
543 (((_sc)->sc_dump_tx_desc)((_sc), (_desc)))
544 #define rtwn_tx_radiotap_flags(_sc, _buf) \
545 (((_sc)->sc_tx_radiotap_flags)((_buf)))
546 #define rtwn_rx_radiotap_flags(_sc, _buf) \
547 (((_sc)->sc_rx_radiotap_flags)((_buf)))
548 #define rtwn_set_chan(_sc, _c) \
549 (((_sc)->sc_set_chan)((_sc), (_c)))
550 #ifndef RTWN_WITHOUT_UCODE
551 #define rtwn_set_rsvd_page(_sc, _resp, _null, _qos_null) \
552 (((_sc)->sc_set_rsvd_page)((_sc), \
553 (_resp), (_null), (_qos_null)))
554 #define rtwn_set_pwrmode(_sc, _vap, _off) \
555 (((_sc)->sc_set_pwrmode)((_sc), (_vap), (_off)))
556 #define rtwn_set_rssi(_sc) \
557 (((_sc)->sc_set_rssi)((_sc)))
558 #endif
559 #define rtwn_classify_intr(_sc, _buf, _len) \
560 (((_sc)->sc_classify_intr)((_sc), (_buf), (_len)))
561 #define rtwn_handle_tx_report(_sc, _buf, _len) \
562 (((_sc)->sc_handle_tx_report)((_sc), (_buf), (_len)))
563 #define rtwn_handle_tx_report2(_sc, _buf, _len) \
564 (((_sc)->sc_handle_tx_report2)((_sc), (_buf), (_len)))
565 #define rtwn_handle_c2h_report(_sc, _buf, _len) \
566 (((_sc)->sc_handle_c2h_report)((_sc), (_buf), (_len)))
567 #define rtwn_check_frame(_sc, _m) \
568 (((_sc)->sc_check_frame)((_sc), (_m)))
569 #define rtwn_beacon_init(_sc, _buf, _id) \
570 (((_sc)->sc_beacon_init)((_sc), (_buf), (_id)))
571 #define rtwn_beacon_enable(_sc, _id, _enable) \
572 (((_sc)->sc_beacon_enable)((_sc), (_id), (_enable)))
573 #define rtwn_sta_beacon_enable(_sc, _id, _enable) \
574 (((_sc)->sc_sta_beacon_enable)((_sc), (_id), (_enable)))
575 #define rtwn_beacon_set_rate(_sc, _buf, _is5ghz) \
576 (((_sc)->sc_beacon_set_rate)((_buf), (_is5ghz)))
577 #define rtwn_beacon_select(_sc, _id) \
578 (((_sc)->sc_beacon_select)((_sc), (_id)))
579 #define rtwn_temp_measure(_sc) \
580 (((_sc)->sc_temp_measure)((_sc)))
581 #define rtwn_temp_read(_sc) \
582 (((_sc)->sc_temp_read)((_sc)))
583 #define rtwn_init_tx_agg(_sc) \
584 (((_sc)->sc_init_tx_agg)((_sc)))
585 #define rtwn_init_rx_agg(_sc) \
586 (((_sc)->sc_init_rx_agg)((_sc)))
587 #define rtwn_init_intr(_sc) \
588 (((_sc)->sc_init_intr)((_sc)))
589 #define rtwn_init_ampdu(_sc) \
590 (((_sc)->sc_init_ampdu)((_sc)))
591 #define rtwn_init_edca(_sc) \
592 (((_sc)->sc_init_edca)((_sc)))
593 #define rtwn_init_bb(_sc) \
594 (((_sc)->sc_init_bb)((_sc)))
595 #define rtwn_init_rf(_sc) \
596 (((_sc)->sc_init_rf)((_sc)))
597 #define rtwn_init_antsel(_sc) \
598 (((_sc)->sc_init_antsel)((_sc)))
599 #define rtwn_post_init(_sc) \
600 (((_sc)->sc_post_init)((_sc)))
601 #define rtwn_init_bcnq1_boundary(_sc) \
602 (((_sc)->sc_init_bcnq1_boundary)((_sc)))
603 #define rtwn_set_tx_power(_sc, _vap) \
604 (((_sc)->sc_set_tx_power)((_sc), (_vap)))
605
606 /*
607 * Methods to access subfields in registers.
608 */
609 static __inline int
rtwn_setbits_1(struct rtwn_softc * sc,uint16_t addr,uint8_t clr,uint8_t set)610 rtwn_setbits_1(struct rtwn_softc *sc, uint16_t addr, uint8_t clr,
611 uint8_t set)
612 {
613 return (rtwn_write_1(sc, addr,
614 (rtwn_read_1(sc, addr) & ~clr) | set));
615 }
616
617 static __inline int
rtwn_setbits_1_shift(struct rtwn_softc * sc,uint16_t addr,uint32_t clr,uint32_t set,int shift)618 rtwn_setbits_1_shift(struct rtwn_softc *sc, uint16_t addr, uint32_t clr,
619 uint32_t set, int shift)
620 {
621 return (rtwn_setbits_1(sc, addr + shift, clr >> shift * NBBY,
622 set >> shift * NBBY));
623 }
624
625 static __inline int
rtwn_setbits_2(struct rtwn_softc * sc,uint16_t addr,uint16_t clr,uint16_t set)626 rtwn_setbits_2(struct rtwn_softc *sc, uint16_t addr, uint16_t clr,
627 uint16_t set)
628 {
629 return (rtwn_write_2(sc, addr,
630 (rtwn_read_2(sc, addr) & ~clr) | set));
631 }
632
633 static __inline int
rtwn_setbits_4(struct rtwn_softc * sc,uint16_t addr,uint32_t clr,uint32_t set)634 rtwn_setbits_4(struct rtwn_softc *sc, uint16_t addr, uint32_t clr,
635 uint32_t set)
636 {
637 return (rtwn_write_4(sc, addr,
638 (rtwn_read_4(sc, addr) & ~clr) | set));
639 }
640
641 static __inline void
rtwn_rf_setbits(struct rtwn_softc * sc,int chain,uint8_t addr,uint32_t clr,uint32_t set)642 rtwn_rf_setbits(struct rtwn_softc *sc, int chain, uint8_t addr,
643 uint32_t clr, uint32_t set)
644 {
645 rtwn_rf_write(sc, chain, addr,
646 (rtwn_rf_read(sc, chain, addr) & ~clr) | set);
647 }
648
649 #endif /* IF_RTWNVAR_H */
650