qtnfmac: modify tx reclaim locking
authorSergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Tue, 15 Aug 2017 13:06:38 +0000 (16:06 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 17 Aug 2017 07:05:07 +0000 (10:05 +0300)
Perform additional reclaim from qtnf_pcie_data_tx. Lock tx_lock serves only
reclaim synchronization purposes. Rename it accordingly and improve
granularity moving this lock to qtnf_pcie_data_tx_reclaim.

Signed-off-by: Sergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/quantenna/qtnfmac/pearl/pcie.c
drivers/net/wireless/quantenna/qtnfmac/pearl/pcie_bus_priv.h

index 72730aff2a4168c9ad6620e5f87e597ff9e0eb91..cd2f2b667643f5fd41c23ca1d018e5b7f5c253bc 100644 (file)
@@ -534,11 +534,13 @@ static void qtnf_pcie_data_tx_reclaim(struct qtnf_pcie_bus_priv *priv)
 {
        struct qtnf_tx_bd *txbd;
        struct sk_buff *skb;
+       unsigned long flags;
        dma_addr_t paddr;
        u32 tx_done_index;
        int count = 0;
        int i;
 
+       spin_lock_irqsave(&priv->tx_reclaim_lock, flags);
 
        tx_done_index = readl(PCIE_HDP_RX0DMA_CNT(priv->pcie_reg_base))
                        & (priv->tx_bd_num - 1);
@@ -576,6 +578,7 @@ static void qtnf_pcie_data_tx_reclaim(struct qtnf_pcie_bus_priv *priv)
        priv->tx_reclaim_req++;
        priv->tx_bd_r_index = i;
 
+       spin_unlock_irqrestore(&priv->tx_reclaim_lock, flags);
 }
 
 static int qtnf_tx_queue_ready(struct qtnf_pcie_bus_priv *priv)
@@ -600,20 +603,14 @@ 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->tx_lock, flags);
-
-       priv->tx_done_count++;
-
        if (!qtnf_tx_queue_ready(priv)) {
                if (skb->dev)
                        netif_stop_queue(skb->dev);
 
-               spin_unlock_irqrestore(&priv->tx_lock, flags);
                return NETDEV_TX_BUSY;
        }
 
@@ -659,7 +656,8 @@ tx_done:
                dev_kfree_skb_any(skb);
        }
 
-       spin_unlock_irqrestore(&priv->tx_lock, flags);
+       qtnf_pcie_data_tx_reclaim(priv);
+       priv->tx_done_count++;
 
        return NETDEV_TX_OK;
 }
@@ -1067,11 +1065,8 @@ static int qtnf_bringup_fw(struct qtnf_bus *bus)
 static void qtnf_reclaim_tasklet_fn(unsigned long data)
 {
        struct qtnf_pcie_bus_priv *priv = (void *)data;
-       unsigned long flags;
 
-       spin_lock_irqsave(&priv->tx_lock, flags);
        qtnf_pcie_data_tx_reclaim(priv);
-       spin_unlock_irqrestore(&priv->tx_lock, flags);
        qtnf_en_txdone_irq(priv);
 }
 
@@ -1192,7 +1187,7 @@ static int qtnf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        init_completion(&bus->request_firmware_complete);
        mutex_init(&bus->bus_lock);
        spin_lock_init(&pcie_priv->irq_lock);
-       spin_lock_init(&pcie_priv->tx_lock);
+       spin_lock_init(&pcie_priv->tx_reclaim_lock);
 
        /* init stats */
        pcie_priv->tx_full_count = 0;
index 698e42132ed44e162de39027e521c0075dc05c16..e76a23716ee019a4f49d38d81d2daa25b59adcb0 100644 (file)
@@ -32,8 +32,8 @@ struct qtnf_pcie_bus_priv {
        /* lock for irq configuration changes */
        spinlock_t irq_lock;
 
-       /* lock for tx operations */
-       spinlock_t tx_lock;
+       /* lock for tx reclaim operations */
+       spinlock_t tx_reclaim_lock;
        u8 msi_enabled;
        int mps;