bdp = fep->rx_bd_base;
        for (i = 0; i < fep->rx_ring_size; i++) {
                skb = fep->rx_skbuff[i];
-
-               if (bdp->cbd_bufaddr)
+               fep->rx_skbuff[i] = NULL;
+               if (skb) {
                        dma_unmap_single(&fep->pdev->dev, bdp->cbd_bufaddr,
                                        FEC_ENET_RX_FRSIZE, DMA_FROM_DEVICE);
-               if (skb)
                        dev_kfree_skb(skb);
+               }
                bdp = fec_enet_get_nextdesc(bdp, fep);
        }
 
 
        bdp = fep->rx_bd_base;
        for (i = 0; i < fep->rx_ring_size; i++) {
+               dma_addr_t addr;
+
                skb = netdev_alloc_skb(ndev, FEC_ENET_RX_FRSIZE);
                if (!skb) {
                        fec_enet_free_buffers(ndev);
                        return -ENOMEM;
                }
-               fep->rx_skbuff[i] = skb;
 
-               bdp->cbd_bufaddr = dma_map_single(&fep->pdev->dev, skb->data,
+               addr = dma_map_single(&fep->pdev->dev, skb->data,
                                FEC_ENET_RX_FRSIZE, DMA_FROM_DEVICE);
-               if (dma_mapping_error(&fep->pdev->dev, bdp->cbd_bufaddr)) {
+               if (dma_mapping_error(&fep->pdev->dev, addr)) {
+                       dev_kfree_skb(skb);
                        fec_enet_free_buffers(ndev);
                        if (net_ratelimit())
                                netdev_err(ndev, "Rx DMA memory map failed\n");
                        return -ENOMEM;
                }
+
+               fep->rx_skbuff[i] = skb;
+               bdp->cbd_bufaddr = addr;
                bdp->cbd_sc = BD_ENET_RX_EMPTY;
 
                if (fep->bufdesc_ex) {