| Johannes Berg | a117512 | 2010-01-21 06:21:10 -0800 | [diff] [blame] | 1 | /****************************************************************************** | 
 | 2 |  * | 
 | 3 |  * This file is provided under a dual BSD/GPLv2 license.  When using or | 
 | 4 |  * redistributing this file, you may do so under either license. | 
 | 5 |  * | 
 | 6 |  * GPL LICENSE SUMMARY | 
 | 7 |  * | 
| Wey-Yi Guy | 4e31826 | 2011-12-27 11:21:32 -0800 | [diff] [blame] | 8 |  * Copyright(c) 2008 - 2012 Intel Corporation. All rights reserved. | 
| Johannes Berg | a117512 | 2010-01-21 06:21:10 -0800 | [diff] [blame] | 9 |  * | 
 | 10 |  * This program is free software; you can redistribute it and/or modify | 
 | 11 |  * it under the terms of version 2 of the GNU General Public License as | 
 | 12 |  * published by the Free Software Foundation. | 
 | 13 |  * | 
 | 14 |  * This program is distributed in the hope that it will be useful, but | 
 | 15 |  * WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 16 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 | 17 |  * General Public License for more details. | 
 | 18 |  * | 
 | 19 |  * You should have received a copy of the GNU General Public License | 
 | 20 |  * along with this program; if not, write to the Free Software | 
 | 21 |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, | 
 | 22 |  * USA | 
 | 23 |  * | 
 | 24 |  * The full GNU General Public License is included in this distribution | 
 | 25 |  * in the file called LICENSE.GPL. | 
 | 26 |  * | 
 | 27 |  * Contact Information: | 
 | 28 |  *  Intel Linux Wireless <ilw@linux.intel.com> | 
 | 29 |  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 
 | 30 |  * | 
 | 31 |  * BSD LICENSE | 
 | 32 |  * | 
| Wey-Yi Guy | 4e31826 | 2011-12-27 11:21:32 -0800 | [diff] [blame] | 33 |  * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved. | 
| Johannes Berg | a117512 | 2010-01-21 06:21:10 -0800 | [diff] [blame] | 34 |  * All rights reserved. | 
 | 35 |  * | 
 | 36 |  * Redistribution and use in source and binary forms, with or without | 
 | 37 |  * modification, are permitted provided that the following conditions | 
 | 38 |  * are met: | 
 | 39 |  * | 
 | 40 |  *  * Redistributions of source code must retain the above copyright | 
 | 41 |  *    notice, this list of conditions and the following disclaimer. | 
 | 42 |  *  * Redistributions in binary form must reproduce the above copyright | 
 | 43 |  *    notice, this list of conditions and the following disclaimer in | 
 | 44 |  *    the documentation and/or other materials provided with the | 
 | 45 |  *    distribution. | 
 | 46 |  *  * Neither the name Intel Corporation nor the names of its | 
 | 47 |  *    contributors may be used to endorse or promote products derived | 
 | 48 |  *    from this software without specific prior written permission. | 
 | 49 |  * | 
 | 50 |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
 | 51 |  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
 | 52 |  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
 | 53 |  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
 | 54 |  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
 | 55 |  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
 | 56 |  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
 | 57 |  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
 | 58 |  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
 | 59 |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
 | 60 |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
 | 61 |  *****************************************************************************/ | 
 | 62 |  | 
 | 63 | #ifndef __iwl_agn_h__ | 
 | 64 | #define __iwl_agn_h__ | 
 | 65 |  | 
 | 66 | #include "iwl-dev.h" | 
 | 67 |  | 
| Don Fry | 4a98677 | 2012-02-06 17:06:07 -0800 | [diff] [blame] | 68 | struct iwl_ucode_capabilities; | 
| Wey-Yi Guy | 7335613 | 2011-11-10 06:55:11 -0800 | [diff] [blame] | 69 |  | 
| Johannes Berg | dc21b54 | 2010-10-23 09:15:39 -0700 | [diff] [blame] | 70 | extern struct ieee80211_ops iwlagn_hw_ops; | 
 | 71 |  | 
| Wey-Yi Guy | 1f8bf03 | 2011-06-06 14:26:43 -0700 | [diff] [blame] | 72 | static inline void iwl_set_calib_hdr(struct iwl_calib_hdr *hdr, u8 cmd) | 
 | 73 | { | 
 | 74 | 	hdr->op_code = cmd; | 
 | 75 | 	hdr->first_group = 0; | 
 | 76 | 	hdr->groups_num = 1; | 
 | 77 | 	hdr->data_valid = 1; | 
 | 78 | } | 
 | 79 |  | 
