X-Git-Url: https://jxself.org/git/?p=carl9170fw.git;a=blobdiff_plain;f=include%2Fshared%2Ffwcmd.h;h=2a58dd88b21ef39dae5d095ae21dc1211884ca29;hp=49fdb2f71a731ec25c0561e6ffe333b4b4be9898;hb=e017a914b2679d669e201cc76f812b641aa7eea3;hpb=e72388a0aa23da8bc8e24a0cbe9d523c5a9ce294 diff --git a/include/shared/fwcmd.h b/include/shared/fwcmd.h index 49fdb2f..2a58dd8 100644 --- a/include/shared/fwcmd.h +++ b/include/shared/fwcmd.h @@ -1,10 +1,10 @@ /* - * Atheros AR9170 driver + * Shared Atheros AR9170 Header * - * firmware command interface definitions + * Firmware command interface definitions * * Copyright 2008, Johannes Berg - * Copyright 2009, 2010, Christian Lamparter + * Copyright 2009-2011 Christian Lamparter * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -51,9 +51,12 @@ enum carl9170_cmd_oids { CARL9170_CMD_ECHO = 0x02, CARL9170_CMD_SWRST = 0x03, CARL9170_CMD_REBOOT = 0x04, - CARL9170_CMD_FLUSH_CAB = 0x05, + CARL9170_CMD_BCN_CTRL = 0x05, CARL9170_CMD_READ_TSF = 0x06, - CARL9170_CMD_USB_WD = 0x07, + CARL9170_CMD_RX_FILTER = 0x07, + CARL9170_CMD_WOL = 0x08, + CARL9170_CMD_TALLY = 0x09, + CARL9170_CMD_WREGB = 0x0a, /* CAM */ CARL9170_CMD_EKEY = 0x10, @@ -66,7 +69,19 @@ enum carl9170_cmd_oids { CARL9170_CMD_FREQ_START = 0x23, CARL9170_CMD_PSM = 0x24, + /* Asychronous command flag */ + CARL9170_CMD_ASYNC_FLAG = 0x40, + CARL9170_CMD_WREG_ASYNC = (CARL9170_CMD_WREG | + CARL9170_CMD_ASYNC_FLAG), + CARL9170_CMD_REBOOT_ASYNC = (CARL9170_CMD_REBOOT | + CARL9170_CMD_ASYNC_FLAG), + CARL9170_CMD_BCN_CTRL_ASYNC = (CARL9170_CMD_BCN_CTRL | + CARL9170_CMD_ASYNC_FLAG), + CARL9170_CMD_PSM_ASYNC = (CARL9170_CMD_PSM | + CARL9170_CMD_ASYNC_FLAG), + /* responses and traps */ + CARL9170_RSP_FLAG = 0xc0, CARL9170_RSP_PRETBTT = 0xc0, CARL9170_RSP_TXCOMP = 0xc1, CARL9170_RSP_BEACON_CONFIG = 0xc2, @@ -76,7 +91,7 @@ enum carl9170_cmd_oids { CARL9170_RSP_HEXDUMP = 0xcc, CARL9170_RSP_RADAR = 0xcd, CARL9170_RSP_GPIO = 0xce, - CARL9170_RSP_USB_WD = 0xcf + CARL9170_RSP_BOOT = 0xcf, }; struct carl9170_set_key_cmd { @@ -85,13 +100,13 @@ struct carl9170_set_key_cmd { __le16 type; u8 macAddr[6]; u32 key[4]; -} __packed; +} __packed __aligned(4); #define CARL9170_SET_KEY_CMD_SIZE 28 struct carl9170_disable_key_cmd { __le16 user; __le16 padding; -} __packed; +} __packed __aligned(4); #define CARL9170_DISABLE_KEY_CMD_SIZE 4 struct carl9170_u32_list { @@ -109,6 +124,12 @@ struct carl9170_write_reg { } regs[0] __packed; } __packed; +struct carl9170_write_reg_byte { + __le32 addr; + __le32 count; + u8 val[0]; +} __packed; + #define CARL9170FW_PHY_HT_ENABLE 0x4 #define CARL9170FW_PHY_HT_DYN2040 0x8 #define CARL9170FW_PHY_HT_EXT_CHAN_OFF 0x3 @@ -128,17 +149,8 @@ struct carl9170_rf_init { struct carl9170_rf_init_result { __le32 ret; /* AR9170_PHY_REG_AGC_CONTROL */ - __le32 regs[6]; } __packed; -#define CARL9170_RF_INIT_RESULT_SIZE 28 - -#define CARL9170_USB_WATCHDOG_INACTIVE 0 -#define CARL9170_USB_WATCHDOG_ON_DUTY 1 - -struct carl9170_watchdog_cmd { - __le32 state; -} __packed; -#define CARL9170_WATCHDOG_CMD_SIZE 4 +#define CARL9170_RF_INIT_RESULT_SIZE 4 #define CARL9170_PSM_SLEEP 0x1000 #define CARL9170_PSM_SOFTWARE 0 @@ -151,10 +163,54 @@ struct carl9170_psm { } __packed; #define CARL9170_PSM_SIZE 4 -struct carl9170_cab_flush_cmd { - __le32 vif_id; /* currently unused */ +/* + * Note: If a bit in rx_filter is set, then it + * means that the particular frames which matches + * the condition are FILTERED/REMOVED/DISCARDED! + * (This is can be a bit confusing, especially + * because someone people think it's the exact + * opposite way, so watch out!) + */ +struct carl9170_rx_filter_cmd { + __le32 rx_filter; } __packed; -#define CARL9170_CAB_FLUSH_CMD_SIZE 4 +#define CARL9170_RX_FILTER_CMD_SIZE 4 + +#define CARL9170_RX_FILTER_BAD 0x01 +#define CARL9170_RX_FILTER_OTHER_RA 0x02 +#define CARL9170_RX_FILTER_DECRY_FAIL 0x04 +#define CARL9170_RX_FILTER_CTL_OTHER 0x08 +#define CARL9170_RX_FILTER_CTL_PSPOLL 0x10 +#define CARL9170_RX_FILTER_CTL_BACKR 0x20 +#define CARL9170_RX_FILTER_MGMT 0x40 +#define CARL9170_RX_FILTER_DATA 0x80 +#define CARL9170_RX_FILTER_EVERYTHING (~0) + +struct carl9170_bcn_ctrl_cmd { + __le32 vif_id; + __le32 mode; + __le32 bcn_addr; + __le32 bcn_len; +} __packed; +#define CARL9170_BCN_CTRL_CMD_SIZE 16 + +#define CARL9170_BCN_CTRL_DRAIN 0 +#define CARL9170_BCN_CTRL_CAB_TRIGGER 1 + +struct carl9170_wol_cmd { + __le32 flags; + u8 mac[6]; + u8 bssid[6]; + __le32 null_interval; + __le32 free_for_use2; + __le32 mask; + u8 pattern[32]; +} __packed; + +#define CARL9170_WOL_CMD_SIZE 60 + +#define CARL9170_WOL_DISCONNECT 1 +#define CARL9170_WOL_MAGIC_PKT 2 struct carl9170_cmd_head { union { @@ -175,23 +231,27 @@ struct carl9170_cmd { struct carl9170_set_key_cmd setkey; struct carl9170_disable_key_cmd disablekey; struct carl9170_u32_list echo; - struct carl9170_watchdog_cmd watchdog; struct carl9170_reg_list rreg; struct carl9170_write_reg wreg; + struct carl9170_write_reg_byte wregb; struct carl9170_rf_init rf_init; struct carl9170_psm psm; - struct carl9170_cab_flush_cmd cab_flush; + struct carl9170_wol_cmd wol; + struct carl9170_bcn_ctrl_cmd bcn_ctrl; + struct carl9170_rx_filter_cmd rx_filter; u8 data[CARL9170_MAX_CMD_PAYLOAD_LEN]; - } __packed; -} __packed; - -#define CARL9170_TX_STATUS_QUEUE_MASK 3 -#define CARL9170_TX_STATUS_RIX_SHIFT 2 -#define CARL9170_TX_STATUS_RIX_MASK (3 << CARL9170_TX_STATUS_RIX_SHIFT) -#define CARL9170_TX_STATUS_TRIES_SHIFT 4 -#define CARL9170_TX_STATUS_TRIES_MASK (7 << CARL9170_TX_STATUS_TRIES_SHIFT) + } __packed __aligned(4); +} __packed __aligned(4); + +#define CARL9170_TX_STATUS_QUEUE 3 +#define CARL9170_TX_STATUS_QUEUE_S 0 +#define CARL9170_TX_STATUS_RIX_S 2 +#define CARL9170_TX_STATUS_RIX (3 << CARL9170_TX_STATUS_RIX_S) +#define CARL9170_TX_STATUS_TRIES_S 4 +#define CARL9170_TX_STATUS_TRIES (7 << CARL9170_TX_STATUS_TRIES_S) #define CARL9170_TX_STATUS_SUCCESS 0x80 +#ifdef __CARL9170FW__ /* * NOTE: * Both structs [carl9170_tx_status and _carl9170_tx_status] @@ -208,6 +268,8 @@ struct carl9170_tx_status { u8 tries:3; u8 success:1; } __packed; +#endif /* __CARL9170FW__ */ + struct _carl9170_tx_status { /* * This version should be immune to all alignment bugs. @@ -241,6 +303,15 @@ struct carl9170_tsf_rsp { } __packed; #define CARL9170_TSF_RSP_SIZE 8 +struct carl9170_tally_rsp { + __le32 active; + __le32 cca; + __le32 tx_time; + __le32 rx_total; + __le32 rx_overrun; + __le32 tick; +} __packed; + struct carl9170_rsp { struct carl9170_cmd_head hdr; @@ -248,14 +319,16 @@ struct carl9170_rsp { struct carl9170_rf_init_result rf_init_res; struct carl9170_u32_list rreg_res; struct carl9170_u32_list echo; - struct carl9170_watchdog_cmd watchdog; +#ifdef __CARL9170FW__ struct carl9170_tx_status tx_status[0]; +#endif /* __CARL9170FW__ */ struct _carl9170_tx_status _tx_status[0]; struct carl9170_gpio gpio; struct carl9170_tsf_rsp tsf; struct carl9170_psm psm; + struct carl9170_tally_rsp tally; u8 data[CARL9170_MAX_CMD_PAYLOAD_LEN]; } __packed; -} __packed; +} __packed __aligned(4); #endif /* __CARL9170_SHARED_FWCMD_H */