Linux 3.9-rc8
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / iwlwifi / mvm / mac80211.c
1 /******************************************************************************
2  *
3  * This file is provided under a dual BSD/GPLv2 license.  When using or
4  * redistributing this file, you may do so under either license.
5  *
6  * GPL LICENSE SUMMARY
7  *
8  * Copyright(c) 2012 - 2013 Intel Corporation. All rights reserved.
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of version 2 of the GNU General Public License as
12  * published by the Free Software Foundation.
13  *
14  * This program is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
22  * USA
23  *
24  * The full GNU General Public License is included in this distribution
25  * in the file called LICENSE.GPL.
26  *
27  * Contact Information:
28  *  Intel Linux Wireless <ilw@linux.intel.com>
29  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
30  *
31  * BSD LICENSE
32  *
33  * Copyright(c) 2012 - 2013 Intel Corporation. All rights reserved.
34  * All rights reserved.
35  *
36  * Redistribution and use in source and binary forms, with or without
37  * modification, are permitted provided that the following conditions
38  * are met:
39  *
40  *  * Redistributions of source code must retain the above copyright
41  *    notice, this list of conditions and the following disclaimer.
42  *  * Redistributions in binary form must reproduce the above copyright
43  *    notice, this list of conditions and the following disclaimer in
44  *    the documentation and/or other materials provided with the
45  *    distribution.
46  *  * Neither the name Intel Corporation nor the names of its
47  *    contributors may be used to endorse or promote products derived
48  *    from this software without specific prior written permission.
49  *
50  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
51  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
52  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
53  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
54  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
55  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
56  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
57  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
58  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
59  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
60  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61  *
62  *****************************************************************************/
63 #include <linux/kernel.h>
64 #include <linux/slab.h>
65 #include <linux/skbuff.h>
66 #include <linux/netdevice.h>
67 #include <linux/etherdevice.h>
68 #include <net/mac80211.h>
69
70 #include "iwl-op-mode.h"
71 #include "iwl-io.h"
72 #include "mvm.h"
73 #include "sta.h"
74 #include "time-event.h"
75 #include "iwl-eeprom-parse.h"
76 #include "fw-api-scan.h"
77 #include "iwl-phy-db.h"
78
79 static const struct ieee80211_iface_limit iwl_mvm_limits[] = {
80         {
81                 .max = 1,
82                 .types = BIT(NL80211_IFTYPE_STATION) |
83                         BIT(NL80211_IFTYPE_AP),
84         },
85         {
86                 .max = 1,
87                 .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
88                         BIT(NL80211_IFTYPE_P2P_GO),
89         },
90         {
91                 .max = 1,
92                 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
93         },
94 };
95
96 static const struct ieee80211_iface_combination iwl_mvm_iface_combinations[] = {
97         {
98                 .num_different_channels = 1,
99                 .max_interfaces = 3,
100                 .limits = iwl_mvm_limits,
101                 .n_limits = ARRAY_SIZE(iwl_mvm_limits),
102         },
103 };
104
105 int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
106 {
107         struct ieee80211_hw *hw = mvm->hw;
108         int num_mac, ret;
109
110         /* Tell mac80211 our characteristics */
111         hw->flags = IEEE80211_HW_SIGNAL_DBM |
112                     IEEE80211_HW_SPECTRUM_MGMT |
113                     IEEE80211_HW_REPORTS_TX_ACK_STATUS |
114                     IEEE80211_HW_QUEUE_CONTROL |
115                     IEEE80211_HW_WANT_MONITOR_VIF |
116                     IEEE80211_HW_SUPPORTS_PS |
117                     IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
118                     IEEE80211_HW_AMPDU_AGGREGATION |
119                     IEEE80211_HW_TIMING_BEACON_ONLY;
120
121         hw->queues = IWL_FIRST_AMPDU_QUEUE;
122         hw->offchannel_tx_hw_queue = IWL_OFFCHANNEL_QUEUE;
123         hw->rate_control_algorithm = "iwl-mvm-rs";
124
125         /*
126          * Enable 11w if advertised by firmware and software crypto
127          * is not enabled (as the firmware will interpret some mgmt
128          * packets, so enabling it with software crypto isn't safe)
129          */
130         if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_MFP &&
131             !iwlwifi_mod_params.sw_crypto)
132                 hw->flags |= IEEE80211_HW_MFP_CAPABLE;
133
134         hw->sta_data_size = sizeof(struct iwl_mvm_sta);
135         hw->vif_data_size = sizeof(struct iwl_mvm_vif);
136         hw->chanctx_data_size = sizeof(struct iwl_mvm_phy_ctxt);
137
138         hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
139                 BIT(NL80211_IFTYPE_P2P_CLIENT) |
140                 BIT(NL80211_IFTYPE_AP) |
141                 BIT(NL80211_IFTYPE_P2P_GO) |
142                 BIT(NL80211_IFTYPE_P2P_DEVICE);
143
144         hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY |
145                             WIPHY_FLAG_DISABLE_BEACON_HINTS |
146                             WIPHY_FLAG_IBSS_RSN;
147
148         hw->wiphy->iface_combinations = iwl_mvm_iface_combinations;
149         hw->wiphy->n_iface_combinations =
150                 ARRAY_SIZE(iwl_mvm_iface_combinations);
151
152         hw->wiphy->max_remain_on_channel_duration = 500;
153         hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL;
154
155         /* Extract MAC address */
156         memcpy(mvm->addresses[0].addr, mvm->nvm_data->hw_addr, ETH_ALEN);
157         hw->wiphy->addresses = mvm->addresses;
158         hw->wiphy->n_addresses = 1;
159         num_mac = mvm->nvm_data->n_hw_addrs;
160         if (num_mac > 1) {
161                 memcpy(mvm->addresses[1].addr, mvm->addresses[0].addr,
162                        ETH_ALEN);
163                 mvm->addresses[1].addr[5]++;
164                 hw->wiphy->n_addresses++;
165         }
166
167         /* we create the 802.11 header and a max-length SSID element */
168         hw->wiphy->max_scan_ie_len =
169                 mvm->fw->ucode_capa.max_probe_length - 24 - 34;
170         hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX;
171
172         if (mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels)
173                 hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
174                         &mvm->nvm_data->bands[IEEE80211_BAND_2GHZ];
175         if (mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels)
176                 hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
177                         &mvm->nvm_data->bands[IEEE80211_BAND_5GHZ];
178
179         hw->wiphy->hw_version = mvm->trans->hw_id;
180
181         if (iwlwifi_mod_params.power_save)
182                 hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
183         else
184                 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
185
186         hw->wiphy->features |= NL80211_FEATURE_P2P_GO_CTWIN |
187                                NL80211_FEATURE_P2P_GO_OPPPS;
188
189         mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
190
191 #ifdef CONFIG_PM_SLEEP
192         if (mvm->fw->img[IWL_UCODE_WOWLAN].sec[0].len &&
193             mvm->trans->ops->d3_suspend &&
194             mvm->trans->ops->d3_resume &&
195             device_can_wakeup(mvm->trans->dev)) {
196                 hw->wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
197                                           WIPHY_WOWLAN_DISCONNECT |
198                                           WIPHY_WOWLAN_EAP_IDENTITY_REQ |
199                                           WIPHY_WOWLAN_RFKILL_RELEASE;
200                 if (!iwlwifi_mod_params.sw_crypto)
201                         hw->wiphy->wowlan.flags |=
202                                 WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
203                                 WIPHY_WOWLAN_GTK_REKEY_FAILURE |
204                                 WIPHY_WOWLAN_4WAY_HANDSHAKE;
205
206                 hw->wiphy->wowlan.n_patterns = IWL_WOWLAN_MAX_PATTERNS;
207                 hw->wiphy->wowlan.pattern_min_len = IWL_WOWLAN_MIN_PATTERN_LEN;
208                 hw->wiphy->wowlan.pattern_max_len = IWL_WOWLAN_MAX_PATTERN_LEN;
209         }
210 #endif
211
212         ret = iwl_mvm_leds_init(mvm);
213         if (ret)
214                 return ret;
215
216         return ieee80211_register_hw(mvm->hw);
217 }
218
219 static void iwl_mvm_mac_tx(struct ieee80211_hw *hw,
220                            struct ieee80211_tx_control *control,
221                            struct sk_buff *skb)
222 {
223         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
224
225         if (test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status)) {
226                 IWL_DEBUG_DROP(mvm, "Dropping - RF KILL\n");
227                 goto drop;
228         }
229
230         if (IEEE80211_SKB_CB(skb)->hw_queue == IWL_OFFCHANNEL_QUEUE &&
231             !test_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status))
232                 goto drop;
233
234         if (control->sta) {
235                 if (iwl_mvm_tx_skb(mvm, skb, control->sta))
236                         goto drop;
237                 return;
238         }
239
240         if (iwl_mvm_tx_skb_non_sta(mvm, skb))
241                 goto drop;
242         return;
243  drop:
244         ieee80211_free_txskb(hw, skb);
245 }
246
247 static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw *hw,
248                                     struct ieee80211_vif *vif,
249                                     enum ieee80211_ampdu_mlme_action action,
250                                     struct ieee80211_sta *sta, u16 tid,
251                                     u16 *ssn, u8 buf_size)
252 {
253         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
254         int ret;
255
256         IWL_DEBUG_HT(mvm, "A-MPDU action on addr %pM tid %d: action %d\n",
257                      sta->addr, tid, action);
258
259         if (!(mvm->nvm_data->sku_cap_11n_enable))
260                 return -EACCES;
261
262         mutex_lock(&mvm->mutex);
263
264         switch (action) {
265         case IEEE80211_AMPDU_RX_START:
266                 if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG) {
267                         ret = -EINVAL;
268                         break;
269                 }
270                 ret = iwl_mvm_sta_rx_agg(mvm, sta, tid, *ssn, true);
271                 break;
272         case IEEE80211_AMPDU_RX_STOP:
273                 ret = iwl_mvm_sta_rx_agg(mvm, sta, tid, 0, false);
274                 break;
275         case IEEE80211_AMPDU_TX_START:
276                 ret = iwl_mvm_sta_tx_agg_start(mvm, vif, sta, tid, ssn);
277                 break;
278         case IEEE80211_AMPDU_TX_STOP_CONT:
279         case IEEE80211_AMPDU_TX_STOP_FLUSH:
280         case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
281                 ret = iwl_mvm_sta_tx_agg_stop(mvm, vif, sta, tid);
282                 break;
283         case IEEE80211_AMPDU_TX_OPERATIONAL:
284                 ret = iwl_mvm_sta_tx_agg_oper(mvm, vif, sta, tid, buf_size);
285                 break;
286         default:
287                 WARN_ON_ONCE(1);
288                 ret = -EINVAL;
289                 break;
290         }
291         mutex_unlock(&mvm->mutex);
292
293         return ret;
294 }
295
296 static void iwl_mvm_cleanup_iterator(void *data, u8 *mac,
297                                      struct ieee80211_vif *vif)
298 {
299         struct iwl_mvm *mvm = data;
300         struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
301
302         mvmvif->uploaded = false;
303         mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT;
304
305         /* does this make sense at all? */
306         mvmvif->color++;
307
308         spin_lock_bh(&mvm->time_event_lock);
309         iwl_mvm_te_clear_data(mvm, &mvmvif->time_event_data);
310         spin_unlock_bh(&mvm->time_event_lock);
311
312         if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
313                 mvmvif->phy_ctxt = NULL;
314 }
315
316 static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
317 {
318         iwl_trans_stop_device(mvm->trans);
319         iwl_trans_stop_hw(mvm->trans, false);
320
321         mvm->scan_status = IWL_MVM_SCAN_NONE;
322
323         /* just in case one was running */
324         ieee80211_remain_on_channel_expired(mvm->hw);
325
326         ieee80211_iterate_active_interfaces_atomic(
327                 mvm->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
328                 iwl_mvm_cleanup_iterator, mvm);
329
330         memset(mvm->fw_key_table, 0, sizeof(mvm->fw_key_table));
331         memset(mvm->sta_drained, 0, sizeof(mvm->sta_drained));
332
333         ieee80211_wake_queues(mvm->hw);
334
335         mvm->vif_count = 0;
336 }
337
338 static int iwl_mvm_mac_start(struct ieee80211_hw *hw)
339 {
340         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
341         int ret;
342
343         mutex_lock(&mvm->mutex);
344
345         /* Clean up some internal and mac80211 state on restart */
346         if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
347                 iwl_mvm_restart_cleanup(mvm);
348
349         ret = iwl_mvm_up(mvm);
350         mutex_unlock(&mvm->mutex);
351
352         return ret;
353 }
354
355 static void iwl_mvm_mac_restart_complete(struct ieee80211_hw *hw)
356 {
357         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
358         int ret;
359
360         mutex_lock(&mvm->mutex);
361
362         clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
363         ret = iwl_mvm_update_quotas(mvm, NULL);
364         if (ret)
365                 IWL_ERR(mvm, "Failed to update quotas after restart (%d)\n",
366                         ret);
367
368         mutex_unlock(&mvm->mutex);
369 }
370
371 static void iwl_mvm_mac_stop(struct ieee80211_hw *hw)
372 {
373         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
374
375         flush_work(&mvm->async_handlers_wk);
376
377         mutex_lock(&mvm->mutex);
378         /* async_handlers_wk is now blocked */
379
380         /*
381          * The work item could be running or queued if the
382          * ROC time event stops just as we get here.
383          */
384         cancel_work_sync(&mvm->roc_done_wk);
385
386         iwl_trans_stop_device(mvm->trans);
387         iwl_trans_stop_hw(mvm->trans, false);
388
389         iwl_mvm_async_handlers_purge(mvm);
390         /* async_handlers_list is empty and will stay empty: HW is stopped */
391
392         /* the fw is stopped, the aux sta is dead: clean up driver state */
393         iwl_mvm_dealloc_int_sta(mvm, &mvm->aux_sta);
394
395         mutex_unlock(&mvm->mutex);
396
397         /*
398          * The worker might have been waiting for the mutex, let it run and
399          * discover that its list is now empty.
400          */
401         cancel_work_sync(&mvm->async_handlers_wk);
402 }
403
404 static void iwl_mvm_pm_disable_iterator(void *data, u8 *mac,
405                                         struct ieee80211_vif *vif)
406 {
407         struct iwl_mvm *mvm = data;
408         int ret;
409
410         ret = iwl_mvm_power_disable(mvm, vif);
411         if (ret)
412                 IWL_ERR(mvm, "failed to disable power management\n");
413 }
414
415 static void iwl_mvm_power_update_iterator(void *data, u8 *mac,
416                                           struct ieee80211_vif *vif)
417 {
418         struct iwl_mvm *mvm = data;
419
420         iwl_mvm_power_update_mode(mvm, vif);
421 }
422
423 static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
424                                      struct ieee80211_vif *vif)
425 {
426         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
427         struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
428         int ret;
429
430         /*
431          * Not much to do here. The stack will not allow interface
432          * types or combinations that we didn't advertise, so we
433          * don't really have to check the types.
434          */
435
436         mutex_lock(&mvm->mutex);
437
438         /* Allocate resources for the MAC context, and add it the the fw  */
439         ret = iwl_mvm_mac_ctxt_init(mvm, vif);
440         if (ret)
441                 goto out_unlock;
442
443         /*
444          * The AP binding flow can be done only after the beacon
445          * template is configured (which happens only in the mac80211
446          * start_ap() flow), and adding the broadcast station can happen
447          * only after the binding.
448          * In addition, since modifying the MAC before adding a bcast
449          * station is not allowed by the FW, delay the adding of MAC context to
450          * the point where we can also add the bcast station.
451          * In short: there's not much we can do at this point, other than
452          * allocating resources :)
453          */
454         if (vif->type == NL80211_IFTYPE_AP) {
455                 u32 qmask = iwl_mvm_mac_get_queues_mask(mvm, vif);
456                 ret = iwl_mvm_allocate_int_sta(mvm, &mvmvif->bcast_sta,
457                                                qmask);
458                 if (ret) {
459                         IWL_ERR(mvm, "Failed to allocate bcast sta\n");
460                         goto out_release;
461                 }
462
463                 goto out_unlock;
464         }
465
466         /*
467          * TODO: remove this temporary code.
468          * Currently MVM FW supports power management only on single MAC.
469          * Iterate and disable PM on all active interfaces.
470          * Note: the method below does not count the new interface being added
471          * at this moment.
472          */
473         mvm->vif_count++;
474         if (mvm->vif_count > 1) {
475                 IWL_DEBUG_MAC80211(mvm,
476                                    "Disable power on existing interfaces\n");
477                 ieee80211_iterate_active_interfaces_atomic(
478                                             mvm->hw,
479                                             IEEE80211_IFACE_ITER_NORMAL,
480                                             iwl_mvm_pm_disable_iterator, mvm);
481         }
482
483         ret = iwl_mvm_mac_ctxt_add(mvm, vif);
484         if (ret)
485                 goto out_release;
486
487         /*
488          * Update power state on the new interface. Admittedly, based on
489          * mac80211 logics this power update will disable power management
490          */
491         iwl_mvm_power_update_mode(mvm, vif);
492
493         /*
494          * P2P_DEVICE interface does not have a channel context assigned to it,
495          * so a dedicated PHY context is allocated to it and the corresponding
496          * MAC context is bound to it at this stage.
497          */
498         if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
499                 struct ieee80211_channel *chan;
500                 struct cfg80211_chan_def chandef;
501
502                 mvmvif->phy_ctxt = &mvm->phy_ctxt_roc;
503
504                 /*
505                  * The channel used here isn't relevant as it's
506                  * going to be overwritten as part of the ROC flow.
507                  * For now use the first channel we have.
508                  */
509                 chan = &mvm->hw->wiphy->bands[IEEE80211_BAND_2GHZ]->channels[0];
510                 cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_NO_HT);
511                 ret = iwl_mvm_phy_ctxt_add(mvm, mvmvif->phy_ctxt,
512                                            &chandef, 1, 1);
513                 if (ret)
514                         goto out_remove_mac;
515
516                 ret = iwl_mvm_binding_add_vif(mvm, vif);
517                 if (ret)
518                         goto out_remove_phy;
519
520                 ret = iwl_mvm_add_bcast_sta(mvm, vif, &mvmvif->bcast_sta);
521                 if (ret)
522                         goto out_unbind;
523
524                 /* Save a pointer to p2p device vif, so it can later be used to
525                  * update the p2p device MAC when a GO is started/stopped */
526                 mvm->p2p_device_vif = vif;
527         }
528
529         goto out_unlock;
530
531  out_unbind:
532         iwl_mvm_binding_remove_vif(mvm, vif);
533  out_remove_phy:
534         iwl_mvm_phy_ctxt_remove(mvm, mvmvif->phy_ctxt);
535  out_remove_mac:
536         mvmvif->phy_ctxt = NULL;
537         iwl_mvm_mac_ctxt_remove(mvm, vif);
538  out_release:
539         /*
540          * TODO: remove this temporary code.
541          * Currently MVM FW supports power management only on single MAC.
542          * Check if only one additional interface remains after rereasing
543          * current one. Update power mode on the remaining interface.
544          */
545         mvm->vif_count--;
546         IWL_DEBUG_MAC80211(mvm, "Currently %d interfaces active\n",
547                            mvm->vif_count);
548         if (mvm->vif_count == 1) {
549                 ieee80211_iterate_active_interfaces(
550                                         mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
551                                         iwl_mvm_power_update_iterator, mvm);
552         }
553         iwl_mvm_mac_ctxt_release(mvm, vif);
554  out_unlock:
555         mutex_unlock(&mvm->mutex);
556
557         return ret;
558 }
559
560 static void iwl_mvm_prepare_mac_removal(struct iwl_mvm *mvm,
561                                         struct ieee80211_vif *vif)
562 {
563         u32 tfd_msk = 0, ac;
564
565         for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
566                 if (vif->hw_queue[ac] != IEEE80211_INVAL_HW_QUEUE)
567                         tfd_msk |= BIT(vif->hw_queue[ac]);
568
569         if (vif->cab_queue != IEEE80211_INVAL_HW_QUEUE)
570                 tfd_msk |= BIT(vif->cab_queue);
571
572         if (tfd_msk) {
573                 mutex_lock(&mvm->mutex);
574                 iwl_mvm_flush_tx_path(mvm, tfd_msk, true);
575                 mutex_unlock(&mvm->mutex);
576         }
577
578         if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
579                 /*
580                  * Flush the ROC worker which will flush the OFFCHANNEL queue.
581                  * We assume here that all the packets sent to the OFFCHANNEL
582                  * queue are sent in ROC session.
583                  */
584                 flush_work(&mvm->roc_done_wk);
585         } else {
586                 /*
587                  * By now, all the AC queues are empty. The AGG queues are
588                  * empty too. We already got all the Tx responses for all the
589                  * packets in the queues. The drain work can have been
590                  * triggered. Flush it. This work item takes the mutex, so kill
591                  * it before we take it.
592                  */
593                 flush_work(&mvm->sta_drained_wk);
594         }
595 }
596
597 static void iwl_mvm_mac_remove_interface(struct ieee80211_hw *hw,
598                                          struct ieee80211_vif *vif)
599 {
600         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
601         struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
602
603         iwl_mvm_prepare_mac_removal(mvm, vif);
604
605         mutex_lock(&mvm->mutex);
606
607         /*
608          * For AP/GO interface, the tear down of the resources allocated to the
609          * interface is be handled as part of the stop_ap flow.
610          */
611         if (vif->type == NL80211_IFTYPE_AP) {
612                 iwl_mvm_dealloc_int_sta(mvm, &mvmvif->bcast_sta);
613                 goto out_release;
614         }
615
616         if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
617                 mvm->p2p_device_vif = NULL;
618                 iwl_mvm_rm_bcast_sta(mvm, &mvmvif->bcast_sta);
619                 iwl_mvm_binding_remove_vif(mvm, vif);
620                 iwl_mvm_phy_ctxt_remove(mvm, mvmvif->phy_ctxt);
621                 mvmvif->phy_ctxt = NULL;
622         }
623
624         /*
625          * TODO: remove this temporary code.
626          * Currently MVM FW supports power management only on single MAC.
627          * Check if only one additional interface remains after removing
628          * current one. Update power mode on the remaining interface.
629          */
630         if (mvm->vif_count)
631                 mvm->vif_count--;
632         IWL_DEBUG_MAC80211(mvm, "Currently %d interfaces active\n",
633                            mvm->vif_count);
634         if (mvm->vif_count == 1) {
635                 ieee80211_iterate_active_interfaces(
636                                         mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
637                                         iwl_mvm_power_update_iterator, mvm);
638         }
639
640         iwl_mvm_mac_ctxt_remove(mvm, vif);
641
642 out_release:
643         iwl_mvm_mac_ctxt_release(mvm, vif);
644         mutex_unlock(&mvm->mutex);
645 }
646
647 static int iwl_mvm_mac_config(struct ieee80211_hw *hw, u32 changed)
648 {
649         return 0;
650 }
651
652 static void iwl_mvm_configure_filter(struct ieee80211_hw *hw,
653                                      unsigned int changed_flags,
654                                      unsigned int *total_flags,
655                                      u64 multicast)
656 {
657         *total_flags = 0;
658 }
659
660 static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
661                                              struct ieee80211_vif *vif,
662                                              struct ieee80211_bss_conf *bss_conf,
663                                              u32 changes)
664 {
665         struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
666         int ret;
667
668         ret = iwl_mvm_mac_ctxt_changed(mvm, vif);
669         if (ret)
670                 IWL_ERR(mvm, "failed to update MAC %pM\n", vif->addr);
671
672         if (changes & BSS_CHANGED_ASSOC) {
673                 if (bss_conf->assoc) {
674                         /* add quota for this interface */
675                         ret = iwl_mvm_update_quotas(mvm, vif);
676                         if (ret) {
677                                 IWL_ERR(mvm, "failed to update quotas\n");
678                                 return;
679                         }
680                 } else if (mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) {
681                         /* remove AP station now that the MAC is unassoc */
682                         ret = iwl_mvm_rm_sta_id(mvm, vif, mvmvif->ap_sta_id);
683                         if (ret)
684                                 IWL_ERR(mvm, "failed to remove AP station\n");
685                         mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT;
686                         /* remove quota for this interface */
687                         ret = iwl_mvm_update_quotas(mvm, NULL);
688                         if (ret)
689                                 IWL_ERR(mvm, "failed to update quotas\n");
690                 }
691         } else if (changes & BSS_CHANGED_DTIM_PERIOD) {
692                 /*
693                  * We received a beacon _after_ association so
694                  * remove the session protection.
695                  */
696                 iwl_mvm_remove_time_event(mvm, mvmvif,
697                                           &mvmvif->time_event_data);
698         } else if (changes & BSS_CHANGED_PS) {
699                 /*
700                  * TODO: remove this temporary code.
701                  * Currently MVM FW supports power management only on single
702                  * MAC. Avoid power mode update if more than one interface
703                  * is active.
704                  */
705                 IWL_DEBUG_MAC80211(mvm, "Currently %d interfaces active\n",
706                                    mvm->vif_count);
707                 if (mvm->vif_count == 1) {
708                         ret = iwl_mvm_power_update_mode(mvm, vif);
709                         if (ret)
710                                 IWL_ERR(mvm, "failed to update power mode\n");
711                 }
712         }
713 }
714
715 static int iwl_mvm_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
716 {
717         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
718         struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
719         int ret;
720
721         mutex_lock(&mvm->mutex);
722
723         /* Send the beacon template */
724         ret = iwl_mvm_mac_ctxt_beacon_changed(mvm, vif);
725         if (ret)
726                 goto out_unlock;
727
728         /* Add the mac context */
729         ret = iwl_mvm_mac_ctxt_add(mvm, vif);
730         if (ret)
731                 goto out_unlock;
732
733         /* Perform the binding */
734         ret = iwl_mvm_binding_add_vif(mvm, vif);
735         if (ret)
736                 goto out_remove;
737
738         mvmvif->ap_active = true;
739
740         /* Send the bcast station. At this stage the TBTT and DTIM time events
741          * are added and applied to the scheduler */
742         ret = iwl_mvm_send_bcast_sta(mvm, vif, &mvmvif->bcast_sta);
743         if (ret)
744                 goto out_unbind;
745
746         ret = iwl_mvm_update_quotas(mvm, vif);
747         if (ret)
748                 goto out_rm_bcast;
749
750         /* Need to update the P2P Device MAC */
751         if (vif->p2p && mvm->p2p_device_vif)
752                 iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif);
753
754         mutex_unlock(&mvm->mutex);
755         return 0;
756
757 out_rm_bcast:
758         iwl_mvm_send_rm_bcast_sta(mvm, &mvmvif->bcast_sta);
759 out_unbind:
760         iwl_mvm_binding_remove_vif(mvm, vif);
761 out_remove:
762         iwl_mvm_mac_ctxt_remove(mvm, vif);
763 out_unlock:
764         mutex_unlock(&mvm->mutex);
765         return ret;
766 }
767
768 static void iwl_mvm_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
769 {
770         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
771         struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
772
773         iwl_mvm_prepare_mac_removal(mvm, vif);
774
775         mutex_lock(&mvm->mutex);
776
777         mvmvif->ap_active = false;
778
779         /* Need to update the P2P Device MAC */
780         if (vif->p2p && mvm->p2p_device_vif)
781                 iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif);
782
783         iwl_mvm_update_quotas(mvm, NULL);
784         iwl_mvm_send_rm_bcast_sta(mvm, &mvmvif->bcast_sta);
785         iwl_mvm_binding_remove_vif(mvm, vif);
786         iwl_mvm_mac_ctxt_remove(mvm, vif);
787
788         mutex_unlock(&mvm->mutex);
789 }
790
791 static void iwl_mvm_bss_info_changed_ap(struct iwl_mvm *mvm,
792                                         struct ieee80211_vif *vif,
793                                         struct ieee80211_bss_conf *bss_conf,
794                                         u32 changes)
795 {
796         /* Need to send a new beacon template to the FW */
797         if (changes & BSS_CHANGED_BEACON) {
798                 if (iwl_mvm_mac_ctxt_beacon_changed(mvm, vif))
799                         IWL_WARN(mvm, "Failed updating beacon data\n");
800         }
801 }
802
803 static void iwl_mvm_bss_info_changed(struct ieee80211_hw *hw,
804                                      struct ieee80211_vif *vif,
805                                      struct ieee80211_bss_conf *bss_conf,
806                                      u32 changes)
807 {
808         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
809
810         mutex_lock(&mvm->mutex);
811
812         switch (vif->type) {
813         case NL80211_IFTYPE_STATION:
814                 iwl_mvm_bss_info_changed_station(mvm, vif, bss_conf, changes);
815                 break;
816         case NL80211_IFTYPE_AP:
817                 iwl_mvm_bss_info_changed_ap(mvm, vif, bss_conf, changes);
818                 break;
819         default:
820                 /* shouldn't happen */
821                 WARN_ON_ONCE(1);
822         }
823
824         mutex_unlock(&mvm->mutex);
825 }
826
827 static int iwl_mvm_mac_hw_scan(struct ieee80211_hw *hw,
828                                struct ieee80211_vif *vif,
829                                struct cfg80211_scan_request *req)
830 {
831         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
832         int ret;
833
834         if (req->n_channels == 0 || req->n_channels > MAX_NUM_SCAN_CHANNELS)
835                 return -EINVAL;
836
837         mutex_lock(&mvm->mutex);
838
839         if (mvm->scan_status == IWL_MVM_SCAN_NONE)
840                 ret = iwl_mvm_scan_request(mvm, vif, req);
841         else
842                 ret = -EBUSY;
843
844         mutex_unlock(&mvm->mutex);
845
846         return ret;
847 }
848
849 static void iwl_mvm_mac_cancel_hw_scan(struct ieee80211_hw *hw,
850                                        struct ieee80211_vif *vif)
851 {
852         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
853
854         mutex_lock(&mvm->mutex);
855
856         iwl_mvm_cancel_scan(mvm);
857
858         mutex_unlock(&mvm->mutex);
859 }
860
861 static void
862 iwl_mvm_mac_allow_buffered_frames(struct ieee80211_hw *hw,
863                                   struct ieee80211_sta *sta, u16 tid,
864                                   int num_frames,
865                                   enum ieee80211_frame_release_type reason,
866                                   bool more_data)
867 {
868         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
869
870         /* TODO: how do we tell the fw to send frames for a specific TID */
871
872         /*
873          * The fw will send EOSP notification when the last frame will be
874          * transmitted.
875          */
876         iwl_mvm_sta_modify_sleep_tx_count(mvm, sta, reason, num_frames);
877 }
878
879 static void iwl_mvm_mac_sta_notify(struct ieee80211_hw *hw,
880                                    struct ieee80211_vif *vif,
881                                    enum sta_notify_cmd cmd,
882                                    struct ieee80211_sta *sta)
883 {
884         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
885         struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv;
886
887         switch (cmd) {
888         case STA_NOTIFY_SLEEP:
889                 if (atomic_read(&mvmsta->pending_frames) > 0)
890                         ieee80211_sta_block_awake(hw, sta, true);
891                 /*
892                  * The fw updates the STA to be asleep. Tx packets on the Tx
893                  * queues to this station will not be transmitted. The fw will
894                  * send a Tx response with TX_STATUS_FAIL_DEST_PS.
895                  */
896                 break;
897         case STA_NOTIFY_AWAKE:
898                 if (WARN_ON(mvmsta->sta_id == IWL_INVALID_STATION))
899                         break;
900                 iwl_mvm_sta_modify_ps_wake(mvm, sta);
901                 break;
902         default:
903                 break;
904         }
905 }
906
907 static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
908                                  struct ieee80211_vif *vif,
909                                  struct ieee80211_sta *sta,
910                                  enum ieee80211_sta_state old_state,
911                                  enum ieee80211_sta_state new_state)
912 {
913         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
914         struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
915         int ret;
916
917         IWL_DEBUG_MAC80211(mvm, "station %pM state change %d->%d\n",
918                            sta->addr, old_state, new_state);
919
920         /* this would be a mac80211 bug ... but don't crash */
921         if (WARN_ON_ONCE(!mvmvif->phy_ctxt))
922                 return -EINVAL;
923
924         /* if a STA is being removed, reuse its ID */
925         flush_work(&mvm->sta_drained_wk);
926
927         mutex_lock(&mvm->mutex);
928         if (old_state == IEEE80211_STA_NOTEXIST &&
929             new_state == IEEE80211_STA_NONE) {
930                 ret = iwl_mvm_add_sta(mvm, vif, sta);
931         } else if (old_state == IEEE80211_STA_NONE &&
932                    new_state == IEEE80211_STA_AUTH) {
933                 ret = 0;
934         } else if (old_state == IEEE80211_STA_AUTH &&
935                    new_state == IEEE80211_STA_ASSOC) {
936                 ret = iwl_mvm_update_sta(mvm, vif, sta);
937                 if (ret == 0)
938                         iwl_mvm_rs_rate_init(mvm, sta,
939                                              mvmvif->phy_ctxt->channel->band);
940         } else if (old_state == IEEE80211_STA_ASSOC &&
941                    new_state == IEEE80211_STA_AUTHORIZED) {
942                 ret = 0;
943         } else if (old_state == IEEE80211_STA_AUTHORIZED &&
944                    new_state == IEEE80211_STA_ASSOC) {
945                 ret = 0;
946         } else if (old_state == IEEE80211_STA_ASSOC &&
947                    new_state == IEEE80211_STA_AUTH) {
948                 ret = 0;
949         } else if (old_state == IEEE80211_STA_AUTH &&
950                    new_state == IEEE80211_STA_NONE) {
951                 ret = 0;
952         } else if (old_state == IEEE80211_STA_NONE &&
953                    new_state == IEEE80211_STA_NOTEXIST) {
954                 ret = iwl_mvm_rm_sta(mvm, vif, sta);
955         } else {
956                 ret = -EIO;
957         }
958         mutex_unlock(&mvm->mutex);
959
960         return ret;
961 }
962
963 static int iwl_mvm_mac_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
964 {
965         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
966
967         mvm->rts_threshold = value;
968
969         return 0;
970 }
971
972 static int iwl_mvm_mac_conf_tx(struct ieee80211_hw *hw,
973                                struct ieee80211_vif *vif, u16 ac,
974                                const struct ieee80211_tx_queue_params *params)
975 {
976         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
977         struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
978
979         mvmvif->queue_params[ac] = *params;
980
981         /*
982          * No need to update right away, we'll get BSS_CHANGED_QOS
983          * The exception is P2P_DEVICE interface which needs immediate update.
984          */
985         if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
986                 int ret;
987
988                 mutex_lock(&mvm->mutex);
989                 ret = iwl_mvm_mac_ctxt_changed(mvm, vif);
990                 mutex_unlock(&mvm->mutex);
991                 return ret;
992         }
993         return 0;
994 }
995
996 static void iwl_mvm_mac_mgd_prepare_tx(struct ieee80211_hw *hw,
997                                       struct ieee80211_vif *vif)
998 {
999         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1000         u32 duration = min(IWL_MVM_TE_SESSION_PROTECTION_MAX_TIME_MS,
1001                            200 + vif->bss_conf.beacon_int);
1002         u32 min_duration = min(IWL_MVM_TE_SESSION_PROTECTION_MIN_TIME_MS,
1003                                100 + vif->bss_conf.beacon_int);
1004
1005         if (WARN_ON_ONCE(vif->bss_conf.assoc))
1006                 return;
1007
1008         mutex_lock(&mvm->mutex);
1009         /* Try really hard to protect the session and hear a beacon */
1010         iwl_mvm_protect_session(mvm, vif, duration, min_duration);
1011         mutex_unlock(&mvm->mutex);
1012 }
1013
1014 static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw,
1015                                enum set_key_cmd cmd,
1016                                struct ieee80211_vif *vif,
1017                                struct ieee80211_sta *sta,
1018                                struct ieee80211_key_conf *key)
1019 {
1020         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1021         int ret;
1022
1023         if (iwlwifi_mod_params.sw_crypto) {
1024                 IWL_DEBUG_MAC80211(mvm, "leave - hwcrypto disabled\n");
1025                 return -EOPNOTSUPP;
1026         }
1027
1028         switch (key->cipher) {
1029         case WLAN_CIPHER_SUITE_TKIP:
1030                 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
1031                 /* fall-through */
1032         case WLAN_CIPHER_SUITE_CCMP:
1033                 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1034                 break;
1035         case WLAN_CIPHER_SUITE_AES_CMAC:
1036                 WARN_ON_ONCE(!(hw->flags & IEEE80211_HW_MFP_CAPABLE));
1037                 break;
1038         case WLAN_CIPHER_SUITE_WEP40:
1039         case WLAN_CIPHER_SUITE_WEP104:
1040                 /*
1041                  * Support for TX only, at least for now, so accept
1042                  * the key and do nothing else. Then mac80211 will
1043                  * pass it for TX but we don't have to use it for RX.
1044                  */
1045                 return 0;
1046         default:
1047                 return -EOPNOTSUPP;
1048         }
1049
1050         mutex_lock(&mvm->mutex);
1051
1052         switch (cmd) {
1053         case SET_KEY:
1054                 IWL_DEBUG_MAC80211(mvm, "set hwcrypto key\n");
1055                 ret = iwl_mvm_set_sta_key(mvm, vif, sta, key, false);
1056                 if (ret) {
1057                         IWL_WARN(mvm, "set key failed\n");
1058                         /*
1059                          * can't add key for RX, but we don't need it
1060                          * in the device for TX so still return 0
1061                          */
1062                         ret = 0;
1063                 }
1064
1065                 break;
1066         case DISABLE_KEY:
1067                 IWL_DEBUG_MAC80211(mvm, "disable hwcrypto key\n");
1068                 ret = iwl_mvm_remove_sta_key(mvm, vif, sta, key);
1069                 break;
1070         default:
1071                 ret = -EINVAL;
1072         }
1073
1074         mutex_unlock(&mvm->mutex);
1075         return ret;
1076 }
1077
1078 static void iwl_mvm_mac_update_tkip_key(struct ieee80211_hw *hw,
1079                                         struct ieee80211_vif *vif,
1080                                         struct ieee80211_key_conf *keyconf,
1081                                         struct ieee80211_sta *sta,
1082                                         u32 iv32, u16 *phase1key)
1083 {
1084         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1085
1086         iwl_mvm_update_tkip_key(mvm, vif, keyconf, sta, iv32, phase1key);
1087 }
1088
1089
1090 static int iwl_mvm_roc(struct ieee80211_hw *hw,
1091                        struct ieee80211_vif *vif,
1092                        struct ieee80211_channel *channel,
1093                        int duration)
1094 {
1095         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1096         struct cfg80211_chan_def chandef;
1097         int ret;
1098
1099         if (vif->type != NL80211_IFTYPE_P2P_DEVICE) {
1100                 IWL_ERR(mvm, "vif isn't a P2P_DEVICE: %d\n", vif->type);
1101                 return -EINVAL;
1102         }
1103
1104         IWL_DEBUG_MAC80211(mvm, "enter (%d, %d)\n", channel->hw_value,
1105                            duration);
1106
1107         mutex_lock(&mvm->mutex);
1108
1109         cfg80211_chandef_create(&chandef, channel, NL80211_CHAN_NO_HT);
1110         ret = iwl_mvm_phy_ctxt_changed(mvm, &mvm->phy_ctxt_roc,
1111                                        &chandef, 1, 1);
1112
1113         /* Schedule the time events */
1114         ret = iwl_mvm_start_p2p_roc(mvm, vif, duration);
1115
1116         mutex_unlock(&mvm->mutex);
1117         IWL_DEBUG_MAC80211(mvm, "leave\n");
1118
1119         return ret;
1120 }
1121
1122 static int iwl_mvm_cancel_roc(struct ieee80211_hw *hw)
1123 {
1124         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1125
1126         IWL_DEBUG_MAC80211(mvm, "enter\n");
1127
1128         mutex_lock(&mvm->mutex);
1129         iwl_mvm_stop_p2p_roc(mvm);
1130         mutex_unlock(&mvm->mutex);
1131
1132         IWL_DEBUG_MAC80211(mvm, "leave\n");
1133         return 0;
1134 }
1135
1136 static int iwl_mvm_add_chanctx(struct ieee80211_hw *hw,
1137                                struct ieee80211_chanctx_conf *ctx)
1138 {
1139         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1140         struct iwl_mvm_phy_ctxt *phy_ctxt = (void *)ctx->drv_priv;
1141         int ret;
1142
1143         mutex_lock(&mvm->mutex);
1144
1145         IWL_DEBUG_MAC80211(mvm, "Add PHY context\n");
1146         ret = iwl_mvm_phy_ctxt_add(mvm, phy_ctxt, &ctx->def,
1147                                    ctx->rx_chains_static,
1148                                    ctx->rx_chains_dynamic);
1149         mutex_unlock(&mvm->mutex);
1150         return ret;
1151 }
1152
1153 static void iwl_mvm_remove_chanctx(struct ieee80211_hw *hw,
1154                                    struct ieee80211_chanctx_conf *ctx)
1155 {
1156         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1157         struct iwl_mvm_phy_ctxt *phy_ctxt = (void *)ctx->drv_priv;
1158
1159         mutex_lock(&mvm->mutex);
1160         iwl_mvm_phy_ctxt_remove(mvm, phy_ctxt);
1161         mutex_unlock(&mvm->mutex);
1162 }
1163
1164 static void iwl_mvm_change_chanctx(struct ieee80211_hw *hw,
1165                                    struct ieee80211_chanctx_conf *ctx,
1166                                    u32 changed)
1167 {
1168         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1169         struct iwl_mvm_phy_ctxt *phy_ctxt = (void *)ctx->drv_priv;
1170
1171         mutex_lock(&mvm->mutex);
1172         iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->def,
1173                                  ctx->rx_chains_static,
1174                                  ctx->rx_chains_dynamic);
1175         mutex_unlock(&mvm->mutex);
1176 }
1177
1178 static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw,
1179                                       struct ieee80211_vif *vif,
1180                                       struct ieee80211_chanctx_conf *ctx)
1181 {
1182         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1183         struct iwl_mvm_phy_ctxt *phyctx = (void *)ctx->drv_priv;
1184         struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1185         int ret;
1186
1187         mutex_lock(&mvm->mutex);
1188
1189         mvmvif->phy_ctxt = phyctx;
1190
1191         switch (vif->type) {
1192         case NL80211_IFTYPE_AP:
1193                 /*
1194                  * The AP binding flow is handled as part of the start_ap flow
1195                  * (in bss_info_changed).
1196                  */
1197                 ret = 0;
1198                 goto out_unlock;
1199         case NL80211_IFTYPE_STATION:
1200         case NL80211_IFTYPE_ADHOC:
1201         case NL80211_IFTYPE_MONITOR:
1202                 break;
1203         default:
1204                 ret = -EINVAL;
1205                 goto out_unlock;
1206         }
1207
1208         ret = iwl_mvm_binding_add_vif(mvm, vif);
1209         if (ret)
1210                 goto out_unlock;
1211
1212         /*
1213          * Setting the quota at this stage is only required for monitor
1214          * interfaces. For the other types, the bss_info changed flow
1215          * will handle quota settings.
1216          */
1217         if (vif->type == NL80211_IFTYPE_MONITOR) {
1218                 ret = iwl_mvm_update_quotas(mvm, vif);
1219                 if (ret)
1220                         goto out_remove_binding;
1221         }
1222
1223         goto out_unlock;
1224
1225  out_remove_binding:
1226         iwl_mvm_binding_remove_vif(mvm, vif);
1227  out_unlock:
1228         mutex_unlock(&mvm->mutex);
1229         if (ret)
1230                 mvmvif->phy_ctxt = NULL;
1231         return ret;
1232 }
1233
1234 static void iwl_mvm_unassign_vif_chanctx(struct ieee80211_hw *hw,
1235                                          struct ieee80211_vif *vif,
1236                                          struct ieee80211_chanctx_conf *ctx)
1237 {
1238         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1239         struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1240
1241         mutex_lock(&mvm->mutex);
1242
1243         iwl_mvm_remove_time_event(mvm, mvmvif, &mvmvif->time_event_data);
1244
1245         if (vif->type == NL80211_IFTYPE_AP)
1246                 goto out_unlock;
1247
1248         iwl_mvm_binding_remove_vif(mvm, vif);
1249         switch (vif->type) {
1250         case NL80211_IFTYPE_MONITOR:
1251                 iwl_mvm_update_quotas(mvm, vif);
1252                 break;
1253         default:
1254                 break;
1255         }
1256
1257 out_unlock:
1258         mvmvif->phy_ctxt = NULL;
1259         mutex_unlock(&mvm->mutex);
1260 }
1261
1262 static int iwl_mvm_set_tim(struct ieee80211_hw *hw,
1263                            struct ieee80211_sta *sta,
1264                            bool set)
1265 {
1266         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1267         struct iwl_mvm_sta *mvm_sta = (void *)sta->drv_priv;
1268
1269         if (!mvm_sta || !mvm_sta->vif) {
1270                 IWL_ERR(mvm, "Station is not associated to a vif\n");
1271                 return -EINVAL;
1272         }
1273
1274         return iwl_mvm_mac_ctxt_beacon_changed(mvm, mvm_sta->vif);
1275 }
1276
1277 struct ieee80211_ops iwl_mvm_hw_ops = {
1278         .tx = iwl_mvm_mac_tx,
1279         .ampdu_action = iwl_mvm_mac_ampdu_action,
1280         .start = iwl_mvm_mac_start,
1281         .restart_complete = iwl_mvm_mac_restart_complete,
1282         .stop = iwl_mvm_mac_stop,
1283         .add_interface = iwl_mvm_mac_add_interface,
1284         .remove_interface = iwl_mvm_mac_remove_interface,
1285         .config = iwl_mvm_mac_config,
1286         .configure_filter = iwl_mvm_configure_filter,
1287         .bss_info_changed = iwl_mvm_bss_info_changed,
1288         .hw_scan = iwl_mvm_mac_hw_scan,
1289         .cancel_hw_scan = iwl_mvm_mac_cancel_hw_scan,
1290         .sta_state = iwl_mvm_mac_sta_state,
1291         .sta_notify = iwl_mvm_mac_sta_notify,
1292         .allow_buffered_frames = iwl_mvm_mac_allow_buffered_frames,
1293         .set_rts_threshold = iwl_mvm_mac_set_rts_threshold,
1294         .conf_tx = iwl_mvm_mac_conf_tx,
1295         .mgd_prepare_tx = iwl_mvm_mac_mgd_prepare_tx,
1296         .set_key = iwl_mvm_mac_set_key,
1297         .update_tkip_key = iwl_mvm_mac_update_tkip_key,
1298         .remain_on_channel = iwl_mvm_roc,
1299         .cancel_remain_on_channel = iwl_mvm_cancel_roc,
1300
1301         .add_chanctx = iwl_mvm_add_chanctx,
1302         .remove_chanctx = iwl_mvm_remove_chanctx,
1303         .change_chanctx = iwl_mvm_change_chanctx,
1304         .assign_vif_chanctx = iwl_mvm_assign_vif_chanctx,
1305         .unassign_vif_chanctx = iwl_mvm_unassign_vif_chanctx,
1306
1307         .start_ap = iwl_mvm_start_ap,
1308         .stop_ap = iwl_mvm_stop_ap,
1309
1310         .set_tim = iwl_mvm_set_tim,
1311
1312 #ifdef CONFIG_PM_SLEEP
1313         /* look at d3.c */
1314         .suspend = iwl_mvm_suspend,
1315         .resume = iwl_mvm_resume,
1316         .set_wakeup = iwl_mvm_set_wakeup,
1317         .set_rekey_data = iwl_mvm_set_rekey_data,
1318 #if IS_ENABLED(CONFIG_IPV6)
1319         .ipv6_addr_change = iwl_mvm_ipv6_addr_change,
1320 #endif
1321         .set_default_unicast_key = iwl_mvm_set_default_unicast_key,
1322 #endif
1323 };