ar5523_hw.h (11641B)
1/* 2 * Copyright (c) 2006 Damien Bergamini <damien.bergamini@free.fr> 3 * Copyright (c) 2006 Sam Leffler, Errno Consulting 4 * Copyright (c) 2007 Christoph Hellwig <hch@lst.de> 5 * Copyright (c) 2008-2009 Weongyo Jeong <weongyo@freebsd.org> 6 * Copyright (c) 2012 Pontus Fuchs <pontus.fuchs@gmail.com> 7 * 8 * Permission to use, copy, modify, and/or distribute this software for any 9 * purpose with or without fee is hereby granted, provided that the above 10 * copyright notice and this permission notice appear in all copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21/* all fields are big endian */ 22struct ar5523_fwblock { 23 __be32 flags; 24#define AR5523_WRITE_BLOCK (1 << 4) 25 26 __be32 len; 27#define AR5523_MAX_FWBLOCK_SIZE 2048 28 29 __be32 total; 30 __be32 remain; 31 __be32 rxtotal; 32 __be32 pad[123]; 33} __packed; 34 35#define AR5523_MAX_RXCMDSZ 1024 36#define AR5523_MAX_TXCMDSZ 1024 37 38struct ar5523_cmd_hdr { 39 __be32 len; 40 __be32 code; 41/* NB: these are defined for rev 1.5 firmware; rev 1.6 is different */ 42/* messages from Host -> Target */ 43#define WDCMSG_HOST_AVAILABLE 0x01 44#define WDCMSG_BIND 0x02 45#define WDCMSG_TARGET_RESET 0x03 46#define WDCMSG_TARGET_GET_CAPABILITY 0x04 47#define WDCMSG_TARGET_SET_CONFIG 0x05 48#define WDCMSG_TARGET_GET_STATUS 0x06 49#define WDCMSG_TARGET_GET_STATS 0x07 50#define WDCMSG_TARGET_START 0x08 51#define WDCMSG_TARGET_STOP 0x09 52#define WDCMSG_TARGET_ENABLE 0x0a 53#define WDCMSG_TARGET_DISABLE 0x0b 54#define WDCMSG_CREATE_CONNECTION 0x0c 55#define WDCMSG_UPDATE_CONNECT_ATTR 0x0d 56#define WDCMSG_DELETE_CONNECT 0x0e 57#define WDCMSG_SEND 0x0f 58#define WDCMSG_FLUSH 0x10 59/* messages from Target -> Host */ 60#define WDCMSG_STATS_UPDATE 0x11 61#define WDCMSG_BMISS 0x12 62#define WDCMSG_DEVICE_AVAIL 0x13 63#define WDCMSG_SEND_COMPLETE 0x14 64#define WDCMSG_DATA_AVAIL 0x15 65#define WDCMSG_SET_PWR_MODE 0x16 66#define WDCMSG_BMISS_ACK 0x17 67#define WDCMSG_SET_LED_STEADY 0x18 68#define WDCMSG_SET_LED_BLINK 0x19 69/* more messages */ 70#define WDCMSG_SETUP_BEACON_DESC 0x1a 71#define WDCMSG_BEACON_INIT 0x1b 72#define WDCMSG_RESET_KEY_CACHE 0x1c 73#define WDCMSG_RESET_KEY_CACHE_ENTRY 0x1d 74#define WDCMSG_SET_KEY_CACHE_ENTRY 0x1e 75#define WDCMSG_SET_DECOMP_MASK 0x1f 76#define WDCMSG_SET_REGULATORY_DOMAIN 0x20 77#define WDCMSG_SET_LED_STATE 0x21 78#define WDCMSG_WRITE_ASSOCID 0x22 79#define WDCMSG_SET_STA_BEACON_TIMERS 0x23 80#define WDCMSG_GET_TSF 0x24 81#define WDCMSG_RESET_TSF 0x25 82#define WDCMSG_SET_ADHOC_MODE 0x26 83#define WDCMSG_SET_BASIC_RATE 0x27 84#define WDCMSG_MIB_CONTROL 0x28 85#define WDCMSG_GET_CHANNEL_DATA 0x29 86#define WDCMSG_GET_CUR_RSSI 0x2a 87#define WDCMSG_SET_ANTENNA_SWITCH 0x2b 88#define WDCMSG_USE_SHORT_SLOT_TIME 0x2f 89#define WDCMSG_SET_POWER_MODE 0x30 90#define WDCMSG_SETUP_PSPOLL_DESC 0x31 91#define WDCMSG_SET_RX_MULTICAST_FILTER 0x32 92#define WDCMSG_RX_FILTER 0x33 93#define WDCMSG_PER_CALIBRATION 0x34 94#define WDCMSG_RESET 0x35 95#define WDCMSG_DISABLE 0x36 96#define WDCMSG_PHY_DISABLE 0x37 97#define WDCMSG_SET_TX_POWER_LIMIT 0x38 98#define WDCMSG_SET_TX_QUEUE_PARAMS 0x39 99#define WDCMSG_SETUP_TX_QUEUE 0x3a 100#define WDCMSG_RELEASE_TX_QUEUE 0x3b 101#define WDCMSG_SET_DEFAULT_KEY 0x43 102 103 __u32 priv; /* driver private data, 104 don't care about endianess */ 105 __be32 magic; 106 __be32 reserved2[4]; 107}; 108 109struct ar5523_cmd_host_available { 110 __be32 sw_ver_major; 111 __be32 sw_ver_minor; 112 __be32 sw_ver_patch; 113 __be32 sw_ver_build; 114} __packed; 115 116#define ATH_SW_VER_MAJOR 1 117#define ATH_SW_VER_MINOR 5 118#define ATH_SW_VER_PATCH 0 119#define ATH_SW_VER_BUILD 9999 120 121struct ar5523_chunk { 122 u8 seqnum; /* sequence number for ordering */ 123 u8 flags; 124#define UATH_CFLAGS_FINAL 0x01 /* final chunk of a msg */ 125#define UATH_CFLAGS_RXMSG 0x02 /* chunk contains rx completion */ 126#define UATH_CFLAGS_DEBUG 0x04 /* for debugging */ 127 __be16 length; /* chunk size in bytes */ 128 /* chunk data follows */ 129} __packed; 130 131/* 132 * Message format for a WDCMSG_DATA_AVAIL message from Target to Host. 133 */ 134struct ar5523_rx_desc { 135 __be32 len; /* msg length including header */ 136 __be32 code; /* WDCMSG_DATA_AVAIL */ 137 __be32 gennum; /* generation number */ 138 __be32 status; /* start of RECEIVE_INFO */ 139#define UATH_STATUS_OK 0 140#define UATH_STATUS_STOP_IN_PROGRESS 1 141#define UATH_STATUS_CRC_ERR 2 142#define UATH_STATUS_PHY_ERR 3 143#define UATH_STATUS_DECRYPT_CRC_ERR 4 144#define UATH_STATUS_DECRYPT_MIC_ERR 5 145#define UATH_STATUS_DECOMP_ERR 6 146#define UATH_STATUS_KEY_ERR 7 147#define UATH_STATUS_ERR 8 148 __be32 tstamp_low; /* low-order 32-bits of rx timestamp */ 149 __be32 tstamp_high; /* high-order 32-bits of rx timestamp */ 150 __be32 framelen; /* frame length */ 151 __be32 rate; /* rx rate code */ 152 __be32 antenna; 153 __be32 rssi; 154 __be32 channel; 155 __be32 phyerror; 156 __be32 connix; /* key table ix for bss traffic */ 157 __be32 decrypterror; 158 __be32 keycachemiss; 159 __be32 pad; /* XXX? */ 160} __packed; 161 162struct ar5523_tx_desc { 163 __be32 msglen; 164 u32 msgid; /* msg id (supplied by host) */ 165 __be32 type; /* opcode: WDMSG_SEND or WDCMSG_FLUSH */ 166 __be32 txqid; /* tx queue id and flags */ 167#define UATH_TXQID_MASK 0x0f 168#define UATH_TXQID_MINRATE 0x10 /* use min tx rate */ 169#define UATH_TXQID_FF 0x20 /* content is fast frame */ 170 __be32 connid; /* tx connection id */ 171#define UATH_ID_INVALID 0xffffffff /* for sending prior to connection */ 172 __be32 flags; /* non-zero if response desired */ 173#define UATH_TX_NOTIFY (1 << 24) /* f/w will send a UATH_NOTIF_TX */ 174 __be32 buflen; /* payload length */ 175} __packed; 176 177 178#define AR5523_ID_BSS 2 179#define AR5523_ID_BROADCAST 0xffffffff 180 181/* structure for command UATH_CMD_WRITE_MAC */ 182struct ar5523_write_mac { 183 __be32 reg; 184 __be32 len; 185 u8 data[32]; 186} __packed; 187 188struct ar5523_cmd_rateset { 189 __u8 length; 190#define AR5523_MAX_NRATES 32 191 __u8 set[AR5523_MAX_NRATES]; 192}; 193 194struct ar5523_cmd_set_associd { /* AR5523_WRITE_ASSOCID */ 195 __be32 defaultrateix; 196 __be32 associd; 197 __be32 timoffset; 198 __be32 turboprime; 199 __u8 bssid[6]; 200} __packed; 201 202/* structure for command WDCMSG_RESET */ 203struct ar5523_cmd_reset { 204 __be32 flags; /* channel flags */ 205#define UATH_CHAN_TURBO 0x0100 206#define UATH_CHAN_CCK 0x0200 207#define UATH_CHAN_OFDM 0x0400 208#define UATH_CHAN_2GHZ 0x1000 209#define UATH_CHAN_5GHZ 0x2000 210 __be32 freq; /* channel frequency */ 211 __be32 maxrdpower; 212 __be32 cfgctl; 213 __be32 twiceantennareduction; 214 __be32 channelchange; 215 __be32 keeprccontent; 216} __packed; 217 218/* structure for command WDCMSG_SET_BASIC_RATE */ 219struct ar5523_cmd_rates { 220 __be32 connid; 221 __be32 keeprccontent; 222 __be32 size; 223 struct ar5523_cmd_rateset rateset; 224} __packed; 225 226enum { 227 WLAN_MODE_NONE = 0, 228 WLAN_MODE_11b, 229 WLAN_MODE_11a, 230 WLAN_MODE_11g, 231 WLAN_MODE_11a_TURBO, 232 WLAN_MODE_11g_TURBO, 233 WLAN_MODE_11a_TURBO_PRIME, 234 WLAN_MODE_11g_TURBO_PRIME, 235 WLAN_MODE_11a_XR, 236 WLAN_MODE_11g_XR, 237}; 238 239struct ar5523_cmd_connection_attr { 240 __be32 longpreambleonly; 241 struct ar5523_cmd_rateset rateset; 242 __be32 wlanmode; 243} __packed; 244 245/* structure for command AR5523_CREATE_CONNECTION */ 246struct ar5523_cmd_create_connection { 247 __be32 connid; 248 __be32 bssid; 249 __be32 size; 250 struct ar5523_cmd_connection_attr connattr; 251} __packed; 252 253struct ar5523_cmd_ledsteady { /* WDCMSG_SET_LED_STEADY */ 254 __be32 lednum; 255#define UATH_LED_LINK 0 256#define UATH_LED_ACTIVITY 1 257 __be32 ledmode; 258#define UATH_LED_OFF 0 259#define UATH_LED_ON 1 260} __packed; 261 262struct ar5523_cmd_ledblink { /* WDCMSG_SET_LED_BLINK */ 263 __be32 lednum; 264 __be32 ledmode; 265 __be32 blinkrate; 266 __be32 slowmode; 267} __packed; 268 269struct ar5523_cmd_ledstate { /* WDCMSG_SET_LED_STATE */ 270 __be32 connected; 271} __packed; 272 273struct ar5523_cmd_txq_attr { 274 __be32 priority; 275 __be32 aifs; 276 __be32 logcwmin; 277 __be32 logcwmax; 278 __be32 bursttime; 279 __be32 mode; 280 __be32 qflags; 281} __packed; 282 283struct ar5523_cmd_txq_setup { /* WDCMSG_SETUP_TX_QUEUE */ 284 __be32 qid; 285 __be32 len; 286 struct ar5523_cmd_txq_attr attr; 287} __packed; 288 289struct ar5523_cmd_rx_filter { /* WDCMSG_RX_FILTER */ 290 __be32 bits; 291#define UATH_FILTER_RX_UCAST 0x00000001 292#define UATH_FILTER_RX_MCAST 0x00000002 293#define UATH_FILTER_RX_BCAST 0x00000004 294#define UATH_FILTER_RX_CONTROL 0x00000008 295#define UATH_FILTER_RX_BEACON 0x00000010 /* beacon frames */ 296#define UATH_FILTER_RX_PROM 0x00000020 /* promiscuous mode */ 297#define UATH_FILTER_RX_PHY_ERR 0x00000040 /* phy errors */ 298#define UATH_FILTER_RX_PHY_RADAR 0x00000080 /* radar phy errors */ 299#define UATH_FILTER_RX_XR_POOL 0x00000400 /* XR group polls */ 300#define UATH_FILTER_RX_PROBE_REQ 0x00000800 301 __be32 op; 302#define UATH_FILTER_OP_INIT 0x0 303#define UATH_FILTER_OP_SET 0x1 304#define UATH_FILTER_OP_CLEAR 0x2 305#define UATH_FILTER_OP_TEMP 0x3 306#define UATH_FILTER_OP_RESTORE 0x4 307} __packed; 308 309enum { 310 CFG_NONE, /* Sentinal to indicate "no config" */ 311 CFG_REG_DOMAIN, /* Regulatory Domain */ 312 CFG_RATE_CONTROL_ENABLE, 313 CFG_DEF_XMIT_DATA_RATE, /* NB: if rate control is not enabled */ 314 CFG_HW_TX_RETRIES, 315 CFG_SW_TX_RETRIES, 316 CFG_SLOW_CLOCK_ENABLE, 317 CFG_COMP_PROC, 318 CFG_USER_RTS_THRESHOLD, 319 CFG_XR2NORM_RATE_THRESHOLD, 320 CFG_XRMODE_SWITCH_COUNT, 321 CFG_PROTECTION_TYPE, 322 CFG_BURST_SEQ_THRESHOLD, 323 CFG_ABOLT, 324 CFG_IQ_LOG_COUNT_MAX, 325 CFG_MODE_CTS, 326 CFG_WME_ENABLED, 327 CFG_GPRS_CBR_PERIOD, 328 CFG_SERVICE_TYPE, 329 /* MAC Address to use. Overrides EEPROM */ 330 CFG_MAC_ADDR, 331 CFG_DEBUG_EAR, 332 CFG_INIT_REGS, 333 /* An ID for use in error & debug messages */ 334 CFG_DEBUG_ID, 335 CFG_COMP_WIN_SZ, 336 CFG_DIVERSITY_CTL, 337 CFG_TP_SCALE, 338 CFG_TPC_HALF_DBM5, 339 CFG_TPC_HALF_DBM2, 340 CFG_OVERRD_TX_POWER, 341 CFG_USE_32KHZ_CLOCK, 342 CFG_GMODE_PROTECTION, 343 CFG_GMODE_PROTECT_RATE_INDEX, 344 CFG_GMODE_NON_ERP_PREAMBLE, 345 CFG_WDC_TRANSPORT_CHUNK_SIZE, 346}; 347 348enum { 349 /* Sentinal to indicate "no capability" */ 350 CAP_NONE, 351 CAP_ALL, /* ALL capabilities */ 352 CAP_TARGET_VERSION, 353 CAP_TARGET_REVISION, 354 CAP_MAC_VERSION, 355 CAP_MAC_REVISION, 356 CAP_PHY_REVISION, 357 CAP_ANALOG_5GHz_REVISION, 358 CAP_ANALOG_2GHz_REVISION, 359 /* Target supports WDC message debug features */ 360 CAP_DEBUG_WDCMSG_SUPPORT, 361 362 CAP_REG_DOMAIN, 363 CAP_COUNTRY_CODE, 364 CAP_REG_CAP_BITS, 365 366 CAP_WIRELESS_MODES, 367 CAP_CHAN_SPREAD_SUPPORT, 368 CAP_SLEEP_AFTER_BEACON_BROKEN, 369 CAP_COMPRESS_SUPPORT, 370 CAP_BURST_SUPPORT, 371 CAP_FAST_FRAMES_SUPPORT, 372 CAP_CHAP_TUNING_SUPPORT, 373 CAP_TURBOG_SUPPORT, 374 CAP_TURBO_PRIME_SUPPORT, 375 CAP_DEVICE_TYPE, 376 CAP_XR_SUPPORT, 377 CAP_WME_SUPPORT, 378 CAP_TOTAL_QUEUES, 379 CAP_CONNECTION_ID_MAX, /* Should absorb CAP_KEY_CACHE_SIZE */ 380 381 CAP_LOW_5GHZ_CHAN, 382 CAP_HIGH_5GHZ_CHAN, 383 CAP_LOW_2GHZ_CHAN, 384 CAP_HIGH_2GHZ_CHAN, 385 386 CAP_MIC_AES_CCM, 387 CAP_MIC_CKIP, 388 CAP_MIC_TKIP, 389 CAP_MIC_TKIP_WME, 390 CAP_CIPHER_AES_CCM, 391 CAP_CIPHER_CKIP, 392 CAP_CIPHER_TKIP, 393 394 CAP_TWICE_ANTENNAGAIN_5G, 395 CAP_TWICE_ANTENNAGAIN_2G, 396}; 397 398enum { 399 ST_NONE, /* Sentinal to indicate "no status" */ 400 ST_ALL, 401 ST_SERVICE_TYPE, 402 ST_WLAN_MODE, 403 ST_FREQ, 404 ST_BAND, 405 ST_LAST_RSSI, 406 ST_PS_FRAMES_DROPPED, 407 ST_CACHED_DEF_ANT, 408 ST_COUNT_OTHER_RX_ANT, 409 ST_USE_FAST_DIVERSITY, 410 ST_MAC_ADDR, 411 ST_RX_GENERATION_NUM, 412 ST_TX_QUEUE_DEPTH, 413 ST_SERIAL_NUMBER, 414 ST_WDC_TRANSPORT_CHUNK_SIZE, 415}; 416 417enum { 418 TARGET_DEVICE_AWAKE, 419 TARGET_DEVICE_SLEEP, 420 TARGET_DEVICE_PWRDN, 421 TARGET_DEVICE_PWRSAVE, 422 TARGET_DEVICE_SUSPEND, 423 TARGET_DEVICE_RESUME, 424}; 425 426/* this is in net/ieee80211.h, but that conflicts with the mac80211 headers */ 427#define IEEE80211_2ADDR_LEN 16 428 429#define AR5523_MIN_RXBUFSZ \ 430 (((sizeof(__be32) + IEEE80211_2ADDR_LEN + \ 431 sizeof(struct ar5523_rx_desc)) + 3) & ~3)