|
|
@@ -1300,6 +1300,7 @@ static int rtl838x_poll_rx(struct napi_struct *napi, int budget)
|
|
|
{
|
|
|
struct rtl838x_rx_q *rx_q = container_of(napi, struct rtl838x_rx_q, napi);
|
|
|
struct rtl838x_eth_priv *priv = rx_q->priv;
|
|
|
+ unsigned long flags;
|
|
|
int ring = rx_q->id;
|
|
|
int work_done = 0;
|
|
|
|
|
|
@@ -1312,10 +1313,12 @@ static int rtl838x_poll_rx(struct napi_struct *napi, int budget)
|
|
|
|
|
|
if (work_done < budget && napi_complete_done(napi, work_done)) {
|
|
|
/* Re-enable rx interrupts */
|
|
|
+ spin_lock_irqsave(&priv->lock, flags);
|
|
|
if (priv->family_id == RTL9300_FAMILY_ID || priv->family_id == RTL9310_FAMILY_ID)
|
|
|
- sw_w32(0xffffffff, priv->r->dma_if_intr_rx_done_msk);
|
|
|
+ sw_w32_mask(0, RTL93XX_DMA_IF_INTR_RX_MASK(ring), priv->r->dma_if_intr_rx_done_msk);
|
|
|
else
|
|
|
sw_w32_mask(0, RTL83XX_DMA_IF_INTR_RX_MASK(ring), priv->r->dma_if_intr_msk);
|
|
|
+ spin_unlock_irqrestore(&priv->lock, flags);
|
|
|
}
|
|
|
|
|
|
return work_done;
|