enum e1000_ring_flags_t {
        IGB_RING_FLAG_RX_3K_BUFFER,
+       IGB_RING_FLAG_RX_BUILD_SKB_ENABLED,
        IGB_RING_FLAG_RX_SCTP_CSUM,
        IGB_RING_FLAG_RX_LB_VLAN_BSWAP,
        IGB_RING_FLAG_TX_CTX_IDX,
 #define clear_ring_uses_large_buffer(ring) \
        clear_bit(IGB_RING_FLAG_RX_3K_BUFFER, &(ring)->flags)
 
+#define ring_uses_build_skb(ring) \
+       test_bit(IGB_RING_FLAG_RX_BUILD_SKB_ENABLED, &(ring)->flags)
+#define set_ring_build_skb_enabled(ring) \
+       set_bit(IGB_RING_FLAG_RX_BUILD_SKB_ENABLED, &(ring)->flags)
+#define clear_ring_build_skb_enabled(ring) \
+       clear_bit(IGB_RING_FLAG_RX_BUILD_SKB_ENABLED, &(ring)->flags)
+
 static inline unsigned int igb_rx_bufsz(struct igb_ring *ring)
 {
 #if (PAGE_SIZE < 8192)
        if (ring_uses_large_buffer(ring))
                return IGB_RXBUFFER_3072;
+
+       if (ring_uses_build_skb(ring))
+               return IGB_MAX_FRAME_BUILD_SKB + IGB_TS_HDR_LEN;
 #endif
        return IGB_RXBUFFER_2048;
 }
 
                                  struct igb_ring *rx_ring)
 {
        /* set build_skb and buffer size flags */
+       clear_ring_build_skb_enabled(rx_ring);
        clear_ring_uses_large_buffer(rx_ring);
 
        if (adapter->flags & IGB_FLAG_RX_LEGACY)
                return;
 
+       set_ring_build_skb_enabled(rx_ring);
+
 #if (PAGE_SIZE < 8192)
        if (adapter->max_frame_size <= IGB_MAX_FRAME_BUILD_SKB)
                return;
 #if (PAGE_SIZE < 8192)
        unsigned int truesize = igb_rx_pg_size(rx_ring) / 2;
 #else
-       unsigned int truesize = SKB_DATA_ALIGN(size);
+       unsigned int truesize = ring_uses_build_skb(rx_ring) ?
+                               SKB_DATA_ALIGN(IGB_SKB_PAD + size) :
+                               SKB_DATA_ALIGN(size);
 #endif
        unsigned int pull_len;
 
        return total_packets;
 }
 
+static inline unsigned int igb_rx_offset(struct igb_ring *rx_ring)
+{
+       return ring_uses_build_skb(rx_ring) ? IGB_SKB_PAD : 0;
+}
+
 static bool igb_alloc_mapped_page(struct igb_ring *rx_ring,
                                  struct igb_rx_buffer *bi)
 {
 
        bi->dma = dma;
        bi->page = page;
-       bi->page_offset = 0;
+       bi->page_offset = igb_rx_offset(rx_ring);
        bi->pagecnt_bias = 1;
 
        return true;