1*10128SFei.Feng@Sun.COM /* 2*10128SFei.Feng@Sun.COM * 3*10128SFei.Feng@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 4*10128SFei.Feng@Sun.COM * Use is subject to license terms. 5*10128SFei.Feng@Sun.COM */ 6*10128SFei.Feng@Sun.COM 7*10128SFei.Feng@Sun.COM /* 8*10128SFei.Feng@Sun.COM * Copyright (c) 2006 9*10128SFei.Feng@Sun.COM * Damien Bergamini <damien.bergamini@free.fr> 10*10128SFei.Feng@Sun.COM * Copyright (c) 2006 Sam Leffler, Errno Consulting 11*10128SFei.Feng@Sun.COM * Copyright (c) 2008-2009 Weongyo Jeong <weongyo@freebsd.org> 12*10128SFei.Feng@Sun.COM * 13*10128SFei.Feng@Sun.COM * Permission to use, copy, modify, and distribute this software for any 14*10128SFei.Feng@Sun.COM * purpose with or without fee is hereby granted, provided that the above 15*10128SFei.Feng@Sun.COM * copyright notice and this permission notice appear in all copies. 16*10128SFei.Feng@Sun.COM * 17*10128SFei.Feng@Sun.COM * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 18*10128SFei.Feng@Sun.COM * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 19*10128SFei.Feng@Sun.COM * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 20*10128SFei.Feng@Sun.COM * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 21*10128SFei.Feng@Sun.COM * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 22*10128SFei.Feng@Sun.COM * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 23*10128SFei.Feng@Sun.COM * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 24*10128SFei.Feng@Sun.COM */ 25*10128SFei.Feng@Sun.COM 26*10128SFei.Feng@Sun.COM 27*10128SFei.Feng@Sun.COM #ifndef _UATH_VAR_H 28*10128SFei.Feng@Sun.COM #define _UATH_VAR_H 29*10128SFei.Feng@Sun.COM 30*10128SFei.Feng@Sun.COM #include <sys/queue.h> 31*10128SFei.Feng@Sun.COM 32*10128SFei.Feng@Sun.COM #ifdef __cplusplus 33*10128SFei.Feng@Sun.COM extern "C" { 34*10128SFei.Feng@Sun.COM #endif 35*10128SFei.Feng@Sun.COM 36*10128SFei.Feng@Sun.COM #define UATH_ID_BSS 2 /* Connection ID */ 37*10128SFei.Feng@Sun.COM 38*10128SFei.Feng@Sun.COM #define UATH_RX_DATA_LIST_COUNT 1 /* 128 */ 39*10128SFei.Feng@Sun.COM #define UATH_TX_DATA_LIST_COUNT 8 /* 16 */ 40*10128SFei.Feng@Sun.COM #define UATH_CMD_LIST_COUNT 8 /* 60 */ 41*10128SFei.Feng@Sun.COM 42*10128SFei.Feng@Sun.COM #define UATH_DATA_TIMEOUT 10000 43*10128SFei.Feng@Sun.COM #define UATH_CMD_TIMEOUT 1000 44*10128SFei.Feng@Sun.COM 45*10128SFei.Feng@Sun.COM /* 46*10128SFei.Feng@Sun.COM * Useful combinations of channel characteristics from net80211. 47*10128SFei.Feng@Sun.COM */ 48*10128SFei.Feng@Sun.COM #define UATH_CHAN_A \ 49*10128SFei.Feng@Sun.COM (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM) 50*10128SFei.Feng@Sun.COM #define UATH_CHAN_B \ 51*10128SFei.Feng@Sun.COM (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK) 52*10128SFei.Feng@Sun.COM #define UATH_CHAN_PUREG \ 53*10128SFei.Feng@Sun.COM (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM) 54*10128SFei.Feng@Sun.COM #define UATH_CHAN_G \ 55*10128SFei.Feng@Sun.COM (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN) 56*10128SFei.Feng@Sun.COM 57*10128SFei.Feng@Sun.COM #define UATH_IS_CHAN_A(_c) \ 58*10128SFei.Feng@Sun.COM (((_c)->ich_flags & UATH_CHAN_A) == UATH_CHAN_A) 59*10128SFei.Feng@Sun.COM #define UATH_IS_CHAN_B(_c) \ 60*10128SFei.Feng@Sun.COM (((_c)->ich_flags & UATH_CHAN_B) == UATH_CHAN_B) 61*10128SFei.Feng@Sun.COM #define UATH_IS_CHAN_PUREG(_c) \ 62*10128SFei.Feng@Sun.COM (((_c)->ich_flags & UATH_CHAN_PUREG) == UATH_CHAN_PUREG) 63*10128SFei.Feng@Sun.COM #define UATH_IS_CHAN_G(_c) \ 64*10128SFei.Feng@Sun.COM (((_c)->ich_flags & UATH_CHAN_G) == UATH_CHAN_G) 65*10128SFei.Feng@Sun.COM #define UATH_IS_CHAN_ANYG(_c) \ 66*10128SFei.Feng@Sun.COM (UATH_IS_CHAN_PUREG(_c) || UATH_IS_CHAN_G(_c)) 67*10128SFei.Feng@Sun.COM 68*10128SFei.Feng@Sun.COM #define UATH_IS_CHAN_OFDM(_c) \ 69*10128SFei.Feng@Sun.COM ((_c)->ich_flags & IEEE80211_CHAN_OFDM) 70*10128SFei.Feng@Sun.COM #define UATH_IS_CHAN_CCK(_c) \ 71*10128SFei.Feng@Sun.COM ((_c)->ich_flags & IEEE80211_CHAN_CCK) 72*10128SFei.Feng@Sun.COM 73*10128SFei.Feng@Sun.COM #define UATH_NODE_QOS 0x0002 /* QoS enabled */ 74*10128SFei.Feng@Sun.COM 75*10128SFei.Feng@Sun.COM 76*10128SFei.Feng@Sun.COM /* flags for sending firmware commands */ 77*10128SFei.Feng@Sun.COM #define UATH_CMD_FLAG_ASYNC (1 << 0) 78*10128SFei.Feng@Sun.COM #define UATH_CMD_FLAG_READ (1 << 1) 79*10128SFei.Feng@Sun.COM #define UATH_CMD_FLAG_MAGIC (1 << 2) 80*10128SFei.Feng@Sun.COM 81*10128SFei.Feng@Sun.COM struct uath_cmd { 82*10128SFei.Feng@Sun.COM struct uath_softc *sc; 83*10128SFei.Feng@Sun.COM uint32_t flags; 84*10128SFei.Feng@Sun.COM uint32_t msgid; 85*10128SFei.Feng@Sun.COM uint8_t *buf; 86*10128SFei.Feng@Sun.COM uint16_t buflen; 87*10128SFei.Feng@Sun.COM void *odata; /* NB: tx only */ 88*10128SFei.Feng@Sun.COM int olen; /* space in odata */ 89*10128SFei.Feng@Sun.COM STAILQ_ENTRY(uath_cmd) next; 90*10128SFei.Feng@Sun.COM }; 91*10128SFei.Feng@Sun.COM typedef STAILQ_HEAD(, uath_cmd) uath_cmdhead; 92*10128SFei.Feng@Sun.COM 93*10128SFei.Feng@Sun.COM struct uath_data { 94*10128SFei.Feng@Sun.COM struct uath_softc *sc; 95*10128SFei.Feng@Sun.COM uint8_t *buf; 96*10128SFei.Feng@Sun.COM uint16_t buflen; 97*10128SFei.Feng@Sun.COM struct ieee80211_node *ni; /* NB: tx only */ 98*10128SFei.Feng@Sun.COM STAILQ_ENTRY(uath_data) next; 99*10128SFei.Feng@Sun.COM }; 100*10128SFei.Feng@Sun.COM typedef STAILQ_HEAD(, uath_data) uath_datahead; 101*10128SFei.Feng@Sun.COM 102*10128SFei.Feng@Sun.COM struct uath_cmd_lock { 103*10128SFei.Feng@Sun.COM boolean_t done; 104*10128SFei.Feng@Sun.COM kmutex_t mutex; 105*10128SFei.Feng@Sun.COM kcondvar_t cv; 106*10128SFei.Feng@Sun.COM }; 107*10128SFei.Feng@Sun.COM 108*10128SFei.Feng@Sun.COM struct uath_wme_settings { 109*10128SFei.Feng@Sun.COM uint8_t aifsn; 110*10128SFei.Feng@Sun.COM uint8_t logcwmin; 111*10128SFei.Feng@Sun.COM uint8_t logcwmax; 112*10128SFei.Feng@Sun.COM uint16_t txop; 113*10128SFei.Feng@Sun.COM #define UATH_TXOP_TO_US(txop) ((txop) << 5) 114*10128SFei.Feng@Sun.COM uint8_t acm; 115*10128SFei.Feng@Sun.COM }; 116*10128SFei.Feng@Sun.COM 117*10128SFei.Feng@Sun.COM struct uath_devcap { 118*10128SFei.Feng@Sun.COM uint32_t targetVersion; 119*10128SFei.Feng@Sun.COM uint32_t targetRevision; 120*10128SFei.Feng@Sun.COM uint32_t macVersion; 121*10128SFei.Feng@Sun.COM uint32_t macRevision; 122*10128SFei.Feng@Sun.COM uint32_t phyRevision; 123*10128SFei.Feng@Sun.COM uint32_t analog5GhzRevision; 124*10128SFei.Feng@Sun.COM uint32_t analog2GhzRevision; 125*10128SFei.Feng@Sun.COM uint32_t regDomain; 126*10128SFei.Feng@Sun.COM uint32_t regCapBits; 127*10128SFei.Feng@Sun.COM uint32_t countryCode; 128*10128SFei.Feng@Sun.COM uint32_t keyCacheSize; 129*10128SFei.Feng@Sun.COM uint32_t numTxQueues; 130*10128SFei.Feng@Sun.COM uint32_t connectionIdMax; 131*10128SFei.Feng@Sun.COM uint32_t wirelessModes; 132*10128SFei.Feng@Sun.COM #define UATH_WIRELESS_MODE_11A 0x01 133*10128SFei.Feng@Sun.COM #define UATH_WIRELESS_MODE_TURBO 0x02 134*10128SFei.Feng@Sun.COM #define UATH_WIRELESS_MODE_11B 0x04 135*10128SFei.Feng@Sun.COM #define UATH_WIRELESS_MODE_11G 0x08 136*10128SFei.Feng@Sun.COM #define UATH_WIRELESS_MODE_108G 0x10 137*10128SFei.Feng@Sun.COM uint32_t chanSpreadSupport; 138*10128SFei.Feng@Sun.COM uint32_t compressSupport; 139*10128SFei.Feng@Sun.COM uint32_t burstSupport; 140*10128SFei.Feng@Sun.COM uint32_t fastFramesSupport; 141*10128SFei.Feng@Sun.COM uint32_t chapTuningSupport; 142*10128SFei.Feng@Sun.COM uint32_t turboGSupport; 143*10128SFei.Feng@Sun.COM uint32_t turboPrimeSupport; 144*10128SFei.Feng@Sun.COM uint32_t deviceType; 145*10128SFei.Feng@Sun.COM uint32_t wmeSupport; 146*10128SFei.Feng@Sun.COM uint32_t low2GhzChan; 147*10128SFei.Feng@Sun.COM uint32_t high2GhzChan; 148*10128SFei.Feng@Sun.COM uint32_t low5GhzChan; 149*10128SFei.Feng@Sun.COM uint32_t high5GhzChan; 150*10128SFei.Feng@Sun.COM uint32_t supportCipherWEP; 151*10128SFei.Feng@Sun.COM uint32_t supportCipherAES_CCM; 152*10128SFei.Feng@Sun.COM uint32_t supportCipherTKIP; 153*10128SFei.Feng@Sun.COM uint32_t supportCipherMicAES_CCM; 154*10128SFei.Feng@Sun.COM uint32_t supportMicTKIP; 155*10128SFei.Feng@Sun.COM uint32_t twiceAntennaGain5G; 156*10128SFei.Feng@Sun.COM uint32_t twiceAntennaGain2G; 157*10128SFei.Feng@Sun.COM }; 158*10128SFei.Feng@Sun.COM 159*10128SFei.Feng@Sun.COM struct uath_stat { 160*10128SFei.Feng@Sun.COM uint32_t st_badchunkseqnum; 161*10128SFei.Feng@Sun.COM uint32_t st_invalidlen; 162*10128SFei.Feng@Sun.COM uint32_t st_multichunk; 163*10128SFei.Feng@Sun.COM uint32_t st_toobigrxpkt; 164*10128SFei.Feng@Sun.COM uint32_t st_stopinprogress; 165*10128SFei.Feng@Sun.COM uint32_t st_crcerr; 166*10128SFei.Feng@Sun.COM uint32_t st_phyerr; 167*10128SFei.Feng@Sun.COM uint32_t st_decrypt_crcerr; 168*10128SFei.Feng@Sun.COM uint32_t st_decrypt_micerr; 169*10128SFei.Feng@Sun.COM uint32_t st_decomperr; 170*10128SFei.Feng@Sun.COM uint32_t st_keyerr; 171*10128SFei.Feng@Sun.COM uint32_t st_err; 172*10128SFei.Feng@Sun.COM /* not use CMD/RX/TX queues, so ignore some structure */ 173*10128SFei.Feng@Sun.COM }; 174*10128SFei.Feng@Sun.COM #define UATH_STAT_INC(sc, var) (sc)->sc_stat.var++ 175*10128SFei.Feng@Sun.COM #define UATH_STAT_DEC(sc, var) (sc)->sc_stat.var-- 176*10128SFei.Feng@Sun.COM 177*10128SFei.Feng@Sun.COM struct uath_softc { 178*10128SFei.Feng@Sun.COM struct ieee80211com sc_ic; 179*10128SFei.Feng@Sun.COM dev_info_t *sc_dev; 180*10128SFei.Feng@Sun.COM 181*10128SFei.Feng@Sun.COM usb_client_dev_data_t *sc_udev; /* usb dev */ 182*10128SFei.Feng@Sun.COM int dev_flags; 183*10128SFei.Feng@Sun.COM uint32_t sc_flags; 184*10128SFei.Feng@Sun.COM 185*10128SFei.Feng@Sun.COM usb_pipe_handle_t rx_cmd_pipe; 186*10128SFei.Feng@Sun.COM usb_pipe_handle_t rx_data_pipe; 187*10128SFei.Feng@Sun.COM usb_pipe_handle_t tx_cmd_pipe; 188*10128SFei.Feng@Sun.COM usb_pipe_handle_t tx_data_pipe; 189*10128SFei.Feng@Sun.COM 190*10128SFei.Feng@Sun.COM kmutex_t sc_genlock; 191*10128SFei.Feng@Sun.COM kmutex_t sc_rxlock_cmd; 192*10128SFei.Feng@Sun.COM kmutex_t sc_rxlock_data; 193*10128SFei.Feng@Sun.COM kmutex_t sc_txlock_cmd; 194*10128SFei.Feng@Sun.COM kmutex_t sc_txlock_data; 195*10128SFei.Feng@Sun.COM 196*10128SFei.Feng@Sun.COM struct uath_cmd sc_cmd[UATH_CMD_LIST_COUNT]; 197*10128SFei.Feng@Sun.COM struct uath_data sc_rx[UATH_RX_DATA_LIST_COUNT]; 198*10128SFei.Feng@Sun.COM struct uath_data sc_tx[UATH_TX_DATA_LIST_COUNT]; 199*10128SFei.Feng@Sun.COM 200*10128SFei.Feng@Sun.COM int tx_cmd_queued; 201*10128SFei.Feng@Sun.COM int rx_cmd_queued; 202*10128SFei.Feng@Sun.COM int tx_data_queued; 203*10128SFei.Feng@Sun.COM int rx_data_queued; 204*10128SFei.Feng@Sun.COM 205*10128SFei.Feng@Sun.COM int sc_cmdid; 206*10128SFei.Feng@Sun.COM 207*10128SFei.Feng@Sun.COM struct uath_stat sc_stat; 208*10128SFei.Feng@Sun.COM 209*10128SFei.Feng@Sun.COM struct uath_cmd_lock rlock; 210*10128SFei.Feng@Sun.COM struct uath_cmd_lock wlock; 211*10128SFei.Feng@Sun.COM 212*10128SFei.Feng@Sun.COM struct uath_devcap sc_devcap; 213*10128SFei.Feng@Sun.COM uint8_t sc_serial[16]; 214*10128SFei.Feng@Sun.COM 215*10128SFei.Feng@Sun.COM uint32_t sc_msgid; 216*10128SFei.Feng@Sun.COM uint32_t sc_seqnum; 217*10128SFei.Feng@Sun.COM 218*10128SFei.Feng@Sun.COM uint8_t sc_intrx_nextnum; 219*10128SFei.Feng@Sun.COM uint32_t sc_intrx_len; 220*10128SFei.Feng@Sun.COM #define UATH_MAX_INTRX_SIZE 3616 221*10128SFei.Feng@Sun.COM 222*10128SFei.Feng@Sun.COM timeout_id_t sc_scan_id; 223*10128SFei.Feng@Sun.COM timeout_id_t sc_stat_id; 224*10128SFei.Feng@Sun.COM 225*10128SFei.Feng@Sun.COM uint32_t sc_need_sched; 226*10128SFei.Feng@Sun.COM 227*10128SFei.Feng@Sun.COM /* kstats */ 228*10128SFei.Feng@Sun.COM uint32_t sc_tx_nobuf; 229*10128SFei.Feng@Sun.COM uint32_t sc_rx_nobuf; 230*10128SFei.Feng@Sun.COM uint32_t sc_tx_err; 231*10128SFei.Feng@Sun.COM uint32_t sc_rx_err; 232*10128SFei.Feng@Sun.COM uint32_t sc_tx_retries; 233*10128SFei.Feng@Sun.COM 234*10128SFei.Feng@Sun.COM int (*sc_newstate)(struct ieee80211com *, 235*10128SFei.Feng@Sun.COM enum ieee80211_state, int); 236*10128SFei.Feng@Sun.COM }; 237*10128SFei.Feng@Sun.COM 238*10128SFei.Feng@Sun.COM #define UATH_SUCCESS 0 239*10128SFei.Feng@Sun.COM #define UATH_FAILURE -1 240*10128SFei.Feng@Sun.COM 241*10128SFei.Feng@Sun.COM #define UATH_FLAG_RUNNING (1 << 0) 242*10128SFei.Feng@Sun.COM #define UATH_FLAG_SUSPEND (1 << 1) 243*10128SFei.Feng@Sun.COM #define UATH_FLAG_RECONNECT (1 << 2) 244*10128SFei.Feng@Sun.COM #define UATH_FLAG_DISCONNECT (1 << 3) 245*10128SFei.Feng@Sun.COM 246*10128SFei.Feng@Sun.COM #define UATH_LOCK(sc) mutex_enter(&(sc)->sc_genlock) 247*10128SFei.Feng@Sun.COM #define UATH_UNLOCK(sc) mutex_exit(&(sc)->sc_genlock) 248*10128SFei.Feng@Sun.COM #define UATH_IS_RUNNING(_sc) ((_sc)->sc_flags & UATH_FLAG_RUNNING) 249*10128SFei.Feng@Sun.COM #define UATH_IS_SUSPEND(_sc) ((_sc)->sc_flags & UATH_FLAG_SUSPEND) 250*10128SFei.Feng@Sun.COM #define UATH_IS_DISCONNECT(_sc) ((_sc)->sc_flags & UATH_FLAG_DISCONNECT) 251*10128SFei.Feng@Sun.COM #define UATH_IS_RECONNECT(_sc) ((_sc)->sc_flags & UATH_FLAG_RECONNECT) 252*10128SFei.Feng@Sun.COM 253*10128SFei.Feng@Sun.COM #define UATH_RESET_INTRX(sc) do { \ 254*10128SFei.Feng@Sun.COM (sc)->sc_intrx_nextnum = 0; \ 255*10128SFei.Feng@Sun.COM (sc)->sc_intrx_len = 0; \ 256*10128SFei.Feng@Sun.COM _NOTE(CONSTCOND) \ 257*10128SFei.Feng@Sun.COM } while (0) 258*10128SFei.Feng@Sun.COM 259*10128SFei.Feng@Sun.COM 260*10128SFei.Feng@Sun.COM #ifdef __cplusplus 261*10128SFei.Feng@Sun.COM } 262*10128SFei.Feng@Sun.COM #endif 263*10128SFei.Feng@Sun.COM 264*10128SFei.Feng@Sun.COM #endif /* _UATH_VAR_H */ 265