/* Disable/inactivate ring */
        writel_relaxed(0x0, ring->regs + RING_CONTROL);
 
-       /* Flush ring with timeout of 1s */
-       timeout = 1000;
+       /* Set ring flush state */
+       timeout = 1000; /* timeout of 1s */
        writel_relaxed(BIT(CONTROL_FLUSH_SHIFT),
                        ring->regs + RING_CONTROL);
        do {
                    FLUSH_DONE_MASK)
                        break;
                mdelay(1);
-       } while (timeout--);
+       } while (--timeout);
+       if (!timeout)
+               dev_err(ring->mbox->dev,
+                       "setting ring%d flush state timedout\n", ring->num);
+
+       /* Clear ring flush state */
+       timeout = 1000; /* timeout of 1s */
+       writel_relaxed(0x0, ring + RING_CONTROL);
+       do {
+               if (!(readl_relaxed(ring + RING_FLUSH_DONE) &
+                     FLUSH_DONE_MASK))
+                       break;
+               mdelay(1);
+       } while (--timeout);
+       if (!timeout)
+               dev_err(ring->mbox->dev,
+                       "clearing ring%d flush state timedout\n", ring->num);
 
        /* Abort all in-flight requests */
        for (reqid = 0; reqid < RING_MAX_REQ_COUNT; reqid++) {