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