1193323Sed/* $FreeBSD$ */ 2193323Sed 3353358Sdim/*- 4353358Sdim * Copyright (c) 2005 5353358Sdim * Damien Bergamini <damien.bergamini@free.fr> 6193323Sed * 7193323Sed * Permission to use, copy, modify, and distribute this software for any 8193323Sed * purpose with or without fee is hereby granted, provided that the above 9193323Sed * copyright notice and this permission notice appear in all copies. 10193323Sed * 11193323Sed * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12193323Sed * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13193323Sed * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14193323Sed * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15193323Sed * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16193323Sed * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17193323Sed * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18193323Sed */ 19249423Sdim 20249423Sdim#define RAL_TX_LIST_COUNT 8 21193323Sed#define RAL_TX_MINFREE 2 22193323Sed 23341825Sdim#define URAL_SCAN_START 1 24314564Sdim#define URAL_SCAN_END 2 25280031Sdim#define URAL_SET_CHANNEL 3 26249423Sdim 27249423Sdimstruct ural_rx_radiotap_header { 28360784Sdim struct ieee80211_radiotap_header wr_ihdr; 29249423Sdim uint8_t wr_flags; 30193323Sed uint8_t wr_rate; 31198090Srdivacky uint16_t wr_chan_freq; 32321369Sdim uint16_t wr_chan_flags; 33193323Sed int8_t wr_antsignal; 34198090Srdivacky int8_t wr_antnoise; 35249423Sdim uint8_t wr_antenna; 36249423Sdim} __packed __aligned(8); 37280031Sdim 38193323Sed#define RAL_RX_RADIOTAP_PRESENT \ 39193323Sed ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 40276479Sdim (1 << IEEE80211_RADIOTAP_RATE) | \ 41276479Sdim (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 42193323Sed (1 << IEEE80211_RADIOTAP_ANTENNA) | \ 43193323Sed (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 44344779Sdim (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)) 45344779Sdim 46344779Sdimstruct ural_tx_radiotap_header { 47344779Sdim struct ieee80211_radiotap_header wt_ihdr; 48193323Sed uint8_t wt_flags; 49193323Sed uint8_t wt_rate; 50193323Sed uint16_t wt_chan_freq; 51193323Sed uint16_t wt_chan_flags; 52193323Sed uint8_t wt_antenna; 53296417Sdim} __packed; 54296417Sdim 55193323Sed#define RAL_TX_RADIOTAP_PRESENT \ 56193323Sed ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 57193323Sed (1 << IEEE80211_RADIOTAP_RATE) | \ 58193323Sed (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 59193323Sed (1 << IEEE80211_RADIOTAP_ANTENNA)) 60193323Sed 61207618Srdivackystruct ural_softc; 62207618Srdivacky 63207618Srdivackystruct ural_tx_data { 64193323Sed STAILQ_ENTRY(ural_tx_data) next; 65193323Sed struct ural_softc *sc; 66239462Sdim struct ural_tx_desc desc; 67193323Sed struct mbuf *m; 68193323Sed struct ieee80211_node *ni; 69207618Srdivacky int rate; 70207618Srdivacky}; 71207618Srdivackytypedef STAILQ_HEAD(, ural_tx_data) ural_txdhead; 72193323Sed 73288943Sdimstruct ural_vap { 74193323Sed struct ieee80211vap vap; 75193323Sed 76195098Sed struct usb_callout ratectl_ch; 77353358Sdim struct task ratectl_task; 78193323Sed 79193323Sed int (*newstate)(struct ieee80211vap *, 80288943Sdim enum ieee80211_state, int); 81288943Sdim}; 82288943Sdim#define URAL_VAP(vap) ((struct ural_vap *)(vap)) 83193323Sed 84193323Sedenum { 85276479Sdim URAL_BULK_WR, 86288943Sdim URAL_BULK_RD, 87193323Sed URAL_N_TRANSFER = 2, 88239462Sdim}; 89195098Sed 90261991Sdimstruct ural_softc { 91276479Sdim struct ieee80211com sc_ic; 92195098Sed struct ieee80211_ratectl_tx_stats sc_txs; 93239462Sdim struct mbufq sc_snd; 94296417Sdim device_t sc_dev; 95195098Sed struct usb_device *sc_udev; 96195098Sed 97195098Sed uint32_t asic_rev; 98207618Srdivacky uint8_t rf_rev; 99195098Sed 100195098Sed struct usb_xfer *sc_xfer[URAL_N_TRANSFER]; 101195098Sed 102239462Sdim struct ural_tx_data tx_data[RAL_TX_LIST_COUNT]; 103195098Sed ural_txdhead tx_q; 104195098Sed ural_txdhead tx_free; 105207618Srdivacky int tx_nfree; 106195098Sed struct ural_rx_desc sc_rx_desc; 107193323Sed 108243830Sdim struct mtx sc_mtx; 109341825Sdim 110202375Srdivacky uint16_t sta[11]; 111207618Srdivacky uint32_t rf_regs[4]; 112276479Sdim uint8_t txpow[14]; 113341825Sdim u_int sc_detached:1, 114198090Srdivacky sc_running:1; 115327952Sdim 116327952Sdim uint8_t sc_bssid[IEEE80211_ADDR_LEN]; 117327952Sdim 118327952Sdim struct { 119198090Srdivacky uint8_t val; 120353358Sdim uint8_t reg; 121353358Sdim } __packed bbp_prom[16]; 122276479Sdim 123341825Sdim int led_mode; 124198090Srdivacky int hw_radio; 125327952Sdim int rx_ant; 126202375Srdivacky int tx_ant; 127198090Srdivacky int nb_ant; 128198090Srdivacky 129198090Srdivacky struct ural_rx_radiotap_header sc_rxtap; 130198090Srdivacky struct ural_tx_radiotap_header sc_txtap; 131202375Srdivacky}; 132202375Srdivacky 133198090Srdivacky#define RAL_LOCK(sc) mtx_lock(&(sc)->sc_mtx) 134198090Srdivacky#define RAL_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) 135198090Srdivacky#define RAL_LOCK_ASSERT(sc, t) mtx_assert(&(sc)->sc_mtx, t) 136202375Srdivacky