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