xref: /dragonfly/sys/bus/u4b/wlan/if_rumvar.h (revision 817791171d9d4450c7724e17536840546f1dd700)
1 /*        $FreeBSD: head/sys/dev/usb/wlan/if_rumvar.h 297171 2016-03-21 22:29:24Z avos $  */
2 
3 /*-
4  * Copyright (c) 2005, 2006 Damien Bergamini <damien.bergamini@free.fr>
5  * Copyright (c) 2006 Niall O'Higgins <niallo@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #define RUM_TX_LIST_COUNT     8
21 #define RUM_TX_MINFREE                  2
22 
23 struct rum_rx_radiotap_header {
24           struct ieee80211_radiotap_header wr_ihdr;
25           uint64_t  wr_tsf;
26           uint8_t             wr_flags;
27           uint8_t             wr_rate;
28           uint16_t  wr_chan_freq;
29           uint16_t  wr_chan_flags;
30           int8_t              wr_antsignal;
31           int8_t              wr_antnoise;
32           uint8_t             wr_antenna;
33 } __packed __aligned(8);
34 
35 #define RT2573_RX_RADIOTAP_PRESENT                                              \
36           ((1 << IEEE80211_RADIOTAP_TSFT) |                                     \
37            (1 << IEEE80211_RADIOTAP_FLAGS) |                                    \
38            (1 << IEEE80211_RADIOTAP_RATE) |                                     \
39            (1 << IEEE80211_RADIOTAP_CHANNEL) |                                  \
40            (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |                            \
41            (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) |                             \
42            (1 << IEEE80211_RADIOTAP_ANTENNA) |                                  \
43            0)
44 
45 struct rum_tx_radiotap_header {
46           struct ieee80211_radiotap_header wt_ihdr;
47           uint64_t  wt_tsf;
48           uint8_t             wt_flags;
49           uint8_t             wt_rate;
50           uint16_t  wt_chan_freq;
51           uint16_t  wt_chan_flags;
52           uint8_t             wt_antenna;
53 } __packed __aligned(8);
54 
55 #define RT2573_TX_RADIOTAP_PRESENT                                              \
56           ((1 << IEEE80211_RADIOTAP_TSFT) |                                     \
57            (1 << IEEE80211_RADIOTAP_FLAGS) |                                    \
58            (1 << IEEE80211_RADIOTAP_RATE) |                                     \
59            (1 << IEEE80211_RADIOTAP_CHANNEL) |                                  \
60            (1 << IEEE80211_RADIOTAP_ANTENNA))
61 
62 struct rum_softc;
63 
64 struct rum_tx_data {
65           STAILQ_ENTRY(rum_tx_data)     next;
66           struct rum_softc              *sc;
67           struct rum_tx_desc            desc;
68           struct mbuf                             *m;
69           struct ieee80211_node                   *ni;
70           int                                     rate;
71 };
72 typedef STAILQ_HEAD(, rum_tx_data) rum_txdhead;
73 
74 union sec_param {
75           struct ieee80211_key                    key;
76           uint8_t                                 macaddr[IEEE80211_ADDR_LEN];
77           struct ieee80211vap           *vap;
78 };
79 #define CMD_FUNC_PROTO                            void (*func)(struct rum_softc *, \
80                                                       union sec_param *, uint8_t)
81 
82 struct rum_cmdq {
83           union sec_param                         data;
84           uint8_t                                 rvp_id;
85 
86           CMD_FUNC_PROTO;
87 };
88 #define RUM_CMDQ_SIZE                             16
89 
90 struct rum_vap {
91           struct ieee80211vap           vap;
92           struct mbuf                             *bcn_mbuf;
93           struct usb_callout            ratectl_ch;
94           struct task                             ratectl_task;
95           uint8_t                                 maxretry;
96 
97           int                                     (*newstate)(struct ieee80211vap *,
98                                                       enum ieee80211_state, int);
99           void                                    (*bmiss)(struct ieee80211vap *);
100           void                                    (*recv_mgmt)(struct ieee80211_node *,
101                                                       struct mbuf *, int,
102                                                       const struct ieee80211_rx_stats *,
103                                                       int, int);
104 };
105 #define   RUM_VAP(vap)        ((struct rum_vap *)(vap))
106 
107 enum {
108           RUM_BULK_WR,
109           RUM_BULK_RD,
110           RUM_N_TRANSFER = 2,
111 };
112 
113 struct rum_softc {
114           struct ieee80211com           sc_ic;
115           struct mbufq                            sc_snd;
116           device_t                      sc_dev;
117           struct usb_device             *sc_udev;
118 
119           struct usb_xfer                         *sc_xfer[RUM_N_TRANSFER];
120 
121           uint8_t                                 rf_rev;
122           uint8_t                                 rffreq;
123 
124           struct rum_tx_data            tx_data[RUM_TX_LIST_COUNT];
125           rum_txdhead                             tx_q;
126           rum_txdhead                             tx_free;
127           int                                     tx_nfree;
128           struct rum_rx_desc            sc_rx_desc;
129 
130           struct lock                             sc_lock;
131 
132           int                                     sc_sleep_end;
133           int                                     sc_sleep_time;
134           uint8_t                                 last_rx_flags;
135 
136           struct rum_cmdq                         cmdq[RUM_CMDQ_SIZE];
137           struct lock                             cmdq_lock;
138           struct task                             cmdq_task;
139           uint8_t                                 cmdq_first;
140           uint8_t                                 cmdq_last;
141 
142           uint32_t                      sta[6];
143           uint32_t                      rf_regs[4];
144           uint8_t                                 txpow[44];
145           u_int                                   sc_detached:1,
146                                                   sc_running:1,
147                                                   sc_sleeping:1,
148                                                   sc_clr_shkeys:1;
149 
150           uint8_t                                 sc_bssid[IEEE80211_ADDR_LEN];
151           struct wmeParams              wme_params[WME_NUM_AC];
152 
153           uint8_t                                 vap_key_count[1];
154           uint64_t                      keys_bmap;
155 
156           struct {
157                     uint8_t   val;
158                     uint8_t   reg;
159           } __packed                              bbp_prom[16];
160 
161           int                                     hw_radio;
162           int                                     rx_ant;
163           int                                     tx_ant;
164           int                                     nb_ant;
165           int                                     ext_2ghz_lna;
166           int                                     ext_5ghz_lna;
167           int                                     rssi_2ghz_corr;
168           int                                     rssi_5ghz_corr;
169           uint8_t                                 bbp17;
170 
171           struct rum_rx_radiotap_header sc_rxtap;
172           struct rum_tx_radiotap_header sc_txtap;
173 };
174 
175 #define RUM_LOCK_INIT(sc) \
176           lockinit(&(sc)->sc_lock, device_get_nameunit((sc)->sc_dev), \
177               0, LK_CANRECURSE)
178 #define RUM_LOCK(sc)                              lockmgr(&(sc)->sc_lock, LK_EXCLUSIVE)
179 #define RUM_UNLOCK(sc)                            lockmgr(&(sc)->sc_lock, LK_RELEASE)
180 #define RUM_LOCK_ASSERT(sc)             KKASSERT(lockstatus(&(sc)->sc_lock, curthread) == LK_EXCLUSIVE)
181 #define RUM_LOCK_DESTROY(sc)            lockuninit(&(sc)->sc_lock)
182 
183 #define RUM_CMDQ_LOCK_INIT(sc) \
184           lockinit(&(sc)->cmdq_lock, "cmdq lock", 0, LK_CANRECURSE)
185 #define RUM_CMDQ_LOCK(sc)               lockmgr(&(sc)->cmdq_lock, LK_EXCLUSIVE)
186 #define RUM_CMDQ_UNLOCK(sc)             lockmgr(&(sc)->cmdq_lock, LK_RELEASE)
187 #define RUM_CMDQ_LOCK_DESTROY(sc)       lockuninit(&(sc)->cmdq_lock)
188