wireless-drivers fixes for 4.20
First set of fixes for 4.20, this time we have quite a few them but all very small. ath9k * fix a locking regression found by a static checker wlcore * fix a crash which was a regression with wakeirq handling brcm80211 * yet another fix for 160 MHz channel handling mt76 * fix a longstaning build problem when CONFIG_LEDS_CLASS is disabled * don't use uninitialised mutex iwlwifi * do note that the iwlwifi merge tag (commit4ec321c146
) seems to contain wrong list of changes so ignore that * fix ACPI data handling, a memory leak and other smaller fixes ath10k * fix a crash during suspend which was a recent regression -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJb9CR9AAoJEG4XJFUm622bMdAH/2z0jY38RTPqLYH7BKfIzQkB M8GC4bi0c3NexkwS+S0xLr6A5FyTcbi2pKOqdZ2eXEoiopso5OocWXYnIw0IDA9C ll5aI4DfIoqTIVBvYWp/Rnar67oRAfND5z3iOnu0C34KNiMbUY2WfJ6RUTo+gjZ4 Wokaf6EWOCODDtL2atBtvT96JSlM7t398aUksKzcOGX+0XPGYfyho/wQGZIYE9iQ Exgmp9KyBBlQugu+EyGH+Dxt8J+1sSveIJXnfaCb9avtpo+C/SG7+pnJhX8ij7fH +pYuWOq/YyliUVHVxfpK5+lVJB3ICGezbZ6xp3G3MURBqdX/E2oouFJvyKrESPc= =je2r -----END PGP SIGNATURE----- Merge tag 'wireless-drivers-for-davem-2018-11-20' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers Kalle Valo says: ==================== wireless-drivers fixes for 4.20 First set of fixes for 4.20, this time we have quite a few them but all very small. ath9k * fix a locking regression found by a static checker wlcore * fix a crash which was a regression with wakeirq handling brcm80211 * yet another fix for 160 MHz channel handling mt76 * fix a longstaning build problem when CONFIG_LEDS_CLASS is disabled * don't use uninitialised mutex iwlwifi * do note that the iwlwifi merge tag (commit4ec321c146
) seems to contain wrong list of changes so ignore that * fix ACPI data handling, a memory leak and other smaller fixes ath10k * fix a crash during suspend which was a recent regression ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
1e2b1046b5
|
@ -6867,7 +6867,7 @@ static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|||
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)
|
||||
|
|
|
@ -1251,6 +1251,7 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
|
|||
struct ath_vif *avp = (void *)vif->drv_priv;
|
||||
struct ath_node *an = &avp->mcast_node;
|
||||
|
||||
mutex_lock(&sc->mutex);
|
||||
if (IS_ENABLED(CONFIG_ATH9K_TX99)) {
|
||||
if (sc->cur_chan->nvifs >= 1) {
|
||||
mutex_unlock(&sc->mutex);
|
||||
|
@ -1259,8 +1260,6 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
|
|||
sc->tx99_vif = vif;
|
||||
}
|
||||
|
||||
mutex_lock(&sc->mutex);
|
||||
|
||||
ath_dbg(common, CONFIG, "Attach a VIF of type: %d\n", vif->type);
|
||||
sc->cur_chan->nvifs++;
|
||||
|
||||
|
|
|
@ -6005,7 +6005,8 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg,
|
|||
* for subsequent chanspecs.
|
||||
*/
|
||||
channel->flags = IEEE80211_CHAN_NO_HT40 |
|
||||
IEEE80211_CHAN_NO_80MHZ;
|
||||
IEEE80211_CHAN_NO_80MHZ |
|
||||
IEEE80211_CHAN_NO_160MHZ;
|
||||
ch.bw = BRCMU_CHAN_BW_20;
|
||||
cfg->d11inf.encchspec(&ch);
|
||||
chaninfo = ch.chspec;
|
||||
|
|
|
@ -193,6 +193,9 @@ static void brcmu_d11ac_decchspec(struct brcmu_chan *ch)
|
|||
}
|
||||
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;
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
*
|
||||
* 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
|
||||
|
@ -26,6 +27,7 @@
|
|||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -81,7 +83,7 @@
|
|||
#define ACPI_WRDS_WIFI_DATA_SIZE (ACPI_SAR_TABLE_SIZE + 2)
|
||||
#define ACPI_EWRD_WIFI_DATA_SIZE ((ACPI_SAR_PROFILE_NUM - 1) * \
|
||||
ACPI_SAR_TABLE_SIZE + 3)
|
||||
#define ACPI_WGDS_WIFI_DATA_SIZE 18
|
||||
#define ACPI_WGDS_WIFI_DATA_SIZE 19
|
||||
#define ACPI_WRDD_WIFI_DATA_SIZE 2
|
||||
#define ACPI_SPLC_WIFI_DATA_SIZE 2
|
||||
|
||||
|
|
|
@ -154,7 +154,11 @@ void iwl_fw_runtime_init(struct iwl_fw_runtime *fwrt, struct iwl_trans *trans,
|
|||
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);
|
||||
|
||||
|
|
|
@ -893,7 +893,7 @@ static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
|
|||
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,6 +928,11 @@ static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm)
|
|||
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;
|
||||
|
@ -954,8 +959,11 @@ static int iwl_mvm_sar_init(struct iwl_mvm *mvm)
|
|||
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);
|
||||
|
@ -968,9 +976,13 @@ static int iwl_mvm_sar_init(struct iwl_mvm *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;
|
||||
}
|
||||
|
@ -1168,11 +1180,19 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
|
|||
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);
|
||||
|
|
|
@ -301,8 +301,12 @@ struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy,
|
|||
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),
|
||||
|
@ -4444,10 +4448,6 @@ static void iwl_mvm_mac_sta_statistics(struct ieee80211_hw *hw,
|
|||
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;
|
||||
|
|
|
@ -539,9 +539,8 @@ iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
|
|||
}
|
||||
|
||||
IWL_DEBUG_LAR(mvm,
|
||||
"MCC response status: 0x%x. new MCC: 0x%x ('%c%c') change: %d n_chans: %d\n",
|
||||
status, mcc, mcc >> 8, mcc & 0xff,
|
||||
!!(status == MCC_RESP_NEW_CHAN_PROFILE), n_channels);
|
||||
"MCC response status: 0x%x. new MCC: 0x%x ('%c%c') n_chans: %d\n",
|
||||
status, mcc, mcc >> 8, mcc & 0xff, n_channels);
|
||||
|
||||
exit:
|
||||
iwl_free_resp(&cmd);
|
||||
|
|
|
@ -858,6 +858,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
|
|||
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;
|
||||
|
@ -910,6 +911,7 @@ static void iwl_op_mode_mvm_stop(struct iwl_op_mode *op_mode)
|
|||
|
||||
iwl_mvm_tof_clean(mvm);
|
||||
|
||||
iwl_fw_runtime_free(&mvm->fwrt);
|
||||
mutex_destroy(&mvm->mutex);
|
||||
mutex_destroy(&mvm->d0i3_suspend_mutex);
|
||||
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
config MT76_CORE
|
||||
tristate
|
||||
|
||||
config MT76_LEDS
|
||||
bool
|
||||
depends on MT76_CORE
|
||||
depends on LEDS_CLASS=y || MT76_CORE=LEDS_CLASS
|
||||
default y
|
||||
|
||||
config MT76_USB
|
||||
tristate
|
||||
depends on MT76_CORE
|
||||
|
|
|
@ -345,9 +345,11 @@ int mt76_register_device(struct mt76_dev *dev, bool vht,
|
|||
mt76_check_sband(dev, NL80211_BAND_2GHZ);
|
||||
mt76_check_sband(dev, NL80211_BAND_5GHZ);
|
||||
|
||||
ret = mt76_led_init(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (IS_ENABLED(CONFIG_MT76_LEDS)) {
|
||||
ret = mt76_led_init(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ieee80211_register_hw(hw);
|
||||
}
|
||||
|
|
|
@ -71,7 +71,6 @@ struct mt76x02_dev {
|
|||
struct mac_address macaddr_list[8];
|
||||
|
||||
struct mutex phy_mutex;
|
||||
struct mutex mutex;
|
||||
|
||||
u8 txdone_seq;
|
||||
DECLARE_KFIFO_PTR(txstatus_fifo, struct mt76x02_tx_status);
|
||||
|
|
|
@ -507,8 +507,10 @@ int mt76x2_register_device(struct mt76x02_dev *dev)
|
|||
mt76x2_dfs_init_detector(dev);
|
||||
|
||||
/* init led callbacks */
|
||||
dev->mt76.led_cdev.brightness_set = mt76x2_led_set_brightness;
|
||||
dev->mt76.led_cdev.blink_set = mt76x2_led_set_blink;
|
||||
if (IS_ENABLED(CONFIG_MT76_LEDS)) {
|
||||
dev->mt76.led_cdev.brightness_set = mt76x2_led_set_brightness;
|
||||
dev->mt76.led_cdev.blink_set = mt76x2_led_set_blink;
|
||||
}
|
||||
|
||||
ret = mt76_register_device(&dev->mt76, true, mt76x02_rates,
|
||||
ARRAY_SIZE(mt76x02_rates));
|
||||
|
|
|
@ -272,9 +272,9 @@ mt76x2_set_rts_threshold(struct ieee80211_hw *hw, u32 val)
|
|||
if (val != ~0 && val > 0xffff)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
mutex_lock(&dev->mt76.mutex);
|
||||
mt76x2_mac_set_tx_protection(dev, val);
|
||||
mutex_unlock(&dev->mutex);
|
||||
mutex_unlock(&dev->mt76.mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -285,7 +285,7 @@ static int wl1271_probe(struct sdio_func *func,
|
|||
struct resource res[2];
|
||||
mmc_pm_flag_t mmcflags;
|
||||
int ret = -ENOMEM;
|
||||
int irq, wakeirq;
|
||||
int irq, wakeirq, num_irqs;
|
||||
const char *chip_family;
|
||||
|
||||
/* We are only able to handle the wlan function */
|
||||
|
@ -353,12 +353,17 @@ static int wl1271_probe(struct sdio_func *func,
|
|||
irqd_get_trigger_type(irq_get_irq_data(irq));
|
||||
res[0].name = "irq";
|
||||
|
||||
res[1].start = wakeirq;
|
||||
res[1].flags = IORESOURCE_IRQ |
|
||||
irqd_get_trigger_type(irq_get_irq_data(wakeirq));
|
||||
res[1].name = "wakeirq";
|
||||
|
||||
ret = platform_device_add_resources(glue->core, res, ARRAY_SIZE(res));
|
||||
if (wakeirq > 0) {
|
||||
res[1].start = wakeirq;
|
||||
res[1].flags = IORESOURCE_IRQ |
|
||||
irqd_get_trigger_type(irq_get_irq_data(wakeirq));
|
||||
res[1].name = "wakeirq";
|
||||
num_irqs = 2;
|
||||
} else {
|
||||
num_irqs = 1;
|
||||
}
|
||||
ret = platform_device_add_resources(glue->core, res, num_irqs);
|
||||
if (ret) {
|
||||
dev_err(glue->dev, "can't add resources\n");
|
||||
goto out_dev_put;
|
||||
|
|
Loading…
Reference in New Issue