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