Merge tag 'wireless-drivers-next-for-davem-2018-11-30' of git://git.kernel.org/pub...
authorDavid S. Miller <davem@davemloft.net>
Mon, 3 Dec 2018 23:44:27 +0000 (15:44 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 Dec 2018 23:44:27 +0000 (15:44 -0800)
Kalle Valo says:

====================
wireless-drivers-next patches for 4.21

First set of patches for 4.21. Most notable here is support for
Quantenna's QSR1000/QSR2000 chipsets and more flexible ways to provide
nvram files for brcmfmac.

Major changes:

brcmfmac

* add support for first trying to get a board specific nvram file

* add support for getting nvram contents from EFI variables

qtnfmac

* use single PCIe driver for all platforms and rename
  Kconfig option CONFIG_QTNFMAC_PEARL_PCIE to CONFIG_QTNFMAC_PCIE

* add support for QSR1000/QSR2000 (Topaz) family of chipsets

ath10k

* add support for WCN3990 firmware crash recovery

* add firmware memory dump support for QCA4019

wil6210

* add firmware error recovery while in AP mode

ath9k

* remove experimental notice from dynack feature

iwlwifi

* PCI IDs for some new 9000-series cards

* improve antenna usage on connection problems

* new firmware debugging infrastructure

* some more work on 802.11ax

* improve support for multiple RF modules with 22000 devices

cordic

* move cordic macros and defines to a public header file

* convert brcmsmac and b43 to fully use cordic library
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
1  2 
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
drivers/net/wireless/intel/iwlwifi/fw/runtime.h
drivers/net/wireless/intel/iwlwifi/mvm/fw.c
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/ops.c

index 7e49342bae384d25729e48ae31396ee958e6e967,c5130fa264eb502a7957a4f06583971dbc1e27a4..1db2a308f81ecbe47543297b1092f1bd9c56836c
@@@ -6296,8 -6296,10 +6296,10 @@@ static int ath10k_sta_state(struct ieee
                if (ath10k_debug_is_extd_tx_stats_enabled(ar)) {
                        arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats),
                                                  GFP_KERNEL);
-                       if (!arsta->tx_stats)
+                       if (!arsta->tx_stats) {
+                               ret = -ENOMEM;
                                goto exit;
+                       }
                }
  
                num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
                           "mac vdev %d peer delete %pM sta %pK (sta gone)\n",
                           arvif->vdev_id, sta->addr, sta);
  
