1 /*        $NetBSD: if_malo_pcmciavar.h,v 1.4 2025/03/31 23:15:41 gutteridge Exp $         */
2 /*        $OpenBSD: if_malovar.h,v 1.27 2007/10/09 20:37:32 mglocker Exp $ */
3 
4 /*
5  * Copyright (c) 2007 Marcus Glocker <mglocker@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 /* simplify bus space access */
21 #define MALO_READ_1(sc, reg) \
22           bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, (reg))
23 #define MALO_READ_2(sc, reg) \
24           bus_space_read_2((sc)->sc_iot, (sc)->sc_ioh, (reg))
25 #ifdef    __BUS_SPACE_HAS_STREAM_METHODS
26 #define   MALO_READ_MULTI_2(sc, reg, off, size) \
27           bus_space_read_multi_stream_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (off), (size))
28 #else
29 #if _BYTE_ORDER == _LITTLE_ENDIAN
30 #define   MALO_READ_MULTI_2(sc, reg, off, size) \
31           bus_space_read_multi_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (off), (size))
32 #else
33 #error bus_space_read_multi_stream_2() is not supported
34 #endif
35 #endif
36 #define MALO_WRITE_1(sc, reg, val) \
37           bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
38 #define MALO_WRITE_2(sc, reg, val) \
39           bus_space_write_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (val))
40 #ifdef    __BUS_SPACE_HAS_STREAM_METHODS
41 #define MALO_WRITE_MULTI_2(sc, reg, off, size) \
42           bus_space_write_multi_stream_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (off), (size))
43 #else
44 #if _BYTE_ORDER == _LITTLE_ENDIAN
45 #define MALO_WRITE_MULTI_2(sc, reg, off, size) \
46           bus_space_write_multi_2((sc)->sc_iot, (sc)->sc_ioh, (reg), (off), (size))
47 #else
48 #error bus_space_write_multi_stream_2() is not supported
49 #endif
50 #endif
51 
52 /* miscellaneous */
53 #define MALO_FW_HELPER_BSIZE  256       /* helper FW block size */
54 #define MALO_FW_HELPER_LOADED 0x10      /* helper FW loaded */
55 #define MALO_FW_MAIN_MAXRETRY 20        /* main FW block resend max retry */
56 #define MALO_CMD_BUFFER_SIZE  4096      /* cmd buffer */
57 #define MALO_DATA_BUFFER_SIZE 4096      /* data buffer */
58 
59 /* device flags */
60 #define MALO_DEVICE_ATTACHED  (1 << 0)
61 #define MALO_DEVICE_ENABLED   (1 << 1)
62 #define MALO_FW_LOADED                  (1 << 2)
63 #define MALO_ASSOC_FAILED     (1 << 3)
64 
65 /*
66  * FW command structures
67  */
68 struct malo_cmd_header {
69           uint16_t  cmd;
70           uint16_t  size;
71           uint16_t  seqnum;
72           uint16_t  result;
73           /* malo_cmd_body */
74 };
75 
76 struct malo_cmd_body_spec {
77           uint16_t  hw_if_version;
78           uint16_t  hw_version;
79           uint16_t  num_of_wcb;
80           uint16_t  num_of_mcast;
81           uint8_t             macaddr[ETHER_ADDR_LEN];
82           uint16_t  regioncode;
83           uint16_t  num_of_antenna;
84           uint32_t  fw_version;
85           uint32_t  wcbbase;
86           uint32_t  rxpdrdptr;
87           uint32_t  rxpdwrptr;
88           uint32_t  fw_capinfo;
89 } __packed;
90 
91 struct malo_cmd_body_scan {
92           uint8_t             bsstype;
93           uint8_t             bssid[ETHER_ADDR_LEN];
94           /* malo_cmd_tlv_ssid */
95           /* malo_cmd_tlv_chanlist */
96           /* malo_cmd_tlv_rates */
97           /* malo_cmd_tlv_numprobes */
98 } __packed;
99 
100 struct malo_cmd_body_rsp_scan {
101           uint16_t  bufsize;
102           uint8_t             numofset;
103 } __packed;
104 struct malo_cmd_body_rsp_scan_set {
105           uint16_t  size;
106           uint8_t             bssid[ETHER_ADDR_LEN];
107           uint8_t             rssi;
108           uint8_t             timestamp[8];
109           uint16_t  beaconintvl;
110           uint16_t  capinfo;
111           uint8_t             data[0];
112 } __packed;
113 
114 struct malo_cmd_body_auth {
115           uint8_t             peermac[ETHER_ADDR_LEN];
116           uint8_t             authtype;
117 } __packed;
118 
119 #define MALO_WEP_ACTION_TYPE_ADD        0x02
120 #define MALO_WEP_ACTION_TYPE_REMOVE     0x04
121 #define MALO_WEP_ACTION_TYPE_DEFAULT    0x08
122 #define MALO_WEP_KEY_TYPE_40BIT                   0x01
123 #define MALO_WEP_KEY_TYPE_104BIT        0x02
124 struct malo_cmd_body_wep {
125           uint16_t  action;
126           uint16_t  key_index;
127           uint8_t             key_type_1;
128           uint8_t             key_type_2;
129           uint8_t             key_type_3;
130           uint8_t             key_type_4;
131           uint8_t             key_value_1[16];
132           uint8_t             key_value_2[16];
133           uint8_t             key_value_3[16];
134           uint8_t             key_value_4[16];
135 } __packed;
136 
137 #define MALO_OID_BSS                    0x00
138 #define MALO_OID_RATE                   0x01
139 #define MALO_OID_BCNPERIOD    0x02
140 #define MALO_OID_DTIMPERIOD   0x03
141 #define MALO_OID_ASSOCTIMEOUT 0x04
142 #define MALO_OID_RTSTRESH     0x05
143 #define MALO_OID_SHORTRETRY   0x06
144 #define MALO_OID_LONGRETRY    0x07
145 #define MALO_OID_FRAGTRESH    0x08
146 #define MALO_OID_80211D                 0x09
147 #define MALO_OID_80211H                 0x0a
148 struct malo_cmd_body_snmp {
149           uint16_t  action;
150           uint16_t  oid;
151           uint16_t  size;
152           uint8_t             data[128];
153 } __packed;
154 
155 struct malo_cmd_body_radio {
156           uint16_t  action;
157           uint16_t  control;
158 } __packed;
159 
160 struct malo_cmd_body_channel {
161           uint16_t  action;
162           uint16_t  channel;
163           uint16_t  rftype;
164           uint16_t  reserved;
165           uint8_t             channel_list[32];
166 } __packed;
167 
168 struct malo_cmd_body_txpower {
169           uint16_t  action;
170           int16_t             txpower;
171 } __packed;
172 
173 struct malo_cmd_body_antenna {
174           uint16_t  action;
175           uint16_t  antenna_mode;
176 } __packed;
177 
178 struct malo_cmd_body_macctrl {
179           uint16_t  action;
180           uint16_t  reserved;
181 } __packed;
182 
183 struct malo_cmd_body_macaddr {
184           uint16_t  action;
185           uint8_t             macaddr[ETHER_ADDR_LEN];
186 } __packed;
187 
188 struct malo_cmd_body_assoc {
189           uint8_t             peermac[ETHER_ADDR_LEN];
190           uint16_t  capinfo;
191           uint16_t  listenintrv;
192           uint16_t  bcnperiod;
193           uint8_t             dtimperiod;
194           /* malo_cmd_tlv_ssid */
195           /* malo_cmd_tlv_phy */
196           /* malo_cmd_tlv_cf */
197           /* malo_cmd_tlv_rate */
198 } __packed;
199 
200 struct malo_cmd_body_rsp_assoc {
201           uint16_t  capinfo;
202           uint16_t  status;
203           uint16_t  assoc_id;
204           uint16_t  info_len;
205           /* uint8_t          info[270] */
206 } __packed;
207 
208 struct malo_cmd_body_80211d {
209           uint16_t  action;
210           /* malo_cmd_tlv_80211d */
211 } __packed;
212 
213 struct malo_cmd_body_bgscan_config {
214           uint16_t  action;
215           uint8_t             enable;
216           uint8_t             bsstype;
217           uint8_t             chperscan;
218           uint8_t             discard;
219           uint16_t  reserved;
220           uint32_t  scanintvl;
221           uint32_t  storecond;
222           uint32_t  reportcond;
223           uint16_t  maxscanres;
224 } __packed;
225 
226 struct malo_cmd_body_bgscan_query {
227           uint8_t             flush;
228 } __packed;
229 
230 #define MALO_RATE_BITMAP_DS1  (1 << 0)
231 #define MALO_RATE_BITMAP_DS2  (1 << 1)
232 #define MALO_RATE_BITMAP_DS5  (1 << 2)
233 #define MALO_RATE_BITMAP_DS11 (1 << 3)
234 #define MALO_RATE_BITMAP_OFDM6          (1 << 5)
235 #define MALO_RATE_BITMAP_OFDM9          (1 << 6)
236 #define MALO_RATE_BITMAP_OFDM12         (1 << 7)
237 #define MALO_RATE_BITMAP_OFDM18         (1 << 8)
238 #define MALO_RATE_BITMAP_OFDM24         (1 << 9)
239 #define MALO_RATE_BITMAP_OFDM36         (1 << 10)
240 #define MALO_RATE_BITMAP_OFDM48         (1 << 11)
241 #define MALO_RATE_BITMAP_OFDM54         (1 << 12)
242 #define MALO_RATE_BITMAP_AUTO 0x1fef
243 struct malo_cmd_body_rate {
244           uint16_t  action;
245           uint16_t  hwauto;
246           uint16_t  ratebitmap;
247 } __packed;
248 
249 /*
250  * FW command TLV structures
251  */
252 #define MALO_TLV_TYPE_SSID    0x0000
253 #define MALO_TLV_TYPE_RATES   0x0001
254 #define MALO_TLV_TYPE_PHY     0x0003
255 #define MALO_TLV_TYPE_CF      0x0004
256 #define MALO_TLV_TYPE_80211D  0x0007
257 #define MALO_TLV_TYPE_CHANLIST          0x0101
258 #define MALO_TLV_TYPE_NUMPROBES         0x0102
259 #define MALO_TLV_TYPE_PASSEID 0x010a
260 
261 struct malo_cmd_tlv_ssid {
262           uint16_t  type;
263           uint16_t  size;
264           uint8_t             data[0];
265 } __packed;
266 
267 struct malo_cmd_tlv_rates {
268           uint16_t  type;
269           uint16_t  size;
270           uint8_t             data[0];
271 } __packed;
272 
273 struct malo_cmd_tlv_phy {
274           uint16_t  type;
275           uint16_t  size;
276           uint8_t             data[0];
277 } __packed;
278 
279 struct malo_cmd_tlv_cf {
280           uint16_t  type;
281           uint16_t  size;
282           uint8_t             data[0];
283 } __packed;
284 
285 struct malo_cmd_tlv_80211d_param {
286           uint8_t             firstchannel;
287           uint8_t             numchannels;
288           uint8_t             maxtxpower;
289 } __packed;
290 struct malo_cmd_tlv_80211d {
291           uint16_t  type;
292           uint16_t  size;
293           uint8_t             countrycode[3];
294           struct malo_cmd_tlv_80211d_param data[12];
295 } __packed;
296 
297 struct malo_cmd_tlv_chanlist_param {
298           uint8_t             radiotype;
299           uint8_t             channumber;
300           uint8_t             scantype;
301           uint16_t  minscantime;
302           uint16_t  maxscantime;
303 } __packed;
304 #define CHANNELS    12
305 struct malo_cmd_tlv_chanlist {
306           uint16_t  type;
307           uint16_t  size;
308           struct malo_cmd_tlv_chanlist_param data[CHANNELS];
309 } __packed;
310 
311 struct malo_cmd_tlv_numprobes {
312           uint16_t  type;
313           uint16_t  size;
314           uint16_t  numprobes;
315 } __packed;
316 
317 struct malo_cmd_tlv_passeid {
318           uint16_t  type;
319           uint16_t  size;
320           uint8_t             data[0];
321 } __packed;
322 
323 /* RX descriptor */
324 #define MALO_RX_STATUS_OK     0x0001
325 struct malo_rx_desc {
326           uint16_t  status;
327           uint8_t             snr;
328           uint8_t             control;
329           uint16_t  pkglen;
330           uint8_t             nf;
331           uint8_t             rate;
332           uint32_t  pkgoffset;
333           uint32_t  reserved1;
334           uint8_t             priority;
335           uint8_t             reserved2[3];
336 } __packed;
337 
338 /* TX descriptor */
339 struct malo_tx_desc {
340           uint32_t  status;
341           uint32_t  control;
342           uint32_t  pkgoffset;
343           uint16_t  pkglen;
344           uint8_t             dstaddr[ETHER_ADDR_LEN];
345           uint8_t             priority;
346           uint8_t             flags;
347           uint8_t             reserved[2];
348 } __packed;
349 
350 /* scanned network */
351 struct malo_networks {
352           uint8_t             bssid[ETHER_ADDR_LEN];
353           uint8_t             rssi;
354           uint8_t             timestamp[8];
355           uint16_t  beaconintvl;
356           uint16_t  capinfo;
357           uint8_t             ssid[32];
358           uint8_t             rates[14];
359           uint8_t             channel;
360 } __packed;
361 
362 /*
363  * Softc
364  */
365 struct malo_softc {
366           device_t             sc_dev;
367           struct ethercom                sc_ec;
368 #define sc_if       sc_ec.ec_if
369           struct ieee80211com  sc_ic;
370           void                          *sc_soft_ih;
371           bus_space_tag_t                sc_iot;
372           bus_space_handle_t   sc_ioh;
373           int                            (*sc_newstate)
374                                          (struct ieee80211com *, enum ieee80211_state,
375                                              int);
376 
377           int                            sc_flags;
378           uint8_t                       *sc_fw_h;
379           uint8_t                       *sc_fw_m;
380           size_t                         sc_fw_h_size;
381           size_t                         sc_fw_m_size;
382           int                            sc_cmd_ctxsave;
383           uint8_t                       *sc_cmd;
384           uint8_t                       *sc_data;
385           uint8_t                        sc_curchan;
386           int                            sc_net_num;
387           int                            sc_net_cur;
388           struct malo_networks           sc_net[12];
389           callout_t            sc_scan_ch;
390 #if NBPFILTER > 0
391           void                          *sc_drvbpf;
392 #endif
393           kcondvar_t                     sc_cv;
394           kmutex_t             sc_mtx;
395 };
396