ep93xx_eth: add GRO support
Use napi_complete_done() instead of __napi_complete() to : 1) Get support of gro_flush_timeout if opt-in 2) Not rearm interrupts for busy-polling users. 3) use standard NAPI API. 4) get rid of baroque code and ease maintenance. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5b2ec6f2be
commit
a396178972
|
@ -228,9 +228,10 @@ static void ep93xx_mdio_write(struct net_device *dev, int phy_id, int reg, int d
|
|||
pr_info("mdio write timed out\n");
|
||||
}
|
||||
|
||||
static int ep93xx_rx(struct net_device *dev, int processed, int budget)
|
||||
static int ep93xx_rx(struct net_device *dev, int budget)
|
||||
{
|
||||
struct ep93xx_priv *ep = netdev_priv(dev);
|
||||
int processed = 0;
|
||||
|
||||
while (processed < budget) {
|
||||
int entry;
|
||||
|
@ -294,7 +295,7 @@ static int ep93xx_rx(struct net_device *dev, int processed, int budget)
|
|||
skb_put(skb, length);
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
|
||||
netif_receive_skb(skb);
|
||||
napi_gro_receive(&ep->napi, skb);
|
||||
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += length;
|
||||
|
@ -310,35 +311,17 @@ err:
|
|||
return processed;
|
||||
}
|
||||
|
||||
static int ep93xx_have_more_rx(struct ep93xx_priv *ep)
|
||||
{
|
||||
struct ep93xx_rstat *rstat = ep->descs->rstat + ep->rx_pointer;
|
||||
return !!((rstat->rstat0 & RSTAT0_RFP) && (rstat->rstat1 & RSTAT1_RFP));
|
||||
}
|
||||
|
||||
static int ep93xx_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct ep93xx_priv *ep = container_of(napi, struct ep93xx_priv, napi);
|
||||
struct net_device *dev = ep->dev;
|
||||
int rx = 0;
|
||||
|
||||
poll_some_more:
|
||||
rx = ep93xx_rx(dev, rx, budget);
|
||||
if (rx < budget) {
|
||||
int more = 0;
|
||||
int rx;
|
||||
|
||||
rx = ep93xx_rx(dev, budget);
|
||||
if (rx < budget && napi_complete_done(napi, rx)) {
|
||||
spin_lock_irq(&ep->rx_lock);
|
||||
__napi_complete(napi);
|
||||
wrl(ep, REG_INTEN, REG_INTEN_TX | REG_INTEN_RX);
|
||||
if (ep93xx_have_more_rx(ep)) {
|
||||
wrl(ep, REG_INTEN, REG_INTEN_TX);
|
||||
wrl(ep, REG_INTSTSP, REG_INTSTS_RX);
|
||||
more = 1;
|
||||
}
|
||||
spin_unlock_irq(&ep->rx_lock);
|
||||
|
||||
if (more && napi_reschedule(napi))
|
||||
goto poll_some_more;
|
||||
}
|
||||
|
||||
if (rx) {
|
||||
|
|
Loading…
Reference in New Issue