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: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
d1854d509d
Коммит
fcd4e60885
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче