| .. | .. |
|---|
| 8 | 8 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. |
|---|
| 9 | 9 | * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH |
|---|
| 10 | 10 | * Copyright(c) 2015 - 2016 Intel Deutschland GmbH |
|---|
| 11 | | - * Copyright(c) 2018 Intel Corporation |
|---|
| 11 | + * Copyright(c) 2018 - 2020 Intel Corporation |
|---|
| 12 | 12 | * |
|---|
| 13 | 13 | * This program is free software; you can redistribute it and/or modify |
|---|
| 14 | 14 | * it under the terms of version 2 of the GNU General Public License as |
|---|
| .. | .. |
|---|
| 31 | 31 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. |
|---|
| 32 | 32 | * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH |
|---|
| 33 | 33 | * Copyright(c) 2015 - 2016 Intel Deutschland GmbH |
|---|
| 34 | | - * Copyright(c) 2018 Intel Corporation |
|---|
| 34 | + * Copyright(c) 2018 - 2020 Intel Corporation |
|---|
| 35 | 35 | * All rights reserved. |
|---|
| 36 | 36 | * |
|---|
| 37 | 37 | * Redistribution and use in source and binary forms, with or without |
|---|
| .. | .. |
|---|
| 70 | 70 | #include <linux/wait.h> |
|---|
| 71 | 71 | |
|---|
| 72 | 72 | #include "iwl-trans.h" /* for IWL_MAX_TID_COUNT */ |
|---|
| 73 | | -#include "fw-api.h" /* IWL_MVM_STATION_COUNT */ |
|---|
| 73 | +#include "fw-api.h" /* IWL_MVM_STATION_COUNT_MAX */ |
|---|
| 74 | 74 | #include "rs.h" |
|---|
| 75 | 75 | |
|---|
| 76 | 76 | struct iwl_mvm; |
|---|
| .. | .. |
|---|
| 297 | 297 | |
|---|
| 298 | 298 | /** |
|---|
| 299 | 299 | * struct iwl_mvm_tid_data - holds the states for each RA / TID |
|---|
| 300 | | - * @deferred_tx_frames: deferred TX frames for this RA/TID |
|---|
| 301 | 300 | * @seq_number: the next WiFi sequence number to use |
|---|
| 302 | 301 | * @next_reclaimed: the WiFi sequence number of the next packet to be acked. |
|---|
| 303 | 302 | * This is basically (last acked packet++). |
|---|
| .. | .. |
|---|
| 312 | 311 | * Basically when next_reclaimed reaches ssn, we can tell mac80211 that |
|---|
| 313 | 312 | * we are ready to finish the Tx AGG stop / start flow. |
|---|
| 314 | 313 | * @tx_time: medium time consumed by this A-MPDU |
|---|
| 315 | | - * @is_tid_active: has this TID sent traffic in the last |
|---|
| 316 | | - * %IWL_MVM_DQA_QUEUE_TIMEOUT time period. If %txq_id is invalid, this |
|---|
| 317 | | - * field should be ignored. |
|---|
| 318 | 314 | * @tpt_meas_start: time of the throughput measurements start, is reset every HZ |
|---|
| 319 | 315 | * @tx_count_last: number of frames transmitted during the last second |
|---|
| 320 | 316 | * @tx_count: counts the number of frames transmitted since the last reset of |
|---|
| 321 | 317 | * tpt_meas_start |
|---|
| 322 | 318 | */ |
|---|
| 323 | 319 | struct iwl_mvm_tid_data { |
|---|
| 324 | | - struct sk_buff_head deferred_tx_frames; |
|---|
| 325 | 320 | u16 seq_number; |
|---|
| 326 | 321 | u16 next_reclaimed; |
|---|
| 327 | 322 | /* The rest is Tx AGG related */ |
|---|
| .. | .. |
|---|
| 332 | 327 | u16 txq_id; |
|---|
| 333 | 328 | u16 ssn; |
|---|
| 334 | 329 | u16 tx_time; |
|---|
| 335 | | - bool is_tid_active; |
|---|
| 336 | 330 | unsigned long tpt_meas_start; |
|---|
| 337 | 331 | u32 tx_count_last; |
|---|
| 338 | 332 | u32 tx_count; |
|---|
| .. | .. |
|---|
| 349 | 343 | u32 baid; |
|---|
| 350 | 344 | } __packed; |
|---|
| 351 | 345 | |
|---|
| 352 | | -struct iwl_mvm_delba_notif { |
|---|
| 346 | +struct iwl_mvm_nssn_sync_data { |
|---|
| 347 | + u32 baid; |
|---|
| 348 | + u32 nssn; |
|---|
| 349 | +} __packed; |
|---|
| 350 | + |
|---|
| 351 | +struct iwl_mvm_rss_sync_notif { |
|---|
| 353 | 352 | struct iwl_mvm_internal_rxq_notif metadata; |
|---|
| 354 | | - struct iwl_mvm_delba_data delba; |
|---|
| 353 | + union { |
|---|
| 354 | + struct iwl_mvm_delba_data delba; |
|---|
| 355 | + struct iwl_mvm_nssn_sync_data nssn_sync; |
|---|
| 356 | + }; |
|---|
| 355 | 357 | } __packed; |
|---|
| 356 | 358 | |
|---|
| 357 | 359 | /** |
|---|
| .. | .. |
|---|
| 392 | 394 | * @amsdu_enabled: bitmap of TX AMSDU allowed TIDs. |
|---|
| 393 | 395 | * In case TLC offload is not active it is either 0xFFFF or 0. |
|---|
| 394 | 396 | * @max_amsdu_len: max AMSDU length |
|---|
| 397 | + * @orig_amsdu_len: used to save the original amsdu_len when it is changed via |
|---|
| 398 | + * debugfs. If it's set to 0, it means that it is it's not set via |
|---|
| 399 | + * debugfs. |
|---|
| 395 | 400 | * @agg_tids: bitmap of tids whose status is operational aggregated (IWL_AGG_ON) |
|---|
| 396 | 401 | * @sleep_tx_count: the number of frames that we told the firmware to let out |
|---|
| 397 | 402 | * even when that station is asleep. This is useful in case the queue |
|---|
| .. | .. |
|---|
| 401 | 406 | * @ptk_pn: per-queue PTK PN data structures |
|---|
| 402 | 407 | * @dup_data: per queue duplicate packet detection data |
|---|
| 403 | 408 | * @deferred_traffic_tid_map: indication bitmap of deferred traffic per-TID |
|---|
| 409 | + * @tx_ant: the index of the antenna to use for data tx to this station. Only |
|---|
| 410 | + * used during connection establishment (e.g. for the 4 way handshake |
|---|
| 411 | + * exchange). |
|---|
| 404 | 412 | * |
|---|
| 405 | 413 | * When mac80211 creates a station it reserves some space (hw->sta_data_size) |
|---|
| 406 | 414 | * in the structure for use by driver. This structure is placed in that |
|---|
| .. | .. |
|---|
| 428 | 436 | struct iwl_mvm_key_pn __rcu *ptk_pn[4]; |
|---|
| 429 | 437 | struct iwl_mvm_rxq_dup_data *dup_data; |
|---|
| 430 | 438 | |
|---|
| 431 | | - u16 deferred_traffic_tid_map; |
|---|
| 432 | | - |
|---|
| 433 | 439 | u8 reserved_queue; |
|---|
| 434 | 440 | |
|---|
| 435 | 441 | /* Temporary, until the new TLC will control the Tx protection */ |
|---|
| .. | .. |
|---|
| 439 | 445 | bool disable_tx; |
|---|
| 440 | 446 | u16 amsdu_enabled; |
|---|
| 441 | 447 | u16 max_amsdu_len; |
|---|
| 448 | + u16 orig_amsdu_len; |
|---|
| 442 | 449 | bool sleeping; |
|---|
| 443 | 450 | u8 agg_tids; |
|---|
| 444 | 451 | u8 sleep_tx_count; |
|---|
| 445 | 452 | u8 avg_energy; |
|---|
| 453 | + u8 tx_ant; |
|---|
| 446 | 454 | }; |
|---|
| 447 | 455 | |
|---|
| 448 | 456 | u16 iwl_mvm_tid_queued(struct iwl_mvm *mvm, struct iwl_mvm_tid_data *tid_data); |
|---|
| .. | .. |
|---|
| 532 | 540 | int iwl_mvm_sta_tx_agg(struct iwl_mvm *mvm, struct ieee80211_sta *sta, |
|---|
| 533 | 541 | int tid, u8 queue, bool start); |
|---|
| 534 | 542 | |
|---|
| 535 | | -int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm); |
|---|
| 536 | | -void iwl_mvm_del_aux_sta(struct iwl_mvm *mvm); |
|---|
| 543 | +int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm, u32 lmac_id); |
|---|
| 544 | +int iwl_mvm_rm_aux_sta(struct iwl_mvm *mvm); |
|---|
| 537 | 545 | |
|---|
| 538 | 546 | int iwl_mvm_alloc_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif); |
|---|
| 539 | 547 | int iwl_mvm_send_add_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif); |
|---|
| .. | .. |
|---|
| 571 | 579 | bool disable); |
|---|
| 572 | 580 | void iwl_mvm_csa_client_absent(struct iwl_mvm *mvm, struct ieee80211_vif *vif); |
|---|
| 573 | 581 | void iwl_mvm_add_new_dqa_stream_wk(struct work_struct *wk); |
|---|
| 574 | | - |
|---|
| 575 | | -int iwl_mvm_scd_queue_redirect(struct iwl_mvm *mvm, int queue, int tid, |
|---|
| 576 | | - int ac, int ssn, unsigned int wdg_timeout, |
|---|
| 577 | | - bool force); |
|---|
| 578 | | - |
|---|
| 582 | +int iwl_mvm_add_pasn_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif, |
|---|
| 583 | + struct iwl_mvm_int_sta *sta, u8 *addr, u32 cipher, |
|---|
| 584 | + u8 *key, u32 key_len); |
|---|
| 579 | 585 | #endif /* __sta_h__ */ |
|---|