1#ifndef _GPXE_RETRY_H
2#define _GPXE_RETRY_H
3
4/** @file
5 *
6 * Retry timers
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER );
11
12#include <gpxe/list.h>
13
14/** Default timeout value */
15#define DEFAULT_MIN_TIMEOUT ( TICKS_PER_SEC / 4 )
16
17/** Limit after which the timeout will be deemed permanent */
18#define DEFAULT_MAX_TIMEOUT ( 10 * TICKS_PER_SEC )
19
20/** A retry timer */
21struct retry_timer {
22	/** List of active timers */
23	struct list_head list;
24	/** Timer is currently running */
25	unsigned int running;
26	/** Timeout value (in ticks) */
27	unsigned long timeout;
28	/** Minimum timeout value (in ticks)
29	 *
30	 * A value of zero means "use default timeout."
31	 */
32	unsigned long min_timeout;
33	/** Maximum timeout value before failure (in ticks)
34	 *
35	 * A value of zero means "use default timeout."
36	 */
37	unsigned long max_timeout;
38	/** Start time (in ticks) */
39	unsigned long start;
40	/** Retry count */
41	unsigned int count;
42	/** Timer expired callback
43	 *
44	 * @v timer	Retry timer
45	 * @v fail	Failure indicator
46	 *
47	 * The timer will already be stopped when this method is
48	 * called.  The failure indicator will be True if the retry
49	 * timeout has already exceeded @c MAX_TIMEOUT.
50	 */
51	void ( * expired ) ( struct retry_timer *timer, int over );
52};
53
54extern void start_timer ( struct retry_timer *timer );
55extern void start_timer_fixed ( struct retry_timer *timer,
56				unsigned long timeout );
57extern void stop_timer ( struct retry_timer *timer );
58
59/**
60 * Start timer with no delay
61 *
62 * @v timer		Retry timer
63 *
64 * This starts the timer running with a zero timeout value.
65 */
66static inline void start_timer_nodelay ( struct retry_timer *timer ) {
67	start_timer_fixed ( timer, 0 );
68}
69
70/**
71 * Test to see if timer is currently running
72 *
73 * @v timer		Retry timer
74 * @ret running		Non-zero if timer is running
75 */
76static inline __attribute__ (( always_inline )) unsigned long
77timer_running ( struct retry_timer *timer ) {
78	return ( timer->running );
79}
80
81#endif /* _GPXE_RETRY_H */
82