Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

can: ucan: add driver for Theobroma Systems UCAN devices

The UCAN driver supports the microcontroller-based USB/CAN
adapters from Theobroma Systems. There are two form-factors
that run essentially the same firmware:

* Seal: standalone USB stick ( https://www.theobroma-systems.com/seal )

* Mule: integrated on the PCB of various System-on-Modules from
Theobroma Systems like the A31-µQ7 and the RK3399-Q7
( https://www.theobroma-systems.com/rk3399-q7 )

The USB wire protocol has been designed to be as generic and
hardware-indendent as possible in the hope of being useful for
implementation on other microcontrollers.

Signed-off-by: Martin Elshuber <martin.elshuber@theobroma-systems.com>
Signed-off-by: Jakob Unterwurzacher <jakob.unterwurzacher@theobroma-systems.com>
Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Acked-by: Wolfgang Grandegger <wg@grandegger.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>

authored by

Jakob Unterwurzacher and committed by
Marc Kleine-Budde
9f2d3eae ffbdd917

+1963
+332
Documentation/networking/can_ucan_protocol.rst
··· 1 + ================= 2 + The UCAN Protocol 3 + ================= 4 + 5 + UCAN is the protocol used by the microcontroller-based USB-CAN 6 + adapter that is integrated on System-on-Modules from Theobroma Systems 7 + and that is also available as a standalone USB stick. 8 + 9 + The UCAN protocol has been designed to be hardware-independent. 10 + It is modeled closely after how Linux represents CAN devices 11 + internally. All multi-byte integers are encoded as Little Endian. 12 + 13 + All structures mentioned in this document are defined in 14 + ``drivers/net/can/usb/ucan.c``. 15 + 16 + USB Endpoints 17 + ============= 18 + 19 + UCAN devices use three USB endpoints: 20 + 21 + CONTROL endpoint 22 + The driver sends device management commands on this endpoint 23 + 24 + IN endpoint 25 + The device sends CAN data frames and CAN error frames 26 + 27 + OUT endpoint 28 + The driver sends CAN data frames on the out endpoint 29 + 30 + 31 + CONTROL Messages 32 + ================ 33 + 34 + UCAN devices are configured using vendor requests on the control pipe. 35 + 36 + To support multiple CAN interfaces in a single USB device all 37 + configuration commands target the corresponding interface in the USB 38 + descriptor. 39 + 40 + The driver uses ``ucan_ctrl_command_in/out`` and 41 + ``ucan_device_request_in`` to deliver commands to the device. 42 + 43 + Setup Packet 44 + ------------ 45 + 46 + ================= ===================================================== 47 + ``bmRequestType`` Direction | Vendor | (Interface or Device) 48 + ``bRequest`` Command Number 49 + ``wValue`` Subcommand Number (16 Bit) or 0 if not used 50 + ``wIndex`` USB Interface Index (0 for device commands) 51 + ``wLength`` * Host to Device - Number of bytes to transmit 52 + * Device to Host - Maximum Number of bytes to 53 + receive. If the device send less. Commom ZLP 54 + semantics are used. 55 + ================= ===================================================== 56 + 57 + Error Handling 58 + -------------- 59 + 60 + The device indicates failed control commands by stalling the 61 + pipe. 62 + 63 + Device Commands 64 + --------------- 65 + 66 + UCAN_DEVICE_GET_FW_STRING 67 + ~~~~~~~~~~~~~~~~~~~~~~~~~ 68 + 69 + *Dev2Host; optional* 70 + 71 + Request the device firmware string. 72 + 73 + 74 + Interface Commands 75 + ------------------ 76 + 77 + UCAN_COMMAND_START 78 + ~~~~~~~~~~~~~~~~~~ 79 + 80 + *Host2Dev; mandatory* 81 + 82 + Bring the CAN interface up. 83 + 84 + Payload Format 85 + ``ucan_ctl_payload_t.cmd_start`` 86 + 87 + ==== ============================ 88 + mode or mask of ``UCAN_MODE_*`` 89 + ==== ============================ 90 + 91 + UCAN_COMMAND_STOP 92 + ~~~~~~~~~~~~~~~~~~ 93 + 94 + *Host2Dev; mandatory* 95 + 96 + Stop the CAN interface 97 + 98 + Payload Format 99 + *empty* 100 + 101 + UCAN_COMMAND_RESET 102 + ~~~~~~~~~~~~~~~~~~ 103 + 104 + *Host2Dev; mandatory* 105 + 106 + Reset the CAN controller (including error counters) 107 + 108 + Payload Format 109 + *empty* 110 + 111 + UCAN_COMMAND_GET 112 + ~~~~~~~~~~~~~~~~ 113 + 114 + *Host2Dev; mandatory* 115 + 116 + Get Information from the Device 117 + 118 + Subcommands 119 + ^^^^^^^^^^^ 120 + 121 + UCAN_COMMAND_GET_INFO 122 + Request the device information structure ``ucan_ctl_payload_t.device_info``. 123 + 124 + See the ``device_info`` field for details, and 125 + ``uapi/linux/can/netlink.h`` for an explanation of the 126 + ``can_bittiming fields``. 127 + 128 + Payload Format 129 + ``ucan_ctl_payload_t.device_info`` 130 + 131 + UCAN_COMMAND_GET_PROTOCOL_VERSION 132 + 133 + Request the device protocol version 134 + ``ucan_ctl_payload_t.protocol_version``. The current protocol version is 3. 135 + 136 + Payload Format 137 + ``ucan_ctl_payload_t.protocol_version`` 138 + 139 + .. note:: Devices that do not implement this command use the old 140 + protocol version 1 141 + 142 + UCAN_COMMAND_SET_BITTIMING 143 + ~~~~~~~~~~~~~~~~~~~~~~~~~~ 144 + 145 + *Host2Dev; mandatory* 146 + 147 + Setup bittiming by sending the the structure 148 + ``ucan_ctl_payload_t.cmd_set_bittiming`` (see ``struct bittiming`` for 149 + details) 150 + 151 + Payload Format 152 + ``ucan_ctl_payload_t.cmd_set_bittiming``. 153 + 154 + UCAN_SLEEP/WAKE 155 + ~~~~~~~~~~~~~~~ 156 + 157 + *Host2Dev; optional* 158 + 159 + Configure sleep and wake modes. Not yet supported by the driver. 160 + 161 + UCAN_FILTER 162 + ~~~~~~~~~~~ 163 + 164 + *Host2Dev; optional* 165 + 166 + Setup hardware CAN filters. Not yet supported by the driver. 167 + 168 + Allowed interface commands 169 + -------------------------- 170 + 171 + ================== =================== ================== 172 + Legal Device State Command New Device State 173 + ================== =================== ================== 174 + stopped SET_BITTIMING stopped 175 + stopped START started 176 + started STOP or RESET stopped 177 + stopped STOP or RESET stopped 178 + started RESTART started 179 + any GET *no change* 180 + ================== =================== ================== 181 + 182 + IN Message Format 183 + ================= 184 + 185 + A data packet on the USB IN endpoint contains one or more 186 + ``ucan_message_in`` values. If multiple messages are batched in a USB 187 + data packet, the ``len`` field can be used to jump to the next 188 + ``ucan_message_in`` value (take care to sanity-check the ``len`` value 189 + against the actual data size). 190 + 191 + .. _can_ucan_in_message_len: 192 + 193 + ``len`` field 194 + ------------- 195 + 196 + Each ``ucan_message_in`` must be aligned to a 4-byte boundary (relative 197 + to the start of the start of the data buffer). That means that there 198 + may be padding bytes between multiple ``ucan_message_in`` values: 199 + 200 + .. code:: 201 + 202 + +----------------------------+ < 0 203 + | | 204 + | struct ucan_message_in | 205 + | | 206 + +----------------------------+ < len 207 + [padding] 208 + +----------------------------+ < round_up(len, 4) 209 + | | 210 + | struct ucan_message_in | 211 + | | 212 + +----------------------------+ 213 + [...] 214 + 215 + ``type`` field 216 + -------------- 217 + 218 + The ``type`` field specifies the type of the message. 219 + 220 + UCAN_IN_RX 221 + ~~~~~~~~~~ 222 + 223 + ``subtype`` 224 + zero 225 + 226 + Data received from the CAN bus (ID + payload). 227 + 228 + UCAN_IN_TX_COMPLETE 229 + ~~~~~~~~~~~~~~~~~~~ 230 + 231 + ``subtype`` 232 + zero 233 + 234 + The CAN device has sent a message to the CAN bus. It answers with a 235 + list of of tuples <echo-ids, flags>. 236 + 237 + The echo-id identifies the frame from (echos the id from a previous 238 + UCAN_OUT_TX message). The flag indicates the result of the 239 + transmission. Whereas a set Bit 0 indicates success. All other bits 240 + are reserved and set to zero. 241 + 242 + Flow Control 243 + ------------ 244 + 245 + When receiving CAN messages there is no flow control on the USB 246 + buffer. The driver has to handle inbound message quickly enough to 247 + avoid drops. I case the device buffer overflow the condition is 248 + reported by sending corresponding error frames (see 249 + :ref:`can_ucan_error_handling`) 250 + 251 + 252 + OUT Message Format 253 + ================== 254 + 255 + A data packet on the USB OUT endpoint contains one or more ``struct 256 + ucan_message_out`` values. If multiple messages are batched into one 257 + data packet, the device uses the ``len`` field to jump to the next 258 + ucan_message_out value. Each ucan_message_out must be aligned to 4 259 + bytes (relative to the start of the data buffer). The mechanism is 260 + same as described in :ref:`can_ucan_in_message_len`. 261 + 262 + .. code:: 263 + 264 + +----------------------------+ < 0 265 + | | 266 + | struct ucan_message_out | 267 + | | 268 + +----------------------------+ < len 269 + [padding] 270 + +----------------------------+ < round_up(len, 4) 271 + | | 272 + | struct ucan_message_out | 273 + | | 274 + +----------------------------+ 275 + [...] 276 + 277 + ``type`` field 278 + -------------- 279 + 280 + In protocol version 3 only ``UCAN_OUT_TX`` is defined, others are used 281 + only by legacy devices (protocol version 1). 282 + 283 + UCAN_OUT_TX 284 + ~~~~~~~~~~~ 285 + ``subtype`` 286 + echo id to be replied within a CAN_IN_TX_COMPLETE message 287 + 288 + Transmit a CAN frame. (parameters: ``id``, ``data``) 289 + 290 + Flow Control 291 + ------------ 292 + 293 + When the device outbound buffers are full it starts sending *NAKs* on 294 + the *OUT* pipe until more buffers are available. The driver stops the 295 + queue when a certain threshold of out packets are incomplete. 296 + 297 + .. _can_ucan_error_handling: 298 + 299 + CAN Error Handling 300 + ================== 301 + 302 + If error reporting is turned on the device encodes errors into CAN 303 + error frames (see ``uapi/linux/can/error.h``) and sends it using the 304 + IN endpoint. The driver updates its error statistics and forwards 305 + it. 306 + 307 + Although UCAN devices can suppress error frames completely, in Linux 308 + the driver is always interested. Hence, the device is always started with 309 + the ``UCAN_MODE_BERR_REPORT`` set. Filtering those messages for the 310 + user space is done by the driver. 311 + 312 + Bus OFF 313 + ------- 314 + 315 + - The device does not recover from bus of automatically. 316 + - Bus OFF is indicated by an error frame (see ``uapi/linux/can/error.h``) 317 + - Bus OFF recovery is started by ``UCAN_COMMAND_RESTART`` 318 + - Once Bus OFF recover is completed the device sends an error frame 319 + indicating that it is on ERROR-ACTIVE state. 320 + - During Bus OFF no frames are sent by the device. 321 + - During Bus OFF transmission requests from the host are completed 322 + immediately with the success bit left unset. 323 + 324 + Example Conversation 325 + ==================== 326 + 327 + #) Device is connected to USB 328 + #) Host sends command ``UCAN_COMMAND_RESET``, subcmd 0 329 + #) Host sends command ``UCAN_COMMAND_GET``, subcmd ``UCAN_COMMAND_GET_INFO`` 330 + #) Device sends ``UCAN_IN_DEVICE_INFO`` 331 + #) Host sends command ``UCAN_OUT_SET_BITTIMING`` 332 + #) Host sends command ``UCAN_COMMAND_START``, subcmd 0, mode ``UCAN_MODE_BERR_REPORT``
+1
Documentation/networking/index.rst
··· 10 10 af_xdp 11 11 batman-adv 12 12 can 13 + can_ucan_protocol 13 14 dpaa2/index 14 15 e100 15 16 e1000
+16
drivers/net/can/usb/Kconfig
··· 95 95 This driver supports the CAN BUS Analyzer interface 96 96 from Microchip (http://www.microchip.com/development-tools/). 97 97 98 + config CAN_UCAN 99 + tristate "Theobroma Systems UCAN interface" 100 + ---help--- 101 + This driver supports the Theobroma Systems 102 + UCAN USB-CAN interface. 103 + 104 + The UCAN driver supports the microcontroller-based USB/CAN 105 + adapters from Theobroma Systems. There are two form-factors 106 + that run essentially the same firmware: 107 + 108 + * Seal: standalone USB stick 109 + https://www.theobroma-systems.com/seal) 110 + * Mule: integrated on the PCB of various System-on-Modules 111 + from Theobroma Systems like the A31-µQ7 and the RK3399-Q7 112 + (https://www.theobroma-systems.com/rk3399-q7) 113 + 98 114 endmenu
+1
drivers/net/can/usb/Makefile
··· 10 10 obj-$(CONFIG_CAN_KVASER_USB) += kvaser_usb.o 11 11 obj-$(CONFIG_CAN_MCBA_USB) += mcba_usb.o 12 12 obj-$(CONFIG_CAN_PEAK_USB) += peak_usb/ 13 + obj-$(CONFIG_CAN_UCAN) += ucan.o
+1613
drivers/net/can/usb/ucan.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + 3 + /* Driver for Theobroma Systems UCAN devices, Protocol Version 3 4 + * 5 + * Copyright (C) 2018 Theobroma Systems Design und Consulting GmbH 6 + * 7 + * 8 + * General Description: 9 + * 10 + * The USB Device uses three Endpoints: 11 + * 12 + * CONTROL Endpoint: Is used the setup the device (start, stop, 13 + * info, configure). 14 + * 15 + * IN Endpoint: The device sends CAN Frame Messages and Device 16 + * Information using the IN endpoint. 17 + * 18 + * OUT Endpoint: The driver sends configuration requests, and CAN 19 + * Frames on the out endpoint. 20 + * 21 + * Error Handling: 22 + * 23 + * If error reporting is turned on the device encodes error into CAN 24 + * error frames (see uapi/linux/can/error.h) and sends it using the 25 + * IN Endpoint. The driver updates statistics and forward it. 26 + */ 27 + 28 + #include <linux/can.h> 29 + #include <linux/can/dev.h> 30 + #include <linux/can/error.h> 31 + #include <linux/module.h> 32 + #include <linux/netdevice.h> 33 + #include <linux/signal.h> 34 + #include <linux/skbuff.h> 35 + #include <linux/slab.h> 36 + #include <linux/usb.h> 37 + 38 + #include <linux/can.h> 39 + #include <linux/can/dev.h> 40 + #include <linux/can/error.h> 41 + 42 + #define UCAN_DRIVER_NAME "ucan" 43 + #define UCAN_MAX_RX_URBS 8 44 + /* the CAN controller needs a while to enable/disable the bus */ 45 + #define UCAN_USB_CTL_PIPE_TIMEOUT 1000 46 + /* this driver currently supports protocol version 3 only */ 47 + #define UCAN_PROTOCOL_VERSION_MIN 3 48 + #define UCAN_PROTOCOL_VERSION_MAX 3 49 + 50 + /* UCAN Message Definitions 51 + * ------------------------ 52 + * 53 + * ucan_message_out_t and ucan_message_in_t define the messages 54 + * transmitted on the OUT and IN endpoint. 55 + * 56 + * Multibyte fields are transmitted with little endianness 57 + * 58 + * INTR Endpoint: a single uint32_t storing the current space in the fifo 59 + * 60 + * OUT Endpoint: single message of type ucan_message_out_t is 61 + * transmitted on the out endpoint 62 + * 63 + * IN Endpoint: multiple messages ucan_message_in_t concateted in 64 + * the following way: 65 + * 66 + * m[n].len <=> the length if message n(including the header in bytes) 67 + * m[n] is is aligned to a 4 byte boundary, hence 68 + * offset(m[0]) := 0; 69 + * offset(m[n+1]) := offset(m[n]) + (m[n].len + 3) & 3 70 + * 71 + * this implies that 72 + * offset(m[n]) % 4 <=> 0 73 + */ 74 + 75 + /* Device Global Commands */ 76 + enum { 77 + UCAN_DEVICE_GET_FW_STRING = 0, 78 + }; 79 + 80 + /* UCAN Commands */ 81 + enum { 82 + /* start the can transceiver - val defines the operation mode */ 83 + UCAN_COMMAND_START = 0, 84 + /* cancel pending transmissions and stop the can transceiver */ 85 + UCAN_COMMAND_STOP = 1, 86 + /* send can transceiver into low-power sleep mode */ 87 + UCAN_COMMAND_SLEEP = 2, 88 + /* wake up can transceiver from low-power sleep mode */ 89 + UCAN_COMMAND_WAKEUP = 3, 90 + /* reset the can transceiver */ 91 + UCAN_COMMAND_RESET = 4, 92 + /* get piece of info from the can transceiver - subcmd defines what 93 + * piece 94 + */ 95 + UCAN_COMMAND_GET = 5, 96 + /* clear or disable hardware filter - subcmd defines which of the two */ 97 + UCAN_COMMAND_FILTER = 6, 98 + /* Setup bittiming */ 99 + UCAN_COMMAND_SET_BITTIMING = 7, 100 + /* recover from bus-off state */ 101 + UCAN_COMMAND_RESTART = 8, 102 + }; 103 + 104 + /* UCAN_COMMAND_START and UCAN_COMMAND_GET_INFO operation modes (bitmap). 105 + * Undefined bits must be set to 0. 106 + */ 107 + enum { 108 + UCAN_MODE_LOOPBACK = BIT(0), 109 + UCAN_MODE_SILENT = BIT(1), 110 + UCAN_MODE_3_SAMPLES = BIT(2), 111 + UCAN_MODE_ONE_SHOT = BIT(3), 112 + UCAN_MODE_BERR_REPORT = BIT(4), 113 + }; 114 + 115 + /* UCAN_COMMAND_GET subcommands */ 116 + enum { 117 + UCAN_COMMAND_GET_INFO = 0, 118 + UCAN_COMMAND_GET_PROTOCOL_VERSION = 1, 119 + }; 120 + 121 + /* UCAN_COMMAND_FILTER subcommands */ 122 + enum { 123 + UCAN_FILTER_CLEAR = 0, 124 + UCAN_FILTER_DISABLE = 1, 125 + UCAN_FILTER_ENABLE = 2, 126 + }; 127 + 128 + /* OUT endpoint message types */ 129 + enum { 130 + UCAN_OUT_TX = 2, /* transmit a CAN frame */ 131 + }; 132 + 133 + /* IN endpoint message types */ 134 + enum { 135 + UCAN_IN_TX_COMPLETE = 1, /* CAN frame transmission completed */ 136 + UCAN_IN_RX = 2, /* CAN frame received */ 137 + }; 138 + 139 + struct ucan_ctl_cmd_start { 140 + __le16 mode; /* OR-ing any of UCAN_MODE_* */ 141 + } __packed; 142 + 143 + struct ucan_ctl_cmd_set_bittiming { 144 + __le32 tq; /* Time quanta (TQ) in nanoseconds */ 145 + __le16 brp; /* TQ Prescaler */ 146 + __le16 sample_point; /* Samplepoint on tenth percent */ 147 + u8 prop_seg; /* Propagation segment in TQs */ 148 + u8 phase_seg1; /* Phase buffer segment 1 in TQs */ 149 + u8 phase_seg2; /* Phase buffer segment 2 in TQs */ 150 + u8 sjw; /* Synchronisation jump width in TQs */ 151 + } __packed; 152 + 153 + struct ucan_ctl_cmd_device_info { 154 + __le32 freq; /* Clock Frequency for tq generation */ 155 + u8 tx_fifo; /* Size of the transmission fifo */ 156 + u8 sjw_max; /* can_bittiming fields... */ 157 + u8 tseg1_min; 158 + u8 tseg1_max; 159 + u8 tseg2_min; 160 + u8 tseg2_max; 161 + __le16 brp_inc; 162 + __le32 brp_min; 163 + __le32 brp_max; /* ...can_bittiming fields */ 164 + __le16 ctrlmodes; /* supported control modes */ 165 + __le16 hwfilter; /* Number of HW filter banks */ 166 + __le16 rxmboxes; /* Number of receive Mailboxes */ 167 + } __packed; 168 + 169 + struct ucan_ctl_cmd_get_protocol_version { 170 + __le32 version; 171 + } __packed; 172 + 173 + union ucan_ctl_payload { 174 + /* Setup Bittiming 175 + * bmRequest == UCAN_COMMAND_START 176 + */ 177 + struct ucan_ctl_cmd_start cmd_start; 178 + /* Setup Bittiming 179 + * bmRequest == UCAN_COMMAND_SET_BITTIMING 180 + */ 181 + struct ucan_ctl_cmd_set_bittiming cmd_set_bittiming; 182 + /* Get Device Information 183 + * bmRequest == UCAN_COMMAND_GET; wValue = UCAN_COMMAND_GET_INFO 184 + */ 185 + struct ucan_ctl_cmd_device_info cmd_get_device_info; 186 + /* Get Protocol Version 187 + * bmRequest == UCAN_COMMAND_GET; 188 + * wValue = UCAN_COMMAND_GET_PROTOCOL_VERSION 189 + */ 190 + struct ucan_ctl_cmd_get_protocol_version cmd_get_protocol_version; 191 + 192 + u8 raw[128]; 193 + } __packed; 194 + 195 + enum { 196 + UCAN_TX_COMPLETE_SUCCESS = BIT(0), 197 + }; 198 + 199 + /* Transmission Complete within ucan_message_in */ 200 + struct ucan_tx_complete_entry_t { 201 + u8 echo_index; 202 + u8 flags; 203 + } __packed __aligned(0x2); 204 + 205 + /* CAN Data message format within ucan_message_in/out */ 206 + struct ucan_can_msg { 207 + /* note DLC is computed by 208 + * msg.len - sizeof (msg.len) 209 + * - sizeof (msg.type) 210 + * - sizeof (msg.can_msg.id) 211 + */ 212 + __le32 id; 213 + 214 + union { 215 + u8 data[CAN_MAX_DLEN]; /* Data of CAN frames */ 216 + u8 dlc; /* RTR dlc */ 217 + }; 218 + } __packed; 219 + 220 + /* OUT Endpoint, outbound messages */ 221 + struct ucan_message_out { 222 + __le16 len; /* Length of the content include header */ 223 + u8 type; /* UCAN_OUT_TX and friends */ 224 + u8 subtype; /* command sub type */ 225 + 226 + union { 227 + /* Transmit CAN frame 228 + * (type == UCAN_TX) && ((msg.can_msg.id & CAN_RTR_FLAG) == 0) 229 + * subtype stores the echo id 230 + */ 231 + struct ucan_can_msg can_msg; 232 + } msg; 233 + } __packed __aligned(0x4); 234 + 235 + /* IN Endpoint, inbound messages */ 236 + struct ucan_message_in { 237 + __le16 len; /* Length of the content include header */ 238 + u8 type; /* UCAN_IN_RX and friends */ 239 + u8 subtype; /* command sub type */ 240 + 241 + union { 242 + /* CAN Frame received 243 + * (type == UCAN_IN_RX) 244 + * && ((msg.can_msg.id & CAN_RTR_FLAG) == 0) 245 + */ 246 + struct ucan_can_msg can_msg; 247 + 248 + /* CAN transmission complete 249 + * (type == UCAN_IN_TX_COMPLETE) 250 + */ 251 + struct ucan_tx_complete_entry_t can_tx_complete_msg[0]; 252 + } __aligned(0x4) msg; 253 + } __packed; 254 + 255 + /* Macros to calculate message lengths */ 256 + #define UCAN_OUT_HDR_SIZE offsetof(struct ucan_message_out, msg) 257 + 258 + #define UCAN_IN_HDR_SIZE offsetof(struct ucan_message_in, msg) 259 + #define UCAN_IN_LEN(member) (UCAN_OUT_HDR_SIZE + sizeof(member)) 260 + 261 + struct ucan_priv; 262 + 263 + /* Context Information for transmission URBs */ 264 + struct ucan_urb_context { 265 + struct ucan_priv *up; 266 + u8 dlc; 267 + bool allocated; 268 + }; 269 + 270 + /* Information reported by the USB device */ 271 + struct ucan_device_info { 272 + struct can_bittiming_const bittiming_const; 273 + u8 tx_fifo; 274 + }; 275 + 276 + /* Driver private data */ 277 + struct ucan_priv { 278 + /* must be the first member */ 279 + struct can_priv can; 280 + 281 + /* linux USB device structures */ 282 + struct usb_device *udev; 283 + struct usb_interface *intf; 284 + struct net_device *netdev; 285 + 286 + /* lock for can->echo_skb (used around 287 + * can_put/get/free_echo_skb 288 + */ 289 + spinlock_t echo_skb_lock; 290 + 291 + /* usb device information information */ 292 + u8 intf_index; 293 + u8 in_ep_addr; 294 + u8 out_ep_addr; 295 + u16 in_ep_size; 296 + 297 + /* transmission and reception buffers */ 298 + struct usb_anchor rx_urbs; 299 + struct usb_anchor tx_urbs; 300 + 301 + union ucan_ctl_payload *ctl_msg_buffer; 302 + struct ucan_device_info device_info; 303 + 304 + /* transmission control information and locks */ 305 + spinlock_t context_lock; 306 + unsigned int available_tx_urbs; 307 + struct ucan_urb_context *context_array; 308 + }; 309 + 310 + static u8 ucan_get_can_dlc(struct ucan_can_msg *msg, u16 len) 311 + { 312 + if (le32_to_cpu(msg->id) & CAN_RTR_FLAG) 313 + return get_can_dlc(msg->dlc); 314 + else 315 + return get_can_dlc(len - (UCAN_IN_HDR_SIZE + sizeof(msg->id))); 316 + } 317 + 318 + static void ucan_release_context_array(struct ucan_priv *up) 319 + { 320 + if (!up->context_array) 321 + return; 322 + 323 + /* lock is not needed because, driver is currently opening or closing */ 324 + up->available_tx_urbs = 0; 325 + 326 + kfree(up->context_array); 327 + up->context_array = NULL; 328 + } 329 + 330 + static int ucan_alloc_context_array(struct ucan_priv *up) 331 + { 332 + int i; 333 + 334 + /* release contexts if any */ 335 + ucan_release_context_array(up); 336 + 337 + up->context_array = kcalloc(up->device_info.tx_fifo, 338 + sizeof(*up->context_array), 339 + GFP_KERNEL); 340 + if (!up->context_array) { 341 + netdev_err(up->netdev, 342 + "Not enough memory to allocate tx contexts\n"); 343 + return -ENOMEM; 344 + } 345 + 346 + for (i = 0; i < up->device_info.tx_fifo; i++) { 347 + up->context_array[i].allocated = false; 348 + up->context_array[i].up = up; 349 + } 350 + 351 + /* lock is not needed because, driver is currently opening */ 352 + up->available_tx_urbs = up->device_info.tx_fifo; 353 + 354 + return 0; 355 + } 356 + 357 + static struct ucan_urb_context *ucan_alloc_context(struct ucan_priv *up) 358 + { 359 + int i; 360 + unsigned long flags; 361 + struct ucan_urb_context *ret = NULL; 362 + 363 + if (WARN_ON_ONCE(!up->context_array)) 364 + return NULL; 365 + 366 + /* execute context operation atomically */ 367 + spin_lock_irqsave(&up->context_lock, flags); 368 + 369 + for (i = 0; i < up->device_info.tx_fifo; i++) { 370 + if (!up->context_array[i].allocated) { 371 + /* update context */ 372 + ret = &up->context_array[i]; 373 + up->context_array[i].allocated = true; 374 + 375 + /* stop queue if necessary */ 376 + up->available_tx_urbs--; 377 + if (!up->available_tx_urbs) 378 + netif_stop_queue(up->netdev); 379 + 380 + break; 381 + } 382 + } 383 + 384 + spin_unlock_irqrestore(&up->context_lock, flags); 385 + return ret; 386 + } 387 + 388 + static bool ucan_release_context(struct ucan_priv *up, 389 + struct ucan_urb_context *ctx) 390 + { 391 + unsigned long flags; 392 + bool ret = false; 393 + 394 + if (WARN_ON_ONCE(!up->context_array)) 395 + return false; 396 + 397 + /* execute context operation atomically */ 398 + spin_lock_irqsave(&up->context_lock, flags); 399 + 400 + /* context was not allocated, maybe the device sent garbage */ 401 + if (ctx->allocated) { 402 + ctx->allocated = false; 403 + 404 + /* check if the queue needs to be woken */ 405 + if (!up->available_tx_urbs) 406 + netif_wake_queue(up->netdev); 407 + up->available_tx_urbs++; 408 + 409 + ret = true; 410 + } 411 + 412 + spin_unlock_irqrestore(&up->context_lock, flags); 413 + return ret; 414 + } 415 + 416 + static int ucan_ctrl_command_out(struct ucan_priv *up, 417 + u8 cmd, u16 subcmd, u16 datalen) 418 + { 419 + return usb_control_msg(up->udev, 420 + usb_sndctrlpipe(up->udev, 0), 421 + cmd, 422 + USB_DIR_OUT | USB_TYPE_VENDOR | 423 + USB_RECIP_INTERFACE, 424 + subcmd, 425 + up->intf_index, 426 + up->ctl_msg_buffer, 427 + datalen, 428 + UCAN_USB_CTL_PIPE_TIMEOUT); 429 + } 430 + 431 + static int ucan_device_request_in(struct ucan_priv *up, 432 + u8 cmd, u16 subcmd, u16 datalen) 433 + { 434 + return usb_control_msg(up->udev, 435 + usb_rcvctrlpipe(up->udev, 0), 436 + cmd, 437 + USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 438 + subcmd, 439 + 0, 440 + up->ctl_msg_buffer, 441 + datalen, 442 + UCAN_USB_CTL_PIPE_TIMEOUT); 443 + } 444 + 445 + /* Parse the device information structure reported by the device and 446 + * setup private variables accordingly 447 + */ 448 + static void ucan_parse_device_info(struct ucan_priv *up, 449 + struct ucan_ctl_cmd_device_info *device_info) 450 + { 451 + struct can_bittiming_const *bittiming = 452 + &up->device_info.bittiming_const; 453 + u16 ctrlmodes; 454 + 455 + /* store the data */ 456 + up->can.clock.freq = le32_to_cpu(device_info->freq); 457 + up->device_info.tx_fifo = device_info->tx_fifo; 458 + strcpy(bittiming->name, "ucan"); 459 + bittiming->tseg1_min = device_info->tseg1_min; 460 + bittiming->tseg1_max = device_info->tseg1_max; 461 + bittiming->tseg2_min = device_info->tseg2_min; 462 + bittiming->tseg2_max = device_info->tseg2_max; 463 + bittiming->sjw_max = device_info->sjw_max; 464 + bittiming->brp_min = le32_to_cpu(device_info->brp_min); 465 + bittiming->brp_max = le32_to_cpu(device_info->brp_max); 466 + bittiming->brp_inc = le16_to_cpu(device_info->brp_inc); 467 + 468 + ctrlmodes = le16_to_cpu(device_info->ctrlmodes); 469 + 470 + up->can.ctrlmode_supported = 0; 471 + 472 + if (ctrlmodes & UCAN_MODE_LOOPBACK) 473 + up->can.ctrlmode_supported |= CAN_CTRLMODE_LOOPBACK; 474 + if (ctrlmodes & UCAN_MODE_SILENT) 475 + up->can.ctrlmode_supported |= CAN_CTRLMODE_LISTENONLY; 476 + if (ctrlmodes & UCAN_MODE_3_SAMPLES) 477 + up->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; 478 + if (ctrlmodes & UCAN_MODE_ONE_SHOT) 479 + up->can.ctrlmode_supported |= CAN_CTRLMODE_ONE_SHOT; 480 + if (ctrlmodes & UCAN_MODE_BERR_REPORT) 481 + up->can.ctrlmode_supported |= CAN_CTRLMODE_BERR_REPORTING; 482 + } 483 + 484 + /* Handle a CAN error frame that we have received from the device. 485 + * Returns true if the can state has changed. 486 + */ 487 + static bool ucan_handle_error_frame(struct ucan_priv *up, 488 + struct ucan_message_in *m, 489 + canid_t canid) 490 + { 491 + enum can_state new_state = up->can.state; 492 + struct net_device_stats *net_stats = &up->netdev->stats; 493 + struct can_device_stats *can_stats = &up->can.can_stats; 494 + 495 + if (canid & CAN_ERR_LOSTARB) 496 + can_stats->arbitration_lost++; 497 + 498 + if (canid & CAN_ERR_BUSERROR) 499 + can_stats->bus_error++; 500 + 501 + if (canid & CAN_ERR_ACK) 502 + net_stats->tx_errors++; 503 + 504 + if (canid & CAN_ERR_BUSOFF) 505 + new_state = CAN_STATE_BUS_OFF; 506 + 507 + /* controller problems, details in data[1] */ 508 + if (canid & CAN_ERR_CRTL) { 509 + u8 d1 = m->msg.can_msg.data[1]; 510 + 511 + if (d1 & CAN_ERR_CRTL_RX_OVERFLOW) 512 + net_stats->rx_over_errors++; 513 + 514 + /* controller state bits: if multiple are set the worst wins */ 515 + if (d1 & CAN_ERR_CRTL_ACTIVE) 516 + new_state = CAN_STATE_ERROR_ACTIVE; 517 + 518 + if (d1 & (CAN_ERR_CRTL_RX_WARNING | CAN_ERR_CRTL_TX_WARNING)) 519 + new_state = CAN_STATE_ERROR_WARNING; 520 + 521 + if (d1 & (CAN_ERR_CRTL_RX_PASSIVE | CAN_ERR_CRTL_TX_PASSIVE)) 522 + new_state = CAN_STATE_ERROR_PASSIVE; 523 + } 524 + 525 + /* protocol error, details in data[2] */ 526 + if (canid & CAN_ERR_PROT) { 527 + u8 d2 = m->msg.can_msg.data[2]; 528 + 529 + if (d2 & CAN_ERR_PROT_TX) 530 + net_stats->tx_errors++; 531 + else 532 + net_stats->rx_errors++; 533 + } 534 + 535 + /* no state change - we are done */ 536 + if (up->can.state == new_state) 537 + return false; 538 + 539 + /* we switched into a better state */ 540 + if (up->can.state > new_state) { 541 + up->can.state = new_state; 542 + return true; 543 + } 544 + 545 + /* we switched into a worse state */ 546 + up->can.state = new_state; 547 + switch (new_state) { 548 + case CAN_STATE_BUS_OFF: 549 + can_stats->bus_off++; 550 + can_bus_off(up->netdev); 551 + break; 552 + case CAN_STATE_ERROR_PASSIVE: 553 + can_stats->error_passive++; 554 + break; 555 + case CAN_STATE_ERROR_WARNING: 556 + can_stats->error_warning++; 557 + break; 558 + default: 559 + break; 560 + } 561 + return true; 562 + } 563 + 564 + /* Callback on reception of a can frame via the IN endpoint 565 + * 566 + * This function allocates an skb and transferres it to the Linux 567 + * network stack 568 + */ 569 + static void ucan_rx_can_msg(struct ucan_priv *up, struct ucan_message_in *m) 570 + { 571 + int len; 572 + canid_t canid; 573 + struct can_frame *cf; 574 + struct sk_buff *skb; 575 + struct net_device_stats *stats = &up->netdev->stats; 576 + 577 + /* get the contents of the length field */ 578 + len = le16_to_cpu(m->len); 579 + 580 + /* check sanity */ 581 + if (len < UCAN_IN_HDR_SIZE + sizeof(m->msg.can_msg.id)) { 582 + netdev_warn(up->netdev, "invalid input message len: %d\n", len); 583 + return; 584 + } 585 + 586 + /* handle error frames */ 587 + canid = le32_to_cpu(m->msg.can_msg.id); 588 + if (canid & CAN_ERR_FLAG) { 589 + bool busstate_changed = ucan_handle_error_frame(up, m, canid); 590 + 591 + /* if berr-reporting is off only state changes get through */ 592 + if (!(up->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) && 593 + !busstate_changed) 594 + return; 595 + } else { 596 + canid_t canid_mask; 597 + /* compute the mask for canid */ 598 + canid_mask = CAN_RTR_FLAG; 599 + if (canid & CAN_EFF_FLAG) 600 + canid_mask |= CAN_EFF_MASK | CAN_EFF_FLAG; 601 + else 602 + canid_mask |= CAN_SFF_MASK; 603 + 604 + if (canid & ~canid_mask) 605 + netdev_warn(up->netdev, 606 + "unexpected bits set (canid %x, mask %x)", 607 + canid, canid_mask); 608 + 609 + canid &= canid_mask; 610 + } 611 + 612 + /* allocate skb */ 613 + skb = alloc_can_skb(up->netdev, &cf); 614 + if (!skb) 615 + return; 616 + 617 + /* fill the can frame */ 618 + cf->can_id = canid; 619 + 620 + /* compute DLC taking RTR_FLAG into account */ 621 + cf->can_dlc = ucan_get_can_dlc(&m->msg.can_msg, len); 622 + 623 + /* copy the payload of non RTR frames */ 624 + if (!(cf->can_id & CAN_RTR_FLAG) || (cf->can_id & CAN_ERR_FLAG)) 625 + memcpy(cf->data, m->msg.can_msg.data, cf->can_dlc); 626 + 627 + /* don't count error frames as real packets */ 628 + stats->rx_packets++; 629 + stats->rx_bytes += cf->can_dlc; 630 + 631 + /* pass it to Linux */ 632 + netif_rx(skb); 633 + } 634 + 635 + /* callback indicating completed transmission */ 636 + static void ucan_tx_complete_msg(struct ucan_priv *up, 637 + struct ucan_message_in *m) 638 + { 639 + unsigned long flags; 640 + u16 count, i; 641 + u8 echo_index, dlc; 642 + u16 len = le16_to_cpu(m->len); 643 + 644 + struct ucan_urb_context *context; 645 + 646 + if (len < UCAN_IN_HDR_SIZE || (len % 2 != 0)) { 647 + netdev_err(up->netdev, "invalid tx complete length\n"); 648 + return; 649 + } 650 + 651 + count = (len - UCAN_IN_HDR_SIZE) / 2; 652 + for (i = 0; i < count; i++) { 653 + /* we did not submit such echo ids */ 654 + echo_index = m->msg.can_tx_complete_msg[i].echo_index; 655 + if (echo_index >= up->device_info.tx_fifo) { 656 + up->netdev->stats.tx_errors++; 657 + netdev_err(up->netdev, 658 + "invalid echo_index %d received\n", 659 + echo_index); 660 + continue; 661 + } 662 + 663 + /* gather information from the context */ 664 + context = &up->context_array[echo_index]; 665 + dlc = READ_ONCE(context->dlc); 666 + 667 + /* Release context and restart queue if necessary. 668 + * Also check if the context was allocated 669 + */ 670 + if (!ucan_release_context(up, context)) 671 + continue; 672 + 673 + spin_lock_irqsave(&up->echo_skb_lock, flags); 674 + if (m->msg.can_tx_complete_msg[i].flags & 675 + UCAN_TX_COMPLETE_SUCCESS) { 676 + /* update statistics */ 677 + up->netdev->stats.tx_packets++; 678 + up->netdev->stats.tx_bytes += dlc; 679 + can_get_echo_skb(up->netdev, echo_index); 680 + } else { 681 + up->netdev->stats.tx_dropped++; 682 + can_free_echo_skb(up->netdev, echo_index); 683 + } 684 + spin_unlock_irqrestore(&up->echo_skb_lock, flags); 685 + } 686 + } 687 + 688 + /* callback on reception of a USB message */ 689 + static void ucan_read_bulk_callback(struct urb *urb) 690 + { 691 + int ret; 692 + int pos; 693 + struct ucan_priv *up = urb->context; 694 + struct net_device *netdev = up->netdev; 695 + struct ucan_message_in *m; 696 + 697 + /* the device is not up and the driver should not receive any 698 + * data on the bulk in pipe 699 + */ 700 + if (WARN_ON(!up->context_array)) { 701 + usb_free_coherent(up->udev, 702 + up->in_ep_size, 703 + urb->transfer_buffer, 704 + urb->transfer_dma); 705 + return; 706 + } 707 + 708 + /* check URB status */ 709 + switch (urb->status) { 710 + case 0: 711 + break; 712 + case -ENOENT: 713 + case -EPIPE: 714 + case -EPROTO: 715 + case -ESHUTDOWN: 716 + case -ETIME: 717 + /* urb is not resubmitted -> free dma data */ 718 + usb_free_coherent(up->udev, 719 + up->in_ep_size, 720 + urb->transfer_buffer, 721 + urb->transfer_dma); 722 + netdev_dbg(up->netdev, "not resumbmitting urb; status: %d\n", 723 + urb->status); 724 + return; 725 + default: 726 + goto resubmit; 727 + } 728 + 729 + /* sanity check */ 730 + if (!netif_device_present(netdev)) 731 + return; 732 + 733 + /* iterate over input */ 734 + pos = 0; 735 + while (pos < urb->actual_length) { 736 + int len; 737 + 738 + /* check sanity (length of header) */ 739 + if ((urb->actual_length - pos) < UCAN_IN_HDR_SIZE) { 740 + netdev_warn(up->netdev, 741 + "invalid message (short; no hdr; l:%d)\n", 742 + urb->actual_length); 743 + goto resubmit; 744 + } 745 + 746 + /* setup the message address */ 747 + m = (struct ucan_message_in *) 748 + ((u8 *)urb->transfer_buffer + pos); 749 + len = le16_to_cpu(m->len); 750 + 751 + /* check sanity (length of content) */ 752 + if (urb->actual_length - pos < len) { 753 + netdev_warn(up->netdev, 754 + "invalid message (short; no data; l:%d)\n", 755 + urb->actual_length); 756 + print_hex_dump(KERN_WARNING, 757 + "raw data: ", 758 + DUMP_PREFIX_ADDRESS, 759 + 16, 760 + 1, 761 + urb->transfer_buffer, 762 + urb->actual_length, 763 + true); 764 + 765 + goto resubmit; 766 + } 767 + 768 + switch (m->type) { 769 + case UCAN_IN_RX: 770 + ucan_rx_can_msg(up, m); 771 + break; 772 + case UCAN_IN_TX_COMPLETE: 773 + ucan_tx_complete_msg(up, m); 774 + break; 775 + default: 776 + netdev_warn(up->netdev, 777 + "invalid message (type; t:%d)\n", 778 + m->type); 779 + break; 780 + } 781 + 782 + /* proceed to next message */ 783 + pos += len; 784 + /* align to 4 byte boundary */ 785 + pos = round_up(pos, 4); 786 + } 787 + 788 + resubmit: 789 + /* resubmit urb when done */ 790 + usb_fill_bulk_urb(urb, up->udev, 791 + usb_rcvbulkpipe(up->udev, 792 + up->in_ep_addr), 793 + urb->transfer_buffer, 794 + up->in_ep_size, 795 + ucan_read_bulk_callback, 796 + up); 797 + 798 + usb_anchor_urb(urb, &up->rx_urbs); 799 + ret = usb_submit_urb(urb, GFP_KERNEL); 800 + 801 + if (ret < 0) { 802 + netdev_err(up->netdev, 803 + "failed resubmitting read bulk urb: %d\n", 804 + ret); 805 + 806 + usb_unanchor_urb(urb); 807 + usb_free_coherent(up->udev, 808 + up->in_ep_size, 809 + urb->transfer_buffer, 810 + urb->transfer_dma); 811 + 812 + if (ret == -ENODEV) 813 + netif_device_detach(netdev); 814 + } 815 + } 816 + 817 + /* callback after transmission of a USB message */ 818 + static void ucan_write_bulk_callback(struct urb *urb) 819 + { 820 + unsigned long flags; 821 + struct ucan_priv *up; 822 + struct ucan_urb_context *context = urb->context; 823 + 824 + /* get the urb context */ 825 + if (WARN_ON_ONCE(!context)) 826 + return; 827 + 828 + /* free up our allocated buffer */ 829 + usb_free_coherent(urb->dev, 830 + sizeof(struct ucan_message_out), 831 + urb->transfer_buffer, 832 + urb->transfer_dma); 833 + 834 + up = context->up; 835 + if (WARN_ON_ONCE(!up)) 836 + return; 837 + 838 + /* sanity check */ 839 + if (!netif_device_present(up->netdev)) 840 + return; 841 + 842 + /* transmission failed (USB - the device will not send a TX complete) */ 843 + if (urb->status) { 844 + netdev_warn(up->netdev, 845 + "failed to transmit USB message to device: %d\n", 846 + urb->status); 847 + 848 + /* update counters an cleanup */ 849 + spin_lock_irqsave(&up->echo_skb_lock, flags); 850 + can_free_echo_skb(up->netdev, context - up->context_array); 851 + spin_unlock_irqrestore(&up->echo_skb_lock, flags); 852 + 853 + up->netdev->stats.tx_dropped++; 854 + 855 + /* release context and restart the queue if necessary */ 856 + if (!ucan_release_context(up, context)) 857 + netdev_err(up->netdev, 858 + "urb failed, failed to release context\n"); 859 + } 860 + } 861 + 862 + static void ucan_cleanup_rx_urbs(struct ucan_priv *up, struct urb **urbs) 863 + { 864 + int i; 865 + 866 + for (i = 0; i < UCAN_MAX_RX_URBS; i++) { 867 + if (urbs[i]) { 868 + usb_unanchor_urb(urbs[i]); 869 + usb_free_coherent(up->udev, 870 + up->in_ep_size, 871 + urbs[i]->transfer_buffer, 872 + urbs[i]->transfer_dma); 873 + usb_free_urb(urbs[i]); 874 + } 875 + } 876 + 877 + memset(urbs, 0, sizeof(*urbs) * UCAN_MAX_RX_URBS); 878 + } 879 + 880 + static int ucan_prepare_and_anchor_rx_urbs(struct ucan_priv *up, 881 + struct urb **urbs) 882 + { 883 + int i; 884 + 885 + memset(urbs, 0, sizeof(*urbs) * UCAN_MAX_RX_URBS); 886 + 887 + for (i = 0; i < UCAN_MAX_RX_URBS; i++) { 888 + void *buf; 889 + 890 + urbs[i] = usb_alloc_urb(0, GFP_KERNEL); 891 + if (!urbs[i]) 892 + goto err; 893 + 894 + buf = usb_alloc_coherent(up->udev, 895 + up->in_ep_size, 896 + GFP_KERNEL, &urbs[i]->transfer_dma); 897 + if (!buf) { 898 + /* cleanup this urb */ 899 + usb_free_urb(urbs[i]); 900 + urbs[i] = NULL; 901 + goto err; 902 + } 903 + 904 + usb_fill_bulk_urb(urbs[i], up->udev, 905 + usb_rcvbulkpipe(up->udev, 906 + up->in_ep_addr), 907 + buf, 908 + up->in_ep_size, 909 + ucan_read_bulk_callback, 910 + up); 911 + 912 + urbs[i]->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 913 + 914 + usb_anchor_urb(urbs[i], &up->rx_urbs); 915 + } 916 + return 0; 917 + 918 + err: 919 + /* cleanup other unsubmitted urbs */ 920 + ucan_cleanup_rx_urbs(up, urbs); 921 + return -ENOMEM; 922 + } 923 + 924 + /* Submits rx urbs with the semantic: Either submit all, or cleanup 925 + * everything. I case of errors submitted urbs are killed and all urbs in 926 + * the array are freed. I case of no errors every entry in the urb 927 + * array is set to NULL. 928 + */ 929 + static int ucan_submit_rx_urbs(struct ucan_priv *up, struct urb **urbs) 930 + { 931 + int i, ret; 932 + 933 + /* Iterate over all urbs to submit. On success remove the urb 934 + * from the list. 935 + */ 936 + for (i = 0; i < UCAN_MAX_RX_URBS; i++) { 937 + ret = usb_submit_urb(urbs[i], GFP_KERNEL); 938 + if (ret) { 939 + netdev_err(up->netdev, 940 + "could not submit urb; code: %d\n", 941 + ret); 942 + goto err; 943 + } 944 + 945 + /* Anchor URB and drop reference, USB core will take 946 + * care of freeing it 947 + */ 948 + usb_free_urb(urbs[i]); 949 + urbs[i] = NULL; 950 + } 951 + return 0; 952 + 953 + err: 954 + /* Cleanup unsubmitted urbs */ 955 + ucan_cleanup_rx_urbs(up, urbs); 956 + 957 + /* Kill urbs that are already submitted */ 958 + usb_kill_anchored_urbs(&up->rx_urbs); 959 + 960 + return ret; 961 + } 962 + 963 + /* Open the network device */ 964 + static int ucan_open(struct net_device *netdev) 965 + { 966 + int ret, ret_cleanup; 967 + u16 ctrlmode; 968 + struct urb *urbs[UCAN_MAX_RX_URBS]; 969 + struct ucan_priv *up = netdev_priv(netdev); 970 + 971 + ret = ucan_alloc_context_array(up); 972 + if (ret) 973 + return ret; 974 + 975 + /* Allocate and prepare IN URBS - allocated and anchored 976 + * urbs are stored in urbs[] for clean 977 + */ 978 + ret = ucan_prepare_and_anchor_rx_urbs(up, urbs); 979 + if (ret) 980 + goto err_contexts; 981 + 982 + /* Check the control mode */ 983 + ctrlmode = 0; 984 + if (up->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) 985 + ctrlmode |= UCAN_MODE_LOOPBACK; 986 + if (up->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) 987 + ctrlmode |= UCAN_MODE_SILENT; 988 + if (up->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) 989 + ctrlmode |= UCAN_MODE_3_SAMPLES; 990 + if (up->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT) 991 + ctrlmode |= UCAN_MODE_ONE_SHOT; 992 + 993 + /* Enable this in any case - filtering is down within the 994 + * receive path 995 + */ 996 + ctrlmode |= UCAN_MODE_BERR_REPORT; 997 + up->ctl_msg_buffer->cmd_start.mode = cpu_to_le16(ctrlmode); 998 + 999 + /* Driver is ready to receive data - start the USB device */ 1000 + ret = ucan_ctrl_command_out(up, UCAN_COMMAND_START, 0, 2); 1001 + if (ret < 0) { 1002 + netdev_err(up->netdev, 1003 + "could not start device, code: %d\n", 1004 + ret); 1005 + goto err_reset; 1006 + } 1007 + 1008 + /* Call CAN layer open */ 1009 + ret = open_candev(netdev); 1010 + if (ret) 1011 + goto err_stop; 1012 + 1013 + /* Driver is ready to receive data. Submit RX URBS */ 1014 + ret = ucan_submit_rx_urbs(up, urbs); 1015 + if (ret) 1016 + goto err_stop; 1017 + 1018 + up->can.state = CAN_STATE_ERROR_ACTIVE; 1019 + 1020 + /* Start the network queue */ 1021 + netif_start_queue(netdev); 1022 + 1023 + return 0; 1024 + 1025 + err_stop: 1026 + /* The device have started already stop it */ 1027 + ret_cleanup = ucan_ctrl_command_out(up, UCAN_COMMAND_STOP, 0, 0); 1028 + if (ret_cleanup < 0) 1029 + netdev_err(up->netdev, 1030 + "could not stop device, code: %d\n", 1031 + ret_cleanup); 1032 + 1033 + err_reset: 1034 + /* The device might have received data, reset it for 1035 + * consistent state 1036 + */ 1037 + ret_cleanup = ucan_ctrl_command_out(up, UCAN_COMMAND_RESET, 0, 0); 1038 + if (ret_cleanup < 0) 1039 + netdev_err(up->netdev, 1040 + "could not reset device, code: %d\n", 1041 + ret_cleanup); 1042 + 1043 + /* clean up unsubmitted urbs */ 1044 + ucan_cleanup_rx_urbs(up, urbs); 1045 + 1046 + err_contexts: 1047 + ucan_release_context_array(up); 1048 + return ret; 1049 + } 1050 + 1051 + static struct urb *ucan_prepare_tx_urb(struct ucan_priv *up, 1052 + struct ucan_urb_context *context, 1053 + struct can_frame *cf, 1054 + u8 echo_index) 1055 + { 1056 + int mlen; 1057 + struct urb *urb; 1058 + struct ucan_message_out *m; 1059 + 1060 + /* create a URB, and a buffer for it, and copy the data to the URB */ 1061 + urb = usb_alloc_urb(0, GFP_ATOMIC); 1062 + if (!urb) { 1063 + netdev_err(up->netdev, "no memory left for URBs\n"); 1064 + return NULL; 1065 + } 1066 + 1067 + m = usb_alloc_coherent(up->udev, 1068 + sizeof(struct ucan_message_out), 1069 + GFP_ATOMIC, 1070 + &urb->transfer_dma); 1071 + if (!m) { 1072 + netdev_err(up->netdev, "no memory left for USB buffer\n"); 1073 + usb_free_urb(urb); 1074 + return NULL; 1075 + } 1076 + 1077 + /* build the USB message */ 1078 + m->type = UCAN_OUT_TX; 1079 + m->msg.can_msg.id = cpu_to_le32(cf->can_id); 1080 + 1081 + if (cf->can_id & CAN_RTR_FLAG) { 1082 + mlen = UCAN_OUT_HDR_SIZE + 1083 + offsetof(struct ucan_can_msg, dlc) + 1084 + sizeof(m->msg.can_msg.dlc); 1085 + m->msg.can_msg.dlc = cf->can_dlc; 1086 + } else { 1087 + mlen = UCAN_OUT_HDR_SIZE + 1088 + sizeof(m->msg.can_msg.id) + cf->can_dlc; 1089 + memcpy(m->msg.can_msg.data, cf->data, cf->can_dlc); 1090 + } 1091 + m->len = cpu_to_le16(mlen); 1092 + 1093 + context->dlc = cf->can_dlc; 1094 + 1095 + m->subtype = echo_index; 1096 + 1097 + /* build the urb */ 1098 + usb_fill_bulk_urb(urb, up->udev, 1099 + usb_sndbulkpipe(up->udev, 1100 + up->out_ep_addr), 1101 + m, mlen, ucan_write_bulk_callback, context); 1102 + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 1103 + 1104 + return urb; 1105 + } 1106 + 1107 + static void ucan_clean_up_tx_urb(struct ucan_priv *up, struct urb *urb) 1108 + { 1109 + usb_free_coherent(up->udev, sizeof(struct ucan_message_out), 1110 + urb->transfer_buffer, urb->transfer_dma); 1111 + usb_free_urb(urb); 1112 + } 1113 + 1114 + /* callback when Linux needs to send a can frame */ 1115 + static netdev_tx_t ucan_start_xmit(struct sk_buff *skb, 1116 + struct net_device *netdev) 1117 + { 1118 + unsigned long flags; 1119 + int ret; 1120 + u8 echo_index; 1121 + struct urb *urb; 1122 + struct ucan_urb_context *context; 1123 + struct ucan_priv *up = netdev_priv(netdev); 1124 + struct can_frame *cf = (struct can_frame *)skb->data; 1125 + 1126 + /* check skb */ 1127 + if (can_dropped_invalid_skb(netdev, skb)) 1128 + return NETDEV_TX_OK; 1129 + 1130 + /* allocate a context and slow down tx path, if fifo state is low */ 1131 + context = ucan_alloc_context(up); 1132 + echo_index = context - up->context_array; 1133 + 1134 + if (WARN_ON_ONCE(!context)) 1135 + return NETDEV_TX_BUSY; 1136 + 1137 + /* prepare urb for transmission */ 1138 + urb = ucan_prepare_tx_urb(up, context, cf, echo_index); 1139 + if (!urb) 1140 + goto drop; 1141 + 1142 + /* put the skb on can loopback stack */ 1143 + spin_lock_irqsave(&up->echo_skb_lock, flags); 1144 + can_put_echo_skb(skb, up->netdev, echo_index); 1145 + spin_unlock_irqrestore(&up->echo_skb_lock, flags); 1146 + 1147 + /* transmit it */ 1148 + usb_anchor_urb(urb, &up->tx_urbs); 1149 + ret = usb_submit_urb(urb, GFP_ATOMIC); 1150 + 1151 + /* cleanup urb */ 1152 + if (ret) { 1153 + /* on error, clean up */ 1154 + usb_unanchor_urb(urb); 1155 + ucan_clean_up_tx_urb(up, urb); 1156 + if (!ucan_release_context(up, context)) 1157 + netdev_err(up->netdev, 1158 + "xmit err: failed to release context\n"); 1159 + 1160 + /* remove the skb from the echo stack - this also 1161 + * frees the skb 1162 + */ 1163 + spin_lock_irqsave(&up->echo_skb_lock, flags); 1164 + can_free_echo_skb(up->netdev, echo_index); 1165 + spin_unlock_irqrestore(&up->echo_skb_lock, flags); 1166 + 1167 + if (ret == -ENODEV) { 1168 + netif_device_detach(up->netdev); 1169 + } else { 1170 + netdev_warn(up->netdev, 1171 + "xmit err: failed to submit urb %d\n", 1172 + ret); 1173 + up->netdev->stats.tx_dropped++; 1174 + } 1175 + return NETDEV_TX_OK; 1176 + } 1177 + 1178 + netif_trans_update(netdev); 1179 + 1180 + /* release ref, as we do not need the urb anymore */ 1181 + usb_free_urb(urb); 1182 + 1183 + return NETDEV_TX_OK; 1184 + 1185 + drop: 1186 + if (!ucan_release_context(up, context)) 1187 + netdev_err(up->netdev, 1188 + "xmit drop: failed to release context\n"); 1189 + dev_kfree_skb(skb); 1190 + up->netdev->stats.tx_dropped++; 1191 + 1192 + return NETDEV_TX_OK; 1193 + } 1194 + 1195 + /* Device goes down 1196 + * 1197 + * Clean up used resources 1198 + */ 1199 + static int ucan_close(struct net_device *netdev) 1200 + { 1201 + int ret; 1202 + struct ucan_priv *up = netdev_priv(netdev); 1203 + 1204 + up->can.state = CAN_STATE_STOPPED; 1205 + 1206 + /* stop sending data */ 1207 + usb_kill_anchored_urbs(&up->tx_urbs); 1208 + 1209 + /* stop receiving data */ 1210 + usb_kill_anchored_urbs(&up->rx_urbs); 1211 + 1212 + /* stop and reset can device */ 1213 + ret = ucan_ctrl_command_out(up, UCAN_COMMAND_STOP, 0, 0); 1214 + if (ret < 0) 1215 + netdev_err(up->netdev, 1216 + "could not stop device, code: %d\n", 1217 + ret); 1218 + 1219 + ret = ucan_ctrl_command_out(up, UCAN_COMMAND_RESET, 0, 0); 1220 + if (ret < 0) 1221 + netdev_err(up->netdev, 1222 + "could not reset device, code: %d\n", 1223 + ret); 1224 + 1225 + netif_stop_queue(netdev); 1226 + 1227 + ucan_release_context_array(up); 1228 + 1229 + close_candev(up->netdev); 1230 + return 0; 1231 + } 1232 + 1233 + /* CAN driver callbacks */ 1234 + static const struct net_device_ops ucan_netdev_ops = { 1235 + .ndo_open = ucan_open, 1236 + .ndo_stop = ucan_close, 1237 + .ndo_start_xmit = ucan_start_xmit, 1238 + .ndo_change_mtu = can_change_mtu, 1239 + }; 1240 + 1241 + /* Request to set bittiming 1242 + * 1243 + * This function generates an USB set bittiming message and transmits 1244 + * it to the device 1245 + */ 1246 + static int ucan_set_bittiming(struct net_device *netdev) 1247 + { 1248 + int ret; 1249 + struct ucan_priv *up = netdev_priv(netdev); 1250 + struct ucan_ctl_cmd_set_bittiming *cmd_set_bittiming; 1251 + 1252 + cmd_set_bittiming = &up->ctl_msg_buffer->cmd_set_bittiming; 1253 + cmd_set_bittiming->tq = cpu_to_le32(up->can.bittiming.tq); 1254 + cmd_set_bittiming->brp = cpu_to_le16(up->can.bittiming.brp); 1255 + cmd_set_bittiming->sample_point = 1256 + cpu_to_le16(up->can.bittiming.sample_point); 1257 + cmd_set_bittiming->prop_seg = up->can.bittiming.prop_seg; 1258 + cmd_set_bittiming->phase_seg1 = up->can.bittiming.phase_seg1; 1259 + cmd_set_bittiming->phase_seg2 = up->can.bittiming.phase_seg2; 1260 + cmd_set_bittiming->sjw = up->can.bittiming.sjw; 1261 + 1262 + ret = ucan_ctrl_command_out(up, UCAN_COMMAND_SET_BITTIMING, 0, 1263 + sizeof(*cmd_set_bittiming)); 1264 + return (ret < 0) ? ret : 0; 1265 + } 1266 + 1267 + /* Restart the device to get it out of BUS-OFF state. 1268 + * Called when the user runs "ip link set can1 type can restart". 1269 + */ 1270 + static int ucan_set_mode(struct net_device *netdev, enum can_mode mode) 1271 + { 1272 + int ret; 1273 + unsigned long flags; 1274 + struct ucan_priv *up = netdev_priv(netdev); 1275 + 1276 + switch (mode) { 1277 + case CAN_MODE_START: 1278 + netdev_dbg(up->netdev, "restarting device\n"); 1279 + 1280 + ret = ucan_ctrl_command_out(up, UCAN_COMMAND_RESTART, 0, 0); 1281 + up->can.state = CAN_STATE_ERROR_ACTIVE; 1282 + 1283 + /* check if queue can be restarted, 1284 + * up->available_tx_urbs must be protected by the 1285 + * lock 1286 + */ 1287 + spin_lock_irqsave(&up->context_lock, flags); 1288 + 1289 + if (up->available_tx_urbs > 0) 1290 + netif_wake_queue(up->netdev); 1291 + 1292 + spin_unlock_irqrestore(&up->context_lock, flags); 1293 + 1294 + return ret; 1295 + default: 1296 + return -EOPNOTSUPP; 1297 + } 1298 + } 1299 + 1300 + /* Probe the device, reset it and gather general device information */ 1301 + static int ucan_probe(struct usb_interface *intf, 1302 + const struct usb_device_id *id) 1303 + { 1304 + int ret; 1305 + int i; 1306 + u32 protocol_version; 1307 + struct usb_device *udev; 1308 + struct net_device *netdev; 1309 + struct usb_host_interface *iface_desc; 1310 + struct ucan_priv *up; 1311 + struct usb_endpoint_descriptor *ep; 1312 + u16 in_ep_size; 1313 + u16 out_ep_size; 1314 + u8 in_ep_addr; 1315 + u8 out_ep_addr; 1316 + union ucan_ctl_payload *ctl_msg_buffer; 1317 + char firmware_str[sizeof(union ucan_ctl_payload) + 1]; 1318 + 1319 + udev = interface_to_usbdev(intf); 1320 + 1321 + /* Stage 1 - Interface Parsing 1322 + * --------------------------- 1323 + * 1324 + * Identifie the device USB interface descriptor and its 1325 + * endpoints. Probing is aborted on errors. 1326 + */ 1327 + 1328 + /* check if the interface is sane */ 1329 + iface_desc = intf->cur_altsetting; 1330 + if (!iface_desc) 1331 + return -ENODEV; 1332 + 1333 + dev_info(&udev->dev, 1334 + "%s: probing device on interface #%d\n", 1335 + UCAN_DRIVER_NAME, 1336 + iface_desc->desc.bInterfaceNumber); 1337 + 1338 + /* interface sanity check */ 1339 + if (iface_desc->desc.bNumEndpoints != 2) { 1340 + dev_err(&udev->dev, 1341 + "%s: invalid EP count (%d)", 1342 + UCAN_DRIVER_NAME, iface_desc->desc.bNumEndpoints); 1343 + goto err_firmware_needs_update; 1344 + } 1345 + 1346 + /* check interface endpoints */ 1347 + in_ep_addr = 0; 1348 + out_ep_addr = 0; 1349 + in_ep_size = 0; 1350 + out_ep_size = 0; 1351 + for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { 1352 + ep = &iface_desc->endpoint[i].desc; 1353 + 1354 + if (((ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) != 0) && 1355 + ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == 1356 + USB_ENDPOINT_XFER_BULK)) { 1357 + /* In Endpoint */ 1358 + in_ep_addr = ep->bEndpointAddress; 1359 + in_ep_addr &= USB_ENDPOINT_NUMBER_MASK; 1360 + in_ep_size = le16_to_cpu(ep->wMaxPacketSize); 1361 + } else if (((ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == 1362 + 0) && 1363 + ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == 1364 + USB_ENDPOINT_XFER_BULK)) { 1365 + /* Out Endpoint */ 1366 + out_ep_addr = ep->bEndpointAddress; 1367 + out_ep_addr &= USB_ENDPOINT_NUMBER_MASK; 1368 + out_ep_size = le16_to_cpu(ep->wMaxPacketSize); 1369 + } 1370 + } 1371 + 1372 + /* check if interface is sane */ 1373 + if (!in_ep_addr || !out_ep_addr) { 1374 + dev_err(&udev->dev, "%s: invalid endpoint configuration\n", 1375 + UCAN_DRIVER_NAME); 1376 + goto err_firmware_needs_update; 1377 + } 1378 + if (in_ep_size < sizeof(struct ucan_message_in)) { 1379 + dev_err(&udev->dev, "%s: invalid in_ep MaxPacketSize\n", 1380 + UCAN_DRIVER_NAME); 1381 + goto err_firmware_needs_update; 1382 + } 1383 + if (out_ep_size < sizeof(struct ucan_message_out)) { 1384 + dev_err(&udev->dev, "%s: invalid out_ep MaxPacketSize\n", 1385 + UCAN_DRIVER_NAME); 1386 + goto err_firmware_needs_update; 1387 + } 1388 + 1389 + /* Stage 2 - Device Identification 1390 + * ------------------------------- 1391 + * 1392 + * The device interface seems to be a ucan device. Do further 1393 + * compatibility checks. On error probing is aborted, on 1394 + * success this stage leaves the ctl_msg_buffer with the 1395 + * reported contents of a GET_INFO command (supported 1396 + * bittimings, tx_fifo depth). This information is used in 1397 + * Stage 3 for the final driver initialisation. 1398 + */ 1399 + 1400 + /* Prepare Memory for control transferes */ 1401 + ctl_msg_buffer = devm_kzalloc(&udev->dev, 1402 + sizeof(union ucan_ctl_payload), 1403 + GFP_KERNEL); 1404 + if (!ctl_msg_buffer) { 1405 + dev_err(&udev->dev, 1406 + "%s: failed to allocate control pipe memory\n", 1407 + UCAN_DRIVER_NAME); 1408 + return -ENOMEM; 1409 + } 1410 + 1411 + /* get protocol version 1412 + * 1413 + * note: ucan_ctrl_command_* wrappers cannot be used yet 1414 + * because `up` is initialised in Stage 3 1415 + */ 1416 + ret = usb_control_msg(udev, 1417 + usb_rcvctrlpipe(udev, 0), 1418 + UCAN_COMMAND_GET, 1419 + USB_DIR_IN | USB_TYPE_VENDOR | 1420 + USB_RECIP_INTERFACE, 1421 + UCAN_COMMAND_GET_PROTOCOL_VERSION, 1422 + iface_desc->desc.bInterfaceNumber, 1423 + ctl_msg_buffer, 1424 + sizeof(union ucan_ctl_payload), 1425 + UCAN_USB_CTL_PIPE_TIMEOUT); 1426 + 1427 + /* older firmware version do not support this command - those 1428 + * are not supported by this drive 1429 + */ 1430 + if (ret != 4) { 1431 + dev_err(&udev->dev, 1432 + "%s: could not read protocol version, ret=%d\n", 1433 + UCAN_DRIVER_NAME, ret); 1434 + if (ret >= 0) 1435 + ret = -EINVAL; 1436 + goto err_firmware_needs_update; 1437 + } 1438 + 1439 + /* this driver currently supports protocol version 3 only */ 1440 + protocol_version = 1441 + le32_to_cpu(ctl_msg_buffer->cmd_get_protocol_version.version); 1442 + if (protocol_version < UCAN_PROTOCOL_VERSION_MIN || 1443 + protocol_version > UCAN_PROTOCOL_VERSION_MAX) { 1444 + dev_err(&udev->dev, 1445 + "%s: device protocol version %d is not supported\n", 1446 + UCAN_DRIVER_NAME, protocol_version); 1447 + goto err_firmware_needs_update; 1448 + } 1449 + 1450 + /* request the device information and store it in ctl_msg_buffer 1451 + * 1452 + * note: ucan_ctrl_command_* wrappers connot be used yet 1453 + * because `up` is initialised in Stage 3 1454 + */ 1455 + ret = usb_control_msg(udev, 1456 + usb_rcvctrlpipe(udev, 0), 1457 + UCAN_COMMAND_GET, 1458 + USB_DIR_IN | USB_TYPE_VENDOR | 1459 + USB_RECIP_INTERFACE, 1460 + UCAN_COMMAND_GET_INFO, 1461 + iface_desc->desc.bInterfaceNumber, 1462 + ctl_msg_buffer, 1463 + sizeof(ctl_msg_buffer->cmd_get_device_info), 1464 + UCAN_USB_CTL_PIPE_TIMEOUT); 1465 + 1466 + if (ret < 0) { 1467 + dev_err(&udev->dev, "%s: failed to retrieve device info\n", 1468 + UCAN_DRIVER_NAME); 1469 + goto err_firmware_needs_update; 1470 + } 1471 + if (ret < sizeof(ctl_msg_buffer->cmd_get_device_info)) { 1472 + dev_err(&udev->dev, "%s: device reported invalid device info\n", 1473 + UCAN_DRIVER_NAME); 1474 + goto err_firmware_needs_update; 1475 + } 1476 + if (ctl_msg_buffer->cmd_get_device_info.tx_fifo == 0) { 1477 + dev_err(&udev->dev, 1478 + "%s: device reported invalid tx-fifo size\n", 1479 + UCAN_DRIVER_NAME); 1480 + goto err_firmware_needs_update; 1481 + } 1482 + 1483 + /* Stage 3 - Driver Initialisation 1484 + * ------------------------------- 1485 + * 1486 + * Register device to Linux, prepare private structures and 1487 + * reset the device. 1488 + */ 1489 + 1490 + /* allocate driver resources */ 1491 + netdev = alloc_candev(sizeof(struct ucan_priv), 1492 + ctl_msg_buffer->cmd_get_device_info.tx_fifo); 1493 + if (!netdev) { 1494 + dev_err(&udev->dev, 1495 + "%s: cannot allocate candev\n", UCAN_DRIVER_NAME); 1496 + return -ENOMEM; 1497 + } 1498 + 1499 + up = netdev_priv(netdev); 1500 + 1501 + /* initialze data */ 1502 + up->udev = udev; 1503 + up->intf = intf; 1504 + up->netdev = netdev; 1505 + up->intf_index = iface_desc->desc.bInterfaceNumber; 1506 + up->in_ep_addr = in_ep_addr; 1507 + up->out_ep_addr = out_ep_addr; 1508 + up->in_ep_size = in_ep_size; 1509 + up->ctl_msg_buffer = ctl_msg_buffer; 1510 + up->context_array = NULL; 1511 + up->available_tx_urbs = 0; 1512 + 1513 + up->can.state = CAN_STATE_STOPPED; 1514 + up->can.bittiming_const = &up->device_info.bittiming_const; 1515 + up->can.do_set_bittiming = ucan_set_bittiming; 1516 + up->can.do_set_mode = &ucan_set_mode; 1517 + spin_lock_init(&up->context_lock); 1518 + spin_lock_init(&up->echo_skb_lock); 1519 + netdev->netdev_ops = &ucan_netdev_ops; 1520 + 1521 + usb_set_intfdata(intf, up); 1522 + SET_NETDEV_DEV(netdev, &intf->dev); 1523 + 1524 + /* parse device information 1525 + * the data retrieved in Stage 2 is still available in 1526 + * up->ctl_msg_buffer 1527 + */ 1528 + ucan_parse_device_info(up, &ctl_msg_buffer->cmd_get_device_info); 1529 + 1530 + /* just print some device information - if available */ 1531 + ret = ucan_device_request_in(up, UCAN_DEVICE_GET_FW_STRING, 0, 1532 + sizeof(union ucan_ctl_payload)); 1533 + if (ret > 0) { 1534 + /* copy string while ensuring zero terminiation */ 1535 + strncpy(firmware_str, up->ctl_msg_buffer->raw, 1536 + sizeof(union ucan_ctl_payload)); 1537 + firmware_str[sizeof(union ucan_ctl_payload)] = '\0'; 1538 + } else { 1539 + strcpy(firmware_str, "unknown"); 1540 + } 1541 + 1542 + /* device is compatible, reset it */ 1543 + ret = ucan_ctrl_command_out(up, UCAN_COMMAND_RESET, 0, 0); 1544 + if (ret < 0) 1545 + goto err_free_candev; 1546 + 1547 + init_usb_anchor(&up->rx_urbs); 1548 + init_usb_anchor(&up->tx_urbs); 1549 + 1550 + up->can.state = CAN_STATE_STOPPED; 1551 + 1552 + /* register the device */ 1553 + ret = register_candev(netdev); 1554 + if (ret) 1555 + goto err_free_candev; 1556 + 1557 + /* initialisation complete, log device info */ 1558 + netdev_info(up->netdev, "registered device\n"); 1559 + netdev_info(up->netdev, "firmware string: %s\n", firmware_str); 1560 + 1561 + /* success */ 1562 + return 0; 1563 + 1564 + err_free_candev: 1565 + free_candev(netdev); 1566 + return ret; 1567 + 1568 + err_firmware_needs_update: 1569 + dev_err(&udev->dev, 1570 + "%s: probe failed; try to update the device firmware\n", 1571 + UCAN_DRIVER_NAME); 1572 + return -ENODEV; 1573 + } 1574 + 1575 + /* disconnect the device */ 1576 + static void ucan_disconnect(struct usb_interface *intf) 1577 + { 1578 + struct usb_device *udev; 1579 + struct ucan_priv *up = usb_get_intfdata(intf); 1580 + 1581 + udev = interface_to_usbdev(intf); 1582 + 1583 + usb_set_intfdata(intf, NULL); 1584 + 1585 + if (up) { 1586 + unregister_netdev(up->netdev); 1587 + free_candev(up->netdev); 1588 + } 1589 + } 1590 + 1591 + static struct usb_device_id ucan_table[] = { 1592 + /* Mule (soldered onto compute modules) */ 1593 + {USB_DEVICE_INTERFACE_NUMBER(0x2294, 0x425a, 0)}, 1594 + /* Seal (standalone USB stick) */ 1595 + {USB_DEVICE_INTERFACE_NUMBER(0x2294, 0x425b, 0)}, 1596 + {} /* Terminating entry */ 1597 + }; 1598 + 1599 + MODULE_DEVICE_TABLE(usb, ucan_table); 1600 + /* driver callbacks */ 1601 + static struct usb_driver ucan_driver = { 1602 + .name = UCAN_DRIVER_NAME, 1603 + .probe = ucan_probe, 1604 + .disconnect = ucan_disconnect, 1605 + .id_table = ucan_table, 1606 + }; 1607 + 1608 + module_usb_driver(ucan_driver); 1609 + 1610 + MODULE_LICENSE("GPL v2"); 1611 + MODULE_AUTHOR("Martin Elshuber <martin.elshuber@theobroma-systems.com>"); 1612 + MODULE_AUTHOR("Jakob Unterwurzacher <jakob.unterwurzacher@theobroma-systems.com>"); 1613 + MODULE_DESCRIPTION("Driver for Theobroma Systems UCAN devices");