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
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQEcBAABAgAGBQJbO1LKAAoJEG4XJFUm622bPEgH/jJ552p5KdOFkwtKWQ9sybKP
 53yCEJw0sjaKVaXdPbOLZQP4ioJ0xYiOxKN1LBmBg2AVFKvnSp5LRWwmpzqdpOoE
 oYo09wcSE5Q7AFHaWDmV5/6ze/S1Aem9B5iNdS/hScuXqsnqct17RVO1zVWpHnU5
 W8+qVFrBcbqrvuTDdGo5GBaUQBeRHpIpGjABBk7D6qXVwOtzr2ibKGRHRITu3yYo
 vA+IF+S+IwWEITt4AxaN728sk6Q3S9r5kBmRlyzlfeSmT8S/zS8Hid5P2eQz6Dv4
 Ib22ZvBVFyKQd4qeXYG1lWxbTQrNZIY3JUDGkcdhkhdb3TKYL37x3mWP2LoTpK4=
 =0sGc
 -----END PGP SIGNATURE-----

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: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2018-07-03 23:29:29 +09:00
commit 248c690a2d
14 changed files with 47 additions and 27 deletions

View File

@ -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/

View File

@ -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)
sta->addr); sta->addr);
} }
exit:
mutex_unlock(&ar->conf_mutex); mutex_unlock(&ar->conf_mutex);
} }

View File

@ -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 */
}; };

View File

@ -1,4 +1,4 @@
/* /*
* 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

View File

@ -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);

View File

@ -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)
{ {
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;

View File

@ -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);

View File

@ -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) {

View File

@ -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);
if (ips_wq)
cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq); cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq);
cancel_delayed_work(&rtlpriv->works.ps_work); else
cancel_delayed_work(&rtlpriv->works.ps_rfon_wq); cancel_delayed_work_sync(&rtlpriv->works.ips_nic_off_wq);
cancel_delayed_work(&rtlpriv->works.fwevt_wq); cancel_delayed_work_sync(&rtlpriv->works.ps_work);
cancel_delayed_work(&rtlpriv->works.c2hcmd_wq); 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);

View File

@ -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,

View File

@ -130,7 +130,6 @@ found_alt:
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)
/* 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);

View File

@ -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);

View File

@ -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)
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) {

View File

@ -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 */