]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
wcn36xx: only handle packets when ED or DONE bit is set
authorDaniel Mack <daniel@zonque.org>
Wed, 23 May 2018 08:14:40 +0000 (11:14 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Fri, 25 May 2018 10:07:34 +0000 (13:07 +0300)
On RX and TX interrupts, check for the WCN36XX_CH_STAT_INT_ED_MASK or
WCN36XX_CH_STAT_INT_DONE_MASK in the interrupt reason register, and
only handle packets when it is set. This way, reap_tx_dxes() is only
invoked when needed.

This brings the dequeing logic in line with what the prima downstream
driver is doing.

While at it, also log the interrupt reason.

Signed-off-by: Daniel Mack <daniel@zonque.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/wcn36xx/dxe.c

index d11c9c536627ab95ee75d8d2181fedb0876efc61..8c64e05ca3b765afe24889ee24b565f9bad0e8bd 100644 (file)
@@ -430,8 +430,12 @@ static irqreturn_t wcn36xx_irq_tx_complete(int irq, void *dev)
                                                   WCN36XX_INT_MASK_CHAN_TX_H);
                }
 
-               wcn36xx_dbg(WCN36XX_DBG_DXE, "dxe tx ready high\n");
-               reap_tx_dxes(wcn, &wcn->dxe_tx_h_ch);
+               wcn36xx_dbg(WCN36XX_DBG_DXE, "dxe tx ready high, reason %08x\n",
+                           int_reason);
+
+               if (int_reason & (WCN36XX_CH_STAT_INT_DONE_MASK |
+                                 WCN36XX_CH_STAT_INT_ED_MASK))
+                       reap_tx_dxes(wcn, &wcn->dxe_tx_h_ch);
        }
 
        if (int_src & WCN36XX_INT_MASK_CHAN_TX_L) {
@@ -465,8 +469,12 @@ static irqreturn_t wcn36xx_irq_tx_complete(int irq, void *dev)
                                                   WCN36XX_INT_MASK_CHAN_TX_L);
                }
 
-               wcn36xx_dbg(WCN36XX_DBG_DXE, "dxe tx ready low\n");
-               reap_tx_dxes(wcn, &wcn->dxe_tx_l_ch);
+               wcn36xx_dbg(WCN36XX_DBG_DXE, "dxe tx ready low, reason %08x\n",
+                           int_reason);
+
+               if (int_reason & (WCN36XX_CH_STAT_INT_DONE_MASK |
+                                 WCN36XX_CH_STAT_INT_ED_MASK))
+                       reap_tx_dxes(wcn, &wcn->dxe_tx_l_ch);
        }
 
        return IRQ_HANDLED;
@@ -545,6 +553,10 @@ static int wcn36xx_rx_handle_packets(struct wcn36xx *wcn,
                                           WCN36XX_DXE_0_INT_ED_CLR,
                                           int_mask);
 
+       if (!(int_reason & (WCN36XX_CH_STAT_INT_DONE_MASK |
+                           WCN36XX_CH_STAT_INT_ED_MASK)))
+               return 0;
+
        spin_lock(&ch->lock);
 
        ctl = ch->head_blk_ctl;