1a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg/****************************************************************************** 2a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 3a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * This file is provided under a dual BSD/GPLv2 license. When using or 4a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * redistributing this file, you may do so under either license. 5a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 6a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * GPL LICENSE SUMMARY 7a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 8901069c71415a76d731857ccda814e18ded062f7Wey-Yi Guy * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 9a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 10a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * This program is free software; you can redistribute it and/or modify 11a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * it under the terms of version 2 of the GNU General Public License as 12a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * published by the Free Software Foundation. 13a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 14a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * This program is distributed in the hope that it will be useful, but 15a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * WITHOUT ANY WARRANTY; without even the implied warranty of 16a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * General Public License for more details. 18a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 19a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * You should have received a copy of the GNU General Public License 20a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * along with this program; if not, write to the Free Software 21a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, 22a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * USA 23a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 24a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * The full GNU General Public License is included in this distribution 25a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * in the file called LICENSE.GPL. 26a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 27a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * Contact Information: 28a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * Intel Linux Wireless <ilw@linux.intel.com> 29a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 30a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 31a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * BSD LICENSE 32a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 33901069c71415a76d731857ccda814e18ded062f7Wey-Yi Guy * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved. 34a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * All rights reserved. 35a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 36a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * Redistribution and use in source and binary forms, with or without 37a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * modification, are permitted provided that the following conditions 38a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * are met: 39a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 40a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * * Redistributions of source code must retain the above copyright 41a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * notice, this list of conditions and the following disclaimer. 42a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * * Redistributions in binary form must reproduce the above copyright 43a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * notice, this list of conditions and the following disclaimer in 44a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * the documentation and/or other materials provided with the 45a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * distribution. 46a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * * Neither the name Intel Corporation nor the names of its 47a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * contributors may be used to endorse or promote products derived 48a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * from this software without specific prior written permission. 49a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * 50a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 51a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 52a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 53a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 54a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 55a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 56a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 57a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 58a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 59a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 60a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 61a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg *****************************************************************************/ 62a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg 63a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg#ifndef __iwl_agn_h__ 64a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg#define __iwl_agn_h__ 65a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg 66a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg#include "iwl-dev.h" 67a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg 687335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guystruct iwlagn_ucode_capabilities { 697335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy u32 max_probe_length; 707335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy u32 standard_phy_calibration_size; 717335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy u32 flags; 727335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy}; 737335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy 74dc21b5453249e7e9b8878fab356fd60b731cf04dJohannes Bergextern struct ieee80211_ops iwlagn_hw_ops; 75dc21b5453249e7e9b8878fab356fd60b731cf04dJohannes Berg 766bb7884758965ad0afd67801f0f41cefd53d0b0cEmmanuel Grumbachint iwl_reset_ict(struct iwl_trans *trans); 77a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg 781f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guystatic inline void iwl_set_calib_hdr(struct iwl_calib_hdr *hdr, u8 cmd) 791f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy{ 801f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy hdr->op_code = cmd; 811f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy hdr->first_group = 0; 821f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy hdr->groups_num = 1; 831f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy hdr->data_valid = 1; 841f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy} 851f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy 867335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guyvoid __iwl_down(struct iwl_priv *priv); 877335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guyvoid iwl_down(struct iwl_priv *priv); 887335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guyvoid iwlagn_prepare_restart(struct iwl_priv *priv); 897335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy 907335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy/* MAC80211 */ 917335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guystruct ieee80211_hw *iwl_alloc_all(void); 927335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guyint iwlagn_mac_setup_register(struct iwl_priv *priv, 937335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy struct iwlagn_ucode_capabilities *capa); 9409af14030d77d5f43229adabdd3c84c63f3499aaDon Fryvoid iwlagn_mac_unregister(struct iwl_priv *priv); 957335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy 967314c2b377afaf367f2966bd9ea67bf83350e29bJohannes Berg/* RXON */ 97e505c433d35900d98870a2e266759166a03030dcWey-Yi Guyint iwlagn_set_pan_params(struct iwl_priv *priv); 987314c2b377afaf367f2966bd9ea67bf83350e29bJohannes Bergint iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx); 995de33068a2f841536ca8632534e3e193d5b2607fJohannes Bergvoid iwlagn_set_rxon_chain(struct iwl_priv *priv, struct iwl_rxon_context *ctx); 1002295c66b68ae160dde2e6e2dc4f3061105153bfcJohannes Bergint iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed); 1012295c66b68ae160dde2e6e2dc4f3061105153bfcJohannes Bergvoid iwlagn_bss_info_changed(struct ieee80211_hw *hw, 1022295c66b68ae160dde2e6e2dc4f3061105153bfcJohannes Berg struct ieee80211_vif *vif, 1032295c66b68ae160dde2e6e2dc4f3061105153bfcJohannes Berg struct ieee80211_bss_conf *bss_conf, 1042295c66b68ae160dde2e6e2dc4f3061105153bfcJohannes Berg u32 changes); 105137ce797e24855b738ef98411acbf88c6d918f27Wey-Yi Guyvoid iwlagn_config_ht40(struct ieee80211_conf *conf, 106137ce797e24855b738ef98411acbf88c6d918f27Wey-Yi Guy struct iwl_rxon_context *ctx); 1077314c2b377afaf367f2966bd9ea67bf83350e29bJohannes Berg 108741a626627e42812afd957f875c34c89be8a103eWey-Yi Guy/* uCode */ 109247c61d625154e18a105d663281c52376a882762Emmanuel Grumbachint iwlagn_rx_calib_result(struct iwl_priv *priv, 110247c61d625154e18a105d663281c52376a882762Emmanuel Grumbach struct iwl_rx_mem_buffer *rxb, 111247c61d625154e18a105d663281c52376a882762Emmanuel Grumbach struct iwl_device_cmd *cmd); 112741a626627e42812afd957f875c34c89be8a103eWey-Yi Guy 113e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guy/* lib */ 114e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guyint iwlagn_send_tx_power(struct iwl_priv *priv); 115e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guyvoid iwlagn_temperature(struct iwl_priv *priv); 116ab36eab24e7847d6d92872c55b46554c8ac4c4b3Don Fryu16 iwl_eeprom_calib_version(struct iwl_shared *shrd); 117716c74b00717ad9caedb4a46059fb64a3da99808Wey-Yi Guyint iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control); 1186555063666fea1fc81a14396aca53ab021ccb4f2Wey-Yi Guyvoid iwlagn_dev_txfifo_flush(struct iwl_priv *priv, u16 flush_control); 119e505c433d35900d98870a2e266759166a03030dcWey-Yi Guyint iwlagn_send_beacon_cmd(struct iwl_priv *priv); 120023ca58f1d025d9c210f8003ca47d6b96cdac167Wey-Yi Guy#ifdef CONFIG_PM_SLEEP 121023ca58f1d025d9c210f8003ca47d6b96cdac167Wey-Yi Guyint iwlagn_send_patterns(struct iwl_priv *priv, 122023ca58f1d025d9c210f8003ca47d6b96cdac167Wey-Yi Guy struct cfg80211_wowlan *wowlan); 123023ca58f1d025d9c210f8003ca47d6b96cdac167Wey-Yi Guyint iwlagn_suspend(struct iwl_priv *priv, 124023ca58f1d025d9c210f8003ca47d6b96cdac167Wey-Yi Guy struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan); 125023ca58f1d025d9c210f8003ca47d6b96cdac167Wey-Yi Guy#endif 12674bcdb33e99f49ef5202dd2f8109945b4570edc2Wey-Yi Guy 12754b81550dd674466fe7d01629d2aab015c545a1eWey-Yi Guy/* rx */ 1288d801080dd8d28bf7d85cacba131f18b7653ee49Wey-Yi Guyint iwlagn_hwrate_to_mac80211_idx(u32 rate_n_flags, enum ieee80211_band band); 129466a19a003f3b45a755bc85f967c21da947f9a00Stanislaw Gruszkavoid iwl_setup_rx_handlers(struct iwl_priv *priv); 1301ab9f6c11b003d086ae4890ea202cc3c66f5a17aEmmanuel Grumbach 13154b81550dd674466fe7d01629d2aab015c545a1eWey-Yi Guy 13274bcdb33e99f49ef5202dd2f8109945b4570edc2Wey-Yi Guy/* tx */ 13374bcdb33e99f49ef5202dd2f8109945b4570edc2Wey-Yi Guyint iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb); 134832f47e333c7d0db632b57e9f07956ae40dd481dJohannes Bergint iwlagn_tx_agg_start(struct iwl_priv *priv, struct ieee80211_vif *vif, 135619753ff57a2e15b58546b856536928d1a3daef9Johannes Berg struct ieee80211_sta *sta, u16 tid, u16 *ssn); 136822e8b2a2d708f99daf1ae4cd9b9e4c9d84069c6Emmanuel Grumbachint iwlagn_tx_agg_oper(struct iwl_priv *priv, struct ieee80211_vif *vif, 137822e8b2a2d708f99daf1ae4cd9b9e4c9d84069c6Emmanuel Grumbach struct ieee80211_sta *sta, u16 tid, u8 buf_size); 138832f47e333c7d0db632b57e9f07956ae40dd481dJohannes Bergint iwlagn_tx_agg_stop(struct iwl_priv *priv, struct ieee80211_vif *vif, 139619753ff57a2e15b58546b856536928d1a3daef9Johannes Berg struct ieee80211_sta *sta, u16 tid); 140247c61d625154e18a105d663281c52376a882762Emmanuel Grumbachint iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv, 141247c61d625154e18a105d663281c52376a882762Emmanuel Grumbach struct iwl_rx_mem_buffer *rxb, 142247c61d625154e18a105d663281c52376a882762Emmanuel Grumbach struct iwl_device_cmd *cmd); 143247c61d625154e18a105d663281c52376a882762Emmanuel Grumbachint iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb, 144247c61d625154e18a105d663281c52376a882762Emmanuel Grumbach struct iwl_device_cmd *cmd); 145e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guy 14604569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guystatic inline u32 iwl_tx_status_to_mac80211(u32 status) 14704569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy{ 14804569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy status &= TX_STATUS_MSK; 14904569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy 15004569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy switch (status) { 15104569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy case TX_STATUS_SUCCESS: 15204569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy case TX_STATUS_DIRECT_DONE: 15304569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy return IEEE80211_TX_STAT_ACK; 15404569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy case TX_STATUS_FAIL_DEST_PS: 15568b993118f715cc631b62b6a50574e4701fe9aceGaren Tamrazian case TX_STATUS_FAIL_PASSIVE_NO_RX: 15604569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy return IEEE80211_TX_STAT_TX_FILTERED; 15704569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy default: 15804569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy return 0; 15904569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy } 16004569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy} 16104569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy 16204569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guystatic inline bool iwl_is_tx_success(u32 status) 16304569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy{ 16404569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy status &= TX_STATUS_MSK; 16504569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy return (status == TX_STATUS_SUCCESS) || 16604569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy (status == TX_STATUS_DIRECT_DONE); 16704569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy} 16804569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy 169facd982e8246ed25a049d270a71513fb11b901ecJohannes Bergu8 iwl_toggle_tx_ant(struct iwl_priv *priv, u8 ant_idx, u8 valid); 170facd982e8246ed25a049d270a71513fb11b901ecJohannes Berg 171b6e4c55aaee4fd40526a6816e60c68dd62e565c4Johannes Berg/* scan */ 172a77029ee3fc03a37238b73892e55b789273991aaJohannes Bergvoid iwlagn_post_scan(struct iwl_priv *priv); 173c6baf7fb40cb141c4b510372f7dac829621ccf3fJohannes Bergvoid iwlagn_disable_roc(struct iwl_priv *priv); 174b6e4c55aaee4fd40526a6816e60c68dd62e565c4Johannes Berg 175b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guy/* bt coex */ 176b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guyvoid iwlagn_send_advance_bt_config(struct iwl_priv *priv); 177247c61d625154e18a105d663281c52376a882762Emmanuel Grumbachint iwlagn_bt_coex_profile_notif(struct iwl_priv *priv, 178247c61d625154e18a105d663281c52376a882762Emmanuel Grumbach struct iwl_rx_mem_buffer *rxb, 179247c61d625154e18a105d663281c52376a882762Emmanuel Grumbach struct iwl_device_cmd *cmd); 180b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guyvoid iwlagn_bt_rx_handler_setup(struct iwl_priv *priv); 181b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guyvoid iwlagn_bt_setup_deferred_work(struct iwl_priv *priv); 182b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guyvoid iwlagn_bt_cancel_deferred_work(struct iwl_priv *priv); 183207ecc5eab908843449c167f7264a35d7d5d5e0bMeenakshi Venkataramanvoid iwlagn_bt_coex_rssi_monitor(struct iwl_priv *priv); 184207ecc5eab908843449c167f7264a35d7d5d5e0bMeenakshi Venkataramanvoid iwlagn_bt_adjust_rssi_monitor(struct iwl_priv *priv, bool rssi_ena); 185b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guy 18695b49ed013c9a8856ce768d8d4a62acfc410f73dWey-Yi Guy#ifdef CONFIG_IWLWIFI_DEBUG 18769fdb710b29d096bc50123f7c97891e31ffe45f9Johannes Bergconst char *iwl_get_tx_fail_reason(u32 status); 18895b49ed013c9a8856ce768d8d4a62acfc410f73dWey-Yi Guyconst char *iwl_get_agg_tx_fail_reason(u16 status); 18995b49ed013c9a8856ce768d8d4a62acfc410f73dWey-Yi Guy#else 19069fdb710b29d096bc50123f7c97891e31ffe45f9Johannes Bergstatic inline const char *iwl_get_tx_fail_reason(u32 status) { return ""; } 19195b49ed013c9a8856ce768d8d4a62acfc410f73dWey-Yi Guystatic inline const char *iwl_get_agg_tx_fail_reason(u16 status) { return ""; } 19295b49ed013c9a8856ce768d8d4a62acfc410f73dWey-Yi Guy#endif 193a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg 194c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 195a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg/* station management */ 196c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwlagn_manage_ibss_station(struct iwl_priv *priv, 197c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy struct ieee80211_vif *vif, bool add); 198c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy#define IWL_STA_DRIVER_ACTIVE BIT(0) /* driver entry is active */ 199c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy#define IWL_STA_UCODE_ACTIVE BIT(1) /* ucode entry is active */ 200c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy#define IWL_STA_UCODE_INPROGRESS BIT(2) /* ucode entry is in process of 201c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy being activated */ 202c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy#define IWL_STA_LOCAL BIT(3) /* station state not directed by mac80211; 203c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy (this is for the IBSS BSSID stations) */ 204c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy#define IWL_STA_BCAST BIT(4) /* this station is the special bcast station */ 205c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 206c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 207c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyvoid iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx); 208c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyvoid iwl_clear_ucode_stations(struct iwl_priv *priv, 209c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy struct iwl_rxon_context *ctx); 210c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyvoid iwl_dealloc_bcast_stations(struct iwl_priv *priv); 211c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwl_get_free_ucode_key_offset(struct iwl_priv *priv); 212c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwl_send_add_sta(struct iwl_priv *priv, 213c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy struct iwl_addsta_cmd *sta, u8 flags); 214c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwl_add_station_common(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 215c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy const u8 *addr, bool is_ap, 216c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy struct ieee80211_sta *sta, u8 *sta_id_r); 217c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwl_remove_station(struct iwl_priv *priv, const u8 sta_id, 218c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy const u8 *addr); 219c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyu8 iwl_prep_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 220c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy const u8 *addr, bool is_ap, struct ieee80211_sta *sta); 221c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 222c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyvoid iwl_sta_fill_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 223c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy u8 sta_id, struct iwl_link_quality_cmd *link_cmd); 224c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwl_send_lq_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 225c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy struct iwl_link_quality_cmd *lq, u8 flags, bool init); 226c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyvoid iwl_reprogram_ap_sta(struct iwl_priv *priv, struct iwl_rxon_context *ctx); 227c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwl_add_sta_callback(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb, 228c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy struct iwl_device_cmd *cmd); 229c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 230c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 231c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy/** 232c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * iwl_clear_driver_stations - clear knowledge of all stations from driver 233c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * @priv: iwl priv struct 234c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * 235c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * This is called during iwl_down() to make sure that in the case 236c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * we're coming there from a hardware restart mac80211 will be 237c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * able to reconfigure stations -- if we're getting there in the 238c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * normal down flow then the stations will already be cleared. 239c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy */ 240c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guystatic inline void iwl_clear_driver_stations(struct iwl_priv *priv) 241c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy{ 242c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy unsigned long flags; 243c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy struct iwl_rxon_context *ctx; 244c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 245c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy spin_lock_irqsave(&priv->shrd->sta_lock, flags); 246c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy memset(priv->stations, 0, sizeof(priv->stations)); 247c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy priv->num_stations = 0; 248c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 249c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy priv->ucode_key_table = 0; 250c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 251c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy for_each_context(priv, ctx) { 252c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy /* 253c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * Remove all key information that is not stored as part 254c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * of station information since mac80211 may not have had 255c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * a chance to remove all the keys. When device is 256c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * reconfigured by mac80211 after an error all keys will 257c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * be reconfigured. 258c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy */ 259c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy memset(ctx->wep_keys, 0, sizeof(ctx->wep_keys)); 260c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy ctx->key_mapping_keys = 0; 261c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy } 262c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 263c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy spin_unlock_irqrestore(&priv->shrd->sta_lock, flags); 264c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy} 265c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 266c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guystatic inline int iwl_sta_id(struct ieee80211_sta *sta) 267c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy{ 268c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy if (WARN_ON(!sta)) 269c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy return IWL_INVALID_STATION; 270c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 271c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy return ((struct iwl_station_priv *)sta->drv_priv)->sta_id; 272c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy} 273c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 274c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy/** 275c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * iwl_sta_id_or_broadcast - return sta_id or broadcast sta 276c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * @priv: iwl priv 277c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * @context: the current context 278c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * @sta: mac80211 station 279c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * 280c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * In certain circumstances mac80211 passes a station pointer 281c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * that may be %NULL, for example during TX or key setup. In 282c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * that case, we need to use the broadcast station, so this 283c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * inline wraps that pattern. 284c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy */ 285c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guystatic inline int iwl_sta_id_or_broadcast(struct iwl_priv *priv, 286c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy struct iwl_rxon_context *context, 287c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy struct ieee80211_sta *sta) 288c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy{ 289c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy int sta_id; 290c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 291c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy if (!sta) 292c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy return context->bcast_sta_id; 293c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 294c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy sta_id = iwl_sta_id(sta); 295c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 296c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy /* 297c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * mac80211 should not be passing a partially 298c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy * initialised station! 299c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy */ 300c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy WARN_ON(sta_id == IWL_INVALID_STATION); 301c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 302c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy return sta_id; 303c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy} 304c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy 305a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwlagn_alloc_bcast_station(struct iwl_priv *priv, 306a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg struct iwl_rxon_context *ctx); 307a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwlagn_add_bssid_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 308a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg const u8 *addr, u8 *sta_id_r); 309a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_remove_default_wep_key(struct iwl_priv *priv, 310a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg struct iwl_rxon_context *ctx, 311a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg struct ieee80211_key_conf *key); 312a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_set_default_wep_key(struct iwl_priv *priv, 313a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg struct iwl_rxon_context *ctx, 314a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg struct ieee80211_key_conf *key); 315a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_restore_default_wep_keys(struct iwl_priv *priv, 316a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg struct iwl_rxon_context *ctx); 317a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_set_dynamic_key(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 3185a3d9882b84edf5fa8e8ca33a5d6df25e2e727a5Johannes Berg struct ieee80211_key_conf *key, 3195a3d9882b84edf5fa8e8ca33a5d6df25e2e727a5Johannes Berg struct ieee80211_sta *sta); 320a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_remove_dynamic_key(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 3215a3d9882b84edf5fa8e8ca33a5d6df25e2e727a5Johannes Berg struct ieee80211_key_conf *key, 3225a3d9882b84edf5fa8e8ca33a5d6df25e2e727a5Johannes Berg struct ieee80211_sta *sta); 323a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergvoid iwl_update_tkip_key(struct iwl_priv *priv, 3245a3d9882b84edf5fa8e8ca33a5d6df25e2e727a5Johannes Berg struct ieee80211_vif *vif, 325a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg struct ieee80211_key_conf *keyconf, 326a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg struct ieee80211_sta *sta, u32 iv32, u16 *phase1key); 327a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid); 328a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta, 329a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg int tid, u16 ssn); 330a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta, 331a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg int tid); 332a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergvoid iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt); 333f775aa06d2de583bd291d4bf5814784c9ff7b9ccJohannes Bergint iwl_update_bcast_station(struct iwl_priv *priv, 334f775aa06d2de583bd291d4bf5814784c9ff7b9ccJohannes Berg struct iwl_rxon_context *ctx); 335a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_update_bcast_stations(struct iwl_priv *priv); 336a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg 3370de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg/* rate */ 3380de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Bergstatic inline u32 iwl_ant_idx_to_flags(u8 ant_idx) 3390de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg{ 3400de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg return BIT(ant_idx) << RATE_MCS_ANT_POS; 3410de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg} 3420de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg 3430de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Bergstatic inline u8 iwl_hw_get_rate(__le32 rate_n_flags) 3440de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg{ 3452520546aecc969372080448a2422b39eedb2a528Daniel Halperin return le32_to_cpu(rate_n_flags) & RATE_MCS_RATE_MSK; 3460de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg} 3470de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg 3480de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Bergstatic inline __le32 iwl_hw_set_rate_n_flags(u8 rate, u32 flags) 3490de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg{ 3500de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg return cpu_to_le32(flags|(u32)rate); 3510de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg} 3520de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg 3533be63ff0ae196b371728ba8fc8aca12eafcae218Wey-Yi Guy/* eeprom */ 354b39488a9bd00c520e46682bf75ba484aadc82af7Wey-Yi Guyvoid iwl_eeprom_enhanced_txpower(struct iwl_priv *priv); 355ab36eab24e7847d6d92872c55b46554c8ac4c4b3Don Fryvoid iwl_eeprom_get_mac(const struct iwl_shared *shrd, u8 *mac); 3563be63ff0ae196b371728ba8fc8aca12eafcae218Wey-Yi Guy 3574613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kaoextern int iwl_alive_start(struct iwl_priv *priv); 3584613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao/* svtool */ 3595ef15ccc648638a2cf00b3a13caa770559aa4e91Wey-Yi Guy#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE 360ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guyextern int iwlagn_mac_testmode_cmd(struct ieee80211_hw *hw, void *data, 361ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guy int len); 362ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guyextern int iwlagn_mac_testmode_dump(struct ieee80211_hw *hw, 363ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guy struct sk_buff *skb, 364ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guy struct netlink_callback *cb, 365ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guy void *data, int len); 3664613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kaoextern void iwl_testmode_init(struct iwl_priv *priv); 3677a4e5281d1b3335a3dc90841415390473cccebf3Wey-Yi Guyextern void iwl_testmode_cleanup(struct iwl_priv *priv); 3684613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao#else 3694613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kaostatic inline 370ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guyint iwlagn_mac_testmode_cmd(struct ieee80211_hw *hw, void *data, int len) 3714613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao{ 3724613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao return -ENOSYS; 3734613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao} 3744613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kaostatic inline 375ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guyint iwlagn_mac_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb, 376eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guy struct netlink_callback *cb, 377eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guy void *data, int len) 378eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guy{ 379eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guy return -ENOSYS; 380eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guy} 381eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guystatic inline 3824613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kaovoid iwl_testmode_init(struct iwl_priv *priv) 3834613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao{ 3844613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao} 3857a4e5281d1b3335a3dc90841415390473cccebf3Wey-Yi Guystatic inline 3867a4e5281d1b3335a3dc90841415390473cccebf3Wey-Yi Guyvoid iwl_testmode_cleanup(struct iwl_priv *priv) 3877a4e5281d1b3335a3dc90841415390473cccebf3Wey-Yi Guy{ 3887a4e5281d1b3335a3dc90841415390473cccebf3Wey-Yi Guy} 3894613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao#endif 3907194207ceea7a54c846e0865d2459f4887fe1e0dJohannes Berg 391a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg#endif /* __iwl_agn_h__ */ 392