mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
net: bcmgenet: clear status to reduce spurious interrupts
Since the DMA interrupt status is latched and the DMA servicing can be polled, it is a good idea to clear the latched status of a DMA interrupt before performing the service that would be invoked by the interrupt. This prevents old status from causing spurious interrupts when the interrupt is unmasked at a later time. Signed-off-by: Doug Berger <opendmb@gmail.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b1ec494dee
commit
d5810ca325
@ -1174,6 +1174,14 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev,
|
||||
unsigned int txbds_ready;
|
||||
unsigned int txbds_processed = 0;
|
||||
|
||||
/* Clear status before servicing to reduce spurious interrupts */
|
||||
if (ring->index == DESC_INDEX)
|
||||
bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_TXDMA_DONE,
|
||||
INTRL2_CPU_CLEAR);
|
||||
else
|
||||
bcmgenet_intrl2_1_writel(priv, (1 << ring->index),
|
||||
INTRL2_CPU_CLEAR);
|
||||
|
||||
/* Compute how many buffers are transmitted since last xmit call */
|
||||
c_index = bcmgenet_tdma_ring_readl(priv, ring->index, TDMA_CONS_INDEX)
|
||||
& DMA_C_INDEX_MASK;
|
||||
@ -1584,10 +1592,21 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring,
|
||||
unsigned long dma_flag;
|
||||
int len;
|
||||
unsigned int rxpktprocessed = 0, rxpkttoprocess;
|
||||
unsigned int p_index;
|
||||
unsigned int p_index, mask;
|
||||
unsigned int discards;
|
||||
unsigned int chksum_ok = 0;
|
||||
|
||||
/* Clear status before servicing to reduce spurious interrupts */
|
||||
if (ring->index == DESC_INDEX) {
|
||||
bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_RXDMA_DONE,
|
||||
INTRL2_CPU_CLEAR);
|
||||
} else {
|
||||
mask = 1 << (UMAC_IRQ1_RX_INTR_SHIFT + ring->index);
|
||||
bcmgenet_intrl2_1_writel(priv,
|
||||
mask,
|
||||
INTRL2_CPU_CLEAR);
|
||||
}
|
||||
|
||||
p_index = bcmgenet_rdma_ring_readl(priv, ring->index, RDMA_PROD_INDEX);
|
||||
|
||||
discards = (p_index >> DMA_P_INDEX_DISCARD_CNT_SHIFT) &
|
||||
|
Loading…
Reference in New Issue
Block a user