1 /* $NetBSD: athnvar.h,v 1.8 2019/10/05 23:27:20 mrg Exp $ */ 2 /* $OpenBSD: athnvar.h,v 1.34 2013/10/21 16:13:49 stsp Exp $ */ 3 4 /*- 5 * Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #ifndef _ATHNVAR_H_ 21 #define _ATHNVAR_H_ 22 23 #ifdef _KERNEL_OPT 24 #include "opt_athn.h" 25 #endif 26 27 #define PUBLIC 28 29 #define IEEE80211_NO_HT /* XXX: porting artifact */ 30 31 #ifdef notyet 32 #define ATHN_BT_COEXISTENCE 1 33 #endif 34 35 #define ATHN_SOFTC(sc) ((struct athn_softc *)(sc)) 36 #define ATHN_NODE(ni) ((struct athn_node *)(ni)) 37 38 #ifdef ATHN_DEBUG 39 #define DBG_INIT __BIT(0) 40 #define DBG_FN __BIT(1) 41 #define DBG_TX __BIT(2) 42 #define DBG_RX __BIT(3) 43 #define DBG_STM __BIT(4) 44 #define DBG_RF __BIT(5) 45 #define DBG_NODES __BIT(6) 46 #define DBG_INTR __BIT(7) 47 #define DBG_ALL 0xffffffffU 48 #define DPRINTFN(n, s, ...) do { \ 49 if (athn_debug & (n)) { \ 50 printf("%s: %s: ", \ 51 device_xname(ATHN_SOFTC(s)->sc_dev), __func__); \ 52 printf(__VA_ARGS__); \ 53 } \ 54 } while (0) 55 extern int athn_debug; 56 #else /* ATHN_DEBUG */ 57 #define DPRINTFN(n, s, ...) 58 #endif /* ATHN_DEBUG */ 59 60 #define LE_READ_4(p) ((p)[0] | (p)[1] << 8 | (p)[2] << 16 | (p)[3] << 24) 61 #define LE_READ_2(p) ((p)[0] | (p)[1] << 8) 62 63 #define ATHN_RXBUFSZ 3872 64 #define ATHN_TXBUFSZ 4096 65 66 #define ATHN_NRXBUFS 64 67 #define ATHN_NTXBUFS 64 /* Shared between all Tx queues. */ 68 69 struct athn_rx_radiotap_header { 70 struct ieee80211_radiotap_header wr_ihdr; 71 uint64_t wr_tsft; 72 uint8_t wr_flags; 73 uint8_t wr_rate; 74 uint16_t wr_chan_freq; 75 uint16_t wr_chan_flags; 76 int8_t wr_dbm_antsignal; 77 uint8_t wr_antenna; 78 }; 79 80 #define ATHN_RX_RADIOTAP_PRESENT \ 81 (1 << IEEE80211_RADIOTAP_TSFT | \ 82 1 << IEEE80211_RADIOTAP_FLAGS | \ 83 1 << IEEE80211_RADIOTAP_RATE | \ 84 1 << IEEE80211_RADIOTAP_CHANNEL | \ 85 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL | \ 86 1 << IEEE80211_RADIOTAP_ANTENNA) 87 88 struct athn_tx_radiotap_header { 89 struct ieee80211_radiotap_header wt_ihdr; 90 uint8_t wt_flags; 91 uint8_t wt_rate; 92 uint16_t wt_chan_freq; 93 uint16_t wt_chan_flags; 94 }; 95 96 #define ATHN_TX_RADIOTAP_PRESENT \ 97 (1 << IEEE80211_RADIOTAP_FLAGS | \ 98 1 << IEEE80211_RADIOTAP_RATE | \ 99 1 << IEEE80211_RADIOTAP_CHANNEL) 100 101 struct athn_tx_buf { 102 SIMPLEQ_ENTRY(athn_tx_buf) bf_list; 103 104 void *bf_descs; 105 bus_dmamap_t bf_map; 106 bus_addr_t bf_daddr; 107 108 struct mbuf *bf_m; 109 struct ieee80211_node *bf_ni; 110 int bf_txflags; 111 #define ATHN_TXFLAG_PAPRD (1 << 0) 112 #define ATHN_TXFLAG_CAB (1 << 1) 113 }; 114 115 struct athn_txq { 116 SIMPLEQ_HEAD(, athn_tx_buf) head; 117 void *lastds; 118 struct athn_tx_buf *wait; 119 int queued; 120 }; 121 122 struct athn_rx_buf { 123 SIMPLEQ_ENTRY(athn_rx_buf) bf_list; 124 125 void *bf_desc; 126 bus_dmamap_t bf_map; 127 128 struct mbuf *bf_m; 129 bus_addr_t bf_daddr; 130 }; 131 132 struct athn_rxq { 133 struct athn_rx_buf *bf; 134 135 void *descs; 136 void *lastds; 137 bus_dmamap_t map; 138 bus_dma_segment_t seg; 139 int count; 140 141 SIMPLEQ_HEAD(, athn_rx_buf) head; 142 }; 143 144 /* Software rate indexes. */ 145 #define ATHN_RIDX_CCK1 0 146 #define ATHN_RIDX_CCK2 1 147 #define ATHN_RIDX_OFDM6 4 148 #define ATHN_RIDX_MCS0 12 149 #define ATHN_RIDX_MCS15 27 150 #define ATHN_RIDX_MAX 27 151 #define ATHN_IS_HT_RIDX(ridx) ((ridx) >= ATHN_RIDX_MCS0) 152 153 static const struct athn_rate { 154 uint8_t rate; /* Rate in 500Kbps unit or MCS if 0x80. */ 155 uint8_t hwrate; /* HW representation. */ 156 uint8_t rspridx; /* Control Response Frame rate index. */ 157 enum ieee80211_phytype phy; 158 } athn_rates[] = { 159 { 2, 0x1b, 0, IEEE80211_T_DS }, 160 { 4, 0x1a, 1, IEEE80211_T_DS }, 161 { 11, 0x19, 1, IEEE80211_T_DS }, 162 { 22, 0x18, 1, IEEE80211_T_DS }, 163 { 12, 0x0b, 4, IEEE80211_T_OFDM }, 164 { 18, 0x0f, 4, IEEE80211_T_OFDM }, 165 { 24, 0x0a, 6, IEEE80211_T_OFDM }, 166 { 36, 0x0e, 6, IEEE80211_T_OFDM }, 167 { 48, 0x09, 8, IEEE80211_T_OFDM }, 168 { 72, 0x0d, 8, IEEE80211_T_OFDM }, 169 { 96, 0x08, 8, IEEE80211_T_OFDM }, 170 { 108, 0x0c, 8, IEEE80211_T_OFDM }, 171 { 0x80, 0x80, 8, IEEE80211_T_OFDM }, 172 { 0x81, 0x81, 8, IEEE80211_T_OFDM }, 173 { 0x82, 0x82, 8, IEEE80211_T_OFDM }, 174 { 0x83, 0x83, 8, IEEE80211_T_OFDM }, 175 { 0x84, 0x84, 8, IEEE80211_T_OFDM }, 176 { 0x85, 0x85, 8, IEEE80211_T_OFDM }, 177 { 0x86, 0x86, 8, IEEE80211_T_OFDM }, 178 { 0x87, 0x87, 8, IEEE80211_T_OFDM }, 179 { 0x88, 0x88, 8, IEEE80211_T_OFDM }, 180 { 0x89, 0x89, 8, IEEE80211_T_OFDM }, 181 { 0x8a, 0x8a, 8, IEEE80211_T_OFDM }, 182 { 0x8b, 0x8b, 8, IEEE80211_T_OFDM }, 183 { 0x8c, 0x8c, 8, IEEE80211_T_OFDM }, 184 { 0x8d, 0x8d, 8, IEEE80211_T_OFDM }, 185 { 0x8e, 0x8e, 8, IEEE80211_T_OFDM }, 186 { 0x8f, 0x8f, 8, IEEE80211_T_OFDM } 187 }; 188 189 struct athn_series { 190 uint16_t dur; 191 uint8_t hwrate; 192 }; 193 194 struct athn_pier { 195 uint8_t fbin; 196 const uint8_t *pwr[AR_PD_GAINS_IN_MASK]; 197 const uint8_t *vpd[AR_PD_GAINS_IN_MASK]; 198 }; 199 200 /* 201 * Structures used to store initialization values. 202 */ 203 struct athn_ini { 204 int nregs; 205 const uint16_t *regs; 206 const uint32_t *vals_5g20; 207 #ifndef IEEE80211_NO_HT 208 const uint32_t *vals_5g40; 209 const uint32_t *vals_2g40; 210 #endif 211 const uint32_t *vals_2g20; 212 int ncmregs; 213 const uint16_t *cmregs; 214 const uint32_t *cmvals; 215 int nfastregs; 216 const uint16_t *fastregs; 217 const uint32_t *fastvals_5g20; 218 #ifndef IEEE80211_NO_HT 219 const uint32_t *fastvals_5g40; 220 #endif 221 }; 222 223 struct athn_gain { 224 int nregs; 225 const uint16_t *regs; 226 const uint32_t *vals_5g; 227 const uint32_t *vals_2g; 228 }; 229 230 struct athn_addac { 231 int nvals; 232 const uint32_t *vals; 233 }; 234 235 struct athn_serdes { 236 int nvals; 237 const uint32_t *regs; 238 const uint32_t *vals; 239 }; 240 241 /* Rx queue software indexes. */ 242 #define ATHN_QID_LP 0 243 #define ATHN_QID_HP 1 244 245 /* Tx queue software indexes. */ 246 #define ATHN_QID_AC_BE 0 247 #define ATHN_QID_PSPOLL 1 248 #define ATHN_QID_AC_BK 2 249 #define ATHN_QID_AC_VI 3 250 #define ATHN_QID_AC_VO 4 251 #define ATHN_QID_UAPSD 5 252 #define ATHN_QID_CAB 6 253 #define ATHN_QID_BEACON 7 254 #define ATHN_QID_COUNT 8 255 256 /* Map Access Category to Tx queue Id. */ 257 static const uint8_t athn_ac2qid[WME_NUM_AC] = { 258 ATHN_QID_AC_BE, /* WME_AC_BE */ 259 ATHN_QID_AC_BK, /* WME_AC_BK */ 260 ATHN_QID_AC_VI, /* WME_AC_VI */ 261 ATHN_QID_AC_VO /* WME_AC_VO */ 262 }; 263 264 static const uint8_t athn_5ghz_chans[] = { 265 /* UNII 1. */ 266 36, 40, 44, 48, 267 /* UNII 2. */ 268 52, 56, 60, 64, 269 /* Middle band. */ 270 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 271 /* UNII 3. */ 272 149, 153, 157, 161, 165 273 }; 274 275 /* Number of data bits per OFDM symbol for MCS[0-15]. */ 276 /* See tables 20-29, 20-30, 20-33, 20-34. */ 277 static const uint16_t ar_mcs_ndbps[][2] = { 278 /* 20MHz 40MHz */ 279 { 26, 54 }, /* MCS0 */ 280 { 52, 108 }, /* MCS1 */ 281 { 78, 162 }, /* MCS2 */ 282 { 104, 216 }, /* MCS3 */ 283 { 156, 324 }, /* MCS4 */ 284 { 208, 432 }, /* MCS5 */ 285 { 234, 486 }, /* MCS6 */ 286 { 260, 540 }, /* MCS7 */ 287 { 26, 108 }, /* MCS8 */ 288 { 52, 216 }, /* MCS9 */ 289 { 78, 324 }, /* MCS10 */ 290 { 104, 432 }, /* MCS11 */ 291 { 156, 648 }, /* MCS12 */ 292 { 208, 864 }, /* MCS13 */ 293 { 234, 972 }, /* MCS14 */ 294 { 260, 1080 } /* MCS15 */ 295 }; 296 297 #define ATHN_POWER_OFDM6 0 298 #define ATHN_POWER_OFDM9 1 299 #define ATHN_POWER_OFDM12 2 300 #define ATHN_POWER_OFDM18 3 301 #define ATHN_POWER_OFDM24 4 302 #define ATHN_POWER_OFDM36 5 303 #define ATHN_POWER_OFDM48 6 304 #define ATHN_POWER_OFDM54 7 305 #define ATHN_POWER_CCK1_LP 8 306 #define ATHN_POWER_CCK2_LP 9 307 #define ATHN_POWER_CCK2_SP 10 308 #define ATHN_POWER_CCK55_LP 11 309 #define ATHN_POWER_CCK55_SP 12 310 #define ATHN_POWER_CCK11_LP 13 311 #define ATHN_POWER_CCK11_SP 14 312 #define ATHN_POWER_XR 15 313 #define ATHN_POWER_HT20(mcs) (16 + (mcs)) 314 #define ATHN_POWER_HT40(mcs) (40 + (mcs)) 315 #define ATHN_POWER_CCK_DUP 64 316 #define ATHN_POWER_OFDM_DUP 65 317 #define ATHN_POWER_CCK_EXT 66 318 #define ATHN_POWER_OFDM_EXT 67 319 #define ATHN_POWER_COUNT 68 320 321 struct athn_node { 322 struct ieee80211_node ni; 323 struct ieee80211_amrr_node amn; 324 uint8_t ridx[IEEE80211_RATE_MAXSIZE]; 325 uint8_t fallback[IEEE80211_RATE_MAXSIZE]; 326 uint8_t sta_index; 327 }; 328 329 /* 330 * Adaptive noise immunity state. 331 */ 332 #define ATHN_ANI_PERIOD 100 333 #define ATHN_ANI_RSSI_THR_HIGH 40 334 #define ATHN_ANI_RSSI_THR_LOW 7 335 struct athn_ani { 336 uint8_t noise_immunity_level; 337 uint8_t spur_immunity_level; 338 uint8_t firstep_level; 339 uint8_t ofdm_weak_signal; 340 uint8_t cck_weak_signal; 341 342 uint32_t listen_time; 343 344 uint32_t ofdm_trig_high; 345 uint32_t ofdm_trig_low; 346 347 int32_t cck_trig_high; 348 int32_t cck_trig_low; 349 350 uint32_t ofdm_phy_err_base; 351 uint32_t cck_phy_err_base; 352 uint32_t ofdm_phy_err_count; 353 uint32_t cck_phy_err_count; 354 355 uint32_t cyccnt; 356 uint32_t txfcnt; 357 uint32_t rxfcnt; 358 }; 359 360 struct athn_iq_cal { 361 uint32_t pwr_meas_i; 362 uint32_t pwr_meas_q; 363 int32_t iq_corr_meas; 364 }; 365 366 struct athn_adc_cal { 367 uint32_t pwr_meas_odd_i; 368 uint32_t pwr_meas_even_i; 369 uint32_t pwr_meas_odd_q; 370 uint32_t pwr_meas_even_q; 371 }; 372 373 struct athn_calib { 374 int nsamples; 375 struct athn_iq_cal iq[AR_MAX_CHAINS]; 376 struct athn_adc_cal adc_gain[AR_MAX_CHAINS]; 377 struct athn_adc_cal adc_dc_offset[AR_MAX_CHAINS]; 378 }; 379 380 #define ATHN_NF_CAL_HIST_MAX 5 381 382 struct athn_softc; 383 384 struct athn_ops { 385 /* Bus callbacks. */ 386 uint32_t (*read)(struct athn_softc *, uint32_t); 387 void (*write)(struct athn_softc *, uint32_t, uint32_t); 388 void (*write_barrier)(struct athn_softc *); 389 390 void (*setup)(struct athn_softc *); 391 void (*set_txpower)(struct athn_softc *, struct ieee80211_channel *, 392 struct ieee80211_channel *); 393 void (*spur_mitigate)(struct athn_softc *, 394 struct ieee80211_channel *, struct ieee80211_channel *); 395 const struct ar_spur_chan * 396 (*get_spur_chans)(struct athn_softc *, int); 397 void (*init_from_rom)(struct athn_softc *, 398 struct ieee80211_channel *, struct ieee80211_channel *); 399 int (*set_synth)(struct athn_softc *, struct ieee80211_channel *, 400 struct ieee80211_channel *); 401 int (*read_rom_data)(struct athn_softc *, uint32_t, void *, int); 402 const uint8_t * 403 (*get_rom_template)(struct athn_softc *, uint8_t); 404 void (*swap_rom)(struct athn_softc *); 405 void (*olpc_init)(struct athn_softc *); 406 void (*olpc_temp_compensation)(struct athn_softc *); 407 408 /* GPIO callbacks. */ 409 int (*gpio_read)(struct athn_softc *, int); 410 void (*gpio_write)(struct athn_softc *, int, int); 411 void (*gpio_config_input)(struct athn_softc *, int); 412 void (*gpio_config_output)(struct athn_softc *, int, int); 413 void (*rfsilent_init)(struct athn_softc *); 414 415 /* DMA callbacks. */ 416 int (*dma_alloc)(struct athn_softc *); 417 void (*dma_free)(struct athn_softc *); 418 void (*rx_enable)(struct athn_softc *); 419 int (*intr_status)(struct athn_softc *); 420 int (*intr)(struct athn_softc *); 421 int (*tx)(struct athn_softc *, struct mbuf *, 422 struct ieee80211_node *, int); 423 424 /* PHY callbacks. */ 425 void (*set_rf_mode)(struct athn_softc *, 426 struct ieee80211_channel *); 427 int (*rf_bus_request)(struct athn_softc *); 428 void (*rf_bus_release)(struct athn_softc *); 429 void (*set_phy)(struct athn_softc *, struct ieee80211_channel *, 430 struct ieee80211_channel *); 431 void (*set_delta_slope)(struct athn_softc *, 432 struct ieee80211_channel *, struct ieee80211_channel *); 433 void (*enable_antenna_diversity)(struct athn_softc *); 434 void (*init_baseband)(struct athn_softc *); 435 void (*disable_phy)(struct athn_softc *); 436 void (*set_rxchains)(struct athn_softc *); 437 void (*noisefloor_calib)(struct athn_softc *); 438 void (*do_calib)(struct athn_softc *); 439 void (*next_calib)(struct athn_softc *); 440 void (*hw_init)(struct athn_softc *, struct ieee80211_channel *, 441 struct ieee80211_channel *); 442 void (*get_paprd_masks)(struct athn_softc *sc, 443 struct ieee80211_channel *, uint32_t *, uint32_t *); 444 445 /* ANI callbacks. */ 446 void (*set_noise_immunity_level)(struct athn_softc *, int); 447 void (*enable_ofdm_weak_signal)(struct athn_softc *); 448 void (*disable_ofdm_weak_signal)(struct athn_softc *); 449 void (*set_cck_weak_signal)(struct athn_softc *, int); 450 void (*set_firstep_level)(struct athn_softc *, int); 451 void (*set_spur_immunity_level)(struct athn_softc *, int); 452 }; 453 454 struct athn_softc { 455 device_t sc_dev; 456 device_suspensor_t sc_suspensor; 457 pmf_qual_t sc_qual; 458 struct ieee80211com sc_ic; 459 struct ethercom sc_ec; 460 #define sc_if sc_ec.ec_if 461 void *sc_soft_ih; 462 463 #if 0 464 int (*sc_enable)(struct athn_softc *); 465 void (*sc_disable)(struct athn_softc *); 466 void (*sc_power)(struct athn_softc *, int); 467 #endif 468 void (*sc_disable_aspm)(struct athn_softc *); 469 void (*sc_enable_extsynch)( 470 struct athn_softc *); 471 472 int (*sc_newstate)(struct ieee80211com *, 473 enum ieee80211_state, int); 474 475 bus_dma_tag_t sc_dmat; 476 477 callout_t sc_scan_to; 478 callout_t sc_calib_to; 479 struct ieee80211_amrr sc_amrr; 480 481 u_int sc_flags; 482 #define ATHN_FLAG_PCIE (1 << 0) 483 #define ATHN_FLAG_USB (1 << 1) 484 #define ATHN_FLAG_OLPC (1 << 2) 485 #define ATHN_FLAG_PAPRD (1 << 3) 486 #define ATHN_FLAG_FAST_PLL_CLOCK (1 << 4) 487 #define ATHN_FLAG_RFSILENT (1 << 5) 488 #define ATHN_FLAG_RFSILENT_REVERSED (1 << 6) 489 #define ATHN_FLAG_BTCOEX2WIRE (1 << 7) 490 #define ATHN_FLAG_BTCOEX3WIRE (1 << 8) 491 /* Shortcut. */ 492 #define ATHN_FLAG_BTCOEX (ATHN_FLAG_BTCOEX2WIRE | ATHN_FLAG_BTCOEX3WIRE) 493 #define ATHN_FLAG_11A (1 << 9) 494 #define ATHN_FLAG_11G (1 << 10) 495 #define ATHN_FLAG_11N (1 << 11) 496 #define ATHN_FLAG_AN_TOP2_FIXUP (1 << 12) 497 #define ATHN_FLAG_NON_ENTERPRISE (1 << 13) 498 #define ATHN_FLAG_3TREDUCE_CHAIN (1 << 14) 499 500 uint8_t sc_ngpiopins; 501 int sc_led_pin; 502 int sc_rfsilent_pin; 503 int sc_led_state; 504 uint32_t sc_isync; 505 uint32_t sc_imask; 506 507 uint16_t sc_mac_ver; 508 uint8_t sc_mac_rev; 509 uint8_t sc_rf_rev; 510 uint16_t sc_eep_rev; 511 512 uint8_t sc_txchainmask; 513 uint8_t sc_rxchainmask; 514 uint8_t sc_ntxchains; 515 uint8_t sc_nrxchains; 516 517 uint8_t sc_sup_calib_mask; 518 uint8_t sc_cur_calib_mask; 519 #define ATHN_CAL_IQ (1 << 0) 520 #define ATHN_CAL_ADC_GAIN (1 << 1) 521 #define ATHN_CAL_ADC_DC (1 << 2) 522 #define ATHN_CAL_TEMP (1 << 3) 523 524 struct ieee80211_channel *sc_curchan; 525 struct ieee80211_channel *sc_curchanext; 526 527 /* Open Loop Power Control. */ 528 int8_t sc_tx_gain_tbl[AR9280_TX_GAIN_TABLE_SIZE]; 529 int8_t sc_pdadc; 530 int8_t sc_tcomp; 531 int sc_olpc_ticks; 532 533 /* PA predistortion. */ 534 uint16_t sc_gain1[AR_MAX_CHAINS]; 535 uint32_t sc_txgain[AR9003_TX_GAIN_TABLE_SIZE]; 536 int16_t sc_pa_in[AR_MAX_CHAINS] 537 [AR9003_PAPRD_MEM_TAB_SIZE]; 538 int16_t sc_angle[AR_MAX_CHAINS] 539 [AR9003_PAPRD_MEM_TAB_SIZE]; 540 int32_t sc_trainpow; 541 uint8_t sc_paprd_curchain; 542 543 uint32_t sc_rwbuf[64]; 544 545 size_t sc_kc_entries; 546 547 void *sc_eep; 548 const void *sc_eep_def; 549 uint32_t sc_eep_base; 550 uint32_t sc_eep_size; 551 552 struct athn_rxq sc_rxq[2]; 553 struct athn_txq sc_txq[31]; 554 555 void *sc_descs; 556 bus_dmamap_t sc_map; 557 bus_dma_segment_t sc_seg; 558 SIMPLEQ_HEAD(, athn_tx_buf) sc_txbufs; 559 struct athn_tx_buf *sc_bcnbuf; 560 struct athn_tx_buf sc_txpool[ATHN_NTXBUFS]; 561 562 bus_dmamap_t sc_txsmap; 563 bus_dma_segment_t sc_txsseg; 564 void *sc_txsring; 565 int sc_txscur; 566 567 u_short sc_if_flags; 568 int sc_tx_timer; 569 570 const struct athn_ini *sc_ini; 571 const struct athn_gain *sc_rx_gain; 572 const struct athn_gain *sc_tx_gain; 573 const struct athn_addac *sc_addac; 574 const struct athn_serdes *sc_serdes; 575 uint32_t sc_workaround; 576 uint32_t sc_obs_off; 577 uint32_t sc_gpio_input_en_off; 578 579 struct athn_ops sc_ops; 580 581 int sc_fixed_ridx; 582 583 int16_t sc_cca_min_2g; 584 int16_t sc_cca_max_2g; 585 int16_t sc_cca_min_5g; 586 int16_t sc_cca_max_5g; 587 int16_t sc_def_nf; 588 struct { 589 int16_t nf[AR_MAX_CHAINS]; 590 int16_t nf_ext[AR_MAX_CHAINS]; 591 } sc_nf_hist[ATHN_NF_CAL_HIST_MAX]; 592 int sc_nf_hist_cur; 593 int16_t sc_nf_priv[AR_MAX_CHAINS]; 594 int16_t sc_nf_ext_priv[AR_MAX_CHAINS]; 595 int sc_pa_calib_ticks; 596 597 struct athn_calib sc_calib; 598 struct athn_ani sc_ani; 599 600 struct bpf_if * sc_drvbpf; 601 602 union { 603 struct athn_rx_radiotap_header th; 604 uint8_t pad[IEEE80211_RADIOTAP_HDRLEN]; 605 } sc_rxtapu; 606 #define sc_rxtap sc_rxtapu.th 607 int sc_rxtap_len; 608 609 union { 610 struct athn_tx_radiotap_header th; 611 uint8_t pad[IEEE80211_RADIOTAP_HDRLEN]; 612 } sc_txtapu; 613 #define sc_txtap sc_txtapu.th 614 int sc_txtap_len; 615 616 /* 617 * Attach overrides. Set before calling athn_attach(). 618 */ 619 int sc_max_aid; 620 int (*sc_media_change)(struct ifnet *); 621 }; 622 623 int athn_attach(struct athn_softc *); 624 void athn_detach(struct athn_softc *); 625 void athn_suspend(struct athn_softc *); 626 bool athn_resume(struct athn_softc *); 627 int athn_intr(void *); 628 629 /* used by if_athn_usb.c */ 630 void athn_btcoex_init(struct athn_softc *); 631 int athn_hw_reset(struct athn_softc *, struct ieee80211_channel *, 632 struct ieee80211_channel *, int); 633 void athn_init_pll(struct athn_softc *, const struct ieee80211_channel *); 634 void athn_led_init(struct athn_softc *); 635 int athn_reset(struct athn_softc *, int); 636 void athn_reset_key(struct athn_softc *, int); 637 void athn_rx_start(struct athn_softc *); 638 void athn_set_bss(struct athn_softc *, struct ieee80211_node *); 639 int athn_set_chan(struct athn_softc *, struct ieee80211_channel *, 640 struct ieee80211_channel *); 641 void athn_set_hostap_timers(struct athn_softc *); 642 void athn_set_led(struct athn_softc *, int); 643 void athn_set_opmode(struct athn_softc *); 644 int athn_set_power_awake(struct athn_softc *); 645 void athn_set_power_sleep(struct athn_softc *); 646 void athn_set_rxfilter(struct athn_softc *, uint32_t); 647 void athn_set_sta_timers(struct athn_softc *); 648 void athn_updateslot(struct ifnet *); 649 650 #ifdef notyet_edca 651 void athn_updateedca(struct ieee80211com *); 652 #endif 653 #ifdef notyet 654 void athn_delete_key(struct ieee80211com *, struct ieee80211_node *, 655 struct ieee80211_key *); 656 int athn_set_key(struct ieee80211com *, struct ieee80211_node *, 657 struct ieee80211_key *); 658 #endif /* notyet */ 659 660 /* used by ar9285.c */ 661 uint8_t athn_chan2fbin(struct ieee80211_channel *); 662 void athn_get_pier_ival(uint8_t, const uint8_t *, int, int *, int *); 663 664 /* used by arn5008.c and arn9003.c */ 665 void athn_config_nonpcie(struct athn_softc *); 666 void athn_config_pcie(struct athn_softc *); 667 void athn_get_delta_slope(uint32_t, uint32_t *, uint32_t *); 668 void athn_inc_tx_trigger_level(struct athn_softc *); 669 void athn_stop(struct ifnet *, int); 670 void athn_stop_tx_dma(struct athn_softc *, int); 671 int athn_tx_pending(struct athn_softc *, int); 672 int athn_txtime(struct athn_softc *, int, int, u_int); 673 674 /* used by arn5008.c, arn9003.c, arn9287.c, and arn9380.c */ 675 int athn_interpolate(int, int, int, int, int); 676 677 #endif /* _ATHNVAR_H_ */ 678