1 1.1 nia /* $NetBSD: if_rsureg.h,v 1.1 2026/10/18 20:17:42 nia Exp $ */ 2 1.1 nia /* $OpenBSD: if_rsureg.h,v 1.4 2020/11/30 16:09:33 krw Exp $ */ 3 1.1 nia 4 1.1 nia /*- 5 1.1 nia * Copyright (c) 2010 Damien Bergamini <damien.bergamini (at) free.fr> 6 1.1 nia * 7 1.1 nia * Permission to use, copy, modify, and distribute this software for any 8 1.1 nia * purpose with or without fee is hereby granted, provided that the above 9 1.1 nia * copyright notice and this permission notice appear in all copies. 10 1.1 nia * 11 1.1 nia * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 1.1 nia * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 1.1 nia * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 1.1 nia * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 1.1 nia * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 1.1 nia * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 1.1 nia * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 1.1 nia */ 19 1.1 nia 20 1.1 nia /* Maximum number of pipes is 11. */ 21 1.1 nia #define R92S_MAX_EP 11 22 1.1 nia 23 1.1 nia /* USB Requests. */ 24 1.1 nia #define R92S_REQ_REGS 0x05 25 1.1 nia 26 1.1 nia /* 27 1.1 nia * MAC registers. 28 1.1 nia */ 29 1.1 nia #define R92S_SYSCFG 0x0000 30 1.1 nia #define R92S_SYS_ISO_CTRL (R92S_SYSCFG + 0x000) 31 1.1 nia #define R92S_SYS_FUNC_EN (R92S_SYSCFG + 0x002) 32 1.1 nia #define R92S_PMC_FSM (R92S_SYSCFG + 0x004) 33 1.1 nia #define R92S_SYS_CLKR (R92S_SYSCFG + 0x008) 34 1.1 nia #define R92S_EE_9346CR (R92S_SYSCFG + 0x00a) 35 1.1 nia #define R92S_AFE_MISC (R92S_SYSCFG + 0x010) 36 1.1 nia #define R92S_SPS0_CTRL (R92S_SYSCFG + 0x011) 37 1.1 nia #define R92S_SPS1_CTRL (R92S_SYSCFG + 0x018) 38 1.1 nia #define R92S_RF_CTRL (R92S_SYSCFG + 0x01f) 39 1.1 nia #define R92S_LDOA15_CTRL (R92S_SYSCFG + 0x020) 40 1.1 nia #define R92S_LDOV12D_CTRL (R92S_SYSCFG + 0x021) 41 1.1 nia #define R92S_AFE_XTAL_CTRL (R92S_SYSCFG + 0x026) 42 1.1 nia #define R92S_AFE_PLL_CTRL (R92S_SYSCFG + 0x028) 43 1.1 nia #define R92S_EFUSE_CTRL (R92S_SYSCFG + 0x030) 44 1.1 nia #define R92S_EFUSE_TEST (R92S_SYSCFG + 0x034) 45 1.1 nia #define R92S_EFUSE_CLK_CTRL (R92S_SYSCFG + 0x2f8) 46 1.1 nia 47 1.1 nia #define R92S_CMDCTRL 0x0040 48 1.1 nia #define R92S_CR (R92S_CMDCTRL + 0x000) 49 1.1 nia #define R92S_TCR (R92S_CMDCTRL + 0x004) 50 1.1 nia #define R92S_RCR (R92S_CMDCTRL + 0x008) 51 1.1 nia 52 1.1 nia #define R92S_MACIDSETTING 0x0050 53 1.1 nia #define R92S_MACID (R92S_MACIDSETTING + 0x000) 54 1.1 nia 55 1.1 nia #define R92S_GP 0x01e0 56 1.1 nia #define R92S_GPIO_CTRL (R92S_GP + 0x00c) 57 1.1 nia #define R92S_GPIO_IO_SEL (R92S_GP + 0x00e) 58 1.1 nia #define R92S_MAC_PINMUX_CTRL (R92S_GP + 0x011) 59 1.1 nia 60 1.1 nia #define R92S_IOCMD_CTRL 0x0370 61 1.1 nia #define R92S_IOCMD_DATA 0x0374 62 1.1 nia 63 1.1 nia #define R92S_USB_HRPWM 0xfe58 64 1.1 nia 65 1.1 nia /* Bits for R92S_SYS_FUNC_EN. */ 66 1.1 nia #define R92S_FEN_CPUEN 0x0400 67 1.1 nia 68 1.1 nia /* Bits for R92S_PMC_FSM. */ 69 1.1 nia #define R92S_PMC_FSM_CUT_M 0x000f8000 70 1.1 nia #define R92S_PMC_FSM_CUT_S 15 71 1.1 nia 72 1.1 nia /* Bits for R92S_SYS_CLKR. */ 73 1.1 nia #define R92S_SYS_CLKSEL 0x0001 74 1.1 nia #define R92S_SYS_PS_CLKSEL 0x0002 75 1.1 nia #define R92S_SYS_CPU_CLKSEL 0x0004 76 1.1 nia #define R92S_MAC_CLK_EN 0x0800 77 1.1 nia #define R92S_SYS_CLK_EN 0x1000 78 1.1 nia #define R92S_SWHW_SEL 0x4000 79 1.1 nia #define R92S_FWHW_SEL 0x8000 80 1.1 nia 81 1.1 nia /* Bits for R92S_EE_9346CR. */ 82 1.1 nia #define R92S_9356SEL 0x10 83 1.1 nia #define R92S_EEPROM_EN 0x20 84 1.1 nia 85 1.1 nia /* Bits for R92S_AFE_MISC. */ 86 1.1 nia #define R92S_AFE_MISC_BGEN 0x01 87 1.1 nia #define R92S_AFE_MISC_MBEN 0x02 88 1.1 nia #define R92S_AFE_MISC_I32_EN 0x08 89 1.1 nia 90 1.1 nia /* Bits for R92S_SPS1_CTRL. */ 91 1.1 nia #define R92S_SPS1_LDEN 0x01 92 1.1 nia #define R92S_SPS1_SWEN 0x02 93 1.1 nia 94 1.1 nia /* Bits for R92S_LDOA15_CTRL. */ 95 1.1 nia #define R92S_LDA15_EN 0x01 96 1.1 nia 97 1.1 nia /* Bits for R92S_LDOV12D_CTRL. */ 98 1.1 nia #define R92S_LDV12_EN 0x01 99 1.1 nia 100 1.1 nia /* Bits for R92C_EFUSE_CTRL. */ 101 1.1 nia #define R92S_EFUSE_CTRL_DATA_M 0x000000ff 102 1.1 nia #define R92S_EFUSE_CTRL_DATA_S 0 103 1.1 nia #define R92S_EFUSE_CTRL_ADDR_M 0x0003ff00 104 1.1 nia #define R92S_EFUSE_CTRL_ADDR_S 8 105 1.1 nia #define R92S_EFUSE_CTRL_VALID 0x80000000 106 1.1 nia 107 1.1 nia /* Bits for R92S_CR. */ 108 1.1 nia #define R92S_CR_TXDMA_EN 0x10 109 1.1 nia 110 1.1 nia /* Bits for R92S_TCR. */ 111 1.1 nia #define R92S_TCR_IMEM_CODE_DONE 0x01 112 1.1 nia #define R92S_TCR_IMEM_CHK_RPT 0x02 113 1.1 nia #define R92S_TCR_EMEM_CODE_DONE 0x04 114 1.1 nia #define R92S_TCR_EMEM_CHK_RPT 0x08 115 1.1 nia #define R92S_TCR_DMEM_CODE_DONE 0x10 116 1.1 nia #define R92S_TCR_IMEM_RDY 0x20 117 1.1 nia #define R92S_TCR_FWRDY 0x80 118 1.1 nia 119 1.1 nia /* Bits for R92S_GPIO_IO_SEL. */ 120 1.1 nia #define R92S_GPIO_WPS 0x10 121 1.1 nia 122 1.1 nia /* Bits for R92S_MAC_PINMUX_CTRL. */ 123 1.1 nia #define R92S_GPIOSEL_GPIO_M 0x03 124 1.1 nia #define R92S_GPIOSEL_GPIO_S 0 125 1.1 nia #define R92S_GPIOSEL_GPIO_JTAG 0 126 1.1 nia #define R92S_GPIOSEL_GPIO_PHYDBG 1 127 1.1 nia #define R92S_GPIOSEL_GPIO_BT 2 128 1.1 nia #define R92S_GPIOSEL_GPIO_WLANDBG 3 129 1.1 nia #define R92S_GPIOMUX_EN 0x08 130 1.1 nia 131 1.1 nia /* Bits for R92S_IOCMD_CTRL. */ 132 1.1 nia #define R92S_IOCMD_CLASS_M 0xff000000 133 1.1 nia #define R92S_IOCMD_CLASS_S 24 134 1.1 nia #define R92S_IOCMD_CLASS_BB_RF 0xf0 135 1.1 nia #define R92S_IOCMD_VALUE_M 0x00ffff00 136 1.1 nia #define R92S_IOCMD_VALUE_S 8 137 1.1 nia #define R92S_IOCMD_INDEX_M 0x000000ff 138 1.1 nia #define R92S_IOCMD_INDEX_S 0 139 1.1 nia #define R92S_IOCMD_INDEX_BB_READ 0 140 1.1 nia #define R92S_IOCMD_INDEX_BB_WRITE 1 141 1.1 nia #define R92S_IOCMD_INDEX_RF_READ 2 142 1.1 nia #define R92S_IOCMD_INDEX_RF_WRITE 3 143 1.1 nia 144 1.1 nia /* Bits for R92S_USB_HRPWM. */ 145 1.1 nia #define R92S_USB_HRPWM_PS_ALL_ON 0x04 146 1.1 nia #define R92S_USB_HRPWM_PS_ST_ACTIVE 0x08 147 1.1 nia 148 1.1 nia /* 149 1.1 nia * Macros to access subfields in registers. 150 1.1 nia */ 151 1.1 nia /* Mask and Shift (getter). */ 152 1.1 nia #define MS(val, field) \ 153 1.1 nia (((val) & field##_M) >> field##_S) 154 1.1 nia 155 1.1 nia /* Shift and Mask (setter). */ 156 1.1 nia #define SM(field, val) \ 157 1.1 nia (((val) << field##_S) & field##_M) 158 1.1 nia 159 1.1 nia /* Rewrite. */ 160 1.1 nia #define RW(var, field, val) \ 161 1.1 nia (((var) & ~field##_M) | SM(field, val)) 162 1.1 nia 163 1.1 nia /* 164 1.1 nia * Firmware image header. 165 1.1 nia */ 166 1.1 nia struct r92s_fw_priv { 167 1.1 nia /* QWORD0 */ 168 1.1 nia uint16_t signature; 169 1.1 nia uint8_t hci_sel; 170 1.1 nia #define R92S_HCI_SEL_PCIE 0x01 171 1.1 nia #define R92S_HCI_SEL_USB 0x02 172 1.1 nia #define R92S_HCI_SEL_SDIO 0x04 173 1.1 nia #define R92S_HCI_SEL_8172 0x10 174 1.1 nia #define R92S_HCI_SEL_AP 0x80 175 1.1 nia 176 1.1 nia uint8_t chip_version; 177 1.1 nia uint16_t custid; 178 1.1 nia uint8_t rf_config; 179 1.1 nia uint8_t nendpoints; 180 1.1 nia /* QWORD1 */ 181 1.1 nia uint32_t regulatory; 182 1.1 nia uint8_t rfintfs; 183 1.1 nia uint8_t def_nettype; 184 1.1 nia uint8_t turbo_mode; 185 1.1 nia uint8_t lowpower_mode; 186 1.1 nia /* QWORD2 */ 187 1.1 nia uint8_t lbk_mode; 188 1.1 nia uint8_t mp_mode; 189 1.1 nia uint8_t vcs_type; 190 1.1 nia #define R92S_VCS_TYPE_DISABLE 0 191 1.1 nia #define R92S_VCS_TYPE_ENABLE 1 192 1.1 nia #define R92S_VCS_TYPE_AUTO 2 193 1.1 nia 194 1.1 nia uint8_t vcs_mode; 195 1.1 nia #define R92S_VCS_MODE_NONE 0 196 1.1 nia #define R92S_VCS_MODE_RTS_CTS 1 197 1.1 nia #define R92S_VCS_MODE_CTS2SELF 2 198 1.1 nia 199 1.1 nia uint32_t reserved1; 200 1.1 nia /* QWORD3 */ 201 1.1 nia uint8_t qos_en; 202 1.1 nia uint8_t bw40_en; 203 1.1 nia uint8_t amsdu2ampdu_en; 204 1.1 nia uint8_t ampdu_en; 205 1.1 nia uint8_t rc_offload; 206 1.1 nia uint8_t agg_offload; 207 1.1 nia uint16_t reserved2; 208 1.1 nia /* QWORD4 */ 209 1.1 nia uint8_t beacon_offload; 210 1.1 nia uint8_t mlme_offload; 211 1.1 nia uint8_t hwpc_offload; 212 1.1 nia uint8_t tcpcsum_offload; 213 1.1 nia uint8_t tcp_offload; 214 1.1 nia uint8_t ps_offload; 215 1.1 nia uint8_t wwlan_offload; 216 1.1 nia uint8_t reserved3; 217 1.1 nia /* QWORD5 */ 218 1.1 nia uint16_t tcp_tx_len; 219 1.1 nia uint16_t tcp_rx_len; 220 1.1 nia uint32_t reserved4; 221 1.1 nia } __packed; 222 1.1 nia 223 1.1 nia struct r92s_fw_hdr { 224 1.1 nia uint16_t signature; 225 1.1 nia uint16_t version; 226 1.1 nia uint32_t dmemsz; 227 1.1 nia uint32_t imemsz; 228 1.1 nia uint32_t sramsz; 229 1.1 nia uint32_t privsz; 230 1.1 nia uint16_t efuse_addr; 231 1.1 nia uint16_t h2c_resp_addr; 232 1.1 nia uint32_t svnrev; 233 1.1 nia uint8_t month; 234 1.1 nia uint8_t day; 235 1.1 nia uint8_t hour; 236 1.1 nia uint8_t minute; 237 1.1 nia struct r92s_fw_priv priv; 238 1.1 nia } __packed; 239 1.1 nia 240 1.1 nia /* Structure for FW commands and FW events notifications. */ 241 1.1 nia struct r92s_fw_cmd_hdr { 242 1.1 nia uint16_t len; 243 1.1 nia uint8_t code; 244 1.1 nia uint8_t seq; 245 1.1 nia #define R92S_FW_CMD_MORE 0x80 246 1.1 nia 247 1.1 nia uint32_t reserved; 248 1.1 nia } __packed; 249 1.1 nia 250 1.1 nia /* FW commands codes. */ 251 1.1 nia #define R92S_CMD_READ_MACREG 0 252 1.1 nia #define R92S_CMD_WRITE_MACREG 1 253 1.1 nia #define R92S_CMD_READ_BBREG 2 254 1.1 nia #define R92S_CMD_WRITE_BBREG 3 255 1.1 nia #define R92S_CMD_READ_RFREG 4 256 1.1 nia #define R92S_CMD_WRITE_RFREG 5 257 1.1 nia #define R92S_CMD_READ_EEPROM 6 258 1.1 nia #define R92S_CMD_WRITE_EEPROM 7 259 1.1 nia #define R92S_CMD_READ_EFUSE 8 260 1.1 nia #define R92S_CMD_WRITE_EFUSE 9 261 1.1 nia #define R92S_CMD_READ_CAM 10 262 1.1 nia #define R92S_CMD_WRITE_CAM 11 263 1.1 nia #define R92S_CMD_SET_BCNITV 12 264 1.1 nia #define R92S_CMD_SET_MBIDCFG 13 265 1.1 nia #define R92S_CMD_JOIN_BSS 14 266 1.1 nia #define R92S_CMD_DISCONNECT 15 267 1.1 nia #define R92S_CMD_CREATE_BSS 16 268 1.1 nia #define R92S_CMD_SET_OPMODE 17 269 1.1 nia #define R92S_CMD_SITE_SURVEY 18 270 1.1 nia #define R92S_CMD_SET_AUTH 19 271 1.1 nia #define R92S_CMD_SET_KEY 20 272 1.1 nia #define R92S_CMD_SET_STA_KEY 21 273 1.1 nia #define R92S_CMD_SET_ASSOC_STA 22 274 1.1 nia #define R92S_CMD_DEL_ASSOC_STA 23 275 1.1 nia #define R92S_CMD_SET_STAPWRSTATE 24 276 1.1 nia #define R92S_CMD_SET_BASIC_RATE 25 277 1.1 nia #define R92S_CMD_GET_BASIC_RATE 26 278 1.1 nia #define R92S_CMD_SET_DATA_RATE 27 279 1.1 nia #define R92S_CMD_GET_DATA_RATE 28 280 1.1 nia #define R92S_CMD_SET_PHY_INFO 29 281 1.1 nia #define R92S_CMD_GET_PHY_INFO 30 282 1.1 nia #define R92S_CMD_SET_PHY 31 283 1.1 nia #define R92S_CMD_GET_PHY 32 284 1.1 nia #define R92S_CMD_READ_RSSI 33 285 1.1 nia #define R92S_CMD_READ_GAIN 34 286 1.1 nia #define R92S_CMD_SET_ATIM 35 287 1.1 nia #define R92S_CMD_SET_PWR_MODE 36 288 1.1 nia #define R92S_CMD_JOIN_BSS_RPT 37 289 1.1 nia #define R92S_CMD_SET_RA_TABLE 38 290 1.1 nia #define R92S_CMD_GET_RA_TABLE 39 291 1.1 nia #define R92S_CMD_GET_CCX_REPORT 40 292 1.1 nia #define R92S_CMD_GET_DTM_REPORT 41 293 1.1 nia #define R92S_CMD_GET_TXRATE_STATS 42 294 1.1 nia #define R92S_CMD_SET_USB_SUSPEND 43 295 1.1 nia #define R92S_CMD_SET_H2C_LBK 44 296 1.1 nia #define R92S_CMD_ADDBA_REQ 45 297 1.1 nia #define R92S_CMD_SET_CHANNEL 46 298 1.1 nia #define R92S_CMD_SET_TXPOWER 47 299 1.1 nia #define R92S_CMD_SWITCH_ANTENNA 48 300 1.1 nia #define R92S_CMD_SET_CRYSTAL_CAL 49 301 1.1 nia #define R92S_CMD_SET_SINGLE_CARRIER_TX 50 302 1.1 nia #define R92S_CMD_SET_SINGLE_TONE_TX 51 303 1.1 nia #define R92S_CMD_SET_CARRIER_SUPPR_TX 52 304 1.1 nia #define R92S_CMD_SET_CONTINUOUS_TX 53 305 1.1 nia #define R92S_CMD_SWITCH_BANDWIDTH 54 306 1.1 nia #define R92S_CMD_TX_BEACON 55 307 1.1 nia #define R92S_CMD_SET_POWER_TRACKING 56 308 1.1 nia #define R92S_CMD_AMSDU_TO_AMPDU 57 309 1.1 nia #define R92S_CMD_SET_MAC_ADDRESS 58 310 1.1 nia #define R92S_CMD_GET_H2C_LBK 59 311 1.1 nia #define R92S_CMD_SET_PBREQ_IE 60 312 1.1 nia #define R92S_CMD_SET_ASSOCREQ_IE 61 313 1.1 nia #define R92S_CMD_SET_PBRESP_IE 62 314 1.1 nia #define R92S_CMD_SET_ASSOCRESP_IE 63 315 1.1 nia #define R92S_CMD_GET_CURDATARATE 64 316 1.1 nia #define R92S_CMD_GET_TXRETRY_CNT 65 317 1.1 nia #define R92S_CMD_GET_RXRETRY_CNT 66 318 1.1 nia #define R92S_CMD_GET_BCNOK_CNT 67 319 1.1 nia #define R92S_CMD_GET_BCNERR_CNT 68 320 1.1 nia #define R92S_CMD_GET_CURTXPWR_LEVEL 69 321 1.1 nia #define R92S_CMD_SET_DIG 70 322 1.1 nia #define R92S_CMD_SET_RA 71 323 1.1 nia #define R92S_CMD_SET_PT 72 324 1.1 nia #define R92S_CMD_READ_TSSI 73 325 1.1 nia 326 1.1 nia /* FW events notifications codes. */ 327 1.1 nia #define R92S_EVT_READ_MACREG 0 328 1.1 nia #define R92S_EVT_READ_BBREG 1 329 1.1 nia #define R92S_EVT_READ_RFREG 2 330 1.1 nia #define R92S_EVT_READ_EEPROM 3 331 1.1 nia #define R92S_EVT_READ_EFUSE 4 332 1.1 nia #define R92S_EVT_READ_CAM 5 333 1.1 nia #define R92S_EVT_GET_BASICRATE 6 334 1.1 nia #define R92S_EVT_GET_DATARATE 7 335 1.1 nia #define R92S_EVT_SURVEY 8 336 1.1 nia #define R92S_EVT_SURVEY_DONE 9 337 1.1 nia #define R92S_EVT_JOIN_BSS 10 338 1.1 nia #define R92S_EVT_ADD_STA 11 339 1.1 nia #define R92S_EVT_DEL_STA 12 340 1.1 nia #define R92S_EVT_ATIM_DONE 13 341 1.1 nia #define R92S_EVT_TX_REPORT 14 342 1.1 nia #define R92S_EVT_CCX_REPORT 15 343 1.1 nia #define R92S_EVT_DTM_REPORT 16 344 1.1 nia #define R92S_EVT_TXRATE_STATS 17 345 1.1 nia #define R92S_EVT_C2H_LBK 18 346 1.1 nia #define R92S_EVT_FWDBG 19 347 1.1 nia #define R92S_EVT_C2H_FEEDBACK 20 348 1.1 nia #define R92S_EVT_ADDBA 21 349 1.1 nia #define R92S_EVT_C2H_BCN 22 350 1.1 nia #define R92S_EVT_PWR_STATE 23 351 1.1 nia #define R92S_EVT_WPS_PBC 24 352 1.1 nia #define R92S_EVT_ADDBA_REQ_REPORT 25 353 1.1 nia 354 1.1 nia /* Structure for R92S_CMD_SITE_SURVEY. */ 355 1.1 nia struct r92s_fw_cmd_sitesurvey { 356 1.1 nia uint32_t active; 357 1.1 nia uint32_t limit; 358 1.1 nia uint32_t ssidlen; 359 1.1 nia uint8_t ssid[32 + 1]; 360 1.1 nia } __packed; 361 1.1 nia 362 1.1 nia /* Structure for R92S_CMD_SET_AUTH. */ 363 1.1 nia struct r92s_fw_cmd_auth { 364 1.1 nia uint8_t mode; 365 1.1 nia #define R92S_AUTHMODE_OPEN 0 366 1.1 nia #define R92S_AUTHMODE_SHARED 1 367 1.1 nia #define R92S_AUTHMODE_WPA 2 368 1.1 nia 369 1.1 nia uint8_t dot1x; 370 1.1 nia } __packed; 371 1.1 nia 372 1.1 nia /* Structure for R92S_CMD_SET_KEY. */ 373 1.1 nia struct r92s_fw_cmd_set_key { 374 1.1 nia uint8_t algo; 375 1.1 nia #define R92S_KEY_ALGO_NONE 0 376 1.1 nia #define R92S_KEY_ALGO_WEP40 1 377 1.1 nia #define R92S_KEY_ALGO_TKIP 2 378 1.1 nia #define R92S_KEY_ALGO_TKIP_MMIC 3 379 1.1 nia #define R92S_KEY_ALGO_AES 4 380 1.1 nia #define R92S_KEY_ALGO_WEP104 5 381 1.1 nia 382 1.1 nia uint8_t id; 383 1.1 nia uint8_t grpkey; 384 1.1 nia uint8_t key[16]; 385 1.1 nia } __packed; 386 1.1 nia 387 1.1 nia /* Structures for R92S_EVENT_SURVEY/R92S_CMD_JOIN_BSS. */ 388 1.1 nia /* NDIS_802_11_SSID. */ 389 1.1 nia struct ndis_802_11_ssid { 390 1.1 nia uint32_t ssidlen; 391 1.1 nia uint8_t ssid[32]; 392 1.1 nia } __packed; 393 1.1 nia 394 1.1 nia /* NDIS_802_11_CONFIGURATION_FH. */ 395 1.1 nia struct ndis_802_11_configuration_fh { 396 1.1 nia uint32_t len; 397 1.1 nia uint32_t hoppattern; 398 1.1 nia uint32_t hopset; 399 1.1 nia uint32_t dwelltime; 400 1.1 nia } __packed; 401 1.1 nia 402 1.1 nia /* NDIS_802_11_CONFIGURATION. */ 403 1.1 nia struct ndis_802_11_configuration { 404 1.1 nia uint32_t len; 405 1.1 nia uint32_t bintval; 406 1.1 nia uint32_t atim; 407 1.1 nia uint32_t dsconfig; 408 1.1 nia struct ndis_802_11_configuration_fh fhconfig; 409 1.1 nia } __packed; 410 1.1 nia 411 1.1 nia /* NDIS_WLAN_BSSID_EX. */ 412 1.1 nia struct ndis_wlan_bssid_ex { 413 1.1 nia uint32_t len; 414 1.1 nia uint8_t macaddr[IEEE80211_ADDR_LEN]; 415 1.1 nia uint8_t reserved[2]; 416 1.1 nia struct ndis_802_11_ssid ssid; 417 1.1 nia uint32_t privacy; 418 1.1 nia int32_t rssi; 419 1.1 nia uint32_t networktype; 420 1.1 nia #define NDIS802_11FH 0 421 1.1 nia #define NDIS802_11DS 1 422 1.1 nia #define NDIS802_11OFDM5 2 423 1.1 nia #define NDIS802_11OFDM24 3 424 1.1 nia #define NDIS802_11AUTOMODE 4 425 1.1 nia 426 1.1 nia struct ndis_802_11_configuration config; 427 1.1 nia uint32_t inframode; 428 1.1 nia #define NDIS802_11IBSS 0 429 1.1 nia #define NDIS802_11INFRASTRUCTURE 1 430 1.1 nia #define NDIS802_11AUTOUNKNOWN 2 431 1.1 nia #define NDIS802_11MONITOR 3 432 1.1 nia #define NDIS802_11APMODE 4 433 1.1 nia 434 1.1 nia uint8_t supprates[16]; 435 1.1 nia uint32_t ieslen; 436 1.1 nia /* Followed by ``ieslen'' bytes. */ 437 1.1 nia } __packed; 438 1.1 nia 439 1.1 nia /* NDIS_802_11_FIXED_IEs. */ 440 1.1 nia struct ndis_802_11_fixed_ies { 441 1.1 nia uint8_t tstamp[8]; 442 1.1 nia uint16_t bintval; 443 1.1 nia uint16_t capabilities; 444 1.1 nia } __packed; 445 1.1 nia 446 1.1 nia /* Structure for R92S_CMD_SET_PWR_MODE. */ 447 1.1 nia struct r92s_set_pwr_mode { 448 1.1 nia uint8_t mode; 449 1.1 nia #define R92S_PS_MODE_ACTIVE 0 450 1.1 nia #define R92S_PS_MODE_MIN 1 451 1.1 nia #define R92S_PS_MODE_MAX 2 452 1.1 nia #define R92S_PS_MODE_DTIM 3 453 1.1 nia #define R92S_PS_MODE_VOIP 4 454 1.1 nia #define R92S_PS_MODE_UAPSD_WMM 5 455 1.1 nia #define R92S_PS_MODE_UAPSD 6 456 1.1 nia #define R92S_PS_MODE_IBSS 7 457 1.1 nia #define R92S_PS_MODE_WWLAN 8 458 1.1 nia #define R92S_PS_MODE_RADIOOFF 9 459 1.1 nia #define R92S_PS_MODE_DISABLE 10 460 1.1 nia 461 1.1 nia uint8_t low_traffic_en; 462 1.1 nia uint8_t lpnav_en; 463 1.1 nia uint8_t rf_low_snr_en; 464 1.1 nia uint8_t dps_en; 465 1.1 nia uint8_t bcn_rx_en; 466 1.1 nia uint8_t bcn_pass_cnt; 467 1.1 nia uint8_t bcn_to; 468 1.1 nia uint16_t bcn_itv; 469 1.1 nia uint8_t app_itv; 470 1.1 nia uint8_t awake_bcn_itv; 471 1.1 nia uint8_t smart_ps; 472 1.1 nia uint8_t bcn_pass_time; 473 1.1 nia } __packed; 474 1.1 nia 475 1.1 nia /* Structure for event R92S_EVENT_JOIN_BSS. */ 476 1.1 nia struct r92s_event_join_bss { 477 1.1 nia uint32_t next; 478 1.1 nia uint32_t prev; 479 1.1 nia uint32_t networktype; 480 1.1 nia uint32_t fixed; 481 1.1 nia uint32_t lastscanned; 482 1.1 nia uint32_t associd; 483 1.1 nia uint32_t join_res; 484 1.1 nia struct ndis_wlan_bssid_ex bss; 485 1.1 nia } __packed; 486 1.1 nia 487 1.1 nia #define R92S_MACID_BSS 5 488 1.1 nia 489 1.1 nia /* Rx MAC descriptor. */ 490 1.1 nia struct r92s_rx_stat { 491 1.1 nia uint32_t rxdw0; 492 1.1 nia #define R92S_RXDW0_PKTLEN_M 0x00003fff 493 1.1 nia #define R92S_RXDW0_PKTLEN_S 0 494 1.1 nia #define R92S_RXDW0_CRCERR 0x00004000 495 1.1 nia #define R92S_RXDW0_INFOSZ_M 0x000f0000 496 1.1 nia #define R92S_RXDW0_INFOSZ_S 16 497 1.1 nia #define R92S_RXDW0_QOS 0x00800000 498 1.1 nia #define R92S_RXDW0_SHIFT_M 0x03000000 499 1.1 nia #define R92S_RXDW0_SHIFT_S 24 500 1.1 nia #define R92S_RXDW0_DECRYPTED 0x08000000 501 1.1 nia 502 1.1 nia uint32_t rxdw1; 503 1.1 nia #define R92S_RXDW1_MOREFRAG 0x08000000 504 1.1 nia 505 1.1 nia uint32_t rxdw2; 506 1.1 nia #define R92S_RXDW2_FRAG_M 0x0000f000 507 1.1 nia #define R92S_RXDW2_FRAG_S 12 508 1.1 nia #define R92S_RXDW2_PKTCNT_M 0x00ff0000 509 1.1 nia #define R92S_RXDW2_PKTCNT_S 16 510 1.1 nia 511 1.1 nia uint32_t rxdw3; 512 1.1 nia #define R92S_RXDW3_RATE_M 0x0000003f 513 1.1 nia #define R92S_RXDW3_RATE_S 0 514 1.1 nia #define R92S_RXDW3_TCPCHKRPT 0x00000800 515 1.1 nia #define R92S_RXDW3_IPCHKRPT 0x00001000 516 1.1 nia #define R92S_RXDW3_TCPCHKVALID 0x00002000 517 1.1 nia #define R92S_RXDW3_HTC 0x00004000 518 1.1 nia 519 1.1 nia uint32_t rxdw4; 520 1.1 nia uint32_t rxdw5; 521 1.1 nia } __packed __attribute__((aligned(4))); 522 1.1 nia 523 1.1 nia /* Rx PHY descriptor. */ 524 1.1 nia struct r92s_rx_phystat { 525 1.1 nia uint32_t phydw0; 526 1.1 nia uint32_t phydw1; 527 1.1 nia uint32_t phydw2; 528 1.1 nia uint32_t phydw3; 529 1.1 nia uint32_t phydw4; 530 1.1 nia uint32_t phydw5; 531 1.1 nia uint32_t phydw6; 532 1.1 nia uint32_t phydw7; 533 1.1 nia } __packed __attribute__((aligned(4))); 534 1.1 nia 535 1.1 nia /* Rx PHY CCK descriptor. */ 536 1.1 nia struct r92s_rx_cck { 537 1.1 nia uint8_t adc_pwdb[4]; 538 1.1 nia uint8_t sq_rpt; 539 1.1 nia uint8_t agc_rpt; 540 1.1 nia } __packed; 541 1.1 nia 542 1.1 nia /* Tx MAC descriptor. */ 543 1.1 nia struct r92s_tx_desc { 544 1.1 nia uint32_t txdw0; 545 1.1 nia #define R92S_TXDW0_PKTLEN_M 0x0000ffff 546 1.1 nia #define R92S_TXDW0_PKTLEN_S 0 547 1.1 nia #define R92S_TXDW0_OFFSET_M 0x00ff0000 548 1.1 nia #define R92S_TXDW0_OFFSET_S 16 549 1.1 nia #define R92S_TXDW0_TYPE_M 0x03000000 550 1.1 nia #define R92S_TXDW0_TYPE_S 24 551 1.1 nia #define R92S_TXDW0_LSG 0x04000000 552 1.1 nia #define R92S_TXDW0_FSG 0x08000000 553 1.1 nia #define R92S_TXDW0_LINIP 0x10000000 554 1.1 nia #define R92S_TXDW0_OWN 0x80000000 555 1.1 nia 556 1.1 nia uint32_t txdw1; 557 1.1 nia #define R92S_TXDW1_MACID_M 0x0000001f 558 1.1 nia #define R92S_TXDW1_MACID_S 0 559 1.1 nia #define R92S_TXDW1_MOREDATA 0x00000020 560 1.1 nia #define R92S_TXDW1_MOREFRAG 0x00000040 561 1.1 nia #define R92S_TXDW1_QSEL_M 0x00001f00 562 1.1 nia #define R92S_TXDW1_QSEL_S 8 563 1.1 nia #define R92S_TXDW1_QSEL_BE 0x03 564 1.1 nia #define R92S_TXDW1_QSEL_H2C 0x1f 565 1.1 nia #define R92S_TXDW1_NONQOS 0x00010000 566 1.1 nia #define R92S_TXDW1_KEYIDX_M 0x00060000 567 1.1 nia #define R92S_TXDW1_KEYIDX_S 17 568 1.1 nia #define R92S_TXDW1_CIPHER_M 0x00c00000 569 1.1 nia #define R92S_TXDW1_CIPHER_S 22 570 1.1 nia #define R92S_TXDW1_CIPHER_WEP 1 571 1.1 nia #define R92S_TXDW1_CIPHER_TKIP 2 572 1.1 nia #define R92S_TXDW1_CIPHER_AES 3 573 1.1 nia #define R92S_TXDW1_HWPC 0x80000000 574 1.1 nia 575 1.1 nia uint32_t txdw2; 576 1.1 nia #define R92S_TXDW2_BMCAST 0x00000080 577 1.1 nia #define R92S_TXDW2_AGGEN 0x20000000 578 1.1 nia #define R92S_TXDW2_BK 0x40000000 579 1.1 nia 580 1.1 nia uint32_t txdw3; 581 1.1 nia #define R92S_TXDW3_SEQ_M 0x0fff0000 582 1.1 nia #define R92S_TXDW3_SEQ_S 16 583 1.1 nia #define R92S_TXDW3_FRAG_M 0xf0000000 584 1.1 nia #define R92S_TXDW3_FRAG_S 28 585 1.1 nia 586 1.1 nia uint32_t txdw4; 587 1.1 nia #define R92S_TXDW4_TXBW 0x00040000 588 1.1 nia 589 1.1 nia uint32_t txdw5; 590 1.1 nia #define R92S_TXDW5_DISFB 0x00008000 591 1.1 nia 592 1.1 nia uint16_t ipchksum; 593 1.1 nia uint16_t tcpchksum; 594 1.1 nia 595 1.1 nia uint16_t txbufsize; 596 1.1 nia uint16_t reserved1; 597 1.1 nia } __packed __attribute__((aligned(4))); 598 1.1 nia 599 1.1 nia 600 1.1 nia /* 601 1.1 nia * Driver definitions. 602 1.1 nia */ 603 1.1 nia #define RSU_RX_LIST_COUNT 1 604 1.1 nia #define RSU_TX_LIST_COUNT (8 + 1) /* NB: +1 for FW commands. */ 605 1.1 nia 606 1.1 nia #define RSU_HOST_CMD_RING_COUNT 32 607 1.1 nia 608 1.1 nia #define RSU_RXBUFSZ (8 * 1024) 609 1.1 nia #define RSU_TXBUFSZ \ 610 1.1 nia ((sizeof(struct r92s_tx_desc) + IEEE80211_MAX_LEN + 3) & ~3) 611 1.1 nia 612 1.1 nia #define RSU_TX_TIMEOUT 5000 /* ms */ 613 1.1 nia #define RSU_CMD_TIMEOUT 2000 /* ms */ 614 1.1 nia 615 1.1 nia /* Queue ids (used by soft only). */ 616 1.1 nia #define RSU_QID_BCN 0 617 1.1 nia #define RSU_QID_MGT 1 618 1.1 nia #define RSU_QID_BMC 2 619 1.1 nia #define RSU_QID_VO 3 620 1.1 nia #define RSU_QID_VI 4 621 1.1 nia #define RSU_QID_BE 5 622 1.1 nia #define RSU_QID_BK 6 623 1.1 nia #define RSU_QID_RXOFF 7 624 1.1 nia #define RSU_QID_H2C 8 625 1.1 nia #define RSU_QID_C2H 9 626 1.1 nia 627 1.1 nia /* Map AC to queue id. */ 628 1.1 nia static const uint8_t rsu_ac2qid[WME_NUM_AC] = { 629 1.1 nia RSU_QID_BE, 630 1.1 nia RSU_QID_BK, 631 1.1 nia RSU_QID_VI, 632 1.1 nia RSU_QID_VO 633 1.1 nia }; 634 1.1 nia 635 1.1 nia /* Pipe index to endpoint address mapping. */ 636 1.1 nia static const uint8_t r92s_epaddr[] = 637 1.1 nia { 0x83, 0x04, 0x06, 0x0d, 638 1.1 nia 0x05, 0x07, 639 1.1 nia 0x89, 0x0a, 0x0b, 0x0c }; 640 1.1 nia 641 1.1 nia /* Queue id to pipe index mapping for 4 endpoints configurations. */ 642 1.1 nia static const uint8_t rsu_qid2idx_4ep[] = 643 1.1 nia { 3, 3, 3, 1, 1, 2, 2, 0, 3, 0 }; 644 1.1 nia 645 1.1 nia /* Queue id to pipe index mapping for 6 endpoints configurations. */ 646 1.1 nia static const uint8_t rsu_qid2idx_6ep[] = 647 1.1 nia { 3, 3, 3, 1, 4, 2, 5, 0, 3, 0 }; 648 1.1 nia 649 1.1 nia /* Queue id to pipe index mapping for 11 endpoints configurations. */ 650 1.1 nia static const uint8_t rsu_qid2idx_11ep[] = 651 1.1 nia { 7, 9, 8, 1, 4, 2, 5, 0, 3, 6 }; 652 1.1 nia 653 1.1 nia struct rsu_rx_radiotap_header { 654 1.1 nia struct ieee80211_radiotap_header wr_ihdr; 655 1.1 nia uint8_t wr_flags; 656 1.1 nia uint8_t wr_rate; 657 1.1 nia uint16_t wr_chan_freq; 658 1.1 nia uint16_t wr_chan_flags; 659 1.1 nia uint8_t wr_dbm_antsignal; 660 1.1 nia }; 661 1.1 nia 662 1.1 nia #define RSU_RX_RADIOTAP_PRESENT \ 663 1.1 nia (1 << IEEE80211_RADIOTAP_FLAGS | \ 664 1.1 nia 1 << IEEE80211_RADIOTAP_RATE | \ 665 1.1 nia 1 << IEEE80211_RADIOTAP_CHANNEL | \ 666 1.1 nia 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) 667 1.1 nia 668 1.1 nia struct rsu_tx_radiotap_header { 669 1.1 nia struct ieee80211_radiotap_header wt_ihdr; 670 1.1 nia uint8_t wt_flags; 671 1.1 nia uint16_t wt_chan_freq; 672 1.1 nia uint16_t wt_chan_flags; 673 1.1 nia }; 674 1.1 nia 675 1.1 nia #define RSU_TX_RADIOTAP_PRESENT \ 676 1.1 nia (1 << IEEE80211_RADIOTAP_FLAGS | \ 677 1.1 nia 1 << IEEE80211_RADIOTAP_CHANNEL) 678 1.1 nia 679 1.1 nia struct rsu_softc; 680 1.1 nia 681 1.1 nia struct rsu_rx_data { 682 1.1 nia struct rsu_softc *sc; 683 1.1 nia struct usbd_pipe *pipe; 684 1.1 nia struct usbd_xfer *xfer; 685 1.1 nia uint8_t *buf; 686 1.1 nia }; 687 1.1 nia 688 1.1 nia struct rsu_tx_data { 689 1.1 nia struct rsu_softc *sc; 690 1.1 nia struct usbd_pipe *pipe; 691 1.1 nia struct usbd_xfer *xfer; 692 1.1 nia uint8_t *buf; 693 1.1 nia TAILQ_ENTRY(rsu_tx_data) next; 694 1.1 nia }; 695 1.1 nia 696 1.1 nia struct rsu_host_cmd { 697 1.1 nia void (*cb)(struct rsu_softc *, void *); 698 1.1 nia uint8_t data[256]; 699 1.1 nia }; 700 1.1 nia 701 1.1 nia struct rsu_cmd_newstate { 702 1.1 nia enum ieee80211_state state; 703 1.1 nia int arg; 704 1.1 nia }; 705 1.1 nia 706 1.1 nia struct rsu_cmd_key { 707 1.1 nia struct ieee80211_key key; 708 1.1 nia struct ieee80211_node *ni; 709 1.1 nia }; 710 1.1 nia 711 1.1 nia struct rsu_host_cmd_ring { 712 1.1 nia struct rsu_host_cmd cmd[RSU_HOST_CMD_RING_COUNT]; 713 1.1 nia int cur; 714 1.1 nia int next; 715 1.1 nia int queued; 716 1.1 nia }; 717 1.1 nia 718 1.1 nia struct rsu_softc { 719 1.1 nia device_t sc_dev; 720 1.1 nia struct ieee80211com sc_ic; 721 1.1 nia struct ethercom sc_ec; 722 1.1 nia int (*sc_newstate)(struct ieee80211com *, 723 1.1 nia enum ieee80211_state, int); 724 1.1 nia struct usbd_device *sc_udev; 725 1.1 nia struct usbd_interface *sc_iface; 726 1.1 nia struct usb_task sc_task; 727 1.1 nia callout_t calib_to; 728 1.1 nia kcondvar_t sc_task_cv; 729 1.1 nia kmutex_t sc_task_mtx; 730 1.1 nia kmutex_t sc_media_mtx; 731 1.1 nia kmutex_t sc_tx_mtx; 732 1.1 nia struct usbd_pipe *pipe[R92S_MAX_EP]; 733 1.1 nia int npipes; 734 1.1 nia const uint8_t *qid2idx; 735 1.1 nia 736 1.1 nia u_int cut; 737 1.1 nia int scan_pass; 738 1.1 nia int sc_tx_timer; 739 1.1 nia struct rsu_host_cmd_ring cmdq; 740 1.1 nia struct rsu_rx_data rx_data[RSU_RX_LIST_COUNT]; 741 1.1 nia struct rsu_tx_data tx_data[RSU_TX_LIST_COUNT]; 742 1.1 nia struct rsu_tx_data *fwcmd_data; 743 1.1 nia uint8_t cmd_seq; 744 1.1 nia TAILQ_HEAD(, rsu_tx_data) tx_free_list; 745 1.1 nia uint8_t rom[128]; 746 1.1 nia 747 1.1 nia int sc_key_tasks; 748 1.1 nia }; 749