-               if (ath10k_debug_is_extd_tx_stats_enabled(ar))
+               if (ath10k_debug_is_extd_tx_stats_enabled(ar)) {
                        kfree(arsta->tx_stats);
+                       arsta->tx_stats = NULL;
+               }
  
                if (sta->tdls) {
                        ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id,
@@@ -6867,7 -6871,7 +6871,7 @@@ static void ath10k_flush(struct ieee802
        u32 bitmap;
  
        if (drop) {
 -              if (vif->type == NL80211_IFTYPE_STATION) {
 +              if (vif && vif->type == NL80211_IFTYPE_STATION) {
                        bitmap = ~(1 << WMI_MGMT_TID);
                        list_for_each_entry(arvif, &ar->arvifs, list) {
                                if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
@@@ -8313,7 -8317,6 +8317,6 @@@ static u32 ath10k_mac_wrdd_get_mcc(stru
  
  static int ath10k_mac_get_wrdd_regulatory(struct ath10k *ar, u16 *rd)
  {
-       struct pci_dev __maybe_unused *pdev = to_pci_dev(ar->dev);
        acpi_handle root_handle;
        acpi_handle handle;
        struct acpi_buffer wrdd = {ACPI_ALLOCATE_BUFFER, NULL};
        u32 alpha2_code;
        char alpha2[3];
  
-       root_handle = ACPI_HANDLE(&pdev->dev);
+       root_handle = ACPI_HANDLE(ar->dev);
        if (!root_handle)
                return -EOPNOTSUPP;
  
index eb5db94f57453f2aed93e89a510fdd210bef7a34,40e94fe72f46553e075e244ceb69e0490175961a..8ac34821f1c13af637a88b8abde6da65b242d65b
@@@ -128,7 -128,7 +128,7 @@@ static void brcmu_d11n_decchspec(struc
                }
                break;
        default:
-               WARN_ON_ONCE(1);
+               WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
                break;
        }
  
                ch->band = BRCMU_CHAN_BAND_2G;
                break;
        default:
-               WARN_ON_ONCE(1);
+               WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
                break;
        }
  }
@@@ -167,7 -167,7 +167,7 @@@ static void brcmu_d11ac_decchspec(struc
                        ch->sb = BRCMU_CHAN_SB_U;
                        ch->control_ch_num += CH_10MHZ_APART;
                } else {
-                       WARN_ON_ONCE(1);
+                       WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
                }
                break;
        case BRCMU_CHSPEC_D11AC_BW_80:
                        ch->control_ch_num += CH_30MHZ_APART;
                        break;
                default:
-                       WARN_ON_ONCE(1);
+                       WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
                        break;
                }
                break;
        case BRCMU_CHSPEC_D11AC_BW_160:
 +              ch->bw = BRCMU_CHAN_BW_160;
 +              ch->sb = brcmu_maskget16(ch->chspec, BRCMU_CHSPEC_D11AC_SB_MASK,
 +                                       BRCMU_CHSPEC_D11AC_SB_SHIFT);
                switch (ch->sb) {
                case BRCMU_CHAN_SB_LLL:
                        ch->control_ch_num -= CH_70MHZ_APART;
                        ch->control_ch_num += CH_70MHZ_APART;
                        break;
                default:
-                       WARN_ON_ONCE(1);
+                       WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
                        break;
                }
                break;
        case BRCMU_CHSPEC_D11AC_BW_8080:
        default:
-               WARN_ON_ONCE(1);
+               WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
                break;
        }
  
                ch->band = BRCMU_CHAN_BAND_2G;
                break;
        default:
-               WARN_ON_ONCE(1);
+               WARN_ONCE(1, "Invalid chanspec 0x%04x\n", ch->chspec);
                break;
        }
  }
index 2b8b50a77990cd453610feb194961929d7adce21,886227b7c9497ab9969b03ca9dc78fd2fdeea093..204ad5bfd50629bccb3b106bc39f3bda86d9702c
@@@ -64,6 -64,7 +64,7 @@@
  #include "iwl-trans.h"
  #include "img.h"
  #include "fw/api/debug.h"
+ #include "fw/api/dbg-tlv.h"
  #include "fw/api/paging.h"
  #include "iwl-eeprom-parse.h"
  
@@@ -131,7 -132,7 +132,7 @@@ struct iwl_fw_runtime 
        /* debug */
        struct {
                const struct iwl_fw_dump_desc *desc;
-               const struct iwl_fw_dbg_trigger_tlv *trig;
+               bool monitor_only;
                struct delayed_work wk;
  
                u8 conf;
                /* ts of the beginning of a non-collect fw dbg data period */
                unsigned long non_collect_ts_start[FW_DBG_TRIGGER_MAX - 1];
                u32 *d3_debug_data;
+               struct iwl_fw_ini_active_regs active_regs[IWL_FW_INI_MAX_REGION_ID];
+               struct iwl_fw_ini_active_triggers active_trigs[IWL_FW_TRIGGER_ID_NUM];
        } dump;
  #ifdef CONFIG_IWLWIFI_DEBUGFS
        struct {
@@@ -154,11 -157,7 +157,11 @@@ void iwl_fw_runtime_init(struct iwl_fw_
                        const struct iwl_fw_runtime_ops *ops, void *ops_ctx,
                        struct dentry *dbgfs_dir);
  
 -void iwl_fw_runtime_exit(struct iwl_fw_runtime *fwrt);
 +static inline void iwl_fw_runtime_free(struct iwl_fw_runtime *fwrt)
 +{
 +      kfree(fwrt->dump.d3_debug_data);
 +      fwrt->dump.d3_debug_data = NULL;
 +}
  
  void iwl_fw_runtime_suspend(struct iwl_fw_runtime *fwrt);
  
index 2ba890445c356502502a5d948bb2fdb0a21042bf,263b03b3ea66642f8ed6e2a5f6e6a43960b1f7c2..c5168abe107c480adabfd23e1fbece319204b720
@@@ -377,6 -377,9 +377,9 @@@ static int iwl_mvm_load_ucode_wait_aliv
                atomic_set(&mvm->mac80211_queue_stop_count[i], 0);
  
        set_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
+ #ifdef CONFIG_IWLWIFI_DEBUGFS
+       iwl_fw_set_dbg_rec_on(&mvm->fwrt);
+ #endif
        clear_bit(IWL_FWRT_STATUS_WAIT_ALIVE, &mvm->fwrt.status);
  
        return 0;
@@@ -407,6 -410,7 +410,7 @@@ static int iwl_run_unified_mvm_ucode(st
        ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_REGULAR);
        if (ret) {
                IWL_ERR(mvm, "Failed to start RT ucode: %d\n", ret);
+               iwl_fw_assert_error_dump(&mvm->fwrt);
                goto error;
        }
  
@@@ -893,7 -897,7 +897,7 @@@ static int iwl_mvm_sar_geo_init(struct 
        IWL_DEBUG_RADIO(mvm, "Sending GEO_TX_POWER_LIMIT\n");
  
        BUILD_BUG_ON(ACPI_NUM_GEO_PROFILES * ACPI_WGDS_NUM_BANDS *
 -                   ACPI_WGDS_TABLE_SIZE !=  ACPI_WGDS_WIFI_DATA_SIZE);
 +                   ACPI_WGDS_TABLE_SIZE + 1 !=  ACPI_WGDS_WIFI_DATA_SIZE);
  
        BUILD_BUG_ON(ACPI_NUM_GEO_PROFILES > IWL_NUM_GEO_PROFILES);
  
@@@ -928,11 -932,6 +932,11 @@@ static int iwl_mvm_sar_get_ewrd_table(s
        return -ENOENT;
  }
  
 +static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm)
 +{
 +      return -ENOENT;
 +}
 +
  static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
  {
        return 0;
@@@ -959,11 -958,8 +963,11 @@@ static int iwl_mvm_sar_init(struct iwl_
                IWL_DEBUG_RADIO(mvm,
                                "WRDS SAR BIOS table invalid or unavailable. (%d)\n",
                                ret);
 -              /* if not available, don't fail and don't bother with EWRD */
 -              return 0;
 +              /*
 +               * If not available, don't fail and don't bother with EWRD.
 +               * Return 1 to tell that we can't use WGDS either.
 +               */
 +              return 1;
        }
  
        ret = iwl_mvm_sar_get_ewrd_table(mvm);
        /* choose profile 1 (WRDS) as default for both chains */
        ret = iwl_mvm_sar_select_profile(mvm, 1, 1);
  
 -      /* if we don't have profile 0 from BIOS, just skip it */
 +      /*
 +       * If we don't have profile 0 from BIOS, just skip it.  This
 +       * means that SAR Geo will not be enabled either, even if we
 +       * have other valid profiles.
 +       */
        if (ret == -ENOENT)
 -              return 0;
 +              return 1;
  
        return ret;
  }
@@@ -1036,6 -1028,7 +1040,7 @@@ int iwl_mvm_up(struct iwl_mvm *mvm
        ret = iwl_mvm_load_rt_fw(mvm);
        if (ret) {
                IWL_ERR(mvm, "Failed to start RT ucode: %d\n", ret);
+               iwl_fw_assert_error_dump(&mvm->fwrt);
                goto error;
        }
  
                iwl_mvm_unref(mvm, IWL_MVM_REF_UCODE_DOWN);
  
        ret = iwl_mvm_sar_init(mvm);
 -      if (ret)
 -              goto error;
 +      if (ret == 0) {
 +              ret = iwl_mvm_sar_geo_init(mvm);
 +      } else if (ret > 0 && !iwl_mvm_sar_get_wgds_table(mvm)) {
 +              /*
 +               * If basic SAR is not available, we check for WGDS,
 +               * which should *not* be available either.  If it is
 +               * available, issue an error, because we can't use SAR
 +               * Geo without basic SAR.
 +               */
 +              IWL_ERR(mvm, "BIOS contains WGDS but no WRDS\n");
 +      }
  
 -      ret = iwl_mvm_sar_geo_init(mvm);
 -      if (ret)
 +      if (ret < 0)
                goto error;
  
        iwl_mvm_leds_sync(mvm);
index 00f831d88366d00103697eac358f54c753975448,6fe48cc31071631659c84eb0a15a63c28baa3791..675c52aa36a4386a1bc45f442072a77036716bd0
@@@ -301,12 -301,8 +301,12 @@@ struct ieee80211_regdomain *iwl_mvm_get
                goto out;
        }
  
 -      if (changed)
 -              *changed = (resp->status == MCC_RESP_NEW_CHAN_PROFILE);
 +      if (changed) {
 +              u32 status = le32_to_cpu(resp->status);
 +
 +              *changed = (status == MCC_RESP_NEW_CHAN_PROFILE ||
 +                          status == MCC_RESP_ILLEGAL);
 +      }
  
        regd = iwl_parse_nvm_mcc_info(mvm->trans->dev, mvm->cfg,
                                      __le32_to_cpu(resp->n_channels),
@@@ -423,6 -419,7 +423,7 @@@ int iwl_mvm_mac_setup_register(struct i
        ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
        ieee80211_hw_set(hw, NEEDS_UNIQUE_STA_ADDR);
        ieee80211_hw_set(hw, DEAUTH_NEED_MGD_TX_PREP);
+       ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
  
        if (iwl_mvm_has_tlc_offload(mvm)) {
                ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
@@@ -813,6 -810,21 +814,21 @@@ static void iwl_mvm_mac_tx(struct ieee8
            !ieee80211_is_bufferable_mmpdu(hdr->frame_control))
                sta = NULL;
  
+       /* If there is no sta, and it's not offchannel - send through AP */
+       if (info->control.vif->type == NL80211_IFTYPE_STATION &&
+           info->hw_queue != IWL_MVM_OFFCHANNEL_QUEUE && !sta) {
+               struct iwl_mvm_vif *mvmvif =
+                       iwl_mvm_vif_from_mac80211(info->control.vif);
+               u8 ap_sta_id = READ_ONCE(mvmvif->ap_sta_id);
+               if (ap_sta_id < IWL_MVM_STATION_COUNT) {
+                       /* mac80211 holds rcu read lock */
+                       sta = rcu_dereference(mvm->fw_id_to_mac_id[ap_sta_id]);
+                       if (IS_ERR_OR_NULL(sta))
+                               goto drop;
+               }
+       }
        if (sta) {
                if (iwl_mvm_defer_tx(mvm, sta, skb))
                        return;
@@@ -2383,6 -2395,12 +2399,12 @@@ static int iwl_mvm_start_ap_ibss(struc
        /* must be set before quota calculations */
        mvmvif->ap_ibss_active = true;
  
+       if (vif->type == NL80211_IFTYPE_AP && !vif->p2p) {
+               iwl_mvm_vif_set_low_latency(mvmvif, true,
+                                           LOW_LATENCY_VIF_TYPE);
+               iwl_mvm_send_low_latency_cmd(mvm, true, mvmvif->id);
+       }
        /* power updated needs to be done before quotas */
        iwl_mvm_power_update_mac(mvm);
  
@@@ -2445,6 -2463,12 +2467,12 @@@ static void iwl_mvm_stop_ap_ibss(struc
        mvmvif->ap_ibss_active = false;
        mvm->ap_last_beacon_gp2 = 0;
  
+       if (vif->type == NL80211_IFTYPE_AP && !vif->p2p) {
+               iwl_mvm_vif_set_low_latency(mvmvif, false,
+                                           LOW_LATENCY_VIF_TYPE);
+               iwl_mvm_send_low_latency_cmd(mvm, false,  mvmvif->id);
+       }
        iwl_mvm_bt_coex_vif_change(mvm);
  
        iwl_mvm_unref(mvm, IWL_MVM_REF_AP_IBSS);
@@@ -2945,6 -2969,9 +2973,9 @@@ static int iwl_mvm_mac_sta_state(struc
                if (vif->type == NL80211_IFTYPE_AP) {
                        mvmvif->ap_assoc_sta_count++;
                        iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
+                       if (vif->bss_conf.he_support &&
+                           !iwlwifi_mod_params.disable_11ax)
+                               iwl_mvm_cfg_he_sta(mvm, vif, mvm_sta->sta_id);
                }
  
                iwl_mvm_rs_rate_init(mvm, sta, mvmvif->phy_ctxt->channel->band,
@@@ -4448,6 -4475,10 +4479,6 @@@ static void iwl_mvm_mac_sta_statistics(
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
        }
  
 -      if (!fw_has_capa(&mvm->fw->ucode_capa,
 -                       IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS))
 -              return;
 -
        /* if beacon filtering isn't on mac80211 does it anyway */
        if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
                return;
index af3fba10abc195847d781832ad597a9482613ab2,0a5b35312b592278e01f319b56d6bffa12711fb3..a31dc99b63f71d5c7ae7ab6f780aab5257532c29
@@@ -676,7 -676,6 +676,6 @@@ iwl_op_mode_mvm_start(struct iwl_trans 
        INIT_LIST_HEAD(&mvm->aux_roc_te_list);
        INIT_LIST_HEAD(&mvm->async_handlers_list);
        spin_lock_init(&mvm->time_event_lock);
-       spin_lock_init(&mvm->queue_info_lock);
  
        INIT_WORK(&mvm->async_handlers_wk, iwl_mvm_async_handlers_wk);
        INIT_WORK(&mvm->roc_done_wk, iwl_mvm_roc_done_wk);
        memcpy(trans->dbg_conf_tlv, mvm->fw->dbg.conf_tlv,
               sizeof(trans->dbg_conf_tlv));
        trans->dbg_trigger_tlv = mvm->fw->dbg.trigger_tlv;
-       trans->dbg_dump_mask = mvm->fw->dbg.dump_mask;
  
        trans->iml = mvm->fw->iml;
        trans->iml_len = mvm->fw->iml_len;
  
        iwl_mvm_tof_init(mvm);
  
+       iwl_mvm_toggle_tx_ant(mvm, &mvm->mgmt_last_antenna_idx);
        return op_mode;
  
   out_unregister:
        iwl_mvm_thermal_exit(mvm);
   out_free:
        iwl_fw_flush_dump(&mvm->fwrt);
 +      iwl_fw_runtime_free(&mvm->fwrt);
  
        if (iwlmvm_mod_params.init_dbg)
                return op_mode;
@@@ -911,7 -910,6 +911,7 @@@ static void iwl_op_mode_mvm_stop(struc
  
        iwl_mvm_tof_clean(mvm);
  
 +      iwl_fw_runtime_free(&mvm->fwrt);
        mutex_destroy(&mvm->mutex);
        mutex_destroy(&mvm->d0i3_suspend_mutex);
  
@@@ -1110,11 -1108,7 +1110,7 @@@ static void iwl_mvm_async_cb(struct iwl
  static void iwl_mvm_stop_sw_queue(struct iwl_op_mode *op_mode, int hw_queue)
  {
        struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
-       unsigned long mq;
-       spin_lock_bh(&mvm->queue_info_lock);
-       mq = mvm->hw_queue_to_mac80211[hw_queue];
-       spin_unlock_bh(&mvm->queue_info_lock);
+       unsigned long mq = mvm->hw_queue_to_mac80211[hw_queue];
  
        iwl_mvm_stop_mac_queues(mvm, mq);
  }
@@@ -1140,11 -1134,7 +1136,7 @@@ void iwl_mvm_start_mac_queues(struct iw
  static void iwl_mvm_wake_sw_queue(struct iwl_op_mode *op_mode, int hw_queue)
  {
        struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
-       unsigned long mq;
-       spin_lock_bh(&mvm->queue_info_lock);
-       mq = mvm->hw_queue_to_mac80211[hw_queue];
-       spin_unlock_bh(&mvm->queue_info_lock);
+       unsigned long mq = mvm->hw_queue_to_mac80211[hw_queue];
  
        iwl_mvm_start_mac_queues(mvm, mq);
  }
@@@ -1242,7 -1232,7 +1234,7 @@@ void iwl_mvm_nic_restart(struct iwl_mv
         */
        if (!mvm->fw_restart && fw_error) {
                iwl_fw_dbg_collect_desc(&mvm->fwrt, &iwl_dump_desc_assert,
-                                       NULL, 0);
+                                       false, 0);
        } else if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
                struct iwl_mvm_reprobe *reprobe;