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