forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c
....@@ -100,16 +100,6 @@
100100 #define USBCAN_ERROR_STATE_RX_ERROR BIT(1)
101101 #define USBCAN_ERROR_STATE_BUSERROR BIT(2)
102102
103
-/* bittiming parameters */
104
-#define KVASER_USB_TSEG1_MIN 1
105
-#define KVASER_USB_TSEG1_MAX 16
106
-#define KVASER_USB_TSEG2_MIN 1
107
-#define KVASER_USB_TSEG2_MAX 8
108
-#define KVASER_USB_SJW_MAX 4
109
-#define KVASER_USB_BRP_MIN 1
110
-#define KVASER_USB_BRP_MAX 64
111
-#define KVASER_USB_BRP_INC 1
112
-
113103 /* ctrl modes */
114104 #define KVASER_CTRL_MODE_NORMAL 1
115105 #define KVASER_CTRL_MODE_SILENT 2
....@@ -319,6 +309,38 @@
319309 } u;
320310 } __packed;
321311
312
+#define CMD_SIZE_ANY 0xff
313
+#define kvaser_fsize(field) sizeof_field(struct kvaser_cmd, field)
314
+
315
+static const u8 kvaser_usb_leaf_cmd_sizes_leaf[] = {
316
+ [CMD_START_CHIP_REPLY] = kvaser_fsize(u.simple),
317
+ [CMD_STOP_CHIP_REPLY] = kvaser_fsize(u.simple),
318
+ [CMD_GET_CARD_INFO_REPLY] = kvaser_fsize(u.cardinfo),
319
+ [CMD_TX_ACKNOWLEDGE] = kvaser_fsize(u.tx_acknowledge_header),
320
+ [CMD_GET_SOFTWARE_INFO_REPLY] = kvaser_fsize(u.leaf.softinfo),
321
+ [CMD_RX_STD_MESSAGE] = kvaser_fsize(u.leaf.rx_can),
322
+ [CMD_RX_EXT_MESSAGE] = kvaser_fsize(u.leaf.rx_can),
323
+ [CMD_LEAF_LOG_MESSAGE] = kvaser_fsize(u.leaf.log_message),
324
+ [CMD_CHIP_STATE_EVENT] = kvaser_fsize(u.leaf.chip_state_event),
325
+ [CMD_CAN_ERROR_EVENT] = kvaser_fsize(u.leaf.error_event),
326
+ /* ignored events: */
327
+ [CMD_FLUSH_QUEUE_REPLY] = CMD_SIZE_ANY,
328
+};
329
+
330
+static const u8 kvaser_usb_leaf_cmd_sizes_usbcan[] = {
331
+ [CMD_START_CHIP_REPLY] = kvaser_fsize(u.simple),
332
+ [CMD_STOP_CHIP_REPLY] = kvaser_fsize(u.simple),
333
+ [CMD_GET_CARD_INFO_REPLY] = kvaser_fsize(u.cardinfo),
334
+ [CMD_TX_ACKNOWLEDGE] = kvaser_fsize(u.tx_acknowledge_header),
335
+ [CMD_GET_SOFTWARE_INFO_REPLY] = kvaser_fsize(u.usbcan.softinfo),
336
+ [CMD_RX_STD_MESSAGE] = kvaser_fsize(u.usbcan.rx_can),
337
+ [CMD_RX_EXT_MESSAGE] = kvaser_fsize(u.usbcan.rx_can),
338
+ [CMD_CHIP_STATE_EVENT] = kvaser_fsize(u.usbcan.chip_state_event),
339
+ [CMD_CAN_ERROR_EVENT] = kvaser_fsize(u.usbcan.error_event),
340
+ /* ignored events: */
341
+ [CMD_USBCAN_CLOCK_OVERFLOW_EVENT] = CMD_SIZE_ANY,
342
+};
343
+
322344 /* Summary of a kvaser error event, for a unified Leaf/Usbcan error
323345 * handling. Some discrepancies between the two families exist:
324346 *
....@@ -342,49 +364,106 @@
342364 };
343365 };
344366
345
-static const struct can_bittiming_const kvaser_usb_leaf_bittiming_const = {
346
- .name = "kvaser_usb",
347
- .tseg1_min = KVASER_USB_TSEG1_MIN,
348
- .tseg1_max = KVASER_USB_TSEG1_MAX,
349
- .tseg2_min = KVASER_USB_TSEG2_MIN,
350
- .tseg2_max = KVASER_USB_TSEG2_MAX,
351
- .sjw_max = KVASER_USB_SJW_MAX,
352
- .brp_min = KVASER_USB_BRP_MIN,
353
- .brp_max = KVASER_USB_BRP_MAX,
354
- .brp_inc = KVASER_USB_BRP_INC,
367
+static const struct can_bittiming_const kvaser_usb_leaf_m16c_bittiming_const = {
368
+ .name = "kvaser_usb_ucii",
369
+ .tseg1_min = 4,
370
+ .tseg1_max = 16,
371
+ .tseg2_min = 2,
372
+ .tseg2_max = 8,
373
+ .sjw_max = 4,
374
+ .brp_min = 1,
375
+ .brp_max = 16,
376
+ .brp_inc = 1,
355377 };
356378
357
-static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_8mhz = {
379
+static const struct can_bittiming_const kvaser_usb_leaf_m32c_bittiming_const = {
380
+ .name = "kvaser_usb_leaf",
381
+ .tseg1_min = 3,
382
+ .tseg1_max = 16,
383
+ .tseg2_min = 2,
384
+ .tseg2_max = 8,
385
+ .sjw_max = 4,
386
+ .brp_min = 2,
387
+ .brp_max = 128,
388
+ .brp_inc = 2,
389
+};
390
+
391
+static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_usbcan_dev_cfg = {
358392 .clock = {
359393 .freq = 8000000,
360394 },
361395 .timestamp_freq = 1,
362
- .bittiming_const = &kvaser_usb_leaf_bittiming_const,
396
+ .bittiming_const = &kvaser_usb_leaf_m16c_bittiming_const,
363397 };
364398
365
-static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_16mhz = {
399
+static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_m32c_dev_cfg = {
366400 .clock = {
367401 .freq = 16000000,
368402 },
369403 .timestamp_freq = 1,
370
- .bittiming_const = &kvaser_usb_leaf_bittiming_const,
404
+ .bittiming_const = &kvaser_usb_leaf_m32c_bittiming_const,
371405 };
372406
373
-static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_24mhz = {
407
+static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_16mhz = {
408
+ .clock = {
409
+ .freq = 16000000,
410
+ },
411
+ .timestamp_freq = 1,
412
+ .bittiming_const = &kvaser_usb_flexc_bittiming_const,
413
+};
414
+
415
+static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_24mhz = {
374416 .clock = {
375417 .freq = 24000000,
376418 },
377419 .timestamp_freq = 1,
378
- .bittiming_const = &kvaser_usb_leaf_bittiming_const,
420
+ .bittiming_const = &kvaser_usb_flexc_bittiming_const,
379421 };
380422
381
-static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_32mhz = {
423
+static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_32mhz = {
382424 .clock = {
383425 .freq = 32000000,
384426 },
385427 .timestamp_freq = 1,
386
- .bittiming_const = &kvaser_usb_leaf_bittiming_const,
428
+ .bittiming_const = &kvaser_usb_flexc_bittiming_const,
387429 };
430
+
431
+static int kvaser_usb_leaf_verify_size(const struct kvaser_usb *dev,
432
+ const struct kvaser_cmd *cmd)
433
+{
434
+ /* buffer size >= cmd->len ensured by caller */
435
+ u8 min_size = 0;
436
+
437
+ switch (dev->driver_info->family) {
438
+ case KVASER_LEAF:
439
+ if (cmd->id < ARRAY_SIZE(kvaser_usb_leaf_cmd_sizes_leaf))
440
+ min_size = kvaser_usb_leaf_cmd_sizes_leaf[cmd->id];
441
+ break;
442
+ case KVASER_USBCAN:
443
+ if (cmd->id < ARRAY_SIZE(kvaser_usb_leaf_cmd_sizes_usbcan))
444
+ min_size = kvaser_usb_leaf_cmd_sizes_usbcan[cmd->id];
445
+ break;
446
+ }
447
+
448
+ if (min_size == CMD_SIZE_ANY)
449
+ return 0;
450
+
451
+ if (min_size) {
452
+ min_size += CMD_HEADER_LEN;
453
+ if (cmd->len >= min_size)
454
+ return 0;
455
+
456
+ dev_err_ratelimited(&dev->intf->dev,
457
+ "Received command %u too short (size %u, needed %u)",
458
+ cmd->id, cmd->len, min_size);
459
+ return -EIO;
460
+ }
461
+
462
+ dev_warn_ratelimited(&dev->intf->dev,
463
+ "Unhandled command (%d, size %d)\n",
464
+ cmd->id, cmd->len);
465
+ return -EINVAL;
466
+}
388467
389468 static void *
390469 kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv,
....@@ -405,7 +484,7 @@
405484 sizeof(struct kvaser_cmd_tx_can);
406485 cmd->u.tx_can.channel = priv->channel;
407486
408
- switch (dev->card_data.leaf.family) {
487
+ switch (dev->driver_info->family) {
409488 case KVASER_LEAF:
410489 cmd_tx_can_flags = &cmd->u.tx_can.leaf.flags;
411490 break;
....@@ -493,6 +572,9 @@
493572 end:
494573 kfree(buf);
495574
575
+ if (err == 0)
576
+ err = kvaser_usb_leaf_verify_size(dev, cmd);
577
+
496578 return err;
497579 }
498580
....@@ -525,16 +607,23 @@
525607 dev->fw_version = le32_to_cpu(softinfo->fw_version);
526608 dev->max_tx_urbs = le16_to_cpu(softinfo->max_outstanding_tx);
527609
528
- switch (sw_options & KVASER_USB_LEAF_SWOPTION_FREQ_MASK) {
529
- case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK:
530
- dev->cfg = &kvaser_usb_leaf_dev_cfg_16mhz;
531
- break;
532
- case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK:
533
- dev->cfg = &kvaser_usb_leaf_dev_cfg_24mhz;
534
- break;
535
- case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK:
536
- dev->cfg = &kvaser_usb_leaf_dev_cfg_32mhz;
537
- break;
610
+ if (dev->driver_info->quirks & KVASER_USB_QUIRK_IGNORE_CLK_FREQ) {
611
+ /* Firmware expects bittiming parameters calculated for 16MHz
612
+ * clock, regardless of the actual clock
613
+ */
614
+ dev->cfg = &kvaser_usb_leaf_m32c_dev_cfg;
615
+ } else {
616
+ switch (sw_options & KVASER_USB_LEAF_SWOPTION_FREQ_MASK) {
617
+ case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK:
618
+ dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_16mhz;
619
+ break;
620
+ case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK:
621
+ dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_24mhz;
622
+ break;
623
+ case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK:
624
+ dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_32mhz;
625
+ break;
626
+ }
538627 }
539628 }
540629
....@@ -551,7 +640,7 @@
551640 if (err)
552641 return err;
553642
554
- switch (dev->card_data.leaf.family) {
643
+ switch (dev->driver_info->family) {
555644 case KVASER_LEAF:
556645 kvaser_usb_leaf_get_software_info_leaf(dev, &cmd.u.leaf.softinfo);
557646 break;
....@@ -559,7 +648,7 @@
559648 dev->fw_version = le32_to_cpu(cmd.u.usbcan.softinfo.fw_version);
560649 dev->max_tx_urbs =
561650 le16_to_cpu(cmd.u.usbcan.softinfo.max_outstanding_tx);
562
- dev->cfg = &kvaser_usb_leaf_dev_cfg_8mhz;
651
+ dev->cfg = &kvaser_usb_leaf_usbcan_dev_cfg;
563652 break;
564653 }
565654
....@@ -598,7 +687,7 @@
598687
599688 dev->nchannels = cmd.u.cardinfo.nchannels;
600689 if (dev->nchannels > KVASER_USB_MAX_NET_DEVICES ||
601
- (dev->card_data.leaf.family == KVASER_USBCAN &&
690
+ (dev->driver_info->family == KVASER_USBCAN &&
602691 dev->nchannels > MAX_USBCAN_NET_DEVICES))
603692 return -EINVAL;
604693
....@@ -734,7 +823,7 @@
734823 new_state < CAN_STATE_BUS_OFF)
735824 priv->can.can_stats.restarts++;
736825
737
- switch (dev->card_data.leaf.family) {
826
+ switch (dev->driver_info->family) {
738827 case KVASER_LEAF:
739828 if (es->leaf.error_factor) {
740829 priv->can.can_stats.bus_error++;
....@@ -813,7 +902,7 @@
813902 }
814903 }
815904
816
- switch (dev->card_data.leaf.family) {
905
+ switch (dev->driver_info->family) {
817906 case KVASER_LEAF:
818907 if (es->leaf.error_factor) {
819908 cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT;
....@@ -840,8 +929,10 @@
840929 break;
841930 }
842931
843
- cf->data[6] = es->txerr;
844
- cf->data[7] = es->rxerr;
932
+ if (new_state != CAN_STATE_BUS_OFF) {
933
+ cf->data[6] = es->txerr;
934
+ cf->data[7] = es->rxerr;
935
+ }
845936
846937 stats->rx_packets++;
847938 stats->rx_bytes += cf->can_dlc;
....@@ -1005,7 +1096,7 @@
10051096 stats = &priv->netdev->stats;
10061097
10071098 if ((cmd->u.rx_can_header.flag & MSG_FLAG_ERROR_FRAME) &&
1008
- (dev->card_data.leaf.family == KVASER_LEAF &&
1099
+ (dev->driver_info->family == KVASER_LEAF &&
10091100 cmd->id == CMD_LEAF_LOG_MESSAGE)) {
10101101 kvaser_usb_leaf_leaf_rx_error(dev, cmd);
10111102 return;
....@@ -1021,7 +1112,7 @@
10211112 return;
10221113 }
10231114
1024
- switch (dev->card_data.leaf.family) {
1115
+ switch (dev->driver_info->family) {
10251116 case KVASER_LEAF:
10261117 rx_data = cmd->u.leaf.rx_can.data;
10271118 break;
....@@ -1036,7 +1127,7 @@
10361127 return;
10371128 }
10381129
1039
- if (dev->card_data.leaf.family == KVASER_LEAF && cmd->id ==
1130
+ if (dev->driver_info->family == KVASER_LEAF && cmd->id ==
10401131 CMD_LEAF_LOG_MESSAGE) {
10411132 cf->can_id = le32_to_cpu(cmd->u.leaf.log_message.id);
10421133 if (cf->can_id & KVASER_EXTENDED_FRAME)
....@@ -1118,6 +1209,9 @@
11181209 static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev,
11191210 const struct kvaser_cmd *cmd)
11201211 {
1212
+ if (kvaser_usb_leaf_verify_size(dev, cmd) < 0)
1213
+ return;
1214
+
11211215 switch (cmd->id) {
11221216 case CMD_START_CHIP_REPLY:
11231217 kvaser_usb_leaf_start_chip_reply(dev, cmd);
....@@ -1133,14 +1227,14 @@
11331227 break;
11341228
11351229 case CMD_LEAF_LOG_MESSAGE:
1136
- if (dev->card_data.leaf.family != KVASER_LEAF)
1230
+ if (dev->driver_info->family != KVASER_LEAF)
11371231 goto warn;
11381232 kvaser_usb_leaf_rx_can_msg(dev, cmd);
11391233 break;
11401234
11411235 case CMD_CHIP_STATE_EVENT:
11421236 case CMD_CAN_ERROR_EVENT:
1143
- if (dev->card_data.leaf.family == KVASER_LEAF)
1237
+ if (dev->driver_info->family == KVASER_LEAF)
11441238 kvaser_usb_leaf_leaf_rx_error(dev, cmd);
11451239 else
11461240 kvaser_usb_leaf_usbcan_rx_error(dev, cmd);
....@@ -1152,12 +1246,12 @@
11521246
11531247 /* Ignored commands */
11541248 case CMD_USBCAN_CLOCK_OVERFLOW_EVENT:
1155
- if (dev->card_data.leaf.family != KVASER_USBCAN)
1249
+ if (dev->driver_info->family != KVASER_USBCAN)
11561250 goto warn;
11571251 break;
11581252
11591253 case CMD_FLUSH_QUEUE_REPLY:
1160
- if (dev->card_data.leaf.family != KVASER_LEAF)
1254
+ if (dev->driver_info->family != KVASER_LEAF)
11611255 goto warn;
11621256 break;
11631257
....@@ -1230,7 +1324,7 @@
12301324 {
12311325 int err;
12321326
1233
- init_completion(&priv->start_comp);
1327
+ reinit_completion(&priv->start_comp);
12341328
12351329 err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_START_CHIP,
12361330 priv->channel);
....@@ -1248,7 +1342,7 @@
12481342 {
12491343 int err;
12501344
1251
- init_completion(&priv->stop_comp);
1345
+ reinit_completion(&priv->stop_comp);
12521346
12531347 err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_STOP_CHIP,
12541348 priv->channel);
....@@ -1336,9 +1430,13 @@
13361430
13371431 switch (mode) {
13381432 case CAN_MODE_START:
1433
+ kvaser_usb_unlink_tx_urbs(priv);
1434
+
13391435 err = kvaser_usb_leaf_simple_cmd_async(priv, CMD_START_CHIP);
13401436 if (err)
13411437 return err;
1438
+
1439
+ priv->can.state = CAN_STATE_ERROR_ACTIVE;
13421440 break;
13431441 default:
13441442 return -EOPNOTSUPP;