diff -u -p linux/net/irda/timer.d5.c linux/net/irda/timer.c --- linux/net/irda/timer.d5.c Thu Jan 9 13:36:15 2003 +++ linux/net/irda/timer.c Thu Jan 9 13:51:03 2003 @@ -39,8 +39,8 @@ static void irlap_query_timer_expired(vo static void irlap_final_timer_expired(void* data); static void irlap_wd_timer_expired(void* data); static void irlap_backoff_timer_expired(void* data); - static void irlap_media_busy_expired(void* data); + /* * Function irda_start_timer (timer, timeout) * @@ -50,19 +50,18 @@ static void irlap_media_busy_expired(voi void irda_start_timer(struct timer_list *ptimer, int timeout, void *data, TIMER_CALLBACK callback) { - del_timer(ptimer); - - ptimer->data = (unsigned long) data; - /* * For most architectures void * is the same as unsigned long, but * at least we try to use void * as long as possible. Since the * timer functions use unsigned long, we cast the function here */ ptimer->function = (void (*)(unsigned long)) callback; - ptimer->expires = jiffies + timeout; + ptimer->data = (unsigned long) data; - add_timer(ptimer); + /* Set new value for timer (update or add timer). + * We use mod_timer() because it's more efficient and also + * safer with respect to race conditions - Jean II */ + mod_timer(ptimer, jiffies + timeout); } void irlap_start_slot_timer(struct irlap_cb *self, int timeout) @@ -136,8 +135,7 @@ void irlmp_start_idle_timer(struct lap_c void irlmp_stop_idle_timer(struct lap_cb *self) { /* If timer is activated, kill it! */ - if(timer_pending(&self->idle_timer)) - del_timer(&self->idle_timer); + del_timer(&self->idle_timer); } /*