linux/drivers/net/can/usb/kvaser_usb/kvaser_usb.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Parts of this driver are based on the following:
   3 *  - Kvaser linux leaf driver (version 4.78)
   4 *  - CAN driver for esd CAN-USB/2
   5 *  - Kvaser linux usbcanII driver (version 5.3)
   6 *  - Kvaser linux mhydra driver (version 5.24)
   7 *
   8 * Copyright (C) 2002-2018 KVASER AB, Sweden. All rights reserved.
   9 * Copyright (C) 2010 Matthias Fuchs <matthias.fuchs@esd.eu>, esd gmbh
  10 * Copyright (C) 2012 Olivier Sobrie <olivier@sobrie.be>
  11 * Copyright (C) 2015 Valeo S.A.
  12 */
  13
  14#ifndef KVASER_USB_H
  15#define KVASER_USB_H
  16
  17/* Kvaser USB CAN dongles are divided into three major platforms:
  18 * - Hydra: Running firmware labeled as 'mhydra'
  19 * - Leaf: Based on Renesas M32C or Freescale i.MX28, running firmware labeled
  20 *         as 'filo'
  21 * - UsbcanII: Based on Renesas M16C, running firmware labeled as 'helios'
  22 */
  23
  24#include <linux/completion.h>
  25#include <linux/spinlock.h>
  26#include <linux/types.h>
  27#include <linux/usb.h>
  28
  29#include <linux/can.h>
  30#include <linux/can/dev.h>
  31
  32#define KVASER_USB_MAX_RX_URBS                  4
  33#define KVASER_USB_MAX_TX_URBS                  128
  34#define KVASER_USB_TIMEOUT                      1000 /* msecs */
  35#define KVASER_USB_RX_BUFFER_SIZE               3072
  36#define KVASER_USB_MAX_NET_DEVICES              5
  37
  38/* USB devices features */
  39#define KVASER_USB_HAS_SILENT_MODE              BIT(0)
  40#define KVASER_USB_HAS_TXRX_ERRORS              BIT(1)
  41
  42/* Device capabilities */
  43#define KVASER_USB_CAP_BERR_CAP                 0x01
  44#define KVASER_USB_CAP_EXT_CAP                  0x02
  45#define KVASER_USB_HYDRA_CAP_EXT_CMD            0x04
  46
  47struct kvaser_usb_dev_cfg;
  48
  49enum kvaser_usb_leaf_family {
  50        KVASER_LEAF,
  51        KVASER_USBCAN,
  52};
  53
  54#define KVASER_USB_HYDRA_MAX_CMD_LEN            128
  55struct kvaser_usb_dev_card_data_hydra {
  56        u8 channel_to_he[KVASER_USB_MAX_NET_DEVICES];
  57        u8 sysdbg_he;
  58        spinlock_t transid_lock; /* lock for transid */
  59        u16 transid;
  60        /* lock for usb_rx_leftover and usb_rx_leftover_len */
  61        spinlock_t usb_rx_leftover_lock;
  62        u8 usb_rx_leftover[KVASER_USB_HYDRA_MAX_CMD_LEN];
  63        u8 usb_rx_leftover_len;
  64};
  65struct kvaser_usb_dev_card_data {
  66        u32 ctrlmode_supported;
  67        u32 capabilities;
  68        union {
  69                struct {
  70                        enum kvaser_usb_leaf_family family;
  71                } leaf;
  72                struct kvaser_usb_dev_card_data_hydra hydra;
  73        };
  74};
  75
  76/* Context for an outstanding, not yet ACKed, transmission */
  77struct kvaser_usb_tx_urb_context {
  78        struct kvaser_usb_net_priv *priv;
  79        u32 echo_index;
  80};
  81
  82struct kvaser_usb {
  83        struct usb_device *udev;
  84        struct usb_interface *intf;
  85        struct kvaser_usb_net_priv *nets[KVASER_USB_MAX_NET_DEVICES];
  86        const struct kvaser_usb_dev_ops *ops;
  87        const struct kvaser_usb_dev_cfg *cfg;
  88
  89        struct usb_endpoint_descriptor *bulk_in, *bulk_out;
  90        struct usb_anchor rx_submitted;
  91
  92        /* @max_tx_urbs: Firmware-reported maximum number of outstanding,
  93         * not yet ACKed, transmissions on this device. This value is
  94         * also used as a sentinel for marking free tx contexts.
  95         */
  96        u32 fw_version;
  97        unsigned int nchannels;
  98        unsigned int max_tx_urbs;
  99        struct kvaser_usb_dev_card_data card_data;
 100
 101        bool rxinitdone;
 102        void *rxbuf[KVASER_USB_MAX_RX_URBS];
 103        dma_addr_t rxbuf_dma[KVASER_USB_MAX_RX_URBS];
 104};
 105
 106struct kvaser_usb_net_priv {
 107        struct can_priv can;
 108        struct can_berr_counter bec;
 109
 110        struct kvaser_usb *dev;
 111        struct net_device *netdev;
 112        int channel;
 113
 114        struct completion start_comp, stop_comp, flush_comp;
 115        struct usb_anchor tx_submitted;
 116
 117        spinlock_t tx_contexts_lock; /* lock for active_tx_contexts */
 118        int active_tx_contexts;
 119        struct kvaser_usb_tx_urb_context tx_contexts[];
 120};
 121
 122/**
 123 * struct kvaser_usb_dev_ops - Device specific functions
 124 * @dev_set_mode:               used for can.do_set_mode
 125 * @dev_set_bittiming:          used for can.do_set_bittiming
 126 * @dev_set_data_bittiming:     used for can.do_set_data_bittiming
 127 * @dev_get_berr_counter:       used for can.do_get_berr_counter
 128 *
 129 * @dev_setup_endpoints:        setup USB in and out endpoints
 130 * @dev_init_card:              initialize card
 131 * @dev_get_software_info:      get software info
 132 * @dev_get_software_details:   get software details
 133 * @dev_get_card_info:          get card info
 134 * @dev_get_capabilities:       discover device capabilities
 135 *
 136 * @dev_set_opt_mode:           set ctrlmod
 137 * @dev_start_chip:             start the CAN controller
 138 * @dev_stop_chip:              stop the CAN controller
 139 * @dev_reset_chip:             reset the CAN controller
 140 * @dev_flush_queue:            flush outstanding CAN messages
 141 * @dev_read_bulk_callback:     handle incoming commands
 142 * @dev_frame_to_cmd:           translate struct can_frame into device command
 143 */
 144struct kvaser_usb_dev_ops {
 145        int (*dev_set_mode)(struct net_device *netdev, enum can_mode mode);
 146        int (*dev_set_bittiming)(struct net_device *netdev);
 147        int (*dev_set_data_bittiming)(struct net_device *netdev);
 148        int (*dev_get_berr_counter)(const struct net_device *netdev,
 149                                    struct can_berr_counter *bec);
 150        int (*dev_setup_endpoints)(struct kvaser_usb *dev);
 151        int (*dev_init_card)(struct kvaser_usb *dev);
 152        int (*dev_get_software_info)(struct kvaser_usb *dev);
 153        int (*dev_get_software_details)(struct kvaser_usb *dev);
 154        int (*dev_get_card_info)(struct kvaser_usb *dev);
 155        int (*dev_get_capabilities)(struct kvaser_usb *dev);
 156        int (*dev_set_opt_mode)(const struct kvaser_usb_net_priv *priv);
 157        int (*dev_start_chip)(struct kvaser_usb_net_priv *priv);
 158        int (*dev_stop_chip)(struct kvaser_usb_net_priv *priv);
 159        int (*dev_reset_chip)(struct kvaser_usb *dev, int channel);
 160        int (*dev_flush_queue)(struct kvaser_usb_net_priv *priv);
 161        void (*dev_read_bulk_callback)(struct kvaser_usb *dev, void *buf,
 162                                       int len);
 163        void *(*dev_frame_to_cmd)(const struct kvaser_usb_net_priv *priv,
 164                                  const struct sk_buff *skb, int *cmd_len,
 165                                  u16 transid);
 166};
 167
 168struct kvaser_usb_dev_cfg {
 169        const struct can_clock clock;
 170        const unsigned int timestamp_freq;
 171        const struct can_bittiming_const * const bittiming_const;
 172        const struct can_bittiming_const * const data_bittiming_const;
 173};
 174
 175extern const struct kvaser_usb_dev_ops kvaser_usb_hydra_dev_ops;
 176extern const struct kvaser_usb_dev_ops kvaser_usb_leaf_dev_ops;
 177
 178int kvaser_usb_recv_cmd(const struct kvaser_usb *dev, void *cmd, int len,
 179                        int *actual_len);
 180
 181int kvaser_usb_send_cmd(const struct kvaser_usb *dev, void *cmd, int len);
 182
 183int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv *priv, void *cmd,
 184                              int len);
 185
 186int kvaser_usb_can_rx_over_error(struct net_device *netdev);
 187#endif /* KVASER_USB_H */
 188