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 *
84e3182626a914443a5e0fbe014813f03e51a75dfWey-Yi Guy * Copyright(c) 2008 - 2012 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 *
334e3182626a914443a5e0fbe014813f03e51a75dfWey-Yi Guy * Copyright(c) 2005 - 2012 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
684a986777a53d5fe8fd92ef30e0e8eedd0ff800b1Don Frystruct iwl_ucode_capabilities;
697335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy
70dc21b5453249e7e9b8878fab356fd60b731cf04dJohannes Bergextern struct ieee80211_ops iwlagn_hw_ops;
71dc21b5453249e7e9b8878fab356fd60b731cf04dJohannes Berg
721f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guystatic inline void iwl_set_calib_hdr(struct iwl_calib_hdr *hdr, u8 cmd)
731f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy{
741f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy	hdr->op_code = cmd;
751f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy	hdr->first_group = 0;
761f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy	hdr->groups_num = 1;
771f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy	hdr->data_valid = 1;
781f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy}
791f8bf0396ae7e63648b210fd197b1a5ab0db51bfWey-Yi Guy
807335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guyvoid iwl_down(struct iwl_priv *priv);
8178e5a464320338a90b0367ab9cc58029393a9824Emmanuel Grumbachvoid iwl_cancel_deferred_work(struct iwl_priv *priv);
827335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guyvoid iwlagn_prepare_restart(struct iwl_priv *priv);
83ed277c9361e423df2bc19312c60b9d06cac31ee6Emmanuel Grumbachvoid iwl_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb);
84db70f290e1a88f11815e50acd8ac1c36f89b0da2Emmanuel Grumbachint __must_check iwl_rx_dispatch(struct iwl_op_mode *op_mode,
8548a2d66f58d2bf1818acf5ff7ed9897a9977a96eJohannes Berg				 struct iwl_rx_cmd_buffer *rxb,
86db70f290e1a88f11815e50acd8ac1c36f89b0da2Emmanuel Grumbach				 struct iwl_device_cmd *cmd);
877120d9894c363ee31fd529e5dd962452b639ab8eEmmanuel Grumbachvoid iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state);
88bcb9321c8db86150004d615e03551911be84685eEmmanuel Grumbachvoid iwl_nic_error(struct iwl_op_mode *op_mode);
897335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy
900e781842cb25ed3a9d0a91bdf05c0717150c9343Johannes Bergbool iwl_check_for_ct_kill(struct iwl_priv *priv);
910e781842cb25ed3a9d0a91bdf05c0717150c9343Johannes Berg
92e755f882b7e72c48da820acc24196532977cfd07Johannes Bergvoid iwlagn_lift_passive_no_rx(struct iwl_priv *priv);
93e755f882b7e72c48da820acc24196532977cfd07Johannes Berg
947335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy/* MAC80211 */
957335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guystruct ieee80211_hw *iwl_alloc_all(void);
967335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guyint iwlagn_mac_setup_register(struct iwl_priv *priv,
970692fe41b36159be5d8c7d4eef0699e79c383c85Johannes Berg			      const struct iwl_ucode_capabilities *capa);
9809af14030d77d5f43229adabdd3c84c63f3499aaDon Fryvoid iwlagn_mac_unregister(struct iwl_priv *priv);
997335613ae27ae148fde720caccbfbbd9afa7465dWey-Yi Guy
100e10a0533a9172471b52bd9512838d766420a3bafJohannes Berg/* commands */
101e10a0533a9172471b52bd9512838d766420a3bafJohannes Bergint iwl_dvm_send_cmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd);
102e10a0533a9172471b52bd9512838d766420a3bafJohannes Bergint iwl_dvm_send_cmd_pdu(struct iwl_priv *priv, u8 id,
103e10a0533a9172471b52bd9512838d766420a3bafJohannes Berg			 u32 flags, u16 len, const void *data);
104e10a0533a9172471b52bd9512838d766420a3bafJohannes Berg
1057314c2b377afaf367f2966bd9ea67bf83350e29bJohannes Berg/* RXON */
106e505c433d35900d98870a2e266759166a03030dcWey-Yi Guyint iwlagn_set_pan_params(struct iwl_priv *priv);
1077314c2b377afaf367f2966bd9ea67bf83350e29bJohannes Bergint iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
1085de33068a2f841536ca8632534e3e193d5b2607fJohannes Bergvoid iwlagn_set_rxon_chain(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
1092295c66b68ae160dde2e6e2dc4f3061105153bfcJohannes Bergint iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed);
1102295c66b68ae160dde2e6e2dc4f3061105153bfcJohannes Bergvoid iwlagn_bss_info_changed(struct ieee80211_hw *hw,
1112295c66b68ae160dde2e6e2dc4f3061105153bfcJohannes Berg			     struct ieee80211_vif *vif,
1122295c66b68ae160dde2e6e2dc4f3061105153bfcJohannes Berg			     struct ieee80211_bss_conf *bss_conf,
1132295c66b68ae160dde2e6e2dc4f3061105153bfcJohannes Berg			     u32 changes);
114137ce797e24855b738ef98411acbf88c6d918f27Wey-Yi Guyvoid iwlagn_config_ht40(struct ieee80211_conf *conf,
115137ce797e24855b738ef98411acbf88c6d918f27Wey-Yi Guy			struct iwl_rxon_context *ctx);
1167314c2b377afaf367f2966bd9ea67bf83350e29bJohannes Berg
117741a626627e42812afd957f875c34c89be8a103eWey-Yi Guy/* uCode */
118247c61d625154e18a105d663281c52376a882762Emmanuel Grumbachint iwlagn_rx_calib_result(struct iwl_priv *priv,
11948a2d66f58d2bf1818acf5ff7ed9897a9977a96eJohannes Berg			    struct iwl_rx_cmd_buffer *rxb,
120247c61d625154e18a105d663281c52376a882762Emmanuel Grumbach			    struct iwl_device_cmd *cmd);
121e19918855dc4822a24787a6d0048205b011e5ecbJohannes Bergint iwl_send_bt_env(struct iwl_priv *priv, u8 action, u8 type);
122e19918855dc4822a24787a6d0048205b011e5ecbJohannes Bergvoid iwl_send_prio_tbl(struct iwl_priv *priv);
123e19918855dc4822a24787a6d0048205b011e5ecbJohannes Bergint iwl_init_alive_start(struct iwl_priv *priv);
124e19918855dc4822a24787a6d0048205b011e5ecbJohannes Bergint iwl_run_init_ucode(struct iwl_priv *priv);
125e19918855dc4822a24787a6d0048205b011e5ecbJohannes Bergint iwl_load_ucode_wait_alive(struct iwl_priv *priv,
126e19918855dc4822a24787a6d0048205b011e5ecbJohannes Berg			      enum iwl_ucode_type ucode_type);
127e19918855dc4822a24787a6d0048205b011e5ecbJohannes Bergint iwl_send_calib_results(struct iwl_priv *priv);
128e19918855dc4822a24787a6d0048205b011e5ecbJohannes Bergint iwl_calib_set(struct iwl_priv *priv,
129e19918855dc4822a24787a6d0048205b011e5ecbJohannes Berg		  const struct iwl_calib_hdr *cmd, int len);
130e19918855dc4822a24787a6d0048205b011e5ecbJohannes Bergvoid iwl_calib_free_results(struct iwl_priv *priv);
131741a626627e42812afd957f875c34c89be8a103eWey-Yi Guy
132e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guy/* lib */
133e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guyint iwlagn_send_tx_power(struct iwl_priv *priv);
134e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guyvoid iwlagn_temperature(struct iwl_priv *priv);
135ab36eab24e7847d6d92872c55b46554c8ac4c4b3Don Fryu16 iwl_eeprom_calib_version(struct iwl_shared *shrd);
136716c74b00717ad9caedb4a46059fb64a3da99808Wey-Yi Guyint iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control);
1376555063666fea1fc81a14396aca53ab021ccb4f2Wey-Yi Guyvoid iwlagn_dev_txfifo_flush(struct iwl_priv *priv, u16 flush_control);
138e505c433d35900d98870a2e266759166a03030dcWey-Yi Guyint iwlagn_send_beacon_cmd(struct iwl_priv *priv);
139023ca58f1d025d9c210f8003ca47d6b96cdac167Wey-Yi Guy#ifdef CONFIG_PM_SLEEP
140023ca58f1d025d9c210f8003ca47d6b96cdac167Wey-Yi Guyint iwlagn_send_patterns(struct iwl_priv *priv,
141023ca58f1d025d9c210f8003ca47d6b96cdac167Wey-Yi Guy			 struct cfg80211_wowlan *wowlan);
142ea886a6014024d027fa207b8765e46d746cd2a18Johannes Bergint iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan);
143023ca58f1d025d9c210f8003ca47d6b96cdac167Wey-Yi Guy#endif
14474bcdb33e99f49ef5202dd2f8109945b4570edc2Wey-Yi Guy
14554b81550dd674466fe7d01629d2aab015c545a1eWey-Yi Guy/* rx */
1468d801080dd8d28bf7d85cacba131f18b7653ee49Wey-Yi Guyint iwlagn_hwrate_to_mac80211_idx(u32 rate_n_flags, enum ieee80211_band band);
147466a19a003f3b45a755bc85f967c21da947f9a00Stanislaw Gruszkavoid iwl_setup_rx_handlers(struct iwl_priv *priv);
1481ab9f6c11b003d086ae4890ea202cc3c66f5a17aEmmanuel Grumbach
14954b81550dd674466fe7d01629d2aab015c545a1eWey-Yi Guy
15074bcdb33e99f49ef5202dd2f8109945b4570edc2Wey-Yi Guy/* tx */
15174bcdb33e99f49ef5202dd2f8109945b4570edc2Wey-Yi Guyint iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb);
152832f47e333c7d0db632b57e9f07956ae40dd481dJohannes Bergint iwlagn_tx_agg_start(struct iwl_priv *priv, struct ieee80211_vif *vif,
153619753ff57a2e15b58546b856536928d1a3daef9Johannes Berg			struct ieee80211_sta *sta, u16 tid, u16 *ssn);
154822e8b2a2d708f99daf1ae4cd9b9e4c9d84069c6Emmanuel Grumbachint iwlagn_tx_agg_oper(struct iwl_priv *priv, struct ieee80211_vif *vif,
155822e8b2a2d708f99daf1ae4cd9b9e4c9d84069c6Emmanuel Grumbach			struct ieee80211_sta *sta, u16 tid, u8 buf_size);
156832f47e333c7d0db632b57e9f07956ae40dd481dJohannes Bergint iwlagn_tx_agg_stop(struct iwl_priv *priv, struct ieee80211_vif *vif,
157619753ff57a2e15b58546b856536928d1a3daef9Johannes Berg		       struct ieee80211_sta *sta, u16 tid);
158247c61d625154e18a105d663281c52376a882762Emmanuel Grumbachint iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
15948a2d66f58d2bf1818acf5ff7ed9897a9977a96eJohannes Berg				   struct iwl_rx_cmd_buffer *rxb,
160247c61d625154e18a105d663281c52376a882762Emmanuel Grumbach				   struct iwl_device_cmd *cmd);
16148a2d66f58d2bf1818acf5ff7ed9897a9977a96eJohannes Bergint iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
162247c61d625154e18a105d663281c52376a882762Emmanuel Grumbach			       struct iwl_device_cmd *cmd);
163e04ed0a5bb62520345c73587d7ebf51e426642eeWey-Yi Guy
16404569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guystatic inline u32 iwl_tx_status_to_mac80211(u32 status)
16504569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy{
16604569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy	status &= TX_STATUS_MSK;
16704569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy
16804569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy	switch (status) {
16904569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy	case TX_STATUS_SUCCESS:
17004569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy	case TX_STATUS_DIRECT_DONE:
17104569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy		return IEEE80211_TX_STAT_ACK;
17204569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy	case TX_STATUS_FAIL_DEST_PS:
17368b993118f715cc631b62b6a50574e4701fe9aceGaren Tamrazian	case TX_STATUS_FAIL_PASSIVE_NO_RX:
17404569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy		return IEEE80211_TX_STAT_TX_FILTERED;
17504569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy	default:
17604569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy		return 0;
17704569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy	}
17804569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy}
17904569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy
18004569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guystatic inline bool iwl_is_tx_success(u32 status)
18104569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy{
18204569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy	status &= TX_STATUS_MSK;
18304569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy	return (status == TX_STATUS_SUCCESS) ||
18404569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy	       (status == TX_STATUS_DIRECT_DONE);
18504569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy}
18604569cbe7653fe0057acc46afc07f2c2fd2508b3Wey-Yi Guy
187facd982e8246ed25a049d270a71513fb11b901ecJohannes Bergu8 iwl_toggle_tx_ant(struct iwl_priv *priv, u8 ant_idx, u8 valid);
188facd982e8246ed25a049d270a71513fb11b901ecJohannes Berg
189b6e4c55aaee4fd40526a6816e60c68dd62e565c4Johannes Berg/* scan */
190a77029ee3fc03a37238b73892e55b789273991aaJohannes Bergvoid iwlagn_post_scan(struct iwl_priv *priv);
191c6baf7fb40cb141c4b510372f7dac829621ccf3fJohannes Bergvoid iwlagn_disable_roc(struct iwl_priv *priv);
192b6e4c55aaee4fd40526a6816e60c68dd62e565c4Johannes Berg
193b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guy/* bt coex */
194b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guyvoid iwlagn_send_advance_bt_config(struct iwl_priv *priv);
195247c61d625154e18a105d663281c52376a882762Emmanuel Grumbachint iwlagn_bt_coex_profile_notif(struct iwl_priv *priv,
19648a2d66f58d2bf1818acf5ff7ed9897a9977a96eJohannes Berg				  struct iwl_rx_cmd_buffer *rxb,
197247c61d625154e18a105d663281c52376a882762Emmanuel Grumbach				  struct iwl_device_cmd *cmd);
198b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guyvoid iwlagn_bt_rx_handler_setup(struct iwl_priv *priv);
199b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guyvoid iwlagn_bt_setup_deferred_work(struct iwl_priv *priv);
200b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guyvoid iwlagn_bt_cancel_deferred_work(struct iwl_priv *priv);
201207ecc5eab908843449c167f7264a35d7d5d5e0bMeenakshi Venkataramanvoid iwlagn_bt_coex_rssi_monitor(struct iwl_priv *priv);
202207ecc5eab908843449c167f7264a35d7d5d5e0bMeenakshi Venkataramanvoid iwlagn_bt_adjust_rssi_monitor(struct iwl_priv *priv, bool rssi_ena);
203b6e116e8bf7d749b0743c167bd47930c22c77a82Wey-Yi Guy
20495b49ed013c9a8856ce768d8d4a62acfc410f73dWey-Yi Guy#ifdef CONFIG_IWLWIFI_DEBUG
20569fdb710b29d096bc50123f7c97891e31ffe45f9Johannes Bergconst char *iwl_get_tx_fail_reason(u32 status);
20695b49ed013c9a8856ce768d8d4a62acfc410f73dWey-Yi Guyconst char *iwl_get_agg_tx_fail_reason(u16 status);
20795b49ed013c9a8856ce768d8d4a62acfc410f73dWey-Yi Guy#else
20869fdb710b29d096bc50123f7c97891e31ffe45f9Johannes Bergstatic inline const char *iwl_get_tx_fail_reason(u32 status) { return ""; }
20995b49ed013c9a8856ce768d8d4a62acfc410f73dWey-Yi Guystatic inline const char *iwl_get_agg_tx_fail_reason(u16 status) { return ""; }
21095b49ed013c9a8856ce768d8d4a62acfc410f73dWey-Yi Guy#endif
211a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg
212c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy
213a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg/* station management */
214c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwlagn_manage_ibss_station(struct iwl_priv *priv,
215c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy			       struct ieee80211_vif *vif, bool add);
216c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy#define IWL_STA_DRIVER_ACTIVE BIT(0) /* driver entry is active */
217c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy#define IWL_STA_UCODE_ACTIVE  BIT(1) /* ucode entry is active */
218c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy#define IWL_STA_UCODE_INPROGRESS  BIT(2) /* ucode entry is in process of
219c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy					    being activated */
220c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy#define IWL_STA_LOCAL BIT(3) /* station state not directed by mac80211;
221c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy				(this is for the IBSS BSSID stations) */
222c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy#define IWL_STA_BCAST BIT(4) /* this station is the special bcast station */
223c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy
224c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy
225c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyvoid iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
226c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyvoid iwl_clear_ucode_stations(struct iwl_priv *priv,
227c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy			      struct iwl_rxon_context *ctx);
228c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyvoid iwl_dealloc_bcast_stations(struct iwl_priv *priv);
229c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwl_get_free_ucode_key_offset(struct iwl_priv *priv);
230c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwl_send_add_sta(struct iwl_priv *priv,
231c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy		     struct iwl_addsta_cmd *sta, u8 flags);
232c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwl_add_station_common(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
233c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy			   const u8 *addr, bool is_ap,
234c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy			   struct ieee80211_sta *sta, u8 *sta_id_r);
235c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwl_remove_station(struct iwl_priv *priv, const u8 sta_id,
236c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy		       const u8 *addr);
237974205153be8944539890084a170e3ad407164bcJohannes Bergvoid iwl_deactivate_station(struct iwl_priv *priv, const u8 sta_id,
238974205153be8944539890084a170e3ad407164bcJohannes Berg			    const u8 *addr);
239c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyu8 iwl_prep_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
240c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy		    const u8 *addr, bool is_ap, struct ieee80211_sta *sta);
241c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy
242c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyvoid iwl_sta_fill_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
243c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy		     u8 sta_id, struct iwl_link_quality_cmd *link_cmd);
244c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guyint iwl_send_lq_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
245c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy		    struct iwl_link_quality_cmd *lq, u8 flags, bool init);
24648a2d66f58d2bf1818acf5ff7ed9897a9977a96eJohannes Bergint iwl_add_sta_callback(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
247c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy			       struct iwl_device_cmd *cmd);
248ab0bd5b32a9c7ea2e7cc69d56c82a96be340c269Johannes Bergint iwl_sta_update_ht(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
249ab0bd5b32a9c7ea2e7cc69d56c82a96be340c269Johannes Berg		      struct ieee80211_sta *sta);
250c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy
251c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy
252c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guystatic inline int iwl_sta_id(struct ieee80211_sta *sta)
253c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy{
254c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy	if (WARN_ON(!sta))
255c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy		return IWL_INVALID_STATION;
256c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy
257c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy	return ((struct iwl_station_priv *)sta->drv_priv)->sta_id;
258c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy}
259c745f55baf63d08d6e9bb20682102fb8bae8f67aWey-Yi Guy
260a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwlagn_alloc_bcast_station(struct iwl_priv *priv,
261a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg			       struct iwl_rxon_context *ctx);
262a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwlagn_add_bssid_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
263a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg			     const u8 *addr, u8 *sta_id_r);
264a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_remove_default_wep_key(struct iwl_priv *priv,
265a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg			       struct iwl_rxon_context *ctx,
266a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg			       struct ieee80211_key_conf *key);
267a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_set_default_wep_key(struct iwl_priv *priv,
268a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg			    struct iwl_rxon_context *ctx,
269a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg			    struct ieee80211_key_conf *key);
270a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_restore_default_wep_keys(struct iwl_priv *priv,
271a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg				 struct iwl_rxon_context *ctx);
272a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_set_dynamic_key(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
2735a3d9882b84edf5fa8e8ca33a5d6df25e2e727a5Johannes Berg			struct ieee80211_key_conf *key,
2745a3d9882b84edf5fa8e8ca33a5d6df25e2e727a5Johannes Berg			struct ieee80211_sta *sta);
275a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_remove_dynamic_key(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
2765a3d9882b84edf5fa8e8ca33a5d6df25e2e727a5Johannes Berg			   struct ieee80211_key_conf *key,
2775a3d9882b84edf5fa8e8ca33a5d6df25e2e727a5Johannes Berg			   struct ieee80211_sta *sta);
278a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergvoid iwl_update_tkip_key(struct iwl_priv *priv,
2795a3d9882b84edf5fa8e8ca33a5d6df25e2e727a5Johannes Berg			 struct ieee80211_vif *vif,
280a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg			 struct ieee80211_key_conf *keyconf,
281a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg			 struct ieee80211_sta *sta, u32 iv32, u16 *phase1key);
282a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid);
283a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta,
284a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg			 int tid, u16 ssn);
285a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta,
286a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg			int tid);
287a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergvoid iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt);
288f775aa06d2de583bd291d4bf5814784c9ff7b9ccJohannes Bergint iwl_update_bcast_station(struct iwl_priv *priv,
289f775aa06d2de583bd291d4bf5814784c9ff7b9ccJohannes Berg			     struct iwl_rxon_context *ctx);
290a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Bergint iwl_update_bcast_stations(struct iwl_priv *priv);
291a30e3112a8bcb5bc1caa48547e597de3992e1b21Johannes Berg
2920de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg/* rate */
2930de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Bergstatic inline u32 iwl_ant_idx_to_flags(u8 ant_idx)
2940de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg{
2950de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg	return BIT(ant_idx) << RATE_MCS_ANT_POS;
2960de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg}
2970de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg
2980de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Bergstatic inline u8 iwl_hw_get_rate(__le32 rate_n_flags)
2990de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg{
3002520546aecc969372080448a2422b39eedb2a528Daniel Halperin	return le32_to_cpu(rate_n_flags) & RATE_MCS_RATE_MSK;
3010de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg}
3020de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg
3030de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Bergstatic inline __le32 iwl_hw_set_rate_n_flags(u8 rate, u32 flags)
3040de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg{
3050de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg	return cpu_to_le32(flags|(u32)rate);
3060de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg}
3070de76736552cff02cc6ee4bae41e5502d7673f8eJohannes Berg
3083be63ff0ae196b371728ba8fc8aca12eafcae218Wey-Yi Guy/* eeprom */
309ab36eab24e7847d6d92872c55b46554c8ac4c4b3Don Fryvoid iwl_eeprom_get_mac(const struct iwl_shared *shrd, u8 *mac);
3103be63ff0ae196b371728ba8fc8aca12eafcae218Wey-Yi Guy
3114613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kaoextern int iwl_alive_start(struct iwl_priv *priv);
3124613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao/* svtool */
3135ef15ccc648638a2cf00b3a13caa770559aa4e91Wey-Yi Guy#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
314ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guyextern int iwlagn_mac_testmode_cmd(struct ieee80211_hw *hw, void *data,
315ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guy				   int len);
316ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guyextern int iwlagn_mac_testmode_dump(struct ieee80211_hw *hw,
317ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guy				    struct sk_buff *skb,
318ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guy				    struct netlink_callback *cb,
319ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guy				    void *data, int len);
3204613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kaoextern void iwl_testmode_init(struct iwl_priv *priv);
3217a4e5281d1b3335a3dc90841415390473cccebf3Wey-Yi Guyextern void iwl_testmode_cleanup(struct iwl_priv *priv);
3224613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao#else
3234613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kaostatic inline
324ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guyint iwlagn_mac_testmode_cmd(struct ieee80211_hw *hw, void *data, int len)
3254613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao{
3264613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao	return -ENOSYS;
3274613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao}
3284613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kaostatic inline
329ade4c649a0e9e862751fe1c98f43fbee86554c8aWey-Yi Guyint iwlagn_mac_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb,
330eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guy		      struct netlink_callback *cb,
331eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guy		      void *data, int len)
332eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guy{
333eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guy	return -ENOSYS;
334eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guy}
335eb64dca0c9d73e191026ed37d1075f22e48b3f1cWey-Yi Guystatic inline
3364613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kaovoid iwl_testmode_init(struct iwl_priv *priv)
3374613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao{
3384613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao}
3397a4e5281d1b3335a3dc90841415390473cccebf3Wey-Yi Guystatic inline
3407a4e5281d1b3335a3dc90841415390473cccebf3Wey-Yi Guyvoid iwl_testmode_cleanup(struct iwl_priv *priv)
3417a4e5281d1b3335a3dc90841415390473cccebf3Wey-Yi Guy{
3427a4e5281d1b3335a3dc90841415390473cccebf3Wey-Yi Guy}
3434613e72dbdc9a44bfc4625d835511264121c4244Cindy H. Kao#endif
3447194207ceea7a54c846e0865d2459f4887fe1e0dJohannes Berg
3453e6895c50af9a9574a8bb97268d99be049fe46f0Emmanuel Grumbach#ifdef CONFIG_IWLWIFI_DEBUG
3463e6895c50af9a9574a8bb97268d99be049fe46f0Emmanuel Grumbachvoid iwl_print_rx_config_cmd(struct iwl_priv *priv,
3473e6895c50af9a9574a8bb97268d99be049fe46f0Emmanuel Grumbach			     enum iwl_rxon_context_id ctxid);
3483e6895c50af9a9574a8bb97268d99be049fe46f0Emmanuel Grumbach#else
3493e6895c50af9a9574a8bb97268d99be049fe46f0Emmanuel Grumbachstatic inline void iwl_print_rx_config_cmd(struct iwl_priv *priv,
3503e6895c50af9a9574a8bb97268d99be049fe46f0Emmanuel Grumbach					   enum iwl_rxon_context_id ctxid)
3513e6895c50af9a9574a8bb97268d99be049fe46f0Emmanuel Grumbach{
3523e6895c50af9a9574a8bb97268d99be049fe46f0Emmanuel Grumbach}
3533e6895c50af9a9574a8bb97268d99be049fe46f0Emmanuel Grumbach#endif
3543e6895c50af9a9574a8bb97268d99be049fe46f0Emmanuel Grumbach
35584abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg/* status checks */
35684abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg
35783626404a70da74c67f32f119e53c0ba032ba2d8Don Frystatic inline int iwl_is_ready(struct iwl_priv *priv)
35884abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg{
35984abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg	/* The adapter is 'ready' if READY and GEO_CONFIGURED bits are
36084abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg	 * set but EXIT_PENDING is not */
36183626404a70da74c67f32f119e53c0ba032ba2d8Don Fry	return test_bit(STATUS_READY, &priv->status) &&
36283626404a70da74c67f32f119e53c0ba032ba2d8Don Fry	       test_bit(STATUS_GEO_CONFIGURED, &priv->status) &&
36383626404a70da74c67f32f119e53c0ba032ba2d8Don Fry	       !test_bit(STATUS_EXIT_PENDING, &priv->status);
36484abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg}
36584abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg
36683626404a70da74c67f32f119e53c0ba032ba2d8Don Frystatic inline int iwl_is_alive(struct iwl_priv *priv)
36784abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg{
36883626404a70da74c67f32f119e53c0ba032ba2d8Don Fry	return test_bit(STATUS_ALIVE, &priv->status);
36984abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg}
37084abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg
37183626404a70da74c67f32f119e53c0ba032ba2d8Don Frystatic inline int iwl_is_rfkill(struct iwl_priv *priv)
37284abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg{
37383626404a70da74c67f32f119e53c0ba032ba2d8Don Fry	return test_bit(STATUS_RF_KILL_HW, &priv->status);
37484abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg}
37584abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg
3769a716863ae4a2f039bc4d0b2b2bb4b24a1dc7a91Don Frystatic inline int iwl_is_ctkill(struct iwl_priv *priv)
37784abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg{
3789a716863ae4a2f039bc4d0b2b2bb4b24a1dc7a91Don Fry	return test_bit(STATUS_CT_KILL, &priv->status);
37984abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg}
38084abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg
38183626404a70da74c67f32f119e53c0ba032ba2d8Don Frystatic inline int iwl_is_ready_rf(struct iwl_priv *priv)
38284abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg{
38383626404a70da74c67f32f119e53c0ba032ba2d8Don Fry	if (iwl_is_rfkill(priv))
38484abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg		return 0;
38584abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg
38683626404a70da74c67f32f119e53c0ba032ba2d8Don Fry	return iwl_is_ready(priv);
38784abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg}
38884abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg
38984abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg#ifdef CONFIG_IWLWIFI_DEBUG
39084abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg#define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...)	\
39184abd2cc066fc077c424d0faf7618be348a7efb2Johannes Bergdo {									\
39283626404a70da74c67f32f119e53c0ba032ba2d8Don Fry	if (!iwl_is_rfkill((m)))					\
39384abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg		IWL_ERR(m, fmt, ##args);				\
39484abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg	else								\
39584abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg		__iwl_err(trans(m)->dev, true,				\
39684abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg			  !iwl_have_debug_level(IWL_DL_RADIO),		\
39784abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg			  fmt, ##args);					\
39884abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg} while (0)
39984abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg#else
40084abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg#define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...)	\
40184abd2cc066fc077c424d0faf7618be348a7efb2Johannes Bergdo {									\
40283626404a70da74c67f32f119e53c0ba032ba2d8Don Fry	if (!iwl_is_rfkill((m)))					\
40384abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg		IWL_ERR(m, fmt, ##args);				\
40484abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg	else								\
40584abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg		__iwl_err(trans(m)->dev, true, true, fmt, ##args);	\
40684abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg} while (0)
40784abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg#endif				/* CONFIG_IWLWIFI_DEBUG */
40884abd2cc066fc077c424d0faf7618be348a7efb2Johannes Berg
409a1175124f34a4b859b5064efb84a197e4f6794a6Johannes Berg#endif /* __iwl_agn_h__ */
410