}
}
-static void bcm_tx_start_timer(struct bcm_op *op)
-{
- if (op->kt_ival1.tv64 && op->count)
- hrtimer_start(&op->timer,
- ktime_add(ktime_get(), op->kt_ival1),
- HRTIMER_MODE_ABS);
- else if (op->kt_ival2.tv64)
- hrtimer_start(&op->timer,
- ktime_add(ktime_get(), op->kt_ival2),
- HRTIMER_MODE_ABS);
-}
-
static void bcm_tx_timeout_tsklet(unsigned long data)
{
struct bcm_op *op = (struct bcm_op *)data;
bcm_send_to_user(op, &msg_head, NULL, 0);
}
- bcm_can_tx(op);
+ }
+
+ if (op->kt_ival1.tv64 && (op->count > 0)) {
- } else if (op->kt_ival2.tv64)
+ /* send (next) frame */
bcm_can_tx(op);
+ hrtimer_start(&op->timer,
+ ktime_add(ktime_get(), op->kt_ival1),
+ HRTIMER_MODE_ABS);
- bcm_tx_start_timer(op);
+ } else {
+ if (op->kt_ival2.tv64) {
+
+ /* send (next) frame */
+ bcm_can_tx(op);
+ hrtimer_start(&op->timer,
+ ktime_add(ktime_get(), op->kt_ival2),
+ HRTIMER_MODE_ABS);
+ }
+ }
}
/*
hrtimer_cancel(&op->timer);
}
- if (op->flags & STARTTIMER) {
- hrtimer_cancel(&op->timer);
+ if ((op->flags & STARTTIMER) &&
+ ((op->kt_ival1.tv64 && op->count) || op->kt_ival2.tv64)) {
+
/* spec: send can_frame when starting timer */
op->flags |= TX_ANNOUNCE;
- }
- if (op->flags & TX_ANNOUNCE) {
- bcm_can_tx(op);
- if (op->count)
- op->count--;
+ if (op->kt_ival1.tv64 && (op->count > 0)) {
+ /* op->count-- is done in bcm_tx_timeout_handler */
+ hrtimer_start(&op->timer, op->kt_ival1,
+ HRTIMER_MODE_REL);
+ } else
+ hrtimer_start(&op->timer, op->kt_ival2,
+ HRTIMER_MODE_REL);
}
- if (op->flags & STARTTIMER)
- bcm_tx_start_timer(op);
+ if (op->flags & TX_ANNOUNCE)
+ bcm_can_tx(op);
return msg_head->nframes * CFSIZ + MHSIZ;
}
op->sk = sk;
op->ifindex = ifindex;
- /* ifindex for timeout events w/o previous frame reception */
- op->rx_ifindex = ifindex;
-
/* initialize uninitialized (kzalloc) structure */
hrtimer_init(&op->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
op->timer.function = bcm_rx_timeout_handler;