Thomas Körper wrote:
> 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;

As "err" does not hold an error code, "ret" seems more appropriate.
Maybe you do not even need that variable.

> +     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 @@
>       }

You dropped the packet and you should therefore call can_free_echo_skb()
and return with NETDEV_TX_OK. Can esd331_write() fail? Will it succeed
the next time it is called? The NETDEV_TX_BUSY might be more appropriate.

Wolfgang.
_______________________________________________
Socketcan-core mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/socketcan-core

Reply via email to