This patch fixes sending erroneous frames when loopback is disabled.
Also stats->txBytes is now only increased in TX-done interrupt and not earlier.

        Thomas


Signed-off-by: thomas.koerper <[email protected]>
---
Index: kernel/2.6/drivers/net/can/esd_pci331.c
===================================================================
--- kernel/2.6/drivers/net/can/esd_pci331.c     (revision 1103)
+++ kernel/2.6/drivers/net/can/esd_pci331.c     (working copy)
@@ -318,32 +318,6 @@
        return err;
  }

-static int esd331_send(struct esd331_pci *board, u8 pci331net, unsigned long 
id,
-                       int eff, int rtr, u16 dlc, u8 *data)
-{
-       struct esd331_can_msg msg;
-       int i;
-
-       memset(&msg, 0, sizeof(msg));
-
-       if (eff) {
-               msg.cmmd = ESD331_I20_EX_BCAN;
-               msg.id = cpu_to_be16((id >> 16) & 0x1fff);
-               msg.x2 = cpu_to_be16(id);
-       } else {
-               msg.cmmd = ESD331_I20_BCAN;
-               msg.id = cpu_to_be16(id);
-       }
-       msg.net = pci331net;
-       msg.len = cpu_to_be16(rtr ? dlc | ESD331_RTR_FLAG : dlc);
-
-       i = (dlc < 8) ? dlc : 8;
-       while (i--)
-               msg.data[i] = data[i];
-
-       return esd331_write(&msg, board);
-}
-
  static int esd331_write_allid(u8 net, struct esd331_pci *board)
  {
        struct esd331_can_msg mesg;
@@ -583,6 +557,7 @@
                case ESD331_I20_TXDONE:
                case ESD331_I20_EX_TXDONE:
                        stats->tx_packets++;
+                       stats->tx_bytes += msg.x1;
                        can_get_echo_skb(dev, 0);
                        netif_wake_queue(dev);
                        break;
@@ -693,24 +668,36 @@
        struct net_device_stats *stats = &dev->stats;
  #endif
        struct can_frame *cf = (struct can_frame *)skb->data;
-       int err;
+       struct esd331_can_msg msg;
+       int err = NETDEV_TX_OK;
+       int i;

-       can_put_echo_skb(skb, dev, 0);
-
        if ((cf->can_id & CAN_EFF_FLAG) && (priv->board->eff_supp == 0)) {
                stats->tx_errors++;
                stats->tx_dropped++;
-               can_free_echo_skb(dev, 0);
-               err = -EOPNOTSUPP;
                goto out;
        }

-       err = esd331_send(priv->board, priv->boards_net,
-                               cf->can_id & CAN_EFF_MASK,
-                               cf->can_id & CAN_EFF_FLAG,
-                               cf->can_id & CAN_RTR_FLAG,
-                               cf->can_dlc, cf->data);
-       if (err) {
+       memset(&msg, 0, sizeof(msg));
+       if (cf->can_id & CAN_EFF_FLAG) {
+               msg.cmmd = ESD331_I20_EX_BCAN;
+               msg.id = cpu_to_be16((cf->can_id & CAN_EFF_MASK) >> 16);
+               msg.x2 = cpu_to_be16(cf->can_id & CAN_EFF_MASK);
+       } else {
+               msg.cmmd = ESD331_I20_BCAN;
+               msg.id = cpu_to_be16(cf->can_id & CAN_EFF_MASK);
+       }
+       msg.x1 = cpu_to_be16(cf->can_dlc);
+       msg.net = priv->boards_net;
+       msg.len = cpu_to_be16((cf->can_id & CAN_RTR_FLAG) ?
+                               cf->can_dlc | ESD331_RTR_FLAG : cf->can_dlc);
+
+       for (i = 0; i < cf->can_dlc; i++)
+               msg.data[i] = cf->data[i];
+
+       can_put_echo_skb(skb, dev, 0);
+       if (esd331_write(&msg, priv->board)) {
+               err = NETDEV_TX_BUSY;
                stats->tx_fifo_errors++;
                stats->tx_errors++;
                stats->tx_dropped++;
@@ -719,8 +706,8 @@
        }

        netif_stop_queue(dev);
-       stats->tx_bytes += cf->can_dlc;
        dev->trans_start = jiffies;
+
  out:
        return err;
  }
_______________________________________________
Socketcan-core mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/socketcan-core

Reply via email to