Commit 7ce7679d authored by Beniamino Galvani's avatar Beniamino Galvani Committed by David S. Miller

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: default avatarBeniamino Galvani <b.galvani@gmail.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1d7efe9d
...@@ -298,7 +298,7 @@ static int arc_emac_poll(struct napi_struct *napi, int budget) ...@@ -298,7 +298,7 @@ static int arc_emac_poll(struct napi_struct *napi, int budget)
work_done = arc_emac_rx(ndev, budget); work_done = arc_emac_rx(ndev, budget);
if (work_done < budget) { if (work_done < budget) {
napi_complete(napi); napi_complete(napi);
arc_reg_or(priv, R_ENABLE, RXINT_MASK); arc_reg_or(priv, R_ENABLE, RXINT_MASK | TXINT_MASK);
} }
return work_done; return work_done;
...@@ -327,9 +327,9 @@ static irqreturn_t arc_emac_intr(int irq, void *dev_instance) ...@@ -327,9 +327,9 @@ static irqreturn_t arc_emac_intr(int irq, void *dev_instance)
/* Reset all flags except "MDIO complete" */ /* Reset all flags except "MDIO complete" */
arc_reg_set(priv, R_STATUS, status); arc_reg_set(priv, R_STATUS, status);
if (status & RXINT_MASK) { if (status & (RXINT_MASK | TXINT_MASK)) {
if (likely(napi_schedule_prep(&priv->napi))) { 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); __napi_schedule(&priv->napi);
} }
} }
...@@ -440,7 +440,7 @@ static int arc_emac_open(struct net_device *ndev) ...@@ -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); arc_reg_set(priv, R_TX_RING, (unsigned int)priv->txbd_dma);
/* Enable interrupts */ /* 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 */ /* Set CONTROL */
arc_reg_set(priv, R_CTRL, arc_reg_set(priv, R_CTRL,
...@@ -511,7 +511,7 @@ static int arc_emac_stop(struct net_device *ndev) ...@@ -511,7 +511,7 @@ static int arc_emac_stop(struct net_device *ndev)
netif_stop_queue(ndev); netif_stop_queue(ndev);
/* Disable interrupts */ /* 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 */ /* Disable EMAC */
arc_reg_clr(priv, R_CTRL, EN_MASK); arc_reg_clr(priv, R_CTRL, EN_MASK);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment