The timestamp fields should be copied to new skb too in
A-050385 workaround for later TX timestamping handling.

Fixes: 3c68b8fffb48 ("dpaa_eth: FMan erratum A050385 workaround")
Signed-off-by: Yangbo Lu <yangbo...@nxp.com>
---
 drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c 
b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
index d9c2859..cb7c028 100644
--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
@@ -2120,6 +2120,15 @@ static int dpaa_a050385_wa(struct net_device *net_dev, 
struct sk_buff **s)
        skb_copy_header(new_skb, skb);
        new_skb->dev = skb->dev;
 
+       /* Copy relevant timestamp info from the old skb to the new */
+       if (priv->tx_tstamp) {
+               skb_shinfo(new_skb)->tx_flags = skb_shinfo(skb)->tx_flags;
+               skb_shinfo(new_skb)->hwtstamps = skb_shinfo(skb)->hwtstamps;
+               skb_shinfo(new_skb)->tskey = skb_shinfo(skb)->tskey;
+               if (skb->sk)
+                       skb_set_owner_w(new_skb, skb->sk);
+       }
+
        /* We move the headroom when we align it so we have to reset the
         * network and transport header offsets relative to the new data
         * pointer. The checksum offload relies on these offsets.
@@ -2127,7 +2136,6 @@ static int dpaa_a050385_wa(struct net_device *net_dev, 
struct sk_buff **s)
        skb_set_network_header(new_skb, skb_network_offset(skb));
        skb_set_transport_header(new_skb, skb_transport_offset(skb));
 
-       /* TODO: does timestamping need the result in the old skb? */
        dev_kfree_skb(skb);
        *s = new_skb;
 
-- 
2.7.4

Reply via email to