Commit a2c48d59 authored by Jean Tourrilhes's avatar Jean Tourrilhes Committed by Linus Torvalds

[PATCH] : IrDA timer fix

	o [FEATURE] Make IrDA timers use mod_timer instead of
	add+del_timer
parent 5a0b3027
...@@ -39,8 +39,8 @@ static void irlap_query_timer_expired(void* data); ...@@ -39,8 +39,8 @@ static void irlap_query_timer_expired(void* data);
static void irlap_final_timer_expired(void* data); static void irlap_final_timer_expired(void* data);
static void irlap_wd_timer_expired(void* data); static void irlap_wd_timer_expired(void* data);
static void irlap_backoff_timer_expired(void* data); static void irlap_backoff_timer_expired(void* data);
static void irlap_media_busy_expired(void* data); static void irlap_media_busy_expired(void* data);
/* /*
* Function irda_start_timer (timer, timeout) * Function irda_start_timer (timer, timeout)
* *
...@@ -50,19 +50,18 @@ static void irlap_media_busy_expired(void* data); ...@@ -50,19 +50,18 @@ static void irlap_media_busy_expired(void* data);
void irda_start_timer(struct timer_list *ptimer, int timeout, void *data, void irda_start_timer(struct timer_list *ptimer, int timeout, void *data,
TIMER_CALLBACK callback) TIMER_CALLBACK callback)
{ {
del_timer(ptimer);
ptimer->data = (unsigned long) data;
/* /*
* For most architectures void * is the same as unsigned long, but * For most architectures void * is the same as unsigned long, but
* at least we try to use void * as long as possible. Since the * at least we try to use void * as long as possible. Since the
* timer functions use unsigned long, we cast the function here * timer functions use unsigned long, we cast the function here
*/ */
ptimer->function = (void (*)(unsigned long)) callback; 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) void irlap_start_slot_timer(struct irlap_cb *self, int timeout)
...@@ -136,8 +135,7 @@ void irlmp_start_idle_timer(struct lap_cb *self, int timeout) ...@@ -136,8 +135,7 @@ void irlmp_start_idle_timer(struct lap_cb *self, int timeout)
void irlmp_stop_idle_timer(struct lap_cb *self) void irlmp_stop_idle_timer(struct lap_cb *self)
{ {
/* If timer is activated, kill it! */ /* If timer is activated, kill it! */
if(timer_pending(&self->idle_timer)) del_timer(&self->idle_timer);
del_timer(&self->idle_timer);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment