skb_copy_to_linear_data(skb, va, length);
                skb->tail += length;
        } else {
+               unsigned int pull_len;
+
                /* Move relevant fragments to skb */
                used_frags = mlx4_en_complete_rx_desc(priv, rx_desc, frags,
                                                        skb, length);
                }
                skb_shinfo(skb)->nr_frags = used_frags;
 
+               pull_len = eth_get_headlen(va, SMALL_PACKET_SIZE);
                /* Copy headers into the skb linear buffer */
-               memcpy(skb->data, va, HEADER_COPY_SIZE);
-               skb->tail += HEADER_COPY_SIZE;
+               memcpy(skb->data, va, pull_len);
+               skb->tail += pull_len;
 
                /* Skip headers in first fragment */
-               skb_shinfo(skb)->frags[0].page_offset += HEADER_COPY_SIZE;
+               skb_shinfo(skb)->frags[0].page_offset += pull_len;
 
                /* Adjust size of first fragment */
-               skb_frag_size_sub(&skb_shinfo(skb)->frags[0], HEADER_COPY_SIZE);
-               skb->data_len = length - HEADER_COPY_SIZE;
+               skb_frag_size_sub(&skb_shinfo(skb)->frags[0], pull_len);
+               skb->data_len = length - pull_len;
        }
        return skb;
 }