| Wey-Yi Guy | 7335613 | 2011-11-10 06:55:11 -0800 | [diff] [blame] | 80 | void iwl_down(struct iwl_priv *priv); | 
| Emmanuel Grumbach | 78e5a46 | 2012-02-17 10:34:53 -0800 | [diff] [blame] | 81 | void iwl_cancel_deferred_work(struct iwl_priv *priv); | 
| Wey-Yi Guy | 7335613 | 2011-11-10 06:55:11 -0800 | [diff] [blame] | 82 | void iwlagn_prepare_restart(struct iwl_priv *priv); | 
| Emmanuel Grumbach | ed277c9 | 2012-02-09 16:08:15 +0200 | [diff] [blame] | 83 | void iwl_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb); | 
| Emmanuel Grumbach | db70f29 | 2012-02-09 16:08:15 +0200 | [diff] [blame] | 84 | int __must_check iwl_rx_dispatch(struct iwl_op_mode *op_mode, | 
| Johannes Berg | 48a2d66 | 2012-03-05 11:24:39 -0800 | [diff] [blame] | 85 | 				 struct iwl_rx_cmd_buffer *rxb, | 
| Emmanuel Grumbach | db70f29 | 2012-02-09 16:08:15 +0200 | [diff] [blame] | 86 | 				 struct iwl_device_cmd *cmd); | 
| Emmanuel Grumbach | 7120d98 | 2012-02-09 16:08:15 +0200 | [diff] [blame] | 87 | void iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state); | 
| Emmanuel Grumbach | bcb9321 | 2012-02-09 16:08:15 +0200 | [diff] [blame] | 88 | void iwl_nic_error(struct iwl_op_mode *op_mode); | 
| Wey-Yi Guy | 7335613 | 2011-11-10 06:55:11 -0800 | [diff] [blame] | 89 |  | 
| Johannes Berg | 0e78184 | 2012-03-06 13:30:49 -0800 | [diff] [blame] | 90 | bool iwl_check_for_ct_kill(struct iwl_priv *priv); | 
 | 91 |  | 
| Johannes Berg | e755f88 | 2012-03-07 09:52:16 -0800 | [diff] [blame] | 92 | void iwlagn_lift_passive_no_rx(struct iwl_priv *priv); | 
 | 93 |  | 
| Wey-Yi Guy | 7335613 | 2011-11-10 06:55:11 -0800 | [diff] [blame] | 94 | /* MAC80211 */ | 
 | 95 | struct ieee80211_hw *iwl_alloc_all(void); | 
 | 96 | int iwlagn_mac_setup_register(struct iwl_priv *priv, | 
| Johannes Berg | 0692fe4 | 2012-03-06 13:30:37 -0800 | [diff] [blame] | 97 | 			      const struct iwl_ucode_capabilities *capa); | 
| Don Fry | 09af140 | 2011-12-09 10:07:38 -0800 | [diff] [blame] | 98 | void iwlagn_mac_unregister(struct iwl_priv *priv); | 
| Wey-Yi Guy | 7335613 | 2011-11-10 06:55:11 -0800 | [diff] [blame] | 99 |  | 
| Johannes Berg | e10a053 | 2012-03-06 13:30:39 -0800 | [diff] [blame] | 100 | /* commands */ | 
 | 101 | int iwl_dvm_send_cmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd); | 
 | 102 | int iwl_dvm_send_cmd_pdu(struct iwl_priv *priv, u8 id, | 
 | 103 | 			 u32 flags, u16 len, const void *data); | 
 | 104 |  | 
| Johannes Berg | 7314c2b | 2010-09-22 18:01:55 +0200 | [diff] [blame] | 105 | /* RXON */ | 
| Wey-Yi Guy | e505c43 | 2011-07-07 08:27:41 -0700 | [diff] [blame] | 106 | int iwlagn_set_pan_params(struct iwl_priv *priv); | 
| Johannes Berg | 7314c2b | 2010-09-22 18:01:55 +0200 | [diff] [blame] | 107 | int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx); | 
| Johannes Berg | 5de3306 | 2010-09-22 18:01:58 +0200 | [diff] [blame] | 108 | void iwlagn_set_rxon_chain(struct iwl_priv *priv, struct iwl_rxon_context *ctx); | 
| Johannes Berg | 2295c66 | 2010-10-23 09:15:41 -0700 | [diff] [blame] | 109 | int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed); | 
 | 110 | void iwlagn_bss_info_changed(struct ieee80211_hw *hw, | 
 | 111 | 			     struct ieee80211_vif *vif, | 
 | 112 | 			     struct ieee80211_bss_conf *bss_conf, | 
 | 113 | 			     u32 changes); | 
| Wey-Yi Guy | 137ce79 | 2011-11-22 16:23:35 -0800 | [diff] [blame] | 114 | void iwlagn_config_ht40(struct ieee80211_conf *conf, | 
 | 115 | 			struct iwl_rxon_context *ctx); | 
