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