diff options
Diffstat (limited to 'include/net/mac80211.h')
-rw-r--r-- | include/net/mac80211.h | 482 |
1 files changed, 262 insertions, 220 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 9083bafb63ca..5ab6a350ee6d 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -38,7 +38,11 @@ | |||
38 | * called in hardware interrupt context. The low-level driver must not call any | 38 | * called in hardware interrupt context. The low-level driver must not call any |
39 | * other functions in hardware interrupt context. If there is a need for such | 39 | * other functions in hardware interrupt context. If there is a need for such |
40 | * call, the low-level driver should first ACK the interrupt and perform the | 40 | * call, the low-level driver should first ACK the interrupt and perform the |
41 | * IEEE 802.11 code call after this, e.g. from a scheduled workqueue function. | 41 | * IEEE 802.11 code call after this, e.g. from a scheduled workqueue or even |
42 | * tasklet function. | ||
43 | * | ||
44 | * NOTE: If the driver opts to use the _irqsafe() functions, it may not also | ||
45 | * use the non-irqsafe functions! | ||
42 | */ | 46 | */ |
43 | 47 | ||
44 | /** | 48 | /** |
@@ -69,95 +73,6 @@ | |||
69 | * not do so then mac80211 may add this under certain circumstances. | 73 | * not do so then mac80211 may add this under certain circumstances. |
70 | */ | 74 | */ |
71 | 75 | ||
72 | #define IEEE80211_CHAN_W_SCAN 0x00000001 | ||
73 | #define IEEE80211_CHAN_W_ACTIVE_SCAN 0x00000002 | ||
74 | #define IEEE80211_CHAN_W_IBSS 0x00000004 | ||
75 | |||
76 | /* Channel information structure. Low-level driver is expected to fill in chan, | ||
77 | * freq, and val fields. Other fields will be filled in by 80211.o based on | ||
78 | * hostapd information and low-level driver does not need to use them. The | ||
79 | * limits for each channel will be provided in 'struct ieee80211_conf' when | ||
80 | * configuring the low-level driver with hw->config callback. If a device has | ||
81 | * a default regulatory domain, IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED | ||
82 | * can be set to let the driver configure all fields */ | ||
83 | struct ieee80211_channel { | ||
84 | short chan; /* channel number (IEEE 802.11) */ | ||
85 | short freq; /* frequency in MHz */ | ||
86 | int val; /* hw specific value for the channel */ | ||
87 | int flag; /* flag for hostapd use (IEEE80211_CHAN_*) */ | ||
88 | unsigned char power_level; | ||
89 | unsigned char antenna_max; | ||
90 | }; | ||
91 | |||
92 | #define IEEE80211_RATE_ERP 0x00000001 | ||
93 | #define IEEE80211_RATE_BASIC 0x00000002 | ||
94 | #define IEEE80211_RATE_PREAMBLE2 0x00000004 | ||
95 | #define IEEE80211_RATE_SUPPORTED 0x00000010 | ||
96 | #define IEEE80211_RATE_OFDM 0x00000020 | ||
97 | #define IEEE80211_RATE_CCK 0x00000040 | ||
98 | #define IEEE80211_RATE_MANDATORY 0x00000100 | ||
99 | |||
100 | #define IEEE80211_RATE_CCK_2 (IEEE80211_RATE_CCK | IEEE80211_RATE_PREAMBLE2) | ||
101 | #define IEEE80211_RATE_MODULATION(f) \ | ||
102 | (f & (IEEE80211_RATE_CCK | IEEE80211_RATE_OFDM)) | ||
103 | |||
104 | /* Low-level driver should set PREAMBLE2, OFDM and CCK flags. | ||
105 | * BASIC, SUPPORTED, ERP, and MANDATORY flags are set in 80211.o based on the | ||
106 | * configuration. */ | ||
107 | struct ieee80211_rate { | ||
108 | int rate; /* rate in 100 kbps */ | ||
109 | int val; /* hw specific value for the rate */ | ||
110 | int flags; /* IEEE80211_RATE_ flags */ | ||
111 | int val2; /* hw specific value for the rate when using short preamble | ||
112 | * (only when IEEE80211_RATE_PREAMBLE2 flag is set, i.e., for | ||
113 | * 2, 5.5, and 11 Mbps) */ | ||
114 | signed char min_rssi_ack; | ||
115 | unsigned char min_rssi_ack_delta; | ||
116 | |||
117 | /* following fields are set by 80211.o and need not be filled by the | ||
118 | * low-level driver */ | ||
119 | int rate_inv; /* inverse of the rate (LCM(all rates) / rate) for | ||
120 | * optimizing channel utilization estimates */ | ||
121 | }; | ||
122 | |||
123 | /** | ||
124 | * enum ieee80211_phymode - PHY modes | ||
125 | * | ||
126 | * @MODE_IEEE80211A: 5GHz as defined by 802.11a/802.11h | ||
127 | * @MODE_IEEE80211B: 2.4 GHz as defined by 802.11b | ||
128 | * @MODE_IEEE80211G: 2.4 GHz as defined by 802.11g (with OFDM), | ||
129 | * backwards compatible with 11b mode | ||
130 | * @NUM_IEEE80211_MODES: internal | ||
131 | */ | ||
132 | enum ieee80211_phymode { | ||
133 | MODE_IEEE80211A, | ||
134 | MODE_IEEE80211B, | ||
135 | MODE_IEEE80211G, | ||
136 | |||
137 | /* keep last */ | ||
138 | NUM_IEEE80211_MODES | ||
139 | }; | ||
140 | |||
141 | /** | ||
142 | * struct ieee80211_ht_info - describing STA's HT capabilities | ||
143 | * | ||
144 | * This structure describes most essential parameters needed | ||
145 | * to describe 802.11n HT capabilities for an STA. | ||
146 | * | ||
147 | * @ht_supported: is HT supported by STA, 0: no, 1: yes | ||
148 | * @cap: HT capabilities map as described in 802.11n spec | ||
149 | * @ampdu_factor: Maximum A-MPDU length factor | ||
150 | * @ampdu_density: Minimum A-MPDU spacing | ||
151 | * @supp_mcs_set: Supported MCS set as described in 802.11n spec | ||
152 | */ | ||
153 | struct ieee80211_ht_info { | ||
154 | u8 ht_supported; | ||
155 | u16 cap; /* use IEEE80211_HT_CAP_ */ | ||
156 | u8 ampdu_factor; | ||
157 | u8 ampdu_density; | ||
158 | u8 supp_mcs_set[16]; | ||
159 | }; | ||
160 | |||
161 | /** | 76 | /** |
162 | * struct ieee80211_ht_bss_info - describing BSS's HT characteristics | 77 | * struct ieee80211_ht_bss_info - describing BSS's HT characteristics |
163 | * | 78 | * |
@@ -175,46 +90,22 @@ struct ieee80211_ht_bss_info { | |||
175 | }; | 90 | }; |
176 | 91 | ||
177 | /** | 92 | /** |
178 | * struct ieee80211_hw_mode - PHY mode definition | ||
179 | * | ||
180 | * This structure describes the capabilities supported by the device | ||
181 | * in a single PHY mode. | ||
182 | * | ||
183 | * @list: internal | ||
184 | * @channels: pointer to array of supported channels | ||
185 | * @rates: pointer to array of supported bitrates | ||
186 | * @mode: the PHY mode for this definition | ||
187 | * @num_channels: number of supported channels | ||
188 | * @num_rates: number of supported bitrates | ||
189 | * @ht_info: PHY's 802.11n HT abilities for this mode | ||
190 | */ | ||
191 | struct ieee80211_hw_mode { | ||
192 | struct list_head list; | ||
193 | struct ieee80211_channel *channels; | ||
194 | struct ieee80211_rate *rates; | ||
195 | enum ieee80211_phymode mode; | ||
196 | int num_channels; | ||
197 | int num_rates; | ||
198 | struct ieee80211_ht_info ht_info; | ||
199 | }; | ||
200 | |||
201 | /** | ||
202 | * struct ieee80211_tx_queue_params - transmit queue configuration | 93 | * struct ieee80211_tx_queue_params - transmit queue configuration |
203 | * | 94 | * |
204 | * The information provided in this structure is required for QoS | 95 | * The information provided in this structure is required for QoS |
205 | * transmit queue configuration. | 96 | * transmit queue configuration. Cf. IEEE 802.11 7.3.2.29. |
206 | * | 97 | * |
207 | * @aifs: arbitration interface space [0..255, -1: use default] | 98 | * @aifs: arbitration interface space [0..255, -1: use default] |
208 | * @cw_min: minimum contention window [will be a value of the form | 99 | * @cw_min: minimum contention window [will be a value of the form |
209 | * 2^n-1 in the range 1..1023; 0: use default] | 100 | * 2^n-1 in the range 1..1023; 0: use default] |
210 | * @cw_max: maximum contention window [like @cw_min] | 101 | * @cw_max: maximum contention window [like @cw_min] |
211 | * @burst_time: maximum burst time in units of 0.1ms, 0 meaning disabled | 102 | * @txop: maximum burst time in units of 32 usecs, 0 meaning disabled |
212 | */ | 103 | */ |
213 | struct ieee80211_tx_queue_params { | 104 | struct ieee80211_tx_queue_params { |
214 | int aifs; | 105 | s16 aifs; |
215 | int cw_min; | 106 | u16 cw_min; |
216 | int cw_max; | 107 | u16 cw_max; |
217 | int burst_time; | 108 | u16 txop; |
218 | }; | 109 | }; |
219 | 110 | ||
220 | /** | 111 | /** |
@@ -246,6 +137,7 @@ struct ieee80211_tx_queue_stats_data { | |||
246 | * @IEEE80211_TX_QUEUE_AFTER_BEACON: transmit queue for frames to be | 137 | * @IEEE80211_TX_QUEUE_AFTER_BEACON: transmit queue for frames to be |
247 | * sent after a beacon | 138 | * sent after a beacon |
248 | * @IEEE80211_TX_QUEUE_BEACON: transmit queue for beacon frames | 139 | * @IEEE80211_TX_QUEUE_BEACON: transmit queue for beacon frames |
140 | * @NUM_TX_DATA_QUEUES_AMPDU: adding more queues for A-MPDU | ||
249 | */ | 141 | */ |
250 | enum ieee80211_tx_queue { | 142 | enum ieee80211_tx_queue { |
251 | IEEE80211_TX_QUEUE_DATA0, | 143 | IEEE80211_TX_QUEUE_DATA0, |
@@ -261,11 +153,12 @@ enum ieee80211_tx_queue { | |||
261 | * this struct need to have fixed values. As soon as it is removed, we can | 153 | * this struct need to have fixed values. As soon as it is removed, we can |
262 | * fix these entries. */ | 154 | * fix these entries. */ |
263 | IEEE80211_TX_QUEUE_AFTER_BEACON = 6, | 155 | IEEE80211_TX_QUEUE_AFTER_BEACON = 6, |
264 | IEEE80211_TX_QUEUE_BEACON = 7 | 156 | IEEE80211_TX_QUEUE_BEACON = 7, |
157 | NUM_TX_DATA_QUEUES_AMPDU = 16 | ||
265 | }; | 158 | }; |
266 | 159 | ||
267 | struct ieee80211_tx_queue_stats { | 160 | struct ieee80211_tx_queue_stats { |
268 | struct ieee80211_tx_queue_stats_data data[NUM_TX_DATA_QUEUES]; | 161 | struct ieee80211_tx_queue_stats_data data[NUM_TX_DATA_QUEUES_AMPDU]; |
269 | }; | 162 | }; |
270 | 163 | ||
271 | struct ieee80211_low_level_stats { | 164 | struct ieee80211_low_level_stats { |
@@ -312,63 +205,88 @@ struct ieee80211_bss_conf { | |||
312 | bool use_short_preamble; | 205 | bool use_short_preamble; |
313 | }; | 206 | }; |
314 | 207 | ||
208 | /** | ||
209 | * enum mac80211_tx_control_flags - flags to describe Tx configuration for | ||
210 | * the Tx frame | ||
211 | * | ||
212 | * These flags are used with the @flags member of &ieee80211_tx_control | ||
213 | * | ||
214 | * @IEEE80211_TXCTL_REQ_TX_STATUS: request TX status callback for this frame. | ||
215 | * @IEEE80211_TXCTL_DO_NOT_ENCRYPT: send this frame without encryption; | ||
216 | * e.g., for EAPOL frame | ||
217 | * @IEEE80211_TXCTL_USE_RTS_CTS: use RTS-CTS before sending frame | ||
218 | * @IEEE80211_TXCTL_USE_CTS_PROTECT: use CTS protection for the frame (e.g., | ||
219 | * for combined 802.11g / 802.11b networks) | ||
220 | * @IEEE80211_TXCTL_NO_ACK: tell the low level not to wait for an ack | ||
221 | * @IEEE80211_TXCTL_RATE_CTRL_PROBE | ||
222 | * @EEE80211_TXCTL_CLEAR_PS_FILT: clear powersave filter | ||
223 | * for destination station | ||
224 | * @IEEE80211_TXCTL_REQUEUE: | ||
225 | * @IEEE80211_TXCTL_FIRST_FRAGMENT: this is a first fragment of the frame | ||
226 | * @IEEE80211_TXCTL_LONG_RETRY_LIMIT: this frame should be send using the | ||
227 | * through set_retry_limit configured long | ||
228 | * retry value | ||
229 | * @IEEE80211_TXCTL_EAPOL_FRAME: internal to mac80211 | ||
230 | * @IEEE80211_TXCTL_SEND_AFTER_DTIM: send this frame after DTIM beacon | ||
231 | * @IEEE80211_TXCTL_AMPDU: this frame should be sent as part of an A-MPDU | ||
232 | * @IEEE80211_TXCTL_OFDM_HT: this frame can be sent in HT OFDM rates. number | ||
233 | * of streams when this flag is on can be extracted | ||
234 | * from antenna_sel_tx, so if 1 antenna is marked | ||
235 | * use SISO, 2 antennas marked use MIMO, n antennas | ||
236 | * marked use MIMO_n. | ||
237 | * @IEEE80211_TXCTL_GREEN_FIELD: use green field protection for this frame | ||
238 | * @IEEE80211_TXCTL_40_MHZ_WIDTH: send this frame using 40 Mhz channel width | ||
239 | * @IEEE80211_TXCTL_DUP_DATA: duplicate data frame on both 20 Mhz channels | ||
240 | * @IEEE80211_TXCTL_SHORT_GI: send this frame using short guard interval | ||
241 | */ | ||
242 | enum mac80211_tx_control_flags { | ||
243 | IEEE80211_TXCTL_REQ_TX_STATUS = (1<<0), | ||
244 | IEEE80211_TXCTL_DO_NOT_ENCRYPT = (1<<1), | ||
245 | IEEE80211_TXCTL_USE_RTS_CTS = (1<<2), | ||
246 | IEEE80211_TXCTL_USE_CTS_PROTECT = (1<<3), | ||
247 | IEEE80211_TXCTL_NO_ACK = (1<<4), | ||
248 | IEEE80211_TXCTL_RATE_CTRL_PROBE = (1<<5), | ||
249 | IEEE80211_TXCTL_CLEAR_PS_FILT = (1<<6), | ||
250 | IEEE80211_TXCTL_REQUEUE = (1<<7), | ||
251 | IEEE80211_TXCTL_FIRST_FRAGMENT = (1<<8), | ||
252 | IEEE80211_TXCTL_SHORT_PREAMBLE = (1<<9), | ||
253 | IEEE80211_TXCTL_LONG_RETRY_LIMIT = (1<<10), | ||
254 | IEEE80211_TXCTL_EAPOL_FRAME = (1<<11), | ||
255 | IEEE80211_TXCTL_SEND_AFTER_DTIM = (1<<12), | ||
256 | IEEE80211_TXCTL_AMPDU = (1<<13), | ||
257 | IEEE80211_TXCTL_OFDM_HT = (1<<14), | ||
258 | IEEE80211_TXCTL_GREEN_FIELD = (1<<15), | ||
259 | IEEE80211_TXCTL_40_MHZ_WIDTH = (1<<16), | ||
260 | IEEE80211_TXCTL_DUP_DATA = (1<<17), | ||
261 | IEEE80211_TXCTL_SHORT_GI = (1<<18), | ||
262 | }; | ||
263 | |||
315 | /* Transmit control fields. This data structure is passed to low-level driver | 264 | /* Transmit control fields. This data structure is passed to low-level driver |
316 | * with each TX frame. The low-level driver is responsible for configuring | 265 | * with each TX frame. The low-level driver is responsible for configuring |
317 | * the hardware to use given values (depending on what is supported). */ | 266 | * the hardware to use given values (depending on what is supported). */ |
318 | 267 | ||
319 | struct ieee80211_tx_control { | 268 | struct ieee80211_tx_control { |
320 | struct ieee80211_vif *vif; | 269 | struct ieee80211_vif *vif; |
321 | int tx_rate; /* Transmit rate, given as the hw specific value for the | 270 | struct ieee80211_rate *tx_rate; |
322 | * rate (from struct ieee80211_rate) */ | 271 | |
323 | int rts_cts_rate; /* Transmit rate for RTS/CTS frame, given as the hw | 272 | /* Transmit rate for RTS/CTS frame */ |
324 | * specific value for the rate (from | 273 | struct ieee80211_rate *rts_cts_rate; |
325 | * struct ieee80211_rate) */ | 274 | |
326 | 275 | /* retry rate for the last retries */ | |
327 | #define IEEE80211_TXCTL_REQ_TX_STATUS (1<<0)/* request TX status callback for | 276 | struct ieee80211_rate *alt_retry_rate; |
328 | * this frame */ | 277 | |
329 | #define IEEE80211_TXCTL_DO_NOT_ENCRYPT (1<<1) /* send this frame without | 278 | u32 flags; /* tx control flags defined above */ |
330 | * encryption; e.g., for EAPOL | ||
331 | * frames */ | ||
332 | #define IEEE80211_TXCTL_USE_RTS_CTS (1<<2) /* use RTS-CTS before sending | ||
333 | * frame */ | ||
334 | #define IEEE80211_TXCTL_USE_CTS_PROTECT (1<<3) /* use CTS protection for the | ||
335 | * frame (e.g., for combined | ||
336 | * 802.11g / 802.11b networks) */ | ||
337 | #define IEEE80211_TXCTL_NO_ACK (1<<4) /* tell the low level not to | ||
338 | * wait for an ack */ | ||
339 | #define IEEE80211_TXCTL_RATE_CTRL_PROBE (1<<5) | ||
340 | #define IEEE80211_TXCTL_CLEAR_DST_MASK (1<<6) | ||
341 | #define IEEE80211_TXCTL_REQUEUE (1<<7) | ||
342 | #define IEEE80211_TXCTL_FIRST_FRAGMENT (1<<8) /* this is a first fragment of | ||
343 | * the frame */ | ||
344 | #define IEEE80211_TXCTL_LONG_RETRY_LIMIT (1<<10) /* this frame should be send | ||
345 | * using the through | ||
346 | * set_retry_limit configured | ||
347 | * long retry value */ | ||
348 | #define IEEE80211_TXCTL_EAPOL_FRAME (1<<11) /* internal to mac80211 */ | ||
349 | #define IEEE80211_TXCTL_SEND_AFTER_DTIM (1<<12) /* send this frame after DTIM | ||
350 | * beacon */ | ||
351 | u32 flags; /* tx control flags defined | ||
352 | * above */ | ||
353 | u8 key_idx; /* keyidx from hw->set_key(), undefined if | 279 | u8 key_idx; /* keyidx from hw->set_key(), undefined if |
354 | * IEEE80211_TXCTL_DO_NOT_ENCRYPT is set */ | 280 | * IEEE80211_TXCTL_DO_NOT_ENCRYPT is set */ |
355 | u8 retry_limit; /* 1 = only first attempt, 2 = one retry, .. | 281 | u8 retry_limit; /* 1 = only first attempt, 2 = one retry, .. |
356 | * This could be used when set_retry_limit | 282 | * This could be used when set_retry_limit |
357 | * is not implemented by the driver */ | 283 | * is not implemented by the driver */ |
358 | u8 power_level; /* per-packet transmit power level, in dBm */ | 284 | u8 antenna_sel_tx; /* 0 = default/diversity, otherwise bit |
359 | u8 antenna_sel_tx; /* 0 = default/diversity, 1 = Ant0, 2 = Ant1 */ | 285 | * position represents antenna number used */ |
360 | u8 icv_len; /* length of the ICV/MIC field in octets */ | 286 | u8 icv_len; /* length of the ICV/MIC field in octets */ |
361 | u8 iv_len; /* length of the IV field in octets */ | 287 | u8 iv_len; /* length of the IV field in octets */ |
362 | u8 queue; /* hardware queue to use for this frame; | 288 | u8 queue; /* hardware queue to use for this frame; |
363 | * 0 = highest, hw->queues-1 = lowest */ | 289 | * 0 = highest, hw->queues-1 = lowest */ |
364 | struct ieee80211_rate *rate; /* internal 80211.o rate */ | ||
365 | struct ieee80211_rate *rts_rate; /* internal 80211.o rate | ||
366 | * for RTS/CTS */ | ||
367 | int alt_retry_rate; /* retry rate for the last retries, given as the | ||
368 | * hw specific value for the rate (from | ||
369 | * struct ieee80211_rate). To be used to limit | ||
370 | * packet dropping when probing higher rates, if hw | ||
371 | * supports multiple retry rates. -1 = not used */ | ||
372 | int type; /* internal */ | 290 | int type; /* internal */ |
373 | }; | 291 | }; |
374 | 292 | ||
@@ -391,7 +309,8 @@ struct ieee80211_tx_control { | |||
391 | * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on | 309 | * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on |
392 | * the frame. | 310 | * the frame. |
393 | * @RX_FLAG_TSFT: The timestamp passed in the RX status (@mactime field) | 311 | * @RX_FLAG_TSFT: The timestamp passed in the RX status (@mactime field) |
394 | * is valid. | 312 | * is valid. This is useful in monitor mode and necessary for beacon frames |
313 | * to enable IBSS merging. | ||
395 | */ | 314 | */ |
396 | enum mac80211_rx_flags { | 315 | enum mac80211_rx_flags { |
397 | RX_FLAG_MMIC_ERROR = 1<<0, | 316 | RX_FLAG_MMIC_ERROR = 1<<0, |
@@ -410,27 +329,26 @@ enum mac80211_rx_flags { | |||
410 | * The low-level driver should provide this information (the subset | 329 | * The low-level driver should provide this information (the subset |
411 | * supported by hardware) to the 802.11 code with each received | 330 | * supported by hardware) to the 802.11 code with each received |
412 | * frame. | 331 | * frame. |
413 | * @mactime: MAC timestamp as defined by 802.11 | 332 | * @mactime: value in microseconds of the 64-bit Time Synchronization Function |
333 | * (TSF) timer when the first data symbol (MPDU) arrived at the hardware. | ||
334 | * @band: the active band when this frame was received | ||
414 | * @freq: frequency the radio was tuned to when receiving this frame, in MHz | 335 | * @freq: frequency the radio was tuned to when receiving this frame, in MHz |
415 | * @channel: channel the radio was tuned to | ||
416 | * @phymode: active PHY mode | ||
417 | * @ssi: signal strength when receiving this frame | 336 | * @ssi: signal strength when receiving this frame |
418 | * @signal: used as 'qual' in statistics reporting | 337 | * @signal: used as 'qual' in statistics reporting |
419 | * @noise: PHY noise when receiving this frame | 338 | * @noise: PHY noise when receiving this frame |
420 | * @antenna: antenna used | 339 | * @antenna: antenna used |
421 | * @rate: data rate | 340 | * @rate_idx: index of data rate into band's supported rates |
422 | * @flag: %RX_FLAG_* | 341 | * @flag: %RX_FLAG_* |
423 | */ | 342 | */ |
424 | struct ieee80211_rx_status { | 343 | struct ieee80211_rx_status { |
425 | u64 mactime; | 344 | u64 mactime; |
345 | enum ieee80211_band band; | ||
426 | int freq; | 346 | int freq; |
427 | int channel; | ||
428 | enum ieee80211_phymode phymode; | ||
429 | int ssi; | 347 | int ssi; |
430 | int signal; | 348 | int signal; |
431 | int noise; | 349 | int noise; |
432 | int antenna; | 350 | int antenna; |
433 | int rate; | 351 | int rate_idx; |
434 | int flag; | 352 | int flag; |
435 | }; | 353 | }; |
436 | 354 | ||
@@ -441,12 +359,14 @@ struct ieee80211_rx_status { | |||
441 | * | 359 | * |
442 | * @IEEE80211_TX_STATUS_TX_FILTERED: The frame was not transmitted | 360 | * @IEEE80211_TX_STATUS_TX_FILTERED: The frame was not transmitted |
443 | * because the destination STA was in powersave mode. | 361 | * because the destination STA was in powersave mode. |
444 | * | ||
445 | * @IEEE80211_TX_STATUS_ACK: Frame was acknowledged | 362 | * @IEEE80211_TX_STATUS_ACK: Frame was acknowledged |
363 | * @IEEE80211_TX_STATUS_AMPDU: The frame was aggregated, so status | ||
364 | * is for the whole aggregation. | ||
446 | */ | 365 | */ |
447 | enum ieee80211_tx_status_flags { | 366 | enum ieee80211_tx_status_flags { |
448 | IEEE80211_TX_STATUS_TX_FILTERED = 1<<0, | 367 | IEEE80211_TX_STATUS_TX_FILTERED = 1<<0, |
449 | IEEE80211_TX_STATUS_ACK = 1<<1, | 368 | IEEE80211_TX_STATUS_ACK = 1<<1, |
369 | IEEE80211_TX_STATUS_AMPDU = 1<<2, | ||
450 | }; | 370 | }; |
451 | 371 | ||
452 | /** | 372 | /** |
@@ -457,24 +377,25 @@ enum ieee80211_tx_status_flags { | |||
457 | * | 377 | * |
458 | * @control: a copy of the &struct ieee80211_tx_control passed to the driver | 378 | * @control: a copy of the &struct ieee80211_tx_control passed to the driver |
459 | * in the tx() callback. | 379 | * in the tx() callback. |
460 | * | ||
461 | * @flags: transmit status flags, defined above | 380 | * @flags: transmit status flags, defined above |
462 | * | 381 | * @retry_count: number of retries |
463 | * @ack_signal: signal strength of the ACK frame | ||
464 | * | ||
465 | * @excessive_retries: set to 1 if the frame was retried many times | 382 | * @excessive_retries: set to 1 if the frame was retried many times |
466 | * but not acknowledged | 383 | * but not acknowledged |
467 | * | 384 | * @ampdu_ack_len: number of aggregated frames. |
468 | * @retry_count: number of retries | 385 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. |
469 | * | 386 | * @ampdu_ack_map: block ack bit map for the aggregation. |
387 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. | ||
388 | * @ack_signal: signal strength of the ACK frame | ||
470 | * @queue_length: ?? REMOVE | 389 | * @queue_length: ?? REMOVE |
471 | * @queue_number: ?? REMOVE | 390 | * @queue_number: ?? REMOVE |
472 | */ | 391 | */ |
473 | struct ieee80211_tx_status { | 392 | struct ieee80211_tx_status { |
474 | struct ieee80211_tx_control control; | 393 | struct ieee80211_tx_control control; |
475 | u8 flags; | 394 | u8 flags; |
476 | bool excessive_retries; | ||
477 | u8 retry_count; | 395 | u8 retry_count; |
396 | bool excessive_retries; | ||
397 | u8 ampdu_ack_len; | ||
398 | u64 ampdu_ack_map; | ||
478 | int ack_signal; | 399 | int ack_signal; |
479 | int queue_length; | 400 | int queue_length; |
480 | int queue_number; | 401 | int queue_number; |
@@ -502,41 +423,29 @@ enum ieee80211_conf_flags { | |||
502 | * | 423 | * |
503 | * @radio_enabled: when zero, driver is required to switch off the radio. | 424 | * @radio_enabled: when zero, driver is required to switch off the radio. |
504 | * TODO make a flag | 425 | * TODO make a flag |
505 | * @channel: IEEE 802.11 channel number | ||
506 | * @freq: frequency in MHz | ||
507 | * @channel_val: hardware specific channel value for the channel | ||
508 | * @phymode: PHY mode to activate (REMOVE) | ||
509 | * @chan: channel to switch to, pointer to the channel information | ||
510 | * @mode: pointer to mode definition | ||
511 | * @regulatory_domain: ?? | ||
512 | * @beacon_int: beacon interval (TODO make interface config) | 426 | * @beacon_int: beacon interval (TODO make interface config) |
513 | * @flags: configuration flags defined above | 427 | * @flags: configuration flags defined above |
514 | * @power_level: transmit power limit for current regulatory domain in dBm | 428 | * @power_level: requested transmit power (in dBm) |
515 | * @antenna_max: maximum antenna gain | 429 | * @max_antenna_gain: maximum antenna gain (in dBi) |
516 | * @antenna_sel_tx: transmit antenna selection, 0: default/diversity, | 430 | * @antenna_sel_tx: transmit antenna selection, 0: default/diversity, |
517 | * 1/2: antenna 0/1 | 431 | * 1/2: antenna 0/1 |
518 | * @antenna_sel_rx: receive antenna selection, like @antenna_sel_tx | 432 | * @antenna_sel_rx: receive antenna selection, like @antenna_sel_tx |
519 | * @ht_conf: describes current self configuration of 802.11n HT capabilies | 433 | * @ht_conf: describes current self configuration of 802.11n HT capabilies |
520 | * @ht_bss_conf: describes current BSS configuration of 802.11n HT parameters | 434 | * @ht_bss_conf: describes current BSS configuration of 802.11n HT parameters |
435 | * @channel: the channel to tune to | ||
521 | */ | 436 | */ |
522 | struct ieee80211_conf { | 437 | struct ieee80211_conf { |
523 | int channel; /* IEEE 802.11 channel number */ | ||
524 | int freq; /* MHz */ | ||
525 | int channel_val; /* hw specific value for the channel */ | ||
526 | |||
527 | enum ieee80211_phymode phymode; | ||
528 | struct ieee80211_channel *chan; | ||
529 | struct ieee80211_hw_mode *mode; | ||
530 | unsigned int regulatory_domain; | ||
531 | int radio_enabled; | 438 | int radio_enabled; |
532 | 439 | ||
533 | int beacon_int; | 440 | int beacon_int; |
534 | u32 flags; | 441 | u32 flags; |
535 | u8 power_level; | 442 | int power_level; |
536 | u8 antenna_max; | 443 | int max_antenna_gain; |
537 | u8 antenna_sel_tx; | 444 | u8 antenna_sel_tx; |
538 | u8 antenna_sel_rx; | 445 | u8 antenna_sel_rx; |
539 | 446 | ||
447 | struct ieee80211_channel *channel; | ||
448 | |||
540 | struct ieee80211_ht_info ht_conf; | 449 | struct ieee80211_ht_info ht_conf; |
541 | struct ieee80211_ht_bss_info ht_bss_conf; | 450 | struct ieee80211_ht_bss_info ht_bss_conf; |
542 | }; | 451 | }; |
@@ -555,12 +464,14 @@ struct ieee80211_conf { | |||
555 | * @IEEE80211_IF_TYPE_WDS: interface in WDS mode. | 464 | * @IEEE80211_IF_TYPE_WDS: interface in WDS mode. |
556 | * @IEEE80211_IF_TYPE_VLAN: VLAN interface bound to an AP, drivers | 465 | * @IEEE80211_IF_TYPE_VLAN: VLAN interface bound to an AP, drivers |
557 | * will never see this type. | 466 | * will never see this type. |
467 | * @IEEE80211_IF_TYPE_MESH_POINT: 802.11s mesh point | ||
558 | */ | 468 | */ |
559 | enum ieee80211_if_types { | 469 | enum ieee80211_if_types { |
560 | IEEE80211_IF_TYPE_INVALID, | 470 | IEEE80211_IF_TYPE_INVALID, |
561 | IEEE80211_IF_TYPE_AP, | 471 | IEEE80211_IF_TYPE_AP, |
562 | IEEE80211_IF_TYPE_STA, | 472 | IEEE80211_IF_TYPE_STA, |
563 | IEEE80211_IF_TYPE_IBSS, | 473 | IEEE80211_IF_TYPE_IBSS, |
474 | IEEE80211_IF_TYPE_MESH_POINT, | ||
564 | IEEE80211_IF_TYPE_MNTR, | 475 | IEEE80211_IF_TYPE_MNTR, |
565 | IEEE80211_IF_TYPE_WDS, | 476 | IEEE80211_IF_TYPE_WDS, |
566 | IEEE80211_IF_TYPE_VLAN, | 477 | IEEE80211_IF_TYPE_VLAN, |
@@ -582,6 +493,14 @@ struct ieee80211_vif { | |||
582 | u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *)))); | 493 | u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *)))); |
583 | }; | 494 | }; |
584 | 495 | ||
496 | static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif) | ||
497 | { | ||
498 | #ifdef CONFIG_MAC80211_MESH | ||
499 | return vif->type == IEEE80211_IF_TYPE_MESH_POINT; | ||
500 | #endif | ||
501 | return false; | ||
502 | } | ||
503 | |||
585 | /** | 504 | /** |
586 | * struct ieee80211_if_init_conf - initial configuration of an interface | 505 | * struct ieee80211_if_init_conf - initial configuration of an interface |
587 | * | 506 | * |
@@ -757,15 +676,19 @@ enum sta_notify_cmd { | |||
757 | * %IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE is also not set because | 676 | * %IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE is also not set because |
758 | * otherwise the stack will not know when the DTIM beacon was sent. | 677 | * otherwise the stack will not know when the DTIM beacon was sent. |
759 | * | 678 | * |
760 | * @IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED: | 679 | * @IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE: |
761 | * Channels are already configured to the default regulatory domain | 680 | * Hardware is not capable of short slot operation on the 2.4 GHz band. |
762 | * specified in the device's EEPROM | 681 | * |
682 | * @IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE: | ||
683 | * Hardware is not capable of receiving frames with short preamble on | ||
684 | * the 2.4 GHz band. | ||
763 | */ | 685 | */ |
764 | enum ieee80211_hw_flags { | 686 | enum ieee80211_hw_flags { |
765 | IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE = 1<<0, | 687 | IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE = 1<<0, |
766 | IEEE80211_HW_RX_INCLUDES_FCS = 1<<1, | 688 | IEEE80211_HW_RX_INCLUDES_FCS = 1<<1, |
767 | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING = 1<<2, | 689 | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING = 1<<2, |
768 | IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED = 1<<3, | 690 | IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE = 1<<3, |
691 | IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE = 1<<4, | ||
769 | }; | 692 | }; |
770 | 693 | ||
771 | /** | 694 | /** |
@@ -777,7 +700,8 @@ enum ieee80211_hw_flags { | |||
777 | * @wiphy: This points to the &struct wiphy allocated for this | 700 | * @wiphy: This points to the &struct wiphy allocated for this |
778 | * 802.11 PHY. You must fill in the @perm_addr and @dev | 701 | * 802.11 PHY. You must fill in the @perm_addr and @dev |
779 | * members of this structure using SET_IEEE80211_DEV() | 702 | * members of this structure using SET_IEEE80211_DEV() |
780 | * and SET_IEEE80211_PERM_ADDR(). | 703 | * and SET_IEEE80211_PERM_ADDR(). Additionally, all supported |
704 | * bands (with channels, bitrates) are registered here. | ||
781 | * | 705 | * |
782 | * @conf: &struct ieee80211_conf, device configuration, don't use. | 706 | * @conf: &struct ieee80211_conf, device configuration, don't use. |
783 | * | 707 | * |
@@ -913,8 +837,18 @@ static inline void SET_IEEE80211_PERM_ADDR(struct ieee80211_hw *hw, u8 *addr) | |||
913 | * parameter to see whether multicast frames should be accepted | 837 | * parameter to see whether multicast frames should be accepted |
914 | * or dropped. | 838 | * or dropped. |
915 | * | 839 | * |
916 | * All unsupported flags in @total_flags must be cleared, i.e. you | 840 | * All unsupported flags in @total_flags must be cleared. |
917 | * should clear all bits except those you honoured. | 841 | * Hardware does not support a flag if it is incapable of _passing_ |
842 | * the frame to the stack. Otherwise the driver must ignore | ||
843 | * the flag, but not clear it. | ||
844 | * You must _only_ clear the flag (announce no support for the | ||
845 | * flag to mac80211) if you are not able to pass the packet type | ||
846 | * to the stack (so the hardware always filters it). | ||
847 | * So for example, you should clear @FIF_CONTROL, if your hardware | ||
848 | * always filters control frames. If your hardware always passes | ||
849 | * control frames to the kernel and is incapable of filtering them, | ||
850 | * you do _not_ clear the @FIF_CONTROL flag. | ||
851 | * This rule applies to all other FIF flags as well. | ||
918 | */ | 852 | */ |
919 | 853 | ||
920 | /** | 854 | /** |
@@ -967,10 +901,14 @@ enum ieee80211_filter_flags { | |||
967 | * &struct ieee80211_ops to indicate which action is needed. | 901 | * &struct ieee80211_ops to indicate which action is needed. |
968 | * @IEEE80211_AMPDU_RX_START: start Rx aggregation | 902 | * @IEEE80211_AMPDU_RX_START: start Rx aggregation |
969 | * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation | 903 | * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation |
904 | * @IEEE80211_AMPDU_TX_START: start Tx aggregation | ||
905 | * @IEEE80211_AMPDU_TX_STOP: stop Tx aggregation | ||
970 | */ | 906 | */ |
971 | enum ieee80211_ampdu_mlme_action { | 907 | enum ieee80211_ampdu_mlme_action { |
972 | IEEE80211_AMPDU_RX_START, | 908 | IEEE80211_AMPDU_RX_START, |
973 | IEEE80211_AMPDU_RX_STOP, | 909 | IEEE80211_AMPDU_RX_STOP, |
910 | IEEE80211_AMPDU_TX_START, | ||
911 | IEEE80211_AMPDU_TX_STOP, | ||
974 | }; | 912 | }; |
975 | 913 | ||
976 | /** | 914 | /** |
@@ -1051,7 +989,9 @@ enum ieee80211_ampdu_mlme_action { | |||
1051 | * given local_address is enabled. | 989 | * given local_address is enabled. |
1052 | * | 990 | * |
1053 | * @hw_scan: Ask the hardware to service the scan request, no need to start | 991 | * @hw_scan: Ask the hardware to service the scan request, no need to start |
1054 | * the scan state machine in stack. | 992 | * the scan state machine in stack. The scan must honour the channel |
993 | * configuration done by the regulatory agent in the wiphy's registered | ||
994 | * bands. | ||
1055 | * | 995 | * |
1056 | * @get_stats: return low-level statistics | 996 | * @get_stats: return low-level statistics |
1057 | * | 997 | * |
@@ -1111,7 +1051,8 @@ enum ieee80211_ampdu_mlme_action { | |||
1111 | * The RA/TID combination determines the destination and TID we want | 1051 | * The RA/TID combination determines the destination and TID we want |
1112 | * the ampdu action to be performed for. The action is defined through | 1052 | * the ampdu action to be performed for. The action is defined through |
1113 | * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn) | 1053 | * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn) |
1114 | * is the first frame we expect to perform the action on. | 1054 | * is the first frame we expect to perform the action on. notice |
1055 | * that TX/RX_STOP can pass NULL for this parameter. | ||
1115 | */ | 1056 | */ |
1116 | struct ieee80211_ops { | 1057 | struct ieee80211_ops { |
1117 | int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb, | 1058 | int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb, |
@@ -1162,7 +1103,7 @@ struct ieee80211_ops { | |||
1162 | int (*conf_ht)(struct ieee80211_hw *hw, struct ieee80211_conf *conf); | 1103 | int (*conf_ht)(struct ieee80211_hw *hw, struct ieee80211_conf *conf); |
1163 | int (*ampdu_action)(struct ieee80211_hw *hw, | 1104 | int (*ampdu_action)(struct ieee80211_hw *hw, |
1164 | enum ieee80211_ampdu_mlme_action action, | 1105 | enum ieee80211_ampdu_mlme_action action, |
1165 | const u8 *ra, u16 tid, u16 ssn); | 1106 | const u8 *addr, u16 tid, u16 *ssn); |
1166 | }; | 1107 | }; |
1167 | 1108 | ||
1168 | /** | 1109 | /** |
@@ -1183,8 +1124,9 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, | |||
1183 | /** | 1124 | /** |
1184 | * ieee80211_register_hw - Register hardware device | 1125 | * ieee80211_register_hw - Register hardware device |
1185 | * | 1126 | * |
1186 | * You must call this function before any other functions | 1127 | * You must call this function before any other functions in |
1187 | * except ieee80211_register_hwmode. | 1128 | * mac80211. Note that before a hardware can be registered, you |
1129 | * need to fill the contained wiphy's information. | ||
1188 | * | 1130 | * |
1189 | * @hw: the device to register as returned by ieee80211_alloc_hw() | 1131 | * @hw: the device to register as returned by ieee80211_alloc_hw() |
1190 | */ | 1132 | */ |
@@ -1272,10 +1214,6 @@ static inline char *ieee80211_get_radio_led_name(struct ieee80211_hw *hw) | |||
1272 | #endif | 1214 | #endif |
1273 | } | 1215 | } |
1274 | 1216 | ||
1275 | /* Register a new hardware PHYMODE capability to the stack. */ | ||
1276 | int ieee80211_register_hwmode(struct ieee80211_hw *hw, | ||
1277 | struct ieee80211_hw_mode *mode); | ||
1278 | |||
1279 | /** | 1217 | /** |
1280 | * ieee80211_unregister_hw - Unregister a hardware device | 1218 | * ieee80211_unregister_hw - Unregister a hardware device |
1281 | * | 1219 | * |
@@ -1308,7 +1246,10 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
1308 | * buffer in @skb must start with an IEEE 802.11 header or a radiotap | 1246 | * buffer in @skb must start with an IEEE 802.11 header or a radiotap |
1309 | * header if %RX_FLAG_RADIOTAP is set in the @status flags. | 1247 | * header if %RX_FLAG_RADIOTAP is set in the @status flags. |
1310 | * | 1248 | * |
1311 | * This function may not be called in IRQ context. | 1249 | * This function may not be called in IRQ context. Calls to this function |
1250 | * for a single hardware must be synchronized against each other. Calls | ||
1251 | * to this function and ieee80211_rx_irqsafe() may not be mixed for a | ||
1252 | * single hardware. | ||
1312 | * | 1253 | * |
1313 | * @hw: the hardware this frame came in on | 1254 | * @hw: the hardware this frame came in on |
1314 | * @skb: the buffer to receive, owned by mac80211 after this call | 1255 | * @skb: the buffer to receive, owned by mac80211 after this call |
@@ -1325,7 +1266,10 @@ static inline void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
1325 | * ieee80211_rx_irqsafe - receive frame | 1266 | * ieee80211_rx_irqsafe - receive frame |
1326 | * | 1267 | * |
1327 | * Like ieee80211_rx() but can be called in IRQ context | 1268 | * Like ieee80211_rx() but can be called in IRQ context |
1328 | * (internally defers to a workqueue.) | 1269 | * (internally defers to a tasklet.) |
1270 | * | ||
1271 | * Calls to this function and ieee80211_rx() may not be mixed for a | ||
1272 | * single hardware. | ||
1329 | * | 1273 | * |
1330 | * @hw: the hardware this frame came in on | 1274 | * @hw: the hardware this frame came in on |
1331 | * @skb: the buffer to receive, owned by mac80211 after this call | 1275 | * @skb: the buffer to receive, owned by mac80211 after this call |
@@ -1344,6 +1288,11 @@ void ieee80211_rx_irqsafe(struct ieee80211_hw *hw, | |||
1344 | * transmitted. It is permissible to not call this function for | 1288 | * transmitted. It is permissible to not call this function for |
1345 | * multicast frames but this can affect statistics. | 1289 | * multicast frames but this can affect statistics. |
1346 | * | 1290 | * |
1291 | * This function may not be called in IRQ context. Calls to this function | ||
1292 | * for a single hardware must be synchronized against each other. Calls | ||
1293 | * to this function and ieee80211_tx_status_irqsafe() may not be mixed | ||
1294 | * for a single hardware. | ||
1295 | * | ||
1347 | * @hw: the hardware the frame was transmitted by | 1296 | * @hw: the hardware the frame was transmitted by |
1348 | * @skb: the frame that was transmitted, owned by mac80211 after this call | 1297 | * @skb: the frame that was transmitted, owned by mac80211 after this call |
1349 | * @status: status information for this frame; the status pointer need not | 1298 | * @status: status information for this frame; the status pointer need not |
@@ -1353,6 +1302,22 @@ void ieee80211_rx_irqsafe(struct ieee80211_hw *hw, | |||
1353 | void ieee80211_tx_status(struct ieee80211_hw *hw, | 1302 | void ieee80211_tx_status(struct ieee80211_hw *hw, |
1354 | struct sk_buff *skb, | 1303 | struct sk_buff *skb, |
1355 | struct ieee80211_tx_status *status); | 1304 | struct ieee80211_tx_status *status); |
1305 | |||
1306 | /** | ||
1307 | * ieee80211_tx_status_irqsafe - irq-safe transmit status callback | ||
1308 | * | ||
1309 | * Like ieee80211_tx_status() but can be called in IRQ context | ||
1310 | * (internally defers to a tasklet.) | ||
1311 | * | ||
1312 | * Calls to this function and ieee80211_tx_status() may not be mixed for a | ||
1313 | * single hardware. | ||
1314 | * | ||
1315 | * @hw: the hardware the frame was transmitted by | ||
1316 | * @skb: the frame that was transmitted, owned by mac80211 after this call | ||
1317 | * @status: status information for this frame; the status pointer need not | ||
1318 | * be valid after this function returns and is not freed by mac80211, | ||
1319 | * it is recommended that it points to a stack area | ||
1320 | */ | ||
1356 | void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw, | 1321 | void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw, |
1357 | struct sk_buff *skb, | 1322 | struct sk_buff *skb, |
1358 | struct ieee80211_tx_status *status); | 1323 | struct ieee80211_tx_status *status); |
@@ -1449,7 +1414,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw, | |||
1449 | * @hw: pointer obtained from ieee80211_alloc_hw(). | 1414 | * @hw: pointer obtained from ieee80211_alloc_hw(). |
1450 | * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf. | 1415 | * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf. |
1451 | * @frame_len: the length of the frame. | 1416 | * @frame_len: the length of the frame. |
1452 | * @rate: the rate (in 100kbps) at which the frame is going to be transmitted. | 1417 | * @rate: the rate at which the frame is going to be transmitted. |
1453 | * | 1418 | * |
1454 | * Calculate the duration field of some generic frame, given its | 1419 | * Calculate the duration field of some generic frame, given its |
1455 | * length and transmission rate (in 100kbps). | 1420 | * length and transmission rate (in 100kbps). |
@@ -1457,7 +1422,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw, | |||
1457 | __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, | 1422 | __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, |
1458 | struct ieee80211_vif *vif, | 1423 | struct ieee80211_vif *vif, |
1459 | size_t frame_len, | 1424 | size_t frame_len, |
1460 | int rate); | 1425 | struct ieee80211_rate *rate); |
1461 | 1426 | ||
1462 | /** | 1427 | /** |
1463 | * ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames | 1428 | * ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames |
@@ -1574,4 +1539,81 @@ void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw, | |||
1574 | struct ieee80211_vif *vif), | 1539 | struct ieee80211_vif *vif), |
1575 | void *data); | 1540 | void *data); |
1576 | 1541 | ||
1542 | /** | ||
1543 | * ieee80211_start_tx_ba_session - Start a tx Block Ack session. | ||
1544 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1545 | * @ra: receiver address of the BA session recipient | ||
1546 | * @tid: the TID to BA on. | ||
1547 | * @return: success if addBA request was sent, failure otherwise | ||
1548 | * | ||
1549 | * Although mac80211/low level driver/user space application can estimate | ||
1550 | * the need to start aggregation on a certain RA/TID, the session level | ||
1551 | * will be managed by the mac80211. | ||
1552 | */ | ||
1553 | int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid); | ||
1554 | |||
1555 | /** | ||
1556 | * ieee80211_start_tx_ba_cb - low level driver ready to aggregate. | ||
1557 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1558 | * @ra: receiver address of the BA session recipient. | ||
1559 | * @tid: the TID to BA on. | ||
1560 | * | ||
1561 | * This function must be called by low level driver once it has | ||
1562 | * finished with preparations for the BA session. | ||
1563 | */ | ||
1564 | void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid); | ||
1565 | |||
1566 | /** | ||
1567 | * ieee80211_start_tx_ba_cb_irqsafe - low level driver ready to aggregate. | ||
1568 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1569 | * @ra: receiver address of the BA session recipient. | ||
1570 | * @tid: the TID to BA on. | ||
1571 | * | ||
1572 | * This function must be called by low level driver once it has | ||
1573 | * finished with preparations for the BA session. | ||
1574 | * This version of the function is irq safe. | ||
1575 | */ | ||
1576 | void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra, | ||
1577 | u16 tid); | ||
1578 | |||
1579 | /** | ||
1580 | * ieee80211_stop_tx_ba_session - Stop a Block Ack session. | ||
1581 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1582 | * @ra: receiver address of the BA session recipient | ||
1583 | * @tid: the TID to stop BA. | ||
1584 | * @initiator: if indicates initiator DELBA frame will be sent. | ||
1585 | * @return: error if no sta with matching da found, success otherwise | ||
1586 | * | ||
1587 | * Although mac80211/low level driver/user space application can estimate | ||
1588 | * the need to stop aggregation on a certain RA/TID, the session level | ||
1589 | * will be managed by the mac80211. | ||
1590 | */ | ||
1591 | int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, | ||
1592 | u8 *ra, u16 tid, | ||
1593 | enum ieee80211_back_parties initiator); | ||
1594 | |||
1595 | /** | ||
1596 | * ieee80211_stop_tx_ba_cb - low level driver ready to stop aggregate. | ||
1597 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1598 | * @ra: receiver address of the BA session recipient. | ||
1599 | * @tid: the desired TID to BA on. | ||
1600 | * | ||
1601 | * This function must be called by low level driver once it has | ||
1602 | * finished with preparations for the BA session tear down. | ||
1603 | */ | ||
1604 | void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid); | ||
1605 | |||
1606 | /** | ||
1607 | * ieee80211_stop_tx_ba_cb_irqsafe - low level driver ready to stop aggregate. | ||
1608 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1609 | * @ra: receiver address of the BA session recipient. | ||
1610 | * @tid: the desired TID to BA on. | ||
1611 | * | ||
1612 | * This function must be called by low level driver once it has | ||
1613 | * finished with preparations for the BA session tear down. | ||
1614 | * This version of the function is irq safe. | ||
1615 | */ | ||
1616 | void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra, | ||
1617 | u16 tid); | ||
1618 | |||
1577 | #endif /* MAC80211_H */ | 1619 | #endif /* MAC80211_H */ |