| Johannes Berg | 7314c2b | 2010-09-22 18:01:55 +0200 | [diff] [blame] | 116 |  | 
| Wey-Yi Guy | 741a626 | 2010-03-16 12:37:24 -0700 | [diff] [blame] | 117 | /* uCode */ | 
| Emmanuel Grumbach | 247c61d | 2011-09-20 15:37:23 -0700 | [diff] [blame] | 118 | int iwlagn_rx_calib_result(struct iwl_priv *priv, | 
| Johannes Berg | 48a2d66 | 2012-03-05 11:24:39 -0800 | [diff] [blame] | 119 | 			    struct iwl_rx_cmd_buffer *rxb, | 
| Emmanuel Grumbach | 247c61d | 2011-09-20 15:37:23 -0700 | [diff] [blame] | 120 | 			    struct iwl_device_cmd *cmd); | 
| Johannes Berg | e199188 | 2012-03-06 13:30:36 -0800 | [diff] [blame] | 121 | int iwl_send_bt_env(struct iwl_priv *priv, u8 action, u8 type); | 
 | 122 | void iwl_send_prio_tbl(struct iwl_priv *priv); | 
 | 123 | int iwl_init_alive_start(struct iwl_priv *priv); | 
 | 124 | int iwl_run_init_ucode(struct iwl_priv *priv); | 
 | 125 | int iwl_load_ucode_wait_alive(struct iwl_priv *priv, | 
 | 126 | 			      enum iwl_ucode_type ucode_type); | 
 | 127 | int iwl_send_calib_results(struct iwl_priv *priv); | 
 | 128 | int iwl_calib_set(struct iwl_priv *priv, | 
 | 129 | 		  const struct iwl_calib_hdr *cmd, int len); | 
 | 130 | void iwl_calib_free_results(struct iwl_priv *priv); | 
| Wey-Yi Guy | 741a626 | 2010-03-16 12:37:24 -0700 | [diff] [blame] | 131 |  | 
| Wey-Yi Guy | e04ed0a | 2010-03-16 17:47:58 -0700 | [diff] [blame] | 132 | /* lib */ | 
| Wey-Yi Guy | e04ed0a | 2010-03-16 17:47:58 -0700 | [diff] [blame] | 133 | int iwlagn_send_tx_power(struct iwl_priv *priv); | 
 | 134 | void iwlagn_temperature(struct iwl_priv *priv); | 
| Don Fry | ab36eab | 2011-11-30 15:37:32 -0800 | [diff] [blame] | 135 | u16 iwl_eeprom_calib_version(struct iwl_shared *shrd); | 
| Wey-Yi Guy | 716c74b | 2010-06-24 13:22:36 -0700 | [diff] [blame] | 136 | int iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control); | 
| Wey-Yi Guy | 6555063 | 2010-06-24 13:18:35 -0700 | [diff] [blame] | 137 | void iwlagn_dev_txfifo_flush(struct iwl_priv *priv, u16 flush_control); | 
| Wey-Yi Guy | e505c43 | 2011-07-07 08:27:41 -0700 | [diff] [blame] | 138 | int iwlagn_send_beacon_cmd(struct iwl_priv *priv); | 
| Wey-Yi Guy | 023ca58 | 2011-11-10 06:55:17 -0800 | [diff] [blame] | 139 | #ifdef CONFIG_PM_SLEEP | 
 | 140 | int iwlagn_send_patterns(struct iwl_priv *priv, | 
 | 141 | 			 struct cfg80211_wowlan *wowlan); | 
| Johannes Berg | ea886a6 | 2012-03-07 09:52:15 -0800 | [diff] [blame] | 142 | int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan); | 
| Wey-Yi Guy | 023ca58 | 2011-11-10 06:55:17 -0800 | [diff] [blame] | 143 | #endif | 
| Wey-Yi Guy | 74bcdb3 | 2010-03-17 13:34:34 -0700 | [diff] [blame] | 144 |  | 
| Wey-Yi Guy | 54b8155 | 2010-03-17 13:34:35 -0700 | [diff] [blame] | 145 | /* rx */ | 
| Wey-Yi Guy | 8d80108 | 2010-03-17 13:34:36 -0700 | [diff] [blame] | 146 | int iwlagn_hwrate_to_mac80211_idx(u32 rate_n_flags, enum ieee80211_band band); | 
| Stanislaw Gruszka | 466a19a | 2011-03-04 17:51:49 +0100 | [diff] [blame] | 147 | void iwl_setup_rx_handlers(struct iwl_priv *priv); | 
| Emmanuel Grumbach | 1ab9f6c | 2011-07-07 07:59:02 -0700 | [diff] [blame] | 148 |  | 
| Wey-Yi Guy | 54b8155 | 2010-03-17 13:34:35 -0700 | [diff] [blame] | 149 |  | 
| Wey-Yi Guy | 74bcdb3 | 2010-03-17 13:34:34 -0700 | [diff] [blame] | 150 | /* tx */ | 
 | 151 | int iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb); | 
| Johannes Berg | 832f47e | 2010-04-29 04:43:07 -0700 | [diff] [blame] | 152 | int iwlagn_tx_agg_start(struct iwl_priv *priv, struct ieee80211_vif *vif, | 
| Johannes Berg | 619753f | 2010-04-30 11:30:46 -0700 | [diff] [blame] | 153 | 			struct ieee80211_sta *sta, u16 tid, u16 *ssn); | 
| Emmanuel Grumbach | 822e8b2 | 2011-11-21 13:25:31 +0200 | [diff] [blame] | 154 | int iwlagn_tx_agg_oper(struct iwl_priv *priv, struct ieee80211_vif *vif, | 
 | 155 | 			struct ieee80211_sta *sta, u16 tid, u8 buf_size); | 
| Johannes Berg | 832f47e | 2010-04-29 04:43:07 -0700 | [diff] [blame] | 156 | int iwlagn_tx_agg_stop(struct iwl_priv *priv, struct ieee80211_vif *vif, | 
| Johannes Berg | 619753f | 2010-04-30 11:30:46 -0700 | [diff] [blame] | 157 | 		       struct ieee80211_sta *sta, u16 tid); | 
| Emmanuel Grumbach | 247c61d | 2011-09-20 15:37:23 -0700 | [diff] [blame] | 158 | int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv, | 
| Johannes Berg | 48a2d66 | 2012-03-05 11:24:39 -0800 | [diff] [blame] | 159 | 				   struct iwl_rx_cmd_buffer *rxb, | 
| Emmanuel Grumbach | 247c61d | 2011-09-20 15:37:23 -0700 | [diff] [blame] | 160 | 				   struct iwl_device_cmd *cmd); | 
| Johannes Berg | 48a2d66 | 2012-03-05 11:24:39 -0800 | [diff] [blame] | 161 | int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb, | 
| Emmanuel Grumbach | 247c61d | 2011-09-20 15:37:23 -0700 | [diff] [blame] | 162 | 			       struct iwl_device_cmd *cmd); | 
| Wey-Yi Guy | e04ed0a | 2010-03-16 17:47:58 -0700 | [diff] [blame] | 163 |  | 
| Wey-Yi Guy | 04569cb | 2010-03-31 17:57:28 -0700 | [diff] [blame] | 164 | static inline u32 iwl_tx_status_to_mac80211(u32 status) | 
 | 165 | { | 
 | 166 | 	status &= TX_STATUS_MSK; | 
 | 167 |  | 
 | 168 | 	switch (status) { | 
 | 169 | 	case TX_STATUS_SUCCESS: | 
 | 170 | 	case TX_STATUS_DIRECT_DONE: | 
 | 171 | 		return IEEE80211_TX_STAT_ACK; | 
 | 172 | 	case TX_STATUS_FAIL_DEST_PS: | 
| Garen Tamrazian | 68b9931 | 2011-03-30 02:29:32 -0700 | [diff] [blame] | 173 | 	case TX_STATUS_FAIL_PASSIVE_NO_RX: | 
| Wey-Yi Guy | 04569cb | 2010-03-31 17:57:28 -0700 | [diff] [blame] | 174 | 		return IEEE80211_TX_STAT_TX_FILTERED; | 
 | 175 | 	default: | 
 | 176 | 		return 0; | 
 | 177 | 	} | 
 | 178 | } | 
 | 179 |  | 
 | 180 | static inline bool iwl_is_tx_success(u32 status) | 
 | 181 | { | 
 | 182 | 	status &= TX_STATUS_MSK; | 
 | 183 | 	return (status == TX_STATUS_SUCCESS) || | 
 | 184 | 	       (status == TX_STATUS_DIRECT_DONE); | 
 | 185 | } | 
 | 186 |  | 
| Johannes Berg | facd982 | 2010-09-22 18:02:05 +0200 | [diff] [blame] | 187 | u8 iwl_toggle_tx_ant(struct iwl_priv *priv, u8 ant_idx, u8 valid); | 
 | 188 |  | 
| Johannes Berg | b6e4c55 | 2010-04-06 04:12:42 -0700 | [diff] [blame] | 189 | /* scan */ | 
| Johannes Berg | a77029e | 2010-09-22 18:01:56 +0200 | [diff] [blame] | 190 | void iwlagn_post_scan(struct iwl_priv *priv); | 
| Johannes Berg | c6baf7f | 2011-07-23 10:24:47 -0700 | [diff] [blame] | 191 | void iwlagn_disable_roc(struct iwl_priv *priv); | 
| Johannes Berg | b6e4c55 | 2010-04-06 04:12:42 -0700 | [diff] [blame] | 192 |  | 
| Wey-Yi Guy | b6e116e | 2010-08-23 07:57:14 -0700 | [diff] [blame] | 193 | /* bt coex */ | 
 | 194 | void iwlagn_send_advance_bt_config(struct iwl_priv *priv); | 
| Emmanuel Grumbach | 247c61d | 2011-09-20 15:37:23 -0700 | [diff] [blame] | 195 | int iwlagn_bt_coex_profile_notif(struct iwl_priv *priv, | 
| Johannes Berg | 48a2d66 | 2012-03-05 11:24:39 -0800 | [diff] [blame] | 196 | 				  struct iwl_rx_cmd_buffer *rxb, | 
| Emmanuel Grumbach | 247c61d | 2011-09-20 15:37:23 -0700 | [diff] [blame] | 197 | 				  struct iwl_device_cmd *cmd); | 
| Wey-Yi Guy | b6e116e | 2010-08-23 07:57:14 -0700 | [diff] [blame] | 198 | void iwlagn_bt_rx_handler_setup(struct iwl_priv *priv); | 
 | 199 | void iwlagn_bt_setup_deferred_work(struct iwl_priv *priv); | 
 | 200 | void iwlagn_bt_cancel_deferred_work(struct iwl_priv *priv); | 
