xref: /openbsd-src/sys/dev/usb/if_athn_usb.h (revision 4b1a56afb1a28c97103da3911d326d1216798a6e)
1*4b1a56afSjsg /*	$OpenBSD: if_athn_usb.h,v 1.13 2022/01/09 05:43:00 jsg Exp $	*/
213236e8dSdamien 
313236e8dSdamien /*-
413236e8dSdamien  * Copyright (c) 2011 Damien Bergamini <damien.bergamini@free.fr>
59f962d91Sstsp  * Copyright (c) 2018 Stefan Sperling <stsp@openbsd.org>
613236e8dSdamien  *
713236e8dSdamien  * Permission to use, copy, modify, and distribute this software for any
813236e8dSdamien  * purpose with or without fee is hereby granted, provided that the above
913236e8dSdamien  * copyright notice and this permission notice appear in all copies.
1013236e8dSdamien  *
1113236e8dSdamien  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1213236e8dSdamien  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1313236e8dSdamien  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1413236e8dSdamien  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1513236e8dSdamien  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1613236e8dSdamien  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1713236e8dSdamien  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1813236e8dSdamien  */
1913236e8dSdamien 
2013236e8dSdamien /* Maximum number of STAs firmware can handle. */
2113236e8dSdamien #define AR_USB_MAX_STA	8
2213236e8dSdamien 
2313236e8dSdamien #define AR_USB_DEFAULT_NF	(-95)
2413236e8dSdamien 
2513236e8dSdamien /* USB requests. */
2613236e8dSdamien #define AR_FW_DOWNLOAD		0x30
2713236e8dSdamien #define AR_FW_DOWNLOAD_COMP	0x31
2813236e8dSdamien 
2913236e8dSdamien /* USB endpoints addresses. */
3013236e8dSdamien #define AR_PIPE_TX_DATA	(UE_DIR_OUT | 1)
3113236e8dSdamien #define AR_PIPE_RX_DATA	(UE_DIR_IN  | 2)
3213236e8dSdamien #define AR_PIPE_RX_INTR	(UE_DIR_IN  | 3)
3313236e8dSdamien #define AR_PIPE_TX_INTR	(UE_DIR_OUT | 4)
3413236e8dSdamien 
3513236e8dSdamien /* Wireless module interface commands. */
3613236e8dSdamien #define AR_WMI_CMD_ECHO			0x001
3713236e8dSdamien #define AR_WMI_CMD_ACCESS_MEMORY	0x002
38f47be805Sstsp #define AR_WMI_GET_FW_VERSION		0x003
39f47be805Sstsp #define AR_WMI_CMD_DISABLE_INTR		0x004
40f47be805Sstsp #define AR_WMI_CMD_ENABLE_INTR		0x005
4113236e8dSdamien #define AR_WMI_CMD_ATH_INIT		0x006
4213236e8dSdamien #define AR_WMI_CMD_ABORT_TXQ		0x007
4313236e8dSdamien #define AR_WMI_CMD_STOP_TX_DMA		0x008
44f47be805Sstsp #define AR_WMI_CMD_ABORT_TX_DMA		0x009
45f47be805Sstsp #define AR_WMI_CMD_DRAIN_TXQ		0x00a
46f47be805Sstsp #define AR_WMI_CMD_DRAIN_TXQ_ALL	0x00b
47f47be805Sstsp #define AR_WMI_CMD_START_RECV		0x00c
48f47be805Sstsp #define AR_WMI_CMD_STOP_RECV		0x00d
49f47be805Sstsp #define AR_WMI_CMD_FLUSH_RECV		0x00e
50f47be805Sstsp #define AR_WMI_CMD_SET_MODE		0x00f
51f47be805Sstsp #define AR_WMI_CMD_NODE_CREATE		0x010
52f47be805Sstsp #define AR_WMI_CMD_NODE_REMOVE		0x011
53f47be805Sstsp #define AR_WMI_CMD_VAP_REMOVE		0x012
54f47be805Sstsp #define AR_WMI_CMD_VAP_CREATE		0x013
55f47be805Sstsp #define AR_WMI_CMD_REG_READ		0x014
56f47be805Sstsp #define AR_WMI_CMD_REG_WRITE		0x015
57f47be805Sstsp #define AR_WMI_CMD_RC_STATE_CHANGE	0x016
58f47be805Sstsp #define AR_WMI_CMD_RC_RATE_UPDATE	0x017
59f47be805Sstsp #define AR_WMI_CMD_TARGET_IC_UPDATE	0x018
60f47be805Sstsp #define AR_WMI_CMD_TX_AGGR_ENABLE	0x019
6113236e8dSdamien #define AR_WMI_CMD_TGT_DETACH		0x020
62f47be805Sstsp #define AR_WMI_CMD_NODE_UPDATE		0x021
63f47be805Sstsp #define AR_WMI_CMD_INT_STATS		0x022
64f47be805Sstsp #define AR_WMI_CMD_TX_STATS		0x023
65f47be805Sstsp #define AR_WMI_CMD_RX_STATS		0x024
66f47be805Sstsp #define AR_WMI_CMD_BITRATE_MASK		0x025
67f47be805Sstsp #define AR_WMI_CMD_REG_RMW		0x026
68f47be805Sstsp 
6913236e8dSdamien /* Wireless module interface events. */
7013236e8dSdamien #define AR_WMI_EVT_TGT_RDY		0x001
7113236e8dSdamien #define AR_WMI_EVT_SWBA			0x002
7213236e8dSdamien #define AR_WMI_EVT_FATAL		0x003
7313236e8dSdamien #define AR_WMI_EVT_TXTO			0x004
7413236e8dSdamien #define AR_WMI_EVT_BMISS		0x005
75f47be805Sstsp #define AR_WMI_EVT_DELBA		0x006
76f47be805Sstsp #define AR_WMI_EVT_TXSTATUS		0x007
7713236e8dSdamien 
7813236e8dSdamien /* Structure for service AR_SVC_WMI_CONTROL. */
7913236e8dSdamien struct ar_wmi_cmd_hdr {
8013236e8dSdamien 	uint16_t	cmd_id;
8113236e8dSdamien #define AR_WMI_EVT_FLAG	0x1000
8213236e8dSdamien 
8313236e8dSdamien 	uint16_t	seq_no;
8413236e8dSdamien } __packed;
8513236e8dSdamien 
8613236e8dSdamien /* Values for AR_WMI_CMD_SET_MODE. */
87f47be805Sstsp #define AR_HTC_MODE_11NA	0
88f47be805Sstsp #define AR_HTC_MODE_11NG	1
8913236e8dSdamien 
9013236e8dSdamien #define AR_MAX_WRITE_COUNT	32
9113236e8dSdamien /* Structure for command AR_WMI_CMD_REG_WRITE. */
9213236e8dSdamien struct ar_wmi_cmd_reg_write {
9313236e8dSdamien 	uint32_t	addr;
9413236e8dSdamien 	uint32_t	val;
9513236e8dSdamien } __packed;
9613236e8dSdamien 
9713236e8dSdamien /* Structure for command AR_WMI_CMD_NODE_{CREATE,REMOVE}. */
9813236e8dSdamien struct ar_htc_target_sta {
9913236e8dSdamien 	uint8_t		macaddr[IEEE80211_ADDR_LEN];
10013236e8dSdamien 	uint8_t		bssid[IEEE80211_ADDR_LEN];
10113236e8dSdamien 	uint8_t		sta_index;
10213236e8dSdamien 	uint8_t		vif_index;
103f47be805Sstsp 	uint8_t		is_vif_sta;
10413236e8dSdamien 	uint16_t	flags;
10513236e8dSdamien #define AR_HTC_STA_AUTH	0x0001
10613236e8dSdamien #define AR_HTC_STA_QOS	0x0002
10713236e8dSdamien #define AR_HTC_STA_ERP	0x0004
10813236e8dSdamien #define AR_HTC_STA_HT	0x0008
10913236e8dSdamien 
11013236e8dSdamien 	uint16_t	htcap;
11113236e8dSdamien 	uint16_t	maxampdu;
112f47be805Sstsp 	uint8_t		pad;
113f47be805Sstsp 
114f47be805Sstsp 	/* Internal state. */
115f47be805Sstsp 	uint16_t	txseqmgmt;
11613236e8dSdamien 	uint16_t	iv16;
11713236e8dSdamien 	uint32_t	iv32;
118f47be805Sstsp 	void		*ni_vap;
11913236e8dSdamien } __packed;
12013236e8dSdamien 
12113236e8dSdamien /* Structures for command AR_WMI_CMD_RC_RATE_UPDATE. */
12213236e8dSdamien #define AR_HTC_RATE_MAX	30
12313236e8dSdamien struct ar_htc_rateset {
12413236e8dSdamien 	uint8_t		rs_nrates;
12513236e8dSdamien 	uint8_t		rs_rates[AR_HTC_RATE_MAX];
12613236e8dSdamien } __packed;
12713236e8dSdamien 
12813236e8dSdamien struct ar_htc_target_rate {
12913236e8dSdamien 	uint8_t			sta_index;
13013236e8dSdamien 	uint8_t			isnew;
131f47be805Sstsp 	uint8_t			pad[2];
13213236e8dSdamien 	uint32_t		capflags;
13313236e8dSdamien #define AR_RC_DS_FLAG		0x00000001
1347363c99eSstsp #define AR_RC_40_FLAG		0x00000002
1357363c99eSstsp #define AR_RC_SGI_FLAG		0x00000004
1367363c99eSstsp #define AR_RC_HT_FLAG		0x00000008
137f47be805Sstsp #define AR_RC_STBC_FLAG		0x00000030 /* 2 bits */
138f47be805Sstsp #define AR_RC_WEP_TKIP_FLAG	0x00000100
13913236e8dSdamien 
14013236e8dSdamien 	struct ar_htc_rateset	lg_rates;
14113236e8dSdamien 	struct ar_htc_rateset	ht_rates;
14213236e8dSdamien } __packed;
14313236e8dSdamien 
14413236e8dSdamien /* Structure for command AR_WMI_CMD_TX_AGGR_ENABLE. */
14513236e8dSdamien struct ar_htc_target_aggr {
14613236e8dSdamien 	uint8_t		sta_index;
14713236e8dSdamien 	uint8_t		tidno;
14813236e8dSdamien 	uint8_t		aggr_enable;
14913236e8dSdamien 	uint8_t		padding;
15013236e8dSdamien } __packed;
15113236e8dSdamien 
15213236e8dSdamien /* Structure for command AR_WMI_CMD_VAP_CREATE. */
15313236e8dSdamien struct ar_htc_target_vif {
15413236e8dSdamien 	uint8_t		index;
15513236e8dSdamien 	uint32_t	opmode;
15613236e8dSdamien #define AR_HTC_M_IBSS		0
15713236e8dSdamien #define AR_HTC_M_STA		1
15813236e8dSdamien #define AR_HTC_M_WDS		2
15913236e8dSdamien #define AR_HTC_M_AHDEMO		3
16013236e8dSdamien #define AR_HTC_M_HOSTAP		6
16113236e8dSdamien #define AR_HTC_M_MONITOR	8
16213236e8dSdamien 	uint8_t		myaddr[IEEE80211_ADDR_LEN];
16313236e8dSdamien 	uint8_t		ath_cap;
164f47be805Sstsp 	uint16_t	rtsthreshold;
165f47be805Sstsp 	uint8_t		pad;
166f47be805Sstsp 
167f47be805Sstsp 	/* Internal state. */
168f47be805Sstsp 	int8_t		nodeindex;
169f47be805Sstsp 	void		*iv_bss;
17013236e8dSdamien } __packed;
17113236e8dSdamien 
17213236e8dSdamien /* Structure for command AM_WMI_CMD_TARGET_IC_UPDATE. */
17313236e8dSdamien struct ar_htc_cap_target {
17413236e8dSdamien 	uint32_t	ampdu_limit;
17513236e8dSdamien 	uint8_t		ampdu_subframes;
176f47be805Sstsp 	uint8_t		enable_coex;
177f47be805Sstsp 	uint8_t		txchainmask;
178f47be805Sstsp 	uint8_t		pad;
17913236e8dSdamien } __packed;
18013236e8dSdamien 
181f47be805Sstsp struct ar_wmi_evt_txstatus {
182f47be805Sstsp 	uint8_t		cookie;
183f47be805Sstsp 
184f47be805Sstsp 	/*
185f47be805Sstsp 	 * Legacy rates are indicated as rate array indices.
186f47be805Sstsp 	 * HT rates are indicated as MCS indices.
187f47be805Sstsp 	 */
188f47be805Sstsp 	uint8_t		rate;
189f47be805Sstsp #define AR_HTC_TXSTAT_RATE		0x0f
190f47be805Sstsp #define AR_HTC_TXSTAT_EPID		0xf0
191f47be805Sstsp #define AR_HTC_TXSTAT_EPID_SHIFT	4
192f47be805Sstsp 
193f47be805Sstsp 	uint8_t		flags;
194f47be805Sstsp #define AR_HTC_TXSTAT_ACK	0x01
195f47be805Sstsp #define AR_HTC_TXSTAT_FILT	0x02
196f47be805Sstsp #define AR_HTC_TXSTAT_RTC_CTS	0x04
197f47be805Sstsp #define AR_HTC_TXSTAT_MCS	0x08
198f47be805Sstsp #define AR_HTC_TXSTAT_CW40	0x10
199f47be805Sstsp #define AR_HTC_TXSTAT_SGI	0x20
200f47be805Sstsp } __packed;
201f47be805Sstsp 
202f47be805Sstsp /* Structure for event AR_WMI_EVT_TXSTATUS. */
203f47be805Sstsp #define AR_HTC_MAX_TX_STATUS 12
204f47be805Sstsp struct ar_wmi_evt_txstatus_list {
205f47be805Sstsp 	uint8_t			count;
206f47be805Sstsp 	struct ar_wmi_evt_txstatus ts[AR_HTC_MAX_TX_STATUS];
20713236e8dSdamien } __packed;
20813236e8dSdamien 
20913236e8dSdamien /* HTC header. */
21013236e8dSdamien struct ar_htc_frame_hdr {
21113236e8dSdamien 	uint8_t		endpoint_id;
21213236e8dSdamien 	uint8_t		flags;
213f47be805Sstsp #define AR_HTC_FLAG_NEED_CREDIT_UPDATE		0x01
21413236e8dSdamien #define AR_HTC_FLAG_TRAILER			0x02
215f47be805Sstsp #define AR_HTC_FLAG_CREDIT_REDISTRIBUTION	0x03
21613236e8dSdamien 
21713236e8dSdamien 	uint16_t	payload_len;
21813236e8dSdamien 	uint8_t		control[4];
21913236e8dSdamien } __packed;
22013236e8dSdamien 
221*4b1a56afSjsg /* Structure for HTC endpoint id 0. */
22213236e8dSdamien struct ar_htc_msg_hdr {
22313236e8dSdamien 	uint16_t	msg_id;
22413236e8dSdamien #define AR_HTC_MSG_READY		0x0001
22513236e8dSdamien #define AR_HTC_MSG_CONN_SVC		0x0002
22613236e8dSdamien #define AR_HTC_MSG_CONN_SVC_RSP		0x0003
22713236e8dSdamien #define AR_HTC_MSG_SETUP_COMPLETE	0x0004
22813236e8dSdamien #define AR_HTC_MSG_CONF_PIPE		0x0005
22913236e8dSdamien #define AR_HTC_MSG_CONF_PIPE_RSP	0x0006
23013236e8dSdamien } __packed;
23113236e8dSdamien 
23213236e8dSdamien /* Structure for services AR_SVC_WMI_DATA_{VO,VI,BE,BK}. */
23313236e8dSdamien struct ar_tx_frame {
23413236e8dSdamien 	uint8_t		data_type;
23513236e8dSdamien #define AR_HTC_AMPDU	1
23613236e8dSdamien #define AR_HTC_NORMAL	2
23713236e8dSdamien 
23813236e8dSdamien 	uint8_t		node_idx;
23913236e8dSdamien 	uint8_t		vif_idx;
24013236e8dSdamien 	uint8_t		tid;
24113236e8dSdamien 	uint32_t	flags;
24213236e8dSdamien #define AR_HTC_TX_CTSONLY	0x00000001
24313236e8dSdamien #define AR_HTC_TX_RTSCTS	0x00000002
24413236e8dSdamien #define AR_HTC_TX_USE_MIN_RATE	0x00000100
24513236e8dSdamien 
24613236e8dSdamien 	uint8_t		key_type;
24713236e8dSdamien 	uint8_t		key_idx;
248f47be805Sstsp 	uint8_t		cookie;
249f47be805Sstsp 	uint8_t		pad;
25013236e8dSdamien } __packed;
25113236e8dSdamien 
25213236e8dSdamien /* Structure for service AR_SVC_WMI_MGMT. */
25313236e8dSdamien struct ar_tx_mgmt {
25413236e8dSdamien 	uint8_t		node_idx;
25513236e8dSdamien 	uint8_t		vif_idx;
25613236e8dSdamien 	uint8_t		tid;
25713236e8dSdamien 	uint8_t		flags;
25813236e8dSdamien 	uint8_t		key_type;
25913236e8dSdamien 	uint8_t		key_idx;
260f47be805Sstsp 	uint8_t		cookie;
261f47be805Sstsp 	uint8_t		pad;
26213236e8dSdamien } __packed;
26313236e8dSdamien 
26413236e8dSdamien /* Structure for service AR_SVC_WMI_BEACON. */
26513236e8dSdamien struct ar_tx_bcn {
26613236e8dSdamien 	uint8_t		len_changed;
26713236e8dSdamien 	uint8_t		vif_idx;
26813236e8dSdamien 	uint16_t	rev;
26913236e8dSdamien } __packed;
27013236e8dSdamien 
27113236e8dSdamien /* Structure for message AR_HTC_MSG_READY. */
27213236e8dSdamien struct ar_htc_msg_ready {
27313236e8dSdamien 	uint16_t	credits;
27413236e8dSdamien 	uint16_t	credits_size;
27513236e8dSdamien 	uint8_t		max_endpoints;
27613236e8dSdamien 	uint8_t		reserved;
27713236e8dSdamien } __packed;
27813236e8dSdamien 
27913236e8dSdamien /* Structure for message AR_HTC_MSG_CONF_PIPE. */
28013236e8dSdamien struct ar_htc_msg_config_pipe {
28113236e8dSdamien 	uint8_t		pipe_id;
28213236e8dSdamien 	uint8_t		credits;
28313236e8dSdamien } __packed;
28413236e8dSdamien 
28513236e8dSdamien /* Structure for message AR_HTC_MSG_CONN_SVC. */
28613236e8dSdamien struct ar_htc_msg_conn_svc {
28713236e8dSdamien 	uint16_t	svc_id;
28813236e8dSdamien 	uint16_t	conn_flags;
28913236e8dSdamien 	uint8_t		dl_pipeid;
29013236e8dSdamien 	uint8_t		ul_pipeid;
29113236e8dSdamien 	uint8_t		svc_meta_len;
29213236e8dSdamien 	uint8_t		reserved;
29313236e8dSdamien } __packed;
29413236e8dSdamien 
29513236e8dSdamien /* Structure for message AR_HTC_MSG_CONN_SVC_RSP. */
29613236e8dSdamien struct ar_htc_msg_conn_svc_rsp {
29713236e8dSdamien 	uint16_t	svc_id;
29813236e8dSdamien 	uint8_t		status;
29913236e8dSdamien #define AR_HTC_SVC_SUCCESS	0
30013236e8dSdamien #define AR_HTC_SVC_NOT_FOUND	1
30113236e8dSdamien #define AR_HTC_SVC_FAILED	2
30213236e8dSdamien #define AR_HTC_SVC_NO_RESOURCES	3
30313236e8dSdamien #define AR_HTC_SVC_NO_MORE_EP	4
30413236e8dSdamien 
30513236e8dSdamien 	uint8_t		endpoint_id;
30613236e8dSdamien 	uint16_t	max_msg_len;
30713236e8dSdamien 	uint8_t		svc_meta_len;
30813236e8dSdamien 	uint8_t		reserved;
30913236e8dSdamien } __packed;
31013236e8dSdamien 
31113236e8dSdamien #define AR_SVC(grp, idx)	((grp) << 8 | (idx))
31213236e8dSdamien #define AR_SVC_IDX(svc)		((svc) & 0xff)
31313236e8dSdamien /* Service groups. */
31413236e8dSdamien #define AR_SVC_GRP_RSVD		0
31513236e8dSdamien #define AR_SVC_GRP_WMI		1
31613236e8dSdamien /* Service identifiers for WMI group. */
31713236e8dSdamien #define AR_SVC_WMI_CONTROL	AR_SVC(AR_SVC_GRP_WMI, 0)
31813236e8dSdamien #define AR_SVC_WMI_BEACON	AR_SVC(AR_SVC_GRP_WMI, 1)
31913236e8dSdamien #define AR_SVC_WMI_CAB		AR_SVC(AR_SVC_GRP_WMI, 2)
32013236e8dSdamien #define AR_SVC_WMI_UAPSD	AR_SVC(AR_SVC_GRP_WMI, 3)
32113236e8dSdamien #define AR_SVC_WMI_MGMT		AR_SVC(AR_SVC_GRP_WMI, 4)
32213236e8dSdamien #define AR_SVC_WMI_DATA_VO	AR_SVC(AR_SVC_GRP_WMI, 5)
32313236e8dSdamien #define AR_SVC_WMI_DATA_VI	AR_SVC(AR_SVC_GRP_WMI, 6)
32413236e8dSdamien #define AR_SVC_WMI_DATA_BE	AR_SVC(AR_SVC_GRP_WMI, 7)
32513236e8dSdamien #define AR_SVC_WMI_DATA_BK	AR_SVC(AR_SVC_GRP_WMI, 8)
32613236e8dSdamien 
32713236e8dSdamien struct ar_stream_hdr {
32813236e8dSdamien 	uint16_t	len;
32913236e8dSdamien 	uint16_t	tag;
33013236e8dSdamien #define AR_USB_RX_STREAM_TAG	0x4e00
33113236e8dSdamien #define AR_USB_TX_STREAM_TAG	0x697e
33213236e8dSdamien } __packed __attribute__((aligned(4)));
33313236e8dSdamien 
33413236e8dSdamien #define AR_MAX_CHAINS	3
33513236e8dSdamien 
33613236e8dSdamien /* Rx descriptor. */
33713236e8dSdamien struct ar_rx_status {
33813236e8dSdamien 	uint64_t	rs_tstamp;
33913236e8dSdamien 	uint16_t	rs_datalen;
34013236e8dSdamien 	uint8_t		rs_status;
341ff1dd4b7Sstsp #define AR_RXS_RXERR_CRC               0x01
342ff1dd4b7Sstsp #define AR_RXS_RXERR_PHY               0x02
343ff1dd4b7Sstsp #define AR_RXS_RXERR_FIFO              0x04
344ff1dd4b7Sstsp #define AR_RXS_RXERR_DECRYPT           0x08
345ff1dd4b7Sstsp #define AR_RXS_RXERR_MIC               0x10
34613236e8dSdamien 	uint8_t		rs_phyerr;
34713236e8dSdamien 	int8_t		rs_rssi;
34813236e8dSdamien 	int8_t		rs_rssi_ctl[AR_MAX_CHAINS];
34913236e8dSdamien 	int8_t		rs_rssi_ext[AR_MAX_CHAINS];
35013236e8dSdamien 	uint8_t		rs_keyix;
35113236e8dSdamien 	uint8_t		rs_rate;
35213236e8dSdamien 	uint8_t		rs_antenna;
35313236e8dSdamien 	uint8_t		rs_more;
35413236e8dSdamien 	uint8_t		rs_isaggr;
35513236e8dSdamien 	uint8_t		rs_moreaggr;
35613236e8dSdamien 	uint8_t		rs_num_delims;
35713236e8dSdamien 	uint8_t		rs_flags;
35813236e8dSdamien #define AR_RXS_FLAG_GI		0x04
35913236e8dSdamien #define AR_RXS_FLAG_2040	0x08
36013236e8dSdamien 
36113236e8dSdamien 	uint8_t		rs_dummy;
36213236e8dSdamien 	uint32_t	rs_evm[AR_MAX_CHAINS];
36313236e8dSdamien } __packed __attribute__((aligned(4)));
36413236e8dSdamien 
36513236e8dSdamien 
36613236e8dSdamien /*
36713236e8dSdamien  * Driver definitions.
36813236e8dSdamien  */
36913236e8dSdamien #define ATHN_USB_RX_LIST_COUNT	1
370af7c78e3Sdamien #define ATHN_USB_TX_LIST_COUNT	(8 + 1)		/* NB: +1 for beacons. */
37113236e8dSdamien 
37213236e8dSdamien #define ATHN_USB_HOST_CMD_RING_COUNT	32
37313236e8dSdamien 
37413236e8dSdamien #define ATHN_USB_RXBUFSZ	(8 * 1024)	/* XXX Linux 16K */
37513236e8dSdamien #define ATHN_USB_TXBUFSZ			\
37613236e8dSdamien 	((sizeof(struct ar_stream_hdr) +	\
37713236e8dSdamien 	  sizeof(struct ar_htc_frame_hdr) +	\
37813236e8dSdamien 	  sizeof(struct ar_tx_frame) +		\
37913236e8dSdamien 	  IEEE80211_MAX_LEN + 3) & ~3)
38013236e8dSdamien #define ATHN_USB_TXCMDSZ	512
38113236e8dSdamien 
38213236e8dSdamien #define ATHN_USB_TX_TIMEOUT	5000	/* ms */
38313236e8dSdamien #define ATHN_USB_CMD_TIMEOUT	1000	/* ms */
38413236e8dSdamien 
38513236e8dSdamien struct athn_usb_softc;
38613236e8dSdamien 
38713236e8dSdamien struct athn_usb_rx_stream {
38813236e8dSdamien 	struct mbuf	*m;
38913236e8dSdamien 	int		moff;
39013236e8dSdamien 	int		left;
39113236e8dSdamien };
39213236e8dSdamien 
39313236e8dSdamien struct athn_usb_rx_data {
39413236e8dSdamien 	struct athn_usb_softc	*sc;
395ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
39613236e8dSdamien 	uint8_t			*buf;
39713236e8dSdamien };
39813236e8dSdamien 
39913236e8dSdamien struct athn_usb_tx_data {
40013236e8dSdamien 	struct athn_usb_softc		*sc;
401ab0b1be7Smglocker 	struct usbd_xfer		*xfer;
40213236e8dSdamien 	uint8_t				*buf;
40313236e8dSdamien 	TAILQ_ENTRY(athn_usb_tx_data)	next;
40413236e8dSdamien };
40513236e8dSdamien 
40613236e8dSdamien struct athn_usb_host_cmd {
40713236e8dSdamien 	void	(*cb)(struct athn_usb_softc *, void *);
40813236e8dSdamien 	uint8_t	data[256];
40913236e8dSdamien };
41013236e8dSdamien 
41113236e8dSdamien struct athn_usb_cmd_newstate {
41213236e8dSdamien 	enum ieee80211_state	state;
41313236e8dSdamien 	int			arg;
41413236e8dSdamien };
41513236e8dSdamien 
41613236e8dSdamien struct athn_usb_cmd_key {
41713236e8dSdamien 	struct ieee80211_node	*ni;
41813236e8dSdamien 	struct ieee80211_key	*key;
41913236e8dSdamien };
42013236e8dSdamien 
42113236e8dSdamien struct athn_usb_aggr_cmd {
42213236e8dSdamien 	uint8_t	sta_index;
42313236e8dSdamien 	uint8_t	tid;
42413236e8dSdamien };
42513236e8dSdamien 
42613236e8dSdamien struct athn_usb_host_cmd_ring {
42713236e8dSdamien 	struct athn_usb_host_cmd	cmd[ATHN_USB_HOST_CMD_RING_COUNT];
42813236e8dSdamien 	int				cur;
42913236e8dSdamien 	int				next;
43013236e8dSdamien 	int				queued;
43113236e8dSdamien };
43213236e8dSdamien 
43313236e8dSdamien struct athn_usb_softc {
43413236e8dSdamien 	struct athn_softc		sc_sc;
43513236e8dSdamien #define usb_dev	sc_sc.sc_dev
436ffb60851Smikeb 	int				sc_athn_attached;
43713236e8dSdamien 
43813236e8dSdamien 	/* USB specific goo. */
439ab0b1be7Smglocker 	struct usbd_device		*sc_udev;
440ab0b1be7Smglocker 	struct usbd_interface		*sc_iface;
44113236e8dSdamien 	struct usb_task			sc_task;
44213236e8dSdamien 
44313236e8dSdamien 	u_int				flags;
44413236e8dSdamien #define ATHN_USB_FLAG_AR7010	0x01
44513236e8dSdamien 
44613236e8dSdamien 	struct athn_usb_rx_stream	rx_stream;
44713236e8dSdamien 
448ab0b1be7Smglocker 	struct usbd_pipe		*tx_data_pipe;
449ab0b1be7Smglocker 	struct usbd_pipe		*rx_data_pipe;
450ab0b1be7Smglocker 	struct usbd_pipe		*rx_intr_pipe;
451ab0b1be7Smglocker 	struct usbd_pipe		*tx_intr_pipe;
45213236e8dSdamien 	uint8_t 			*ibuf;
453234dfda1Sderaadt 	size_t				ibuflen;
45413236e8dSdamien 
45513236e8dSdamien 	struct ar_wmi_cmd_reg_write	wbuf[AR_MAX_WRITE_COUNT];
45613236e8dSdamien 	int				wcount;
45713236e8dSdamien 
45813236e8dSdamien 	uint16_t			wmi_seq_no;
45913236e8dSdamien 	uint16_t			wait_cmd_id;
46013236e8dSdamien 	uint16_t			wait_msg_id;
46113236e8dSdamien 	void				*obuf;
46213236e8dSdamien 	struct ar_htc_msg_conn_svc_rsp	*msg_conn_svc_rsp;
46313236e8dSdamien 
46413236e8dSdamien 	struct athn_usb_host_cmd_ring	cmdq;
46513236e8dSdamien 	struct athn_usb_rx_data		rx_data[ATHN_USB_RX_LIST_COUNT];
46613236e8dSdamien 	struct athn_usb_tx_data		tx_data[ATHN_USB_TX_LIST_COUNT];
46713236e8dSdamien 	TAILQ_HEAD(, athn_usb_tx_data)	tx_free_list;
46813236e8dSdamien 	struct athn_usb_tx_data		tx_cmd;
469af7c78e3Sdamien 	struct athn_usb_tx_data		*tx_bcn;
47013236e8dSdamien 
47113236e8dSdamien 	uint8_t				ep_ctrl;
47213236e8dSdamien 	uint8_t				ep_bcn;
47313236e8dSdamien 	uint8_t				ep_cab;
47413236e8dSdamien 	uint8_t				ep_uapsd;
47513236e8dSdamien 	uint8_t				ep_mgmt;
47613236e8dSdamien 	uint8_t				ep_data[EDCA_NUM_AC];
477dd463f29Sstsp 
478f47be805Sstsp 	/*
479f47be805Sstsp 	 * Firmware cannot handle more than 8 STAs.
480f47be805Sstsp 	 * We use a bitmask to keep track of available slots in the firmware's
481f47be805Sstsp 	 * node array. A 1 bit at index N, as determined by ffs(3), means the
482f47be805Sstsp 	 * slot at this index is available.
483f47be805Sstsp 	 */
484f47be805Sstsp 	uint8_t				free_node_slots;
485f47be805Sstsp 
486f47be805Sstsp 	void				(*sc_node_free)(struct ieee80211com *,
487f47be805Sstsp 					    struct ieee80211_node *);
4884fac4e76Skrw 	int				sc_key_tasks;
48913236e8dSdamien };
490