Commit fcd4e608 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by David S. Miller
Browse files

r8169: improve rtl_rx



This patch improves few aspects of rtl_rx, no functional change intended.

1. inline rtl8169_try_rx_copy
2. make pkt_size unsigned
3. use constant ETH_FCS_LEN instead of value 4
4. We just created the skb, so we don't need the checks in skb_put.
   Also we don't need the return value of skb_put.
   Set skb->tail and skb->len directly.

Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d1854d50
Loading
Loading
Loading
Loading
+15 −28
Original line number Diff line number Diff line
@@ -5908,23 +5908,6 @@ static inline void rtl8169_rx_csum(struct sk_buff *skb, u32 opts1)
		skb_checksum_none_assert(skb);
}

static struct sk_buff *rtl8169_try_rx_copy(void *data,
					   struct rtl8169_private *tp,
					   int pkt_size,
					   dma_addr_t addr)
{
	struct sk_buff *skb;
	struct device *d = tp_to_dev(tp);

	dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
	prefetch(data);
	skb = napi_alloc_skb(&tp->napi, pkt_size);
	if (skb)
		skb_copy_to_linear_data(skb, data, pkt_size);

	return skb;
}

static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget)
{
	unsigned int cur_rx, rx_left;
@@ -5960,17 +5943,13 @@ static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget
				goto process_pkt;
			}
		} else {
			unsigned int pkt_size;
			struct sk_buff *skb;
			dma_addr_t addr;
			int pkt_size;

process_pkt:
			addr = le64_to_cpu(desc->addr);
			pkt_size = status & GENMASK(13, 0);
			if (likely(!(dev->features & NETIF_F_RXFCS)))
				pkt_size = (status & 0x00003fff) - 4;
			else
				pkt_size = status & 0x00003fff;

				pkt_size -= ETH_FCS_LEN;
			/*
			 * The driver does not support incoming fragmented
			 * frames. They are seen as a symptom of over-mtu
@@ -5982,15 +5961,23 @@ process_pkt:
				goto release_descriptor;
			}

			skb = rtl8169_try_rx_copy(tp->Rx_databuff[entry],
						  tp, pkt_size, addr);
			if (!skb) {
			dma_sync_single_for_cpu(tp_to_dev(tp),
						le64_to_cpu(desc->addr),
						pkt_size, DMA_FROM_DEVICE);

			skb = napi_alloc_skb(&tp->napi, pkt_size);
			if (unlikely(!skb)) {
				dev->stats.rx_dropped++;
				goto release_descriptor;
			}

			prefetch(tp->Rx_databuff[entry]);
			skb_copy_to_linear_data(skb, tp->Rx_databuff[entry],
						pkt_size);
			skb->tail += pkt_size;
			skb->len = pkt_size;

			rtl8169_rx_csum(skb, status);
			skb_put(skb, pkt_size);
			skb->protocol = eth_type_trans(skb, dev);

			rtl8169_rx_vlan_tag(desc, skb);