iwlwifi: mvm: Ignore wifi mcc update in the driver while associated
authorHaim Dreyfuss <haim.dreyfuss@intel.com>
Thu, 2 Feb 2017 12:49:50 +0000 (14:49 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 25 Apr 2017 19:38:07 +0000 (22:38 +0300)
Wifi mcc (mobile country code) update is forbidden while associated.
Currently, FW prevents these updates and the driver is unaware to
this logic. From now on, the FW sends every wifi mcc update to the
driver. The driver in his turn needs to decide whether to
ignore it or not, depends on the association state.

Signed-off-by: Haim Dreyfuss <haim.dreyfuss@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
drivers/net/wireless/intel/iwlwifi/mvm/utils.c

index ab87c0203b6f85dbfd2baa9d5e497b3ef2db4161..1bb4249fc6f41e405a75bee8d88064dbbd91509e 100644 (file)
@@ -1827,6 +1827,7 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
                                     u32 size);
 void iwl_mvm_reorder_timer_expired(unsigned long data);
 struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm);
+bool iwl_mvm_is_vif_assoc(struct iwl_mvm *mvm);
 
 void iwl_mvm_inactivity_check(struct iwl_mvm *mvm);
 
index eade099b6dbf43c7378acb60057952549a6ba39f..283c41df622cf1bb7693ef1b223ae5822074e59a 100644 (file)
@@ -7,7 +7,7 @@
  *
  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
- * Copyright(c) 2016        Intel Deutschland GmbH
+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -34,7 +34,7 @@
  *
  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
- * Copyright(c) 2016        Intel Deutschland GmbH
+ * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -817,6 +817,11 @@ void iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm,
 
        lockdep_assert_held(&mvm->mutex);
 
+       if (iwl_mvm_is_vif_assoc(mvm) && notif->source_id == MCC_SOURCE_WIFI) {
+               IWL_DEBUG_LAR(mvm, "Ignore mcc update while associated\n");
+               return;
+       }
+
        if (WARN_ON_ONCE(!iwl_mvm_is_lar_supported(mvm)))
                return;
 
index 987edc98a203c19885a11f31609c156234e40d01..175e927493d67a857921976a08e471f2677eaffd 100644 (file)
@@ -1063,6 +1063,35 @@ struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm)
        return bss_iter_data.vif;
 }
 
+struct iwl_sta_iter_data {
+       bool assoc;
+};
+
+static void iwl_mvm_sta_iface_iterator(void *_data, u8 *mac,
+                                      struct ieee80211_vif *vif)
+{
+       struct iwl_sta_iter_data *data = _data;
+
+       if (vif->type != NL80211_IFTYPE_STATION)
+               return;
+
+       if (vif->bss_conf.assoc)
+               data->assoc = true;
+}
+
+bool iwl_mvm_is_vif_assoc(struct iwl_mvm *mvm)
+{
+       struct iwl_sta_iter_data data = {
+               .assoc = false,
+       };
+
+       ieee80211_iterate_active_interfaces_atomic(mvm->hw,
+                                                  IEEE80211_IFACE_ITER_NORMAL,
+                                                  iwl_mvm_sta_iface_iterator,
+                                                  &data);
+       return data.assoc;
+}
+
 unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm,
                                    struct ieee80211_vif *vif,
                                    bool tdls, bool cmd_q)