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