]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
net: ravb: Refactor GbEth RX code path
authorPaul Barker <paul.barker.ct@bp.renesas.com>
Tue, 4 Jun 2024 07:28:22 +0000 (08:28 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 6 Jun 2024 07:59:57 +0000 (09:59 +0200)
We can reduce code duplication in ravb_rx_gbeth().

Signed-off-by: Paul Barker <paul.barker.ct@bp.renesas.com>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/renesas/ravb_main.c

index 63d03929e3f5e1e2549750f33d75855c88ba46d3..e8c3f48b213d986fc49c93d8e510d3a44ad22020 100644 (file)
@@ -819,47 +819,52 @@ static int ravb_rx_gbeth(struct net_device *ndev, int budget, int q)
                                stats->rx_missed_errors++;
                } else {
                        die_dt = desc->die_dt & 0xF0;
+                       skb = ravb_get_skb_gbeth(ndev, entry, desc);
                        switch (die_dt) {
                        case DT_FSINGLE:
-                               skb = ravb_get_skb_gbeth(ndev, entry, desc);
-                               skb_put(skb, desc_len);
-                               skb->protocol = eth_type_trans(skb, ndev);
-                               if (ndev->features & NETIF_F_RXCSUM)
-                                       ravb_rx_csum_gbeth(skb);
-                               napi_gro_receive(&priv->napi[q], skb);
-                               rx_packets++;
-                               stats->rx_bytes += desc_len;
-                               break;
                        case DT_FSTART:
-                               priv->rx_1st_skb = ravb_get_skb_gbeth(ndev, entry, desc);
-                               skb_put(priv->rx_1st_skb, desc_len);
+                               /* Start of packet: Set initial data length. */
+                               skb_put(skb, desc_len);
+
+                               /* Save this skb if the packet spans multiple
+                                * descriptors.
+                                */
+                               if (die_dt == DT_FSTART)
+                                       priv->rx_1st_skb = skb;
                                break;
+
                        case DT_FMID:
-                               skb = ravb_get_skb_gbeth(ndev, entry, desc);
-                               skb_copy_to_linear_data_offset(priv->rx_1st_skb,
-                                                              priv->rx_1st_skb->len,
-                                                              skb->data,
-                                                              desc_len);
-                               skb_put(priv->rx_1st_skb, desc_len);
-                               dev_kfree_skb(skb);
-                               break;
                        case DT_FEND:
-                               skb = ravb_get_skb_gbeth(ndev, entry, desc);
+                               /* Continuing a packet: Move data into the saved
+                                * skb.
+                                */
                                skb_copy_to_linear_data_offset(priv->rx_1st_skb,
                                                               priv->rx_1st_skb->len,
                                                               skb->data,
                                                               desc_len);
                                skb_put(priv->rx_1st_skb, desc_len);
                                dev_kfree_skb(skb);
-                               priv->rx_1st_skb->protocol =
-                                       eth_type_trans(priv->rx_1st_skb, ndev);
+
+                               /* Set skb to point at the whole packet so that
+                                * we only need one code path for finishing a
+                                * packet.
+                                */
+                               skb = priv->rx_1st_skb;
+                       }
+
+                       switch (die_dt) {
+                       case DT_FSINGLE:
+                       case DT_FEND:
+                               /* Finishing a packet: Determine protocol &
+                                * checksum, hand off to NAPI and update our
+                                * stats.
+                                */
+                               skb->protocol = eth_type_trans(skb, ndev);
                                if (ndev->features & NETIF_F_RXCSUM)
-                                       ravb_rx_csum_gbeth(priv->rx_1st_skb);
-                               stats->rx_bytes += priv->rx_1st_skb->len;
-                               napi_gro_receive(&priv->napi[q],
-                                                priv->rx_1st_skb);
+                                       ravb_rx_csum_gbeth(skb);
+                               stats->rx_bytes += skb->len;
+                               napi_gro_receive(&priv->napi[q], skb);
                                rx_packets++;
-                               break;
                        }
                }
        }