Merge tag 'wireless-drivers-next-2021-12-07' of git://git.kernel.org/pub/scm/linux...
authorJakub Kicinski <kuba@kernel.org>
Wed, 8 Dec 2021 05:01:16 +0000 (21:01 -0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 8 Dec 2021 05:01:18 +0000 (21:01 -0800)
Kalle Valo says:

====================
wireless-drivers-next patches for v5.17

First set of patches for v5.17. The biggest change is the iwlmei
driver for Intel's AMT devices. Also now WCN6855 support in ath11k
should be usable.

Major changes:

ath10k
 * fetch (pre-)calibration data via nvmem subsystem

ath11k
 * enable 802.11 power save mode in station mode for qca6390 and wcn6855
 * trace log support
 * proper board file detection for WCN6855 based on PCI ids
 * BSS color change support

rtw88
 * add debugfs file to force lowest basic rate
 * add quirk to disable PCI ASPM on HP 250 G7 Notebook PC

mwifiex
 * add quirk to disable deep sleep with certain hardware revision in
  Surface Book 2 devices

iwlwifi
 * add iwlmei driver for co-operating with Intel's Active Management
   Technology (AMT) devices

* tag 'wireless-drivers-next-2021-12-07' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next: (87 commits)
  iwlwifi: mei: fix linking when tracing is not enabled
  rtlwifi: rtl8192de: Style clean-ups
  mwl8k: Use named struct for memcpy() region
  intersil: Use struct_group() for memcpy() region
  libertas_tf: Use struct_group() for memcpy() region
  libertas: Use struct_group() for memcpy() region
  wlcore: no need to initialise statics to false
  rsi: Fix out-of-bounds read in rsi_read_pkt()
  rsi: Fix use-after-free in rsi_rx_done_handler()
  brcmfmac: Configure keep-alive packet on suspend
  wilc1000: remove '-Wunused-but-set-variable' warning in chip_wakeup()
  iwlwifi: mvm: read the rfkill state and feed it to iwlmei
  iwlwifi: mvm: add vendor commands needed for iwlmei
  iwlwifi: integrate with iwlmei
  iwlwifi: mei: add debugfs hooks
  iwlwifi: mei: add the driver to allow cooperation with CSME
  mei: bus: add client dma interface
  mwifiex: Ignore BTCOEX events from the 88W8897 firmware
  mwifiex: Ensure the version string from the firmware is 0-terminated
  mwifiex: Add quirk to disable deep sleep with certain hardware revision
  ...
====================

Link: https://lore.kernel.org/r/20211207144211.A9949C341C1@smtp.kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1  2 
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/ops.c
drivers/net/wireless/intel/iwlwifi/pcie/drv.c

@@@ -1118,32 -1143,13 +1144,34 @@@ static int iwl_mvm_mac_start(struct iee
  {
        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
        int ret;
 +      int retry, max_retry = 0;
  
        mutex_lock(&mvm->mutex);
 -      ret = __iwl_mvm_mac_start(mvm);
 +
 +      /* we are starting the mac not in error flow, and restart is enabled */
 +      if (!test_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED, &mvm->status) &&
 +          iwlwifi_mod_params.fw_restart) {
 +              max_retry = IWL_MAX_INIT_RETRY;
 +              /*
 +               * This will prevent mac80211 recovery flows to trigger during
 +               * init failures
 +               */
 +              set_bit(IWL_MVM_STATUS_STARTING, &mvm->status);
 +      }
 +
 +      for (retry = 0; retry <= max_retry; retry++) {
 +              ret = __iwl_mvm_mac_start(mvm);
 +              if (!ret)
 +                      break;
 +
 +              IWL_ERR(mvm, "mac start retry %d\n", retry);
 +      }
 +      clear_bit(IWL_MVM_STATUS_STARTING, &mvm->status);
 +
        mutex_unlock(&mvm->mutex);
  
+       iwl_mvm_mei_set_sw_rfkill_state(mvm);
        return ret;
  }
  
@@@ -1136,9 -1149,13 +1151,14 @@@ enum iwl_mvm_status 
        IWL_MVM_STATUS_FIRMWARE_RUNNING,
        IWL_MVM_STATUS_NEED_FLUSH_P2P,
        IWL_MVM_STATUS_IN_D3,
 +      IWL_MVM_STATUS_STARTING,
  };
  
+ struct iwl_mvm_csme_conn_info {
+       struct rcu_head rcu_head;
+       struct iwl_mei_conn_info conn_info;
+ };
  /* Keep track of completed init configuration */
  enum iwl_mvm_init_status {
        IWL_MVM_INIT_STATUS_THERMAL_INIT_COMPLETE = BIT(0),
@@@ -683,14 -683,42 +683,43 @@@ static const struct iwl_fw_runtime_ops 
  
  static int iwl_mvm_start_get_nvm(struct iwl_mvm *mvm)
  {
+       struct iwl_trans *trans = mvm->trans;
        int ret;
  
+       if (trans->csme_own) {
+               if (WARN(!mvm->mei_registered,
+                        "csme is owner, but we aren't registered to iwlmei\n"))
+                       goto get_nvm_from_fw;
+               mvm->mei_nvm_data = iwl_mei_get_nvm();
+               if (mvm->mei_nvm_data) {
+                       /*
+                        * mvm->mei_nvm_data is set and because of that,
+                        * we'll load the NVM from the FW when we'll get
+                        * ownership.
+                        */
+                       mvm->nvm_data =
+                               iwl_parse_mei_nvm_data(trans, trans->cfg,
+                                                      mvm->mei_nvm_data, mvm->fw);
+                       return 0;
+               }
+               IWL_ERR(mvm,
+                       "Got a NULL NVM from CSME, trying to get it from the device\n");
+       }
+ get_nvm_from_fw:
        rtnl_lock();
 +      wiphy_lock(mvm->hw->wiphy);
        mutex_lock(&mvm->mutex);
  
-       ret = iwl_run_init_mvm_ucode(mvm);
+       ret = iwl_trans_start_hw(mvm->trans);
+       if (ret) {
+               mutex_unlock(&mvm->mutex);
+               return ret;
+       }
  
+       ret = iwl_run_init_mvm_ucode(mvm);
        if (ret && ret != -ERFKILL)
                iwl_fw_dbg_error_collect(&mvm->fwrt, FW_DBG_TRIGGER_DRIVER);
        if (!ret && iwl_mvm_is_lar_supported(mvm)) {
                iwl_mvm_stop_device(mvm);
  
        mutex_unlock(&mvm->mutex);
 +      wiphy_unlock(mvm->hw->wiphy);
        rtnl_unlock();
  
-       if (ret < 0)
+       if (ret)
                IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", ret);
  
        return ret;