struct skb_shared_hwtstamps *shhwtstamps;
        u64 ns;
        u16 vtag = 0;
+       u32 r_dh_off;
        struct net_device *netdev = (struct net_device *)arg;
        struct octeon_droq *droq = container_of(param, struct octeon_droq,
                                                napi);
                        put_page(pg_info->page);
                }
 
+               r_dh_off = (rh->r_dh.len - 1) * BYTES_PER_DHLEN_UNIT;
+
                if (((oct->chip_id == OCTEON_CN66XX) ||
                     (oct->chip_id == OCTEON_CN68XX)) &&
                    ptp_enable) {
                                        /* Nanoseconds are in the first 64-bits
                                         * of the packet.
                                         */
-                                       memcpy(&ns, (skb->data), sizeof(ns));
+                                       memcpy(&ns, (skb->data + r_dh_off),
+                                              sizeof(ns));
+                                       r_dh_off -= BYTES_PER_DHLEN_UNIT;
                                        shhwtstamps = skb_hwtstamps(skb);
                                        shhwtstamps->hwtstamp =
                                                ns_to_ktime(ns +
                                                            lio->ptp_adjust);
                                }
-                               skb_pull(skb, sizeof(ns));
                        }
                }
 
+               if (rh->r_dh.has_hash) {
+                       __be32 *hash_be = (__be32 *)(skb->data + r_dh_off);
+                       u32 hash = be32_to_cpu(*hash_be);
+
+                       skb_set_hash(skb, hash, PKT_HASH_TYPE_L4);
+                       r_dh_off -= BYTES_PER_DHLEN_UNIT;
+               }
+
+               skb_pull(skb, rh->r_dh.len * BYTES_PER_DHLEN_UNIT);
+
                skb->protocol = eth_type_trans(skb, skb->dev);
                if ((netdev->features & NETIF_F_RXCSUM) &&
                    (((rh->r_dh.encap_on) &&
 
        struct net_device *netdev = (struct net_device *)arg;
        struct sk_buff *skb = (struct sk_buff *)skbuff;
        u16 vtag = 0;
+       u32 r_dh_off;
 
        if (netdev) {
                struct lio *lio = GET_LIO(netdev);
                        put_page(pg_info->page);
                }
 
-               skb_pull(skb, rh->r_dh.len * 8);
+               r_dh_off = (rh->r_dh.len - 1) * BYTES_PER_DHLEN_UNIT;
+
+               if (rh->r_dh.has_hwtstamp)
+                       r_dh_off -= BYTES_PER_DHLEN_UNIT;
+
+               if (rh->r_dh.has_hash) {
+                       __be32 *hash_be = (__be32 *)(skb->data + r_dh_off);
+                       u32 hash = be32_to_cpu(*hash_be);
+
+                       skb_set_hash(skb, hash, PKT_HASH_TYPE_L4);
+                       r_dh_off -= BYTES_PER_DHLEN_UNIT;
+               }
+
+               skb_pull(skb, rh->r_dh.len * BYTES_PER_DHLEN_UNIT);
                skb->protocol = eth_type_trans(skb, skb->dev);
 
                if ((netdev->features & NETIF_F_RXCSUM) &&
 
 #define CVM_DRV_INVALID_APP         (CVM_DRV_APP_START + 0x2)
 #define CVM_DRV_APP_END             (CVM_DRV_INVALID_APP - 1)
 
+#define BYTES_PER_DHLEN_UNIT        8
+
 static inline u32 incr_index(u32 index, u32 count, u32 max)
 {
        if ((index + count) >= max)