1 #ifndef _GPXE_RETRY_H 2 #define _GPXE_RETRY_H 3 4 /** @file 5 * 6 * Retry timers 7 * 8 */ 9 10 FILE_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 */ 21 struct 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 54 extern void start_timer ( struct retry_timer *timer ); 55 extern void start_timer_fixed ( struct retry_timer *timer, 56 unsigned long timeout ); 57 extern 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 */ start_timer_nodelay(struct retry_timer * timer)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 */ 76 static inline __attribute__ (( always_inline )) unsigned long timer_running(struct retry_timer * timer)77timer_running ( struct retry_timer *timer ) { 78 return ( timer->running ); 79 } 80 81 #endif /* _GPXE_RETRY_H */ 82