|  | /****************************************************************************** | 
|  | * | 
|  | * This file is provided under a dual BSD/GPLv2 license.  When using or | 
|  | * redistributing this file, you may do so under either license. | 
|  | * | 
|  | * GPL LICENSE SUMMARY | 
|  | * | 
|  | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify | 
|  | * it under the terms of version 2 of the GNU General Public License as | 
|  | * published by the Free Software Foundation. | 
|  | * | 
|  | * This program is distributed in the hope that it will be useful, but | 
|  | * WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU General Public License | 
|  | * along with this program; if not, write to the Free Software | 
|  | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, | 
|  | * USA | 
|  | * | 
|  | * The full GNU General Public License is included in this distribution | 
|  | * in the file called COPYING. | 
|  | * | 
|  | * Contact Information: | 
|  | *  Intel Linux Wireless <linuxwifi@intel.com> | 
|  | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 
|  | * | 
|  | * BSD LICENSE | 
|  | * | 
|  | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. | 
|  | * All rights reserved. | 
|  | * | 
|  | * Redistribution and use in source and binary forms, with or without | 
|  | * modification, are permitted provided that the following conditions | 
|  | * are met: | 
|  | * | 
|  | *  * Redistributions of source code must retain the above copyright | 
|  | *    notice, this list of conditions and the following disclaimer. | 
|  | *  * Redistributions in binary form must reproduce the above copyright | 
|  | *    notice, this list of conditions and the following disclaimer in | 
|  | *    the documentation and/or other materials provided with the | 
|  | *    distribution. | 
|  | *  * Neither the name Intel Corporation nor the names of its | 
|  | *    contributors may be used to endorse or promote products derived | 
|  | *    from this software without specific prior written permission. | 
|  | * | 
|  | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
|  | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
|  | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
|  | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
|  | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
|  | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
|  | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
|  | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
|  | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
|  | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
|  | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  | *****************************************************************************/ | 
|  |  | 
|  | #ifndef __fw_api_mac_h__ | 
|  | #define __fw_api_mac_h__ | 
|  |  | 
|  | /* | 
|  | * The first MAC indices (starting from 0) are available to the driver, | 
|  | * AUX indices follows - 1 for non-CDB, 2 for CDB. | 
|  | */ | 
|  | #define MAC_INDEX_AUX		4 | 
|  | #define MAC_INDEX_MIN_DRIVER	0 | 
|  | #define NUM_MAC_INDEX_DRIVER	MAC_INDEX_AUX | 
|  | #define NUM_MAC_INDEX		(NUM_MAC_INDEX_DRIVER + 1) | 
|  | #define NUM_MAC_INDEX_CDB	(NUM_MAC_INDEX_DRIVER + 2) | 
|  |  | 
|  | #define IWL_MVM_STATION_COUNT		16 | 
|  | #define IWL_MVM_INVALID_STA		0xFF | 
|  |  | 
|  | #define IWL_MVM_TDLS_STA_COUNT	4 | 
|  |  | 
|  | enum iwl_ac { | 
|  | AC_BK, | 
|  | AC_BE, | 
|  | AC_VI, | 
|  | AC_VO, | 
|  | AC_NUM, | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * enum iwl_mac_protection_flags - MAC context flags | 
|  | * @MAC_PROT_FLG_TGG_PROTECT: 11g protection when transmitting OFDM frames, | 
|  | *	this will require CCK RTS/CTS2self. | 
|  | *	RTS/CTS will protect full burst time. | 
|  | * @MAC_PROT_FLG_HT_PROT: enable HT protection | 
|  | * @MAC_PROT_FLG_FAT_PROT: protect 40 MHz transmissions | 
|  | * @MAC_PROT_FLG_SELF_CTS_EN: allow CTS2self | 
|  | */ | 
|  | enum iwl_mac_protection_flags { | 
|  | MAC_PROT_FLG_TGG_PROTECT	= BIT(3), | 
|  | MAC_PROT_FLG_HT_PROT		= BIT(23), | 
|  | MAC_PROT_FLG_FAT_PROT		= BIT(24), | 
|  | MAC_PROT_FLG_SELF_CTS_EN	= BIT(30), | 
|  | }; | 
|  |  | 
|  | #define MAC_FLG_SHORT_SLOT		BIT(4) | 
|  | #define MAC_FLG_SHORT_PREAMBLE		BIT(5) | 
|  |  | 
|  | /** | 
|  | * enum iwl_mac_types - Supported MAC types | 
|  | * @FW_MAC_TYPE_FIRST: lowest supported MAC type | 
|  | * @FW_MAC_TYPE_AUX: Auxiliary MAC (internal) | 
|  | * @FW_MAC_TYPE_LISTENER: monitor MAC type (?) | 
|  | * @FW_MAC_TYPE_PIBSS: Pseudo-IBSS | 
|  | * @FW_MAC_TYPE_IBSS: IBSS | 
|  | * @FW_MAC_TYPE_BSS_STA: BSS (managed) station | 
|  | * @FW_MAC_TYPE_P2P_DEVICE: P2P Device | 
|  | * @FW_MAC_TYPE_P2P_STA: P2P client | 
|  | * @FW_MAC_TYPE_GO: P2P GO | 
|  | * @FW_MAC_TYPE_TEST: ? | 
|  | * @FW_MAC_TYPE_MAX: highest support MAC type | 
|  | */ | 
|  | enum iwl_mac_types { | 
|  | FW_MAC_TYPE_FIRST = 1, | 
|  | FW_MAC_TYPE_AUX = FW_MAC_TYPE_FIRST, | 
|  | FW_MAC_TYPE_LISTENER, | 
|  | FW_MAC_TYPE_PIBSS, | 
|  | FW_MAC_TYPE_IBSS, | 
|  | FW_MAC_TYPE_BSS_STA, | 
|  | FW_MAC_TYPE_P2P_DEVICE, | 
|  | FW_MAC_TYPE_P2P_STA, | 
|  | FW_MAC_TYPE_GO, | 
|  | FW_MAC_TYPE_TEST, | 
|  | FW_MAC_TYPE_MAX = FW_MAC_TYPE_TEST | 
|  | }; /* MAC_CONTEXT_TYPE_API_E_VER_1 */ | 
|  |  | 
|  | /** | 
|  | * enum iwl_tsf_id - TSF hw timer ID | 
|  | * @TSF_ID_A: use TSF A | 
|  | * @TSF_ID_B: use TSF B | 
|  | * @TSF_ID_C: use TSF C | 
|  | * @TSF_ID_D: use TSF D | 
|  | * @NUM_TSF_IDS: number of TSF timers available | 
|  | */ | 
|  | enum iwl_tsf_id { | 
|  | TSF_ID_A = 0, | 
|  | TSF_ID_B = 1, | 
|  | TSF_ID_C = 2, | 
|  | TSF_ID_D = 3, | 
|  | NUM_TSF_IDS = 4, | 
|  | }; /* TSF_ID_API_E_VER_1 */ | 
|  |  | 
|  | /** | 
|  | * struct iwl_mac_data_ap - configuration data for AP MAC context | 
|  | * @beacon_time: beacon transmit time in system time | 
|  | * @beacon_tsf: beacon transmit time in TSF | 
|  | * @bi: beacon interval in TU | 
|  | * @bi_reciprocal: 2^32 / bi | 
|  | * @dtim_interval: dtim transmit time in TU | 
|  | * @dtim_reciprocal: 2^32 / dtim_interval | 
|  | * @mcast_qid: queue ID for multicast traffic. | 
|  | *	NOTE: obsolete from VER2 and on | 
|  | * @beacon_template: beacon template ID | 
|  | */ | 
|  | struct iwl_mac_data_ap { | 
|  | __le32 beacon_time; | 
|  | __le64 beacon_tsf; | 
|  | __le32 bi; | 
|  | __le32 bi_reciprocal; | 
|  | __le32 dtim_interval; | 
|  | __le32 dtim_reciprocal; | 
|  | __le32 mcast_qid; | 
|  | __le32 beacon_template; | 
|  | } __packed; /* AP_MAC_DATA_API_S_VER_2 */ | 
|  |  | 
|  | /** | 
|  | * struct iwl_mac_data_ibss - configuration data for IBSS MAC context | 
|  | * @beacon_time: beacon transmit time in system time | 
|  | * @beacon_tsf: beacon transmit time in TSF | 
|  | * @bi: beacon interval in TU | 
|  | * @bi_reciprocal: 2^32 / bi | 
|  | * @beacon_template: beacon template ID | 
|  | */ | 
|  | struct iwl_mac_data_ibss { | 
|  | __le32 beacon_time; | 
|  | __le64 beacon_tsf; | 
|  | __le32 bi; | 
|  | __le32 bi_reciprocal; | 
|  | __le32 beacon_template; | 
|  | } __packed; /* IBSS_MAC_DATA_API_S_VER_1 */ | 
|  |  | 
|  | /** | 
|  | * struct iwl_mac_data_sta - configuration data for station MAC context | 
|  | * @is_assoc: 1 for associated state, 0 otherwise | 
|  | * @dtim_time: DTIM arrival time in system time | 
|  | * @dtim_tsf: DTIM arrival time in TSF | 
|  | * @bi: beacon interval in TU, applicable only when associated | 
|  | * @bi_reciprocal: 2^32 / bi , applicable only when associated | 
|  | * @dtim_interval: DTIM interval in TU, applicable only when associated | 
|  | * @dtim_reciprocal: 2^32 / dtim_interval , applicable only when associated | 
|  | * @listen_interval: in beacon intervals, applicable only when associated | 
|  | * @assoc_id: unique ID assigned by the AP during association | 
|  | * @assoc_beacon_arrive_time: TSF of first beacon after association | 
|  | */ | 
|  | struct iwl_mac_data_sta { | 
|  | __le32 is_assoc; | 
|  | __le32 dtim_time; | 
|  | __le64 dtim_tsf; | 
|  | __le32 bi; | 
|  | __le32 bi_reciprocal; | 
|  | __le32 dtim_interval; | 
|  | __le32 dtim_reciprocal; | 
|  | __le32 listen_interval; | 
|  | __le32 assoc_id; | 
|  | __le32 assoc_beacon_arrive_time; | 
|  | } __packed; /* STA_MAC_DATA_API_S_VER_1 */ | 
|  |  | 
|  | /** | 
|  | * struct iwl_mac_data_go - configuration data for P2P GO MAC context | 
|  | * @ap: iwl_mac_data_ap struct with most config data | 
|  | * @ctwin: client traffic window in TU (period after TBTT when GO is present). | 
|  | *	0 indicates that there is no CT window. | 
|  | * @opp_ps_enabled: indicate that opportunistic PS allowed | 
|  | */ | 
|  | struct iwl_mac_data_go { | 
|  | struct iwl_mac_data_ap ap; | 
|  | __le32 ctwin; | 
|  | __le32 opp_ps_enabled; | 
|  | } __packed; /* GO_MAC_DATA_API_S_VER_1 */ | 
|  |  | 
|  | /** | 
|  | * struct iwl_mac_data_p2p_sta - configuration data for P2P client MAC context | 
|  | * @sta: iwl_mac_data_sta struct with most config data | 
|  | * @ctwin: client traffic window in TU (period after TBTT when GO is present). | 
|  | *	0 indicates that there is no CT window. | 
|  | */ | 
|  | struct iwl_mac_data_p2p_sta { | 
|  | struct iwl_mac_data_sta sta; | 
|  | __le32 ctwin; | 
|  | } __packed; /* P2P_STA_MAC_DATA_API_S_VER_1 */ | 
|  |  | 
|  | /** | 
|  | * struct iwl_mac_data_pibss - Pseudo IBSS config data | 
|  | * @stats_interval: interval in TU between statistics notifications to host. | 
|  | */ | 
|  | struct iwl_mac_data_pibss { | 
|  | __le32 stats_interval; | 
|  | } __packed; /* PIBSS_MAC_DATA_API_S_VER_1 */ | 
|  |  | 
|  | /* | 
|  | * struct iwl_mac_data_p2p_dev - configuration data for the P2P Device MAC | 
|  | * context. | 
|  | * @is_disc_extended: if set to true, P2P Device discoverability is enabled on | 
|  | *	other channels as well. This should be to true only in case that the | 
|  | *	device is discoverable and there is an active GO. Note that setting this | 
|  | *	field when not needed, will increase the number of interrupts and have | 
|  | *	effect on the platform power, as this setting opens the Rx filters on | 
|  | *	all macs. | 
|  | */ | 
|  | struct iwl_mac_data_p2p_dev { | 
|  | __le32 is_disc_extended; | 
|  | } __packed; /* _P2P_DEV_MAC_DATA_API_S_VER_1 */ | 
|  |  | 
|  | /** | 
|  | * enum iwl_mac_filter_flags - MAC context filter flags | 
|  | * @MAC_FILTER_IN_PROMISC: accept all data frames | 
|  | * @MAC_FILTER_IN_CONTROL_AND_MGMT: pass all management and | 
|  | *	control frames to the host | 
|  | * @MAC_FILTER_ACCEPT_GRP: accept multicast frames | 
|  | * @MAC_FILTER_DIS_DECRYPT: don't decrypt unicast frames | 
|  | * @MAC_FILTER_DIS_GRP_DECRYPT: don't decrypt multicast frames | 
|  | * @MAC_FILTER_IN_BEACON: transfer foreign BSS's beacons to host | 
|  | *	(in station mode when associated) | 
|  | * @MAC_FILTER_OUT_BCAST: filter out all broadcast frames | 
|  | * @MAC_FILTER_IN_CRC32: extract FCS and append it to frames | 
|  | * @MAC_FILTER_IN_PROBE_REQUEST: pass probe requests to host | 
|  | */ | 
|  | enum iwl_mac_filter_flags { | 
|  | MAC_FILTER_IN_PROMISC		= BIT(0), | 
|  | MAC_FILTER_IN_CONTROL_AND_MGMT	= BIT(1), | 
|  | MAC_FILTER_ACCEPT_GRP		= BIT(2), | 
|  | MAC_FILTER_DIS_DECRYPT		= BIT(3), | 
|  | MAC_FILTER_DIS_GRP_DECRYPT	= BIT(4), | 
|  | MAC_FILTER_IN_BEACON		= BIT(6), | 
|  | MAC_FILTER_OUT_BCAST		= BIT(8), | 
|  | MAC_FILTER_IN_CRC32		= BIT(11), | 
|  | MAC_FILTER_IN_PROBE_REQUEST	= BIT(12), | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * enum iwl_mac_qos_flags - QoS flags | 
|  | * @MAC_QOS_FLG_UPDATE_EDCA: ? | 
|  | * @MAC_QOS_FLG_TGN: HT is enabled | 
|  | * @MAC_QOS_FLG_TXOP_TYPE: ? | 
|  | * | 
|  | */ | 
|  | enum iwl_mac_qos_flags { | 
|  | MAC_QOS_FLG_UPDATE_EDCA	= BIT(0), | 
|  | MAC_QOS_FLG_TGN		= BIT(1), | 
|  | MAC_QOS_FLG_TXOP_TYPE	= BIT(4), | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * struct iwl_ac_qos - QOS timing params for MAC_CONTEXT_CMD | 
|  | * @cw_min: Contention window, start value in numbers of slots. | 
|  | *	Should be a power-of-2, minus 1.  Device's default is 0x0f. | 
|  | * @cw_max: Contention window, max value in numbers of slots. | 
|  | *	Should be a power-of-2, minus 1.  Device's default is 0x3f. | 
|  | * @aifsn:  Number of slots in Arbitration Interframe Space (before | 
|  | *	performing random backoff timing prior to Tx).  Device default 1. | 
|  | * @fifos_mask: FIFOs used by this MAC for this AC | 
|  | * @edca_txop:  Length of Tx opportunity, in uSecs.  Device default is 0. | 
|  | * | 
|  | * One instance of this config struct for each of 4 EDCA access categories | 
|  | * in struct iwl_qosparam_cmd. | 
|  | * | 
|  | * Device will automatically increase contention window by (2*CW) + 1 for each | 
|  | * transmission retry.  Device uses cw_max as a bit mask, ANDed with new CW | 
|  | * value, to cap the CW value. | 
|  | */ | 
|  | struct iwl_ac_qos { | 
|  | __le16 cw_min; | 
|  | __le16 cw_max; | 
|  | u8 aifsn; | 
|  | u8 fifos_mask; | 
|  | __le16 edca_txop; | 
|  | } __packed; /* AC_QOS_API_S_VER_2 */ | 
|  |  | 
|  | /** | 
|  | * struct iwl_mac_ctx_cmd - command structure to configure MAC contexts | 
|  | * ( MAC_CONTEXT_CMD = 0x28 ) | 
|  | * @id_and_color: ID and color of the MAC | 
|  | * @action: action to perform, one of FW_CTXT_ACTION_* | 
|  | * @mac_type: one of &enum iwl_mac_types | 
|  | * @tsf_id: TSF HW timer, one of &enum iwl_tsf_id | 
|  | * @node_addr: MAC address | 
|  | * @reserved_for_node_addr: reserved | 
|  | * @bssid_addr: BSSID | 
|  | * @reserved_for_bssid_addr: reserved | 
|  | * @cck_rates: basic rates available for CCK | 
|  | * @ofdm_rates: basic rates available for OFDM | 
|  | * @protection_flags: combination of &enum iwl_mac_protection_flags | 
|  | * @cck_short_preamble: 0x20 for enabling short preamble, 0 otherwise | 
|  | * @short_slot: 0x10 for enabling short slots, 0 otherwise | 
|  | * @filter_flags: combination of &enum iwl_mac_filter_flags | 
|  | * @qos_flags: from &enum iwl_mac_qos_flags | 
|  | * @ac: one iwl_mac_qos configuration for each AC | 
|  | */ | 
|  | struct iwl_mac_ctx_cmd { | 
|  | /* COMMON_INDEX_HDR_API_S_VER_1 */ | 
|  | __le32 id_and_color; | 
|  | __le32 action; | 
|  | /* MAC_CONTEXT_COMMON_DATA_API_S_VER_1 */ | 
|  | __le32 mac_type; | 
|  | __le32 tsf_id; | 
|  | u8 node_addr[6]; | 
|  | __le16 reserved_for_node_addr; | 
|  | u8 bssid_addr[6]; | 
|  | __le16 reserved_for_bssid_addr; | 
|  | __le32 cck_rates; | 
|  | __le32 ofdm_rates; | 
|  | __le32 protection_flags; | 
|  | __le32 cck_short_preamble; | 
|  | __le32 short_slot; | 
|  | __le32 filter_flags; | 
|  | /* MAC_QOS_PARAM_API_S_VER_1 */ | 
|  | __le32 qos_flags; | 
|  | struct iwl_ac_qos ac[AC_NUM+1]; | 
|  | /* MAC_CONTEXT_COMMON_DATA_API_S */ | 
|  | union { | 
|  | struct iwl_mac_data_ap ap; | 
|  | struct iwl_mac_data_go go; | 
|  | struct iwl_mac_data_sta sta; | 
|  | struct iwl_mac_data_p2p_sta p2p_sta; | 
|  | struct iwl_mac_data_p2p_dev p2p_dev; | 
|  | struct iwl_mac_data_pibss pibss; | 
|  | struct iwl_mac_data_ibss ibss; | 
|  | }; | 
|  | } __packed; /* MAC_CONTEXT_CMD_API_S_VER_1 */ | 
|  |  | 
|  | static inline u32 iwl_mvm_reciprocal(u32 v) | 
|  | { | 
|  | if (!v) | 
|  | return 0; | 
|  | return 0xFFFFFFFF / v; | 
|  | } | 
|  |  | 
|  | #define IWL_NONQOS_SEQ_GET	0x1 | 
|  | #define IWL_NONQOS_SEQ_SET	0x2 | 
|  | struct iwl_nonqos_seq_query_cmd { | 
|  | __le32 get_set_flag; | 
|  | __le32 mac_id_n_color; | 
|  | __le16 value; | 
|  | __le16 reserved; | 
|  | } __packed; /* NON_QOS_TX_COUNTER_GET_SET_API_S_VER_1 */ | 
|  |  | 
|  | #endif /* __fw_api_mac_h__ */ |