aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/mvm/sta.h
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2013-01-24 08:25:36 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-02-01 05:27:15 -0500
commit8ca151b568b67a7b72dcfc6ee6ea7c107ddd795c (patch)
treedac0236038f3791140e9f864c5db2be873c568f0 /drivers/net/wireless/iwlwifi/mvm/sta.h
parentb1e1adfa7d30cd0e8ad9a5c6a89e8c45ebe084f4 (diff)
iwlwifi: add the MVM driver
Newer firmware revisions have a completely new firmware API. This is the new driver for this new API. I've listed the people who directly contributed code, but many others from various teams have contributed in other ways. Cc: Alexander Bondar <alexander.bondar@intel.com> Cc: Amit Beka <amit.beka@intel.com> Cc: Amnon Paz <amnonx.paz@intel.com> Cc: Assaf Krauss <assaf.krauss@intel.com> Cc: David Spinadel <david.spinadel@intel.com> Cc: Dor Shaish <dor.shaish@intel.com> Cc: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Cc: Eytan Lifshitz <eytan.lifshitz@intel.com> Cc: Ilan Peer <ilan.peer@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm/sta.h')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/sta.h368
1 files changed, 368 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/sta.h b/drivers/net/wireless/iwlwifi/mvm/sta.h
new file mode 100644
index 000000000000..1bf301097984
--- /dev/null
+++ b/drivers/net/wireless/iwlwifi/mvm/sta.h
@@ -0,0 +1,368 @@
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 *
8 * Copyright(c) 2012 - 2013 Intel Corporation. All rights reserved.
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 *
33 * Copyright(c) 2012 - 2013 Intel Corporation. All rights reserved.
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
64#ifndef __sta_h__
65#define __sta_h__
66
67#include <linux/spinlock.h>
68#include <net/mac80211.h>
69#include <linux/wait.h>
70
71#include "iwl-trans.h" /* for IWL_MAX_TID_COUNT */
72#include "fw-api.h" /* IWL_MVM_STATION_COUNT */
73#include "rs.h"
74
75struct iwl_mvm;
76
77/**
78 * DOC: station table - introduction
79 *
80 * The station table is a list of data structure that reprensent the stations.
81 * In STA/P2P client mode, the driver will hold one station for the AP/ GO.
82 * In GO/AP mode, the driver will have as many stations as associated clients.
83 * All these stations are reflected in the fw's station table. The driver
84 * keeps the fw's station table up to date with the ADD_STA command. Stations
85 * can be removed by the REMOVE_STA command.
86 *
87 * All the data related to a station is held in the structure %iwl_mvm_sta
88 * which is embed in the mac80211's %ieee80211_sta (in the drv_priv) area.
89 * This data includes the index of the station in the fw, per tid information
90 * (sequence numbers, Block-ack state machine, etc...). The stations are
91 * created and deleted by the %sta_state callback from %ieee80211_ops.
92 *
93 * The driver holds a map: %fw_id_to_mac_id that allows to fetch a
94 * %ieee80211_sta (and the %iwl_mvm_sta embedded into it) based on a fw
95 * station index. That way, the driver is able to get the tid related data in
96 * O(1) in time sensitive paths (Tx / Tx response / BA notification). These
97 * paths are triggered by the fw, and the driver needs to get a pointer to the
98 * %ieee80211 structure. This map helps to get that pointer quickly.
99 */
100
101/**
102 * DOC: station table - locking
103 *
104 * As stated before, the station is created / deleted by mac80211's %sta_state
105 * callback from %ieee80211_ops which can sleep. The next paragraph explains
106 * the locking of a single stations, the next ones relates to the station
107 * table.
108 *
109 * The station holds the sequence number per tid. So this data needs to be
110 * accessed in the Tx path (which is softIRQ). It also holds the Block-Ack
111 * information (the state machine / and the logic that checks if the queues
112 * were drained), so it also needs to be accessible from the Tx response flow.
113 * In short, the station needs to be access from sleepable context as well as
114 * from tasklets, so the station itself needs a spinlock.
115 *
116 * The writers of %fw_id_to_mac_id map are serialized by the global mutex of
117 * the mvm op_mode. This is possible since %sta_state can sleep.
118 * The pointers in this map are RCU protected, hence we won't replace the
119 * station while we have Tx / Tx response / BA notification running.
120 *
121 * If a station is deleted while it still has packets in its A-MPDU queues,
122 * then the reclaim flow will notice that there is no station in the map for
123 * sta_id and it will dump the responses.
124 */
125
126/**
127 * DOC: station table - internal stations
128 *
129 * The FW needs a few internal stations that are not reflected in
130 * mac80211, such as broadcast station in AP / GO mode, or AUX sta for
131 * scanning and P2P device (during the GO negotiation).
132 * For these kind of stations we have %iwl_mvm_int_sta struct which holds the
133 * data relevant for them from both %iwl_mvm_sta and %ieee80211_sta.
134 * Usually the data for these stations is static, so no locking is required,
135 * and no TID data as this is also not needed.
136 * One thing to note, is that these stations have an ID in the fw, but not
137 * in mac80211. In order to "reserve" them a sta_id in %fw_id_to_mac_id
138 * we fill ERR_PTR(EINVAL) in this mapping and all other dereferencing of
139 * pointers from this mapping need to check that the value is not error
140 * or NULL.
141 *
142 * Currently there is only one auxiliary station for scanning, initialized
143 * on init.
144 */
145
146/**
147 * DOC: station table - AP Station in STA mode
148 *
149 * %iwl_mvm_vif includes the index of the AP station in the fw's STA table:
150 * %ap_sta_id. To get the point to the coresponsding %ieee80211_sta,
151 * &fw_id_to_mac_id can be used. Due to the way the fw works, we must not remove
152 * the AP station from the fw before setting the MAC context as unassociated.
153 * Hence, %fw_id_to_mac_id[%ap_sta_id] will be NULLed when the AP station is
154 * removed by mac80211, but the station won't be removed in the fw until the
155 * VIF is set as unassociated. Then, %ap_sta_id will be invalidated.
156 */
157
158/**
159 * DOC: station table - Drain vs. Flush
160 *
161 * Flush means that all the frames in the SCD queue are dumped regardless the
162 * station to which they were sent. We do that when we disassociate and before
163 * we remove the STA of the AP. The flush can be done synchronously against the
164 * fw.
165 * Drain means that the fw will drop all the frames sent to a specific station.
166 * This is useful when a client (if we are IBSS / GO or AP) disassociates. In
167 * that case, we need to drain all the frames for that client from the AC queues
168 * that are shared with the other clients. Only then, we can remove the STA in
169 * the fw. In order to do so, we track the non-AMPDU packets for each station.
170 * If mac80211 removes a STA and if it still has non-AMPDU packets pending in
171 * the queues, we mark this station as %EBUSY in %fw_id_to_mac_id, and drop all
172 * the frames for this STA (%iwl_mvm_rm_sta). When the last frame is dropped
173 * (we know about it with its Tx response), we remove the station in fw and set
174 * it as %NULL in %fw_id_to_mac_id: this is the purpose of
175 * %iwl_mvm_sta_drained_wk.
176 */
177
178/**
179 * DOC: station table - fw restart
180 *
181 * When the fw asserts, or we have any other issue that requires to reset the
182 * driver, we require mac80211 to reconfigure the driver. Since the private
183 * data of the stations is embed in mac80211's %ieee80211_sta, that data will
184 * not be zeroed and needs to be reinitialized manually.
185 * %IWL_MVM_STATUS_IN_HW_RESTART is set during restart and that will hint us
186 * that we must not allocate a new sta_id but reuse the previous one. This
187 * means that the stations being re-added after the reset will have the same
188 * place in the fw as before the reset. We do need to zero the %fw_id_to_mac_id
189 * map, since the stations aren't in the fw any more. Internal stations that
190 * are not added by mac80211 will be re-added in the init flow that is called
191 * after the restart: mac80211 call's %iwl_mvm_mac_start which calls to
192 * %iwl_mvm_up.
193 */
194
195/**
196 * DOC: AP mode - PS
197 *
198 * When a station is asleep, the fw will set it as "asleep". All the
199 * non-aggregation frames to that station will be dropped by the fw
200 * (%TX_STATUS_FAIL_DEST_PS failure code).
201 * AMPDUs are in a separate queue that is stopped by the fw. We just need to
202 * let mac80211 know how many frames we have in these queues so that it can
203 * properly handle trigger frames.
204 * When the a trigger frame is received, mac80211 tells the driver to send
205 * frames from the AMPDU queues or AC queue depending on which queue are
206 * delivery-enabled and what TID has frames to transmit (Note that mac80211 has
207 * all the knowledege since all the non-agg frames are buffered / filtered, and
208 * the driver tells mac80211 about agg frames). The driver needs to tell the fw
209 * to let frames out even if the station is asleep. This is done by
210 * %iwl_mvm_sta_modify_sleep_tx_count.
211 * When we receive a frame from that station with PM bit unset, the
212 * driver needs to let the fw know that this station isn't alseep any more.
213 * This is done by %iwl_mvm_sta_modify_ps_wake.
214 *
215 * TODO - EOSP handling
216 */
217
218/**
219 * enum iwl_mvm_agg_state
220 *
221 * The state machine of the BA agreement establishment / tear down.
222 * These states relate to a specific RA / TID.
223 *
224 * @IWL_AGG_OFF: aggregation is not used
225 * @IWL_AGG_STARTING: aggregation are starting (between start and oper)
226 * @IWL_AGG_ON: aggregation session is up
227 * @IWL_EMPTYING_HW_QUEUE_ADDBA: establishing a BA session - waiting for the
228 * HW queue to be empty from packets for this RA /TID.
229 * @IWL_EMPTYING_HW_QUEUE_DELBA: tearing down a BA session - waiting for the
230 * HW queue to be empty from packets for this RA /TID.
231 */
232enum iwl_mvm_agg_state {
233 IWL_AGG_OFF = 0,
234 IWL_AGG_STARTING,
235 IWL_AGG_ON,
236 IWL_EMPTYING_HW_QUEUE_ADDBA,
237 IWL_EMPTYING_HW_QUEUE_DELBA,
238};
239
240/**
241 * struct iwl_mvm_tid_data - holds the states for each RA / TID
242 * @seq_number: the next WiFi sequence number to use
243 * @next_reclaimed: the WiFi sequence number of the next packet to be acked.
244 * This is basically (last acked packet++).
245 * @rate_n_flags: Rate at which Tx was attempted. Holds the data between the
246 * Tx response (TX_CMD), and the block ack notification (COMPRESSED_BA).
247 * @state: state of the BA agreement establishment / tear down.
248 * @txq_id: Tx queue used by the BA session
249 * @ssn: the first packet to be sent in AGG HW queue in Tx AGG start flow, or
250 * the first packet to be sent in legacy HW queue in Tx AGG stop flow.
251 * Basically when next_reclaimed reaches ssn, we can tell mac80211 that
252 * we are ready to finish the Tx AGG stop / start flow.
253 * @wait_for_ba: Expect block-ack before next Tx reply
254 */
255struct iwl_mvm_tid_data {
256 u16 seq_number;
257 u16 next_reclaimed;
258 /* The rest is Tx AGG related */
259 u32 rate_n_flags;
260 enum iwl_mvm_agg_state state;
261 u16 txq_id;
262 u16 ssn;
263 bool wait_for_ba;
264};
265
266/**
267 * struct iwl_mvm_sta - representation of a station in the driver
268 * @sta_id: the index of the station in the fw (will be replaced by id_n_color)
269 * @tfd_queue_msk: the tfd queues used by the station
270 * @mac_id_n_color: the MAC context this station is linked to
271 * @tid_disable_agg: bitmap: if bit(tid) is set, the fw won't send ampdus for
272 * tid.
273 * @max_agg_bufsize: the maximal size of the AGG buffer for this station
274 * @lock: lock to protect the whole struct. Since %tid_data is access from Tx
275 * and from Tx response flow, it needs a spinlock.
276 * @pending_frames: number of frames for this STA on the shared Tx queues.
277 * @tid_data: per tid data. Look at %iwl_mvm_tid_data.
278 *
279 * When mac80211 creates a station it reserves some space (hw->sta_data_size)
280 * in the structure for use by driver. This structure is placed in that
281 * space.
282 *
283 */
284struct iwl_mvm_sta {
285 u32 sta_id;
286 u32 tfd_queue_msk;
287 u32 mac_id_n_color;
288 u16 tid_disable_agg;
289 u8 max_agg_bufsize;
290 spinlock_t lock;
291 atomic_t pending_frames;
292 struct iwl_mvm_tid_data tid_data[IWL_MAX_TID_COUNT];
293 struct iwl_lq_sta lq_sta;
294 struct ieee80211_vif *vif;
295
296#ifdef CONFIG_PM_SLEEP
297 u16 last_seq_ctl;
298#endif
299};
300
301/**
302 * struct iwl_mvm_int_sta - representation of an internal station (auxiliary or
303 * broadcast)
304 * @sta_id: the index of the station in the fw (will be replaced by id_n_color)
305 * @tfd_queue_msk: the tfd queues used by the station
306 */
307struct iwl_mvm_int_sta {
308 u32 sta_id;
309 u32 tfd_queue_msk;
310};
311
312int iwl_mvm_sta_add_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta);
313int iwl_mvm_add_sta(struct iwl_mvm *mvm,
314 struct ieee80211_vif *vif,
315 struct ieee80211_sta *sta);
316int iwl_mvm_rm_sta(struct iwl_mvm *mvm,
317 struct ieee80211_vif *vif,
318 struct ieee80211_sta *sta);
319int iwl_mvm_rm_sta_id(struct iwl_mvm *mvm,
320 struct ieee80211_vif *vif,
321 u8 sta_id);
322int iwl_mvm_set_sta_key(struct iwl_mvm *mvm,
323 struct ieee80211_vif *vif,
324 struct ieee80211_sta *sta,
325 struct ieee80211_key_conf *key,
326 bool have_key_offset);
327int iwl_mvm_remove_sta_key(struct iwl_mvm *mvm,
328 struct ieee80211_vif *vif,
329 struct ieee80211_sta *sta,
330 struct ieee80211_key_conf *keyconf);
331
332void iwl_mvm_update_tkip_key(struct iwl_mvm *mvm,
333 struct ieee80211_vif *vif,
334 struct ieee80211_key_conf *keyconf,
335 struct ieee80211_sta *sta, u32 iv32,
336 u16 *phase1key);
337
338/* AMPDU */
339int iwl_mvm_sta_rx_agg(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
340 int tid, u16 ssn, bool start);
341int iwl_mvm_sta_tx_agg_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
342 struct ieee80211_sta *sta, u16 tid, u16 *ssn);
343int iwl_mvm_sta_tx_agg_oper(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
344 struct ieee80211_sta *sta, u16 tid, u8 buf_size);
345int iwl_mvm_sta_tx_agg_stop(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
346 struct ieee80211_sta *sta, u16 tid);
347
348int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm);
349int iwl_mvm_allocate_int_sta(struct iwl_mvm *mvm, struct iwl_mvm_int_sta *sta,
350 u32 qmask);
351void iwl_mvm_dealloc_int_sta(struct iwl_mvm *mvm,
352 struct iwl_mvm_int_sta *sta);
353int iwl_mvm_send_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
354 struct iwl_mvm_int_sta *bsta);
355int iwl_mvm_send_rm_bcast_sta(struct iwl_mvm *mvm,
356 struct iwl_mvm_int_sta *bsta);
357int iwl_mvm_add_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
358 struct iwl_mvm_int_sta *bsta);
359int iwl_mvm_rm_bcast_sta(struct iwl_mvm *mvm, struct iwl_mvm_int_sta *bsta);
360void iwl_mvm_sta_drained_wk(struct work_struct *wk);
361void iwl_mvm_sta_modify_ps_wake(struct iwl_mvm *mvm, int sta_id);
362void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm, int sta_id,
363 enum ieee80211_frame_release_type reason,
364 u16 cnt);
365int iwl_mvm_drain_sta(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
366 bool drain);
367
368#endif /* __sta_h__ */