Commit aabdcb0b553b9c9547b1a506b34d55a764745870

Authored by Oliver Hartkopp
Committed by David S. Miller
1 parent d3c52173be

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

... ... @@ -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 }