]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
Added ISO-TP burst mode for data transfers without tx delay.
authorhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Mon, 2 Feb 2009 11:03:09 +0000 (11:03 +0000)
committerhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Mon, 2 Feb 2009 11:03:09 +0000 (11:03 +0000)
git-svn-id: svn://svn.berlios.de//socketcan/trunk@925 030b6a49-0b11-0410-94ab-b0dab22257f2

kernel/2.6/net/can/isotp.c

index 6c81a445341145bbf7b688d8315c04efd154130e..1e0f14d5e02d93dcd8fb03c2f679c75893ae1eab 100644 (file)
@@ -588,6 +588,7 @@ static void isotp_tx_timer_tsklet(unsigned long data)
                if (!dev)
                        break;
 
+isotp_tx_burst:
                skb = alloc_skb(sizeof(*cf), gfp_any());
                if (!skb) {
                        dev_put(dev);
@@ -608,12 +609,12 @@ static void isotp_tx_timer_tsklet(unsigned long data)
                skb->dev = dev;
                skb->sk  = sk;
                can_send(skb, 1);
-               dev_put(dev);
 
                if (so->tx.idx >= so->tx.len) {
                        /* we are done */
                        DBG("we are done\n");
                        so->tx.state = ISOTP_IDLE;
+                       dev_put(dev);
                        wake_up_interruptible(&so->wait);
                        break;
                }
@@ -622,13 +623,22 @@ static void isotp_tx_timer_tsklet(unsigned long data)
                        /* stop and wait for FC */
                        DBG("BS stop and wait for FC\n");
                        so->tx.state = ISOTP_WAIT_FC;
+                       dev_put(dev);
                        hrtimer_start(&so->txtimer,
                                      ktime_add(ktime_get(), ktime_set(1,0)),
                                      HRTIMER_MODE_ABS);
-               } else
-                       hrtimer_start(&so->txtimer,
-                                     ktime_add(ktime_get(), so->tx_gap),
-                                     HRTIMER_MODE_ABS);
+                       break;
+               } 
+
+               /* no gap between data frames needed => use burst mode */
+               if (!so->tx_gap.tv64)
+                       goto isotp_tx_burst;
+
+               /* start timer to send next data frame with correct delay */
+               dev_put(dev);
+               hrtimer_start(&so->txtimer,
+                             ktime_add(ktime_get(), so->tx_gap),
+                             HRTIMER_MODE_ABS);
                break;
 
        default: