1aae9af60SChristian Lamparter /* 2aae9af60SChristian Lamparter * Shared Atheros AR9170 Header 3aae9af60SChristian Lamparter * 4aae9af60SChristian Lamparter * Firmware command interface definitions 5aae9af60SChristian Lamparter * 6aae9af60SChristian Lamparter * Copyright 2008, Johannes Berg <johannes@sipsolutions.net> 785ee5122SChristian Lamparter * Copyright 2009-2011 Christian Lamparter <chunkeey@googlemail.com> 8aae9af60SChristian Lamparter * 9aae9af60SChristian Lamparter * This program is free software; you can redistribute it and/or modify 10aae9af60SChristian Lamparter * it under the terms of the GNU General Public License as published by 11aae9af60SChristian Lamparter * the Free Software Foundation; either version 2 of the License. 12aae9af60SChristian Lamparter * 13aae9af60SChristian Lamparter * This program is distributed in the hope that it will be useful, 14aae9af60SChristian Lamparter * but WITHOUT ANY WARRANTY; without even the implied warranty of 15aae9af60SChristian Lamparter * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16aae9af60SChristian Lamparter * GNU General Public License for more details. 17aae9af60SChristian Lamparter * 18aae9af60SChristian Lamparter * You should have received a copy of the GNU General Public License 19aae9af60SChristian Lamparter * along with this program; see the file COPYING. If not, see 20aae9af60SChristian Lamparter * http://www.gnu.org/licenses/. 21aae9af60SChristian Lamparter * 22aae9af60SChristian Lamparter * This file incorporates work covered by the following copyright and 23aae9af60SChristian Lamparter * permission notice: 24aae9af60SChristian Lamparter * Copyright (c) 2007-2008 Atheros Communications, Inc. 25aae9af60SChristian Lamparter * 26aae9af60SChristian Lamparter * Permission to use, copy, modify, and/or distribute this software for any 27aae9af60SChristian Lamparter * purpose with or without fee is hereby granted, provided that the above 28aae9af60SChristian Lamparter * copyright notice and this permission notice appear in all copies. 29aae9af60SChristian Lamparter * 30aae9af60SChristian Lamparter * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 31aae9af60SChristian Lamparter * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 32aae9af60SChristian Lamparter * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 33aae9af60SChristian Lamparter * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 34aae9af60SChristian Lamparter * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 35aae9af60SChristian Lamparter * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 36aae9af60SChristian Lamparter * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 37aae9af60SChristian Lamparter */ 38aae9af60SChristian Lamparter 39aae9af60SChristian Lamparter #ifndef __CARL9170_SHARED_FWCMD_H 40aae9af60SChristian Lamparter #define __CARL9170_SHARED_FWCMD_H 41aae9af60SChristian Lamparter 42aae9af60SChristian Lamparter #define CARL9170_MAX_CMD_LEN 64 43aae9af60SChristian Lamparter #define CARL9170_MAX_CMD_PAYLOAD_LEN 60 44aae9af60SChristian Lamparter 45aae9af60SChristian Lamparter #define CARL9170FW_API_MIN_VER 1 46aae9af60SChristian Lamparter #define CARL9170FW_API_MAX_VER 1 47aae9af60SChristian Lamparter 48aae9af60SChristian Lamparter enum carl9170_cmd_oids { 49aae9af60SChristian Lamparter CARL9170_CMD_RREG = 0x00, 50aae9af60SChristian Lamparter CARL9170_CMD_WREG = 0x01, 51aae9af60SChristian Lamparter CARL9170_CMD_ECHO = 0x02, 52aae9af60SChristian Lamparter CARL9170_CMD_SWRST = 0x03, 53aae9af60SChristian Lamparter CARL9170_CMD_REBOOT = 0x04, 54aae9af60SChristian Lamparter CARL9170_CMD_BCN_CTRL = 0x05, 55aae9af60SChristian Lamparter CARL9170_CMD_READ_TSF = 0x06, 565c895691SChristian Lamparter CARL9170_CMD_RX_FILTER = 0x07, 5785ee5122SChristian Lamparter CARL9170_CMD_WOL = 0x08, 58f5e2289aSChristian Lamparter CARL9170_CMD_TALLY = 0x09, 592f10e50eSChristian Lamparter CARL9170_CMD_WREGB = 0x0a, 60aae9af60SChristian Lamparter 61aae9af60SChristian Lamparter /* CAM */ 62aae9af60SChristian Lamparter CARL9170_CMD_EKEY = 0x10, 63aae9af60SChristian Lamparter CARL9170_CMD_DKEY = 0x11, 64aae9af60SChristian Lamparter 65aae9af60SChristian Lamparter /* RF / PHY */ 66aae9af60SChristian Lamparter CARL9170_CMD_FREQUENCY = 0x20, 67aae9af60SChristian Lamparter CARL9170_CMD_RF_INIT = 0x21, 68aae9af60SChristian Lamparter CARL9170_CMD_SYNTH = 0x22, 69aae9af60SChristian Lamparter CARL9170_CMD_FREQ_START = 0x23, 70aae9af60SChristian Lamparter CARL9170_CMD_PSM = 0x24, 71aae9af60SChristian Lamparter 72aae9af60SChristian Lamparter /* Asychronous command flag */ 73aae9af60SChristian Lamparter CARL9170_CMD_ASYNC_FLAG = 0x40, 74aae9af60SChristian Lamparter CARL9170_CMD_WREG_ASYNC = (CARL9170_CMD_WREG | 75aae9af60SChristian Lamparter CARL9170_CMD_ASYNC_FLAG), 76aae9af60SChristian Lamparter CARL9170_CMD_REBOOT_ASYNC = (CARL9170_CMD_REBOOT | 77aae9af60SChristian Lamparter CARL9170_CMD_ASYNC_FLAG), 78aae9af60SChristian Lamparter CARL9170_CMD_BCN_CTRL_ASYNC = (CARL9170_CMD_BCN_CTRL | 79aae9af60SChristian Lamparter CARL9170_CMD_ASYNC_FLAG), 80aae9af60SChristian Lamparter CARL9170_CMD_PSM_ASYNC = (CARL9170_CMD_PSM | 81aae9af60SChristian Lamparter CARL9170_CMD_ASYNC_FLAG), 82aae9af60SChristian Lamparter 83aae9af60SChristian Lamparter /* responses and traps */ 84aae9af60SChristian Lamparter CARL9170_RSP_FLAG = 0xc0, 85aae9af60SChristian Lamparter CARL9170_RSP_PRETBTT = 0xc0, 86aae9af60SChristian Lamparter CARL9170_RSP_TXCOMP = 0xc1, 87aae9af60SChristian Lamparter CARL9170_RSP_BEACON_CONFIG = 0xc2, 88aae9af60SChristian Lamparter CARL9170_RSP_ATIM = 0xc3, 89aae9af60SChristian Lamparter CARL9170_RSP_WATCHDOG = 0xc6, 90aae9af60SChristian Lamparter CARL9170_RSP_TEXT = 0xca, 91aae9af60SChristian Lamparter CARL9170_RSP_HEXDUMP = 0xcc, 92aae9af60SChristian Lamparter CARL9170_RSP_RADAR = 0xcd, 93aae9af60SChristian Lamparter CARL9170_RSP_GPIO = 0xce, 94aae9af60SChristian Lamparter CARL9170_RSP_BOOT = 0xcf, 95aae9af60SChristian Lamparter }; 96aae9af60SChristian Lamparter 97aae9af60SChristian Lamparter struct carl9170_set_key_cmd { 98aae9af60SChristian Lamparter __le16 user; 99aae9af60SChristian Lamparter __le16 keyId; 100aae9af60SChristian Lamparter __le16 type; 101aae9af60SChristian Lamparter u8 macAddr[6]; 102aae9af60SChristian Lamparter u32 key[4]; 1033f1240e4SChristian Lamparter } __packed __aligned(4); 104aae9af60SChristian Lamparter #define CARL9170_SET_KEY_CMD_SIZE 28 105aae9af60SChristian Lamparter 106aae9af60SChristian Lamparter struct carl9170_disable_key_cmd { 107aae9af60SChristian Lamparter __le16 user; 108aae9af60SChristian Lamparter __le16 padding; 1093f1240e4SChristian Lamparter } __packed __aligned(4); 110aae9af60SChristian Lamparter #define CARL9170_DISABLE_KEY_CMD_SIZE 4 111aae9af60SChristian Lamparter 112aae9af60SChristian Lamparter struct carl9170_u32_list { 113aae9af60SChristian Lamparter u32 vals[0]; 114aae9af60SChristian Lamparter } __packed; 115aae9af60SChristian Lamparter 116aae9af60SChristian Lamparter struct carl9170_reg_list { 117aae9af60SChristian Lamparter __le32 regs[0]; 118aae9af60SChristian Lamparter } __packed; 119aae9af60SChristian Lamparter 120aae9af60SChristian Lamparter struct carl9170_write_reg { 121aae9af60SChristian Lamparter struct { 122aae9af60SChristian Lamparter __le32 addr; 123aae9af60SChristian Lamparter __le32 val; 124aae9af60SChristian Lamparter } regs[0] __packed; 125aae9af60SChristian Lamparter } __packed; 126aae9af60SChristian Lamparter 1272f10e50eSChristian Lamparter struct carl9170_write_reg_byte { 1282f10e50eSChristian Lamparter __le32 addr; 1292f10e50eSChristian Lamparter __le32 count; 130103dc3daSGustavo A. R. Silva u8 val[]; 1312f10e50eSChristian Lamparter } __packed; 1322f10e50eSChristian Lamparter 133aae9af60SChristian Lamparter #define CARL9170FW_PHY_HT_ENABLE 0x4 134aae9af60SChristian Lamparter #define CARL9170FW_PHY_HT_DYN2040 0x8 135aae9af60SChristian Lamparter #define CARL9170FW_PHY_HT_EXT_CHAN_OFF 0x3 136aae9af60SChristian Lamparter #define CARL9170FW_PHY_HT_EXT_CHAN_OFF_S 2 137aae9af60SChristian Lamparter 138aae9af60SChristian Lamparter struct carl9170_rf_init { 139aae9af60SChristian Lamparter __le32 freq; 140aae9af60SChristian Lamparter u8 ht_settings; 141aae9af60SChristian Lamparter u8 padding2[3]; 142aae9af60SChristian Lamparter __le32 delta_slope_coeff_exp; 143aae9af60SChristian Lamparter __le32 delta_slope_coeff_man; 144aae9af60SChristian Lamparter __le32 delta_slope_coeff_exp_shgi; 145aae9af60SChristian Lamparter __le32 delta_slope_coeff_man_shgi; 146aae9af60SChristian Lamparter __le32 finiteLoopCount; 147aae9af60SChristian Lamparter } __packed; 148aae9af60SChristian Lamparter #define CARL9170_RF_INIT_SIZE 28 149aae9af60SChristian Lamparter 150aae9af60SChristian Lamparter struct carl9170_rf_init_result { 151aae9af60SChristian Lamparter __le32 ret; /* AR9170_PHY_REG_AGC_CONTROL */ 152aae9af60SChristian Lamparter } __packed; 153aae9af60SChristian Lamparter #define CARL9170_RF_INIT_RESULT_SIZE 4 154aae9af60SChristian Lamparter 155aae9af60SChristian Lamparter #define CARL9170_PSM_SLEEP 0x1000 156aae9af60SChristian Lamparter #define CARL9170_PSM_SOFTWARE 0 157aae9af60SChristian Lamparter #define CARL9170_PSM_WAKE 0 /* internally used. */ 158aae9af60SChristian Lamparter #define CARL9170_PSM_COUNTER 0xfff 159aae9af60SChristian Lamparter #define CARL9170_PSM_COUNTER_S 0 160aae9af60SChristian Lamparter 161aae9af60SChristian Lamparter struct carl9170_psm { 162aae9af60SChristian Lamparter __le32 state; 163aae9af60SChristian Lamparter } __packed; 164aae9af60SChristian Lamparter #define CARL9170_PSM_SIZE 4 165aae9af60SChristian Lamparter 1665ae994d0SChristian Lamparter /* 1675ae994d0SChristian Lamparter * Note: If a bit in rx_filter is set, then it 1685ae994d0SChristian Lamparter * means that the particular frames which matches 1695ae994d0SChristian Lamparter * the condition are FILTERED/REMOVED/DISCARDED! 1705ae994d0SChristian Lamparter * (This is can be a bit confusing, especially 1715ae994d0SChristian Lamparter * because someone people think it's the exact 1725ae994d0SChristian Lamparter * opposite way, so watch out!) 1735ae994d0SChristian Lamparter */ 1745c895691SChristian Lamparter struct carl9170_rx_filter_cmd { 1755c895691SChristian Lamparter __le32 rx_filter; 1765c895691SChristian Lamparter } __packed; 1775c895691SChristian Lamparter #define CARL9170_RX_FILTER_CMD_SIZE 4 1785c895691SChristian Lamparter 1795c895691SChristian Lamparter #define CARL9170_RX_FILTER_BAD 0x01 1805c895691SChristian Lamparter #define CARL9170_RX_FILTER_OTHER_RA 0x02 1815c895691SChristian Lamparter #define CARL9170_RX_FILTER_DECRY_FAIL 0x04 1825c895691SChristian Lamparter #define CARL9170_RX_FILTER_CTL_OTHER 0x08 1835c895691SChristian Lamparter #define CARL9170_RX_FILTER_CTL_PSPOLL 0x10 1845c895691SChristian Lamparter #define CARL9170_RX_FILTER_CTL_BACKR 0x20 1855c895691SChristian Lamparter #define CARL9170_RX_FILTER_MGMT 0x40 1865c895691SChristian Lamparter #define CARL9170_RX_FILTER_DATA 0x80 1879e09b5c9SChristian Lamparter #define CARL9170_RX_FILTER_EVERYTHING (~0) 1885c895691SChristian Lamparter 189aae9af60SChristian Lamparter struct carl9170_bcn_ctrl_cmd { 190aae9af60SChristian Lamparter __le32 vif_id; 191aae9af60SChristian Lamparter __le32 mode; 192aae9af60SChristian Lamparter __le32 bcn_addr; 193aae9af60SChristian Lamparter __le32 bcn_len; 194aae9af60SChristian Lamparter } __packed; 195aae9af60SChristian Lamparter #define CARL9170_BCN_CTRL_CMD_SIZE 16 196aae9af60SChristian Lamparter 197aae9af60SChristian Lamparter #define CARL9170_BCN_CTRL_DRAIN 0 198aae9af60SChristian Lamparter #define CARL9170_BCN_CTRL_CAB_TRIGGER 1 199aae9af60SChristian Lamparter 20085ee5122SChristian Lamparter struct carl9170_wol_cmd { 20185ee5122SChristian Lamparter __le32 flags; 20285ee5122SChristian Lamparter u8 mac[6]; 20385ee5122SChristian Lamparter u8 bssid[6]; 20485ee5122SChristian Lamparter __le32 null_interval; 20585ee5122SChristian Lamparter __le32 free_for_use2; 20685ee5122SChristian Lamparter __le32 mask; 20785ee5122SChristian Lamparter u8 pattern[32]; 20885ee5122SChristian Lamparter } __packed; 20985ee5122SChristian Lamparter 21085ee5122SChristian Lamparter #define CARL9170_WOL_CMD_SIZE 60 21185ee5122SChristian Lamparter 21285ee5122SChristian Lamparter #define CARL9170_WOL_DISCONNECT 1 21385ee5122SChristian Lamparter #define CARL9170_WOL_MAGIC_PKT 2 21485ee5122SChristian Lamparter 215aae9af60SChristian Lamparter struct carl9170_cmd_head { 216aae9af60SChristian Lamparter union { 217aae9af60SChristian Lamparter struct { 218aae9af60SChristian Lamparter u8 len; 219aae9af60SChristian Lamparter u8 cmd; 220aae9af60SChristian Lamparter u8 seq; 221aae9af60SChristian Lamparter u8 ext; 222aae9af60SChristian Lamparter } __packed; 223aae9af60SChristian Lamparter 224aae9af60SChristian Lamparter u32 hdr_data; 225aae9af60SChristian Lamparter } __packed; 226aae9af60SChristian Lamparter } __packed; 227aae9af60SChristian Lamparter 228aae9af60SChristian Lamparter struct carl9170_cmd { 229aae9af60SChristian Lamparter struct carl9170_cmd_head hdr; 230aae9af60SChristian Lamparter union { 231aae9af60SChristian Lamparter struct carl9170_set_key_cmd setkey; 232aae9af60SChristian Lamparter struct carl9170_disable_key_cmd disablekey; 233aae9af60SChristian Lamparter struct carl9170_u32_list echo; 234aae9af60SChristian Lamparter struct carl9170_reg_list rreg; 235aae9af60SChristian Lamparter struct carl9170_write_reg wreg; 2362f10e50eSChristian Lamparter struct carl9170_write_reg_byte wregb; 237aae9af60SChristian Lamparter struct carl9170_rf_init rf_init; 238aae9af60SChristian Lamparter struct carl9170_psm psm; 23985ee5122SChristian Lamparter struct carl9170_wol_cmd wol; 240aae9af60SChristian Lamparter struct carl9170_bcn_ctrl_cmd bcn_ctrl; 2415c895691SChristian Lamparter struct carl9170_rx_filter_cmd rx_filter; 242aae9af60SChristian Lamparter u8 data[CARL9170_MAX_CMD_PAYLOAD_LEN]; 243*ca9ad549SArnd Bergmann } __packed __aligned(4); 2443f1240e4SChristian Lamparter } __packed __aligned(4); 245aae9af60SChristian Lamparter 246aae9af60SChristian Lamparter #define CARL9170_TX_STATUS_QUEUE 3 247aae9af60SChristian Lamparter #define CARL9170_TX_STATUS_QUEUE_S 0 248aae9af60SChristian Lamparter #define CARL9170_TX_STATUS_RIX_S 2 249aae9af60SChristian Lamparter #define CARL9170_TX_STATUS_RIX (3 << CARL9170_TX_STATUS_RIX_S) 250aae9af60SChristian Lamparter #define CARL9170_TX_STATUS_TRIES_S 4 251aae9af60SChristian Lamparter #define CARL9170_TX_STATUS_TRIES (7 << CARL9170_TX_STATUS_TRIES_S) 252aae9af60SChristian Lamparter #define CARL9170_TX_STATUS_SUCCESS 0x80 253aae9af60SChristian Lamparter 2543f1240e4SChristian Lamparter #ifdef __CARL9170FW__ 255aae9af60SChristian Lamparter /* 256aae9af60SChristian Lamparter * NOTE: 257aae9af60SChristian Lamparter * Both structs [carl9170_tx_status and _carl9170_tx_status] 258aae9af60SChristian Lamparter * need to be "bit for bit" in sync. 259aae9af60SChristian Lamparter */ 260aae9af60SChristian Lamparter struct carl9170_tx_status { 261aae9af60SChristian Lamparter /* 262aae9af60SChristian Lamparter * Beware of compiler bugs in all gcc pre 4.4! 263aae9af60SChristian Lamparter */ 264aae9af60SChristian Lamparter 265aae9af60SChristian Lamparter u8 cookie; 266aae9af60SChristian Lamparter u8 queue:2; 267aae9af60SChristian Lamparter u8 rix:2; 268aae9af60SChristian Lamparter u8 tries:3; 269aae9af60SChristian Lamparter u8 success:1; 270aae9af60SChristian Lamparter } __packed; 2713f1240e4SChristian Lamparter #endif /* __CARL9170FW__ */ 2723f1240e4SChristian Lamparter 273aae9af60SChristian Lamparter struct _carl9170_tx_status { 274aae9af60SChristian Lamparter /* 275aae9af60SChristian Lamparter * This version should be immune to all alignment bugs. 276aae9af60SChristian Lamparter */ 277aae9af60SChristian Lamparter 278aae9af60SChristian Lamparter u8 cookie; 279aae9af60SChristian Lamparter u8 info; 280aae9af60SChristian Lamparter } __packed; 281aae9af60SChristian Lamparter #define CARL9170_TX_STATUS_SIZE 2 282aae9af60SChristian Lamparter 283aae9af60SChristian Lamparter #define CARL9170_RSP_TX_STATUS_NUM (CARL9170_MAX_CMD_PAYLOAD_LEN / \ 284aae9af60SChristian Lamparter sizeof(struct _carl9170_tx_status)) 285aae9af60SChristian Lamparter 286aae9af60SChristian Lamparter #define CARL9170_TX_MAX_RATE_TRIES 7 287aae9af60SChristian Lamparter 288aae9af60SChristian Lamparter #define CARL9170_TX_MAX_RATES 4 289aae9af60SChristian Lamparter #define CARL9170_TX_MAX_RETRY_RATES (CARL9170_TX_MAX_RATES - 1) 290aae9af60SChristian Lamparter #define CARL9170_ERR_MAGIC "ERR:" 291aae9af60SChristian Lamparter #define CARL9170_BUG_MAGIC "BUG:" 292aae9af60SChristian Lamparter 293aae9af60SChristian Lamparter struct carl9170_gpio { 294aae9af60SChristian Lamparter __le32 gpio; 295aae9af60SChristian Lamparter } __packed; 296aae9af60SChristian Lamparter #define CARL9170_GPIO_SIZE 4 297aae9af60SChristian Lamparter 298aae9af60SChristian Lamparter struct carl9170_tsf_rsp { 299aae9af60SChristian Lamparter union { 300aae9af60SChristian Lamparter __le32 tsf[2]; 301aae9af60SChristian Lamparter __le64 tsf_64; 302aae9af60SChristian Lamparter } __packed; 303aae9af60SChristian Lamparter } __packed; 304aae9af60SChristian Lamparter #define CARL9170_TSF_RSP_SIZE 8 305aae9af60SChristian Lamparter 306f5e2289aSChristian Lamparter struct carl9170_tally_rsp { 307f5e2289aSChristian Lamparter __le32 active; 308f5e2289aSChristian Lamparter __le32 cca; 309f5e2289aSChristian Lamparter __le32 tx_time; 310f5e2289aSChristian Lamparter __le32 rx_total; 311f5e2289aSChristian Lamparter __le32 rx_overrun; 312f5e2289aSChristian Lamparter __le32 tick; 313f5e2289aSChristian Lamparter } __packed; 314f5e2289aSChristian Lamparter 315aae9af60SChristian Lamparter struct carl9170_rsp { 316aae9af60SChristian Lamparter struct carl9170_cmd_head hdr; 317aae9af60SChristian Lamparter 318aae9af60SChristian Lamparter union { 319aae9af60SChristian Lamparter struct carl9170_rf_init_result rf_init_res; 320aae9af60SChristian Lamparter struct carl9170_u32_list rreg_res; 321aae9af60SChristian Lamparter struct carl9170_u32_list echo; 3223f1240e4SChristian Lamparter #ifdef __CARL9170FW__ 323aae9af60SChristian Lamparter struct carl9170_tx_status tx_status[0]; 3243f1240e4SChristian Lamparter #endif /* __CARL9170FW__ */ 325aae9af60SChristian Lamparter struct _carl9170_tx_status _tx_status[0]; 326aae9af60SChristian Lamparter struct carl9170_gpio gpio; 327aae9af60SChristian Lamparter struct carl9170_tsf_rsp tsf; 328aae9af60SChristian Lamparter struct carl9170_psm psm; 329f5e2289aSChristian Lamparter struct carl9170_tally_rsp tally; 330aae9af60SChristian Lamparter u8 data[CARL9170_MAX_CMD_PAYLOAD_LEN]; 331aae9af60SChristian Lamparter } __packed; 3323f1240e4SChristian Lamparter } __packed __aligned(4); 333aae9af60SChristian Lamparter 334aae9af60SChristian Lamparter #endif /* __CARL9170_SHARED_FWCMD_H */ 335