Commit c46e9907 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

amd8111e: 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: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1fa8c5f3
Loading
Loading
Loading
Loading
+72 −92
Original line number Diff line number Diff line
@@ -695,23 +695,13 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
	void __iomem *mmio = lp->mmio;
	struct sk_buff *skb,*new_skb;
	int min_pkt_len, status;
	unsigned int intr0;
	int num_rx_pkt = 0;
	short pkt_len;
#if AMD8111E_VLAN_TAG_USED
	short vtag;
#endif
	int rx_pkt_limit = budget;
	unsigned long flags;

	if (rx_pkt_limit <= 0)
		goto rx_not_empty;

	do{
		/* process receive packets until we use the quota.
		 * If we own the next entry, it's a new packet. Send it up.
		 */
		while(1) {
	while (num_rx_pkt < budget) {
		status = le16_to_cpu(lp->rx_ring[rx_index].rx_flags);
		if (status & OWN_BIT)
			break;
@@ -749,8 +739,6 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
			lp->drv_rx_errors++;
			goto err_next_pkt;
		}
			if(--rx_pkt_limit < 0)
				goto rx_not_empty;
		new_skb = netdev_alloc_skb(dev, lp->rx_buff_len);
		if (!new_skb) {
			/* if allocation fail,
@@ -780,7 +768,7 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
			__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tag);
		}
#endif
			netif_receive_skb(skb);
		napi_gro_receive(napi, skb);
		/* COAL update rx coalescing parameters */
		lp->coal_conf.rx_packets++;
		lp->coal_conf.rx_bytes += pkt_len;
@@ -795,25 +783,17 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
		lp->rx_ring[rx_index].rx_flags |= cpu_to_le16(OWN_BIT);
		rx_index = (++lp->rx_idx) & RX_RING_DR_MOD_MASK;
	}
		/* Check the interrupt status register for more packets in the
		 * mean time. Process them since we have not used up our quota.
		 */
		intr0 = readl(mmio + INT0);
		/*Ack receive packets */
		writel(intr0 & RINT0,mmio + INT0);

	} while(intr0 & RINT0);
	if (num_rx_pkt < budget && napi_complete_done(napi, num_rx_pkt)) {
		unsigned long flags;

	if (rx_pkt_limit > 0) {
		/* Receive descriptor is empty now */
		spin_lock_irqsave(&lp->lock, flags);
		__napi_complete(napi);
		writel(VAL0|RINTEN0, mmio + INTEN0);
		writel(VAL2 | RDMD0, mmio + CMD0);
		spin_unlock_irqrestore(&lp->lock, flags);
	}

rx_not_empty:
	return num_rx_pkt;
}