Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
  1/******************************************************************************
  2 *
  3 * Copyright(c) 2003 - 2011 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 IWL_STA_DRIVER_ACTIVE BIT(0) /* driver entry is active */
 35#define IWL_STA_UCODE_ACTIVE  BIT(1) /* ucode entry is active */
 36#define IWL_STA_UCODE_INPROGRESS  BIT(2) /* ucode entry is in process of
 37					    being activated */
 38#define IWL_STA_LOCAL BIT(3) /* station state not directed by mac80211;
 39				(this is for the IBSS BSSID stations) */
 40#define IWL_STA_BCAST BIT(4) /* this station is the special bcast station */
 41
 42
 43void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
 44void iwl_clear_ucode_stations(struct iwl_priv *priv,
 45			      struct iwl_rxon_context *ctx);
 46void iwl_dealloc_bcast_stations(struct iwl_priv *priv);
 47int iwl_get_free_ucode_key_offset(struct iwl_priv *priv);
 48int iwl_send_add_sta(struct iwl_priv *priv,
 49		     struct iwl_addsta_cmd *sta, u8 flags);
 50int iwl_add_station_common(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 51			   const u8 *addr, bool is_ap,
 52			   struct ieee80211_sta *sta, u8 *sta_id_r);
 53int iwl_remove_station(struct iwl_priv *priv, const u8 sta_id,
 54		       const u8 *addr);
 55int iwl_mac_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 56		       struct ieee80211_sta *sta);
 57
 58u8 iwl_prep_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 59		    const u8 *addr, bool is_ap, struct ieee80211_sta *sta);
 60
 61int iwl_send_lq_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
 62		    struct iwl_link_quality_cmd *lq, u8 flags, bool init);
 63void iwl_reprogram_ap_sta(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
 64
 65/**
 66 * iwl_clear_driver_stations - clear knowledge of all stations from driver
 67 * @priv: iwl priv struct
 68 *
 69 * This is called during iwl_down() to make sure that in the case
 70 * we're coming there from a hardware restart mac80211 will be
 71 * able to reconfigure stations -- if we're getting there in the
 72 * normal down flow then the stations will already be cleared.
 73 */
 74static inline void iwl_clear_driver_stations(struct iwl_priv *priv)
 75{
 76	unsigned long flags;
 77	struct iwl_rxon_context *ctx;
 78
 79	spin_lock_irqsave(&priv->sta_lock, flags);
 80	memset(priv->stations, 0, sizeof(priv->stations));
 81	priv->num_stations = 0;
 82
 83	priv->ucode_key_table = 0;
 84
 85	for_each_context(priv, ctx) {
 86		/*
 87		 * Remove all key information that is not stored as part
 88		 * of station information since mac80211 may not have had
 89		 * a chance to remove all the keys. When device is
 90		 * reconfigured by mac80211 after an error all keys will
 91		 * be reconfigured.
 92		 */
 93		memset(ctx->wep_keys, 0, sizeof(ctx->wep_keys));
 94		ctx->key_mapping_keys = 0;
 95	}
 96
 97	spin_unlock_irqrestore(&priv->sta_lock, flags);
 98}
 99
100static inline int iwl_sta_id(struct ieee80211_sta *sta)
101{
102	if (WARN_ON(!sta))
103		return IWL_INVALID_STATION;
104
105	return ((struct iwl_station_priv_common *)sta->drv_priv)->sta_id;
106}
107
108/**
109 * iwl_sta_id_or_broadcast - return sta_id or broadcast sta
110 * @priv: iwl priv
111 * @context: the current context
112 * @sta: mac80211 station
113 *
114 * In certain circumstances mac80211 passes a station pointer
115 * that may be %NULL, for example during TX or key setup. In
116 * that case, we need to use the broadcast station, so this
117 * inline wraps that pattern.
118 */
119static inline int iwl_sta_id_or_broadcast(struct iwl_priv *priv,
120					  struct iwl_rxon_context *context,
121					  struct ieee80211_sta *sta)
122{
123	int sta_id;
124
125	if (!sta)
126		return context->bcast_sta_id;
127
128	sta_id = iwl_sta_id(sta);
129
130	/*
131	 * mac80211 should not be passing a partially
132	 * initialised station!
133	 */
134	WARN_ON(sta_id == IWL_INVALID_STATION);
135
136	return sta_id;
137}
138#endif /* __iwl_sta_h__ */