1
2/*-
3 * Copyright (c) 2005
4 *	Damien Bergamini <damien.bergamini@free.fr>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#define RAL_TX_LIST_COUNT	8
20#define RAL_TX_MINFREE		2
21
22#define URAL_SCAN_START         1
23#define URAL_SCAN_END           2
24#define URAL_SET_CHANNEL        3
25
26struct ural_rx_radiotap_header {
27	struct ieee80211_radiotap_header wr_ihdr;
28	uint8_t		wr_flags;
29	uint8_t		wr_rate;
30	uint16_t	wr_chan_freq;
31	uint16_t	wr_chan_flags;
32	int8_t		wr_antsignal;
33	int8_t		wr_antnoise;
34	uint8_t		wr_antenna;
35} __packed __aligned(8);
36
37#define RAL_RX_RADIOTAP_PRESENT						\
38	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
39	 (1 << IEEE80211_RADIOTAP_RATE) |				\
40	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
41	 (1 << IEEE80211_RADIOTAP_ANTENNA) |				\
42	 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |			\
43	 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
44
45struct ural_tx_radiotap_header {
46	struct ieee80211_radiotap_header wt_ihdr;
47	uint8_t		wt_flags;
48	uint8_t		wt_rate;
49	uint16_t	wt_chan_freq;
50	uint16_t	wt_chan_flags;
51	uint8_t		wt_antenna;
52} __packed;
53
54#define RAL_TX_RADIOTAP_PRESENT						\
55	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
56	 (1 << IEEE80211_RADIOTAP_RATE) |				\
57	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
58	 (1 << IEEE80211_RADIOTAP_ANTENNA))
59
60struct ural_softc;
61
62struct ural_tx_data {
63	STAILQ_ENTRY(ural_tx_data)	next;
64	struct ural_softc		*sc;
65	struct ural_tx_desc		desc;
66	struct mbuf			*m;
67	struct ieee80211_node		*ni;
68	int				rate;
69};
70typedef STAILQ_HEAD(, ural_tx_data) ural_txdhead;
71
72struct ural_vap {
73	struct ieee80211vap		vap;
74
75	struct usb_callout		ratectl_ch;
76	struct task			ratectl_task;
77
78	int				(*newstate)(struct ieee80211vap *,
79					    enum ieee80211_state, int);
80};
81#define	URAL_VAP(vap)	((struct ural_vap *)(vap))
82
83enum {
84	URAL_BULK_WR,
85	URAL_BULK_RD,
86	URAL_N_TRANSFER = 2,
87};
88
89struct ural_softc {
90	struct ieee80211com		sc_ic;
91	struct ieee80211_ratectl_tx_stats sc_txs;
92	struct mbufq			sc_snd;
93	device_t			sc_dev;
94	struct usb_device		*sc_udev;
95
96	uint32_t			asic_rev;
97	uint8_t				rf_rev;
98
99	struct usb_xfer			*sc_xfer[URAL_N_TRANSFER];
100
101	struct ural_tx_data		tx_data[RAL_TX_LIST_COUNT];
102	ural_txdhead			tx_q;
103	ural_txdhead			tx_free;
104	int				tx_nfree;
105	struct ural_rx_desc		sc_rx_desc;
106
107	struct mtx			sc_mtx;
108
109	uint16_t			sta[11];
110	uint32_t			rf_regs[4];
111	uint8_t				txpow[14];
112	u_int				sc_detached:1,
113					sc_running:1;
114
115	uint8_t				sc_bssid[IEEE80211_ADDR_LEN];
116
117	struct {
118		uint8_t			val;
119		uint8_t			reg;
120	} __packed			bbp_prom[16];
121
122	int				led_mode;
123	int				hw_radio;
124	int				rx_ant;
125	int				tx_ant;
126	int				nb_ant;
127
128	struct ural_rx_radiotap_header	sc_rxtap;
129	struct ural_tx_radiotap_header	sc_txtap;
130};
131
132#define RAL_LOCK(sc)		mtx_lock(&(sc)->sc_mtx)
133#define RAL_UNLOCK(sc)		mtx_unlock(&(sc)->sc_mtx)
134#define RAL_LOCK_ASSERT(sc, t)	mtx_assert(&(sc)->sc_mtx, t)
135