| .. | .. | 
|---|
| 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; | 
|---|