if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) {
                        struct skb_shared_hwtstamps shhwtstamps;
-                       u64 *ns = (u64*) (((u32)skb->data + 0x10) & ~0x7);
+                       u64 *ns = (u64 *)(((uintptr_t)skb->data + 0x10) &
+                                         ~0x7UL);
 
                        memset(&shhwtstamps, 0, sizeof(shhwtstamps));
                        shhwtstamps.hwtstamp = ns_to_ktime(*ns);
 
        /* Update Last Free RxBD pointer for LFC */
        if (unlikely(priv->tx_actual_en)) {
-               bdp = gfar_rxbd_lastfree(rx_queue);
-               gfar_write(rx_queue->rfbptr, (u32)bdp);
+               u32 bdp_dma = gfar_rxbd_dma_lastfree(rx_queue);
+
+               gfar_write(rx_queue->rfbptr, bdp_dma);
        }
 
        return howmany;
        struct phy_device *phydev = priv->phydev;
        struct gfar_priv_rx_q *rx_queue = NULL;
        int i;
-       struct rxbd8 *bdp;
 
        if (unlikely(test_bit(GFAR_RESETTING, &priv->state)))
                return;
                /* Turn last free buffer recording on */
                if ((tempval1 & MACCFG1_TX_FLOW) && !tx_flow_oldval) {
                        for (i = 0; i < priv->num_rx_queues; i++) {
+                               u32 bdp_dma;
+
                                rx_queue = priv->rx_queue[i];
-                               bdp = gfar_rxbd_lastfree(rx_queue);
-                               gfar_write(rx_queue->rfbptr, (u32)bdp);
+                               bdp_dma = gfar_rxbd_dma_lastfree(rx_queue);
+                               gfar_write(rx_queue->rfbptr, bdp_dma);
                        }
 
                        priv->tx_actual_en = 1;
 
        return rxq->rx_ring_size + rxq->next_to_clean - rxq->next_to_use - 1;
 }
 
-static inline struct rxbd8 *gfar_rxbd_lastfree(struct gfar_priv_rx_q *rxq)
+static inline u32 gfar_rxbd_dma_lastfree(struct gfar_priv_rx_q *rxq)
 {
+       struct rxbd8 *bdp;
+       u32 bdp_dma;
        int i;
 
        i = rxq->next_to_use ? rxq->next_to_use - 1 : rxq->rx_ring_size - 1;
+       bdp = &rxq->rx_bd_base[i];
+       bdp_dma = lower_32_bits(rxq->rx_bd_dma_base);
+       bdp_dma += (uintptr_t)bdp - (uintptr_t)rxq->rx_bd_base;
 
-       return &rxq->rx_bd_base[i];
+       return bdp_dma;
 }
 
 irqreturn_t gfar_receive(int irq, void *dev_id);