| Meenakshi Venkataraman | 207ecc5 | 2011-07-08 08:46:23 -0700 | [diff] [blame] | 201 | void iwlagn_bt_coex_rssi_monitor(struct iwl_priv *priv); | 
 | 202 | void iwlagn_bt_adjust_rssi_monitor(struct iwl_priv *priv, bool rssi_ena); | 
| Wey-Yi Guy | b6e116e | 2010-08-23 07:57:14 -0700 | [diff] [blame] | 203 |  | 
| Wey-Yi Guy | 95b49ed | 2010-09-05 10:49:45 -0700 | [diff] [blame] | 204 | #ifdef CONFIG_IWLWIFI_DEBUG | 
| Johannes Berg | 69fdb71 | 2010-09-22 18:02:02 +0200 | [diff] [blame] | 205 | const char *iwl_get_tx_fail_reason(u32 status); | 
| Wey-Yi Guy | 95b49ed | 2010-09-05 10:49:45 -0700 | [diff] [blame] | 206 | const char *iwl_get_agg_tx_fail_reason(u16 status); | 
 | 207 | #else | 
| Johannes Berg | 69fdb71 | 2010-09-22 18:02:02 +0200 | [diff] [blame] | 208 | static inline const char *iwl_get_tx_fail_reason(u32 status) { return ""; } | 
| Wey-Yi Guy | 95b49ed | 2010-09-05 10:49:45 -0700 | [diff] [blame] | 209 | static inline const char *iwl_get_agg_tx_fail_reason(u16 status) { return ""; } | 
 | 210 | #endif | 
| Johannes Berg | a30e311 | 2010-09-22 18:02:01 +0200 | [diff] [blame] | 211 |  | 
| Wey-Yi Guy | c745f55 | 2011-10-10 07:27:12 -0700 | [diff] [blame] | 212 |  | 
| Johannes Berg | a30e311 | 2010-09-22 18:02:01 +0200 | [diff] [blame] | 213 | /* station management */ | 
| Wey-Yi Guy | c745f55 | 2011-10-10 07:27:12 -0700 | [diff] [blame] | 214 | int iwlagn_manage_ibss_station(struct iwl_priv *priv, | 
 | 215 | 			       struct ieee80211_vif *vif, bool add); | 
 | 216 | #define IWL_STA_DRIVER_ACTIVE BIT(0) /* driver entry is active */ | 
 | 217 | #define IWL_STA_UCODE_ACTIVE  BIT(1) /* ucode entry is active */ | 
 | 218 | #define IWL_STA_UCODE_INPROGRESS  BIT(2) /* ucode entry is in process of | 
 | 219 | 					    being activated */ | 
 | 220 | #define IWL_STA_LOCAL BIT(3) /* station state not directed by mac80211; | 
 | 221 | 				(this is for the IBSS BSSID stations) */ | 
 | 222 | #define IWL_STA_BCAST BIT(4) /* this station is the special bcast station */ | 
 | 223 |  | 
 | 224 |  | 
 | 225 | void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx); | 
 | 226 | void iwl_clear_ucode_stations(struct iwl_priv *priv, | 
 | 227 | 			      struct iwl_rxon_context *ctx); | 
 | 228 | void iwl_dealloc_bcast_stations(struct iwl_priv *priv); | 
 | 229 | int iwl_get_free_ucode_key_offset(struct iwl_priv *priv); | 
 | 230 | int iwl_send_add_sta(struct iwl_priv *priv, | 
 | 231 | 		     struct iwl_addsta_cmd *sta, u8 flags); | 
 | 232 | int iwl_add_station_common(struct iwl_priv *priv, struct iwl_rxon_context *ctx, | 
 | 233 | 			   const u8 *addr, bool is_ap, | 
 | 234 | 			   struct ieee80211_sta *sta, u8 *sta_id_r); | 
 | 235 | int iwl_remove_station(struct iwl_priv *priv, const u8 sta_id, | 
 | 236 | 		       const u8 *addr); | 
| Johannes Berg | 9742051 | 2012-03-07 09:52:42 -0800 | [diff] [blame] | 237 | void iwl_deactivate_station(struct iwl_priv *priv, const u8 sta_id, | 
 | 238 | 			    const u8 *addr); | 
| Wey-Yi Guy | c745f55 | 2011-10-10 07:27:12 -0700 | [diff] [blame] | 239 | u8 iwl_prep_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx, | 
 | 240 | 		    const u8 *addr, bool is_ap, struct ieee80211_sta *sta); | 
 | 241 |  | 
 | 242 | void iwl_sta_fill_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx, | 
 | 243 | 		     u8 sta_id, struct iwl_link_quality_cmd *link_cmd); | 
 | 244 | int iwl_send_lq_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx, | 
 | 245 | 		    struct iwl_link_quality_cmd *lq, u8 flags, bool init); | 
