1/****************************************************************************** 2 * 3 * Copyright(c) 2003 - 2010 Intel Corporation. All rights reserved. 4 * 5 * Portions of this file are derived from the ipw3945 project, as well 6 * as portions of the ieee80211 subsystem header files. 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of version 2 of the GNU General Public License as 10 * published by the Free Software Foundation. 11 * 12 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 * more details. 16 * 17 * You should have received a copy of the GNU General Public License along with 18 * this program; if not, write to the Free Software Foundation, Inc., 19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 20 * 21 * The full GNU General Public License is included in this distribution in the 22 * file called LICENSE. 23 * 24 * Contact Information: 25 * Intel Linux Wireless <ilw@linux.intel.com> 26 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 27 * 28 *****************************************************************************/ 29#ifndef __iwl_sta_h__ 30#define __iwl_sta_h__ 31 32#include "iwl-dev.h" 33 34#define HW_KEY_DYNAMIC 0 35#define HW_KEY_DEFAULT 1 36 37#define IWL_STA_DRIVER_ACTIVE BIT(0) /* driver entry is active */ 38#define IWL_STA_UCODE_ACTIVE BIT(1) /* ucode entry is active */ 39#define IWL_STA_UCODE_INPROGRESS BIT(2) /* ucode entry is in process of 40 being activated */ 41#define IWL_STA_LOCAL BIT(3) /* station state not directed by mac80211; 42 (this is for the IBSS BSSID stations) */ 43#define IWL_STA_BCAST BIT(4) /* this station is the special bcast station */ 44 45 46int iwl_remove_default_wep_key(struct iwl_priv *priv, 47 struct ieee80211_key_conf *key); 48int iwl_set_default_wep_key(struct iwl_priv *priv, 49 struct ieee80211_key_conf *key); 50int iwl_restore_default_wep_keys(struct iwl_priv *priv); 51int iwl_set_dynamic_key(struct iwl_priv *priv, 52 struct ieee80211_key_conf *key, u8 sta_id); 53int iwl_remove_dynamic_key(struct iwl_priv *priv, 54 struct ieee80211_key_conf *key, u8 sta_id); 55void iwl_update_tkip_key(struct iwl_priv *priv, 56 struct ieee80211_key_conf *keyconf, 57 struct ieee80211_sta *sta, u32 iv32, u16 *phase1key); 58 59void iwl_restore_stations(struct iwl_priv *priv); 60void iwl_clear_ucode_stations(struct iwl_priv *priv); 61int iwl_alloc_bcast_station(struct iwl_priv *priv, bool init_lq); 62void iwl_dealloc_bcast_station(struct iwl_priv *priv); 63int iwl_update_bcast_station(struct iwl_priv *priv); 64int iwl_get_free_ucode_key_index(struct iwl_priv *priv); 65int iwl_send_add_sta(struct iwl_priv *priv, 66 struct iwl_addsta_cmd *sta, u8 flags); 67int iwl_add_bssid_station(struct iwl_priv *priv, const u8 *addr, bool init_rs, 68 u8 *sta_id_r); 69int iwl_add_station_common(struct iwl_priv *priv, const u8 *addr, 70 bool is_ap, 71 struct ieee80211_sta_ht_cap *ht_info, 72 u8 *sta_id_r); 73int iwl_remove_station(struct iwl_priv *priv, const u8 sta_id, 74 const u8 *addr); 75int iwl_mac_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 76 struct ieee80211_sta *sta); 77int iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid); 78int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta, 79 int tid, u16 ssn); 80int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta, 81 int tid); 82void iwl_sta_modify_ps_wake(struct iwl_priv *priv, int sta_id); 83void iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt); 84 85/** 86 * iwl_clear_driver_stations - clear knowledge of all stations from driver 87 * @priv: iwl priv struct 88 * 89 * This is called during iwl_down() to make sure that in the case 90 * we're coming there from a hardware restart mac80211 will be 91 * able to reconfigure stations -- if we're getting there in the 92 * normal down flow then the stations will already be cleared. 93 */ 94static inline void iwl_clear_driver_stations(struct iwl_priv *priv) 95{ 96 unsigned long flags; 97 98 spin_lock_irqsave(&priv->sta_lock, flags); 99 memset(priv->stations, 0, sizeof(priv->stations)); 100 priv->num_stations = 0; 101 102 /* 103 * Remove all key information that is not stored as part of station 104 * information since mac80211 may not have had a 105 * chance to remove all the keys. When device is reconfigured by 106 * mac80211 after an error all keys will be reconfigured. 107 */ 108 priv->ucode_key_table = 0; 109 priv->key_mapping_key = 0; 110 memset(priv->wep_keys, 0, sizeof(priv->wep_keys)); 111 112 spin_unlock_irqrestore(&priv->sta_lock, flags); 113} 114 115static inline int iwl_sta_id(struct ieee80211_sta *sta) 116{ 117 if (WARN_ON(!sta)) 118 return IWL_INVALID_STATION; 119 120 return ((struct iwl_station_priv_common *)sta->drv_priv)->sta_id; 121} 122 123/** 124 * iwl_sta_id_or_broadcast - return sta_id or broadcast sta 125 * @priv: iwl priv 126 * @sta: mac80211 station 127 * 128 * In certain circumstances mac80211 passes a station pointer 129 * that may be %NULL, for example during TX or key setup. In 130 * that case, we need to use the broadcast station, so this 131 * inline wraps that pattern. 132 */ 133static inline int iwl_sta_id_or_broadcast(struct iwl_priv *priv, 134 struct ieee80211_sta *sta) 135{ 136 int sta_id; 137 138 if (!sta) 139 return priv->hw_params.bcast_sta_id; 140 141 sta_id = iwl_sta_id(sta); 142 143 /* 144 * mac80211 should not be passing a partially 145 * initialised station! 146 */ 147 WARN_ON(sta_id == IWL_INVALID_STATION); 148 149 return sta_id; 150} 151#endif /* __iwl_sta_h__ */ 152