r8169: improve rtl_rx
authorHeiner Kallweit <hkallweit1@gmail.com>
Mon, 22 Jul 2019 20:01:15 +0000 (22:01 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 23 Jul 2019 01:28:12 +0000 (18:28 -0700)
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>
drivers/net/ethernet/realtek/r8169_main.c

index 6272115b28480a55b081bd2c52ec051791835786..9c743d2fc29de53c3437f437f56022765336ccf8 100644 (file)
@@ -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);