1 /*        $NetBSD: if_otusvar.h,v 1.12 2020/03/15 23:04:50 thorpej Exp $        */
2 /*        $OpenBSD: if_otusreg.h,v 1.6 2009/04/06 18:17:01 damien Exp $         */
3 
4 /*-
5  * Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr>
6  * Copyright (c) 2007-2008 Atheros Communications, Inc.
7  *
8  * Permission to use, copy, modify, and distribute this software for any
9  * purpose with or without fee is hereby granted, provided that the above
10  * copyright notice and this permission notice appear in all copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19  */
20 #ifndef _IF_OTUSVAR_H_
21 #define _IF_OTUSVAR_H_
22 
23 #ifndef HAVE_EDCA
24 /************************************************************
25  * XXX: This block belongs in sys/net80211/ieee80211_var.h.
26  */
27 /*
28  * EDCA AC parameters.
29  */
30 struct ieee80211_edca_ac_params {
31           uint8_t             ac_ecwmin;          /* CWmin = 2^ECWmin - 1 */
32           uint8_t             ac_ecwmax;          /* CWmax = 2^ECWmax - 1 */
33           uint8_t             ac_aifsn;
34           uint16_t  ac_txoplimit;       /* 32TU */
35           uint8_t             ac_acm;
36 };
37 /************************************************************/
38 #endif /* ! HAVE_EDCA */
39 
40 /* Default EDCA parameters for when QoS is disabled. */
41 static const struct ieee80211_edca_ac_params otus_edca_def[] = {
42           { 4, 10, 3,  0, 0 },
43           { 4, 10, 7,  0, 0 },
44           { 3,  4, 2, 94, 0 },
45           { 2,  3, 2, 47, 0 }
46 };
47 
48 #define OTUS_TX_DATA_LIST_COUNT         8
49 #define OTUS_RX_DATA_LIST_COUNT         1
50 
51 #define OTUS_CMD_TIMEOUT      1000
52 #define OTUS_TX_TIMEOUT                 1000
53 
54 #define OTUS_UID(aid)                   (IEEE80211_AID(aid) + 4)
55 
56 #define OTUS_MAX_TXCMDSZ      64
57 #define OTUS_RXBUFSZ                    (8 * 1024)
58 #define OTUS_TXBUFSZ                    (4 * 1024)
59 
60 #define OTUS_RIDX_CCK1                   0
61 #define OTUS_RIDX_OFDM6                  4
62 #define OTUS_RIDX_OFDM24       8
63 #define OTUS_RIDX_MAX                   11
64 static const struct otus_rate {
65           uint8_t   rate;
66           uint8_t   mcs;
67 } otus_rates[] = {
68           {   2, 0x0 },
69           {   4, 0x1 },
70           {  11, 0x2 },
71           {  22, 0x3 },
72           {  12, 0xb },
73           {  18, 0xf },
74           {  24, 0xa },
75           {  36, 0xe },
76           {  48, 0x9 },
77           {  72, 0xd },
78           {  96, 0x8 },
79           { 108, 0xc }
80 };
81 
82 struct otus_rx_radiotap_header {
83           struct ieee80211_radiotap_header wr_ihdr;
84           uint8_t             wr_flags;
85           uint8_t             wr_rate;
86           uint16_t  wr_chan_freq;
87           uint16_t  wr_chan_flags;
88           uint8_t             wr_antsignal;
89 };
90 
91 #define OTUS_RX_RADIOTAP_PRESENT                            \
92           (1 << IEEE80211_RADIOTAP_FLAGS |                  \
93            1 << IEEE80211_RADIOTAP_RATE |                             \
94            1 << IEEE80211_RADIOTAP_CHANNEL |                \
95            1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
96 
97 struct otus_tx_radiotap_header {
98           struct ieee80211_radiotap_header wt_ihdr;
99           uint8_t             wt_flags;
100           uint8_t             wt_rate;
101           uint16_t  wt_chan_freq;
102           uint16_t  wt_chan_flags;
103 };
104 
105 #define OTUS_TX_RADIOTAP_PRESENT                            \
106           (1 << IEEE80211_RADIOTAP_FLAGS |                  \
107            1 << IEEE80211_RADIOTAP_RATE |                             \
108            1 << IEEE80211_RADIOTAP_CHANNEL)
109 
110 
111 struct otus_softc;
112 
113 struct otus_tx_cmd {
114           struct usbd_xfer    *xfer;
115           uint8_t                       *buf;
116           void                          *odata;
117           uint16_t            token;
118           uint8_t                       done;
119 };
120 
121 struct otus_rx_data {
122           struct otus_softc   *sc;
123           struct usbd_xfer    *xfer;
124           uint8_t                       *buf;
125 };
126 
127 struct otus_tx_data {
128           struct otus_softc             *sc;
129           struct usbd_xfer              *xfer;
130           uint8_t                                 *buf;
131           TAILQ_ENTRY(otus_tx_data)     next;
132 };
133 
134 struct otus_host_cmd {
135           void      (*cb)(struct otus_softc *, void *);
136           uint8_t   data[256];
137 };
138 
139 #define OTUS_HOST_CMD_RING_COUNT        32
140 struct otus_host_cmd_ring {
141           struct otus_host_cmd          cmd[OTUS_HOST_CMD_RING_COUNT];
142           int                           cur;
143           int                           next;
144           int                           queued;
145 };
146 
147 struct otus_node {
148           struct ieee80211_node                   ni;       /* must be first */
149           struct ieee80211_amrr_node    amn;
150           uint8_t                                 ridx[IEEE80211_RATE_MAXSIZE];
151 };
152 
153 struct otus_cmd_newstate {
154           enum ieee80211_state          state;
155           int                           arg;
156 };
157 
158 struct otus_cmd_key {
159           struct ieee80211_key          key;
160           uint16_t            associd;
161 };
162 
163 struct otus_softc {
164           device_t                      sc_dev;
165           struct ieee80211com           sc_ic;
166           struct ethercom                         sc_ec;
167 #define sc_if       sc_ec.ec_if
168           int                                     (*sc_newstate)(struct ieee80211com *,
169                                                       enum ieee80211_state, int);
170           void                                    (*sc_led_newstate)(struct otus_softc *);
171 
172           struct usbd_device *                    sc_udev;
173           struct usbd_interface *                 sc_iface;
174 
175           struct ar5416eeprom           sc_eeprom;
176           uint8_t                                 sc_capflags;
177           uint8_t                                 sc_rxmask;
178           uint8_t                                 sc_txmask;
179 
180           struct usbd_pipe *            sc_data_tx_pipe;
181           struct usbd_pipe *            sc_data_rx_pipe;
182           struct usbd_pipe *            sc_cmd_tx_pipe;
183           struct usbd_pipe *            sc_cmd_rx_pipe;
184           uint8_t                       *sc_ibuf;
185           size_t                                  sc_ibuf_size;
186 
187           unsigned short                          sc_if_flags;
188           int                                     sc_tx_timer;
189           int                                     sc_fixed_ridx;
190           int                                     sc_bb_reset;
191 
192           struct ieee80211_channel      *sc_curchan;
193 
194           struct usb_task                         sc_task;
195           callout_t                     sc_scan_to;
196           callout_t                     sc_calib_to;
197           struct ieee80211_amrr                   sc_amrr;
198 
199           unsigned int                            sc_write_idx;
200           uint32_t                      sc_led_state;
201 
202           kcondvar_t                              sc_task_cv;
203           kcondvar_t                              sc_cmd_cv;
204           kmutex_t                      sc_cmd_mtx;
205           kmutex_t                      sc_task_mtx;
206           kmutex_t                      sc_write_mtx;
207           kmutex_t                      sc_tx_mtx;
208           kmutex_t                      sc_media_mtx;       /* XXX */
209 
210           const uint32_t                          *sc_phy_vals;
211 
212           struct {
213                     uint32_t  reg;
214                     uint32_t  val;
215           } __packed                              sc_write_buf[AR_FW_MAX_WRITES];
216 
217           struct otus_host_cmd_ring     sc_cmdq;
218           struct otus_tx_cmd            sc_tx_cmd;
219           struct otus_tx_data           sc_tx_data[OTUS_TX_DATA_LIST_COUNT];
220           TAILQ_HEAD(, otus_tx_data)    sc_tx_free_list;
221           struct otus_rx_data           sc_rx_data[OTUS_RX_DATA_LIST_COUNT];
222 
223           struct bpf_if *                         sc_drvbpf;
224           union {
225                     struct otus_rx_radiotap_header th;
226                     uint8_t   pad[64];
227           }                                       sc_rxtapu;
228 #define sc_rxtap    sc_rxtapu.th
229           int                                     sc_rxtap_len;
230           union {
231                     struct otus_tx_radiotap_header th;
232                     uint8_t   pad[64];
233           }                                       sc_txtapu;
234 #define sc_txtap    sc_txtapu.th
235           int                                     sc_txtap_len;
236 
237           uint8_t                                 sc_rx_error_msk;
238           int                                     sc_dying;
239 };
240 
241 #endif /* _IF_OTUSVAR_H_ */
242