if (unlikely(skb == NULL))
                                break;
 
-                       priv->rx_skbuff[entry] = skb;
                        paddr = dma_map_single(priv->device, skb->data,
-                                              bufsz, DMA_FROM_DEVICE);
+                                              priv->dma_buf_sz - NET_IP_ALIGN,
+                                              DMA_FROM_DEVICE);
+                       if (dma_mapping_error(priv->device, paddr)) {
+                               dev_kfree_skb_any(skb);
+                               break;
+                       }
+                       priv->rx_skbuff[entry] = skb;
                        desc_set_buf_addr(p, paddr, priv->dma_buf_sz);
                }
 
                return;
 
        for (i = 0; i < DMA_RX_RING_SZ; i++) {
-               if (priv->rx_skbuff[i] == NULL)
+               struct sk_buff *skb = priv->rx_skbuff[i];
+               if (skb == NULL)
                        continue;
 
                p = priv->dma_rx + i;
                dma_unmap_single(priv->device, desc_get_buf_addr(p),
-                                priv->dma_buf_sz, DMA_FROM_DEVICE);
-               dev_kfree_skb_any(priv->rx_skbuff[i]);
+                                priv->dma_buf_sz - NET_IP_ALIGN, DMA_FROM_DEVICE);
+               dev_kfree_skb_any(skb);
                priv->rx_skbuff[i] = NULL;
        }
 }
 
                skb_put(skb, frame_len);
                dma_unmap_single(priv->device, desc_get_buf_addr(p),
-                                frame_len, DMA_FROM_DEVICE);
+                                priv->dma_buf_sz - NET_IP_ALIGN, DMA_FROM_DEVICE);
 
                skb->protocol = eth_type_trans(skb, priv->dev);
                skb->ip_summed = ip_checksum;