| Johannes Berg | 48a2d66 | 2012-03-05 11:24:39 -0800 | [diff] [blame] | 246 | int iwl_add_sta_callback(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb, | 
| Wey-Yi Guy | c745f55 | 2011-10-10 07:27:12 -0700 | [diff] [blame] | 247 | 			       struct iwl_device_cmd *cmd); | 
| Johannes Berg | ab0bd5b | 2012-03-05 11:24:47 -0800 | [diff] [blame] | 248 | int iwl_sta_update_ht(struct iwl_priv *priv, struct iwl_rxon_context *ctx, | 
 | 249 | 		      struct ieee80211_sta *sta); | 
| Wey-Yi Guy | c745f55 | 2011-10-10 07:27:12 -0700 | [diff] [blame] | 250 |  | 
 | 251 |  | 
| Wey-Yi Guy | c745f55 | 2011-10-10 07:27:12 -0700 | [diff] [blame] | 252 | static inline int iwl_sta_id(struct ieee80211_sta *sta) | 
 | 253 | { | 
 | 254 | 	if (WARN_ON(!sta)) | 
 | 255 | 		return IWL_INVALID_STATION; | 
 | 256 |  | 
 | 257 | 	return ((struct iwl_station_priv *)sta->drv_priv)->sta_id; | 
 | 258 | } | 
 | 259 |  | 
| Johannes Berg | a30e311 | 2010-09-22 18:02:01 +0200 | [diff] [blame] | 260 | int iwlagn_alloc_bcast_station(struct iwl_priv *priv, | 
 | 261 | 			       struct iwl_rxon_context *ctx); | 
 | 262 | int iwlagn_add_bssid_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx, | 
 | 263 | 			     const u8 *addr, u8 *sta_id_r); | 
 | 264 | int iwl_remove_default_wep_key(struct iwl_priv *priv, | 
 | 265 | 			       struct iwl_rxon_context *ctx, | 
 | 266 | 			       struct ieee80211_key_conf *key); | 
 | 267 | int iwl_set_default_wep_key(struct iwl_priv *priv, | 
 | 268 | 			    struct iwl_rxon_context *ctx, | 
 | 269 | 			    struct ieee80211_key_conf *key); | 
 | 270 | int iwl_restore_default_wep_keys(struct iwl_priv *priv, | 
 | 271 | 				 struct iwl_rxon_context *ctx); | 
 | 272 | int iwl_set_dynamic_key(struct iwl_priv *priv, struct iwl_rxon_context *ctx, | 
| Johannes Berg | 5a3d988 | 2011-07-15 13:03:12 -0700 | [diff] [blame] | 273 | 			struct ieee80211_key_conf *key, | 
 | 274 | 			struct ieee80211_sta *sta); | 
| Johannes Berg | a30e311 | 2010-09-22 18:02:01 +0200 | [diff] [blame] | 275 | int iwl_remove_dynamic_key(struct iwl_priv *priv, struct iwl_rxon_context *ctx, | 
| Johannes Berg | 5a3d988 | 2011-07-15 13:03:12 -0700 | [diff] [blame] | 276 | 			   struct ieee80211_key_conf *key, | 
 | 277 | 			   struct ieee80211_sta *sta); | 
| Johannes Berg | a30e311 | 2010-09-22 18:02:01 +0200 | [diff] [blame] | 278 | void iwl_update_tkip_key(struct iwl_priv *priv, | 
| Johannes Berg | 5a3d988 | 2011-07-15 13:03:12 -0700 | [diff] [blame] | 279 | 			 struct ieee80211_vif *vif, | 
| Johannes Berg | a30e311 | 2010-09-22 18:02:01 +0200 | [diff] [blame] | 280 | 			 struct ieee80211_key_conf *keyconf, | 
 | 281 | 			 struct ieee80211_sta *sta, u32 iv32, u16 *phase1key); | 
 | 282 | int iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid); | 
 | 283 | int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta, | 
 | 284 | 			 int tid, u16 ssn); | 
 | 285 | int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta, | 
 | 286 | 			int tid); | 
| Johannes Berg | a30e311 | 2010-09-22 18:02:01 +0200 | [diff] [blame] | 287 | void iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt); | 
| Johannes Berg | f775aa0 | 2011-06-22 06:34:09 -0700 | [diff] [blame] | 288 | int iwl_update_bcast_station(struct iwl_priv *priv, | 
 | 289 | 			     struct iwl_rxon_context *ctx); | 
| Johannes Berg | a30e311 | 2010-09-22 18:02:01 +0200 | [diff] [blame] | 290 | int iwl_update_bcast_stations(struct iwl_priv *priv); | 
 | 291 |  | 
