aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorG. Liakhovetski <gl@dsa-ac.de>2007-06-08 22:15:56 -0400
committerDavid S. Miller <davem@davemloft.net>2007-06-08 22:15:56 -0400
commitb7e773b869f49bbd69e9dad76b34d3552627fac5 (patch)
tree5faa288e9287474c8c8f821b55397d4ee528cb96 /net
parentc0cfe7faa12f189ef1024fce5a710791d0062355 (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>
Diffstat (limited to 'net')
-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 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