| .. | .. |
|---|
| 100 | 100 | #define USBCAN_ERROR_STATE_RX_ERROR BIT(1) |
|---|
| 101 | 101 | #define USBCAN_ERROR_STATE_BUSERROR BIT(2) |
|---|
| 102 | 102 | |
|---|
| 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 | | - |
|---|
| 113 | 103 | /* ctrl modes */ |
|---|
| 114 | 104 | #define KVASER_CTRL_MODE_NORMAL 1 |
|---|
| 115 | 105 | #define KVASER_CTRL_MODE_SILENT 2 |
|---|
| .. | .. |
|---|
| 319 | 309 | } u; |
|---|
| 320 | 310 | } __packed; |
|---|
| 321 | 311 | |
|---|
| 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 | + |
|---|
| 322 | 344 | /* Summary of a kvaser error event, for a unified Leaf/Usbcan error |
|---|
| 323 | 345 | * handling. Some discrepancies between the two families exist: |
|---|
| 324 | 346 | * |
|---|
| .. | .. |
|---|
| 342 | 364 | }; |
|---|
| 343 | 365 | }; |
|---|
| 344 | 366 | |
|---|
| 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, |
|---|
| 355 | 377 | }; |
|---|
| 356 | 378 | |
|---|
| 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 = { |
|---|
| 358 | 392 | .clock = { |
|---|
| 359 | 393 | .freq = 8000000, |
|---|
| 360 | 394 | }, |
|---|
| 361 | 395 | .timestamp_freq = 1, |
|---|
| 362 | | - .bittiming_const = &kvaser_usb_leaf_bittiming_const, |
|---|
| 396 | + .bittiming_const = &kvaser_usb_leaf_m16c_bittiming_const, |
|---|
| 363 | 397 | }; |
|---|
| 364 | 398 | |
|---|
| 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 = { |
|---|
| 366 | 400 | .clock = { |
|---|
| 367 | 401 | .freq = 16000000, |
|---|
| 368 | 402 | }, |
|---|
| 369 | 403 | .timestamp_freq = 1, |
|---|
| 370 | | - .bittiming_const = &kvaser_usb_leaf_bittiming_const, |
|---|
| 404 | + .bittiming_const = &kvaser_usb_leaf_m32c_bittiming_const, |
|---|
| 371 | 405 | }; |
|---|
| 372 | 406 | |
|---|
| 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 = { |
|---|
| 374 | 416 | .clock = { |
|---|
| 375 | 417 | .freq = 24000000, |
|---|
| 376 | 418 | }, |
|---|
| 377 | 419 | .timestamp_freq = 1, |
|---|
| 378 | | - .bittiming_const = &kvaser_usb_leaf_bittiming_const, |
|---|
| 420 | + .bittiming_const = &kvaser_usb_flexc_bittiming_const, |
|---|
| 379 | 421 | }; |
|---|
| 380 | 422 | |
|---|
| 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 = { |
|---|
| 382 | 424 | .clock = { |
|---|
| 383 | 425 | .freq = 32000000, |
|---|
| 384 | 426 | }, |
|---|
| 385 | 427 | .timestamp_freq = 1, |
|---|
| 386 | | - .bittiming_const = &kvaser_usb_leaf_bittiming_const, |
|---|
| 428 | + .bittiming_const = &kvaser_usb_flexc_bittiming_const, |
|---|
| 387 | 429 | }; |
|---|
| 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 | +} |
|---|
| 388 | 467 | |
|---|
| 389 | 468 | static void * |
|---|
| 390 | 469 | kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv, |
|---|
| .. | .. |
|---|
| 405 | 484 | sizeof(struct kvaser_cmd_tx_can); |
|---|
| 406 | 485 | cmd->u.tx_can.channel = priv->channel; |
|---|
| 407 | 486 | |
|---|
| 408 | | - switch (dev->card_data.leaf.family) { |
|---|
| 487 | + switch (dev->driver_info->family) { |
|---|
| 409 | 488 | case KVASER_LEAF: |
|---|
| 410 | 489 | cmd_tx_can_flags = &cmd->u.tx_can.leaf.flags; |
|---|
| 411 | 490 | break; |
|---|
| .. | .. |
|---|
| 493 | 572 | end: |
|---|
| 494 | 573 | kfree(buf); |
|---|
| 495 | 574 | |
|---|
| 575 | + if (err == 0) |
|---|
| 576 | + err = kvaser_usb_leaf_verify_size(dev, cmd); |
|---|
| 577 | + |
|---|
| 496 | 578 | return err; |
|---|
| 497 | 579 | } |
|---|
| 498 | 580 | |
|---|
| .. | .. |
|---|
| 525 | 607 | dev->fw_version = le32_to_cpu(softinfo->fw_version); |
|---|
| 526 | 608 | dev->max_tx_urbs = le16_to_cpu(softinfo->max_outstanding_tx); |
|---|
| 527 | 609 | |
|---|
| 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 | + } |
|---|
| 538 | 627 | } |
|---|
| 539 | 628 | } |
|---|
| 540 | 629 | |
|---|
| .. | .. |
|---|
| 551 | 640 | if (err) |
|---|
| 552 | 641 | return err; |
|---|
| 553 | 642 | |
|---|
| 554 | | - switch (dev->card_data.leaf.family) { |
|---|
| 643 | + switch (dev->driver_info->family) { |
|---|
| 555 | 644 | case KVASER_LEAF: |
|---|
| 556 | 645 | kvaser_usb_leaf_get_software_info_leaf(dev, &cmd.u.leaf.softinfo); |
|---|
| 557 | 646 | break; |
|---|
| .. | .. |
|---|
| 559 | 648 | dev->fw_version = le32_to_cpu(cmd.u.usbcan.softinfo.fw_version); |
|---|
| 560 | 649 | dev->max_tx_urbs = |
|---|
| 561 | 650 | 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; |
|---|
| 563 | 652 | break; |
|---|
| 564 | 653 | } |
|---|
| 565 | 654 | |
|---|
| .. | .. |
|---|
| 598 | 687 | |
|---|
| 599 | 688 | dev->nchannels = cmd.u.cardinfo.nchannels; |
|---|
| 600 | 689 | if (dev->nchannels > KVASER_USB_MAX_NET_DEVICES || |
|---|
| 601 | | - (dev->card_data.leaf.family == KVASER_USBCAN && |
|---|
| 690 | + (dev->driver_info->family == KVASER_USBCAN && |
|---|
| 602 | 691 | dev->nchannels > MAX_USBCAN_NET_DEVICES)) |
|---|
| 603 | 692 | return -EINVAL; |
|---|
| 604 | 693 | |
|---|
| .. | .. |
|---|
| 734 | 823 | new_state < CAN_STATE_BUS_OFF) |
|---|
| 735 | 824 | priv->can.can_stats.restarts++; |
|---|
| 736 | 825 | |
|---|
| 737 | | - switch (dev->card_data.leaf.family) { |
|---|
| 826 | + switch (dev->driver_info->family) { |
|---|
| 738 | 827 | case KVASER_LEAF: |
|---|
| 739 | 828 | if (es->leaf.error_factor) { |
|---|
| 740 | 829 | priv->can.can_stats.bus_error++; |
|---|
| .. | .. |
|---|
| 813 | 902 | } |
|---|
| 814 | 903 | } |
|---|
| 815 | 904 | |
|---|
| 816 | | - switch (dev->card_data.leaf.family) { |
|---|
| 905 | + switch (dev->driver_info->family) { |
|---|
| 817 | 906 | case KVASER_LEAF: |
|---|
| 818 | 907 | if (es->leaf.error_factor) { |
|---|
| 819 | 908 | cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT; |
|---|
| .. | .. |
|---|
| 840 | 929 | break; |
|---|
| 841 | 930 | } |
|---|
| 842 | 931 | |
|---|
| 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 | + } |
|---|
| 845 | 936 | |
|---|
| 846 | 937 | stats->rx_packets++; |
|---|
| 847 | 938 | stats->rx_bytes += cf->can_dlc; |
|---|
| .. | .. |
|---|
| 1005 | 1096 | stats = &priv->netdev->stats; |
|---|
| 1006 | 1097 | |
|---|
| 1007 | 1098 | 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 && |
|---|
| 1009 | 1100 | cmd->id == CMD_LEAF_LOG_MESSAGE)) { |
|---|
| 1010 | 1101 | kvaser_usb_leaf_leaf_rx_error(dev, cmd); |
|---|
| 1011 | 1102 | return; |
|---|
| .. | .. |
|---|
| 1021 | 1112 | return; |
|---|
| 1022 | 1113 | } |
|---|
| 1023 | 1114 | |
|---|
| 1024 | | - switch (dev->card_data.leaf.family) { |
|---|
| 1115 | + switch (dev->driver_info->family) { |
|---|
| 1025 | 1116 | case KVASER_LEAF: |
|---|
| 1026 | 1117 | rx_data = cmd->u.leaf.rx_can.data; |
|---|
| 1027 | 1118 | break; |
|---|
| .. | .. |
|---|
| 1036 | 1127 | return; |
|---|
| 1037 | 1128 | } |
|---|
| 1038 | 1129 | |
|---|
| 1039 | | - if (dev->card_data.leaf.family == KVASER_LEAF && cmd->id == |
|---|
| 1130 | + if (dev->driver_info->family == KVASER_LEAF && cmd->id == |
|---|
| 1040 | 1131 | CMD_LEAF_LOG_MESSAGE) { |
|---|
| 1041 | 1132 | cf->can_id = le32_to_cpu(cmd->u.leaf.log_message.id); |
|---|
| 1042 | 1133 | if (cf->can_id & KVASER_EXTENDED_FRAME) |
|---|
| .. | .. |
|---|
| 1118 | 1209 | static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev, |
|---|
| 1119 | 1210 | const struct kvaser_cmd *cmd) |
|---|
| 1120 | 1211 | { |
|---|
| 1212 | + if (kvaser_usb_leaf_verify_size(dev, cmd) < 0) |
|---|
| 1213 | + return; |
|---|
| 1214 | + |
|---|
| 1121 | 1215 | switch (cmd->id) { |
|---|
| 1122 | 1216 | case CMD_START_CHIP_REPLY: |
|---|
| 1123 | 1217 | kvaser_usb_leaf_start_chip_reply(dev, cmd); |
|---|
| .. | .. |
|---|
| 1133 | 1227 | break; |
|---|
| 1134 | 1228 | |
|---|
| 1135 | 1229 | case CMD_LEAF_LOG_MESSAGE: |
|---|
| 1136 | | - if (dev->card_data.leaf.family != KVASER_LEAF) |
|---|
| 1230 | + if (dev->driver_info->family != KVASER_LEAF) |
|---|
| 1137 | 1231 | goto warn; |
|---|
| 1138 | 1232 | kvaser_usb_leaf_rx_can_msg(dev, cmd); |
|---|
| 1139 | 1233 | break; |
|---|
| 1140 | 1234 | |
|---|
| 1141 | 1235 | case CMD_CHIP_STATE_EVENT: |
|---|
| 1142 | 1236 | case CMD_CAN_ERROR_EVENT: |
|---|
| 1143 | | - if (dev->card_data.leaf.family == KVASER_LEAF) |
|---|
| 1237 | + if (dev->driver_info->family == KVASER_LEAF) |
|---|
| 1144 | 1238 | kvaser_usb_leaf_leaf_rx_error(dev, cmd); |
|---|
| 1145 | 1239 | else |
|---|
| 1146 | 1240 | kvaser_usb_leaf_usbcan_rx_error(dev, cmd); |
|---|
| .. | .. |
|---|
| 1152 | 1246 | |
|---|
| 1153 | 1247 | /* Ignored commands */ |
|---|
| 1154 | 1248 | case CMD_USBCAN_CLOCK_OVERFLOW_EVENT: |
|---|
| 1155 | | - if (dev->card_data.leaf.family != KVASER_USBCAN) |
|---|
| 1249 | + if (dev->driver_info->family != KVASER_USBCAN) |
|---|
| 1156 | 1250 | goto warn; |
|---|
| 1157 | 1251 | break; |
|---|
| 1158 | 1252 | |
|---|
| 1159 | 1253 | case CMD_FLUSH_QUEUE_REPLY: |
|---|
| 1160 | | - if (dev->card_data.leaf.family != KVASER_LEAF) |
|---|
| 1254 | + if (dev->driver_info->family != KVASER_LEAF) |
|---|
| 1161 | 1255 | goto warn; |
|---|
| 1162 | 1256 | break; |
|---|
| 1163 | 1257 | |
|---|
| .. | .. |
|---|
| 1230 | 1324 | { |
|---|
| 1231 | 1325 | int err; |
|---|
| 1232 | 1326 | |
|---|
| 1233 | | - init_completion(&priv->start_comp); |
|---|
| 1327 | + reinit_completion(&priv->start_comp); |
|---|
| 1234 | 1328 | |
|---|
| 1235 | 1329 | err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_START_CHIP, |
|---|
| 1236 | 1330 | priv->channel); |
|---|
| .. | .. |
|---|
| 1248 | 1342 | { |
|---|
| 1249 | 1343 | int err; |
|---|
| 1250 | 1344 | |
|---|
| 1251 | | - init_completion(&priv->stop_comp); |
|---|
| 1345 | + reinit_completion(&priv->stop_comp); |
|---|
| 1252 | 1346 | |
|---|
| 1253 | 1347 | err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_STOP_CHIP, |
|---|
| 1254 | 1348 | priv->channel); |
|---|
| .. | .. |
|---|
| 1336 | 1430 | |
|---|
| 1337 | 1431 | switch (mode) { |
|---|
| 1338 | 1432 | case CAN_MODE_START: |
|---|
| 1433 | + kvaser_usb_unlink_tx_urbs(priv); |
|---|
| 1434 | + |
|---|
| 1339 | 1435 | err = kvaser_usb_leaf_simple_cmd_async(priv, CMD_START_CHIP); |
|---|
| 1340 | 1436 | if (err) |
|---|
| 1341 | 1437 | return err; |
|---|
| 1438 | + |
|---|
| 1439 | + priv->can.state = CAN_STATE_ERROR_ACTIVE; |
|---|
| 1342 | 1440 | break; |
|---|
| 1343 | 1441 | default: |
|---|
| 1344 | 1442 | return -EOPNOTSUPP; |
|---|