cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

kvaser_usb.h (6362B)


      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/* Kvaser USB device quirks */
     39#define KVASER_USB_QUIRK_HAS_SILENT_MODE	BIT(0)
     40#define KVASER_USB_QUIRK_HAS_TXRX_ERRORS	BIT(1)
     41#define KVASER_USB_QUIRK_IGNORE_CLK_FREQ	BIT(2)
     42
     43/* Device capabilities */
     44#define KVASER_USB_CAP_BERR_CAP			0x01
     45#define KVASER_USB_CAP_EXT_CAP			0x02
     46#define KVASER_USB_HYDRA_CAP_EXT_CMD		0x04
     47
     48struct kvaser_usb_dev_cfg;
     49
     50enum kvaser_usb_leaf_family {
     51	KVASER_LEAF,
     52	KVASER_USBCAN,
     53};
     54
     55#define KVASER_USB_HYDRA_MAX_CMD_LEN		128
     56struct kvaser_usb_dev_card_data_hydra {
     57	u8 channel_to_he[KVASER_USB_MAX_NET_DEVICES];
     58	u8 sysdbg_he;
     59	spinlock_t transid_lock; /* lock for transid */
     60	u16 transid;
     61	/* lock for usb_rx_leftover and usb_rx_leftover_len */
     62	spinlock_t usb_rx_leftover_lock;
     63	u8 usb_rx_leftover[KVASER_USB_HYDRA_MAX_CMD_LEN];
     64	u8 usb_rx_leftover_len;
     65};
     66struct kvaser_usb_dev_card_data {
     67	u32 ctrlmode_supported;
     68	u32 capabilities;
     69	struct kvaser_usb_dev_card_data_hydra hydra;
     70};
     71
     72/* Context for an outstanding, not yet ACKed, transmission */
     73struct kvaser_usb_tx_urb_context {
     74	struct kvaser_usb_net_priv *priv;
     75	u32 echo_index;
     76};
     77
     78struct kvaser_usb {
     79	struct usb_device *udev;
     80	struct usb_interface *intf;
     81	struct kvaser_usb_net_priv *nets[KVASER_USB_MAX_NET_DEVICES];
     82	const struct kvaser_usb_driver_info *driver_info;
     83	const struct kvaser_usb_dev_cfg *cfg;
     84
     85	struct usb_endpoint_descriptor *bulk_in, *bulk_out;
     86	struct usb_anchor rx_submitted;
     87
     88	/* @max_tx_urbs: Firmware-reported maximum number of outstanding,
     89	 * not yet ACKed, transmissions on this device. This value is
     90	 * also used as a sentinel for marking free tx contexts.
     91	 */
     92	u32 fw_version;
     93	unsigned int nchannels;
     94	unsigned int max_tx_urbs;
     95	struct kvaser_usb_dev_card_data card_data;
     96
     97	bool rxinitdone;
     98	void *rxbuf[KVASER_USB_MAX_RX_URBS];
     99	dma_addr_t rxbuf_dma[KVASER_USB_MAX_RX_URBS];
    100};
    101
    102struct kvaser_usb_net_priv {
    103	struct can_priv can;
    104	struct can_berr_counter bec;
    105
    106	struct kvaser_usb *dev;
    107	struct net_device *netdev;
    108	int channel;
    109
    110	struct completion start_comp, stop_comp, flush_comp;
    111	struct usb_anchor tx_submitted;
    112
    113	spinlock_t tx_contexts_lock; /* lock for active_tx_contexts */
    114	int active_tx_contexts;
    115	struct kvaser_usb_tx_urb_context tx_contexts[];
    116};
    117
    118/**
    119 * struct kvaser_usb_dev_ops - Device specific functions
    120 * @dev_set_mode:		used for can.do_set_mode
    121 * @dev_set_bittiming:		used for can.do_set_bittiming
    122 * @dev_set_data_bittiming:	used for can.do_set_data_bittiming
    123 * @dev_get_berr_counter:	used for can.do_get_berr_counter
    124 *
    125 * @dev_setup_endpoints:	setup USB in and out endpoints
    126 * @dev_init_card:		initialize card
    127 * @dev_get_software_info:	get software info
    128 * @dev_get_software_details:	get software details
    129 * @dev_get_card_info:		get card info
    130 * @dev_get_capabilities:	discover device capabilities
    131 *
    132 * @dev_set_opt_mode:		set ctrlmod
    133 * @dev_start_chip:		start the CAN controller
    134 * @dev_stop_chip:		stop the CAN controller
    135 * @dev_reset_chip:		reset the CAN controller
    136 * @dev_flush_queue:		flush outstanding CAN messages
    137 * @dev_read_bulk_callback:	handle incoming commands
    138 * @dev_frame_to_cmd:		translate struct can_frame into device command
    139 */
    140struct kvaser_usb_dev_ops {
    141	int (*dev_set_mode)(struct net_device *netdev, enum can_mode mode);
    142	int (*dev_set_bittiming)(struct net_device *netdev);
    143	int (*dev_set_data_bittiming)(struct net_device *netdev);
    144	int (*dev_get_berr_counter)(const struct net_device *netdev,
    145				    struct can_berr_counter *bec);
    146	int (*dev_setup_endpoints)(struct kvaser_usb *dev);
    147	int (*dev_init_card)(struct kvaser_usb *dev);
    148	int (*dev_get_software_info)(struct kvaser_usb *dev);
    149	int (*dev_get_software_details)(struct kvaser_usb *dev);
    150	int (*dev_get_card_info)(struct kvaser_usb *dev);
    151	int (*dev_get_capabilities)(struct kvaser_usb *dev);
    152	int (*dev_set_opt_mode)(const struct kvaser_usb_net_priv *priv);
    153	int (*dev_start_chip)(struct kvaser_usb_net_priv *priv);
    154	int (*dev_stop_chip)(struct kvaser_usb_net_priv *priv);
    155	int (*dev_reset_chip)(struct kvaser_usb *dev, int channel);
    156	int (*dev_flush_queue)(struct kvaser_usb_net_priv *priv);
    157	void (*dev_read_bulk_callback)(struct kvaser_usb *dev, void *buf,
    158				       int len);
    159	void *(*dev_frame_to_cmd)(const struct kvaser_usb_net_priv *priv,
    160				  const struct sk_buff *skb, int *cmd_len,
    161				  u16 transid);
    162};
    163
    164struct kvaser_usb_driver_info {
    165	u32 quirks;
    166	enum kvaser_usb_leaf_family family;
    167	const struct kvaser_usb_dev_ops *ops;
    168};
    169
    170struct kvaser_usb_dev_cfg {
    171	const struct can_clock clock;
    172	const unsigned int timestamp_freq;
    173	const struct can_bittiming_const * const bittiming_const;
    174	const struct can_bittiming_const * const data_bittiming_const;
    175};
    176
    177extern const struct kvaser_usb_dev_ops kvaser_usb_hydra_dev_ops;
    178extern const struct kvaser_usb_dev_ops kvaser_usb_leaf_dev_ops;
    179
    180int kvaser_usb_recv_cmd(const struct kvaser_usb *dev, void *cmd, int len,
    181			int *actual_len);
    182
    183int kvaser_usb_send_cmd(const struct kvaser_usb *dev, void *cmd, int len);
    184
    185int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv *priv, void *cmd,
    186			      int len);
    187
    188int kvaser_usb_can_rx_over_error(struct net_device *netdev);
    189
    190extern const struct can_bittiming_const kvaser_usb_flexc_bittiming_const;
    191
    192#endif /* KVASER_USB_H */