diff options
Diffstat (limited to 'include/net/mac80211.h')
-rw-r--r-- | include/net/mac80211.h | 384 |
1 files changed, 194 insertions, 190 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 9083bafb63ca..7a80c3981237 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 { |
@@ -318,11 +211,13 @@ struct ieee80211_bss_conf { | |||
318 | 211 | ||
319 | struct ieee80211_tx_control { | 212 | struct ieee80211_tx_control { |
320 | struct ieee80211_vif *vif; | 213 | struct ieee80211_vif *vif; |
321 | int tx_rate; /* Transmit rate, given as the hw specific value for the | 214 | struct ieee80211_rate *tx_rate; |
322 | * rate (from struct ieee80211_rate) */ | 215 | |
323 | int rts_cts_rate; /* Transmit rate for RTS/CTS frame, given as the hw | 216 | /* Transmit rate for RTS/CTS frame */ |
324 | * specific value for the rate (from | 217 | struct ieee80211_rate *rts_cts_rate; |
325 | * struct ieee80211_rate) */ | 218 | |
219 | /* retry rate for the last retries */ | ||
220 | struct ieee80211_rate *alt_retry_rate; | ||
326 | 221 | ||
327 | #define IEEE80211_TXCTL_REQ_TX_STATUS (1<<0)/* request TX status callback for | 222 | #define IEEE80211_TXCTL_REQ_TX_STATUS (1<<0)/* request TX status callback for |
328 | * this frame */ | 223 | * this frame */ |
@@ -337,10 +232,12 @@ struct ieee80211_tx_control { | |||
337 | #define IEEE80211_TXCTL_NO_ACK (1<<4) /* tell the low level not to | 232 | #define IEEE80211_TXCTL_NO_ACK (1<<4) /* tell the low level not to |
338 | * wait for an ack */ | 233 | * wait for an ack */ |
339 | #define IEEE80211_TXCTL_RATE_CTRL_PROBE (1<<5) | 234 | #define IEEE80211_TXCTL_RATE_CTRL_PROBE (1<<5) |
340 | #define IEEE80211_TXCTL_CLEAR_DST_MASK (1<<6) | 235 | #define IEEE80211_TXCTL_CLEAR_PS_FILT (1<<6) /* clear powersave filter |
236 | * for destination station */ | ||
341 | #define IEEE80211_TXCTL_REQUEUE (1<<7) | 237 | #define IEEE80211_TXCTL_REQUEUE (1<<7) |
342 | #define IEEE80211_TXCTL_FIRST_FRAGMENT (1<<8) /* this is a first fragment of | 238 | #define IEEE80211_TXCTL_FIRST_FRAGMENT (1<<8) /* this is a first fragment of |
343 | * the frame */ | 239 | * the frame */ |
240 | #define IEEE80211_TXCTL_SHORT_PREAMBLE (1<<9) | ||
344 | #define IEEE80211_TXCTL_LONG_RETRY_LIMIT (1<<10) /* this frame should be send | 241 | #define IEEE80211_TXCTL_LONG_RETRY_LIMIT (1<<10) /* this frame should be send |
345 | * using the through | 242 | * using the through |
346 | * set_retry_limit configured | 243 | * set_retry_limit configured |
@@ -348,6 +245,8 @@ struct ieee80211_tx_control { | |||
348 | #define IEEE80211_TXCTL_EAPOL_FRAME (1<<11) /* internal to mac80211 */ | 245 | #define IEEE80211_TXCTL_EAPOL_FRAME (1<<11) /* internal to mac80211 */ |
349 | #define IEEE80211_TXCTL_SEND_AFTER_DTIM (1<<12) /* send this frame after DTIM | 246 | #define IEEE80211_TXCTL_SEND_AFTER_DTIM (1<<12) /* send this frame after DTIM |
350 | * beacon */ | 247 | * beacon */ |
248 | #define IEEE80211_TXCTL_AMPDU (1<<13) /* this frame should be sent | ||
249 | * as part of an A-MPDU */ | ||
351 | u32 flags; /* tx control flags defined | 250 | u32 flags; /* tx control flags defined |
352 | * above */ | 251 | * above */ |
353 | u8 key_idx; /* keyidx from hw->set_key(), undefined if | 252 | u8 key_idx; /* keyidx from hw->set_key(), undefined if |
@@ -355,20 +254,11 @@ struct ieee80211_tx_control { | |||
355 | u8 retry_limit; /* 1 = only first attempt, 2 = one retry, .. | 254 | u8 retry_limit; /* 1 = only first attempt, 2 = one retry, .. |
356 | * This could be used when set_retry_limit | 255 | * This could be used when set_retry_limit |
357 | * is not implemented by the driver */ | 256 | * is not implemented by the driver */ |
358 | u8 power_level; /* per-packet transmit power level, in dBm */ | ||
359 | u8 antenna_sel_tx; /* 0 = default/diversity, 1 = Ant0, 2 = Ant1 */ | 257 | u8 antenna_sel_tx; /* 0 = default/diversity, 1 = Ant0, 2 = Ant1 */ |
360 | u8 icv_len; /* length of the ICV/MIC field in octets */ | 258 | u8 icv_len; /* length of the ICV/MIC field in octets */ |
361 | u8 iv_len; /* length of the IV field in octets */ | 259 | u8 iv_len; /* length of the IV field in octets */ |
362 | u8 queue; /* hardware queue to use for this frame; | 260 | u8 queue; /* hardware queue to use for this frame; |
363 | * 0 = highest, hw->queues-1 = lowest */ | 261 | * 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 */ | 262 | int type; /* internal */ |
373 | }; | 263 | }; |
374 | 264 | ||
@@ -391,7 +281,8 @@ struct ieee80211_tx_control { | |||
391 | * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on | 281 | * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on |
392 | * the frame. | 282 | * the frame. |
393 | * @RX_FLAG_TSFT: The timestamp passed in the RX status (@mactime field) | 283 | * @RX_FLAG_TSFT: The timestamp passed in the RX status (@mactime field) |
394 | * is valid. | 284 | * is valid. This is useful in monitor mode and necessary for beacon frames |
285 | * to enable IBSS merging. | ||
395 | */ | 286 | */ |
396 | enum mac80211_rx_flags { | 287 | enum mac80211_rx_flags { |
397 | RX_FLAG_MMIC_ERROR = 1<<0, | 288 | RX_FLAG_MMIC_ERROR = 1<<0, |
@@ -410,27 +301,26 @@ enum mac80211_rx_flags { | |||
410 | * The low-level driver should provide this information (the subset | 301 | * The low-level driver should provide this information (the subset |
411 | * supported by hardware) to the 802.11 code with each received | 302 | * supported by hardware) to the 802.11 code with each received |
412 | * frame. | 303 | * frame. |
413 | * @mactime: MAC timestamp as defined by 802.11 | 304 | * @mactime: value in microseconds of the 64-bit Time Synchronization Function |
305 | * (TSF) timer when the first data symbol (MPDU) arrived at the hardware. | ||
306 | * @band: the active band when this frame was received | ||
414 | * @freq: frequency the radio was tuned to when receiving this frame, in MHz | 307 | * @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 | 308 | * @ssi: signal strength when receiving this frame |
418 | * @signal: used as 'qual' in statistics reporting | 309 | * @signal: used as 'qual' in statistics reporting |
419 | * @noise: PHY noise when receiving this frame | 310 | * @noise: PHY noise when receiving this frame |
420 | * @antenna: antenna used | 311 | * @antenna: antenna used |
421 | * @rate: data rate | 312 | * @rate_idx: index of data rate into band's supported rates |
422 | * @flag: %RX_FLAG_* | 313 | * @flag: %RX_FLAG_* |
423 | */ | 314 | */ |
424 | struct ieee80211_rx_status { | 315 | struct ieee80211_rx_status { |
425 | u64 mactime; | 316 | u64 mactime; |
317 | enum ieee80211_band band; | ||
426 | int freq; | 318 | int freq; |
427 | int channel; | ||
428 | enum ieee80211_phymode phymode; | ||
429 | int ssi; | 319 | int ssi; |
430 | int signal; | 320 | int signal; |
431 | int noise; | 321 | int noise; |
432 | int antenna; | 322 | int antenna; |
433 | int rate; | 323 | int rate_idx; |
434 | int flag; | 324 | int flag; |
435 | }; | 325 | }; |
436 | 326 | ||
@@ -441,12 +331,14 @@ struct ieee80211_rx_status { | |||
441 | * | 331 | * |
442 | * @IEEE80211_TX_STATUS_TX_FILTERED: The frame was not transmitted | 332 | * @IEEE80211_TX_STATUS_TX_FILTERED: The frame was not transmitted |
443 | * because the destination STA was in powersave mode. | 333 | * because the destination STA was in powersave mode. |
444 | * | ||
445 | * @IEEE80211_TX_STATUS_ACK: Frame was acknowledged | 334 | * @IEEE80211_TX_STATUS_ACK: Frame was acknowledged |
335 | * @IEEE80211_TX_STATUS_AMPDU: The frame was aggregated, so status | ||
336 | * is for the whole aggregation. | ||
446 | */ | 337 | */ |
447 | enum ieee80211_tx_status_flags { | 338 | enum ieee80211_tx_status_flags { |
448 | IEEE80211_TX_STATUS_TX_FILTERED = 1<<0, | 339 | IEEE80211_TX_STATUS_TX_FILTERED = 1<<0, |
449 | IEEE80211_TX_STATUS_ACK = 1<<1, | 340 | IEEE80211_TX_STATUS_ACK = 1<<1, |
341 | IEEE80211_TX_STATUS_AMPDU = 1<<2, | ||
450 | }; | 342 | }; |
451 | 343 | ||
452 | /** | 344 | /** |
@@ -457,24 +349,25 @@ enum ieee80211_tx_status_flags { | |||
457 | * | 349 | * |
458 | * @control: a copy of the &struct ieee80211_tx_control passed to the driver | 350 | * @control: a copy of the &struct ieee80211_tx_control passed to the driver |
459 | * in the tx() callback. | 351 | * in the tx() callback. |
460 | * | ||
461 | * @flags: transmit status flags, defined above | 352 | * @flags: transmit status flags, defined above |
462 | * | 353 | * @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 | 354 | * @excessive_retries: set to 1 if the frame was retried many times |
466 | * but not acknowledged | 355 | * but not acknowledged |
467 | * | 356 | * @ampdu_ack_len: number of aggregated frames. |
468 | * @retry_count: number of retries | 357 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. |
469 | * | 358 | * @ampdu_ack_map: block ack bit map for the aggregation. |
359 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. | ||
360 | * @ack_signal: signal strength of the ACK frame | ||
470 | * @queue_length: ?? REMOVE | 361 | * @queue_length: ?? REMOVE |
471 | * @queue_number: ?? REMOVE | 362 | * @queue_number: ?? REMOVE |
472 | */ | 363 | */ |
473 | struct ieee80211_tx_status { | 364 | struct ieee80211_tx_status { |
474 | struct ieee80211_tx_control control; | 365 | struct ieee80211_tx_control control; |
475 | u8 flags; | 366 | u8 flags; |
476 | bool excessive_retries; | ||
477 | u8 retry_count; | 367 | u8 retry_count; |
368 | bool excessive_retries; | ||
369 | u8 ampdu_ack_len; | ||
370 | u64 ampdu_ack_map; | ||
478 | int ack_signal; | 371 | int ack_signal; |
479 | int queue_length; | 372 | int queue_length; |
480 | int queue_number; | 373 | int queue_number; |
@@ -502,41 +395,30 @@ enum ieee80211_conf_flags { | |||
502 | * | 395 | * |
503 | * @radio_enabled: when zero, driver is required to switch off the radio. | 396 | * @radio_enabled: when zero, driver is required to switch off the radio. |
504 | * TODO make a flag | 397 | * 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) | 398 | * @beacon_int: beacon interval (TODO make interface config) |
513 | * @flags: configuration flags defined above | 399 | * @flags: configuration flags defined above |
514 | * @power_level: transmit power limit for current regulatory domain in dBm | 400 | * @power_level: requested transmit power (in dBm) |
515 | * @antenna_max: maximum antenna gain | 401 | * @max_antenna_gain: maximum antenna gain (in dBi) |
516 | * @antenna_sel_tx: transmit antenna selection, 0: default/diversity, | 402 | * @antenna_sel_tx: transmit antenna selection, 0: default/diversity, |
517 | * 1/2: antenna 0/1 | 403 | * 1/2: antenna 0/1 |
518 | * @antenna_sel_rx: receive antenna selection, like @antenna_sel_tx | 404 | * @antenna_sel_rx: receive antenna selection, like @antenna_sel_tx |
519 | * @ht_conf: describes current self configuration of 802.11n HT capabilies | 405 | * @ht_conf: describes current self configuration of 802.11n HT capabilies |
520 | * @ht_bss_conf: describes current BSS configuration of 802.11n HT parameters | 406 | * @ht_bss_conf: describes current BSS configuration of 802.11n HT parameters |
407 | * @channel: the channel to tune to | ||
521 | */ | 408 | */ |
522 | struct ieee80211_conf { | 409 | 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; | 410 | unsigned int regulatory_domain; |
531 | int radio_enabled; | 411 | int radio_enabled; |
532 | 412 | ||
533 | int beacon_int; | 413 | int beacon_int; |
534 | u32 flags; | 414 | u32 flags; |
535 | u8 power_level; | 415 | int power_level; |
536 | u8 antenna_max; | 416 | int max_antenna_gain; |
537 | u8 antenna_sel_tx; | 417 | u8 antenna_sel_tx; |
538 | u8 antenna_sel_rx; | 418 | u8 antenna_sel_rx; |
539 | 419 | ||
420 | struct ieee80211_channel *channel; | ||
421 | |||
540 | struct ieee80211_ht_info ht_conf; | 422 | struct ieee80211_ht_info ht_conf; |
541 | struct ieee80211_ht_bss_info ht_bss_conf; | 423 | struct ieee80211_ht_bss_info ht_bss_conf; |
542 | }; | 424 | }; |
@@ -757,15 +639,19 @@ enum sta_notify_cmd { | |||
757 | * %IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE is also not set because | 639 | * %IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE is also not set because |
758 | * otherwise the stack will not know when the DTIM beacon was sent. | 640 | * otherwise the stack will not know when the DTIM beacon was sent. |
759 | * | 641 | * |
760 | * @IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED: | 642 | * @IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE: |
761 | * Channels are already configured to the default regulatory domain | 643 | * Hardware is not capable of short slot operation on the 2.4 GHz band. |
762 | * specified in the device's EEPROM | 644 | * |
645 | * @IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE: | ||
646 | * Hardware is not capable of receiving frames with short preamble on | ||
647 | * the 2.4 GHz band. | ||
763 | */ | 648 | */ |
764 | enum ieee80211_hw_flags { | 649 | enum ieee80211_hw_flags { |
765 | IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE = 1<<0, | 650 | IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE = 1<<0, |
766 | IEEE80211_HW_RX_INCLUDES_FCS = 1<<1, | 651 | IEEE80211_HW_RX_INCLUDES_FCS = 1<<1, |
767 | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING = 1<<2, | 652 | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING = 1<<2, |
768 | IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED = 1<<3, | 653 | IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE = 1<<3, |
654 | IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE = 1<<4, | ||
769 | }; | 655 | }; |
770 | 656 | ||
771 | /** | 657 | /** |
@@ -777,7 +663,8 @@ enum ieee80211_hw_flags { | |||
777 | * @wiphy: This points to the &struct wiphy allocated for this | 663 | * @wiphy: This points to the &struct wiphy allocated for this |
778 | * 802.11 PHY. You must fill in the @perm_addr and @dev | 664 | * 802.11 PHY. You must fill in the @perm_addr and @dev |
779 | * members of this structure using SET_IEEE80211_DEV() | 665 | * members of this structure using SET_IEEE80211_DEV() |
780 | * and SET_IEEE80211_PERM_ADDR(). | 666 | * and SET_IEEE80211_PERM_ADDR(). Additionally, all supported |
667 | * bands (with channels, bitrates) are registered here. | ||
781 | * | 668 | * |
782 | * @conf: &struct ieee80211_conf, device configuration, don't use. | 669 | * @conf: &struct ieee80211_conf, device configuration, don't use. |
783 | * | 670 | * |
@@ -913,8 +800,18 @@ static inline void SET_IEEE80211_PERM_ADDR(struct ieee80211_hw *hw, u8 *addr) | |||
913 | * parameter to see whether multicast frames should be accepted | 800 | * parameter to see whether multicast frames should be accepted |
914 | * or dropped. | 801 | * or dropped. |
915 | * | 802 | * |
916 | * All unsupported flags in @total_flags must be cleared, i.e. you | 803 | * All unsupported flags in @total_flags must be cleared. |
917 | * should clear all bits except those you honoured. | 804 | * Hardware does not support a flag if it is incapable of _passing_ |
805 | * the frame to the stack. Otherwise the driver must ignore | ||
806 | * the flag, but not clear it. | ||
807 | * You must _only_ clear the flag (announce no support for the | ||
808 | * flag to mac80211) if you are not able to pass the packet type | ||
809 | * to the stack (so the hardware always filters it). | ||
810 | * So for example, you should clear @FIF_CONTROL, if your hardware | ||
811 | * always filters control frames. If your hardware always passes | ||
812 | * control frames to the kernel and is incapable of filtering them, | ||
813 | * you do _not_ clear the @FIF_CONTROL flag. | ||
814 | * This rule applies to all other FIF flags as well. | ||
918 | */ | 815 | */ |
919 | 816 | ||
920 | /** | 817 | /** |
@@ -967,10 +864,14 @@ enum ieee80211_filter_flags { | |||
967 | * &struct ieee80211_ops to indicate which action is needed. | 864 | * &struct ieee80211_ops to indicate which action is needed. |
968 | * @IEEE80211_AMPDU_RX_START: start Rx aggregation | 865 | * @IEEE80211_AMPDU_RX_START: start Rx aggregation |
969 | * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation | 866 | * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation |
867 | * @IEEE80211_AMPDU_TX_START: start Tx aggregation | ||
868 | * @IEEE80211_AMPDU_TX_STOP: stop Tx aggregation | ||
970 | */ | 869 | */ |
971 | enum ieee80211_ampdu_mlme_action { | 870 | enum ieee80211_ampdu_mlme_action { |
972 | IEEE80211_AMPDU_RX_START, | 871 | IEEE80211_AMPDU_RX_START, |
973 | IEEE80211_AMPDU_RX_STOP, | 872 | IEEE80211_AMPDU_RX_STOP, |
873 | IEEE80211_AMPDU_TX_START, | ||
874 | IEEE80211_AMPDU_TX_STOP, | ||
974 | }; | 875 | }; |
975 | 876 | ||
976 | /** | 877 | /** |
@@ -1051,7 +952,9 @@ enum ieee80211_ampdu_mlme_action { | |||
1051 | * given local_address is enabled. | 952 | * given local_address is enabled. |
1052 | * | 953 | * |
1053 | * @hw_scan: Ask the hardware to service the scan request, no need to start | 954 | * @hw_scan: Ask the hardware to service the scan request, no need to start |
1054 | * the scan state machine in stack. | 955 | * the scan state machine in stack. The scan must honour the channel |
956 | * configuration done by the regulatory agent in the wiphy's registered | ||
957 | * bands. | ||
1055 | * | 958 | * |
1056 | * @get_stats: return low-level statistics | 959 | * @get_stats: return low-level statistics |
1057 | * | 960 | * |
@@ -1111,7 +1014,8 @@ enum ieee80211_ampdu_mlme_action { | |||
1111 | * The RA/TID combination determines the destination and TID we want | 1014 | * The RA/TID combination determines the destination and TID we want |
1112 | * the ampdu action to be performed for. The action is defined through | 1015 | * the ampdu action to be performed for. The action is defined through |
1113 | * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn) | 1016 | * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn) |
1114 | * is the first frame we expect to perform the action on. | 1017 | * is the first frame we expect to perform the action on. notice |
1018 | * that TX/RX_STOP can pass NULL for this parameter. | ||
1115 | */ | 1019 | */ |
1116 | struct ieee80211_ops { | 1020 | struct ieee80211_ops { |
1117 | int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb, | 1021 | int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb, |
@@ -1162,7 +1066,7 @@ struct ieee80211_ops { | |||
1162 | int (*conf_ht)(struct ieee80211_hw *hw, struct ieee80211_conf *conf); | 1066 | int (*conf_ht)(struct ieee80211_hw *hw, struct ieee80211_conf *conf); |
1163 | int (*ampdu_action)(struct ieee80211_hw *hw, | 1067 | int (*ampdu_action)(struct ieee80211_hw *hw, |
1164 | enum ieee80211_ampdu_mlme_action action, | 1068 | enum ieee80211_ampdu_mlme_action action, |
1165 | const u8 *ra, u16 tid, u16 ssn); | 1069 | const u8 *addr, u16 tid, u16 *ssn); |
1166 | }; | 1070 | }; |
1167 | 1071 | ||
1168 | /** | 1072 | /** |
@@ -1272,10 +1176,6 @@ static inline char *ieee80211_get_radio_led_name(struct ieee80211_hw *hw) | |||
1272 | #endif | 1176 | #endif |
1273 | } | 1177 | } |
1274 | 1178 | ||
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 | /** | 1179 | /** |
1280 | * ieee80211_unregister_hw - Unregister a hardware device | 1180 | * ieee80211_unregister_hw - Unregister a hardware device |
1281 | * | 1181 | * |
@@ -1308,7 +1208,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 | 1208 | * 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. | 1209 | * header if %RX_FLAG_RADIOTAP is set in the @status flags. |
1310 | * | 1210 | * |
1311 | * This function may not be called in IRQ context. | 1211 | * This function may not be called in IRQ context. Calls to this function |
1212 | * for a single hardware must be synchronized against each other. Calls | ||
1213 | * to this function and ieee80211_rx_irqsafe() may not be mixed for a | ||
1214 | * single hardware. | ||
1312 | * | 1215 | * |
1313 | * @hw: the hardware this frame came in on | 1216 | * @hw: the hardware this frame came in on |
1314 | * @skb: the buffer to receive, owned by mac80211 after this call | 1217 | * @skb: the buffer to receive, owned by mac80211 after this call |
@@ -1325,7 +1228,10 @@ static inline void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
1325 | * ieee80211_rx_irqsafe - receive frame | 1228 | * ieee80211_rx_irqsafe - receive frame |
1326 | * | 1229 | * |
1327 | * Like ieee80211_rx() but can be called in IRQ context | 1230 | * Like ieee80211_rx() but can be called in IRQ context |
1328 | * (internally defers to a workqueue.) | 1231 | * (internally defers to a tasklet.) |
1232 | * | ||
1233 | * Calls to this function and ieee80211_rx() may not be mixed for a | ||
1234 | * single hardware. | ||
1329 | * | 1235 | * |
1330 | * @hw: the hardware this frame came in on | 1236 | * @hw: the hardware this frame came in on |
1331 | * @skb: the buffer to receive, owned by mac80211 after this call | 1237 | * @skb: the buffer to receive, owned by mac80211 after this call |
@@ -1344,6 +1250,11 @@ void ieee80211_rx_irqsafe(struct ieee80211_hw *hw, | |||
1344 | * transmitted. It is permissible to not call this function for | 1250 | * transmitted. It is permissible to not call this function for |
1345 | * multicast frames but this can affect statistics. | 1251 | * multicast frames but this can affect statistics. |
1346 | * | 1252 | * |
1253 | * This function may not be called in IRQ context. Calls to this function | ||
1254 | * for a single hardware must be synchronized against each other. Calls | ||
1255 | * to this function and ieee80211_tx_status_irqsafe() may not be mixed | ||
1256 | * for a single hardware. | ||
1257 | * | ||
1347 | * @hw: the hardware the frame was transmitted by | 1258 | * @hw: the hardware the frame was transmitted by |
1348 | * @skb: the frame that was transmitted, owned by mac80211 after this call | 1259 | * @skb: the frame that was transmitted, owned by mac80211 after this call |
1349 | * @status: status information for this frame; the status pointer need not | 1260 | * @status: status information for this frame; the status pointer need not |
@@ -1353,6 +1264,22 @@ void ieee80211_rx_irqsafe(struct ieee80211_hw *hw, | |||
1353 | void ieee80211_tx_status(struct ieee80211_hw *hw, | 1264 | void ieee80211_tx_status(struct ieee80211_hw *hw, |
1354 | struct sk_buff *skb, | 1265 | struct sk_buff *skb, |
1355 | struct ieee80211_tx_status *status); | 1266 | struct ieee80211_tx_status *status); |
1267 | |||
1268 | /** | ||
1269 | * ieee80211_tx_status_irqsafe - irq-safe transmit status callback | ||
1270 | * | ||
1271 | * Like ieee80211_tx_status() but can be called in IRQ context | ||
1272 | * (internally defers to a tasklet.) | ||
1273 | * | ||
1274 | * Calls to this function and ieee80211_tx_status() may not be mixed for a | ||
1275 | * single hardware. | ||
1276 | * | ||
1277 | * @hw: the hardware the frame was transmitted by | ||
1278 | * @skb: the frame that was transmitted, owned by mac80211 after this call | ||
1279 | * @status: status information for this frame; the status pointer need not | ||
1280 | * be valid after this function returns and is not freed by mac80211, | ||
1281 | * it is recommended that it points to a stack area | ||
1282 | */ | ||
1356 | void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw, | 1283 | void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw, |
1357 | struct sk_buff *skb, | 1284 | struct sk_buff *skb, |
1358 | struct ieee80211_tx_status *status); | 1285 | struct ieee80211_tx_status *status); |
@@ -1449,7 +1376,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw, | |||
1449 | * @hw: pointer obtained from ieee80211_alloc_hw(). | 1376 | * @hw: pointer obtained from ieee80211_alloc_hw(). |
1450 | * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf. | 1377 | * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf. |
1451 | * @frame_len: the length of the frame. | 1378 | * @frame_len: the length of the frame. |
1452 | * @rate: the rate (in 100kbps) at which the frame is going to be transmitted. | 1379 | * @rate: the rate at which the frame is going to be transmitted. |
1453 | * | 1380 | * |
1454 | * Calculate the duration field of some generic frame, given its | 1381 | * Calculate the duration field of some generic frame, given its |
1455 | * length and transmission rate (in 100kbps). | 1382 | * length and transmission rate (in 100kbps). |
@@ -1457,7 +1384,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw, | |||
1457 | __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, | 1384 | __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, |
1458 | struct ieee80211_vif *vif, | 1385 | struct ieee80211_vif *vif, |
1459 | size_t frame_len, | 1386 | size_t frame_len, |
1460 | int rate); | 1387 | struct ieee80211_rate *rate); |
1461 | 1388 | ||
1462 | /** | 1389 | /** |
1463 | * ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames | 1390 | * ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames |
@@ -1574,4 +1501,81 @@ void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw, | |||
1574 | struct ieee80211_vif *vif), | 1501 | struct ieee80211_vif *vif), |
1575 | void *data); | 1502 | void *data); |
1576 | 1503 | ||
1504 | /** | ||
1505 | * ieee80211_start_tx_ba_session - Start a tx Block Ack session. | ||
1506 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1507 | * @ra: receiver address of the BA session recipient | ||
1508 | * @tid: the TID to BA on. | ||
1509 | * @return: success if addBA request was sent, failure otherwise | ||
1510 | * | ||
1511 | * Although mac80211/low level driver/user space application can estimate | ||
1512 | * the need to start aggregation on a certain RA/TID, the session level | ||
1513 | * will be managed by the mac80211. | ||
1514 | */ | ||
1515 | int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid); | ||
1516 | |||
1517 | /** | ||
1518 | * ieee80211_start_tx_ba_cb - low level driver ready to aggregate. | ||
1519 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1520 | * @ra: receiver address of the BA session recipient. | ||
1521 | * @tid: the TID to BA on. | ||
1522 | * | ||
1523 | * This function must be called by low level driver once it has | ||
1524 | * finished with preparations for the BA session. | ||
1525 | */ | ||
1526 | void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid); | ||
1527 | |||
1528 | /** | ||
1529 | * ieee80211_start_tx_ba_cb_irqsafe - low level driver ready to aggregate. | ||
1530 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1531 | * @ra: receiver address of the BA session recipient. | ||
1532 | * @tid: the TID to BA on. | ||
1533 | * | ||
1534 | * This function must be called by low level driver once it has | ||
1535 | * finished with preparations for the BA session. | ||
1536 | * This version of the function is irq safe. | ||
1537 | */ | ||
1538 | void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra, | ||
1539 | u16 tid); | ||
1540 | |||
1541 | /** | ||
1542 | * ieee80211_stop_tx_ba_session - Stop a Block Ack session. | ||
1543 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1544 | * @ra: receiver address of the BA session recipient | ||
1545 | * @tid: the TID to stop BA. | ||
1546 | * @initiator: if indicates initiator DELBA frame will be sent. | ||
1547 | * @return: error if no sta with matching da found, success otherwise | ||
1548 | * | ||
1549 | * Although mac80211/low level driver/user space application can estimate | ||
1550 | * the need to stop aggregation on a certain RA/TID, the session level | ||
1551 | * will be managed by the mac80211. | ||
1552 | */ | ||
1553 | int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, | ||
1554 | u8 *ra, u16 tid, | ||
1555 | enum ieee80211_back_parties initiator); | ||
1556 | |||
1557 | /** | ||
1558 | * ieee80211_stop_tx_ba_cb - low level driver ready to stop aggregate. | ||
1559 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1560 | * @ra: receiver address of the BA session recipient. | ||
1561 | * @tid: the desired TID to BA on. | ||
1562 | * | ||
1563 | * This function must be called by low level driver once it has | ||
1564 | * finished with preparations for the BA session tear down. | ||
1565 | */ | ||
1566 | void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid); | ||
1567 | |||
1568 | /** | ||
1569 | * ieee80211_stop_tx_ba_cb_irqsafe - low level driver ready to stop aggregate. | ||
1570 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
1571 | * @ra: receiver address of the BA session recipient. | ||
1572 | * @tid: the desired TID to BA on. | ||
1573 | * | ||
1574 | * This function must be called by low level driver once it has | ||
1575 | * finished with preparations for the BA session tear down. | ||
1576 | * This version of the function is irq safe. | ||
1577 | */ | ||
1578 | void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra, | ||
1579 | u16 tid); | ||
1580 | |||
1577 | #endif /* MAC80211_H */ | 1581 | #endif /* MAC80211_H */ |