1 /*        $NetBSD: if_athn_usb.h,v 1.6 2019/09/14 12:36:35 maxv Exp $ */
2 /*        $OpenBSD: if_athn_usb.h,v 1.3 2012/11/10 14:35:06 mikeb Exp $         */
3 
4 /*-
5  * Copyright (c) 2011 Damien Bergamini <damien.bergamini@free.fr>
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 #ifndef _IF_ATHN_USB_H_
21 #define _IF_ATHN_USB_H_
22 
23 /* Maximum number of STAs firmware can handle. */
24 #define AR_USB_MAX_STA        8
25 
26 #define AR_USB_DEFAULT_NF     (-95)
27 
28 /* USB requests. */
29 #define AR_FW_DOWNLOAD                  0x30
30 #define AR_FW_DOWNLOAD_COMP   0x31
31 
32 /* USB endpoints addresses. */
33 #define AR_PIPE_TX_DATA       (UE_DIR_OUT | 1)
34 #define AR_PIPE_RX_DATA       (UE_DIR_IN  | 2)
35 #define AR_PIPE_RX_INTR       (UE_DIR_IN  | 3)
36 #define AR_PIPE_TX_INTR       (UE_DIR_OUT | 4)
37 
38 /* Wireless module interface commands. */
39 #define AR_WMI_CMD_ECHO                           0x001
40 #define AR_WMI_CMD_ACCESS_MEMORY        0x002
41 #define AR_WMI_CMD_DISABLE_INTR                   0x003
42 #define AR_WMI_CMD_ENABLE_INTR                    0x004
43 #define AR_WMI_CMD_RX_LINK              0x005
44 #define AR_WMI_CMD_ATH_INIT             0x006
45 #define AR_WMI_CMD_ABORT_TXQ            0x007
46 #define AR_WMI_CMD_STOP_TX_DMA                    0x008
47 #define AR_WMI_CMD_STOP_DMA_RECV        0x009
48 #define AR_WMI_CMD_ABORT_TX_DMA                   0x00a
49 #define AR_WMI_CMD_DRAIN_TXQ            0x00b
50 #define AR_WMI_CMD_DRAIN_TXQ_ALL        0x00c
51 #define AR_WMI_CMD_START_RECV           0x00d
52 #define AR_WMI_CMD_STOP_RECV            0x00e
53 #define AR_WMI_CMD_FLUSH_RECV           0x00f
54 #define AR_WMI_CMD_SET_MODE             0x010
55 #define AR_WMI_CMD_RESET                0x011
56 #define AR_WMI_CMD_NODE_CREATE                    0x012
57 #define AR_WMI_CMD_NODE_REMOVE                    0x013
58 #define AR_WMI_CMD_VAP_REMOVE           0x014
59 #define AR_WMI_CMD_VAP_CREATE           0x015
60 #define AR_WMI_CMD_BEACON_UPDATE        0x016
61 #define AR_WMI_CMD_REG_READ             0x017
62 #define AR_WMI_CMD_REG_WRITE            0x018
63 #define AR_WMI_CMD_RC_STATE_CHANGE      0x019
64 #define AR_WMI_CMD_RC_RATE_UPDATE       0x01a
65 #define AR_WMI_CMD_DEBUG_INFO           0x01b
66 #define AR_WMI_CMD_HOST_ATTACH                    0x01c
67 #define AR_WMI_CMD_TARGET_IC_UPDATE     0x01d
68 #define AR_WMI_CMD_TGT_STATS            0x01e
69 #define AR_WMI_CMD_TX_AGGR_ENABLE       0x01f
70 #define AR_WMI_CMD_TGT_DETACH           0x020
71 #define AR_WMI_CMD_TGT_TXQ_ENABLE       0x021
72 #define AR_WMI_CMD_AGGR_LIMIT           0x026
73 /* Wireless module interface events. */
74 /*
75  * XXX: the 3.7.4 Linux kernel differs with this.  This matches the
76  * 2.6.36 kernel.
77  */
78 #if 1     /* Linux 2.6.26 */
79 #define AR_WMI_EVT_TGT_RDY              0x001
80 #define AR_WMI_EVT_SWBA                           0x002
81 #define AR_WMI_EVT_FATAL                0x003
82 #define AR_WMI_EVT_TXTO                           0x004
83 #define AR_WMI_EVT_BMISS                0x005
84 #define AR_WMI_EVT_WLAN_TXCOMP                    0x006
85 #define AR_WMI_EVT_DELBA                0x007
86 #define AR_WMI_EVT_TXRATE               0x008
87 #else     /* Linux 3.7.4 */
88 #define AR_WMI_EVT_TGT_RDY              0x001
89 #define AR_WMI_EVT_SWBA                           0x002
90 #define AR_WMI_EVT_FATAL                0x003
91 #define AR_WMI_EVT_TXTO                           0x004
92 #define AR_WMI_EVT_BMISS                0x005
93 #define AR_WMI_EVT_DELBA                0x006
94 #define AR_WMI_EVT_TXSTATUS             0x007
95 #endif
96 
97 /* Structure for service AR_SVC_WMI_CONTROL. */
98 struct ar_wmi_cmd_hdr {
99           uint16_t  cmd_id;
100 #define AR_WMI_EVT_FLAG       0x1000
101 
102           uint16_t  seq_no;
103 } __packed;
104 
105 /* Values for AR_WMI_CMD_SET_MODE. */
106 #define AR_HTC_MODE_AUTO      0
107 #define AR_HTC_MODE_11A                 1
108 #define AR_HTC_MODE_11B                 2
109 #define AR_HTC_MODE_11G                 3
110 #define AR_HTC_MODE_FH                  4
111 #define AR_HTC_MODE_TURBO_A   5
112 #define AR_HTC_MODE_TURBO_G   6
113 #define AR_HTC_MODE_11NA      7
114 #define AR_HTC_MODE_11NG      8
115 
116 #define AR_MAX_WRITE_COUNT    32
117 /* Structure for command AR_WMI_CMD_REG_WRITE. */
118 struct ar_wmi_cmd_reg_write {
119           uint32_t  addr;
120           uint32_t  val;
121 } __packed;
122 
123 /* Structure for command AR_WMI_CMD_NODE_{CREATE,REMOVE}. */
124 struct ar_htc_target_sta {
125           uint16_t  associd;
126           uint16_t  txpower;
127           uint32_t  pariwisekey;
128           uint8_t             macaddr[IEEE80211_ADDR_LEN];
129           uint8_t             bssid[IEEE80211_ADDR_LEN];
130           uint8_t             sta_index;
131           uint8_t             vif_index;
132           uint8_t             vif_sta;
133           uint16_t  flags;
134 #define AR_HTC_STA_AUTH       0x0001
135 #define AR_HTC_STA_QOS        0x0002
136 #define AR_HTC_STA_ERP        0x0004
137 #define AR_HTC_STA_HT         0x0008
138 
139           uint16_t  htcap;
140           uint8_t             valid;
141           uint16_t  capinfo;
142           uint32_t  reserved[2];
143           uint16_t  txseqmgmt;
144           uint8_t             is_vif_sta;
145           uint16_t  maxampdu;
146           uint16_t  iv16;
147           uint32_t  iv32;
148 } __packed;
149 
150 /* Structures for command AR_WMI_CMD_RC_RATE_UPDATE. */
151 #define AR_HTC_RATE_MAX       30
152 struct ar_htc_rateset {
153           uint8_t             rs_nrates;
154           uint8_t             rs_rates[AR_HTC_RATE_MAX];
155 } __packed;
156 
157 struct ar_htc_target_rate {
158           uint8_t                       sta_index;
159           uint8_t                       isnew;
160           uint32_t            capflags;
161 #define AR_RC_DS_FLAG         0x00000001
162 #define AR_RC_TS_FLAG         0x00000002
163 #define AR_RC_40_FLAG         0x00000004
164 #define AR_RC_SGI_FLAG        0x00000008
165 #define AR_RC_HT_FLAG         0x00000010
166 
167           struct ar_htc_rateset         lg_rates;
168           struct ar_htc_rateset         ht_rates;
169 } __packed;
170 
171 /* Structure for command AR_WMI_CMD_TX_AGGR_ENABLE. */
172 struct ar_htc_target_aggr {
173           uint8_t             sta_index;
174           uint8_t             tidno;
175           uint8_t             aggr_enable;
176           uint8_t             padding;
177 } __packed;
178 
179 /* Structure for command AR_WMI_CMD_VAP_CREATE. */
180 struct ar_htc_target_vif {
181           uint8_t             index;
182           uint8_t             des_bssid[IEEE80211_ADDR_LEN];
183           uint32_t  opmode;
184 #define AR_HTC_M_IBSS                   0
185 #define AR_HTC_M_STA                    1
186 #define AR_HTC_M_WDS                    2
187 #define AR_HTC_M_AHDEMO                 3
188 #define AR_HTC_M_HOSTAP                 6
189 #define AR_HTC_M_MONITOR      8
190 
191           uint8_t             myaddr[IEEE80211_ADDR_LEN];
192           uint8_t             bssid[IEEE80211_ADDR_LEN];
193           uint32_t  flags;
194           uint32_t  flags_ext;
195           uint16_t  ps_sta;
196           uint16_t  rtsthreshold;
197           uint8_t             ath_cap;
198           int8_t              mcast_rate;
199 } __packed;
200 
201 /* Structure for command AM_WMI_CMD_TARGET_IC_UPDATE. */
202 struct ar_htc_cap_target {
203           uint32_t  flags;
204           uint32_t  flags_ext;
205           uint32_t  ampdu_limit;
206           uint8_t             ampdu_subframes;
207           uint8_t             ht_txchainmask;
208           uint8_t             lg_txchainmask;
209           uint8_t             rtscts_ratecode;
210           uint8_t             protmode;
211 } __packed;
212 
213 /* Structure for event AR_WMI_EVT_TXRATE. */
214 struct ar_wmi_evt_txrate {
215           uint32_t  txrate;
216           uint8_t             rssi_thresh;
217           uint8_t             per;
218 } __packed;
219 
220 /* HTC header. */
221 struct ar_htc_frame_hdr {
222           uint8_t             endpoint_id;
223           uint8_t             flags;
224 #define AR_HTC_FLAG_TRAILER   0x02
225 
226           uint16_t  payload_len;
227           uint8_t             control[4];
228 } __packed;
229 
230 /* Structure for HTC enpoint id 0. */
231 struct ar_htc_msg_hdr {
232           uint16_t  msg_id;
233 #define AR_HTC_MSG_READY                0x0001
234 #define AR_HTC_MSG_CONN_SVC             0x0002
235 #define AR_HTC_MSG_CONN_SVC_RSP                   0x0003
236 #define AR_HTC_MSG_SETUP_COMPLETE       0x0004
237 #define AR_HTC_MSG_CONF_PIPE            0x0005
238 #define AR_HTC_MSG_CONF_PIPE_RSP        0x0006
239 } __packed;
240 
241 /* Structure for services AR_SVC_WMI_DATA_{VO,VI,BE,BK}. */
242 struct ar_tx_frame {
243           uint8_t             data_type;
244 #define AR_HTC_AMPDU          1
245 #define AR_HTC_NORMAL         2
246 
247           uint8_t             node_idx;
248           uint8_t             vif_idx;
249           uint8_t             tid;
250           uint32_t  flags;
251 #define AR_HTC_TX_CTSONLY     0x00000001
252 #define AR_HTC_TX_RTSCTS      0x00000002
253 #define AR_HTC_TX_USE_MIN_RATE          0x00000100
254 
255           uint8_t             key_type;
256           uint8_t             key_idx;
257           uint8_t             reserved[26];
258 } __packed;
259 
260 /* Structure for service AR_SVC_WMI_MGMT. */
261 struct ar_tx_mgmt {
262           uint8_t             node_idx;
263           uint8_t             vif_idx;
264           uint8_t             tid;
265           uint8_t             flags;
266           uint8_t             key_type;
267           uint8_t             key_idx;
268           uint16_t  reserved;
269 } __packed;
270 
271 /* Structure for service AR_SVC_WMI_BEACON. */
272 struct ar_tx_bcn {
273           uint8_t             len_changed;
274           uint8_t             vif_idx;
275           uint16_t  rev;
276 } __packed;
277 
278 /* Structure for message AR_HTC_MSG_READY. */
279 struct ar_htc_msg_ready {
280           uint16_t  credits;
281           uint16_t  credits_size;
282           uint8_t             max_endpoints;
283           uint8_t             reserved;
284 } __packed;
285 
286 /* Structure for message AR_HTC_MSG_CONF_PIPE. */
287 struct ar_htc_msg_config_pipe {
288           uint8_t             pipe_id;
289           uint8_t             credits;
290 } __packed;
291 
292 /* Structure for message AR_HTC_MSG_CONN_SVC. */
293 struct ar_htc_msg_conn_svc {
294           uint16_t  svc_id;
295           uint16_t  conn_flags;
296           uint8_t             dl_pipeid;
297           uint8_t             ul_pipeid;
298           uint8_t             svc_meta_len;
299           uint8_t             reserved;
300 } __packed;
301 
302 /* Structure for message AR_HTC_MSG_CONN_SVC_RSP. */
303 struct ar_htc_msg_conn_svc_rsp {
304           uint16_t  svc_id;
305           uint8_t             status;
306 #define AR_HTC_SVC_SUCCESS    0
307 #define AR_HTC_SVC_NOT_FOUND  1
308 #define AR_HTC_SVC_FAILED     2
309 #define AR_HTC_SVC_NO_RESOURCES         3
310 #define AR_HTC_SVC_NO_MORE_EP 4
311 
312           uint8_t             endpoint_id;
313           uint16_t  max_msg_len;
314           uint8_t             svc_meta_len;
315           uint8_t             reserved;
316 } __packed;
317 
318 #define AR_SVC(grp, idx)      ((grp) << 8 | (idx))
319 #define AR_SVC_IDX(svc)                 ((svc) & 0xff)
320 /* Service groups. */
321 #define AR_SVC_GRP_RSVD                 0
322 #define AR_SVC_GRP_WMI                  1
323 /* Service identifiers for WMI group. */
324 #define AR_SVC_WMI_CONTROL    AR_SVC(AR_SVC_GRP_WMI, 0)
325 #define AR_SVC_WMI_BEACON     AR_SVC(AR_SVC_GRP_WMI, 1)
326 #define AR_SVC_WMI_CAB                  AR_SVC(AR_SVC_GRP_WMI, 2)
327 #define AR_SVC_WMI_UAPSD      AR_SVC(AR_SVC_GRP_WMI, 3)
328 #define AR_SVC_WMI_MGMT                 AR_SVC(AR_SVC_GRP_WMI, 4)
329 #define AR_SVC_WMI_DATA_VO    AR_SVC(AR_SVC_GRP_WMI, 5)
330 #define AR_SVC_WMI_DATA_VI    AR_SVC(AR_SVC_GRP_WMI, 6)
331 #define AR_SVC_WMI_DATA_BE    AR_SVC(AR_SVC_GRP_WMI, 7)
332 #define AR_SVC_WMI_DATA_BK    AR_SVC(AR_SVC_GRP_WMI, 8)
333 
334 struct ar_stream_hdr {
335           uint16_t  len;
336           uint16_t  tag;
337 #define AR_USB_RX_STREAM_TAG  0x4e00
338 #define AR_USB_TX_STREAM_TAG  0x697e
339 } __packed __attribute__((aligned(4)));
340 
341 #define AR_MAX_CHAINS         3
342 
343 /* Rx descriptor. */
344 struct ar_rx_status {
345           uint64_t  rs_tstamp;
346           uint16_t  rs_datalen;
347           uint8_t             rs_status;
348           uint8_t             rs_phyerr;
349           int8_t              rs_rssi;
350           int8_t              rs_rssi_ctl[AR_MAX_CHAINS];
351           int8_t              rs_rssi_ext[AR_MAX_CHAINS];
352           uint8_t             rs_keyix;
353           uint8_t             rs_rate;
354           uint8_t             rs_antenna;
355           uint8_t             rs_more;
356           uint8_t             rs_isaggr;
357           uint8_t             rs_moreaggr;
358           uint8_t             rs_num_delims;
359           uint8_t             rs_flags;
360 #define AR_RXS_FLAG_GI                  0x04
361 #define AR_RXS_FLAG_2040      0x08
362 
363           uint8_t             rs_dummy;
364           uint32_t  rs_evm[AR_MAX_CHAINS];
365 } __packed __attribute__((aligned(4)));
366 
367 
368 /*
369  * Driver definitions.
370  */
371 #define ATHN_USB_RX_LIST_COUNT          1
372 #define ATHN_USB_TX_LIST_COUNT          (8 + 1)             /* NB: +1 for beacons. */
373 
374 #define ATHN_USB_HOST_CMD_RING_COUNT    32
375 
376 #define ATHN_USB_RXBUFSZ      (8 * 1024)          /* XXX Linux 16K */
377 #define ATHN_USB_TXBUFSZ                          \
378           ((sizeof(struct ar_stream_hdr) +        \
379             sizeof(struct ar_htc_frame_hdr) +     \
380             sizeof(struct ar_tx_frame) +                    \
381             IEEE80211_MAX_LEN + 3) & ~3)
382 #define ATHN_USB_TXCMDSZ      512
383 
384 #define ATHN_USB_TX_TIMEOUT   5000      /* ms */
385 #define ATHN_USB_CMD_TIMEOUT  1000      /* ms */
386 
387 struct athn_usb_softc;
388 
389 struct athn_usb_rx_stream {
390           struct mbuf         *m;
391           int                 moff;
392           int                 left;
393 };
394 
395 struct athn_usb_rx_data {
396           struct athn_usb_softc         *sc;
397           struct usbd_xfer    *xfer;
398           uint8_t                       *buf;
399 };
400 
401 struct athn_usb_tx_data {
402           struct athn_usb_softc                   *sc;
403           struct usbd_xfer              *xfer;
404           uint8_t                                 *buf;
405           TAILQ_ENTRY(athn_usb_tx_data) next;
406 };
407 
408 struct athn_usb_host_cmd {
409           void      (*cb)(struct athn_usb_softc *, void *);
410           uint8_t   data[256];
411 };
412 
413 struct athn_usb_cmd_newstate {
414           enum ieee80211_state          state;
415           int                           arg;
416 };
417 
418 struct athn_usb_cmd_key {
419           struct ieee80211_node         *ni;
420           struct ieee80211_key          *key;
421 };
422 
423 struct athn_usb_aggr_cmd {
424           uint8_t   sta_index;
425           uint8_t   tid;
426 };
427 
428 struct athn_usb_host_cmd_ring {
429           struct athn_usb_host_cmd      cmd[ATHN_USB_HOST_CMD_RING_COUNT];
430           int                                     cur;
431           int                                     next;
432           int                                     queued;
433 };
434 
435 struct athn_usb_node {
436           struct athn_node              aun_an;
437           /* our stuff */
438 };
439 
440 struct athn_usb_softc {
441           struct athn_softc             usc_sc;
442 #define usc_dev               usc_sc.sc_dev
443 
444           enum {
445                     ATHN_INIT_NONE,
446                     ATHN_INIT_INITED
447           } usc_init_state;
448           int                                     usc_athn_attached;
449 
450           kmutex_t                      usc_lock;
451           kcondvar_t                              usc_wmi_cv;
452           kcondvar_t                              usc_htc_cv;
453 
454           kmutex_t                      usc_msg_mtx;
455           kcondvar_t                              usc_msg_cv;
456           kmutex_t                      usc_cmd_mtx;
457           kcondvar_t                              usc_cmd_cv;
458 
459           kcondvar_t                              usc_task_cv;
460           kmutex_t                      usc_task_mtx;
461           kmutex_t                      usc_tx_mtx;
462 
463           /* USB specific goo. */
464           struct usbd_device            *usc_udev;
465           struct usbd_interface                   *usc_iface;
466           struct usb_task                         usc_task;
467           int                                     usc_dying;
468 
469           u_int                                   usc_flags;
470 #define ATHN_USB_FLAG_NONE    0x00
471 #define ATHN_USB_FLAG_AR7010  0x01
472 
473           struct athn_usb_rx_stream     usc_rx_stream;
474 
475           struct usbd_pipe              *usc_tx_data_pipe;
476           struct usbd_pipe              *usc_rx_data_pipe;
477           struct usbd_pipe              *usc_rx_intr_pipe;
478           struct usbd_pipe              *usc_tx_intr_pipe;
479           uint8_t                       *usc_ibuf;
480           size_t                                  usc_ibufsize;
481 
482           struct ar_wmi_cmd_reg_write   usc_wbuf[AR_MAX_WRITE_COUNT];
483           int                                     usc_wcount;
484 
485           bool                                    usc_wmiactive;
486           bool                                    usc_htcactive;
487           uint16_t                      usc_wmi_seq_no;
488           uint16_t                      usc_wait_cmd_id;
489           uint16_t                      usc_wait_msg_id;
490           void                                    *usc_obuf;
491           struct ar_htc_msg_conn_svc_rsp          *usc_msg_conn_svc_rsp;
492 
493           struct athn_usb_host_cmd_ring usc_cmdq;
494           struct athn_usb_rx_data                 usc_rx_data[ATHN_USB_RX_LIST_COUNT];
495           struct athn_usb_tx_data                 usc_tx_data[ATHN_USB_TX_LIST_COUNT];
496           TAILQ_HEAD(, athn_usb_tx_data)          usc_tx_free_list;
497           struct athn_usb_tx_data                 usc_tx_cmd;
498           struct athn_usb_tx_data                 usc_tx_msg;
499           struct athn_usb_tx_data                 *usc_tx_bcn;
500 
501           uint8_t                                 usc_ep_ctrl;
502           uint8_t                                 usc_ep_bcn;
503           uint8_t                                 usc_ep_cab;
504           uint8_t                                 usc_ep_uapsd;
505           uint8_t                                 usc_ep_mgmt;
506           uint8_t                                 usc_ep_data[WME_NUM_AC];
507           void                          (*usc_node_cleanup)(struct ieee80211_node *);
508 };
509 
510 #endif /* _IF_ATHN_USB_H_ */
511