blob: f57ce556c6785453ffab7f8e5a4d17b1c7d1986b [file] [log] [blame]
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001/*
2 * This program is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU General Public License as
4 * published by the Free Software Foundation version 2.
5 *
6 * Parts of this driver are based on the following:
7 * - Kvaser linux leaf driver (version 4.78)
8 * - CAN driver for esd CAN-USB/2
9 *
10 * Copyright (C) 2002-2006 KVASER AB, Sweden. All rights reserved.
11 * Copyright (C) 2010 Matthias Fuchs <matthias.fuchs@esd.eu>, esd gmbh
12 * Copyright (C) 2012 Olivier Sobrie <olivier@sobrie.be>
13 */
14
Olivier Sobrie080f40a2012-11-21 08:11:13 +010015#include <linux/completion.h>
16#include <linux/module.h>
17#include <linux/netdevice.h>
18#include <linux/usb.h>
19
20#include <linux/can.h>
21#include <linux/can/dev.h>
22#include <linux/can/error.h>
23
24#define MAX_TX_URBS 16
25#define MAX_RX_URBS 4
26#define START_TIMEOUT 1000 /* msecs */
27#define STOP_TIMEOUT 1000 /* msecs */
28#define USB_SEND_TIMEOUT 1000 /* msecs */
29#define USB_RECV_TIMEOUT 1000 /* msecs */
30#define RX_BUFFER_SIZE 3072
31#define CAN_USB_CLOCK 8000000
32#define MAX_NET_DEVICES 3
33
34/* Kvaser USB devices */
35#define KVASER_VENDOR_ID 0x0bfd
36#define USB_LEAF_DEVEL_PRODUCT_ID 10
37#define USB_LEAF_LITE_PRODUCT_ID 11
38#define USB_LEAF_PRO_PRODUCT_ID 12
39#define USB_LEAF_SPRO_PRODUCT_ID 14
40#define USB_LEAF_PRO_LS_PRODUCT_ID 15
41#define USB_LEAF_PRO_SWC_PRODUCT_ID 16
42#define USB_LEAF_PRO_LIN_PRODUCT_ID 17
43#define USB_LEAF_SPRO_LS_PRODUCT_ID 18
44#define USB_LEAF_SPRO_SWC_PRODUCT_ID 19
45#define USB_MEMO2_DEVEL_PRODUCT_ID 22
46#define USB_MEMO2_HSHS_PRODUCT_ID 23
47#define USB_UPRO_HSHS_PRODUCT_ID 24
48#define USB_LEAF_LITE_GI_PRODUCT_ID 25
49#define USB_LEAF_PRO_OBDII_PRODUCT_ID 26
50#define USB_MEMO2_HSLS_PRODUCT_ID 27
51#define USB_LEAF_LITE_CH_PRODUCT_ID 28
52#define USB_BLACKBIRD_SPRO_PRODUCT_ID 29
53#define USB_OEM_MERCURY_PRODUCT_ID 34
54#define USB_OEM_LEAF_PRODUCT_ID 35
55#define USB_CAN_R_PRODUCT_ID 39
Olivier Sobrieb4f20132014-04-10 21:44:22 +020056#define USB_LEAF_LITE_V2_PRODUCT_ID 288
57#define USB_MINI_PCIE_HS_PRODUCT_ID 289
Olivier Sobrie080f40a2012-11-21 08:11:13 +010058
59/* USB devices features */
60#define KVASER_HAS_SILENT_MODE BIT(0)
61#define KVASER_HAS_TXRX_ERRORS BIT(1)
62
63/* Message header size */
64#define MSG_HEADER_LEN 2
65
66/* Can message flags */
67#define MSG_FLAG_ERROR_FRAME BIT(0)
68#define MSG_FLAG_OVERRUN BIT(1)
69#define MSG_FLAG_NERR BIT(2)
70#define MSG_FLAG_WAKEUP BIT(3)
71#define MSG_FLAG_REMOTE_FRAME BIT(4)
72#define MSG_FLAG_RESERVED BIT(5)
73#define MSG_FLAG_TX_ACK BIT(6)
74#define MSG_FLAG_TX_REQUEST BIT(7)
75
76/* Can states */
77#define M16C_STATE_BUS_RESET BIT(0)
78#define M16C_STATE_BUS_ERROR BIT(4)
79#define M16C_STATE_BUS_PASSIVE BIT(5)
80#define M16C_STATE_BUS_OFF BIT(6)
81
82/* Can msg ids */
83#define CMD_RX_STD_MESSAGE 12
84#define CMD_TX_STD_MESSAGE 13
85#define CMD_RX_EXT_MESSAGE 14
86#define CMD_TX_EXT_MESSAGE 15
87#define CMD_SET_BUS_PARAMS 16
88#define CMD_GET_BUS_PARAMS 17
89#define CMD_GET_BUS_PARAMS_REPLY 18
90#define CMD_GET_CHIP_STATE 19
91#define CMD_CHIP_STATE_EVENT 20
92#define CMD_SET_CTRL_MODE 21
93#define CMD_GET_CTRL_MODE 22
94#define CMD_GET_CTRL_MODE_REPLY 23
95#define CMD_RESET_CHIP 24
96#define CMD_RESET_CARD 25
97#define CMD_START_CHIP 26
98#define CMD_START_CHIP_REPLY 27
99#define CMD_STOP_CHIP 28
100#define CMD_STOP_CHIP_REPLY 29
101#define CMD_GET_CARD_INFO2 32
102#define CMD_GET_CARD_INFO 34
103#define CMD_GET_CARD_INFO_REPLY 35
104#define CMD_GET_SOFTWARE_INFO 38
105#define CMD_GET_SOFTWARE_INFO_REPLY 39
106#define CMD_ERROR_EVENT 45
107#define CMD_FLUSH_QUEUE 48
108#define CMD_RESET_ERROR_COUNTER 49
109#define CMD_TX_ACKNOWLEDGE 50
110#define CMD_CAN_ERROR_EVENT 51
111#define CMD_USB_THROTTLE 77
112#define CMD_LOG_MESSAGE 106
113
114/* error factors */
115#define M16C_EF_ACKE BIT(0)
116#define M16C_EF_CRCE BIT(1)
117#define M16C_EF_FORME BIT(2)
118#define M16C_EF_STFE BIT(3)
119#define M16C_EF_BITE0 BIT(4)
120#define M16C_EF_BITE1 BIT(5)
121#define M16C_EF_RCVE BIT(6)
122#define M16C_EF_TRE BIT(7)
123
124/* bittiming parameters */
125#define KVASER_USB_TSEG1_MIN 1
126#define KVASER_USB_TSEG1_MAX 16
127#define KVASER_USB_TSEG2_MIN 1
128#define KVASER_USB_TSEG2_MAX 8
129#define KVASER_USB_SJW_MAX 4
130#define KVASER_USB_BRP_MIN 1
131#define KVASER_USB_BRP_MAX 64
132#define KVASER_USB_BRP_INC 1
133
134/* ctrl modes */
135#define KVASER_CTRL_MODE_NORMAL 1
136#define KVASER_CTRL_MODE_SILENT 2
137#define KVASER_CTRL_MODE_SELFRECEPTION 3
138#define KVASER_CTRL_MODE_OFF 4
139
Jonas Petersona90f13b2013-05-07 22:05:23 +0200140/* log message */
141#define KVASER_EXTENDED_FRAME BIT(31)
142
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100143struct kvaser_msg_simple {
144 u8 tid;
145 u8 channel;
146} __packed;
147
148struct kvaser_msg_cardinfo {
149 u8 tid;
150 u8 nchannels;
151 __le32 serial_number;
152 __le32 padding;
153 __le32 clock_resolution;
154 __le32 mfgdate;
155 u8 ean[8];
156 u8 hw_revision;
157 u8 usb_hs_mode;
158 __le16 padding2;
159} __packed;
160
161struct kvaser_msg_cardinfo2 {
162 u8 tid;
163 u8 channel;
164 u8 pcb_id[24];
165 __le32 oem_unlock_code;
166} __packed;
167
168struct kvaser_msg_softinfo {
169 u8 tid;
170 u8 channel;
171 __le32 sw_options;
172 __le32 fw_version;
173 __le16 max_outstanding_tx;
174 __le16 padding[9];
175} __packed;
176
177struct kvaser_msg_busparams {
178 u8 tid;
179 u8 channel;
180 __le32 bitrate;
181 u8 tseg1;
182 u8 tseg2;
183 u8 sjw;
184 u8 no_samp;
185} __packed;
186
187struct kvaser_msg_tx_can {
188 u8 channel;
189 u8 tid;
190 u8 msg[14];
191 u8 padding;
192 u8 flags;
193} __packed;
194
195struct kvaser_msg_rx_can {
196 u8 channel;
197 u8 flag;
198 __le16 time[3];
199 u8 msg[14];
200} __packed;
201
202struct kvaser_msg_chip_state_event {
203 u8 tid;
204 u8 channel;
205 __le16 time[3];
206 u8 tx_errors_count;
207 u8 rx_errors_count;
208 u8 status;
209 u8 padding[3];
210} __packed;
211
212struct kvaser_msg_tx_acknowledge {
213 u8 channel;
214 u8 tid;
215 __le16 time[3];
216 u8 flags;
217 u8 time_offset;
218} __packed;
219
220struct kvaser_msg_error_event {
221 u8 tid;
222 u8 flags;
223 __le16 time[3];
224 u8 channel;
225 u8 padding;
226 u8 tx_errors_count;
227 u8 rx_errors_count;
228 u8 status;
229 u8 error_factor;
230} __packed;
231
232struct kvaser_msg_ctrl_mode {
233 u8 tid;
234 u8 channel;
235 u8 ctrl_mode;
236 u8 padding[3];
237} __packed;
238
239struct kvaser_msg_flush_queue {
240 u8 tid;
241 u8 channel;
242 u8 flags;
243 u8 padding[3];
244} __packed;
245
246struct kvaser_msg_log_message {
247 u8 channel;
248 u8 flags;
249 __le16 time[3];
250 u8 dlc;
251 u8 time_offset;
252 __le32 id;
253 u8 data[8];
254} __packed;
255
256struct kvaser_msg {
257 u8 len;
258 u8 id;
259 union {
260 struct kvaser_msg_simple simple;
261 struct kvaser_msg_cardinfo cardinfo;
262 struct kvaser_msg_cardinfo2 cardinfo2;
263 struct kvaser_msg_softinfo softinfo;
264 struct kvaser_msg_busparams busparams;
265 struct kvaser_msg_tx_can tx_can;
266 struct kvaser_msg_rx_can rx_can;
267 struct kvaser_msg_chip_state_event chip_state_event;
268 struct kvaser_msg_tx_acknowledge tx_acknowledge;
269 struct kvaser_msg_error_event error_event;
270 struct kvaser_msg_ctrl_mode ctrl_mode;
271 struct kvaser_msg_flush_queue flush_queue;
272 struct kvaser_msg_log_message log_message;
273 } u;
274} __packed;
275
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200276struct kvaser_usb_error_summary {
277 u8 channel, status, txerr, rxerr, error_factor;
278};
279
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100280struct kvaser_usb_tx_urb_context {
281 struct kvaser_usb_net_priv *priv;
282 u32 echo_index;
283 int dlc;
284};
285
286struct kvaser_usb {
287 struct usb_device *udev;
288 struct kvaser_usb_net_priv *nets[MAX_NET_DEVICES];
289
290 struct usb_endpoint_descriptor *bulk_in, *bulk_out;
291 struct usb_anchor rx_submitted;
292
293 u32 fw_version;
294 unsigned int nchannels;
295
296 bool rxinitdone;
297 void *rxbuf[MAX_RX_URBS];
298 dma_addr_t rxbuf_dma[MAX_RX_URBS];
299};
300
301struct kvaser_usb_net_priv {
302 struct can_priv can;
303
304 atomic_t active_tx_urbs;
305 struct usb_anchor tx_submitted;
306 struct kvaser_usb_tx_urb_context tx_contexts[MAX_TX_URBS];
307
308 struct completion start_comp, stop_comp;
309
310 struct kvaser_usb *dev;
311 struct net_device *netdev;
312 int channel;
313
314 struct can_berr_counter bec;
315};
316
317static const struct usb_device_id kvaser_usb_table[] = {
318 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_DEVEL_PRODUCT_ID) },
319 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_PRODUCT_ID) },
320 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_PRODUCT_ID),
321 .driver_info = KVASER_HAS_TXRX_ERRORS |
322 KVASER_HAS_SILENT_MODE },
323 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_PRODUCT_ID),
324 .driver_info = KVASER_HAS_TXRX_ERRORS |
325 KVASER_HAS_SILENT_MODE },
326 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LS_PRODUCT_ID),
327 .driver_info = KVASER_HAS_TXRX_ERRORS |
328 KVASER_HAS_SILENT_MODE },
329 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_SWC_PRODUCT_ID),
330 .driver_info = KVASER_HAS_TXRX_ERRORS |
331 KVASER_HAS_SILENT_MODE },
332 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LIN_PRODUCT_ID),
333 .driver_info = KVASER_HAS_TXRX_ERRORS |
334 KVASER_HAS_SILENT_MODE },
335 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_LS_PRODUCT_ID),
336 .driver_info = KVASER_HAS_TXRX_ERRORS |
337 KVASER_HAS_SILENT_MODE },
338 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_SWC_PRODUCT_ID),
339 .driver_info = KVASER_HAS_TXRX_ERRORS |
340 KVASER_HAS_SILENT_MODE },
341 { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_DEVEL_PRODUCT_ID),
342 .driver_info = KVASER_HAS_TXRX_ERRORS |
343 KVASER_HAS_SILENT_MODE },
344 { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSHS_PRODUCT_ID),
345 .driver_info = KVASER_HAS_TXRX_ERRORS |
346 KVASER_HAS_SILENT_MODE },
347 { USB_DEVICE(KVASER_VENDOR_ID, USB_UPRO_HSHS_PRODUCT_ID),
348 .driver_info = KVASER_HAS_TXRX_ERRORS },
349 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_GI_PRODUCT_ID) },
350 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_OBDII_PRODUCT_ID),
351 .driver_info = KVASER_HAS_TXRX_ERRORS |
352 KVASER_HAS_SILENT_MODE },
353 { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSLS_PRODUCT_ID),
354 .driver_info = KVASER_HAS_TXRX_ERRORS },
355 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_CH_PRODUCT_ID),
356 .driver_info = KVASER_HAS_TXRX_ERRORS },
357 { USB_DEVICE(KVASER_VENDOR_ID, USB_BLACKBIRD_SPRO_PRODUCT_ID),
358 .driver_info = KVASER_HAS_TXRX_ERRORS },
359 { USB_DEVICE(KVASER_VENDOR_ID, USB_OEM_MERCURY_PRODUCT_ID),
360 .driver_info = KVASER_HAS_TXRX_ERRORS },
361 { USB_DEVICE(KVASER_VENDOR_ID, USB_OEM_LEAF_PRODUCT_ID),
362 .driver_info = KVASER_HAS_TXRX_ERRORS },
363 { USB_DEVICE(KVASER_VENDOR_ID, USB_CAN_R_PRODUCT_ID),
364 .driver_info = KVASER_HAS_TXRX_ERRORS },
Olivier Sobrieb4f20132014-04-10 21:44:22 +0200365 { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_V2_PRODUCT_ID) },
366 { USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_HS_PRODUCT_ID) },
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100367 { }
368};
369MODULE_DEVICE_TABLE(usb, kvaser_usb_table);
370
371static inline int kvaser_usb_send_msg(const struct kvaser_usb *dev,
372 struct kvaser_msg *msg)
373{
374 int actual_len;
375
376 return usb_bulk_msg(dev->udev,
377 usb_sndbulkpipe(dev->udev,
378 dev->bulk_out->bEndpointAddress),
379 msg, msg->len, &actual_len,
380 USB_SEND_TIMEOUT);
381}
382
383static int kvaser_usb_wait_msg(const struct kvaser_usb *dev, u8 id,
384 struct kvaser_msg *msg)
385{
386 struct kvaser_msg *tmp;
387 void *buf;
388 int actual_len;
389 int err;
Olivier Sobriee59e36e2014-04-10 21:44:21 +0200390 int pos;
391 unsigned long to = jiffies + msecs_to_jiffies(USB_RECV_TIMEOUT);
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100392
393 buf = kzalloc(RX_BUFFER_SIZE, GFP_KERNEL);
394 if (!buf)
395 return -ENOMEM;
396
Olivier Sobriee59e36e2014-04-10 21:44:21 +0200397 do {
398 err = usb_bulk_msg(dev->udev,
399 usb_rcvbulkpipe(dev->udev,
400 dev->bulk_in->bEndpointAddress),
401 buf, RX_BUFFER_SIZE, &actual_len,
402 USB_RECV_TIMEOUT);
403 if (err < 0)
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100404 goto end;
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100405
Olivier Sobriee59e36e2014-04-10 21:44:21 +0200406 pos = 0;
407 while (pos <= actual_len - MSG_HEADER_LEN) {
408 tmp = buf + pos;
409
410 if (!tmp->len)
411 break;
412
413 if (pos + tmp->len > actual_len) {
414 dev_err(dev->udev->dev.parent,
415 "Format error\n");
416 break;
417 }
418
419 if (tmp->id == id) {
420 memcpy(msg, tmp, tmp->len);
421 goto end;
422 }
423
424 pos += tmp->len;
425 }
426 } while (time_before(jiffies, to));
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100427
428 err = -EINVAL;
429
430end:
431 kfree(buf);
432
433 return err;
434}
435
436static int kvaser_usb_send_simple_msg(const struct kvaser_usb *dev,
437 u8 msg_id, int channel)
438{
439 struct kvaser_msg *msg;
440 int rc;
441
442 msg = kmalloc(sizeof(*msg), GFP_KERNEL);
443 if (!msg)
444 return -ENOMEM;
445
446 msg->id = msg_id;
447 msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_simple);
448 msg->u.simple.channel = channel;
449 msg->u.simple.tid = 0xff;
450
451 rc = kvaser_usb_send_msg(dev, msg);
452
453 kfree(msg);
454 return rc;
455}
456
457static int kvaser_usb_get_software_info(struct kvaser_usb *dev)
458{
459 struct kvaser_msg msg;
460 int err;
461
462 err = kvaser_usb_send_simple_msg(dev, CMD_GET_SOFTWARE_INFO, 0);
463 if (err)
464 return err;
465
466 err = kvaser_usb_wait_msg(dev, CMD_GET_SOFTWARE_INFO_REPLY, &msg);
467 if (err)
468 return err;
469
470 dev->fw_version = le32_to_cpu(msg.u.softinfo.fw_version);
471
472 return 0;
473}
474
475static int kvaser_usb_get_card_info(struct kvaser_usb *dev)
476{
477 struct kvaser_msg msg;
478 int err;
479
480 err = kvaser_usb_send_simple_msg(dev, CMD_GET_CARD_INFO, 0);
481 if (err)
482 return err;
483
484 err = kvaser_usb_wait_msg(dev, CMD_GET_CARD_INFO_REPLY, &msg);
485 if (err)
486 return err;
487
488 dev->nchannels = msg.u.cardinfo.nchannels;
Olivier Sobrie862474f82014-02-11 11:01:23 +0100489 if (dev->nchannels > MAX_NET_DEVICES)
490 return -EINVAL;
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100491
492 return 0;
493}
494
495static void kvaser_usb_tx_acknowledge(const struct kvaser_usb *dev,
496 const struct kvaser_msg *msg)
497{
498 struct net_device_stats *stats;
499 struct kvaser_usb_tx_urb_context *context;
500 struct kvaser_usb_net_priv *priv;
501 struct sk_buff *skb;
502 struct can_frame *cf;
503 u8 channel = msg->u.tx_acknowledge.channel;
504 u8 tid = msg->u.tx_acknowledge.tid;
505
506 if (channel >= dev->nchannels) {
507 dev_err(dev->udev->dev.parent,
508 "Invalid channel number (%d)\n", channel);
509 return;
510 }
511
512 priv = dev->nets[channel];
513
514 if (!netif_device_present(priv->netdev))
515 return;
516
517 stats = &priv->netdev->stats;
518
519 context = &priv->tx_contexts[tid % MAX_TX_URBS];
520
521 /* Sometimes the state change doesn't come after a bus-off event */
522 if (priv->can.restart_ms &&
523 (priv->can.state >= CAN_STATE_BUS_OFF)) {
524 skb = alloc_can_err_skb(priv->netdev, &cf);
525 if (skb) {
526 cf->can_id |= CAN_ERR_RESTARTED;
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100527
528 stats->rx_packets++;
529 stats->rx_bytes += cf->can_dlc;
Ahmed S. Darwisha58518c2015-01-11 15:49:52 -0500530 netif_rx(skb);
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100531 } else {
532 netdev_err(priv->netdev,
533 "No memory left for err_skb\n");
534 }
535
536 priv->can.can_stats.restarts++;
537 netif_carrier_on(priv->netdev);
538
539 priv->can.state = CAN_STATE_ERROR_ACTIVE;
540 }
541
542 stats->tx_packets++;
543 stats->tx_bytes += context->dlc;
544 can_get_echo_skb(priv->netdev, context->echo_index);
545
546 context->echo_index = MAX_TX_URBS;
547 atomic_dec(&priv->active_tx_urbs);
548
549 netif_wake_queue(priv->netdev);
550}
551
552static void kvaser_usb_simple_msg_callback(struct urb *urb)
553{
554 struct net_device *netdev = urb->context;
555
556 kfree(urb->transfer_buffer);
557
558 if (urb->status)
559 netdev_warn(netdev, "urb status received: %d\n",
560 urb->status);
561}
562
563static int kvaser_usb_simple_msg_async(struct kvaser_usb_net_priv *priv,
564 u8 msg_id)
565{
566 struct kvaser_usb *dev = priv->dev;
567 struct net_device *netdev = priv->netdev;
568 struct kvaser_msg *msg;
569 struct urb *urb;
570 void *buf;
571 int err;
572
573 urb = usb_alloc_urb(0, GFP_ATOMIC);
574 if (!urb) {
575 netdev_err(netdev, "No memory left for URBs\n");
576 return -ENOMEM;
577 }
578
579 buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC);
580 if (!buf) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100581 usb_free_urb(urb);
582 return -ENOMEM;
583 }
584
585 msg = (struct kvaser_msg *)buf;
586 msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_simple);
587 msg->id = msg_id;
588 msg->u.simple.channel = priv->channel;
589
590 usb_fill_bulk_urb(urb, dev->udev,
591 usb_sndbulkpipe(dev->udev,
592 dev->bulk_out->bEndpointAddress),
593 buf, msg->len,
Ahmed S. Darwish3803fa62015-01-26 07:22:54 +0200594 kvaser_usb_simple_msg_callback, netdev);
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100595 usb_anchor_urb(urb, &priv->tx_submitted);
596
597 err = usb_submit_urb(urb, GFP_ATOMIC);
598 if (err) {
599 netdev_err(netdev, "Error transmitting URB\n");
600 usb_unanchor_urb(urb);
601 usb_free_urb(urb);
602 kfree(buf);
603 return err;
604 }
605
606 usb_free_urb(urb);
607
608 return 0;
609}
610
611static void kvaser_usb_unlink_tx_urbs(struct kvaser_usb_net_priv *priv)
612{
613 int i;
614
615 usb_kill_anchored_urbs(&priv->tx_submitted);
616 atomic_set(&priv->active_tx_urbs, 0);
617
618 for (i = 0; i < MAX_TX_URBS; i++)
619 priv->tx_contexts[i].echo_index = MAX_TX_URBS;
620}
621
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200622static void kvaser_usb_rx_error_update_can_state(struct kvaser_usb_net_priv *priv,
623 const struct kvaser_usb_error_summary *es)
624{
625 struct net_device_stats *stats;
626 enum can_state new_state;
627
628 stats = &priv->netdev->stats;
629 new_state = priv->can.state;
630
631 netdev_dbg(priv->netdev, "Error status: 0x%02x\n", es->status);
632
633 if (es->status & (M16C_STATE_BUS_OFF | M16C_STATE_BUS_RESET)) {
634 priv->can.can_stats.bus_off++;
635 new_state = CAN_STATE_BUS_OFF;
636 } else if (es->status & M16C_STATE_BUS_PASSIVE) {
637 if (priv->can.state != CAN_STATE_ERROR_PASSIVE)
638 priv->can.can_stats.error_passive++;
639 new_state = CAN_STATE_ERROR_PASSIVE;
640 } else if (es->status & M16C_STATE_BUS_ERROR) {
641 if ((priv->can.state < CAN_STATE_ERROR_WARNING) &&
642 ((es->txerr >= 96) || (es->rxerr >= 96))) {
643 priv->can.can_stats.error_warning++;
644 new_state = CAN_STATE_ERROR_WARNING;
645 } else if ((priv->can.state > CAN_STATE_ERROR_ACTIVE) &&
646 ((es->txerr < 96) && (es->rxerr < 96))) {
647 new_state = CAN_STATE_ERROR_ACTIVE;
648 }
649 }
650
651 if (!es->status)
652 new_state = CAN_STATE_ERROR_ACTIVE;
653
654 if (priv->can.restart_ms &&
655 (priv->can.state >= CAN_STATE_BUS_OFF) &&
656 (new_state < CAN_STATE_BUS_OFF)) {
657 priv->can.can_stats.restarts++;
658 }
659
660 if (es->error_factor) {
661 priv->can.can_stats.bus_error++;
662 stats->rx_errors++;
663 }
664
665 priv->bec.txerr = es->txerr;
666 priv->bec.rxerr = es->rxerr;
667 priv->can.state = new_state;
668}
669
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100670static void kvaser_usb_rx_error(const struct kvaser_usb *dev,
671 const struct kvaser_msg *msg)
672{
673 struct can_frame *cf;
674 struct sk_buff *skb;
675 struct net_device_stats *stats;
676 struct kvaser_usb_net_priv *priv;
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200677 struct kvaser_usb_error_summary es = { };
678 enum can_state old_state;
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100679
680 switch (msg->id) {
681 case CMD_CAN_ERROR_EVENT:
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200682 es.channel = msg->u.error_event.channel;
683 es.status = msg->u.error_event.status;
684 es.txerr = msg->u.error_event.tx_errors_count;
685 es.rxerr = msg->u.error_event.rx_errors_count;
686 es.error_factor = msg->u.error_event.error_factor;
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100687 break;
688 case CMD_LOG_MESSAGE:
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200689 es.channel = msg->u.log_message.channel;
690 es.status = msg->u.log_message.data[0];
691 es.txerr = msg->u.log_message.data[2];
692 es.rxerr = msg->u.log_message.data[3];
693 es.error_factor = msg->u.log_message.data[1];
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100694 break;
695 case CMD_CHIP_STATE_EVENT:
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200696 es.channel = msg->u.chip_state_event.channel;
697 es.status = msg->u.chip_state_event.status;
698 es.txerr = msg->u.chip_state_event.tx_errors_count;
699 es.rxerr = msg->u.chip_state_event.rx_errors_count;
700 es.error_factor = 0;
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100701 break;
702 default:
703 dev_err(dev->udev->dev.parent, "Invalid msg id (%d)\n",
704 msg->id);
705 return;
706 }
707
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200708 if (es.channel >= dev->nchannels) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100709 dev_err(dev->udev->dev.parent,
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200710 "Invalid channel number (%d)\n", es.channel);
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100711 return;
712 }
713
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200714 priv = dev->nets[es.channel];
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100715 stats = &priv->netdev->stats;
716
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200717 /* Update all of the can interface's state and error counters before
718 * trying any skb allocation that can actually fail with -ENOMEM.
719 */
720 old_state = priv->can.state;
721 kvaser_usb_rx_error_update_can_state(priv, &es);
722
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100723 skb = alloc_can_err_skb(priv->netdev, &cf);
724 if (!skb) {
725 stats->rx_dropped++;
726 return;
727 }
728
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200729 if (es.status & (M16C_STATE_BUS_OFF | M16C_STATE_BUS_RESET)) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100730 cf->can_id |= CAN_ERR_BUSOFF;
731
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100732 if (!priv->can.restart_ms)
733 kvaser_usb_simple_msg_async(priv, CMD_STOP_CHIP);
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100734 netif_carrier_off(priv->netdev);
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200735 } else if (es.status & M16C_STATE_BUS_PASSIVE) {
736 if (old_state != CAN_STATE_ERROR_PASSIVE) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100737 cf->can_id |= CAN_ERR_CRTL;
738
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200739 if (es.txerr || es.rxerr)
740 cf->data[1] = (es.txerr > es.rxerr)
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100741 ? CAN_ERR_CRTL_TX_PASSIVE
742 : CAN_ERR_CRTL_RX_PASSIVE;
743 else
744 cf->data[1] = CAN_ERR_CRTL_TX_PASSIVE |
745 CAN_ERR_CRTL_RX_PASSIVE;
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100746 }
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200747 } else if (es.status & M16C_STATE_BUS_ERROR) {
748 if ((old_state < CAN_STATE_ERROR_WARNING) &&
749 ((es.txerr >= 96) || (es.rxerr >= 96))) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100750 cf->can_id |= CAN_ERR_CRTL;
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200751 cf->data[1] = (es.txerr > es.rxerr)
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100752 ? CAN_ERR_CRTL_TX_WARNING
753 : CAN_ERR_CRTL_RX_WARNING;
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200754 } else if ((old_state > CAN_STATE_ERROR_ACTIVE) &&
755 ((es.txerr < 96) && (es.rxerr < 96))) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100756 cf->can_id |= CAN_ERR_PROT;
757 cf->data[2] = CAN_ERR_PROT_ACTIVE;
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100758 }
759 }
760
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200761 if (!es.status) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100762 cf->can_id |= CAN_ERR_PROT;
763 cf->data[2] = CAN_ERR_PROT_ACTIVE;
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100764 }
765
766 if (priv->can.restart_ms &&
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200767 (old_state >= CAN_STATE_BUS_OFF) &&
768 (priv->can.state < CAN_STATE_BUS_OFF)) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100769 cf->can_id |= CAN_ERR_RESTARTED;
770 netif_carrier_on(priv->netdev);
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100771 }
772
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200773 if (es.error_factor) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100774 cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT;
775
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200776 if (es.error_factor & M16C_EF_ACKE)
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100777 cf->data[3] |= (CAN_ERR_PROT_LOC_ACK);
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200778 if (es.error_factor & M16C_EF_CRCE)
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100779 cf->data[3] |= (CAN_ERR_PROT_LOC_CRC_SEQ |
780 CAN_ERR_PROT_LOC_CRC_DEL);
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200781 if (es.error_factor & M16C_EF_FORME)
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100782 cf->data[2] |= CAN_ERR_PROT_FORM;
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200783 if (es.error_factor & M16C_EF_STFE)
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100784 cf->data[2] |= CAN_ERR_PROT_STUFF;
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200785 if (es.error_factor & M16C_EF_BITE0)
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100786 cf->data[2] |= CAN_ERR_PROT_BIT0;
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200787 if (es.error_factor & M16C_EF_BITE1)
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100788 cf->data[2] |= CAN_ERR_PROT_BIT1;
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200789 if (es.error_factor & M16C_EF_TRE)
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100790 cf->data[2] |= CAN_ERR_PROT_TX;
791 }
792
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200793 cf->data[6] = es.txerr;
794 cf->data[7] = es.rxerr;
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100795
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100796 stats->rx_packets++;
797 stats->rx_bytes += cf->can_dlc;
Ahmed S. Darwisha58518c2015-01-11 15:49:52 -0500798 netif_rx(skb);
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100799}
800
801static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv,
802 const struct kvaser_msg *msg)
803{
804 struct can_frame *cf;
805 struct sk_buff *skb;
806 struct net_device_stats *stats = &priv->netdev->stats;
807
808 if (msg->u.rx_can.flag & (MSG_FLAG_ERROR_FRAME |
809 MSG_FLAG_NERR)) {
810 netdev_err(priv->netdev, "Unknow error (flags: 0x%02x)\n",
811 msg->u.rx_can.flag);
812
813 stats->rx_errors++;
814 return;
815 }
816
817 if (msg->u.rx_can.flag & MSG_FLAG_OVERRUN) {
Ahmed S. Darwish3b07a442015-01-26 07:27:19 +0200818 stats->rx_over_errors++;
819 stats->rx_errors++;
820
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100821 skb = alloc_can_err_skb(priv->netdev, &cf);
822 if (!skb) {
823 stats->rx_dropped++;
824 return;
825 }
826
827 cf->can_id |= CAN_ERR_CRTL;
828 cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
829
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100830 stats->rx_packets++;
831 stats->rx_bytes += cf->can_dlc;
Ahmed S. Darwisha58518c2015-01-11 15:49:52 -0500832 netif_rx(skb);
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100833 }
834}
835
836static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev,
837 const struct kvaser_msg *msg)
838{
839 struct kvaser_usb_net_priv *priv;
840 struct can_frame *cf;
841 struct sk_buff *skb;
842 struct net_device_stats *stats;
843 u8 channel = msg->u.rx_can.channel;
844
845 if (channel >= dev->nchannels) {
846 dev_err(dev->udev->dev.parent,
847 "Invalid channel number (%d)\n", channel);
848 return;
849 }
850
851 priv = dev->nets[channel];
852 stats = &priv->netdev->stats;
853
Jonas Petersona90f13b2013-05-07 22:05:23 +0200854 if ((msg->u.rx_can.flag & MSG_FLAG_ERROR_FRAME) &&
855 (msg->id == CMD_LOG_MESSAGE)) {
856 kvaser_usb_rx_error(dev, msg);
857 return;
858 } else if (msg->u.rx_can.flag & (MSG_FLAG_ERROR_FRAME |
859 MSG_FLAG_NERR |
860 MSG_FLAG_OVERRUN)) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100861 kvaser_usb_rx_can_err(priv, msg);
862 return;
863 } else if (msg->u.rx_can.flag & ~MSG_FLAG_REMOTE_FRAME) {
864 netdev_warn(priv->netdev,
865 "Unhandled frame (flags: 0x%02x)",
866 msg->u.rx_can.flag);
867 return;
868 }
869
870 skb = alloc_can_skb(priv->netdev, &cf);
871 if (!skb) {
872 stats->tx_dropped++;
873 return;
874 }
875
Jonas Petersona90f13b2013-05-07 22:05:23 +0200876 if (msg->id == CMD_LOG_MESSAGE) {
877 cf->can_id = le32_to_cpu(msg->u.log_message.id);
878 if (cf->can_id & KVASER_EXTENDED_FRAME)
879 cf->can_id &= CAN_EFF_MASK | CAN_EFF_FLAG;
880 else
881 cf->can_id &= CAN_SFF_MASK;
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100882
Jonas Petersona90f13b2013-05-07 22:05:23 +0200883 cf->can_dlc = get_can_dlc(msg->u.log_message.dlc);
884
885 if (msg->u.log_message.flags & MSG_FLAG_REMOTE_FRAME)
886 cf->can_id |= CAN_RTR_FLAG;
887 else
888 memcpy(cf->data, &msg->u.log_message.data,
889 cf->can_dlc);
890 } else {
891 cf->can_id = ((msg->u.rx_can.msg[0] & 0x1f) << 6) |
892 (msg->u.rx_can.msg[1] & 0x3f);
893
894 if (msg->id == CMD_RX_EXT_MESSAGE) {
895 cf->can_id <<= 18;
896 cf->can_id |= ((msg->u.rx_can.msg[2] & 0x0f) << 14) |
897 ((msg->u.rx_can.msg[3] & 0xff) << 6) |
898 (msg->u.rx_can.msg[4] & 0x3f);
899 cf->can_id |= CAN_EFF_FLAG;
900 }
901
902 cf->can_dlc = get_can_dlc(msg->u.rx_can.msg[5]);
903
904 if (msg->u.rx_can.flag & MSG_FLAG_REMOTE_FRAME)
905 cf->can_id |= CAN_RTR_FLAG;
906 else
907 memcpy(cf->data, &msg->u.rx_can.msg[6],
908 cf->can_dlc);
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100909 }
910
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100911 stats->rx_packets++;
912 stats->rx_bytes += cf->can_dlc;
Ahmed S. Darwisha58518c2015-01-11 15:49:52 -0500913 netif_rx(skb);
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100914}
915
916static void kvaser_usb_start_chip_reply(const struct kvaser_usb *dev,
917 const struct kvaser_msg *msg)
918{
919 struct kvaser_usb_net_priv *priv;
920 u8 channel = msg->u.simple.channel;
921
922 if (channel >= dev->nchannels) {
923 dev_err(dev->udev->dev.parent,
924 "Invalid channel number (%d)\n", channel);
925 return;
926 }
927
928 priv = dev->nets[channel];
929
930 if (completion_done(&priv->start_comp) &&
931 netif_queue_stopped(priv->netdev)) {
932 netif_wake_queue(priv->netdev);
933 } else {
934 netif_start_queue(priv->netdev);
935 complete(&priv->start_comp);
936 }
937}
938
939static void kvaser_usb_stop_chip_reply(const struct kvaser_usb *dev,
940 const struct kvaser_msg *msg)
941{
942 struct kvaser_usb_net_priv *priv;
943 u8 channel = msg->u.simple.channel;
944
945 if (channel >= dev->nchannels) {
946 dev_err(dev->udev->dev.parent,
947 "Invalid channel number (%d)\n", channel);
948 return;
949 }
950
951 priv = dev->nets[channel];
952
953 complete(&priv->stop_comp);
954}
955
956static void kvaser_usb_handle_message(const struct kvaser_usb *dev,
957 const struct kvaser_msg *msg)
958{
959 switch (msg->id) {
960 case CMD_START_CHIP_REPLY:
961 kvaser_usb_start_chip_reply(dev, msg);
962 break;
963
964 case CMD_STOP_CHIP_REPLY:
965 kvaser_usb_stop_chip_reply(dev, msg);
966 break;
967
968 case CMD_RX_STD_MESSAGE:
969 case CMD_RX_EXT_MESSAGE:
Jonas Petersona90f13b2013-05-07 22:05:23 +0200970 case CMD_LOG_MESSAGE:
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100971 kvaser_usb_rx_can_msg(dev, msg);
972 break;
973
974 case CMD_CHIP_STATE_EVENT:
975 case CMD_CAN_ERROR_EVENT:
976 kvaser_usb_rx_error(dev, msg);
977 break;
978
Olivier Sobrie080f40a2012-11-21 08:11:13 +0100979 case CMD_TX_ACKNOWLEDGE:
980 kvaser_usb_tx_acknowledge(dev, msg);
981 break;
982
983 default:
984 dev_warn(dev->udev->dev.parent,
985 "Unhandled message (%d)\n", msg->id);
986 break;
987 }
988}
989
990static void kvaser_usb_read_bulk_callback(struct urb *urb)
991{
992 struct kvaser_usb *dev = urb->context;
993 struct kvaser_msg *msg;
994 int pos = 0;
995 int err, i;
996
997 switch (urb->status) {
998 case 0:
999 break;
1000 case -ENOENT:
1001 case -ESHUTDOWN:
1002 return;
1003 default:
1004 dev_info(dev->udev->dev.parent, "Rx URB aborted (%d)\n",
1005 urb->status);
1006 goto resubmit_urb;
1007 }
1008
1009 while (pos <= urb->actual_length - MSG_HEADER_LEN) {
1010 msg = urb->transfer_buffer + pos;
1011
1012 if (!msg->len)
1013 break;
1014
1015 if (pos + msg->len > urb->actual_length) {
1016 dev_err(dev->udev->dev.parent, "Format error\n");
1017 break;
1018 }
1019
1020 kvaser_usb_handle_message(dev, msg);
1021
1022 pos += msg->len;
1023 }
1024
1025resubmit_urb:
1026 usb_fill_bulk_urb(urb, dev->udev,
1027 usb_rcvbulkpipe(dev->udev,
1028 dev->bulk_in->bEndpointAddress),
1029 urb->transfer_buffer, RX_BUFFER_SIZE,
1030 kvaser_usb_read_bulk_callback, dev);
1031
1032 err = usb_submit_urb(urb, GFP_ATOMIC);
1033 if (err == -ENODEV) {
1034 for (i = 0; i < dev->nchannels; i++) {
1035 if (!dev->nets[i])
1036 continue;
1037
1038 netif_device_detach(dev->nets[i]->netdev);
1039 }
1040 } else if (err) {
1041 dev_err(dev->udev->dev.parent,
1042 "Failed resubmitting read bulk urb: %d\n", err);
1043 }
1044
1045 return;
1046}
1047
1048static int kvaser_usb_setup_rx_urbs(struct kvaser_usb *dev)
1049{
1050 int i, err = 0;
1051
1052 if (dev->rxinitdone)
1053 return 0;
1054
1055 for (i = 0; i < MAX_RX_URBS; i++) {
1056 struct urb *urb = NULL;
1057 u8 *buf = NULL;
1058 dma_addr_t buf_dma;
1059
1060 urb = usb_alloc_urb(0, GFP_KERNEL);
1061 if (!urb) {
1062 dev_warn(dev->udev->dev.parent,
1063 "No memory left for URBs\n");
1064 err = -ENOMEM;
1065 break;
1066 }
1067
1068 buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE,
1069 GFP_KERNEL, &buf_dma);
1070 if (!buf) {
1071 dev_warn(dev->udev->dev.parent,
1072 "No memory left for USB buffer\n");
1073 usb_free_urb(urb);
1074 err = -ENOMEM;
1075 break;
1076 }
1077
1078 usb_fill_bulk_urb(urb, dev->udev,
1079 usb_rcvbulkpipe(dev->udev,
1080 dev->bulk_in->bEndpointAddress),
1081 buf, RX_BUFFER_SIZE,
1082 kvaser_usb_read_bulk_callback,
1083 dev);
1084 urb->transfer_dma = buf_dma;
1085 urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1086 usb_anchor_urb(urb, &dev->rx_submitted);
1087
1088 err = usb_submit_urb(urb, GFP_KERNEL);
1089 if (err) {
1090 usb_unanchor_urb(urb);
1091 usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf,
1092 buf_dma);
1093 usb_free_urb(urb);
1094 break;
1095 }
1096
1097 dev->rxbuf[i] = buf;
1098 dev->rxbuf_dma[i] = buf_dma;
1099
1100 usb_free_urb(urb);
1101 }
1102
1103 if (i == 0) {
1104 dev_warn(dev->udev->dev.parent,
1105 "Cannot setup read URBs, error %d\n", err);
1106 return err;
1107 } else if (i < MAX_RX_URBS) {
1108 dev_warn(dev->udev->dev.parent,
1109 "RX performances may be slow\n");
1110 }
1111
1112 dev->rxinitdone = true;
1113
1114 return 0;
1115}
1116
1117static int kvaser_usb_set_opt_mode(const struct kvaser_usb_net_priv *priv)
1118{
1119 struct kvaser_msg *msg;
1120 int rc;
1121
1122 msg = kmalloc(sizeof(*msg), GFP_KERNEL);
1123 if (!msg)
1124 return -ENOMEM;
1125
1126 msg->id = CMD_SET_CTRL_MODE;
1127 msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_ctrl_mode);
1128 msg->u.ctrl_mode.tid = 0xff;
1129 msg->u.ctrl_mode.channel = priv->channel;
1130
1131 if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
1132 msg->u.ctrl_mode.ctrl_mode = KVASER_CTRL_MODE_SILENT;
1133 else
1134 msg->u.ctrl_mode.ctrl_mode = KVASER_CTRL_MODE_NORMAL;
1135
1136 rc = kvaser_usb_send_msg(priv->dev, msg);
1137
1138 kfree(msg);
1139 return rc;
1140}
1141
1142static int kvaser_usb_start_chip(struct kvaser_usb_net_priv *priv)
1143{
1144 int err;
1145
1146 init_completion(&priv->start_comp);
1147
1148 err = kvaser_usb_send_simple_msg(priv->dev, CMD_START_CHIP,
1149 priv->channel);
1150 if (err)
1151 return err;
1152
1153 if (!wait_for_completion_timeout(&priv->start_comp,
1154 msecs_to_jiffies(START_TIMEOUT)))
1155 return -ETIMEDOUT;
1156
1157 return 0;
1158}
1159
1160static int kvaser_usb_open(struct net_device *netdev)
1161{
1162 struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
1163 struct kvaser_usb *dev = priv->dev;
1164 int err;
1165
1166 err = open_candev(netdev);
1167 if (err)
1168 return err;
1169
1170 err = kvaser_usb_setup_rx_urbs(dev);
1171 if (err)
1172 goto error;
1173
1174 err = kvaser_usb_set_opt_mode(priv);
1175 if (err)
1176 goto error;
1177
1178 err = kvaser_usb_start_chip(priv);
1179 if (err) {
1180 netdev_warn(netdev, "Cannot start device, error %d\n", err);
1181 goto error;
1182 }
1183
1184 priv->can.state = CAN_STATE_ERROR_ACTIVE;
1185
1186 return 0;
1187
1188error:
1189 close_candev(netdev);
1190 return err;
1191}
1192
1193static void kvaser_usb_unlink_all_urbs(struct kvaser_usb *dev)
1194{
1195 int i;
1196
1197 usb_kill_anchored_urbs(&dev->rx_submitted);
1198
1199 for (i = 0; i < MAX_RX_URBS; i++)
1200 usb_free_coherent(dev->udev, RX_BUFFER_SIZE,
1201 dev->rxbuf[i],
1202 dev->rxbuf_dma[i]);
1203
1204 for (i = 0; i < MAX_NET_DEVICES; i++) {
1205 struct kvaser_usb_net_priv *priv = dev->nets[i];
1206
1207 if (priv)
1208 kvaser_usb_unlink_tx_urbs(priv);
1209 }
1210}
1211
1212static int kvaser_usb_stop_chip(struct kvaser_usb_net_priv *priv)
1213{
1214 int err;
1215
1216 init_completion(&priv->stop_comp);
1217
1218 err = kvaser_usb_send_simple_msg(priv->dev, CMD_STOP_CHIP,
1219 priv->channel);
1220 if (err)
1221 return err;
1222
1223 if (!wait_for_completion_timeout(&priv->stop_comp,
1224 msecs_to_jiffies(STOP_TIMEOUT)))
1225 return -ETIMEDOUT;
1226
1227 return 0;
1228}
1229
1230static int kvaser_usb_flush_queue(struct kvaser_usb_net_priv *priv)
1231{
1232 struct kvaser_msg *msg;
1233 int rc;
1234
1235 msg = kmalloc(sizeof(*msg), GFP_KERNEL);
1236 if (!msg)
1237 return -ENOMEM;
1238
1239 msg->id = CMD_FLUSH_QUEUE;
1240 msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_flush_queue);
1241 msg->u.flush_queue.channel = priv->channel;
1242 msg->u.flush_queue.flags = 0x00;
1243
1244 rc = kvaser_usb_send_msg(priv->dev, msg);
1245
1246 kfree(msg);
1247 return rc;
1248}
1249
1250static int kvaser_usb_close(struct net_device *netdev)
1251{
1252 struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
1253 struct kvaser_usb *dev = priv->dev;
1254 int err;
1255
1256 netif_stop_queue(netdev);
1257
1258 err = kvaser_usb_flush_queue(priv);
1259 if (err)
1260 netdev_warn(netdev, "Cannot flush queue, error %d\n", err);
1261
1262 if (kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, priv->channel))
1263 netdev_warn(netdev, "Cannot reset card, error %d\n", err);
1264
1265 err = kvaser_usb_stop_chip(priv);
1266 if (err)
1267 netdev_warn(netdev, "Cannot stop device, error %d\n", err);
1268
Ahmed S. Darwish889b77f2015-01-05 12:52:06 -05001269 /* reset tx contexts */
1270 kvaser_usb_unlink_tx_urbs(priv);
1271
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001272 priv->can.state = CAN_STATE_STOPPED;
1273 close_candev(priv->netdev);
1274
1275 return 0;
1276}
1277
1278static void kvaser_usb_write_bulk_callback(struct urb *urb)
1279{
1280 struct kvaser_usb_tx_urb_context *context = urb->context;
1281 struct kvaser_usb_net_priv *priv;
1282 struct net_device *netdev;
1283
1284 if (WARN_ON(!context))
1285 return;
1286
1287 priv = context->priv;
1288 netdev = priv->netdev;
1289
1290 kfree(urb->transfer_buffer);
1291
1292 if (!netif_device_present(netdev))
1293 return;
1294
1295 if (urb->status)
1296 netdev_info(netdev, "Tx URB aborted (%d)\n", urb->status);
1297}
1298
1299static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb,
1300 struct net_device *netdev)
1301{
1302 struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
1303 struct kvaser_usb *dev = priv->dev;
1304 struct net_device_stats *stats = &netdev->stats;
1305 struct can_frame *cf = (struct can_frame *)skb->data;
1306 struct kvaser_usb_tx_urb_context *context = NULL;
1307 struct urb *urb;
1308 void *buf;
1309 struct kvaser_msg *msg;
1310 int i, err;
1311 int ret = NETDEV_TX_OK;
1312
1313 if (can_dropped_invalid_skb(netdev, skb))
1314 return NETDEV_TX_OK;
1315
1316 urb = usb_alloc_urb(0, GFP_ATOMIC);
1317 if (!urb) {
1318 netdev_err(netdev, "No memory left for URBs\n");
1319 stats->tx_dropped++;
Ahmed S. Darwishb4427232015-01-05 12:49:10 -05001320 dev_kfree_skb(skb);
1321 return NETDEV_TX_OK;
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001322 }
1323
1324 buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC);
1325 if (!buf) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001326 stats->tx_dropped++;
Ahmed S. Darwishb4427232015-01-05 12:49:10 -05001327 dev_kfree_skb(skb);
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001328 goto nobufmem;
1329 }
1330
1331 msg = buf;
1332 msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_tx_can);
1333 msg->u.tx_can.flags = 0;
1334 msg->u.tx_can.channel = priv->channel;
1335
1336 if (cf->can_id & CAN_EFF_FLAG) {
1337 msg->id = CMD_TX_EXT_MESSAGE;
1338 msg->u.tx_can.msg[0] = (cf->can_id >> 24) & 0x1f;
1339 msg->u.tx_can.msg[1] = (cf->can_id >> 18) & 0x3f;
1340 msg->u.tx_can.msg[2] = (cf->can_id >> 14) & 0x0f;
1341 msg->u.tx_can.msg[3] = (cf->can_id >> 6) & 0xff;
1342 msg->u.tx_can.msg[4] = cf->can_id & 0x3f;
1343 } else {
1344 msg->id = CMD_TX_STD_MESSAGE;
1345 msg->u.tx_can.msg[0] = (cf->can_id >> 6) & 0x1f;
1346 msg->u.tx_can.msg[1] = cf->can_id & 0x3f;
1347 }
1348
1349 msg->u.tx_can.msg[5] = cf->can_dlc;
1350 memcpy(&msg->u.tx_can.msg[6], cf->data, cf->can_dlc);
1351
1352 if (cf->can_id & CAN_RTR_FLAG)
1353 msg->u.tx_can.flags |= MSG_FLAG_REMOTE_FRAME;
1354
1355 for (i = 0; i < ARRAY_SIZE(priv->tx_contexts); i++) {
1356 if (priv->tx_contexts[i].echo_index == MAX_TX_URBS) {
1357 context = &priv->tx_contexts[i];
1358 break;
1359 }
1360 }
1361
Ahmed S. Darwishb4427232015-01-05 12:49:10 -05001362 /* This should never happen; it implies a flow control bug */
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001363 if (!context) {
1364 netdev_warn(netdev, "cannot find free context\n");
1365 ret = NETDEV_TX_BUSY;
1366 goto releasebuf;
1367 }
1368
1369 context->priv = priv;
1370 context->echo_index = i;
1371 context->dlc = cf->can_dlc;
1372
1373 msg->u.tx_can.tid = context->echo_index;
1374
1375 usb_fill_bulk_urb(urb, dev->udev,
1376 usb_sndbulkpipe(dev->udev,
1377 dev->bulk_out->bEndpointAddress),
1378 buf, msg->len,
1379 kvaser_usb_write_bulk_callback, context);
1380 usb_anchor_urb(urb, &priv->tx_submitted);
1381
1382 can_put_echo_skb(skb, netdev, context->echo_index);
1383
1384 atomic_inc(&priv->active_tx_urbs);
1385
1386 if (atomic_read(&priv->active_tx_urbs) >= MAX_TX_URBS)
1387 netif_stop_queue(netdev);
1388
1389 err = usb_submit_urb(urb, GFP_ATOMIC);
1390 if (unlikely(err)) {
1391 can_free_echo_skb(netdev, context->echo_index);
1392
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001393 atomic_dec(&priv->active_tx_urbs);
1394 usb_unanchor_urb(urb);
1395
1396 stats->tx_dropped++;
1397
1398 if (err == -ENODEV)
1399 netif_device_detach(netdev);
1400 else
1401 netdev_warn(netdev, "Failed tx_urb %d\n", err);
1402
1403 goto releasebuf;
1404 }
1405
1406 usb_free_urb(urb);
1407
1408 return NETDEV_TX_OK;
1409
1410releasebuf:
1411 kfree(buf);
1412nobufmem:
1413 usb_free_urb(urb);
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001414 return ret;
1415}
1416
1417static const struct net_device_ops kvaser_usb_netdev_ops = {
1418 .ndo_open = kvaser_usb_open,
1419 .ndo_stop = kvaser_usb_close,
1420 .ndo_start_xmit = kvaser_usb_start_xmit,
Oliver Hartkoppc971fa22014-03-07 09:23:41 +01001421 .ndo_change_mtu = can_change_mtu,
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001422};
1423
1424static const struct can_bittiming_const kvaser_usb_bittiming_const = {
1425 .name = "kvaser_usb",
1426 .tseg1_min = KVASER_USB_TSEG1_MIN,
1427 .tseg1_max = KVASER_USB_TSEG1_MAX,
1428 .tseg2_min = KVASER_USB_TSEG2_MIN,
1429 .tseg2_max = KVASER_USB_TSEG2_MAX,
1430 .sjw_max = KVASER_USB_SJW_MAX,
1431 .brp_min = KVASER_USB_BRP_MIN,
1432 .brp_max = KVASER_USB_BRP_MAX,
1433 .brp_inc = KVASER_USB_BRP_INC,
1434};
1435
1436static int kvaser_usb_set_bittiming(struct net_device *netdev)
1437{
1438 struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
1439 struct can_bittiming *bt = &priv->can.bittiming;
1440 struct kvaser_usb *dev = priv->dev;
1441 struct kvaser_msg *msg;
1442 int rc;
1443
1444 msg = kmalloc(sizeof(*msg), GFP_KERNEL);
1445 if (!msg)
1446 return -ENOMEM;
1447
1448 msg->id = CMD_SET_BUS_PARAMS;
1449 msg->len = MSG_HEADER_LEN + sizeof(struct kvaser_msg_busparams);
1450 msg->u.busparams.channel = priv->channel;
1451 msg->u.busparams.tid = 0xff;
1452 msg->u.busparams.bitrate = cpu_to_le32(bt->bitrate);
1453 msg->u.busparams.sjw = bt->sjw;
1454 msg->u.busparams.tseg1 = bt->prop_seg + bt->phase_seg1;
1455 msg->u.busparams.tseg2 = bt->phase_seg2;
1456
1457 if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
1458 msg->u.busparams.no_samp = 3;
1459 else
1460 msg->u.busparams.no_samp = 1;
1461
1462 rc = kvaser_usb_send_msg(dev, msg);
1463
1464 kfree(msg);
1465 return rc;
1466}
1467
1468static int kvaser_usb_set_mode(struct net_device *netdev,
1469 enum can_mode mode)
1470{
1471 struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
1472 int err;
1473
1474 switch (mode) {
1475 case CAN_MODE_START:
1476 err = kvaser_usb_simple_msg_async(priv, CMD_START_CHIP);
1477 if (err)
1478 return err;
1479 break;
1480 default:
1481 return -EOPNOTSUPP;
1482 }
1483
1484 return 0;
1485}
1486
1487static int kvaser_usb_get_berr_counter(const struct net_device *netdev,
1488 struct can_berr_counter *bec)
1489{
1490 struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
1491
1492 *bec = priv->bec;
1493
1494 return 0;
1495}
1496
1497static void kvaser_usb_remove_interfaces(struct kvaser_usb *dev)
1498{
1499 int i;
1500
1501 for (i = 0; i < dev->nchannels; i++) {
1502 if (!dev->nets[i])
1503 continue;
1504
1505 unregister_netdev(dev->nets[i]->netdev);
1506 }
1507
1508 kvaser_usb_unlink_all_urbs(dev);
1509
1510 for (i = 0; i < dev->nchannels; i++) {
1511 if (!dev->nets[i])
1512 continue;
1513
1514 free_candev(dev->nets[i]->netdev);
1515 }
1516}
1517
1518static int kvaser_usb_init_one(struct usb_interface *intf,
1519 const struct usb_device_id *id, int channel)
1520{
1521 struct kvaser_usb *dev = usb_get_intfdata(intf);
1522 struct net_device *netdev;
1523 struct kvaser_usb_net_priv *priv;
1524 int i, err;
1525
Ahmed S. Darwish5e7e6e02015-01-05 12:57:13 -05001526 err = kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, channel);
1527 if (err)
1528 return err;
1529
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001530 netdev = alloc_candev(sizeof(*priv), MAX_TX_URBS);
1531 if (!netdev) {
1532 dev_err(&intf->dev, "Cannot alloc candev\n");
1533 return -ENOMEM;
1534 }
1535
1536 priv = netdev_priv(netdev);
1537
1538 init_completion(&priv->start_comp);
1539 init_completion(&priv->stop_comp);
1540
1541 init_usb_anchor(&priv->tx_submitted);
1542 atomic_set(&priv->active_tx_urbs, 0);
1543
1544 for (i = 0; i < ARRAY_SIZE(priv->tx_contexts); i++)
1545 priv->tx_contexts[i].echo_index = MAX_TX_URBS;
1546
1547 priv->dev = dev;
1548 priv->netdev = netdev;
1549 priv->channel = channel;
1550
1551 priv->can.state = CAN_STATE_STOPPED;
1552 priv->can.clock.freq = CAN_USB_CLOCK;
1553 priv->can.bittiming_const = &kvaser_usb_bittiming_const;
1554 priv->can.do_set_bittiming = kvaser_usb_set_bittiming;
1555 priv->can.do_set_mode = kvaser_usb_set_mode;
1556 if (id->driver_info & KVASER_HAS_TXRX_ERRORS)
1557 priv->can.do_get_berr_counter = kvaser_usb_get_berr_counter;
1558 priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES;
1559 if (id->driver_info & KVASER_HAS_SILENT_MODE)
1560 priv->can.ctrlmode_supported |= CAN_CTRLMODE_LISTENONLY;
1561
1562 netdev->flags |= IFF_ECHO;
1563
1564 netdev->netdev_ops = &kvaser_usb_netdev_ops;
1565
1566 SET_NETDEV_DEV(netdev, &intf->dev);
Christopher R. Baker3e66d012014-03-08 11:00:20 -05001567 netdev->dev_id = channel;
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001568
1569 dev->nets[channel] = priv;
1570
1571 err = register_candev(netdev);
1572 if (err) {
1573 dev_err(&intf->dev, "Failed to register can device\n");
1574 free_candev(netdev);
1575 dev->nets[channel] = NULL;
1576 return err;
1577 }
1578
1579 netdev_dbg(netdev, "device registered\n");
1580
1581 return 0;
1582}
1583
Olivier Sobrie896e23b2013-10-27 22:07:53 +01001584static int kvaser_usb_get_endpoints(const struct usb_interface *intf,
1585 struct usb_endpoint_descriptor **in,
1586 struct usb_endpoint_descriptor **out)
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001587{
1588 const struct usb_host_interface *iface_desc;
1589 struct usb_endpoint_descriptor *endpoint;
1590 int i;
1591
1592 iface_desc = &intf->altsetting[0];
1593
1594 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
1595 endpoint = &iface_desc->endpoint[i].desc;
1596
Olivier Sobrie896e23b2013-10-27 22:07:53 +01001597 if (!*in && usb_endpoint_is_bulk_in(endpoint))
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001598 *in = endpoint;
1599
Olivier Sobrie896e23b2013-10-27 22:07:53 +01001600 if (!*out && usb_endpoint_is_bulk_out(endpoint))
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001601 *out = endpoint;
Olivier Sobrie896e23b2013-10-27 22:07:53 +01001602
1603 /* use first bulk endpoint for in and out */
1604 if (*in && *out)
1605 return 0;
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001606 }
Olivier Sobrie896e23b2013-10-27 22:07:53 +01001607
1608 return -ENODEV;
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001609}
1610
1611static int kvaser_usb_probe(struct usb_interface *intf,
1612 const struct usb_device_id *id)
1613{
1614 struct kvaser_usb *dev;
1615 int err = -ENOMEM;
Ahmed S. Darwish14c10c22015-01-26 07:24:06 +02001616 int i, retry = 3;
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001617
1618 dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL);
1619 if (!dev)
1620 return -ENOMEM;
1621
Olivier Sobrie896e23b2013-10-27 22:07:53 +01001622 err = kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out);
1623 if (err) {
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001624 dev_err(&intf->dev, "Cannot get usb endpoint(s)");
1625 return err;
1626 }
1627
1628 dev->udev = interface_to_usbdev(intf);
1629
1630 init_usb_anchor(&dev->rx_submitted);
1631
1632 usb_set_intfdata(intf, dev);
1633
Ahmed S. Darwish14c10c22015-01-26 07:24:06 +02001634 /* On some x86 laptops, plugging a Kvaser device again after
1635 * an unplug makes the firmware always ignore the very first
1636 * command. For such a case, provide some room for retries
1637 * instead of completely exiting the driver.
1638 */
1639 do {
1640 err = kvaser_usb_get_software_info(dev);
1641 } while (--retry && err == -ETIMEDOUT);
1642
Olivier Sobrie080f40a2012-11-21 08:11:13 +01001643 if (err) {
1644 dev_err(&intf->dev,
1645 "Cannot get software infos, error %d\n", err);
1646 return err;
1647 }
1648
1649 err = kvaser_usb_get_card_info(dev);
1650 if (err) {
1651 dev_err(&intf->dev,
1652 "Cannot get card infos, error %d\n", err);
1653 return err;
1654 }
1655
1656 dev_dbg(&intf->dev, "Firmware version: %d.%d.%d\n",
1657 ((dev->fw_version >> 24) & 0xff),
1658 ((dev->fw_version >> 16) & 0xff),
1659 (dev->fw_version & 0xffff));
1660
1661 for (i = 0; i < dev->nchannels; i++) {
1662 err = kvaser_usb_init_one(intf, id, i);
1663 if (err) {
1664 kvaser_usb_remove_interfaces(dev);
1665 return err;
1666 }
1667 }
1668
1669 return 0;
1670}
1671
1672static void kvaser_usb_disconnect(struct usb_interface *intf)
1673{
1674 struct kvaser_usb *dev = usb_get_intfdata(intf);
1675
1676 usb_set_intfdata(intf, NULL);
1677
1678 if (!dev)
1679 return;
1680
1681 kvaser_usb_remove_interfaces(dev);
1682}
1683
1684static struct usb_driver kvaser_usb_driver = {
1685 .name = "kvaser_usb",
1686 .probe = kvaser_usb_probe,
1687 .disconnect = kvaser_usb_disconnect,
1688 .id_table = kvaser_usb_table,
1689};
1690
1691module_usb_driver(kvaser_usb_driver);
1692
1693MODULE_AUTHOR("Olivier Sobrie <olivier@sobrie.be>");
1694MODULE_DESCRIPTION("CAN driver for Kvaser CAN/USB devices");
1695MODULE_LICENSE("GPL v2");