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)
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.
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
21 * - UsbcanII: Based on Renesas M16C, running firmware labeled as 'helios'
24 #include <linux/completion.h>
25 #include <linux/spinlock.h>
26 #include <linux/types.h>
27 #include <linux/usb.h>
29 #include <linux/can.h>
30 #include <linux/can/dev.h>
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
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)
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
48 struct kvaser_usb_dev_cfg;
50 enum kvaser_usb_leaf_family {
55 #define KVASER_USB_HYDRA_MAX_CMD_LEN 128
56 struct kvaser_usb_dev_card_data_hydra {
57 u8 channel_to_he[KVASER_USB_MAX_NET_DEVICES];
59 spinlock_t transid_lock; /* lock for 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;
66 struct kvaser_usb_dev_card_data {
67 u32 ctrlmode_supported;
69 struct kvaser_usb_dev_card_data_hydra hydra;
72 /* Context for an outstanding, not yet ACKed, transmission */
73 struct kvaser_usb_tx_urb_context {
74 struct kvaser_usb_net_priv *priv;
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;
85 struct usb_endpoint_descriptor *bulk_in, *bulk_out;
86 struct usb_anchor rx_submitted;
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.
93 unsigned int nchannels;
94 unsigned int max_tx_urbs;
95 struct kvaser_usb_dev_card_data card_data;
98 void *rxbuf[KVASER_USB_MAX_RX_URBS];
99 dma_addr_t rxbuf_dma[KVASER_USB_MAX_RX_URBS];
102 struct kvaser_usb_net_priv {
104 struct can_berr_counter bec;
106 struct kvaser_usb *dev;
107 struct net_device *netdev;
110 struct completion start_comp, stop_comp, flush_comp;
111 struct usb_anchor tx_submitted;
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[];
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
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
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
140 struct 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,
159 void *(*dev_frame_to_cmd)(const struct kvaser_usb_net_priv *priv,
160 const struct sk_buff *skb, int *cmd_len,
164 struct kvaser_usb_driver_info {
166 enum kvaser_usb_leaf_family family;
167 const struct kvaser_usb_dev_ops *ops;
170 struct 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;
177 extern const struct kvaser_usb_dev_ops kvaser_usb_hydra_dev_ops;
178 extern const struct kvaser_usb_dev_ops kvaser_usb_leaf_dev_ops;
180 int kvaser_usb_recv_cmd(const struct kvaser_usb *dev, void *cmd, int len,
183 int kvaser_usb_send_cmd(const struct kvaser_usb *dev, void *cmd, int len);
185 int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv *priv, void *cmd,
188 int kvaser_usb_can_rx_over_error(struct net_device *netdev);
190 extern const struct can_bittiming_const kvaser_usb_flexc_bittiming_const;
192 #endif /* KVASER_USB_H */