1*10893SQuaker.Fang@Sun.COM /* 2*10893SQuaker.Fang@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 3*10893SQuaker.Fang@Sun.COM * Use is subject to license terms. 4*10893SQuaker.Fang@Sun.COM */ 5*10893SQuaker.Fang@Sun.COM 6*10893SQuaker.Fang@Sun.COM /* 7*10893SQuaker.Fang@Sun.COM * Copyright (c) 2009, Intel Corporation 8*10893SQuaker.Fang@Sun.COM * All rights reserved. 9*10893SQuaker.Fang@Sun.COM */ 10*10893SQuaker.Fang@Sun.COM 11*10893SQuaker.Fang@Sun.COM /* 12*10893SQuaker.Fang@Sun.COM * Copyright (c) 2006 13*10893SQuaker.Fang@Sun.COM * Copyright (c) 2007 14*10893SQuaker.Fang@Sun.COM * Damien Bergamini <damien.bergamini@free.fr> 15*10893SQuaker.Fang@Sun.COM * 16*10893SQuaker.Fang@Sun.COM * Permission to use, copy, modify, and distribute this software for any 17*10893SQuaker.Fang@Sun.COM * purpose with or without fee is hereby granted, provided that the above 18*10893SQuaker.Fang@Sun.COM * copyright notice and this permission notice appear in all copies. 19*10893SQuaker.Fang@Sun.COM * 20*10893SQuaker.Fang@Sun.COM * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 21*10893SQuaker.Fang@Sun.COM * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 22*10893SQuaker.Fang@Sun.COM * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 23*10893SQuaker.Fang@Sun.COM * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 24*10893SQuaker.Fang@Sun.COM * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 25*10893SQuaker.Fang@Sun.COM * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 26*10893SQuaker.Fang@Sun.COM * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 27*10893SQuaker.Fang@Sun.COM */ 28*10893SQuaker.Fang@Sun.COM 29*10893SQuaker.Fang@Sun.COM #ifndef _IWP_VAR_H 30*10893SQuaker.Fang@Sun.COM #define _IWP_VAR_H 31*10893SQuaker.Fang@Sun.COM 32*10893SQuaker.Fang@Sun.COM #ifdef __cplusplus 33*10893SQuaker.Fang@Sun.COM extern "C" { 34*10893SQuaker.Fang@Sun.COM #endif 35*10893SQuaker.Fang@Sun.COM 36*10893SQuaker.Fang@Sun.COM #define IWP_DMA_SYNC(area, flag) \ 37*10893SQuaker.Fang@Sun.COM (void) ddi_dma_sync((area).dma_hdl, (area).offset, \ 38*10893SQuaker.Fang@Sun.COM (area).alength, (flag)) 39*10893SQuaker.Fang@Sun.COM 40*10893SQuaker.Fang@Sun.COM #define IWP_CHK_FAST_RECOVER(sc) \ 41*10893SQuaker.Fang@Sun.COM (sc->sc_ic.ic_state == IEEE80211_S_RUN && \ 42*10893SQuaker.Fang@Sun.COM sc->sc_ic.ic_opmode == IEEE80211_M_STA) 43*10893SQuaker.Fang@Sun.COM 44*10893SQuaker.Fang@Sun.COM typedef struct iwp_dma_area { 45*10893SQuaker.Fang@Sun.COM ddi_acc_handle_t acc_hdl; /* handle for memory */ 46*10893SQuaker.Fang@Sun.COM caddr_t mem_va; /* CPU VA of memory */ 47*10893SQuaker.Fang@Sun.COM uint32_t nslots; /* number of slots */ 48*10893SQuaker.Fang@Sun.COM uint32_t size; /* size per slot */ 49*10893SQuaker.Fang@Sun.COM size_t alength; /* allocated size */ 50*10893SQuaker.Fang@Sun.COM /* >= product of above */ 51*10893SQuaker.Fang@Sun.COM ddi_dma_handle_t dma_hdl; /* DMA handle */ 52*10893SQuaker.Fang@Sun.COM offset_t offset; /* relative to handle */ 53*10893SQuaker.Fang@Sun.COM ddi_dma_cookie_t cookie; /* associated cookie */ 54*10893SQuaker.Fang@Sun.COM uint32_t ncookies; 55*10893SQuaker.Fang@Sun.COM uint32_t token; /* arbitrary identifier */ 56*10893SQuaker.Fang@Sun.COM } iwp_dma_t; 57*10893SQuaker.Fang@Sun.COM 58*10893SQuaker.Fang@Sun.COM typedef struct iwp_tx_data { 59*10893SQuaker.Fang@Sun.COM iwp_dma_t dma_data; /* for sending frames */ 60*10893SQuaker.Fang@Sun.COM iwp_tx_desc_t *desc; 61*10893SQuaker.Fang@Sun.COM uint32_t paddr_desc; 62*10893SQuaker.Fang@Sun.COM iwp_cmd_t *cmd; 63*10893SQuaker.Fang@Sun.COM uint32_t paddr_cmd; 64*10893SQuaker.Fang@Sun.COM } iwp_tx_data_t; 65*10893SQuaker.Fang@Sun.COM 66*10893SQuaker.Fang@Sun.COM typedef struct iwp_tx_ring { 67*10893SQuaker.Fang@Sun.COM iwp_dma_t dma_desc; /* for descriptor itself */ 68*10893SQuaker.Fang@Sun.COM iwp_dma_t dma_cmd; /* for command to ucode */ 69*10893SQuaker.Fang@Sun.COM iwp_tx_data_t *data; 70*10893SQuaker.Fang@Sun.COM int qid; /* ID of queue */ 71*10893SQuaker.Fang@Sun.COM int count; 72*10893SQuaker.Fang@Sun.COM int window; 73*10893SQuaker.Fang@Sun.COM int queued; 74*10893SQuaker.Fang@Sun.COM int cur; 75*10893SQuaker.Fang@Sun.COM int desc_cur; 76*10893SQuaker.Fang@Sun.COM } iwp_tx_ring_t; 77*10893SQuaker.Fang@Sun.COM 78*10893SQuaker.Fang@Sun.COM typedef struct iwp_rx_data { 79*10893SQuaker.Fang@Sun.COM iwp_dma_t dma_data; 80*10893SQuaker.Fang@Sun.COM } iwp_rx_data_t; 81*10893SQuaker.Fang@Sun.COM 82*10893SQuaker.Fang@Sun.COM typedef struct iwp_rx_ring { 83*10893SQuaker.Fang@Sun.COM iwp_dma_t dma_desc; 84*10893SQuaker.Fang@Sun.COM uint32_t *desc; 85*10893SQuaker.Fang@Sun.COM iwp_rx_data_t data[RX_QUEUE_SIZE]; 86*10893SQuaker.Fang@Sun.COM int cur; 87*10893SQuaker.Fang@Sun.COM } iwp_rx_ring_t; 88*10893SQuaker.Fang@Sun.COM 89*10893SQuaker.Fang@Sun.COM 90*10893SQuaker.Fang@Sun.COM typedef struct iwp_amrr { 91*10893SQuaker.Fang@Sun.COM ieee80211_node_t in; 92*10893SQuaker.Fang@Sun.COM uint32_t txcnt; 93*10893SQuaker.Fang@Sun.COM uint32_t retrycnt; 94*10893SQuaker.Fang@Sun.COM uint32_t success; 95*10893SQuaker.Fang@Sun.COM uint32_t success_threshold; 96*10893SQuaker.Fang@Sun.COM int recovery; 97*10893SQuaker.Fang@Sun.COM volatile uint32_t ht_mcs_idx; 98*10893SQuaker.Fang@Sun.COM } iwp_amrr_t; 99*10893SQuaker.Fang@Sun.COM 100*10893SQuaker.Fang@Sun.COM struct iwp_phy_rx { 101*10893SQuaker.Fang@Sun.COM uint8_t flag; 102*10893SQuaker.Fang@Sun.COM uint8_t reserved[3]; 103*10893SQuaker.Fang@Sun.COM uint8_t buf[128]; 104*10893SQuaker.Fang@Sun.COM }; 105*10893SQuaker.Fang@Sun.COM 106*10893SQuaker.Fang@Sun.COM struct iwp_beacon_missed { 107*10893SQuaker.Fang@Sun.COM uint32_t consecutive; 108*10893SQuaker.Fang@Sun.COM uint32_t total; 109*10893SQuaker.Fang@Sun.COM uint32_t expected; 110*10893SQuaker.Fang@Sun.COM uint32_t received; 111*10893SQuaker.Fang@Sun.COM }; 112*10893SQuaker.Fang@Sun.COM 113*10893SQuaker.Fang@Sun.COM #define PHY_MODE_G (0x1) 114*10893SQuaker.Fang@Sun.COM #define PHY_MODE_A (0x2) 115*10893SQuaker.Fang@Sun.COM #define PHY_MODE_N (0x4) 116*10893SQuaker.Fang@Sun.COM 117*10893SQuaker.Fang@Sun.COM #define ANT_A (0x1) 118*10893SQuaker.Fang@Sun.COM #define ANT_B (0x2) 119*10893SQuaker.Fang@Sun.COM #define ANT_C (0x4) 120*10893SQuaker.Fang@Sun.COM 121*10893SQuaker.Fang@Sun.COM #define PA_TYPE_SYSTEM (0) 122*10893SQuaker.Fang@Sun.COM #define PA_TYPE_MIX (1) 123*10893SQuaker.Fang@Sun.COM #define PA_TYPE_INTER (2) 124*10893SQuaker.Fang@Sun.COM 125*10893SQuaker.Fang@Sun.COM struct iwp_chip_param { 126*10893SQuaker.Fang@Sun.COM uint32_t phy_mode; 127*10893SQuaker.Fang@Sun.COM uint8_t tx_ant; 128*10893SQuaker.Fang@Sun.COM uint8_t rx_ant; 129*10893SQuaker.Fang@Sun.COM uint16_t pa_type; 130*10893SQuaker.Fang@Sun.COM }; 131*10893SQuaker.Fang@Sun.COM 132*10893SQuaker.Fang@Sun.COM typedef struct iwp_softc { 133*10893SQuaker.Fang@Sun.COM struct ieee80211com sc_ic; 134*10893SQuaker.Fang@Sun.COM dev_info_t *sc_dip; 135*10893SQuaker.Fang@Sun.COM int (*sc_newstate)(struct ieee80211com *, 136*10893SQuaker.Fang@Sun.COM enum ieee80211_state, int); 137*10893SQuaker.Fang@Sun.COM void (*sc_recv_action)(ieee80211_node_t *, 138*10893SQuaker.Fang@Sun.COM const uint8_t *, const uint8_t *); 139*10893SQuaker.Fang@Sun.COM int (*sc_send_action)(ieee80211_node_t *, 140*10893SQuaker.Fang@Sun.COM int, int, uint16_t[4]); 141*10893SQuaker.Fang@Sun.COM volatile uint32_t sc_cmd_flag; 142*10893SQuaker.Fang@Sun.COM volatile uint32_t sc_cmd_accum; 143*10893SQuaker.Fang@Sun.COM 144*10893SQuaker.Fang@Sun.COM enum ieee80211_state sc_ostate; 145*10893SQuaker.Fang@Sun.COM kmutex_t sc_glock; 146*10893SQuaker.Fang@Sun.COM kmutex_t sc_mt_lock; 147*10893SQuaker.Fang@Sun.COM kmutex_t sc_tx_lock; 148*10893SQuaker.Fang@Sun.COM kcondvar_t sc_mt_cv; 149*10893SQuaker.Fang@Sun.COM kcondvar_t sc_tx_cv; 150*10893SQuaker.Fang@Sun.COM kcondvar_t sc_cmd_cv; 151*10893SQuaker.Fang@Sun.COM kcondvar_t sc_fw_cv; 152*10893SQuaker.Fang@Sun.COM kcondvar_t sc_put_seg_cv; 153*10893SQuaker.Fang@Sun.COM kcondvar_t sc_ucode_cv; 154*10893SQuaker.Fang@Sun.COM 155*10893SQuaker.Fang@Sun.COM kthread_t *sc_mf_thread; 156*10893SQuaker.Fang@Sun.COM volatile uint32_t sc_mf_thread_switch; 157*10893SQuaker.Fang@Sun.COM 158*10893SQuaker.Fang@Sun.COM volatile uint32_t sc_flags; 159*10893SQuaker.Fang@Sun.COM uint32_t sc_dmabuf_sz; 160*10893SQuaker.Fang@Sun.COM uint16_t sc_clsz; 161*10893SQuaker.Fang@Sun.COM uint8_t sc_rev; 162*10893SQuaker.Fang@Sun.COM uint8_t sc_resv; 163*10893SQuaker.Fang@Sun.COM uint16_t sc_assoc_id; 164*10893SQuaker.Fang@Sun.COM uint16_t sc_reserved0; 165*10893SQuaker.Fang@Sun.COM 166*10893SQuaker.Fang@Sun.COM /* shared area */ 167*10893SQuaker.Fang@Sun.COM iwp_dma_t sc_dma_sh; 168*10893SQuaker.Fang@Sun.COM iwp_shared_t *sc_shared; 169*10893SQuaker.Fang@Sun.COM /* keep warm area */ 170*10893SQuaker.Fang@Sun.COM iwp_dma_t sc_dma_kw; 171*10893SQuaker.Fang@Sun.COM /* tx scheduler base address */ 172*10893SQuaker.Fang@Sun.COM uint32_t sc_scd_base_addr; 173*10893SQuaker.Fang@Sun.COM 174*10893SQuaker.Fang@Sun.COM uint32_t sc_hw_rev; 175*10893SQuaker.Fang@Sun.COM struct iwp_phy_rx sc_rx_phy_res; 176*10893SQuaker.Fang@Sun.COM 177*10893SQuaker.Fang@Sun.COM iwp_tx_ring_t sc_txq[IWP_NUM_QUEUES]; 178*10893SQuaker.Fang@Sun.COM iwp_rx_ring_t sc_rxq; 179*10893SQuaker.Fang@Sun.COM 180*10893SQuaker.Fang@Sun.COM /* firmware dma */ 181*10893SQuaker.Fang@Sun.COM iwp_firmware_hdr_t *sc_hdr; 182*10893SQuaker.Fang@Sun.COM char *sc_boot; 183*10893SQuaker.Fang@Sun.COM iwp_dma_t sc_dma_fw_text; 184*10893SQuaker.Fang@Sun.COM iwp_dma_t sc_dma_fw_init_text; 185*10893SQuaker.Fang@Sun.COM iwp_dma_t sc_dma_fw_data; 186*10893SQuaker.Fang@Sun.COM iwp_dma_t sc_dma_fw_data_bak; 187*10893SQuaker.Fang@Sun.COM iwp_dma_t sc_dma_fw_init_data; 188*10893SQuaker.Fang@Sun.COM 189*10893SQuaker.Fang@Sun.COM ddi_acc_handle_t sc_cfg_handle; 190*10893SQuaker.Fang@Sun.COM caddr_t sc_cfg_base; 191*10893SQuaker.Fang@Sun.COM ddi_acc_handle_t sc_handle; 192*10893SQuaker.Fang@Sun.COM caddr_t sc_base; 193*10893SQuaker.Fang@Sun.COM ddi_intr_handle_t *sc_intr_htable; 194*10893SQuaker.Fang@Sun.COM uint_t sc_intr_pri; 195*10893SQuaker.Fang@Sun.COM 196*10893SQuaker.Fang@Sun.COM iwp_rxon_cmd_t sc_config; 197*10893SQuaker.Fang@Sun.COM iwp_rxon_cmd_t sc_config_save; 198*10893SQuaker.Fang@Sun.COM 199*10893SQuaker.Fang@Sun.COM uint8_t sc_eep_map[IWP_SP_EEPROM_SIZE]; 200*10893SQuaker.Fang@Sun.COM struct iwp_eep_calibration *sc_eep_calib; 201*10893SQuaker.Fang@Sun.COM struct iwp_calib_results sc_calib_results; 202*10893SQuaker.Fang@Sun.COM uint32_t sc_scd_base; 203*10893SQuaker.Fang@Sun.COM 204*10893SQuaker.Fang@Sun.COM struct iwp_alive_resp sc_card_alive_run; 205*10893SQuaker.Fang@Sun.COM struct iwp_init_alive_resp sc_card_alive_init; 206*10893SQuaker.Fang@Sun.COM iwp_ht_conf_t sc_ht_conf; 207*10893SQuaker.Fang@Sun.COM uint16_t sc_dev_id; 208*10893SQuaker.Fang@Sun.COM 209*10893SQuaker.Fang@Sun.COM uint32_t sc_tx_timer; 210*10893SQuaker.Fang@Sun.COM uint32_t sc_scan_pending; 211*10893SQuaker.Fang@Sun.COM uint8_t *sc_fw_bin; 212*10893SQuaker.Fang@Sun.COM 213*10893SQuaker.Fang@Sun.COM ddi_softint_handle_t sc_soft_hdl; 214*10893SQuaker.Fang@Sun.COM 215*10893SQuaker.Fang@Sun.COM uint32_t sc_rx_softint_pending; 216*10893SQuaker.Fang@Sun.COM uint32_t sc_need_reschedule; 217*10893SQuaker.Fang@Sun.COM 218*10893SQuaker.Fang@Sun.COM clock_t sc_clk; 219*10893SQuaker.Fang@Sun.COM 220*10893SQuaker.Fang@Sun.COM struct iwp_chip_param sc_chip_param; 221*10893SQuaker.Fang@Sun.COM 222*10893SQuaker.Fang@Sun.COM /* kstats */ 223*10893SQuaker.Fang@Sun.COM uint32_t sc_tx_nobuf; 224*10893SQuaker.Fang@Sun.COM uint32_t sc_rx_nobuf; 225*10893SQuaker.Fang@Sun.COM uint32_t sc_tx_err; 226*10893SQuaker.Fang@Sun.COM uint32_t sc_rx_err; 227*10893SQuaker.Fang@Sun.COM uint32_t sc_tx_retries; 228*10893SQuaker.Fang@Sun.COM } iwp_sc_t; 229*10893SQuaker.Fang@Sun.COM 230*10893SQuaker.Fang@Sun.COM #define SC_CMD_FLG_NONE (0) 231*10893SQuaker.Fang@Sun.COM #define SC_CMD_FLG_PENDING (1) 232*10893SQuaker.Fang@Sun.COM #define SC_CMD_FLG_DONE (2) 233*10893SQuaker.Fang@Sun.COM 234*10893SQuaker.Fang@Sun.COM #define IWP_F_ATTACHED (1 << 0) 235*10893SQuaker.Fang@Sun.COM #define IWP_F_CMD_DONE (1 << 1) 236*10893SQuaker.Fang@Sun.COM #define IWP_F_FW_INIT (1 << 2) 237*10893SQuaker.Fang@Sun.COM #define IWP_F_HW_ERR_RECOVER (1 << 3) 238*10893SQuaker.Fang@Sun.COM #define IWP_F_RATE_AUTO_CTL (1 << 4) 239*10893SQuaker.Fang@Sun.COM #define IWP_F_RUNNING (1 << 5) 240*10893SQuaker.Fang@Sun.COM #define IWP_F_SCANNING (1 << 6) 241*10893SQuaker.Fang@Sun.COM #define IWP_F_SUSPEND (1 << 7) 242*10893SQuaker.Fang@Sun.COM #define IWP_F_RADIO_OFF (1 << 8) 243*10893SQuaker.Fang@Sun.COM #define IWP_F_STATISTICS (1 << 9) 244*10893SQuaker.Fang@Sun.COM #define IWP_F_READY (1 << 10) 245*10893SQuaker.Fang@Sun.COM #define IWP_F_PUT_SEG (1 << 11) 246*10893SQuaker.Fang@Sun.COM #define IWP_F_QUIESCED (1 << 12) 247*10893SQuaker.Fang@Sun.COM #define IWP_F_LAZY_RESUME (1 << 13) 248*10893SQuaker.Fang@Sun.COM 249*10893SQuaker.Fang@Sun.COM #define IWP_SUCCESS 0 250*10893SQuaker.Fang@Sun.COM #define IWP_FAIL EIO 251*10893SQuaker.Fang@Sun.COM 252*10893SQuaker.Fang@Sun.COM 253*10893SQuaker.Fang@Sun.COM #ifdef __cplusplus 254*10893SQuaker.Fang@Sun.COM } 255*10893SQuaker.Fang@Sun.COM #endif 256*10893SQuaker.Fang@Sun.COM 257*10893SQuaker.Fang@Sun.COM #endif /* _IWP_VAR_H */ 258