mirror of https://gitee.com/openkylin/linux.git
net: arc_emac: enable tx interrupts
In the current implementation the cleaning of tx ring is done by the NAPI poll handler, which is scheduled after rx interrupts. Thus, in absence of received packets the reclaim of used tx buffers is never executed, blocking further transmission. This can be easily reproduced starting the transmission of a UDP flow with iperf, which blocks almost immediately because skbs are not returned to the stack and the socket send buffer becomes full. The patch enables tx interrupts so that the tx reclaim is scheduled after completed transmissions. Signed-off-by: Beniamino Galvani <b.galvani@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
1d7efe9dfa
commit
7ce7679d6b
|
@ -298,7 +298,7 @@ static int arc_emac_poll(struct napi_struct *napi, int budget)
|
|||
work_done = arc_emac_rx(ndev, budget);
|
||||
if (work_done < budget) {
|
||||
napi_complete(napi);
|
||||
arc_reg_or(priv, R_ENABLE, RXINT_MASK);
|
||||
arc_reg_or(priv, R_ENABLE, RXINT_MASK | TXINT_MASK);
|
||||
}
|
||||
|
||||
return work_done;
|
||||
|
@ -327,9 +327,9 @@ static irqreturn_t arc_emac_intr(int irq, void *dev_instance)
|
|||
/* Reset all flags except "MDIO complete" */
|
||||
arc_reg_set(priv, R_STATUS, status);
|
||||
|
||||
if (status & RXINT_MASK) {
|
||||
if (status & (RXINT_MASK | TXINT_MASK)) {
|
||||
if (likely(napi_schedule_prep(&priv->napi))) {
|
||||
arc_reg_clr(priv, R_ENABLE, RXINT_MASK);
|
||||
arc_reg_clr(priv, R_ENABLE, RXINT_MASK | TXINT_MASK);
|
||||
__napi_schedule(&priv->napi);
|
||||
}
|
||||
}
|
||||
|
@ -440,7 +440,7 @@ static int arc_emac_open(struct net_device *ndev)
|
|||
arc_reg_set(priv, R_TX_RING, (unsigned int)priv->txbd_dma);
|
||||
|
||||
/* Enable interrupts */
|
||||
arc_reg_set(priv, R_ENABLE, RXINT_MASK | ERR_MASK);
|
||||
arc_reg_set(priv, R_ENABLE, RXINT_MASK | TXINT_MASK | ERR_MASK);
|
||||
|
||||
/* Set CONTROL */
|
||||
arc_reg_set(priv, R_CTRL,
|
||||
|
@ -511,7 +511,7 @@ static int arc_emac_stop(struct net_device *ndev)
|
|||
netif_stop_queue(ndev);
|
||||
|
||||
/* Disable interrupts */
|
||||
arc_reg_clr(priv, R_ENABLE, RXINT_MASK | ERR_MASK);
|
||||
arc_reg_clr(priv, R_ENABLE, RXINT_MASK | TXINT_MASK | ERR_MASK);
|
||||
|
||||
/* Disable EMAC */
|
||||
arc_reg_clr(priv, R_CTRL, EN_MASK);
|
||||
|
|
Loading…
Reference in New Issue