/* * * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * Copyright (c) 2006 * Damien Bergamini * Copyright (c) 2006 Sam Leffler, Errno Consulting * Copyright (c) 2008-2009 Weongyo Jeong * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef _UATH_VAR_H #define _UATH_VAR_H #include #ifdef __cplusplus extern "C" { #endif #define UATH_ID_BSS 2 /* Connection ID */ #define UATH_RX_DATA_LIST_COUNT 1 /* 128 */ #define UATH_TX_DATA_LIST_COUNT 8 /* 16 */ #define UATH_CMD_LIST_COUNT 8 /* 60 */ #define UATH_DATA_TIMEOUT 10000 #define UATH_CMD_TIMEOUT 1000 /* * Useful combinations of channel characteristics from net80211. */ #define UATH_CHAN_A \ (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM) #define UATH_CHAN_B \ (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK) #define UATH_CHAN_PUREG \ (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM) #define UATH_CHAN_G \ (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN) #define UATH_IS_CHAN_A(_c) \ (((_c)->ich_flags & UATH_CHAN_A) == UATH_CHAN_A) #define UATH_IS_CHAN_B(_c) \ (((_c)->ich_flags & UATH_CHAN_B) == UATH_CHAN_B) #define UATH_IS_CHAN_PUREG(_c) \ (((_c)->ich_flags & UATH_CHAN_PUREG) == UATH_CHAN_PUREG) #define UATH_IS_CHAN_G(_c) \ (((_c)->ich_flags & UATH_CHAN_G) == UATH_CHAN_G) #define UATH_IS_CHAN_ANYG(_c) \ (UATH_IS_CHAN_PUREG(_c) || UATH_IS_CHAN_G(_c)) #define UATH_IS_CHAN_OFDM(_c) \ ((_c)->ich_flags & IEEE80211_CHAN_OFDM) #define UATH_IS_CHAN_CCK(_c) \ ((_c)->ich_flags & IEEE80211_CHAN_CCK) #define UATH_NODE_QOS 0x0002 /* QoS enabled */ /* flags for sending firmware commands */ #define UATH_CMD_FLAG_ASYNC (1 << 0) #define UATH_CMD_FLAG_READ (1 << 1) #define UATH_CMD_FLAG_MAGIC (1 << 2) struct uath_cmd { struct uath_softc *sc; uint32_t flags; uint32_t msgid; uint8_t *buf; uint16_t buflen; void *odata; /* NB: tx only */ int olen; /* space in odata */ STAILQ_ENTRY(uath_cmd) next; }; typedef STAILQ_HEAD(, uath_cmd) uath_cmdhead; struct uath_data { struct uath_softc *sc; uint8_t *buf; uint16_t buflen; struct ieee80211_node *ni; /* NB: tx only */ STAILQ_ENTRY(uath_data) next; }; typedef STAILQ_HEAD(, uath_data) uath_datahead; struct uath_cmd_lock { boolean_t done; kmutex_t mutex; kcondvar_t cv; }; struct uath_wme_settings { uint8_t aifsn; uint8_t logcwmin; uint8_t logcwmax; uint16_t txop; #define UATH_TXOP_TO_US(txop) ((txop) << 5) uint8_t acm; }; struct uath_devcap { uint32_t targetVersion; uint32_t targetRevision; uint32_t macVersion; uint32_t macRevision; uint32_t phyRevision; uint32_t analog5GhzRevision; uint32_t analog2GhzRevision; uint32_t regDomain; uint32_t regCapBits; uint32_t countryCode; uint32_t keyCacheSize; uint32_t numTxQueues; uint32_t connectionIdMax; uint32_t wirelessModes; #define UATH_WIRELESS_MODE_11A 0x01 #define UATH_WIRELESS_MODE_TURBO 0x02 #define UATH_WIRELESS_MODE_11B 0x04 #define UATH_WIRELESS_MODE_11G 0x08 #define UATH_WIRELESS_MODE_108G 0x10 uint32_t chanSpreadSupport; uint32_t compressSupport; uint32_t burstSupport; uint32_t fastFramesSupport; uint32_t chapTuningSupport; uint32_t turboGSupport; uint32_t turboPrimeSupport; uint32_t deviceType; uint32_t wmeSupport; uint32_t low2GhzChan; uint32_t high2GhzChan; uint32_t low5GhzChan; uint32_t high5GhzChan; uint32_t supportCipherWEP; uint32_t supportCipherAES_CCM; uint32_t supportCipherTKIP; uint32_t supportCipherMicAES_CCM; uint32_t supportMicTKIP; uint32_t twiceAntennaGain5G; uint32_t twiceAntennaGain2G; }; struct uath_stat { uint32_t st_badchunkseqnum; uint32_t st_invalidlen; uint32_t st_multichunk; uint32_t st_toobigrxpkt; uint32_t st_stopinprogress; uint32_t st_crcerr; uint32_t st_phyerr; uint32_t st_decrypt_crcerr; uint32_t st_decrypt_micerr; uint32_t st_decomperr; uint32_t st_keyerr; uint32_t st_err; /* not use CMD/RX/TX queues, so ignore some structure */ }; #define UATH_STAT_INC(sc, var) (sc)->sc_stat.var++ #define UATH_STAT_DEC(sc, var) (sc)->sc_stat.var-- struct uath_softc { struct ieee80211com sc_ic; dev_info_t *sc_dev; usb_client_dev_data_t *sc_udev; /* usb dev */ int dev_flags; uint32_t sc_flags; usb_pipe_handle_t rx_cmd_pipe; usb_pipe_handle_t rx_data_pipe; usb_pipe_handle_t tx_cmd_pipe; usb_pipe_handle_t tx_data_pipe; kmutex_t sc_genlock; kmutex_t sc_rxlock_cmd; kmutex_t sc_rxlock_data; kmutex_t sc_txlock_cmd; kmutex_t sc_txlock_data; struct uath_cmd sc_cmd[UATH_CMD_LIST_COUNT]; struct uath_data sc_rx[UATH_RX_DATA_LIST_COUNT]; struct uath_data sc_tx[UATH_TX_DATA_LIST_COUNT]; int tx_cmd_queued; int rx_cmd_queued; int tx_data_queued; int rx_data_queued; int sc_cmdid; struct uath_stat sc_stat; struct uath_cmd_lock rlock; struct uath_cmd_lock wlock; struct uath_devcap sc_devcap; uint8_t sc_serial[16]; uint32_t sc_msgid; uint32_t sc_seqnum; uint8_t sc_intrx_nextnum; uint32_t sc_intrx_len; #define UATH_MAX_INTRX_SIZE 3616 timeout_id_t sc_scan_id; timeout_id_t sc_stat_id; uint32_t sc_need_sched; /* kstats */ uint32_t sc_tx_nobuf; uint32_t sc_rx_nobuf; uint32_t sc_tx_err; uint32_t sc_rx_err; uint32_t sc_tx_retries; int (*sc_newstate)(struct ieee80211com *, enum ieee80211_state, int); }; #define UATH_SUCCESS 0 #define UATH_FAILURE -1 #define UATH_FLAG_RUNNING (1 << 0) #define UATH_FLAG_SUSPEND (1 << 1) #define UATH_FLAG_RECONNECT (1 << 2) #define UATH_FLAG_DISCONNECT (1 << 3) #define UATH_LOCK(sc) mutex_enter(&(sc)->sc_genlock) #define UATH_UNLOCK(sc) mutex_exit(&(sc)->sc_genlock) #define UATH_IS_RUNNING(_sc) ((_sc)->sc_flags & UATH_FLAG_RUNNING) #define UATH_IS_SUSPEND(_sc) ((_sc)->sc_flags & UATH_FLAG_SUSPEND) #define UATH_IS_DISCONNECT(_sc) ((_sc)->sc_flags & UATH_FLAG_DISCONNECT) #define UATH_IS_RECONNECT(_sc) ((_sc)->sc_flags & UATH_FLAG_RECONNECT) #define UATH_RESET_INTRX(sc) do { \ (sc)->sc_intrx_nextnum = 0; \ (sc)->sc_intrx_len = 0; \ _NOTE(CONSTCOND) \ } while (0) #ifdef __cplusplus } #endif #endif /* _UATH_VAR_H */