static int __axienet_device_reset(struct axienet_local *lp)
 {
-       u32 timeout;
+       u32 value;
+       int ret;
 
        /* Reset Axi DMA. This would reset Axi Ethernet core as well. The reset
         * process of Axi DMA takes a while to complete as all pending
         * they both reset the entire DMA core, so only one needs to be used.
         */
        axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET, XAXIDMA_CR_RESET_MASK);
-       timeout = DELAY_OF_ONE_MILLISEC;
-       while (axienet_dma_in32(lp, XAXIDMA_TX_CR_OFFSET) &
-                               XAXIDMA_CR_RESET_MASK) {
-               udelay(1);
-               if (--timeout == 0) {
-                       netdev_err(lp->ndev, "%s: DMA reset timeout!\n",
-                                  __func__);
-                       return -ETIMEDOUT;
-               }
+       ret = read_poll_timeout(axienet_dma_in32, value,
+                               !(value & XAXIDMA_CR_RESET_MASK),
+                               DELAY_OF_ONE_MILLISEC, 50000, false, lp,
+                               XAXIDMA_TX_CR_OFFSET);
+       if (ret) {
+               dev_err(lp->dev, "%s: DMA reset timeout!\n", __func__);
+               return ret;
        }
 
        return 0;