diff options
author | G. Liakhovetski <gl@dsa-ac.de> | 2007-06-08 22:15:56 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-06-08 22:15:56 -0400 |
commit | b7e773b869f49bbd69e9dad76b34d3552627fac5 (patch) | |
tree | 5faa288e9287474c8c8f821b55397d4ee528cb96 | |
parent | c0cfe7faa12f189ef1024fce5a710791d0062355 (diff) |
[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>
-rw-r--r-- | net/irda/irlap_event.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/net/irda/irlap_event.c b/net/irda/irlap_event.c index 71c805506933..a8b8873aa263 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, | |||
1418 | */ | 1418 | */ |
1419 | self->remote_busy = FALSE; | 1419 | self->remote_busy = FALSE; |
1420 | 1420 | ||
1421 | /* Stop final timer */ | ||
1422 | del_timer(&self->final_timer); | ||
1423 | |||
1421 | /* | 1424 | /* |
1422 | * Nr as expected? | 1425 | * Nr as expected? |
1423 | */ | 1426 | */ |
1424 | ret = irlap_validate_nr_received(self, info->nr); | 1427 | ret = irlap_validate_nr_received(self, info->nr); |
1425 | if (ret == NR_EXPECTED) { | 1428 | if (ret == NR_EXPECTED) { |
1426 | /* Stop final timer */ | ||
1427 | del_timer(&self->final_timer); | ||
1428 | |||
1429 | /* Update Nr received */ | 1429 | /* Update Nr received */ |
1430 | irlap_update_nr_received(self, info->nr); | 1430 | irlap_update_nr_received(self, info->nr); |
1431 | 1431 | ||
@@ -1457,14 +1457,12 @@ static int irlap_state_nrm_p(struct irlap_cb *self, IRLAP_EVENT event, | |||
1457 | 1457 | ||
1458 | /* Resend rejected frames */ | 1458 | /* Resend rejected frames */ |
1459 | irlap_resend_rejected_frames(self, CMD_FRAME); | 1459 | irlap_resend_rejected_frames(self, CMD_FRAME); |
1460 | 1460 | irlap_start_final_timer(self, self->final_timeout * 2); | |
1461 | /* Final timer ??? Jean II */ | ||
1462 | 1461 | ||
1463 | irlap_next_state(self, LAP_NRM_P); | 1462 | irlap_next_state(self, LAP_NRM_P); |
1464 | } else if (ret == NR_INVALID) { | 1463 | } else if (ret == NR_INVALID) { |
1465 | IRDA_DEBUG(1, "%s(), Received RR with " | 1464 | IRDA_DEBUG(1, "%s(), Received RR with " |
1466 | "invalid nr !\n", __FUNCTION__); | 1465 | "invalid nr !\n", __FUNCTION__); |
1467 | del_timer(&self->final_timer); | ||
1468 | 1466 | ||
1469 | irlap_next_state(self, LAP_RESET_WAIT); | 1467 | irlap_next_state(self, LAP_RESET_WAIT); |
1470 | 1468 | ||