| Johannes Berg | 0de7673 | 2010-09-22 18:02:11 +0200 | [diff] [blame] | 292 | /* rate */ | 
 | 293 | static inline u32 iwl_ant_idx_to_flags(u8 ant_idx) | 
 | 294 | { | 
 | 295 | 	return BIT(ant_idx) << RATE_MCS_ANT_POS; | 
 | 296 | } | 
 | 297 |  | 
 | 298 | static inline u8 iwl_hw_get_rate(__le32 rate_n_flags) | 
 | 299 | { | 
| Daniel Halperin | 2520546 | 2011-03-18 18:48:55 -0700 | [diff] [blame] | 300 | 	return le32_to_cpu(rate_n_flags) & RATE_MCS_RATE_MSK; | 
| Johannes Berg | 0de7673 | 2010-09-22 18:02:11 +0200 | [diff] [blame] | 301 | } | 
 | 302 |  | 
 | 303 | static inline __le32 iwl_hw_set_rate_n_flags(u8 rate, u32 flags) | 
 | 304 | { | 
 | 305 | 	return cpu_to_le32(flags|(u32)rate); | 
 | 306 | } | 
 | 307 |  | 
| Wey-Yi Guy | 3be63ff | 2010-10-08 16:05:19 -0700 | [diff] [blame] | 308 | /* eeprom */ | 
| Don Fry | ab36eab | 2011-11-30 15:37:32 -0800 | [diff] [blame] | 309 | void iwl_eeprom_get_mac(const struct iwl_shared *shrd, u8 *mac); | 
| Wey-Yi Guy | 3be63ff | 2010-10-08 16:05:19 -0700 | [diff] [blame] | 310 |  | 
| Cindy H. Kao | 4613e72 | 2011-05-06 10:40:15 -0700 | [diff] [blame] | 311 | extern int iwl_alive_start(struct iwl_priv *priv); | 
 | 312 | /* svtool */ | 
| Wey-Yi Guy | 5ef15cc | 2011-11-30 13:24:06 -0800 | [diff] [blame] | 313 | #ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE | 
| Wey-Yi Guy | ade4c64 | 2011-10-10 07:27:11 -0700 | [diff] [blame] | 314 | extern int iwlagn_mac_testmode_cmd(struct ieee80211_hw *hw, void *data, | 
 | 315 | 				   int len); | 
 | 316 | extern int iwlagn_mac_testmode_dump(struct ieee80211_hw *hw, | 
 | 317 | 				    struct sk_buff *skb, | 
 | 318 | 				    struct netlink_callback *cb, | 
 | 319 | 				    void *data, int len); | 
| Cindy H. Kao | 4613e72 | 2011-05-06 10:40:15 -0700 | [diff] [blame] | 320 | extern void iwl_testmode_init(struct iwl_priv *priv); | 
| Wey-Yi Guy | 7a4e528 | 2011-05-06 10:21:28 -0700 | [diff] [blame] | 321 | extern void iwl_testmode_cleanup(struct iwl_priv *priv); | 
| Cindy H. Kao | 4613e72 | 2011-05-06 10:40:15 -0700 | [diff] [blame] | 322 | #else | 
 | 323 | static inline | 
| Wey-Yi Guy | ade4c64 | 2011-10-10 07:27:11 -0700 | [diff] [blame] | 324 | int iwlagn_mac_testmode_cmd(struct ieee80211_hw *hw, void *data, int len) | 
| Cindy H. Kao | 4613e72 | 2011-05-06 10:40:15 -0700 | [diff] [blame] | 325 | { | 
 | 326 | 	return -ENOSYS; | 
 | 327 | } | 
 | 328 | static inline | 
| Wey-Yi Guy | ade4c64 | 2011-10-10 07:27:11 -0700 | [diff] [blame] | 329 | int iwlagn_mac_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb, | 
| Wey-Yi Guy | eb64dca | 2011-05-31 08:03:02 -0700 | [diff] [blame] | 330 | 		      struct netlink_callback *cb, | 
 | 331 | 		      void *data, int len) | 
 | 332 | { | 
 | 333 | 	return -ENOSYS; | 
 | 334 | } | 
 | 335 | static inline | 
| Cindy H. Kao | 4613e72 | 2011-05-06 10:40:15 -0700 | [diff] [blame] | 336 | void iwl_testmode_init(struct iwl_priv *priv) | 
 | 337 | { | 
 | 338 | } | 
| Wey-Yi Guy | 7a4e528 | 2011-05-06 10:21:28 -0700 | [diff] [blame] | 339 | static inline | 
 | 340 | void iwl_testmode_cleanup(struct iwl_priv *priv) | 
 | 341 | { | 
 | 342 | } | 
| Cindy H. Kao | 4613e72 | 2011-05-06 10:40:15 -0700 | [diff] [blame] | 343 | #endif | 
| Johannes Berg | 7194207c | 2011-01-04 16:22:00 -0800 | [diff] [blame] | 344 |  | 
| Emmanuel Grumbach | 3e6895c | 2012-02-15 12:48:04 +0200 | [diff] [blame] | 345 | #ifdef CONFIG_IWLWIFI_DEBUG | 
 | 346 | void iwl_print_rx_config_cmd(struct iwl_priv *priv, | 
 | 347 | 			     enum iwl_rxon_context_id ctxid); | 
 | 348 | #else | 
 | 349 | static inline void iwl_print_rx_config_cmd(struct iwl_priv *priv, | 
 | 350 | 					   enum iwl_rxon_context_id ctxid) | 
 | 351 | { | 
 | 352 | } | 
 | 353 | #endif | 
 | 354 |  | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 355 | /* status checks */ | 
 | 356 |  | 
| Don Fry | 8362640 | 2012-03-07 09:52:37 -0800 | [diff] [blame] | 357 | static inline int iwl_is_ready(struct iwl_priv *priv) | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 358 | { | 
 | 359 | 	/* The adapter is 'ready' if READY and GEO_CONFIGURED bits are | 
 | 360 | 	 * set but EXIT_PENDING is not */ | 
| Don Fry | 8362640 | 2012-03-07 09:52:37 -0800 | [diff] [blame] | 361 | 	return test_bit(STATUS_READY, &priv->status) && | 
 | 362 | 	       test_bit(STATUS_GEO_CONFIGURED, &priv->status) && | 
 | 363 | 	       !test_bit(STATUS_EXIT_PENDING, &priv->status); | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 364 | } | 
 | 365 |  | 
| Don Fry | 8362640 | 2012-03-07 09:52:37 -0800 | [diff] [blame] | 366 | static inline int iwl_is_alive(struct iwl_priv *priv) | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 367 | { | 
| Don Fry | 8362640 | 2012-03-07 09:52:37 -0800 | [diff] [blame] | 368 | 	return test_bit(STATUS_ALIVE, &priv->status); | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 369 | } | 
 | 370 |  | 
| Don Fry | 8362640 | 2012-03-07 09:52:37 -0800 | [diff] [blame] | 371 | static inline int iwl_is_rfkill(struct iwl_priv *priv) | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 372 | { | 
| Don Fry | 8362640 | 2012-03-07 09:52:37 -0800 | [diff] [blame] | 373 | 	return test_bit(STATUS_RF_KILL_HW, &priv->status); | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 374 | } | 
 | 375 |  | 
| Don Fry | 9a71686 | 2012-03-07 09:52:32 -0800 | [diff] [blame] | 376 | static inline int iwl_is_ctkill(struct iwl_priv *priv) | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 377 | { | 
| Don Fry | 9a71686 | 2012-03-07 09:52:32 -0800 | [diff] [blame] | 378 | 	return test_bit(STATUS_CT_KILL, &priv->status); | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 379 | } | 
 | 380 |  | 
| Don Fry | 8362640 | 2012-03-07 09:52:37 -0800 | [diff] [blame] | 381 | static inline int iwl_is_ready_rf(struct iwl_priv *priv) | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 382 | { | 
| Don Fry | 8362640 | 2012-03-07 09:52:37 -0800 | [diff] [blame] | 383 | 	if (iwl_is_rfkill(priv)) | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 384 | 		return 0; | 
 | 385 |  | 
| Don Fry | 8362640 | 2012-03-07 09:52:37 -0800 | [diff] [blame] | 386 | 	return iwl_is_ready(priv); | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 387 | } | 
 | 388 |  | 
 | 389 | #ifdef CONFIG_IWLWIFI_DEBUG | 
 | 390 | #define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...)	\ | 
 | 391 | do {									\ | 
| Don Fry | 8362640 | 2012-03-07 09:52:37 -0800 | [diff] [blame] | 392 | 	if (!iwl_is_rfkill((m)))					\ | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 393 | 		IWL_ERR(m, fmt, ##args);				\ | 
 | 394 | 	else								\ | 
 | 395 | 		__iwl_err(trans(m)->dev, true,				\ | 
 | 396 | 			  !iwl_have_debug_level(IWL_DL_RADIO),		\ | 
 | 397 | 			  fmt, ##args);					\ | 
 | 398 | } while (0) | 
 | 399 | #else | 
 | 400 | #define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...)	\ | 
 | 401 | do {									\ | 
| Don Fry | 8362640 | 2012-03-07 09:52:37 -0800 | [diff] [blame] | 402 | 	if (!iwl_is_rfkill((m)))					\ | 
| Johannes Berg | 84abd2c | 2012-03-06 13:30:47 -0800 | [diff] [blame] | 403 | 		IWL_ERR(m, fmt, ##args);				\ | 
 | 404 | 	else								\ | 
 | 405 | 		__iwl_err(trans(m)->dev, true, true, fmt, ##args);	\ | 
 | 406 | } while (0) | 
 | 407 | #endif				/* CONFIG_IWLWIFI_DEBUG */ | 
 | 408 |  | 
| Johannes Berg | a117512 | 2010-01-21 06:21:10 -0800 | [diff] [blame] | 409 | #endif /* __iwl_agn_h__ */ |