All of lore.kernel.org
 help / color / mirror / Atom feed
* at91 driver lost CAN messages
@ 2017-03-10 13:48 Efim Monjak
  2017-03-11 23:06 ` Oliver Hartkopp
  0 siblings, 1 reply; 21+ messages in thread
From: Efim Monjak @ 2017-03-10 13:48 UTC (permalink / raw)
  To: linux-can

Hi all,

performance test at91_can.c driver by sending 4kByte data @1Mbit/s
without delay between CAN Frames show data lost by CAN driver. Sampling 
a Linux time stamps
show sometimes about 200usec delay between enter receive CAN interrupt 
and enter the
polling function by napi.
If napi polling is deactivated by follow change no more receive overflow 
error occurs.

Index: at91_can.c
===================================================================
--- at91_can.c    (revision 32447)
+++ at91_can.c    (revision 32448)
@@ -792,6 +792,35 @@
      return 1;
  }

+static int at91_poll_nonapi(struct net_device * dev, int quota)
+{
+    const struct at91_priv *priv = netdev_priv(dev);
+    u32 reg_sr = at91_read(priv, AT91_SR);
+    int work_done = 0;
+
+    if (reg_sr & get_irq_mb_rx(priv))
+        work_done += at91_poll_rx(dev, quota - work_done);
+
+    /*
+     * The error bits are clear on read,
+     * so use saved value from irq handler.
+     */
+    reg_sr |= priv->reg_sr;
+    if (reg_sr & AT91_IRQ_ERR_FRAME)
+        work_done += at91_poll_err(dev, quota - work_done, reg_sr);
+
+    if (work_done < quota) {
+        /* enable IRQs for frame errors and all mailboxes >= rx_next */
+        u32 reg_ier = AT91_IRQ_ERR_FRAME;
+        reg_ier |= get_irq_mb_rx(priv) & ~AT91_MB_MASK(priv->rx_next);
+
+        at91_write(priv, AT91_IER, reg_ier);
+    }
+
+    return work_done;
+}
+
+
  static int at91_poll(struct napi_struct *napi, int quota)
  {
      struct net_device *dev = napi->dev;
@@ -1086,7 +1115,15 @@
          priv->reg_sr = reg_sr;
          at91_write(priv, AT91_IDR,
                 get_irq_mb_rx(priv) | AT91_IRQ_ERR_FRAME);
-        napi_schedule(&priv->napi);
+
+        /*
+        * Call CAN controller polling function without napi.
+        * Sometimes need napi too many time to call
+        * the polling function. In this case Rx overflow
+        * occur at high bus load.
+        */
+        at91_poll_nonapi(dev, 64);
+        /* napi_schedule(&priv->napi); */
      }

      /* Transmission complete interrupt */


Is there a possibility to make using of napi configurable in this driver?

Depend on design sometimes after receive interrupt occurs
there is only time for three CAN frames before overflow error.
Not really a lot of time to use polling, but for other people possibly 
preferable.

Regards,
Efim



^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2017-03-20  7:38 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-03-10 13:48 at91 driver lost CAN messages Efim Monjak
2017-03-11 23:06 ` Oliver Hartkopp
2017-03-13  6:54   ` Alexander Stein
2017-03-13  9:47     ` Marc Kleine-Budde
2017-03-16  8:01       ` Oliver Hartkopp
2017-03-16  8:34         ` Marc Kleine-Budde
2017-03-16  9:06           ` Alexander Stein
2017-03-16  9:09             ` Oliver Hartkopp
2017-03-16  9:58               ` Alexander Stein
2017-03-16 10:18                 ` Marc Kleine-Budde
2017-03-20  7:38                   ` Alexander Stein
2017-03-16  9:07           ` Oliver Hartkopp
2017-03-16  9:24           ` Efim Monjak
2017-03-16  9:32             ` Marc Kleine-Budde
2017-03-16 10:06               ` Efim Monjak
2017-03-16 10:11                 ` Marc Kleine-Budde
2017-03-13  9:47   ` Marc Kleine-Budde
2017-03-13 12:55     ` Efim Monjak
2017-03-13 13:11       ` Marc Kleine-Budde
2017-03-13 15:17         ` Efim Monjak
2017-03-13 14:23           ` Marc Kleine-Budde

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.