Commit aabdcb0b553b9c9547b1a506b34d55a764745870
Committed by
David S. Miller
1 parent
d3c52173be
Exists in
master
and in
6 other branches
can bcm: fix tx_setup off-by-one errors
This patch fixes two off-by-one errors that canceled each other out. Checking for the same condition two times in bcm_tx_timeout_tsklet() reduced the count of frames to be sent by one. This did not show up the first time tx_setup is invoked as an additional frame is sent due to TX_ANNONCE. Invoking a second tx_setup on the same item led to a reduced (by 1) number of sent frames. Reported-by: Andre Naujoks <nautsch@gmail.com> Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 1 changed file with 7 additions and 6 deletions Side-by-side Diff
net/can/bcm.c
... | ... | @@ -365,10 +365,7 @@ |
365 | 365 | |
366 | 366 | bcm_send_to_user(op, &msg_head, NULL, 0); |
367 | 367 | } |
368 | - } | |
369 | 368 | |
370 | - if (op->kt_ival1.tv64 && (op->count > 0)) { | |
371 | - | |
372 | 369 | /* send (next) frame */ |
373 | 370 | bcm_can_tx(op); |
374 | 371 | hrtimer_start(&op->timer, |
... | ... | @@ -970,8 +967,9 @@ |
970 | 967 | /* spec: send can_frame when starting timer */ |
971 | 968 | op->flags |= TX_ANNOUNCE; |
972 | 969 | |
973 | - if (op->kt_ival1.tv64 && (op->count > 0)) { | |
974 | - /* op->count-- is done in bcm_tx_timeout_handler */ | |
970 | + /* only start timer when having more frames than sent below */ | |
971 | + if (op->kt_ival1.tv64 && (op->count > 1)) { | |
972 | + /* op->count-- is done in bcm_tx_timeout_tsklet */ | |
975 | 973 | hrtimer_start(&op->timer, op->kt_ival1, |
976 | 974 | HRTIMER_MODE_REL); |
977 | 975 | } else |
978 | 976 | |
... | ... | @@ -979,8 +977,11 @@ |
979 | 977 | HRTIMER_MODE_REL); |
980 | 978 | } |
981 | 979 | |
982 | - if (op->flags & TX_ANNOUNCE) | |
980 | + if (op->flags & TX_ANNOUNCE) { | |
983 | 981 | bcm_can_tx(op); |
982 | + if (op->kt_ival1.tv64 && (op->count > 0)) | |
983 | + op->count--; | |
984 | + } | |
984 | 985 | |
985 | 986 | return msg_head->nframes * CFSIZ + MHSIZ; |
986 | 987 | } |