return -ENODEV;
}
- msleep(sleep_period_ms);
- sleep_total_ms += sleep_period_ms;
- if (sleep_period_ms < 64)
- sleep_period_ms <<= 1;
+ sleep_total_ms += xe_sleep_exponential_ms(&sleep_period_ms, 64);
goto try_again;
}
}
usleep_range(min_us, max_us);
}
+/**
+ * xe_sleep_exponential_ms() - Sleep for a exponentially increased time.
+ * @sleep_period_ms: current time in msec to sleep
+ * @max_sleep_ms: maximum time in msec to sleep
+ *
+ * Sleep for the @sleep_period_ms and exponentially increase this time for the
+ * next loop, unless reaching the @max_sleep_ms limit.
+ *
+ * Return: approximate time in msec the task was delayed.
+ */
+static inline unsigned int xe_sleep_exponential_ms(unsigned int *sleep_period_ms,
+ unsigned int max_sleep_ms)
+{
+ unsigned int delay_ms = *sleep_period_ms;
+ unsigned int next_delay_ms = 2 * delay_ms;
+
+ xe_sleep_relaxed_ms(delay_ms);
+ *sleep_period_ms = min(next_delay_ms, max_sleep_ms);
+ return delay_ms;
+}
+
#endif