Commit 248c690a authored by David S. Miller's avatar David S. Miller

Merge tag 'wireless-drivers-for-davem-2018-07-03' of...

Merge tag 'wireless-drivers-for-davem-2018-07-03' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers

Kalle Valo says:

====================
wireless-drivers fixes for 4.18

First set of fixes for 4.18 and for numerous drivers. Something to mention
about is the wcn36xx fix which makes it possible to compile with gcc older than
4.4 (though I'm not sure if we even support those anymore).

qtnfmac

* coverity fix for a new commit in v4.18-rc1

rtlwifi

* fix kernel oops during driver removal

* fix firmware image corruption for rtl8821ae

brcmfmac

* fix crash if there's no firmware image

mwifiex

* a revert and a better fix for a new commit v4.18-rc1

mt7601u

* fix a recent regression about unnecessary warning about avg_rssi

wcn36xx

* convert testmode.c to plain ASCII

ath10k

* fix a firmware crash during bandwidth change
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 2d0ec544 4fa9433f
...@@ -8628,7 +8628,7 @@ MARVELL MWIFIEX WIRELESS DRIVER ...@@ -8628,7 +8628,7 @@ MARVELL MWIFIEX WIRELESS DRIVER
M: Amitkumar Karwar <amitkarwar@gmail.com> M: Amitkumar Karwar <amitkarwar@gmail.com>
M: Nishant Sarmukadam <nishants@marvell.com> M: Nishant Sarmukadam <nishants@marvell.com>
M: Ganapathi Bhat <gbhat@marvell.com> M: Ganapathi Bhat <gbhat@marvell.com>
M: Xinming Hu <huxm@marvell.com> M: Xinming Hu <huxinming820@gmail.com>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
S: Maintained S: Maintained
F: drivers/net/wireless/marvell/mwifiex/ F: drivers/net/wireless/marvell/mwifiex/
......
...@@ -6058,8 +6058,19 @@ static void ath10k_sta_rc_update_wk(struct work_struct *wk) ...@@ -6058,8 +6058,19 @@ static void ath10k_sta_rc_update_wk(struct work_struct *wk)
ath10k_mac_max_vht_nss(vht_mcs_mask))); ath10k_mac_max_vht_nss(vht_mcs_mask)));
if (changed & IEEE80211_RC_BW_CHANGED) { if (changed & IEEE80211_RC_BW_CHANGED) {
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d\n", enum wmi_phy_mode mode;
sta->addr, bw);
mode = chan_to_phymode(&def);
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac update sta %pM peer bw %d phymode %d\n",
sta->addr, bw, mode);
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
WMI_PEER_PHYMODE, mode);
if (err) {
ath10k_warn(ar, "failed to update STA %pM peer phymode %d: %d\n",
sta->addr, mode, err);
goto exit;
}
err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
WMI_PEER_CHAN_WIDTH, bw); WMI_PEER_CHAN_WIDTH, bw);
...@@ -6100,6 +6111,7 @@ static void ath10k_sta_rc_update_wk(struct work_struct *wk) ...@@ -6100,6 +6111,7 @@ static void ath10k_sta_rc_update_wk(struct work_struct *wk)
sta->addr); sta->addr);
} }
exit:
mutex_unlock(&ar->conf_mutex); mutex_unlock(&ar->conf_mutex);
} }
......
...@@ -6144,6 +6144,7 @@ enum wmi_peer_param { ...@@ -6144,6 +6144,7 @@ enum wmi_peer_param {
WMI_PEER_NSS = 0x5, WMI_PEER_NSS = 0x5,
WMI_PEER_USE_4ADDR = 0x6, WMI_PEER_USE_4ADDR = 0x6,
WMI_PEER_DEBUG = 0xa, WMI_PEER_DEBUG = 0xa,
WMI_PEER_PHYMODE = 0xd,
WMI_PEER_DUMMY_VAR = 0xff, /* dummy parameter for STA PS workaround */ WMI_PEER_DUMMY_VAR = 0xff, /* dummy parameter for STA PS workaround */
}; };
......
/* /*
* Copyright (c) 2018, The Linux Foundation. All rights reserved. * Copyright (c) 2018, The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for any * Permission to use, copy, modify, and/or distribute this software for any
......
...@@ -4296,6 +4296,13 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus) ...@@ -4296,6 +4296,13 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
brcmf_dbg(TRACE, "Enter\n"); brcmf_dbg(TRACE, "Enter\n");
if (bus) { if (bus) {
/* Stop watchdog task */
if (bus->watchdog_tsk) {
send_sig(SIGTERM, bus->watchdog_tsk, 1);
kthread_stop(bus->watchdog_tsk);
bus->watchdog_tsk = NULL;
}
/* De-register interrupt handler */ /* De-register interrupt handler */
brcmf_sdiod_intr_unregister(bus->sdiodev); brcmf_sdiod_intr_unregister(bus->sdiodev);
......
...@@ -644,11 +644,6 @@ static void mwifiex_usb_disconnect(struct usb_interface *intf) ...@@ -644,11 +644,6 @@ static void mwifiex_usb_disconnect(struct usb_interface *intf)
MWIFIEX_FUNC_SHUTDOWN); MWIFIEX_FUNC_SHUTDOWN);
} }
if (adapter->workqueue)
flush_workqueue(adapter->workqueue);
mwifiex_usb_free(card);
mwifiex_dbg(adapter, FATAL, mwifiex_dbg(adapter, FATAL,
"%s: removing card\n", __func__); "%s: removing card\n", __func__);
mwifiex_remove_card(adapter); mwifiex_remove_card(adapter);
...@@ -1356,6 +1351,8 @@ static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter) ...@@ -1356,6 +1351,8 @@ static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
{ {
struct usb_card_rec *card = (struct usb_card_rec *)adapter->card; struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
mwifiex_usb_free(card);
mwifiex_usb_cleanup_tx_aggr(adapter); mwifiex_usb_cleanup_tx_aggr(adapter);
card->adapter = NULL; card->adapter = NULL;
......
...@@ -986,13 +986,15 @@ static void mt7601u_agc_tune(struct mt7601u_dev *dev) ...@@ -986,13 +986,15 @@ static void mt7601u_agc_tune(struct mt7601u_dev *dev)
*/ */
spin_lock_bh(&dev->con_mon_lock); spin_lock_bh(&dev->con_mon_lock);
avg_rssi = ewma_rssi_read(&dev->avg_rssi); avg_rssi = ewma_rssi_read(&dev->avg_rssi);
WARN_ON_ONCE(avg_rssi == 0); spin_unlock_bh(&dev->con_mon_lock);
if (avg_rssi == 0)
return;
avg_rssi = -avg_rssi; avg_rssi = -avg_rssi;
if (avg_rssi <= -70) if (avg_rssi <= -70)
val -= 0x20; val -= 0x20;
else if (avg_rssi <= -60) else if (avg_rssi <= -60)
val -= 0x10; val -= 0x10;
spin_unlock_bh(&dev->con_mon_lock);
if (val != mt7601u_bbp_rr(dev, 66)) if (val != mt7601u_bbp_rr(dev, 66))
mt7601u_bbp_wr(dev, 66, val); mt7601u_bbp_wr(dev, 66, val);
......
...@@ -654,8 +654,7 @@ qtnf_disconnect(struct wiphy *wiphy, struct net_device *dev, ...@@ -654,8 +654,7 @@ qtnf_disconnect(struct wiphy *wiphy, struct net_device *dev,
vif = qtnf_mac_get_base_vif(mac); vif = qtnf_mac_get_base_vif(mac);
if (!vif) { if (!vif) {
pr_err("MAC%u: primary VIF is not configured\n", mac->macid); pr_err("MAC%u: primary VIF is not configured\n", mac->macid);
ret = -EFAULT; return -EFAULT;
goto out;
} }
if (vif->wdev.iftype != NL80211_IFTYPE_STATION) { if (vif->wdev.iftype != NL80211_IFTYPE_STATION) {
......
...@@ -484,18 +484,21 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw) ...@@ -484,18 +484,21 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
} }
void rtl_deinit_deferred_work(struct ieee80211_hw *hw) void rtl_deinit_deferred_work(struct ieee80211_hw *hw, bool ips_wq)
{ {
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
del_timer_sync(&rtlpriv->works.watchdog_timer); del_timer_sync(&rtlpriv->works.watchdog_timer);
cancel_delayed_work(&rtlpriv->works.watchdog_wq); cancel_delayed_work_sync(&rtlpriv->works.watchdog_wq);
cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq); if (ips_wq)
cancel_delayed_work(&rtlpriv->works.ps_work); cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq);
cancel_delayed_work(&rtlpriv->works.ps_rfon_wq); else
cancel_delayed_work(&rtlpriv->works.fwevt_wq); cancel_delayed_work_sync(&rtlpriv->works.ips_nic_off_wq);
cancel_delayed_work(&rtlpriv->works.c2hcmd_wq); cancel_delayed_work_sync(&rtlpriv->works.ps_work);
cancel_delayed_work_sync(&rtlpriv->works.ps_rfon_wq);
cancel_delayed_work_sync(&rtlpriv->works.fwevt_wq);
cancel_delayed_work_sync(&rtlpriv->works.c2hcmd_wq);
} }
EXPORT_SYMBOL_GPL(rtl_deinit_deferred_work); EXPORT_SYMBOL_GPL(rtl_deinit_deferred_work);
......
...@@ -121,7 +121,7 @@ void rtl_init_rfkill(struct ieee80211_hw *hw); ...@@ -121,7 +121,7 @@ void rtl_init_rfkill(struct ieee80211_hw *hw);
void rtl_deinit_rfkill(struct ieee80211_hw *hw); void rtl_deinit_rfkill(struct ieee80211_hw *hw);
void rtl_watch_dog_timer_callback(struct timer_list *t); void rtl_watch_dog_timer_callback(struct timer_list *t);
void rtl_deinit_deferred_work(struct ieee80211_hw *hw); void rtl_deinit_deferred_work(struct ieee80211_hw *hw, bool ips_wq);
bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx); bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
int rtlwifi_rate_mapping(struct ieee80211_hw *hw, bool isht, int rtlwifi_rate_mapping(struct ieee80211_hw *hw, bool isht,
......
...@@ -130,7 +130,6 @@ static void rtl_fw_do_work(const struct firmware *firmware, void *context, ...@@ -130,7 +130,6 @@ static void rtl_fw_do_work(const struct firmware *firmware, void *context,
firmware->size); firmware->size);
rtlpriv->rtlhal.wowlan_fwsize = firmware->size; rtlpriv->rtlhal.wowlan_fwsize = firmware->size;
} }
rtlpriv->rtlhal.fwsize = firmware->size;
release_firmware(firmware); release_firmware(firmware);
} }
...@@ -196,7 +195,7 @@ static void rtl_op_stop(struct ieee80211_hw *hw) ...@@ -196,7 +195,7 @@ static void rtl_op_stop(struct ieee80211_hw *hw)
/* reset sec info */ /* reset sec info */
rtl_cam_reset_sec_info(hw); rtl_cam_reset_sec_info(hw);
rtl_deinit_deferred_work(hw); rtl_deinit_deferred_work(hw, false);
} }
rtlpriv->intf_ops->adapter_stop(hw); rtlpriv->intf_ops->adapter_stop(hw);
......
...@@ -2377,7 +2377,7 @@ void rtl_pci_disconnect(struct pci_dev *pdev) ...@@ -2377,7 +2377,7 @@ void rtl_pci_disconnect(struct pci_dev *pdev)
ieee80211_unregister_hw(hw); ieee80211_unregister_hw(hw);
rtlmac->mac80211_registered = 0; rtlmac->mac80211_registered = 0;
} else { } else {
rtl_deinit_deferred_work(hw); rtl_deinit_deferred_work(hw, false);
rtlpriv->intf_ops->adapter_stop(hw); rtlpriv->intf_ops->adapter_stop(hw);
} }
rtlpriv->cfg->ops->disable_interrupt(hw); rtlpriv->cfg->ops->disable_interrupt(hw);
......
...@@ -71,7 +71,7 @@ bool rtl_ps_disable_nic(struct ieee80211_hw *hw) ...@@ -71,7 +71,7 @@ bool rtl_ps_disable_nic(struct ieee80211_hw *hw)
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
/*<1> Stop all timer */ /*<1> Stop all timer */
rtl_deinit_deferred_work(hw); rtl_deinit_deferred_work(hw, true);
/*<2> Disable Interrupt */ /*<2> Disable Interrupt */
rtlpriv->cfg->ops->disable_interrupt(hw); rtlpriv->cfg->ops->disable_interrupt(hw);
...@@ -292,7 +292,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw) ...@@ -292,7 +292,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
enum rf_pwrstate rtstate; enum rf_pwrstate rtstate;
cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq); cancel_delayed_work_sync(&rtlpriv->works.ips_nic_off_wq);
mutex_lock(&rtlpriv->locks.ips_mutex); mutex_lock(&rtlpriv->locks.ips_mutex);
if (ppsc->inactiveps) { if (ppsc->inactiveps) {
......
...@@ -1132,7 +1132,7 @@ void rtl_usb_disconnect(struct usb_interface *intf) ...@@ -1132,7 +1132,7 @@ void rtl_usb_disconnect(struct usb_interface *intf)
ieee80211_unregister_hw(hw); ieee80211_unregister_hw(hw);
rtlmac->mac80211_registered = 0; rtlmac->mac80211_registered = 0;
} else { } else {
rtl_deinit_deferred_work(hw); rtl_deinit_deferred_work(hw, false);
rtlpriv->intf_ops->adapter_stop(hw); rtlpriv->intf_ops->adapter_stop(hw);
} }
/*deinit rfkill */ /*deinit rfkill */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment