linux-can.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Marc Kleine-Budde <mkl@pengutronix.de>
To: Varka Bhadram <varkabhadram@gmail.com>,
	Stefano Babic <sbabic@denx.de>,
	linux-can@vger.kernel.org
Cc: Wolfgang Grandegger <wg@grandegger.com>,
	Oliver Hartkopp <socketcan@hartkopp.net>
Subject: Re: [PATCH v4 3/3] CAN: CAN driver to support multiple CAN bus on SPI interface
Date: Thu, 24 Jul 2014 13:33:48 +0200	[thread overview]
Message-ID: <53D0EF1C.4010909@pengutronix.de> (raw)
In-Reply-To: <53D0ED0C.4080400@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 7519 bytes --]

On 07/24/2014 01:25 PM, Varka Bhadram wrote:
> On 07/24/2014 03:41 PM, Stefano Babic wrote:
> 
> (...)
> 
>> +#include <linux/netdevice.h>
>> +#include <linux/can.h>
>> +#include <linux/can/dev.h>
>> +#include <linux/can/error.h>
>> +#include <linux/interrupt.h>
>> +#include <linux/io.h>
>> +#include <linux/kernel.h>
>> +#include <linux/list.h>
>> +#include <linux/mutex.h>
>> +#include <linux/wait.h>
>> +#include <linux/module.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/kthread.h>
>> +#include <linux/workqueue.h>
>> +#include <linux/can/platform/spi_can.h>
>> +#include <linux/spi/spi.h>
>> +#include <linux/gpio.h>
>> +#include <linux/net_tstamp.h>
>> +#include <linux/of_device.h>
>> +#include <linux/of_gpio.h>
>> +
> 
> It looks good if all headers sorted in alphabetical order..  :-)
> 
>> +#define MAX_CAN_CHANNELS    16
>> +#define CFG_CHANNEL        0xFF
>> +#define DRV_NAME        "spican"
>> +#define DRV_VERSION        "0.10"
>> +
>> +/* SPI constants */
>> +#define SPI_MAX_FRAME_LEN    1472    /* max total length of a SPI
>> frame */
>> +#define BITS_X_WORD        32    /* 4 bytes */
>> +#define SPI_MIN_TRANSFER_LENGTH    32    /* Minimum SPI frame length */
>> +#define CAN_FRAME_MAX_DATA_LEN    8    /* max data lenght in a CAN
>> message */
>> +#define MAX_ITERATIONS        100    /* Used to check if GPIO stucks */
>> +#define SPI_CAN_ECHO_SKB_MAX    4
>> +#define SLAVE_CLK_FREQ        100000000
>> +#define SLAVE_SUPERVISOR_FREQ    ((u32)1000000)
>> +
>> +#define IS_GPIO_ACTIVE(p)    (!!gpio_get_value(p->gpio) ==
>> p->gpio_active)
>> +#define MS_TO_US(ms)        ((ms) * 1000)
>> +
>> +/* more RX buffers are required for delayed processing */
>> +#define    SPI_RX_NBUFS        MAX_CAN_CHANNELS
>> +
>> +/* Provide a way to disable checksum */
>> +static unsigned int chksum_en = 1;
>> +
>> +static unsigned int freq;
>> +module_param(freq, uint, 0);
>> +MODULE_PARM_DESC(freq,
>> +    "SPI clock frequency (default is set by platform device)");
>> +static unsigned int slow_freq;
>> +module_param(slow_freq, uint, 0);
>> +MODULE_PARM_DESC(slow_freq,
>> +    "SPI clock frequency to be used in supervisor mode (default 1
>> Mhz)");
>> +
>> +/* CAN channel status to drop not required frames */
>> +enum {
>> +    CAN_CHANNEL_DISABLED = 0,
>> +    CAN_CHANNEL_ENABLED    = 1,
>> +};
>> +
>> +/* operational mode to set the SPI frequency */
>> +enum {
>> +    SLAVE_SUPERVISOR_MODE    = 0,
>> +    SLAVE_USER_MODE        = 1,
>> +};
>> +
>> +/* Message between Master and Slave
>> + *
>> + * see spi_can_spi.txt for details
>> + *
>> + *    ,'''''''','''''''''''''''','''''''''''''''''''''''','''''''''''''|
>> + *    |MSG ID  |  Length(16 bit)|    DATA                |  CHECKSUM   |
>> + *    L________|________________|________________________|_____________|
>> + */
>> +struct spi_can_frame_header {
>> +    u8    msgid;
>> +    u16    length;
>> +} __packed;
>> +
>> +struct spi_can_frame {
>> +    struct spi_can_frame_header    header;
>> +    u8    data[1];
>> +} __packed;
>> +
>> +/* Message IDs for SPI Frame */
>> +enum msg_type {
>> +    SPI_MSG_STATUS_REQ    = 0x01,
>> +    SPI_MSG_SEND_DATA    = 0x02,
>> +    SPI_MSG_SYNC        = 0x03,
>> +    SPI_MSG_CFG_SET        = 0x04,
>> +    SPI_MSG_REQ_DATA    = 0x05,
>> +    SPI_MSG_CFG_GET        = 0x06
>> +};
>> +
>> +/* CAN data sent inside a
>> + * SPI_MSG_SEND_DATA message
>> + *
>> + *  _____,________________
>> + * |     |                ,''''''''''''''''',''''''''''''|      
>> ,'''''''|
>> + * |ID=2 | LENGTH         | CAN MESSAGE     |CAN MESSAGE |      
>> |CHECKSUM
>> + * |_____L________________|_________________|____________|      
>> L_______|
>> + *                    _.-'                  `--._
>> + *               _,,-'                           ``-.._
>> + *           _.-'                                      `--._
>> + *      _,--'                                               ``-.._
>> + *  ,.-'                                                          `-.._
>> + *  ,'''''',''''''''''''','''''''''''''','''''',''''''|     ,'''''''''|
>> + *  | CH   |TIMESTAMP    |  CAN ID      |DLC   |D[0]  |     |D[dlc-1] |
>> + *  L______L_____________|______________L______|______|     L_________|
>> + */
>> +
>> +struct msg_channel_data {
>> +    u8    channel;
>> +    u32    timestamp;
>> +    u32    can_id;
>> +    u8    dlc;
>> +    u8    data[8];
>> +} __packed;
>> +
>> +/* CFG message */
>> +struct msg_cfg_set_data {
>> +    u8    channel;
>> +    u8    enabled;
>> +    struct can_bittiming bt;
>> +} __packed;
>> +
>> +struct msg_cfg_get_data {
>> +    u8    channel;
>> +    u8    tseg1_min;
>> +    u8    tseg1_max;
>> +    u8    tseg2_min;
>> +    u8    tseg2_max;
>> +    u8    sjw_max;
>> +    u32    brp_min;
>> +    u32    brp_max;
>> +    u32    brp_inc;
>> +    u8    ctrlmode;
>> +    u32    clock_hz;
>> +} __packed;
>> +
>> +/* Status message */
>> +struct msg_status_data {
>> +    u16    length;
>> +} __packed;
>> +
>> +/* The ndo_start_xmit entry point
>> + * insert the CAN messages into a list that
>> + * is then read by the working thread.
>> + */
>> +struct msg_queue_tx {
>> +    struct list_head    list;
>> +    u32            channel;
>> +    u32            enabled;
>> +    struct sk_buff        *skb;
>> +    enum msg_type        type;
>> +};
>> +
>> +struct msg_queue_rx {
>> +    struct list_head    list;
>> +    struct spi_can_frame    *frame;
>> +    u32            len;
>> +    u32            bufindex;
>> +};
>> +
>> +struct spi_rx_data {
>> +    u8 __aligned(4) spi_rx_buf[SPI_MAX_FRAME_LEN];
>> +    u32        msg_in_buf;
>> +    struct mutex    bufmutex;
>> +};
>> +
>> +/* Private data for the SPI device. */
>> +struct spi_can_data {
>> +    struct spi_device    *spi;
>> +    u32            gpio;
>> +    u32            gpio_active;
>> +    u32            num_channels;
>> +    u32            freq;
>> +    u32            slow_freq;
>> +    u32            max_freq;
>> +    u32            slave_op_mode;
>> +    struct net_device    *can_dev[MAX_CAN_CHANNELS + 1];
>> +    spinlock_t        lock;
>> +    struct msg_queue_tx    msgtx;
>> +    struct msg_queue_rx    msgrx;
>> +    struct mutex        lock_wqlist;
>> +    wait_queue_head_t    wait;
>> +    struct workqueue_struct *wq;
>> +    struct work_struct    work;
>> +    /* buffers must be 32-bit aligned  ! */
>> +    u8 __aligned(4)        spi_tx_buf[SPI_MAX_FRAME_LEN];
>> +    struct spi_rx_data    rx_data[SPI_RX_NBUFS];
>> +    struct timeval        ref_time;
>> +};
>> +
>> +/* Private data of the CAN devices */
>> +struct spi_can_priv {
>> +    struct can_priv        can;
>> +    struct net_device    *dev;
>> +    struct spi_can_data    *spi_priv;
>> +    struct can_bittiming_const spi_can_bittiming_const;
>> +    u32            channel;
>> +    u32            devstatus;
>> +    u32            ctrlmode;
>> +};
>> +
> 
> better to move all these into new local header file ...

Nope, as long as these structs are only used in this file, keep it here.

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 242 bytes --]

  reply	other threads:[~2014-07-24 11:33 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-24 10:11 [PATCH v4 0/3] Adding support for CAN busses via SPI interface Stefano Babic
2014-07-24 10:11 ` [PATCH v4 1/3] Add documentation for SPI to CAN driver Stefano Babic
2014-07-24 10:11 ` [PATCH v4 2/3] CAN: moved SPI drivers into a separate directory Stefano Babic
2014-07-24 18:13   ` Oliver Hartkopp
2014-07-24 18:31     ` Stefano Babic
2014-07-24 10:11 ` [PATCH v4 3/3] CAN: CAN driver to support multiple CAN bus on SPI interface Stefano Babic
2014-07-24 11:25   ` Varka Bhadram
2014-07-24 11:33     ` Marc Kleine-Budde [this message]
2014-07-24 14:54     ` Stefano Babic
2014-07-24 15:14       ` Varka Bhadram
2014-07-25  7:57         ` Stefano Babic

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=53D0EF1C.4010909@pengutronix.de \
    --to=mkl@pengutronix.de \
    --cc=linux-can@vger.kernel.org \
    --cc=sbabic@denx.de \
    --cc=socketcan@hartkopp.net \
    --cc=varkabhadram@gmail.com \
    --cc=wg@grandegger.com \
    /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).