On Mon, Feb 22, 2016 at 02:49:33PM +0800, Yangbo Lu wrote: > @@ -2708,6 +2708,7 @@ static void gfar_clean_tx_ring(struct gfar_priv_tx_q > *tx_queue) > struct skb_shared_hwtstamps shhwtstamps; > u64 *ns = (u64 *)(((uintptr_t)skb->data + 0x10) & > ~0x7UL); > + *ns = be64_to_cpu(*ns); > > memset(&shhwtstamps, 0, sizeof(shhwtstamps)); > shhwtstamps.hwtstamp = ns_to_ktime(*ns);
There is no point in modifying the buffer data in place. Instead, do this: memset(&shhwtstamps, 0, sizeof(shhwtstamps)); shhwtstamps.hwtstamp = ns_to_ktime(be64_to_cpu(*ns)); or this: u64 ns, *ptr = (u64 *)(((uintptr_t)skb->data + 0x10) & ~0x7UL); ns = be64_to_cpu(*ptr); memset(&shhwtstamps, 0, sizeof(shhwtstamps)); shhwtstamps.hwtstamp = ns_to_ktime(ns); > @@ -3037,6 +3038,7 @@ static void gfar_process_frame(struct net_device *ndev, > struct sk_buff *skb) > if (priv->hwts_rx_en) { > struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb); > u64 *ns = (u64 *) skb->data; > + *ns = be64_to_cpu(*ns); > > memset(shhwtstamps, 0, sizeof(*shhwtstamps)); > shhwtstamps->hwtstamp = ns_to_ktime(*ns); Same here. Thanks, Richard