diff options
Diffstat (limited to 'drivers/net/wireless/quantenna')
6 files changed, 20 insertions, 6 deletions
| diff --git a/drivers/net/wireless/quantenna/qtnfmac/Makefile b/drivers/net/wireless/quantenna/qtnfmac/Makefile index f236b7dc2be3..97f760a3d599 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/Makefile +++ b/drivers/net/wireless/quantenna/qtnfmac/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Copyright (c) 2015-2016 Quantenna Communications, Inc.  # All rights reserved. diff --git a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c index 856fa6e8327e..a450bc6bc774 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c +++ b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c @@ -115,6 +115,8 @@ int qtnf_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)  	vif = qtnf_netdev_get_priv(wdev->netdev); +	qtnf_scan_done(vif->mac, true); +  	if (qtnf_cmd_send_del_intf(vif))  		pr_err("VIF%u.%u: failed to delete VIF\n", vif->mac->macid,  		       vif->vifid); @@ -335,6 +337,8 @@ static int qtnf_stop_ap(struct wiphy *wiphy, struct net_device *dev)  	struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);  	int ret; +	qtnf_scan_done(vif->mac, true); +  	ret = qtnf_cmd_send_stop_ap(vif);  	if (ret) {  		pr_err("VIF%u.%u: failed to stop AP operation in FW\n", @@ -570,8 +574,6 @@ qtnf_del_station(struct wiphy *wiphy, struct net_device *dev,  	    !qtnf_sta_list_lookup(&vif->sta_list, params->mac))  		return 0; -	qtnf_scan_done(vif->mac, true); -  	ret = qtnf_cmd_send_del_sta(vif, params);  	if (ret)  		pr_err("VIF%u.%u: failed to delete STA %pM\n", @@ -1134,8 +1136,9 @@ void qtnf_virtual_intf_cleanup(struct net_device *ndev)  		}  		vif->sta_state = QTNF_STA_DISCONNECTED; -		qtnf_scan_done(mac, true);  	} + +	qtnf_scan_done(mac, true);  }  void qtnf_cfg80211_vif_reset(struct qtnf_vif *vif) diff --git a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h index 6a4af52522b8..66db26613b1f 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h +++ b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.h @@ -34,6 +34,9 @@ static inline void qtnf_scan_done(struct qtnf_wmac *mac, bool aborted)  		.aborted = aborted,  	}; +	if (timer_pending(&mac->scan_timeout)) +		del_timer_sync(&mac->scan_timeout); +  	mutex_lock(&mac->mac_lock);  	if (mac->scan_req) { diff --git a/drivers/net/wireless/quantenna/qtnfmac/event.c b/drivers/net/wireless/quantenna/qtnfmac/event.c index 0fc2814eafad..43d2e7fd6e02 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/event.c +++ b/drivers/net/wireless/quantenna/qtnfmac/event.c @@ -345,8 +345,6 @@ qtnf_event_handle_scan_complete(struct qtnf_wmac *mac,  		return -EINVAL;  	} -	if (timer_pending(&mac->scan_timeout)) -		del_timer_sync(&mac->scan_timeout);  	qtnf_scan_done(mac, le32_to_cpu(status->flags) & QLINK_SCAN_ABORTED);  	return 0; diff --git a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c index 502e72b7cdcc..69131965a298 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c +++ b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c @@ -661,14 +661,18 @@ static int qtnf_pcie_data_tx(struct qtnf_bus *bus, struct sk_buff *skb)  	struct qtnf_pcie_bus_priv *priv = (void *)get_bus_priv(bus);  	dma_addr_t txbd_paddr, skb_paddr;  	struct qtnf_tx_bd *txbd; +	unsigned long flags;  	int len, i;  	u32 info;  	int ret = 0; +	spin_lock_irqsave(&priv->tx0_lock, flags); +  	if (!qtnf_tx_queue_ready(priv)) {  		if (skb->dev)  			netif_stop_queue(skb->dev); +		spin_unlock_irqrestore(&priv->tx0_lock, flags);  		return NETDEV_TX_BUSY;  	} @@ -717,8 +721,10 @@ tx_done:  		dev_kfree_skb_any(skb);  	} -	qtnf_pcie_data_tx_reclaim(priv);  	priv->tx_done_count++; +	spin_unlock_irqrestore(&priv->tx0_lock, flags); + +	qtnf_pcie_data_tx_reclaim(priv);  	return NETDEV_TX_OK;  } @@ -1247,6 +1253,7 @@ static int qtnf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	strcpy(bus->fwname, QTN_PCI_PEARL_FW_NAME);  	init_completion(&bus->request_firmware_complete);  	mutex_init(&bus->bus_lock); +	spin_lock_init(&pcie_priv->tx0_lock);  	spin_lock_init(&pcie_priv->irq_lock);  	spin_lock_init(&pcie_priv->tx_reclaim_lock); diff --git a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h index e76a23716ee0..86ac1ccedb52 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h +++ b/drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h @@ -34,6 +34,8 @@ struct qtnf_pcie_bus_priv {  	/* lock for tx reclaim operations */  	spinlock_t tx_reclaim_lock; +	/* lock for tx0 operations */ +	spinlock_t tx0_lock;  	u8 msi_enabled;  	int mps; |