linux-can.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Wolfgang Grandegger <wg@grandegger.com>
To: Bernd Krumboeck <b.krumboeck@gmail.com>
Cc: linux-can@vger.kernel.org, linux-usb@vger.kernel.org,
	info@gerhard-bertelsmann.de, gediminas@8devices.com,
	Bernd Krumboeck <krumboeck@universalnet.at>
Subject: Re: [PATCH v7] usb_8dev: Add support for USB2CAN interface from 8 devices
Date: Fri, 14 Dec 2012 13:53:51 +0100	[thread overview]
Message-ID: <50CB215F.9080903@grandegger.com> (raw)
In-Reply-To: <1355424053-608-1-git-send-email-krumboeck@universalnet.at>

On 12/13/2012 07:40 PM, Bernd Krumboeck wrote:
> Add device driver for USB2CAN interface from "8 devices" (http://www.8devices.com).
> 
> changes since v6:
> * changed some variable types to big endian equivalent
> * small cleanups
> 
> changes since v5:
> * unlock mutex on error
> 
> changes since v4:
> * removed FSF address
> * renamed struct usb_8dev
> * removed unused variable free_slots
> * replaced some _to_cpu functions with pointer equivalent
> * fix return value for usb_8dev_set_mode
> * handle can errors with separate function
> * fix overrun error handling
> * rewrite error handling for usb_8dev_start_xmit
> * fix urb submit in usb_8dev_start
> * various small fixes
> 
> Signed-off-by: Bernd Krumboeck <krumboeck@universalnet.at>
> ---
>  drivers/net/can/usb/Kconfig    |    6 +
>  drivers/net/can/usb/Makefile   |    1 +
>  drivers/net/can/usb/usb_8dev.c | 1094 ++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 1101 insertions(+)
>  create mode 100644 drivers/net/can/usb/usb_8dev.c
> 
> diff --git a/drivers/net/can/usb/Kconfig b/drivers/net/can/usb/Kconfig
> index a4e4bee..2162233 100644
> --- a/drivers/net/can/usb/Kconfig
> +++ b/drivers/net/can/usb/Kconfig
> @@ -48,4 +48,10 @@ config CAN_PEAK_USB
>  	  This driver supports the PCAN-USB and PCAN-USB Pro adapters
>  	  from PEAK-System Technik (http://www.peak-system.com).
>  
> +config CAN_8DEV_USB
> +	tristate "8 devices USB2CAN interface"
> +	---help---
> +	  This driver supports the USB2CAN interface
> +	  from 8 devices (http://www.8devices.com).
> +
>  endmenu
> diff --git a/drivers/net/can/usb/Makefile b/drivers/net/can/usb/Makefile
> index 80a2ee4..becef46 100644
> --- a/drivers/net/can/usb/Makefile
> +++ b/drivers/net/can/usb/Makefile
> @@ -6,5 +6,6 @@ obj-$(CONFIG_CAN_EMS_USB) += ems_usb.o
>  obj-$(CONFIG_CAN_ESD_USB2) += esd_usb2.o
>  obj-$(CONFIG_CAN_KVASER_USB) += kvaser_usb.o
>  obj-$(CONFIG_CAN_PEAK_USB) += peak_usb/
> +obj-$(CONFIG_CAN_8DEV_USB) += usb_8dev.o
>  
>  ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG
> diff --git a/drivers/net/can/usb/usb_8dev.c b/drivers/net/can/usb/usb_8dev.c
> new file mode 100644
> index 0000000..d9c681b
> --- /dev/null
> +++ b/drivers/net/can/usb/usb_8dev.c
...
> +/* Read error/status frames */
> +static void usb_8dev_rx_err_msg(struct usb_8dev_priv *priv,
> +				struct usb_8dev_rx_msg *msg)
> +{
> +	struct can_frame *cf;
> +	struct sk_buff *skb;
> +	struct net_device_stats *stats = &priv->netdev->stats;
> +
> +	/*
> +	 * Error message:
> +	 * byte 0: Status
> +	 * byte 1: bit   7: Receive Passive
> +	 * byte 1: bit 0-6: Receive Error Counter
> +	 * byte 2: Transmit Error Counter
> +	 * byte 3: Always 0 (maybe reserved for future use)
> +	 */
> +
> +	u8 state = msg->data[0];
> +	u8 rxerr = msg->data[1] & USB_8DEV_RP_MASK;
> +	u8 txerr = msg->data[2];
> +	int rx_errors = 0;
> +	int tx_errors = 0;
> +
> +	skb = alloc_can_err_skb(priv->netdev, &cf);
> +	if (!skb)
> +		return;
> +
> +	switch (state) {
> +	case USB_8DEV_STATUSMSG_OK:
> +		priv->can.state = CAN_STATE_ERROR_ACTIVE;
> +		cf->can_id |= CAN_ERR_PROT;
> +		cf->data[2] = CAN_ERR_PROT_ACTIVE;
> +		break;
> +	case USB_8DEV_STATUSMSG_BUSOFF:
> +		priv->can.state = CAN_STATE_BUS_OFF;
> +		cf->can_id |= CAN_ERR_BUSOFF;
> +		can_bus_off(priv->netdev);
> +		break;
> +	case USB_8DEV_STATUSMSG_OVERRUN:
> +	case USB_8DEV_STATUSMSG_BUSLIGHT:
> +	case USB_8DEV_STATUSMSG_BUSHEAVY:
> +		cf->can_id |= CAN_ERR_CRTL;
> +		break;
> +	default:
> +		priv->can.state = CAN_STATE_ERROR_WARNING;
> +		cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
> +		priv->can.can_stats.bus_error++;
> +		break;
> +	}
> +
> +	switch (state) {
> +	case USB_8DEV_STATUSMSG_ACK:
> +		cf->can_id |= CAN_ERR_ACK;
> +		tx_errors = 1;
> +		break;
> +	case USB_8DEV_STATUSMSG_CRC:
> +		cf->data[2] |= CAN_ERR_PROT_BIT;

For the time being please use here:

		cf->data[2] |= CAN_ERR_PROT_UNSPEC;
		cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ |
                               CAN_ERR_PROT_LOC_CRC_DEL;


That's a weak point. A "CAN_ERR_PROT_CRC" is missing. Unfortunately, all
bits in data[3] are already used. Anyway, I'm going to look for a
consistent solution ASAP.

> +		rx_errors = 1;
> +		break;
> +	case USB_8DEV_STATUSMSG_BIT0:
> +		cf->data[2] |= CAN_ERR_PROT_BIT0;
> +		tx_errors = 1;
> +		break;
> +	case USB_8DEV_STATUSMSG_BIT1:
> +		cf->data[2] |= CAN_ERR_PROT_BIT1;
> +		tx_errors = 1;
> +		break;
> +	case USB_8DEV_STATUSMSG_FORM:
> +		cf->data[2] |= CAN_ERR_PROT_FORM;
> +		rx_errors = 1;
> +		break;
> +	case USB_8DEV_STATUSMSG_STUFF:
> +		cf->data[2] |= CAN_ERR_PROT_STUFF;
> +		rx_errors = 1;
> +		break;
> +	case USB_8DEV_STATUSMSG_OVERRUN:
> +		cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
> +		stats->rx_over_errors++;
> +		rx_errors = 1;
> +		break;
> +	case USB_8DEV_STATUSMSG_BUSLIGHT:
> +		priv->can.state = CAN_STATE_ERROR_WARNING;
> +		cf->data[1] = (txerr > rxerr) ?
> +			CAN_ERR_CRTL_TX_WARNING :
> +			CAN_ERR_CRTL_RX_WARNING;
> +		priv->can.can_stats.error_warning++;
> +		break;
> +	case USB_8DEV_STATUSMSG_BUSHEAVY:
> +		priv->can.state = CAN_STATE_ERROR_WARNING;

s/WARNING/PASSIVE/ ?

You can add my "Acked-by: Wolfgang Grandegger <wg@grandegger.com>" after
fixing these issues.

Thanks,

Wolfgang.


      parent reply	other threads:[~2012-12-14 12:53 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-13 18:40 [PATCH v7] usb_8dev: Add support for USB2CAN interface from 8 devices Bernd Krumboeck
2012-12-14 11:59 ` Marc Kleine-Budde
2012-12-14 18:22   ` "Bernd Krumböck"
2012-12-14 18:30     ` Marc Kleine-Budde
2012-12-14 12:53 ` Wolfgang Grandegger [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50CB215F.9080903@grandegger.com \
    --to=wg@grandegger.com \
    --cc=b.krumboeck@gmail.com \
    --cc=gediminas@8devices.com \
    --cc=info@gerhard-bertelsmann.de \
    --cc=krumboeck@universalnet.at \
    --cc=linux-can@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).