1 /*        $NetBSD: if_atureg.h,v 1.13 2022/02/16 22:00:56 andvar Exp $ */
2 /*        $OpenBSD: if_atureg.h,v 1.21 2004/12/23 13:19:38 dlg Exp $ */
3 /*
4  * Copyright (c) 2003
5  *        Daan Vreeken <Danovitsch@Vitsch.net>.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *        This product includes software developed by Daan Vreeken.
18  * 4. Neither the name of the author nor the names of any co-contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY DAAN VREEKEN AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL Daan Vreeken OR THE VOICES IN HIS HEAD
26  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32  * THE POSSIBILITY OF SUCH DAMAGE.
33  *
34  */
35 
36 #define ATU_CONFIG_NO                   1
37 #define ATU_IFACE_IDX                   0
38 
39 /* the number of simultaneously requested RX transfers */
40 #define ATU_RX_LIST_CNT       1
41 
42 /*
43  * the number of simultaneously started TX transfers
44  * my measurements :
45  * 1                430.82 KB/sec
46  * 2                534.66 KB/sec
47  * 3                536.23 KB/sec
48  * 4                537.80 KB/sec
49  * 6                537.30 KB/sec
50  * 8                535.31 KB/sec
51  * 16               535.68 KB/sec
52  * 128              535.67 KB/sec (before you ask : yes, 128 is silly :)
53  * (+/- 24% increase)
54  */
55 #define ATU_TX_LIST_CNT       8
56 
57 /*
58  * According to the 802.11 spec (7.1.2) the frame body can be up to 2312 bytes
59  */
60 #define ATU_RX_BUFSZ                    (ATU_RX_HDRLEN + \
61                                          sizeof(struct ieee80211_frame_addr4) + 2312 + 4)
62 /* BE CAREFULL! should add ATU_TX_PADDING */
63 #define ATU_TX_BUFSZ                    (ATU_TX_HDRLEN + \
64                                          sizeof(struct ieee80211_frame_addr4) + 2312)
65 
66 #define ATU_MIN_FRAMELEN      60
67 
68 /*
69  * Sending packets of more than 1500 bytes confuses some access points, so the
70  * default MTU is set to 1500 but can be increased up to 2310 bytes using
71  * ifconfig
72  */
73 #define ATU_DEFAULT_MTU       1500
74 #define ATU_MAX_MTU           (2312 - 2)
75 
76 #define ATU_ENDPT_RX                    0x0
77 #define ATU_ENDPT_TX                    0x1
78 #define ATU_ENDPT_MAX                   0x2
79 
80 #define ATU_TX_TIMEOUT                  10000
81 #define ATU_JOIN_TIMEOUT      2000
82 
83 #define ATU_NO_QUIRK                    0x0000
84 #define ATU_QUIRK_NO_REMAP    0x0001
85 #define ATU_QUIRK_FW_DELAY    0x0002
86 
87 #define ATU_DEFAULT_SSID      ""
88 #define ATU_DEFAULT_CHANNEL   10
89 
90 enum atu_radio_type {
91           RadioRFMD = 0,
92           RadioRFMD2958,
93           RadioRFMD2958_SMC,
94           RadioIntersil,
95           AT76C503_i3863,
96           AT76C503_rfmd_acc,
97           AT76C505_rfmd
98 };
99 
100 struct atu_type {
101           uint16_t            atu_vid;
102           uint16_t            atu_pid;
103           enum atu_radio_type atu_radio;
104           uint16_t            atu_quirk;
105 };
106 
107 struct atu_softc;
108 
109 struct atu_chain {
110           struct atu_softc    *atu_sc;
111           struct usbd_xfer    *atu_xfer;
112           char                          *atu_buf;
113           struct mbuf                   *atu_mbuf;
114           uint8_t                       atu_idx;
115           uint16_t            atu_length;
116           int                           atu_in_xfer;
117           SLIST_ENTRY(atu_chain)        atu_list;
118 };
119 
120 struct atu_cdata {
121           struct atu_chain    atu_tx_chain[ATU_TX_LIST_CNT];
122           struct atu_chain    atu_rx_chain[ATU_RX_LIST_CNT];
123 
124           SLIST_HEAD(atu_list_head, atu_chain)    atu_rx_free;
125           struct atu_list_head          atu_tx_free;
126 
127           uint8_t                       atu_tx_inuse;
128           uint8_t                       atu_tx_last_idx;
129 };
130 
131 #define MAX_SSID_LEN                    32
132 #define ATU_AVG_TIME                    20
133 
134 struct atu_softc {
135           device_t atu_dev;
136           struct ethercom               sc_ec;
137           struct ieee80211com sc_ic;
138           int                           (*sc_newstate)(struct ieee80211com *,
139                                             enum ieee80211_state, int);
140 
141           kmutex_t            sc_media_mtx;       /* XXX */
142 
143           char                          sc_state;
144 #define ATU_S_DEAD            0
145 #define ATU_S_OK              1
146 #define ATU_S_UNCONFIG                  2
147           char                          sc_cmd;
148 #define ATU_C_NONE            0
149 #define ATU_C_SCAN            1
150 #define ATU_C_JOIN            2
151           struct usb_task               sc_task;
152 
153           struct usbd_device  *atu_udev;
154           struct usbd_interface         *atu_iface;
155           struct ethercom               atu_ec;
156           struct ifmedia                atu_media;
157           int                           atu_ed[ATU_ENDPT_MAX];
158           struct usbd_pipe    *atu_ep[ATU_ENDPT_MAX];
159           int                           atu_unit;
160           int                           atu_if_flags;
161 
162           struct atu_cdata    atu_cdata;
163 
164           struct timeval                atu_rx_notice;
165 
166           uint8_t                       atu_bssid[ETHER_ADDR_LEN];
167           enum atu_radio_type atu_radio;
168           uint16_t            atu_quirk;
169 
170           uint8_t                       atu_channel;
171           uint16_t            atu_desired_channel;
172           uint8_t                       atu_mode;
173 #define NO_MODE_YET           0
174 #define AD_HOC_MODE           1
175 #define INFRASTRUCTURE_MODE   2
176 
177           uint8_t                       atu_radio_on;
178           uint8_t                       atu_encrypt;
179 #define ATU_WEP_RX            0x01
180 #define ATU_WEP_TX            0x02
181 #define ATU_WEP_TXRX                    (ATU_WEP_RX | ATU_WEP_TX)
182           int                           atu_wepkey;
183           int                           atu_wepkeylen;
184           uint8_t                       atu_wepkeys[4][13];
185 };
186 
187 #define   sc_if     sc_ec.ec_if
188 
189 /* Commands for uploading the firmware (standard DFU interface) */
190 #define DFU_DNLOAD            UT_WRITE_CLASS_INTERFACE, 0x01
191 #define DFU_GETSTATUS                   UT_READ_CLASS_INTERFACE, 0x03
192 #define DFU_GETSTATE                    UT_READ_CLASS_INTERFACE, 0x05
193 #define DFU_REMAP             UT_WRITE_VENDOR_INTERFACE, 0x0a
194 
195 /* DFU states */
196 #define DFUState_AppIdle      0
197 #define DFUState_AppDetach    1
198 #define DFUState_DFUIdle      2
199 #define DFUState_DnLoadSync   3
200 #define DFUState_DnLoadBusy   4
201 #define DFUState_DnLoadIdle   5
202 #define DFUState_ManifestSync 6
203 #define DFUState_Manifest     7
204 #define DFUState_ManifestWait 8
205 #define DFUState_UploadIdle   9
206 #define DFUState_DFUError     10
207 
208 #define DFU_MaxBlockSize      1024
209 
210 /* AT76c503 operating modes */
211 #define MODE_NONE                       0x00
212 #define MODE_NETCARD                              0x01
213 #define MODE_CONFIG                     0x02
214 #define MODE_DFU                        0x03
215 #define MODE_NOFLASHNETCARD             0x04
216 
217 /* AT76c503 commands */
218 #define CMD_SET_MIB                     0x01
219 #define CMD_START_SCAN                            0x03
220 #define CMD_JOIN                        0x04
221 #define CMD_START_IBSS                            0x05
222 #define CMD_RADIO                       0x06
223 #define CMD_RADIO_ON                              0x06
224 #define CMD_RADIO_OFF                             0x07
225 #define CMD_STARTUP                     0x0b
226 
227 /* AT76c503 status messages -  used in atu_wait_completion */
228 #define STATUS_IDLE                     0x00
229 #define STATUS_COMPLETE                           0x01
230 #define STATUS_UNKNOWN                            0x02
231 #define STATUS_INVALID_PARAMETER        0x03
232 #define STATUS_FUNCTION_NOT_SUPPORTED   0x04
233 #define STATUS_TIME_OUT                           0x07
234 #define STATUS_IN_PROGRESS              0x08
235 #define STATUS_HOST_FAILURE             0xff
236 #define STATUS_SCAN_FAILED              0xf0
237 
238 /* AT76c503 command header */
239 struct atu_cmd {
240           uByte                         Cmd;
241           uByte                         Reserved;
242           uWord                         Size;
243 } UPACKED;
244 
245 /* CMD_SET_MIB command (0x01) */
246 struct atu_cmd_set_mib {
247           /* AT76c503 command header */
248           uByte               AtCmd;
249           uByte               AtReserved;
250           uWord               AtSize;
251 
252           /* MIB header */
253           uByte               MIBType;
254           uByte               MIBSize;
255           uByte               MIBIndex;
256           uByte               MIBReserved;
257 
258           /* MIB data */
259           uByte               data[72];
260 } UPACKED;
261 
262 /* CMD_STARTUP command (0x0b) */
263 struct atu_cmd_card_config {
264           uByte                         Cmd;
265           uByte                         Reserved;
266           uWord                         Size;
267 
268           uByte                         ExcludeUnencrypted;
269           uByte                         PromiscuousMode;
270           uByte                         ShortRetryLimit;
271           uByte                         EncryptionType;
272           uWord                         RTS_Threshold;
273           uWord                         FragThreshold;                /* 256 .. 2346 */
274           uByte                         BasicRateSet[4];
275           uByte                         AutoRateFallback;
276           uByte                         Channel;
277           uByte                         PrivacyInvoked;               /* wep */
278           uByte                         WEP_DefaultKeyID;   /* 0 .. 3 */
279           uByte                         SSID[MAX_SSID_LEN];
280           uByte                         WEP_DefaultKey[4][13];
281           uByte                         SSID_Len;
282           uByte                         ShortPreamble;
283           uWord                         BeaconPeriod;
284 } UPACKED;
285 
286 /* CMD_SCAN command (0x03) */
287 struct atu_cmd_do_scan {
288           uByte                         Cmd;
289           uByte                         Reserved;
290           uWord                         Size;
291 
292           uByte                         BSSID[ETHER_ADDR_LEN];
293           uByte                         SSID[MAX_SSID_LEN];
294           uByte                         ScanType;
295           uByte                         Channel;
296           uWord                         ProbeDelay;
297           uWord                         MinChannelTime;
298           uWord                         MaxChannelTime;
299           uByte                         SSID_Len;
300           uByte                         InternationalScan;
301 } UPACKED;
302 
303 #define ATU_SCAN_ACTIVE                 0x00
304 #define ATU_SCAN_PASSIVE      0x01
305 
306 /* CMD_JOIN command (0x04) */
307 struct atu_cmd_join {
308           uByte                         Cmd;
309           uByte                         Reserved;
310           uWord                         Size;
311 
312           uByte                         bssid[ETHER_ADDR_LEN];
313           uByte                         essid[32];
314           uByte                         bss_type;
315           uByte                         channel;
316           uWord                         timeout;
317           uByte                         essid_size;
318           uByte                         reserved;
319 } UPACKED;
320 
321 /* CMD_START_IBSS (0x05) */
322 struct atu_cmd_start_ibss {
323           uByte               Cmd;
324           uByte               Reserved;
325           uWord               Size;
326 
327           uByte               BSSID[ETHER_ADDR_LEN];
328           uByte               SSID[32];
329           uByte               BSSType;
330           uByte               Channel;
331           uByte               SSIDSize;
332           uByte               Res[3];
333 } UPACKED;
334 
335 /*
336  * The At76c503 adapters come with different types of radios on them.
337  * At this moment the driver supports adapters with RFMD and Intersil radios.
338  */
339 
340 /* The config structure of an RFMD radio */
341 struct atu_rfmd_conf {
342           uint8_t             CR20[14];
343           uint8_t             CR21[14];
344           uint8_t             BB_CR[14];
345           uint8_t             PidVid[4];
346           uint8_t             MACAddr[ETHER_ADDR_LEN];
347           uint8_t             RegulatoryDomain;
348           uint8_t             LowPowerValues[14];
349           uint8_t             NormalPowerValues[14];
350           uint8_t             Reserved[3];
351           /* then we have 84 bytes, somehow Windows reads 95?? */
352           uint8_t             Rest[11];
353 } UPACKED;
354 
355 /* The config structure of an Intersil radio */
356 struct atu_intersil_conf {
357           uint8_t             MACAddr[ETHER_ADDR_LEN];
358           /* From the HFA3861B manual : */
359           /* Manual TX power control (7bit : -64 to 63) */
360           uint8_t             CR31[14];
361           /* TX power measurement */
362           uint8_t             CR58[14];
363           uint8_t             PidVid[4];
364           uint8_t             RegulatoryDomain;
365           uint8_t             Reserved[1];
366 } UPACKED;
367 
368 
369 /* Firmware information request */
370 struct atu_fw {
371           uint8_t             major;
372           uint8_t             minor;
373           uint8_t             patch;
374           uint8_t             build;
375 } UPACKED;
376 
377 /*
378  * The header the AT76c503 puts in front of RX packets (for both management &
379  * data)
380  */
381 struct atu_rx_hdr {
382           uWord                         length;
383           uByte                         rx_rate;
384           uByte                         newbss;
385           uByte                         fragmentation;
386           uByte                         rssi;
387           uByte                         link_quality;
388           uByte                         noise_level;
389           uDWord                        rx_time;
390 } UPACKED;
391 #define ATU_RX_HDRLEN sizeof(struct atu_rx_hdr)
392 
393 /*
394  * The header we have to put in front of a TX packet before sending it to the
395  * AT76c503
396  */
397 struct atu_tx_hdr {
398           uWord                                   length;
399           uByte                                   tx_rate;
400           uByte                                   padding;
401           uByte                                   reserved[4];
402 } UPACKED;
403 #define ATU_TX_HDRLEN sizeof(struct atu_tx_hdr)
404 
405 #define NR(x)                 (void *)((long)x)
406 
407 /*
408  * The linux driver uses separate routines for every mib request they do
409  * (eg. set_radio / set_preamble / set_frag / etc etc )
410  * We just define a list of types, sizes and offsets and use those
411  */
412 
413 /*        Name                                    Type                Size      Index     */
414 #define MIB_LOCAL                       0x01
415 #define  MIB_LOCAL__BEACON_ENABLE       MIB_LOCAL,          1,        2
416 #define  MIB_LOCAL__AUTO_RATE_FALLBACK  MIB_LOCAL,          1,        3
417 #define  MIB_LOCAL__SSID_SIZE           MIB_LOCAL,          1,        5
418 #define  MIB_LOCAL__PREAMBLE            MIB_LOCAL,          1,        9
419 #define MIB_MAC_ADDR                              0x02
420 #define  MIB_MAC_ADDR__ADDR             MIB_MAC_ADDR,       6,        0
421 #define MIB_MAC                                   0x03
422 #define  MIB_MAC__FRAG                            MIB_MAC,  2,        8
423 #define  MIB_MAC__RTS                             MIB_MAC,  2,        10
424 #define  MIB_MAC__DESIRED_SSID                    MIB_MAC,  32,       28
425 #define MIB_MAC_MGMT                              0x05
426 #define  MIB_MAC_MGMT__BEACON_PERIOD    MIB_MAC_MGMT,       2,        0
427 #define  MIB_MAC_MGMT__CURRENT_BSSID    MIB_MAC_MGMT,       6,        14
428 #define  MIB_MAC_MGMT__CURRENT_ESSID    MIB_MAC_MGMT,       32,       20
429 #define  MIB_MAC_MGMT__POWER_MODE       MIB_MAC_MGMT,       1,        53
430 #define  MIB_MAC_MGMT__IBSS_CHANGE      MIB_MAC_MGMT,       1,        54
431 #define MIB_MAC_WEP                     0x06
432 #define  MIB_MAC_WEP__PRIVACY_INVOKED   MIB_MAC_WEP,        1,        0
433 #define  MIB_MAC_WEP__KEY_ID            MIB_MAC_WEP,        1,        1
434 #define  MIB_MAC_WEP__ICV_ERROR_COUNT   MIB_MAC_WEP,        4,        4
435 #define  MIB_MAC_WEP__EXCLUDED_COUNT    MIB_MAC_WEP,        4,        8
436 #define  MIB_MAC_WEP__KEYS(nr)                    MIB_MAC_WEP,        13,       12+(nr)*13
437 #define  MIB_MAC_WEP__ENCR_LEVEL        MIB_MAC_WEP,        1,        64
438 #define MIB_PHY                                   0x07
439 #define  MIB_PHY__CHANNEL               MIB_PHY,  1,        20
440 #define  MIB_PHY__REG_DOMAIN            MIB_PHY,  1,        23
441 #define MIB_FW_VERSION                            0x08
442 #define MIB_DOMAIN                      0x09
443 #define  MIB_DOMAIN__POWER_LEVELS       MIB_DOMAIN,         14,       0
444 #define  MIB_DOMAIN__CHANNELS           MIB_DOMAIN,         14,       14
445 
446 #define ATU_WEP_OFF                     0
447 #define ATU_WEP_40BITS                            1
448 #define ATU_WEP_104BITS                           2
449 
450 #define POWER_MODE_ACTIVE               1
451 #define POWER_MODE_SAVE                           2
452 #define POWER_MODE_SMART                3
453 
454 #define PREAMBLE_SHORT                            1
455 #define PREAMBLE_LONG                             0
456