aboutsummaryrefslogtreecommitdiff
path: root/net/irda/irlap_event.c
diff options
context:
space:
mode:
authorG. Liakhovetski <gl@dsa-ac.de>2007-06-08 19:15:56 -0700
committerDavid S. Miller <davem@davemloft.net>2007-06-08 19:15:56 -0700
commitb7e773b869f49bbd69e9dad76b34d3552627fac5 (patch)
tree5faa288e9287474c8c8f821b55397d4ee528cb96 /net/irda/irlap_event.c
parentc0cfe7faa12f189ef1024fce5a710791d0062355 (diff)
downloadlinux-b7e773b869f49bbd69e9dad76b34d3552627fac5.tar.gz
[IrDA]: f-timer reloading when sending rejected frames.
Jean II was right: you have to re-charge the final timer when resending rejected frames. Otherwise it triggers at a wrong time and can break the currently running communication. Reproducible under rt-preempt. Signed-off-by: G. Liakhovetski <gl@dsa-ac.de> Signed-off-by: Samuel Ortiz <samuel@sortiz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/irda/irlap_event.c')
-rw-r--r--net/irda/irlap_event.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/net/irda/irlap_event.c b/net/irda/irlap_event.c
index 71c80550693..a8b8873aa26 100644
--- a/net/irda/irlap_event.c
+++ b/net/irda/irlap_event.c
@@ -1418,14 +1418,14 @@ static int irlap_state_nrm_p(struct irlap_cb *self, IRLAP_EVENT event,
*/
self->remote_busy = FALSE;
+ /* Stop final timer */
+ del_timer(&self->final_timer);
+
/*
* Nr as expected?
*/
ret = irlap_validate_nr_received(self, info->nr);
if (ret == NR_EXPECTED) {
- /* Stop final timer */
- del_timer(&self->final_timer);
-
/* Update Nr received */
irlap_update_nr_received(self, info->nr);
@@ -1457,14 +1457,12 @@ static int irlap_state_nrm_p(struct irlap_cb *self, IRLAP_EVENT event,
/* Resend rejected frames */
irlap_resend_rejected_frames(self, CMD_FRAME);
-
- /* Final timer ??? Jean II */
+ irlap_start_final_timer(self, self->final_timeout * 2);
irlap_next_state(self, LAP_NRM_P);
} else if (ret == NR_INVALID) {
IRDA_DEBUG(1, "%s(), Received RR with "
"invalid nr !\n", __FUNCTION__);
- del_timer(&self->final_timer);
irlap_next_state(self, LAP_RESET_WAIT);