Lines Matching +full:wakeup +full:- +full:event +full:- +full:action
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
5 * Copyright (C) 2018 - 2019 Intel Corporation
12 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
18 #include <linux/dma-mapping.h>
31 #include "iwl-io.h"
32 #include "iwl-trans.h"
33 #include "iwl-op-mode.h"
34 #include "iwl-modparams.h"
87 struct ieee80211_hw *hw = priv->hw; in iwlagn_mac_setup_register()
90 hw->rate_control_algorithm = "iwl-agn-rs"; in iwlagn_mac_setup_register()
104 if (priv->trans->max_skb_frags) in iwlagn_mac_setup_register()
105 hw->netdev_features = NETIF_F_HIGHDMA | NETIF_F_SG; in iwlagn_mac_setup_register()
107 hw->offchannel_tx_hw_queue = IWL_AUX_QUEUE; in iwlagn_mac_setup_register()
108 hw->radiotap_mcs_details |= IEEE80211_RADIOTAP_MCS_HAVE_FMT; in iwlagn_mac_setup_register()
114 hw->max_tx_aggregation_subframes = LINK_QUAL_AGG_FRAME_LIMIT_DEF; in iwlagn_mac_setup_register()
117 if (priv->nvm_data->sku_cap_11n_enable) in iwlagn_mac_setup_register()
118 hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS | in iwlagn_mac_setup_register()
126 if (priv->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_MFP && in iwlagn_mac_setup_register()
130 hw->sta_data_size = sizeof(struct iwl_station_priv); in iwlagn_mac_setup_register()
131 hw->vif_data_size = sizeof(struct iwl_vif_priv); in iwlagn_mac_setup_register()
134 hw->wiphy->interface_modes |= ctx->interface_modes; in iwlagn_mac_setup_register()
135 hw->wiphy->interface_modes |= ctx->exclusive_interface_modes; in iwlagn_mac_setup_register()
140 if (hw->wiphy->interface_modes & BIT(NL80211_IFTYPE_AP)) { in iwlagn_mac_setup_register()
141 hw->wiphy->iface_combinations = in iwlagn_mac_setup_register()
143 hw->wiphy->n_iface_combinations = in iwlagn_mac_setup_register()
147 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; in iwlagn_mac_setup_register()
148 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG | in iwlagn_mac_setup_register()
152 if (priv->fw->img[IWL_UCODE_WOWLAN].num_sec && in iwlagn_mac_setup_register()
153 priv->trans->ops->d3_suspend && in iwlagn_mac_setup_register()
154 priv->trans->ops->d3_resume && in iwlagn_mac_setup_register()
155 device_can_wakeup(priv->trans->dev)) { in iwlagn_mac_setup_register()
156 priv->wowlan_support.flags = WIPHY_WOWLAN_MAGIC_PKT | in iwlagn_mac_setup_register()
161 priv->wowlan_support.flags |= in iwlagn_mac_setup_register()
165 priv->wowlan_support.n_patterns = IWLAGN_WOWLAN_MAX_PATTERNS; in iwlagn_mac_setup_register()
166 priv->wowlan_support.pattern_min_len = in iwlagn_mac_setup_register()
168 priv->wowlan_support.pattern_max_len = in iwlagn_mac_setup_register()
170 hw->wiphy->wowlan = &priv->wowlan_support; in iwlagn_mac_setup_register()
175 hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; in iwlagn_mac_setup_register()
177 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; in iwlagn_mac_setup_register()
179 hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX; in iwlagn_mac_setup_register()
180 /* we create the 802.11 header and a max-length SSID element */ in iwlagn_mac_setup_register()
181 hw->wiphy->max_scan_ie_len = capa->max_probe_length - 24 - 34; in iwlagn_mac_setup_register()
187 hw->queues = IWLAGN_FIRST_AMPDU_QUEUE; in iwlagn_mac_setup_register()
189 hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL; in iwlagn_mac_setup_register()
191 if (priv->nvm_data->bands[NL80211_BAND_2GHZ].n_channels) in iwlagn_mac_setup_register()
192 priv->hw->wiphy->bands[NL80211_BAND_2GHZ] = in iwlagn_mac_setup_register()
193 &priv->nvm_data->bands[NL80211_BAND_2GHZ]; in iwlagn_mac_setup_register()
194 if (priv->nvm_data->bands[NL80211_BAND_5GHZ].n_channels) in iwlagn_mac_setup_register()
195 priv->hw->wiphy->bands[NL80211_BAND_5GHZ] = in iwlagn_mac_setup_register()
196 &priv->nvm_data->bands[NL80211_BAND_5GHZ]; in iwlagn_mac_setup_register()
198 hw->wiphy->hw_version = priv->trans->hw_id; in iwlagn_mac_setup_register()
202 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in iwlagn_mac_setup_register()
203 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_EXT_KEY_ID); in iwlagn_mac_setup_register()
205 ret = ieee80211_register_hw(priv->hw); in iwlagn_mac_setup_register()
211 priv->mac80211_registered = 1; in iwlagn_mac_setup_register()
218 if (!priv->mac80211_registered) in iwlagn_mac_unregister()
221 ieee80211_unregister_hw(priv->hw); in iwlagn_mac_unregister()
222 priv->mac80211_registered = 0; in iwlagn_mac_unregister()
230 lockdep_assert_held(&priv->mutex); in __iwl_up()
232 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) { in __iwl_up()
234 return -EIO; in __iwl_up()
245 ret = iwl_trans_start_hw(priv->trans); in __iwl_up()
257 ret = iwl_trans_start_hw(priv->trans); in __iwl_up()
275 set_bit(STATUS_EXIT_PENDING, &priv->status); in __iwl_up()
277 clear_bit(STATUS_EXIT_PENDING, &priv->status); in __iwl_up()
291 mutex_lock(&priv->mutex); in iwlagn_mac_start()
293 mutex_unlock(&priv->mutex); in iwlagn_mac_start()
300 if (WARN_ON(!test_bit(STATUS_READY, &priv->status))) in iwlagn_mac_start()
301 ret = -EIO; in iwlagn_mac_start()
305 priv->is_open = 1; in iwlagn_mac_start()
316 if (!priv->is_open) in iwlagn_mac_stop()
319 priv->is_open = 0; in iwlagn_mac_stop()
321 mutex_lock(&priv->mutex); in iwlagn_mac_stop()
323 mutex_unlock(&priv->mutex); in iwlagn_mac_stop()
327 flush_workqueue(priv->workqueue); in iwlagn_mac_stop()
342 mutex_lock(&priv->mutex); in iwlagn_mac_set_rekey_data()
344 if (priv->contexts[IWL_RXON_CTX_BSS].vif != vif) in iwlagn_mac_set_rekey_data()
347 memcpy(priv->kek, data->kek, NL80211_KEK_LEN); in iwlagn_mac_set_rekey_data()
348 memcpy(priv->kck, data->kck, NL80211_KCK_LEN); in iwlagn_mac_set_rekey_data()
349 priv->replay_ctr = in iwlagn_mac_set_rekey_data()
350 cpu_to_le64(be64_to_cpup((__be64 *)&data->replay_ctr)); in iwlagn_mac_set_rekey_data()
351 priv->have_rekey_data = true; in iwlagn_mac_set_rekey_data()
354 mutex_unlock(&priv->mutex); in iwlagn_mac_set_rekey_data()
364 struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; in iwlagn_mac_suspend()
368 return -EINVAL; in iwlagn_mac_suspend()
371 mutex_lock(&priv->mutex); in iwlagn_mac_suspend()
374 if (!ctx->vif || ctx->vif->type != NL80211_IFTYPE_STATION || in iwlagn_mac_suspend()
385 iwl_write32(priv->trans, CSR_UCODE_DRV_GP1_SET, in iwlagn_mac_suspend()
388 iwl_trans_d3_suspend(priv->trans, false, true); in iwlagn_mac_suspend()
393 priv->wowlan = false; in iwlagn_mac_suspend()
395 ieee80211_restart_hw(priv->hw); in iwlagn_mac_suspend()
397 mutex_unlock(&priv->mutex); in iwlagn_mac_suspend()
413 struct iwl_priv *priv = resume_data->priv; in iwl_resume_status_fn()
415 if (iwl_rx_packet_payload_len(pkt) != sizeof(*resume_data->cmd)) { in iwl_resume_status_fn()
419 memcpy(resume_data->cmd, pkt->data, sizeof(*resume_data->cmd)); in iwl_resume_status_fn()
420 resume_data->valid = true; in iwl_resume_status_fn()
428 struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; in iwlagn_mac_resume()
448 struct cfg80211_wowlan_wakeup wakeup = { in iwlagn_mac_resume() local
449 .pattern_idx = -1, in iwlagn_mac_resume()
456 mutex_lock(&priv->mutex); in iwlagn_mac_resume()
458 /* we'll clear ctx->vif during iwlagn_prepare_restart() */ in iwlagn_mac_resume()
459 vif = ctx->vif; in iwlagn_mac_resume()
461 ret = iwl_trans_d3_resume(priv->trans, &d3_status, false, true); in iwlagn_mac_resume()
471 iwl_write32(priv->trans, CSR_UCODE_DRV_GP1_CLR, in iwlagn_mac_resume()
474 base = priv->device_pointers.error_event_table; in iwlagn_mac_resume()
480 iwl_trans_read_mem_bytes(priv->trans, base, in iwlagn_mac_resume()
487 wakeup.rfkill_release = true; in iwlagn_mac_resume()
488 ieee80211_report_wowlan_wakeup(vif, &wakeup, in iwlagn_mac_resume()
495 img = &priv->fw->img[IWL_UCODE_WOWLAN]; in iwlagn_mac_resume()
496 if (!priv->wowlan_sram) in iwlagn_mac_resume()
497 priv->wowlan_sram = in iwlagn_mac_resume()
498 kzalloc(img->sec[IWL_UCODE_SECTION_DATA].len, in iwlagn_mac_resume()
501 if (priv->wowlan_sram) in iwlagn_mac_resume()
502 iwl_trans_read_mem(priv->trans, 0x800000, in iwlagn_mac_resume()
503 priv->wowlan_sram, in iwlagn_mac_resume()
504 img->sec[IWL_UCODE_SECTION_DATA].len / 4); in iwlagn_mac_resume()
515 iwl_init_notification_wait(&priv->notif_wait, &status_wait, status_cmd, in iwlagn_mac_resume()
523 ret = iwl_wait_notification(&priv->notif_wait, &status_wait, HZ/5); in iwlagn_mac_resume()
527 if (resume_data.valid && priv->contexts[IWL_RXON_CTX_BSS].vif) { in iwlagn_mac_resume()
531 IWL_INFO(priv, "WoWLAN wakeup reason(s): 0x%.8x\n", reasons); in iwlagn_mac_resume()
535 wakeup.magic_pkt = true; in iwlagn_mac_resume()
537 wakeup.pattern_idx = status_data.pattern_number; in iwlagn_mac_resume()
540 wakeup.disconnect = true; in iwlagn_mac_resume()
542 wakeup.gtk_rekey_failure = true; in iwlagn_mac_resume()
544 wakeup.eap_identity_req = true; in iwlagn_mac_resume()
546 wakeup.four_way_handshake = true; in iwlagn_mac_resume()
547 wakeup_report = &wakeup; in iwlagn_mac_resume()
555 priv->wowlan = false; in iwlagn_mac_resume()
559 memset((void *)&ctx->active, 0, sizeof(ctx->active)); in iwlagn_mac_resume()
564 mutex_unlock(&priv->mutex); in iwlagn_mac_resume()
576 device_set_wakeup_enable(priv->trans->dev, enabled); in iwlagn_mac_set_wakeup()
586 if (iwlagn_tx_skb(priv, control->sta, skb)) in iwlagn_mac_tx()
607 struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv; in iwlagn_mac_set_key()
608 struct iwl_rxon_context *ctx = vif_priv->ctx; in iwlagn_mac_set_key()
615 IWL_DEBUG_MAC80211(priv, "leave - hwcrypto disabled\n"); in iwlagn_mac_set_key()
616 return -EOPNOTSUPP; in iwlagn_mac_set_key()
619 switch (key->cipher) { in iwlagn_mac_set_key()
621 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; in iwlagn_mac_set_key()
624 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; in iwlagn_mac_set_key()
635 * Mark key TX-only and return 0. in iwlagn_mac_set_key()
637 if (vif->type == NL80211_IFTYPE_ADHOC && in iwlagn_mac_set_key()
638 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) { in iwlagn_mac_set_key()
639 key->hw_key_idx = WEP_INVALID_OFFSET; in iwlagn_mac_set_key()
643 /* If they key was TX-only, accept deletion */ in iwlagn_mac_set_key()
644 if (cmd == DISABLE_KEY && key->hw_key_idx == WEP_INVALID_OFFSET) in iwlagn_mac_set_key()
647 mutex_lock(&priv->mutex); in iwlagn_mac_set_key()
658 if ((key->cipher == WLAN_CIPHER_SUITE_WEP40 || in iwlagn_mac_set_key()
659 key->cipher == WLAN_CIPHER_SUITE_WEP104) && !sta) { in iwlagn_mac_set_key()
661 is_default_wep_key = !ctx->key_mapping_keys; in iwlagn_mac_set_key()
664 key->hw_key_idx == IWLAGN_HW_KEY_DEFAULT; in iwlagn_mac_set_key()
671 ret = iwl_set_default_wep_key(priv, vif_priv->ctx, key); in iwlagn_mac_set_key()
674 ret = iwl_set_dynamic_key(priv, vif_priv->ctx, key, sta); in iwlagn_mac_set_key()
681 key->hw_key_idx = WEP_INVALID_OFFSET; in iwlagn_mac_set_key()
695 ret = -EINVAL; in iwlagn_mac_set_key()
698 mutex_unlock(&priv->mutex); in iwlagn_mac_set_key()
709 int ret = -EINVAL; in iwlagn_mac_ampdu_action()
710 struct ieee80211_sta *sta = params->sta; in iwlagn_mac_ampdu_action()
711 enum ieee80211_ampdu_mlme_action action = params->action; in iwlagn_mac_ampdu_action() local
712 u16 tid = params->tid; in iwlagn_mac_ampdu_action()
713 u16 *ssn = ¶ms->ssn; in iwlagn_mac_ampdu_action()
714 u8 buf_size = params->buf_size; in iwlagn_mac_ampdu_action()
715 struct iwl_station_priv *sta_priv = (void *) sta->drv_priv; in iwlagn_mac_ampdu_action()
717 IWL_DEBUG_HT(priv, "A-MPDU action on addr %pM tid %d\n", in iwlagn_mac_ampdu_action()
718 sta->addr, tid); in iwlagn_mac_ampdu_action()
720 if (!(priv->nvm_data->sku_cap_11n_enable)) in iwlagn_mac_ampdu_action()
721 return -EACCES; in iwlagn_mac_ampdu_action()
724 mutex_lock(&priv->mutex); in iwlagn_mac_ampdu_action()
726 switch (action) { in iwlagn_mac_ampdu_action()
738 if (!priv->trans->ops->txq_enable) in iwlagn_mac_ampdu_action()
753 if ((ret == 0) && (priv->agg_tids_count > 0)) { in iwlagn_mac_ampdu_action()
754 priv->agg_tids_count--; in iwlagn_mac_ampdu_action()
755 IWL_DEBUG_HT(priv, "priv->agg_tids_count = %u\n", in iwlagn_mac_ampdu_action()
756 priv->agg_tids_count); in iwlagn_mac_ampdu_action()
758 if (!priv->agg_tids_count && in iwlagn_mac_ampdu_action()
759 priv->hw_params.use_rts_for_aggregation) { in iwlagn_mac_ampdu_action()
763 sta_priv->lq_sta.lq.general_params.flags &= in iwlagn_mac_ampdu_action()
766 &sta_priv->lq_sta.lq, CMD_ASYNC, false); in iwlagn_mac_ampdu_action()
773 mutex_unlock(&priv->mutex); in iwlagn_mac_ampdu_action()
783 struct iwl_station_priv *sta_priv = (void *)sta->drv_priv; in iwlagn_mac_sta_add()
784 struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv; in iwlagn_mac_sta_add()
785 bool is_ap = vif->type == NL80211_IFTYPE_STATION; in iwlagn_mac_sta_add()
790 sta->addr); in iwlagn_mac_sta_add()
791 sta_priv->sta_id = IWL_INVALID_STATION; in iwlagn_mac_sta_add()
793 atomic_set(&sta_priv->pending_frames, 0); in iwlagn_mac_sta_add()
794 if (vif->type == NL80211_IFTYPE_AP) in iwlagn_mac_sta_add()
795 sta_priv->client = true; in iwlagn_mac_sta_add()
797 ret = iwl_add_station_common(priv, vif_priv->ctx, sta->addr, in iwlagn_mac_sta_add()
801 sta->addr, ret); in iwlagn_mac_sta_add()
806 sta_priv->sta_id = sta_id; in iwlagn_mac_sta_add()
816 struct iwl_station_priv *sta_priv = (void *)sta->drv_priv; in iwlagn_mac_sta_remove()
819 IWL_DEBUG_INFO(priv, "proceeding to remove station %pM\n", sta->addr); in iwlagn_mac_sta_remove()
821 if (vif->type == NL80211_IFTYPE_STATION) { in iwlagn_mac_sta_remove()
824 * is set to unassociated -- just deactivate it here in iwlagn_mac_sta_remove()
825 * to avoid re-programming it. in iwlagn_mac_sta_remove()
828 iwl_deactivate_station(priv, sta_priv->sta_id, sta->addr); in iwlagn_mac_sta_remove()
830 ret = iwl_remove_station(priv, sta_priv->sta_id, sta->addr); in iwlagn_mac_sta_remove()
833 "Error removing station %pM\n", sta->addr); in iwlagn_mac_sta_remove()
845 struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv; in iwlagn_mac_sta_state()
851 IWL_DEBUG_MAC80211(priv, "station %pM state change %d->%d\n", in iwlagn_mac_sta_state()
852 sta->addr, old_state, new_state); in iwlagn_mac_sta_state()
854 mutex_lock(&priv->mutex); in iwlagn_mac_sta_state()
855 if (vif->type == NL80211_IFTYPE_STATION) { in iwlagn_mac_sta_state()
880 * Clear the in-progress flag, the AP station entry was added in iwlagn_mac_sta_state()
882 * would also clear the in-progress flag). This is necessary in iwlagn_mac_sta_state()
885 spin_lock_bh(&priv->sta_lock); in iwlagn_mac_sta_state()
886 priv->stations[iwl_sta_id(sta)].used &= in iwlagn_mac_sta_state()
888 spin_unlock_bh(&priv->sta_lock); in iwlagn_mac_sta_state()
900 sta->addr); in iwlagn_mac_sta_state()
906 ret = iwl_sta_update_ht(priv, vif_priv->ctx, sta); in iwlagn_mac_sta_state()
911 sta->addr); in iwlagn_mac_sta_state()
927 mutex_unlock(&priv->mutex); in iwlagn_mac_sta_state()
938 struct ieee80211_conf *conf = &hw->conf; in iwlagn_mac_channel_switch()
939 struct ieee80211_channel *channel = ch_switch->chandef.chan; in iwlagn_mac_channel_switch()
940 struct iwl_ht_config *ht_conf = &priv->current_ht_config; in iwlagn_mac_channel_switch()
942 * MULTI-FIXME in iwlagn_mac_channel_switch()
949 struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; in iwlagn_mac_channel_switch()
954 mutex_lock(&priv->mutex); in iwlagn_mac_channel_switch()
959 if (test_bit(STATUS_EXIT_PENDING, &priv->status) || in iwlagn_mac_channel_switch()
960 test_bit(STATUS_SCANNING, &priv->status) || in iwlagn_mac_channel_switch()
961 test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) in iwlagn_mac_channel_switch()
967 if (!priv->lib->set_channel_switch) in iwlagn_mac_channel_switch()
970 ch = channel->hw_value; in iwlagn_mac_channel_switch()
971 if (le16_to_cpu(ctx->active.channel) == ch) in iwlagn_mac_channel_switch()
974 priv->current_ht_config.smps = conf->smps_mode; in iwlagn_mac_channel_switch()
977 switch (cfg80211_get_chandef_type(&ch_switch->chandef)) { in iwlagn_mac_channel_switch()
980 ctx->ht.is_40mhz = false; in iwlagn_mac_channel_switch()
981 ctx->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_NONE; in iwlagn_mac_channel_switch()
984 ctx->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_BELOW; in iwlagn_mac_channel_switch()
985 ctx->ht.is_40mhz = true; in iwlagn_mac_channel_switch()
988 ctx->ht.extension_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_ABOVE; in iwlagn_mac_channel_switch()
989 ctx->ht.is_40mhz = true; in iwlagn_mac_channel_switch()
993 if ((le16_to_cpu(ctx->staging.channel) != ch)) in iwlagn_mac_channel_switch()
994 ctx->staging.flags = 0; in iwlagn_mac_channel_switch()
998 iwl_set_flags_for_band(priv, ctx, channel->band, ctx->vif); in iwlagn_mac_channel_switch()
1004 set_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status); in iwlagn_mac_channel_switch()
1005 priv->switch_channel = cpu_to_le16(ch); in iwlagn_mac_channel_switch()
1006 if (priv->lib->set_channel_switch(priv, ch_switch)) { in iwlagn_mac_channel_switch()
1007 clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status); in iwlagn_mac_channel_switch()
1008 priv->switch_channel = 0; in iwlagn_mac_channel_switch()
1009 ieee80211_chswitch_done(ctx->vif, false); in iwlagn_mac_channel_switch()
1013 mutex_unlock(&priv->mutex); in iwlagn_mac_channel_switch()
1020 * MULTI-FIXME in iwl_chswitch_done()
1023 struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; in iwl_chswitch_done()
1025 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) in iwl_chswitch_done()
1028 if (!test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) in iwl_chswitch_done()
1031 if (ctx->vif) in iwl_chswitch_done()
1032 ieee80211_chswitch_done(ctx->vif, is_success); in iwl_chswitch_done()
1061 mutex_lock(&priv->mutex); in iwlagn_configure_filter()
1064 ctx->staging.filter_flags &= ~filter_nand; in iwlagn_configure_filter()
1065 ctx->staging.filter_flags |= filter_or; in iwlagn_configure_filter()
1073 mutex_unlock(&priv->mutex); in iwlagn_configure_filter()
1091 mutex_lock(&priv->mutex); in iwlagn_mac_flush()
1094 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) { in iwlagn_mac_flush()
1103 scd_queues = BIT(priv->trans->trans_cfg->base_params->num_of_queues) - 1; in iwlagn_mac_flush()
1117 iwl_trans_wait_tx_queues_empty(priv->trans, scd_queues); in iwlagn_mac_flush()
1119 mutex_unlock(&priv->mutex); in iwlagn_mac_flush()
1125 const struct ieee80211_event *event) in iwlagn_mac_event_callback() argument
1129 if (event->type != RSSI_EVENT) in iwlagn_mac_event_callback()
1134 if (priv->lib->bt_params && in iwlagn_mac_event_callback()
1135 priv->lib->bt_params->advanced_bt_coexist) { in iwlagn_mac_event_callback()
1136 if (event->u.rssi.data == RSSI_EVENT_LOW) in iwlagn_mac_event_callback()
1137 priv->bt_enable_pspoll = true; in iwlagn_mac_event_callback()
1138 else if (event->u.rssi.data == RSSI_EVENT_HIGH) in iwlagn_mac_event_callback()
1139 priv->bt_enable_pspoll = false; in iwlagn_mac_event_callback()
1141 queue_work(priv->workqueue, &priv->bt_runtime_config); in iwlagn_mac_event_callback()
1155 queue_work(priv->workqueue, &priv->beacon_update); in iwlagn_mac_set_tim()
1165 struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv; in iwlagn_mac_conf_tx()
1166 struct iwl_rxon_context *ctx = vif_priv->ctx; in iwlagn_mac_conf_tx()
1170 return -EINVAL; in iwlagn_mac_conf_tx()
1175 IWL_DEBUG_MAC80211(priv, "leave - RF not ready\n"); in iwlagn_mac_conf_tx()
1176 return -EIO; in iwlagn_mac_conf_tx()
1180 IWL_DEBUG_MAC80211(priv, "leave - queue >= AC_NUM %d\n", queue); in iwlagn_mac_conf_tx()
1184 q = AC_NUM - 1 - queue; in iwlagn_mac_conf_tx()
1186 mutex_lock(&priv->mutex); in iwlagn_mac_conf_tx()
1188 ctx->qos_data.def_qos_parm.ac[q].cw_min = in iwlagn_mac_conf_tx()
1189 cpu_to_le16(params->cw_min); in iwlagn_mac_conf_tx()
1190 ctx->qos_data.def_qos_parm.ac[q].cw_max = in iwlagn_mac_conf_tx()
1191 cpu_to_le16(params->cw_max); in iwlagn_mac_conf_tx()
1192 ctx->qos_data.def_qos_parm.ac[q].aifsn = params->aifs; in iwlagn_mac_conf_tx()
1193 ctx->qos_data.def_qos_parm.ac[q].edca_txop = in iwlagn_mac_conf_tx()
1194 cpu_to_le16((params->txop * 32)); in iwlagn_mac_conf_tx()
1196 ctx->qos_data.def_qos_parm.ac[q].reserved1 = 0; in iwlagn_mac_conf_tx()
1198 mutex_unlock(&priv->mutex); in iwlagn_mac_conf_tx()
1208 return priv->ibss_manager == IWL_IBSS_MANAGER; in iwlagn_mac_tx_last_beacon()
1223 struct ieee80211_vif *vif = ctx->vif; in iwl_setup_interface()
1226 lockdep_assert_held(&priv->mutex); in iwl_setup_interface()
1233 priv->iw_mode = vif->type; in iwl_setup_interface()
1235 ctx->is_active = true; in iwl_setup_interface()
1239 if (!ctx->always_active) in iwl_setup_interface()
1240 ctx->is_active = false; in iwl_setup_interface()
1244 if (priv->lib->bt_params && priv->lib->bt_params->advanced_bt_coexist && in iwl_setup_interface()
1245 vif->type == NL80211_IFTYPE_ADHOC) { in iwl_setup_interface()
1251 priv->bt_traffic_load = IWL_BT_COEX_TRAFFIC_LOAD_HIGH; in iwl_setup_interface()
1256 vif->hw_queue[ac] = ctx->ac_to_queue[ac]; in iwl_setup_interface()
1258 if (vif->type == NL80211_IFTYPE_AP) in iwl_setup_interface()
1259 vif->cab_queue = ctx->mcast_queue; in iwl_setup_interface()
1261 vif->cab_queue = IEEE80211_INVAL_HW_QUEUE; in iwl_setup_interface()
1270 struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv; in iwlagn_mac_add_interface()
1277 viftype, vif->addr); in iwlagn_mac_add_interface()
1279 mutex_lock(&priv->mutex); in iwlagn_mac_add_interface()
1283 err = -EINVAL; in iwlagn_mac_add_interface()
1289 tmp->interface_modes | tmp->exclusive_interface_modes; in iwlagn_mac_add_interface()
1291 if (tmp->vif) { in iwlagn_mac_add_interface()
1293 if (tmp->vif == vif) { in iwlagn_mac_add_interface()
1300 if (tmp->exclusive_interface_modes & in iwlagn_mac_add_interface()
1301 BIT(tmp->vif->type)) { in iwlagn_mac_add_interface()
1302 err = -EINVAL; in iwlagn_mac_add_interface()
1317 err = -EOPNOTSUPP; in iwlagn_mac_add_interface()
1321 vif_priv->ctx = ctx; in iwlagn_mac_add_interface()
1322 ctx->vif = vif; in iwlagn_mac_add_interface()
1327 * mac80211 doesn't (yet) provide a per-packet flag for in iwlagn_mac_add_interface()
1333 if (vif->type == NL80211_IFTYPE_MONITOR) in iwlagn_mac_add_interface()
1334 ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); in iwlagn_mac_add_interface()
1336 __clear_bit(IEEE80211_HW_RX_INCLUDES_FCS, priv->hw->flags); in iwlagn_mac_add_interface()
1342 ctx->vif = NULL; in iwlagn_mac_add_interface()
1343 priv->iw_mode = NL80211_IFTYPE_STATION; in iwlagn_mac_add_interface()
1345 mutex_unlock(&priv->mutex); in iwlagn_mac_add_interface()
1357 lockdep_assert_held(&priv->mutex); in iwl_teardown_interface()
1359 if (priv->scan_vif == vif) { in iwl_teardown_interface()
1366 if (!ctx->always_active) in iwl_teardown_interface()
1367 ctx->is_active = false; in iwl_teardown_interface()
1377 if (vif->type == NL80211_IFTYPE_ADHOC) in iwl_teardown_interface()
1378 priv->bt_traffic_load = priv->last_bt_traffic_load; in iwl_teardown_interface()
1389 mutex_lock(&priv->mutex); in iwlagn_mac_remove_interface()
1391 WARN_ON(ctx->vif != vif); in iwlagn_mac_remove_interface()
1392 ctx->vif = NULL; in iwlagn_mac_remove_interface()
1396 mutex_unlock(&priv->mutex); in iwlagn_mac_remove_interface()
1416 mutex_lock(&priv->mutex); in iwlagn_mac_change_interface()
1425 if (ctx->ctxid != IWL_RXON_CTX_BSS) { in iwlagn_mac_change_interface()
1426 err = -EBUSY; in iwlagn_mac_change_interface()
1430 if (!ctx->vif || !iwl_is_ready_rf(priv)) { in iwlagn_mac_change_interface()
1435 err = -EBUSY; in iwlagn_mac_change_interface()
1440 interface_modes = ctx->interface_modes | ctx->exclusive_interface_modes; in iwlagn_mac_change_interface()
1442 err = -EBUSY; in iwlagn_mac_change_interface()
1446 if (ctx->exclusive_interface_modes & BIT(newtype)) { in iwlagn_mac_change_interface()
1451 if (!tmp->is_active) in iwlagn_mac_change_interface()
1458 err = -EBUSY; in iwlagn_mac_change_interface()
1465 vif->type = newviftype; in iwlagn_mac_change_interface()
1466 vif->p2p = newp2p; in iwlagn_mac_change_interface()
1479 mutex_unlock(&priv->mutex); in iwlagn_mac_change_interface()
1490 struct cfg80211_scan_request *req = &hw_req->req; in iwlagn_mac_hw_scan()
1495 if (req->n_channels == 0) in iwlagn_mac_hw_scan()
1496 return -EINVAL; in iwlagn_mac_hw_scan()
1498 mutex_lock(&priv->mutex); in iwlagn_mac_hw_scan()
1504 if (priv->scan_type != IWL_SCAN_NORMAL) { in iwlagn_mac_hw_scan()
1506 "SCAN request during internal scan - defer\n"); in iwlagn_mac_hw_scan()
1507 priv->scan_request = req; in iwlagn_mac_hw_scan()
1508 priv->scan_vif = vif; in iwlagn_mac_hw_scan()
1511 priv->scan_request = req; in iwlagn_mac_hw_scan()
1512 priv->scan_vif = vif; in iwlagn_mac_hw_scan()
1518 req->channels[0]->band); in iwlagn_mac_hw_scan()
1520 priv->scan_request = NULL; in iwlagn_mac_hw_scan()
1521 priv->scan_vif = NULL; in iwlagn_mac_hw_scan()
1527 mutex_unlock(&priv->mutex); in iwlagn_mac_hw_scan()
1549 struct iwl_station_priv *sta_priv = (void *)sta->drv_priv; in iwlagn_mac_sta_notify()
1556 WARN_ON(!sta_priv->client); in iwlagn_mac_sta_notify()
1557 sta_priv->asleep = true; in iwlagn_mac_sta_notify()
1558 if (atomic_read(&sta_priv->pending_frames) > 0) in iwlagn_mac_sta_notify()
1562 WARN_ON(!sta_priv->client); in iwlagn_mac_sta_notify()
1563 if (!sta_priv->asleep) in iwlagn_mac_sta_notify()
1565 sta_priv->asleep = false; in iwlagn_mac_sta_notify()
1620 op_mode = hw->priv; in iwl_alloc_all()
1622 priv->hw = hw; in iwl_alloc_all()