File Index
Files and directories
Sign in
FILE

kvaser_usb.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/can/usb/kvaser_usb/kvaser_usb.h C
  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/ktime.h>
 26#include <linux/math64.h>
 27#include <linux/spinlock.h>
 28#include <linux/types.h>
 29#include <linux/usb.h>
 30#include <net/devlink.h>
 31
 32#include <linux/can.h>
 33#include <linux/can/dev.h>
 34
 35#define KVASER_USB_MAX_RX_URBS			4
 36#define KVASER_USB_MAX_TX_URBS			128
 37#define KVASER_USB_TIMEOUT			1000 /* msecs */
 38#define KVASER_USB_RX_BUFFER_SIZE		3072
 39#define KVASER_USB_MAX_NET_DEVICES		5
 40
 41/* Kvaser USB device quirks */
 42#define KVASER_USB_QUIRK_HAS_SILENT_MODE	BIT(0)
 43#define KVASER_USB_QUIRK_HAS_TXRX_ERRORS	BIT(1)
 44#define KVASER_USB_QUIRK_IGNORE_CLK_FREQ	BIT(2)
 45
 46/* Device capabilities */
 47#define KVASER_USB_CAP_BERR_CAP			0x01
 48#define KVASER_USB_CAP_EXT_CAP			0x02
 49#define KVASER_USB_HYDRA_CAP_EXT_CMD		0x04
 50
 51#define KVASER_USB_SW_VERSION_MAJOR_MASK GENMASK(31, 24)
 52#define KVASER_USB_SW_VERSION_MINOR_MASK GENMASK(23, 16)
 53#define KVASER_USB_SW_VERSION_BUILD_MASK GENMASK(15, 0)
 54
 55struct kvaser_usb_dev_cfg;
 56
 57enum kvaser_usb_leaf_family {
 58	KVASER_LEAF,
 59	KVASER_USBCAN,
 60};
 61
 62enum kvaser_usb_led_state {
 63	KVASER_USB_LED_ON = 0,
 64	KVASER_USB_LED_OFF = 1,
 65};
 66
 67#define KVASER_USB_HYDRA_MAX_CMD_LEN		128
 68struct kvaser_usb_dev_card_data_hydra {
 69	u8 channel_to_he[KVASER_USB_MAX_NET_DEVICES];
 70	u8 sysdbg_he;
 71	spinlock_t transid_lock; /* lock for transid */
 72	u16 transid;
 73	/* lock for usb_rx_leftover and usb_rx_leftover_len */
 74	spinlock_t usb_rx_leftover_lock;
 75	u8 usb_rx_leftover[KVASER_USB_HYDRA_MAX_CMD_LEN];
 76	u8 usb_rx_leftover_len;
 77};
 78struct kvaser_usb_dev_card_data {
 79	u32 ctrlmode_supported;
 80	u32 capabilities;
 81	struct kvaser_usb_dev_card_data_hydra hydra;
 82	u32 usbcan_timestamp_msb;
 83};
 84
 85/* Context for an outstanding, not yet ACKed, transmission */
 86struct kvaser_usb_tx_urb_context {
 87	struct kvaser_usb_net_priv *priv;
 88	u32 echo_index;
 89};
 90
 91struct kvaser_usb_fw_version {
 92	u8 major;
 93	u8 minor;
 94	u16 build;
 95};
 96
 97struct kvaser_usb_busparams {
 98	__le32 bitrate;
 99	u8 tseg1;
100	u8 tseg2;
101	u8 sjw;
102	u8 nsamples;
103} __packed;
104
105struct kvaser_usb {
106	struct usb_device *udev;
107	struct usb_interface *intf;
108	struct kvaser_usb_net_priv *nets[KVASER_USB_MAX_NET_DEVICES];
109	const struct kvaser_usb_driver_info *driver_info;
110	const struct kvaser_usb_dev_cfg *cfg;
111
112	struct usb_endpoint_descriptor *bulk_in, *bulk_out;
113	struct usb_anchor rx_submitted;
114
115	u32 ean[2];
116	u32 serial_number;
117	struct kvaser_usb_fw_version fw_version;
118	u8 hw_revision;
119	unsigned int nchannels;
120	/* @max_tx_urbs: Firmware-reported maximum number of outstanding,
121	 * not yet ACKed, transmissions on this device. This value is
122	 * also used as a sentinel for marking free tx contexts.
123	 */
124	unsigned int max_tx_urbs;
125	struct kvaser_usb_dev_card_data card_data;
126
127	bool rxinitdone;
128	void *rxbuf[KVASER_USB_MAX_RX_URBS];
129	dma_addr_t rxbuf_dma[KVASER_USB_MAX_RX_URBS];
130};
131
132struct kvaser_usb_net_priv {
133	struct can_priv can;
134	struct devlink_port devlink_port;
135	struct can_berr_counter bec;
136
137	/* subdriver-specific data */
138	void *sub_priv;
139
140	struct kvaser_usb *dev;
141	struct net_device *netdev;
142	int channel;
143
144	struct completion start_comp, stop_comp, flush_comp,
145			  get_busparams_comp;
146	struct usb_anchor tx_submitted;
147
148	struct kvaser_usb_busparams busparams_nominal, busparams_data;
149
150	spinlock_t tx_contexts_lock; /* lock for active_tx_contexts */
151	int active_tx_contexts;
152	struct kvaser_usb_tx_urb_context tx_contexts[];
153};
154
155/**
156 * struct kvaser_usb_dev_ops - Device specific functions
157 * @dev_set_mode:		used for can.do_set_mode
158 * @dev_set_bittiming:		used for can.do_set_bittiming
159 * @dev_get_busparams:		readback arbitration busparams
160 * @dev_set_data_bittiming:	used for can.fd.do_set_data_bittiming
161 * @dev_get_data_busparams:	readback data busparams
162 * @dev_get_berr_counter:	used for can.do_get_berr_counter
163 *
164 * @dev_setup_endpoints:	setup USB in and out endpoints
165 * @dev_init_card:		initialize card
166 * @dev_init_channel:		initialize channel
167 * @dev_remove_channel:		uninitialize channel
168 * @dev_get_software_info:	get software info
169 * @dev_get_software_details:	get software details
170 * @dev_get_card_info:		get card info
171 * @dev_get_capabilities:	discover device capabilities
172 * @dev_set_led:		turn on/off device LED
173 *
174 * @dev_set_opt_mode:		set ctrlmod
175 * @dev_start_chip:		start the CAN controller
176 * @dev_stop_chip:		stop the CAN controller
177 * @dev_reset_chip:		reset the CAN controller
178 * @dev_flush_queue:		flush outstanding CAN messages
179 * @dev_read_bulk_callback:	handle incoming commands
180 * @dev_frame_to_cmd:		translate struct can_frame into device command
181 */
182struct kvaser_usb_dev_ops {
183	int (*dev_set_mode)(struct net_device *netdev, enum can_mode mode);
184	int (*dev_set_bittiming)(const struct net_device *netdev,
185				 const struct kvaser_usb_busparams *busparams);
186	int (*dev_get_busparams)(struct kvaser_usb_net_priv *priv);
187	int (*dev_set_data_bittiming)(const struct net_device *netdev,
188				      const struct kvaser_usb_busparams *busparams);
189	int (*dev_get_data_busparams)(struct kvaser_usb_net_priv *priv);
190	int (*dev_get_berr_counter)(const struct net_device *netdev,
191				    struct can_berr_counter *bec);
192	int (*dev_setup_endpoints)(struct kvaser_usb *dev);
193	int (*dev_init_card)(struct kvaser_usb *dev);
194	int (*dev_init_channel)(struct kvaser_usb_net_priv *priv);
195	void (*dev_remove_channel)(struct kvaser_usb_net_priv *priv);
196	int (*dev_get_software_info)(struct kvaser_usb *dev);
197	int (*dev_get_software_details)(struct kvaser_usb *dev);
198	int (*dev_get_card_info)(struct kvaser_usb *dev);
199	int (*dev_get_capabilities)(struct kvaser_usb *dev);
200	int (*dev_set_led)(struct kvaser_usb_net_priv *priv,
201			   enum kvaser_usb_led_state state,
202			   u16 duration_ms);
203	int (*dev_set_opt_mode)(const struct kvaser_usb_net_priv *priv);
204	int (*dev_start_chip)(struct kvaser_usb_net_priv *priv);
205	int (*dev_stop_chip)(struct kvaser_usb_net_priv *priv);
206	int (*dev_reset_chip)(struct kvaser_usb *dev, int channel);
207	int (*dev_flush_queue)(struct kvaser_usb_net_priv *priv);
208	void (*dev_read_bulk_callback)(struct kvaser_usb *dev, void *buf,
209				       int len);
210	void *(*dev_frame_to_cmd)(const struct kvaser_usb_net_priv *priv,
211				  const struct sk_buff *skb, int *cmd_len,
212				  u16 transid);
213};
214
215struct kvaser_usb_driver_info {
216	u32 quirks;
217	enum kvaser_usb_leaf_family family;
218	const struct kvaser_usb_dev_ops *ops;
219};
220
221struct kvaser_usb_dev_cfg {
222	const struct can_clock clock;
223	const unsigned int timestamp_freq;
224	const struct can_bittiming_const * const bittiming_const;
225	const struct can_bittiming_const * const data_bittiming_const;
226};
227
228extern const struct kvaser_usb_dev_ops kvaser_usb_hydra_dev_ops;
229extern const struct kvaser_usb_dev_ops kvaser_usb_leaf_dev_ops;
230
231extern const struct devlink_ops kvaser_usb_devlink_ops;
232
233int kvaser_usb_devlink_port_register(struct kvaser_usb_net_priv *priv);
234void kvaser_usb_devlink_port_unregister(struct kvaser_usb_net_priv *priv);
235
236void kvaser_usb_unlink_tx_urbs(struct kvaser_usb_net_priv *priv);
237
238int kvaser_usb_recv_cmd(const struct kvaser_usb *dev, void *cmd, int len,
239			int *actual_len);
240
241int kvaser_usb_send_cmd(const struct kvaser_usb *dev, void *cmd, int len);
242
243int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv *priv, void *cmd,
244			      int len);
245
246int kvaser_usb_can_rx_over_error(struct net_device *netdev);
247
248extern const struct can_bittiming_const kvaser_usb_flexc_bittiming_const;
249
250static inline ktime_t kvaser_usb_ticks_to_ktime(const struct kvaser_usb_dev_cfg *cfg,
251						u64 ticks)
252{
253	return ns_to_ktime(div_u64(ticks * 1000, cfg->timestamp_freq));
254}
255
256static inline ktime_t kvaser_usb_timestamp48_to_ktime(const struct kvaser_usb_dev_cfg *cfg,
257						      const __le16 *timestamp)
258{
259	u64 ticks = le16_to_cpu(timestamp[0]) |
260		    (u64)(le16_to_cpu(timestamp[1])) << 16 |
261		    (u64)(le16_to_cpu(timestamp[2])) << 32;
262
263	return kvaser_usb_ticks_to_ktime(cfg, ticks);
264}
265
266static inline ktime_t kvaser_usb_timestamp64_to_ktime(const struct kvaser_usb_dev_cfg *cfg,
267						      __le64 timestamp)
268{
269	return kvaser_usb_ticks_to_ktime(cfg, le64_to_cpu(timestamp));
270}
271
272#endif /* KVASER_USB_H */
~/ Read-only file preview.