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