0001
0002
0003
0004
0005
0006
0007 #include <linux/netdevice.h>
0008 #include <linux/usb.h>
0009 #include <linux/module.h>
0010 #include <linux/ethtool.h>
0011
0012 #include <linux/can.h>
0013 #include <linux/can/dev.h>
0014 #include <linux/can/error.h>
0015 #include <linux/can/dev/peak_canfd.h>
0016
0017 #include "pcan_usb_core.h"
0018 #include "pcan_usb_pro.h"
0019
0020 #define PCAN_USBPROFD_CHANNEL_COUNT 2
0021 #define PCAN_USBFD_CHANNEL_COUNT 1
0022
0023
0024 #define PCAN_UFD_CRYSTAL_HZ 80000000
0025
0026 #define PCAN_UFD_CMD_BUFFER_SIZE 512
0027 #define PCAN_UFD_LOSPD_PKT_SIZE 64
0028
0029
0030 #define PCAN_UFD_CMD_TIMEOUT_MS 1000
0031
0032
0033 #define PCAN_UFD_RX_BUFFER_SIZE 2048
0034 #define PCAN_UFD_TX_BUFFER_SIZE 512
0035
0036
0037 #define PCAN_USBFD_TYPE_STD 1
0038 #define PCAN_USBFD_TYPE_EXT 2
0039
0040
0041 struct __packed pcan_ufd_fw_info {
0042 __le16 size_of;
0043 __le16 type;
0044 u8 hw_type;
0045 u8 bl_version[3];
0046 u8 hw_version;
0047 u8 fw_version[3];
0048 __le32 dev_id[2];
0049 __le32 ser_no;
0050 __le32 flags;
0051
0052
0053 u8 cmd_out_ep;
0054 u8 cmd_in_ep;
0055 u8 data_out_ep[2];
0056 u8 data_in_ep;
0057 u8 dummy[3];
0058 };
0059
0060
0061 struct pcan_usb_fd_if {
0062 struct peak_usb_device *dev[PCAN_USB_MAX_CHANNEL];
0063 struct pcan_ufd_fw_info fw_info;
0064 struct peak_time_ref time_ref;
0065 int cm_ignore_count;
0066 int dev_opened_count;
0067 };
0068
0069
0070 struct pcan_usb_fd_device {
0071 struct peak_usb_device dev;
0072 struct can_berr_counter bec;
0073 struct pcan_usb_fd_if *usb_if;
0074 u8 *cmd_buffer_addr;
0075 };
0076
0077
0078
0079
0080 #define PCAN_UFD_CMD_CLK_SET 0x80
0081
0082 #define PCAN_UFD_CLK_80MHZ 0x0
0083 #define PCAN_UFD_CLK_60MHZ 0x1
0084 #define PCAN_UFD_CLK_40MHZ 0x2
0085 #define PCAN_UFD_CLK_30MHZ 0x3
0086 #define PCAN_UFD_CLK_24MHZ 0x4
0087 #define PCAN_UFD_CLK_20MHZ 0x5
0088 #define PCAN_UFD_CLK_DEF PCAN_UFD_CLK_80MHZ
0089
0090 struct __packed pcan_ufd_clock {
0091 __le16 opcode_channel;
0092
0093 u8 mode;
0094 u8 unused[5];
0095 };
0096
0097
0098 #define PCAN_UFD_CMD_LED_SET 0x86
0099
0100 #define PCAN_UFD_LED_DEV 0x00
0101 #define PCAN_UFD_LED_FAST 0x01
0102 #define PCAN_UFD_LED_SLOW 0x02
0103 #define PCAN_UFD_LED_ON 0x03
0104 #define PCAN_UFD_LED_OFF 0x04
0105 #define PCAN_UFD_LED_DEF PCAN_UFD_LED_DEV
0106
0107 struct __packed pcan_ufd_led {
0108 __le16 opcode_channel;
0109
0110 u8 mode;
0111 u8 unused[5];
0112 };
0113
0114
0115 #define PCAN_UFD_FLTEXT_CALIBRATION 0x8000
0116
0117 struct __packed pcan_ufd_options {
0118 __le16 opcode_channel;
0119
0120 __le16 ucan_mask;
0121 u16 unused;
0122 __le16 usb_mask;
0123 };
0124
0125
0126 #define PCAN_UFD_MSG_CALIBRATION 0x100
0127
0128 struct __packed pcan_ufd_ts_msg {
0129 __le16 size;
0130 __le16 type;
0131 __le32 ts_low;
0132 __le32 ts_high;
0133 __le16 usb_frame_index;
0134 u16 unused;
0135 };
0136
0137 #define PCAN_UFD_MSG_OVERRUN 0x101
0138
0139 #define PCAN_UFD_OVMSG_CHANNEL(o) ((o)->channel & 0xf)
0140
0141 struct __packed pcan_ufd_ovr_msg {
0142 __le16 size;
0143 __le16 type;
0144 __le32 ts_low;
0145 __le32 ts_high;
0146 u8 channel;
0147 u8 unused[3];
0148 };
0149
0150 static inline int pufd_omsg_get_channel(struct pcan_ufd_ovr_msg *om)
0151 {
0152 return om->channel & 0xf;
0153 }
0154
0155
0156 static const u32 pcan_usb_fd_clk_freq[6] = {
0157 [PCAN_UFD_CLK_80MHZ] = 80000000,
0158 [PCAN_UFD_CLK_60MHZ] = 60000000,
0159 [PCAN_UFD_CLK_40MHZ] = 40000000,
0160 [PCAN_UFD_CLK_30MHZ] = 30000000,
0161 [PCAN_UFD_CLK_24MHZ] = 24000000,
0162 [PCAN_UFD_CLK_20MHZ] = 20000000
0163 };
0164
0165
0166 static inline
0167 struct pcan_usb_fd_if *pcan_usb_fd_dev_if(struct peak_usb_device *dev)
0168 {
0169 struct pcan_usb_fd_device *pdev =
0170 container_of(dev, struct pcan_usb_fd_device, dev);
0171 return pdev->usb_if;
0172 }
0173
0174
0175 static inline void *pcan_usb_fd_cmd_buffer(struct peak_usb_device *dev)
0176 {
0177 struct pcan_usb_fd_device *pdev =
0178 container_of(dev, struct pcan_usb_fd_device, dev);
0179 return pdev->cmd_buffer_addr;
0180 }
0181
0182
0183 static int pcan_usb_fd_send_cmd(struct peak_usb_device *dev, void *cmd_tail)
0184 {
0185 struct pcan_usb_fd_device *pdev =
0186 container_of(dev, struct pcan_usb_fd_device, dev);
0187 struct pcan_ufd_fw_info *fw_info = &pdev->usb_if->fw_info;
0188 void *cmd_head = pcan_usb_fd_cmd_buffer(dev);
0189 int err = 0;
0190 u8 *packet_ptr;
0191 int packet_len;
0192 ptrdiff_t cmd_len;
0193
0194
0195 if (!(dev->state & PCAN_USB_STATE_CONNECTED))
0196 return 0;
0197
0198
0199
0200
0201 cmd_len = cmd_tail - cmd_head;
0202 if (cmd_len <= (PCAN_UFD_CMD_BUFFER_SIZE - sizeof(u64))) {
0203 memset(cmd_tail, 0xff, sizeof(u64));
0204 cmd_len += sizeof(u64);
0205 }
0206
0207 packet_ptr = cmd_head;
0208 packet_len = cmd_len;
0209
0210
0211 if (unlikely(dev->udev->speed != USB_SPEED_HIGH))
0212 packet_len = min(packet_len, PCAN_UFD_LOSPD_PKT_SIZE);
0213
0214 do {
0215 err = usb_bulk_msg(dev->udev,
0216 usb_sndbulkpipe(dev->udev,
0217 fw_info->cmd_out_ep),
0218 packet_ptr, packet_len,
0219 NULL, PCAN_UFD_CMD_TIMEOUT_MS);
0220 if (err) {
0221 netdev_err(dev->netdev,
0222 "sending command failure: %d\n", err);
0223 break;
0224 }
0225
0226 packet_ptr += packet_len;
0227 cmd_len -= packet_len;
0228
0229 if (cmd_len < PCAN_UFD_LOSPD_PKT_SIZE)
0230 packet_len = cmd_len;
0231
0232 } while (packet_len > 0);
0233
0234 return err;
0235 }
0236
0237
0238 static int pcan_usb_fd_build_restart_cmd(struct peak_usb_device *dev, u8 *buf)
0239 {
0240 struct pucan_wr_err_cnt *prc;
0241 struct pucan_command *cmd;
0242 u8 *pc = buf;
0243
0244
0245 prc = (struct pucan_wr_err_cnt *)pc;
0246 prc->opcode_channel = pucan_cmd_opcode_channel(dev->ctrl_idx,
0247 PUCAN_CMD_WR_ERR_CNT);
0248
0249
0250 prc->sel_mask = cpu_to_le16(PUCAN_WRERRCNT_TE|PUCAN_WRERRCNT_RE);
0251
0252
0253 prc->tx_counter = 0;
0254 prc->rx_counter = 0;
0255
0256
0257 pc += sizeof(struct pucan_wr_err_cnt);
0258
0259
0260 if (dev->can.ctrlmode_supported & CAN_CTRLMODE_FD_NON_ISO) {
0261 struct pucan_options *puo = (struct pucan_options *)pc;
0262
0263 puo->opcode_channel =
0264 (dev->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO) ?
0265 pucan_cmd_opcode_channel(dev->ctrl_idx,
0266 PUCAN_CMD_CLR_DIS_OPTION) :
0267 pucan_cmd_opcode_channel(dev->ctrl_idx,
0268 PUCAN_CMD_SET_EN_OPTION);
0269
0270 puo->options = cpu_to_le16(PUCAN_OPTION_CANDFDISO);
0271
0272
0273
0274
0275 puo->unused = 0;
0276
0277
0278 pc += sizeof(struct pucan_options);
0279 }
0280
0281
0282 cmd = (struct pucan_command *)pc;
0283 cmd->opcode_channel = pucan_cmd_opcode_channel(dev->ctrl_idx,
0284 (dev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) ?
0285 PUCAN_CMD_LISTEN_ONLY_MODE :
0286 PUCAN_CMD_NORMAL_MODE);
0287 pc += sizeof(struct pucan_command);
0288
0289 return pc - buf;
0290 }
0291
0292
0293 static int pcan_usb_fd_set_bus(struct peak_usb_device *dev, u8 onoff)
0294 {
0295 u8 *pc = pcan_usb_fd_cmd_buffer(dev);
0296 int l;
0297
0298 if (onoff) {
0299
0300 l = pcan_usb_fd_build_restart_cmd(dev, pc);
0301 } else {
0302 struct pucan_command *cmd = (struct pucan_command *)pc;
0303
0304
0305 cmd->opcode_channel = pucan_cmd_opcode_channel(dev->ctrl_idx,
0306 PUCAN_CMD_RESET_MODE);
0307 l = sizeof(struct pucan_command);
0308 }
0309
0310
0311 return pcan_usb_fd_send_cmd(dev, pc + l);
0312 }
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324 static int pcan_usb_fd_set_filter_std(struct peak_usb_device *dev, int idx,
0325 u32 mask)
0326 {
0327 struct pucan_filter_std *cmd = pcan_usb_fd_cmd_buffer(dev);
0328 int i, n;
0329
0330
0331 if ((idx < 0) || (idx >= (1 << PUCAN_FLTSTD_ROW_IDX_BITS))) {
0332 n = 1 << PUCAN_FLTSTD_ROW_IDX_BITS;
0333 idx = 0;
0334
0335
0336 } else {
0337 n = idx + 1;
0338 }
0339
0340 for (i = idx; i < n; i++, cmd++) {
0341 cmd->opcode_channel = pucan_cmd_opcode_channel(dev->ctrl_idx,
0342 PUCAN_CMD_FILTER_STD);
0343 cmd->idx = cpu_to_le16(i);
0344 cmd->mask = cpu_to_le32(mask);
0345 }
0346
0347
0348 return pcan_usb_fd_send_cmd(dev, cmd);
0349 }
0350
0351
0352
0353
0354
0355
0356 static int pcan_usb_fd_set_options(struct peak_usb_device *dev,
0357 bool onoff, u16 ucan_mask, u16 usb_mask)
0358 {
0359 struct pcan_ufd_options *cmd = pcan_usb_fd_cmd_buffer(dev);
0360
0361 cmd->opcode_channel = pucan_cmd_opcode_channel(dev->ctrl_idx,
0362 (onoff) ? PUCAN_CMD_SET_EN_OPTION :
0363 PUCAN_CMD_CLR_DIS_OPTION);
0364
0365 cmd->ucan_mask = cpu_to_le16(ucan_mask);
0366 cmd->usb_mask = cpu_to_le16(usb_mask);
0367
0368
0369 return pcan_usb_fd_send_cmd(dev, ++cmd);
0370 }
0371
0372
0373 static int pcan_usb_fd_set_can_led(struct peak_usb_device *dev, u8 led_mode)
0374 {
0375 struct pcan_ufd_led *cmd = pcan_usb_fd_cmd_buffer(dev);
0376
0377 cmd->opcode_channel = pucan_cmd_opcode_channel(dev->ctrl_idx,
0378 PCAN_UFD_CMD_LED_SET);
0379 cmd->mode = led_mode;
0380
0381
0382 return pcan_usb_fd_send_cmd(dev, ++cmd);
0383 }
0384
0385
0386 static int pcan_usb_fd_set_clock_domain(struct peak_usb_device *dev,
0387 u8 clk_mode)
0388 {
0389 struct pcan_ufd_clock *cmd = pcan_usb_fd_cmd_buffer(dev);
0390
0391 cmd->opcode_channel = pucan_cmd_opcode_channel(dev->ctrl_idx,
0392 PCAN_UFD_CMD_CLK_SET);
0393 cmd->mode = clk_mode;
0394
0395
0396 return pcan_usb_fd_send_cmd(dev, ++cmd);
0397 }
0398
0399
0400 static int pcan_usb_fd_set_bittiming_slow(struct peak_usb_device *dev,
0401 struct can_bittiming *bt)
0402 {
0403 struct pucan_timing_slow *cmd = pcan_usb_fd_cmd_buffer(dev);
0404
0405 cmd->opcode_channel = pucan_cmd_opcode_channel(dev->ctrl_idx,
0406 PUCAN_CMD_TIMING_SLOW);
0407 cmd->sjw_t = PUCAN_TSLOW_SJW_T(bt->sjw - 1,
0408 dev->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES);
0409
0410 cmd->tseg2 = PUCAN_TSLOW_TSEG2(bt->phase_seg2 - 1);
0411 cmd->tseg1 = PUCAN_TSLOW_TSEG1(bt->prop_seg + bt->phase_seg1 - 1);
0412 cmd->brp = cpu_to_le16(PUCAN_TSLOW_BRP(bt->brp - 1));
0413
0414 cmd->ewl = 96;
0415
0416
0417 return pcan_usb_fd_send_cmd(dev, ++cmd);
0418 }
0419
0420
0421 static int pcan_usb_fd_set_bittiming_fast(struct peak_usb_device *dev,
0422 struct can_bittiming *bt)
0423 {
0424 struct pucan_timing_fast *cmd = pcan_usb_fd_cmd_buffer(dev);
0425
0426 cmd->opcode_channel = pucan_cmd_opcode_channel(dev->ctrl_idx,
0427 PUCAN_CMD_TIMING_FAST);
0428 cmd->sjw = PUCAN_TFAST_SJW(bt->sjw - 1);
0429 cmd->tseg2 = PUCAN_TFAST_TSEG2(bt->phase_seg2 - 1);
0430 cmd->tseg1 = PUCAN_TFAST_TSEG1(bt->prop_seg + bt->phase_seg1 - 1);
0431 cmd->brp = cpu_to_le16(PUCAN_TFAST_BRP(bt->brp - 1));
0432
0433
0434 return pcan_usb_fd_send_cmd(dev, ++cmd);
0435 }
0436
0437
0438
0439
0440 static int pcan_usb_fd_restart_async(struct peak_usb_device *dev,
0441 struct urb *urb, u8 *buf)
0442 {
0443 struct pcan_usb_fd_device *pdev =
0444 container_of(dev, struct pcan_usb_fd_device, dev);
0445 struct pcan_ufd_fw_info *fw_info = &pdev->usb_if->fw_info;
0446 u8 *pc = buf;
0447
0448
0449
0450
0451 pc += pcan_usb_fd_build_restart_cmd(dev, pc);
0452
0453
0454 memset(pc, 0xff, sizeof(struct pucan_command));
0455 pc += sizeof(struct pucan_command);
0456
0457
0458 usb_fill_bulk_urb(urb, dev->udev,
0459 usb_sndbulkpipe(dev->udev, fw_info->cmd_out_ep),
0460 buf, pc - buf,
0461 pcan_usb_pro_restart_complete, dev);
0462
0463
0464 return usb_submit_urb(urb, GFP_ATOMIC);
0465 }
0466
0467 static int pcan_usb_fd_drv_loaded(struct peak_usb_device *dev, bool loaded)
0468 {
0469 struct pcan_usb_fd_device *pdev =
0470 container_of(dev, struct pcan_usb_fd_device, dev);
0471
0472 pdev->cmd_buffer_addr[0] = 0;
0473 pdev->cmd_buffer_addr[1] = !!loaded;
0474
0475 return pcan_usb_pro_send_req(dev,
0476 PCAN_USBPRO_REQ_FCT,
0477 PCAN_USBPRO_FCT_DRVLD,
0478 pdev->cmd_buffer_addr,
0479 PCAN_USBPRO_FCT_DRVLD_REQ_LEN);
0480 }
0481
0482 static int pcan_usb_fd_decode_canmsg(struct pcan_usb_fd_if *usb_if,
0483 struct pucan_msg *rx_msg)
0484 {
0485 struct pucan_rx_msg *rm = (struct pucan_rx_msg *)rx_msg;
0486 struct peak_usb_device *dev;
0487 struct net_device *netdev;
0488 struct canfd_frame *cfd;
0489 struct sk_buff *skb;
0490 const u16 rx_msg_flags = le16_to_cpu(rm->flags);
0491
0492 if (pucan_msg_get_channel(rm) >= ARRAY_SIZE(usb_if->dev))
0493 return -ENOMEM;
0494
0495 dev = usb_if->dev[pucan_msg_get_channel(rm)];
0496 netdev = dev->netdev;
0497
0498 if (rx_msg_flags & PUCAN_MSG_EXT_DATA_LEN) {
0499
0500 skb = alloc_canfd_skb(netdev, &cfd);
0501 if (!skb)
0502 return -ENOMEM;
0503
0504 if (rx_msg_flags & PUCAN_MSG_BITRATE_SWITCH)
0505 cfd->flags |= CANFD_BRS;
0506
0507 if (rx_msg_flags & PUCAN_MSG_ERROR_STATE_IND)
0508 cfd->flags |= CANFD_ESI;
0509
0510 cfd->len = can_fd_dlc2len(pucan_msg_get_dlc(rm));
0511 } else {
0512
0513 skb = alloc_can_skb(netdev, (struct can_frame **)&cfd);
0514 if (!skb)
0515 return -ENOMEM;
0516
0517 can_frame_set_cc_len((struct can_frame *)cfd,
0518 pucan_msg_get_dlc(rm),
0519 dev->can.ctrlmode);
0520 }
0521
0522 cfd->can_id = le32_to_cpu(rm->can_id);
0523
0524 if (rx_msg_flags & PUCAN_MSG_EXT_ID)
0525 cfd->can_id |= CAN_EFF_FLAG;
0526
0527 if (rx_msg_flags & PUCAN_MSG_RTR) {
0528 cfd->can_id |= CAN_RTR_FLAG;
0529 } else {
0530 memcpy(cfd->data, rm->d, cfd->len);
0531 netdev->stats.rx_bytes += cfd->len;
0532 }
0533 netdev->stats.rx_packets++;
0534
0535 peak_usb_netif_rx_64(skb, le32_to_cpu(rm->ts_low),
0536 le32_to_cpu(rm->ts_high));
0537
0538 return 0;
0539 }
0540
0541
0542 static int pcan_usb_fd_decode_status(struct pcan_usb_fd_if *usb_if,
0543 struct pucan_msg *rx_msg)
0544 {
0545 struct pucan_status_msg *sm = (struct pucan_status_msg *)rx_msg;
0546 struct pcan_usb_fd_device *pdev;
0547 enum can_state new_state = CAN_STATE_ERROR_ACTIVE;
0548 enum can_state rx_state, tx_state;
0549 struct peak_usb_device *dev;
0550 struct net_device *netdev;
0551 struct can_frame *cf;
0552 struct sk_buff *skb;
0553
0554 if (pucan_stmsg_get_channel(sm) >= ARRAY_SIZE(usb_if->dev))
0555 return -ENOMEM;
0556
0557 dev = usb_if->dev[pucan_stmsg_get_channel(sm)];
0558 pdev = container_of(dev, struct pcan_usb_fd_device, dev);
0559 netdev = dev->netdev;
0560
0561
0562 if (dev->can.state == CAN_STATE_BUS_OFF)
0563 return 0;
0564
0565 if (sm->channel_p_w_b & PUCAN_BUS_BUSOFF) {
0566 new_state = CAN_STATE_BUS_OFF;
0567 } else if (sm->channel_p_w_b & PUCAN_BUS_PASSIVE) {
0568 new_state = CAN_STATE_ERROR_PASSIVE;
0569 } else if (sm->channel_p_w_b & PUCAN_BUS_WARNING) {
0570 new_state = CAN_STATE_ERROR_WARNING;
0571 } else {
0572
0573 new_state = CAN_STATE_ERROR_ACTIVE;
0574 pdev->bec.txerr = 0;
0575 pdev->bec.rxerr = 0;
0576 }
0577
0578
0579 if (new_state == dev->can.state)
0580 return 0;
0581
0582
0583 tx_state = (pdev->bec.txerr >= pdev->bec.rxerr) ? new_state : 0;
0584 rx_state = (pdev->bec.txerr <= pdev->bec.rxerr) ? new_state : 0;
0585
0586
0587 skb = alloc_can_err_skb(netdev, &cf);
0588 can_change_state(netdev, cf, tx_state, rx_state);
0589
0590
0591 if (new_state == CAN_STATE_BUS_OFF)
0592 can_bus_off(netdev);
0593
0594 if (!skb)
0595 return -ENOMEM;
0596
0597 peak_usb_netif_rx_64(skb, le32_to_cpu(sm->ts_low),
0598 le32_to_cpu(sm->ts_high));
0599
0600 return 0;
0601 }
0602
0603
0604 static int pcan_usb_fd_decode_error(struct pcan_usb_fd_if *usb_if,
0605 struct pucan_msg *rx_msg)
0606 {
0607 struct pucan_error_msg *er = (struct pucan_error_msg *)rx_msg;
0608 struct pcan_usb_fd_device *pdev;
0609 struct peak_usb_device *dev;
0610
0611 if (pucan_ermsg_get_channel(er) >= ARRAY_SIZE(usb_if->dev))
0612 return -EINVAL;
0613
0614 dev = usb_if->dev[pucan_ermsg_get_channel(er)];
0615 pdev = container_of(dev, struct pcan_usb_fd_device, dev);
0616
0617
0618 pdev->bec.txerr = er->tx_err_cnt;
0619 pdev->bec.rxerr = er->rx_err_cnt;
0620
0621 return 0;
0622 }
0623
0624
0625 static int pcan_usb_fd_decode_overrun(struct pcan_usb_fd_if *usb_if,
0626 struct pucan_msg *rx_msg)
0627 {
0628 struct pcan_ufd_ovr_msg *ov = (struct pcan_ufd_ovr_msg *)rx_msg;
0629 struct peak_usb_device *dev;
0630 struct net_device *netdev;
0631 struct can_frame *cf;
0632 struct sk_buff *skb;
0633
0634 if (pufd_omsg_get_channel(ov) >= ARRAY_SIZE(usb_if->dev))
0635 return -EINVAL;
0636
0637 dev = usb_if->dev[pufd_omsg_get_channel(ov)];
0638 netdev = dev->netdev;
0639
0640
0641 skb = alloc_can_err_skb(netdev, &cf);
0642 if (!skb)
0643 return -ENOMEM;
0644
0645 cf->can_id |= CAN_ERR_CRTL;
0646 cf->data[1] |= CAN_ERR_CRTL_RX_OVERFLOW;
0647
0648 peak_usb_netif_rx_64(skb, le32_to_cpu(ov->ts_low),
0649 le32_to_cpu(ov->ts_high));
0650
0651 netdev->stats.rx_over_errors++;
0652 netdev->stats.rx_errors++;
0653
0654 return 0;
0655 }
0656
0657
0658 static void pcan_usb_fd_decode_ts(struct pcan_usb_fd_if *usb_if,
0659 struct pucan_msg *rx_msg)
0660 {
0661 struct pcan_ufd_ts_msg *ts = (struct pcan_ufd_ts_msg *)rx_msg;
0662
0663
0664 if (usb_if->cm_ignore_count > 0)
0665 usb_if->cm_ignore_count--;
0666 else
0667 peak_usb_set_ts_now(&usb_if->time_ref, le32_to_cpu(ts->ts_low));
0668 }
0669
0670
0671 static int pcan_usb_fd_decode_buf(struct peak_usb_device *dev, struct urb *urb)
0672 {
0673 struct pcan_usb_fd_if *usb_if = pcan_usb_fd_dev_if(dev);
0674 struct net_device *netdev = dev->netdev;
0675 struct pucan_msg *rx_msg;
0676 u8 *msg_ptr, *msg_end;
0677 int err = 0;
0678
0679
0680 msg_ptr = urb->transfer_buffer;
0681 msg_end = urb->transfer_buffer + urb->actual_length;
0682 for (; msg_ptr < msg_end;) {
0683 u16 rx_msg_type, rx_msg_size;
0684
0685 rx_msg = (struct pucan_msg *)msg_ptr;
0686 if (!rx_msg->size) {
0687
0688 break;
0689 }
0690
0691 rx_msg_size = le16_to_cpu(rx_msg->size);
0692 rx_msg_type = le16_to_cpu(rx_msg->type);
0693
0694
0695 if (msg_ptr + rx_msg_size > msg_end) {
0696 netdev_err(netdev,
0697 "got frag rec: should inc usb rx buf sze\n");
0698 err = -EBADMSG;
0699 break;
0700 }
0701
0702 switch (rx_msg_type) {
0703 case PUCAN_MSG_CAN_RX:
0704 err = pcan_usb_fd_decode_canmsg(usb_if, rx_msg);
0705 if (err < 0)
0706 goto fail;
0707 break;
0708
0709 case PCAN_UFD_MSG_CALIBRATION:
0710 pcan_usb_fd_decode_ts(usb_if, rx_msg);
0711 break;
0712
0713 case PUCAN_MSG_ERROR:
0714 err = pcan_usb_fd_decode_error(usb_if, rx_msg);
0715 if (err < 0)
0716 goto fail;
0717 break;
0718
0719 case PUCAN_MSG_STATUS:
0720 err = pcan_usb_fd_decode_status(usb_if, rx_msg);
0721 if (err < 0)
0722 goto fail;
0723 break;
0724
0725 case PCAN_UFD_MSG_OVERRUN:
0726 err = pcan_usb_fd_decode_overrun(usb_if, rx_msg);
0727 if (err < 0)
0728 goto fail;
0729 break;
0730
0731 default:
0732 netdev_err(netdev,
0733 "unhandled msg type 0x%02x (%d): ignored\n",
0734 rx_msg_type, rx_msg_type);
0735 break;
0736 }
0737
0738 msg_ptr += rx_msg_size;
0739 }
0740
0741 fail:
0742 if (err)
0743 pcan_dump_mem("received msg",
0744 urb->transfer_buffer, urb->actual_length);
0745 return err;
0746 }
0747
0748
0749 static int pcan_usb_fd_encode_msg(struct peak_usb_device *dev,
0750 struct sk_buff *skb, u8 *obuf, size_t *size)
0751 {
0752 struct pucan_tx_msg *tx_msg = (struct pucan_tx_msg *)obuf;
0753 struct canfd_frame *cfd = (struct canfd_frame *)skb->data;
0754 u16 tx_msg_size, tx_msg_flags;
0755 u8 dlc;
0756
0757 if (cfd->len > CANFD_MAX_DLEN)
0758 return -EINVAL;
0759
0760 tx_msg_size = ALIGN(sizeof(struct pucan_tx_msg) + cfd->len, 4);
0761 tx_msg->size = cpu_to_le16(tx_msg_size);
0762 tx_msg->type = cpu_to_le16(PUCAN_MSG_CAN_TX);
0763
0764 tx_msg_flags = 0;
0765 if (cfd->can_id & CAN_EFF_FLAG) {
0766 tx_msg_flags |= PUCAN_MSG_EXT_ID;
0767 tx_msg->can_id = cpu_to_le32(cfd->can_id & CAN_EFF_MASK);
0768 } else {
0769 tx_msg->can_id = cpu_to_le32(cfd->can_id & CAN_SFF_MASK);
0770 }
0771
0772 if (can_is_canfd_skb(skb)) {
0773
0774 dlc = can_fd_len2dlc(cfd->len);
0775
0776 tx_msg_flags |= PUCAN_MSG_EXT_DATA_LEN;
0777
0778 if (cfd->flags & CANFD_BRS)
0779 tx_msg_flags |= PUCAN_MSG_BITRATE_SWITCH;
0780
0781 if (cfd->flags & CANFD_ESI)
0782 tx_msg_flags |= PUCAN_MSG_ERROR_STATE_IND;
0783 } else {
0784
0785 dlc = can_get_cc_dlc((struct can_frame *)cfd,
0786 dev->can.ctrlmode);
0787
0788 if (cfd->can_id & CAN_RTR_FLAG)
0789 tx_msg_flags |= PUCAN_MSG_RTR;
0790 }
0791
0792
0793 if (dev->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
0794 tx_msg_flags |= PUCAN_MSG_SINGLE_SHOT;
0795
0796 tx_msg->flags = cpu_to_le16(tx_msg_flags);
0797 tx_msg->channel_dlc = PUCAN_MSG_CHANNEL_DLC(dev->ctrl_idx, dlc);
0798 memcpy(tx_msg->d, cfd->data, cfd->len);
0799
0800
0801
0802 tx_msg = (struct pucan_tx_msg *)(obuf + tx_msg_size);
0803
0804 tx_msg->size = 0;
0805
0806
0807 *size = tx_msg_size + sizeof(u32);
0808
0809 return 0;
0810 }
0811
0812
0813 static int pcan_usb_fd_start(struct peak_usb_device *dev)
0814 {
0815 struct pcan_usb_fd_device *pdev =
0816 container_of(dev, struct pcan_usb_fd_device, dev);
0817 int err;
0818
0819
0820 err = pcan_usb_fd_set_filter_std(dev, -1, 0xffffffff);
0821 if (err)
0822 return err;
0823
0824
0825 if (pdev->usb_if->dev_opened_count == 0) {
0826
0827 peak_usb_init_time_ref(&pdev->usb_if->time_ref,
0828 &pcan_usb_pro_fd);
0829
0830
0831 err = pcan_usb_fd_set_options(dev, 1,
0832 PUCAN_OPTION_ERROR,
0833 PCAN_UFD_FLTEXT_CALIBRATION);
0834 }
0835
0836 pdev->usb_if->dev_opened_count++;
0837
0838
0839 pdev->bec.txerr = 0;
0840 pdev->bec.rxerr = 0;
0841
0842 return err;
0843 }
0844
0845
0846 static int pcan_usb_fd_get_berr_counter(const struct net_device *netdev,
0847 struct can_berr_counter *bec)
0848 {
0849 struct peak_usb_device *dev = netdev_priv(netdev);
0850 struct pcan_usb_fd_device *pdev =
0851 container_of(dev, struct pcan_usb_fd_device, dev);
0852
0853 *bec = pdev->bec;
0854
0855
0856 return 0;
0857 }
0858
0859
0860 static int pcan_usb_fd_probe(struct usb_interface *intf)
0861 {
0862 struct usb_host_interface *iface_desc = &intf->altsetting[0];
0863
0864
0865 return iface_desc->desc.bInterfaceNumber;
0866 }
0867
0868
0869 static int pcan_usb_fd_stop(struct peak_usb_device *dev)
0870 {
0871 struct pcan_usb_fd_device *pdev =
0872 container_of(dev, struct pcan_usb_fd_device, dev);
0873
0874
0875 if (pdev->usb_if->dev_opened_count == 1)
0876 pcan_usb_fd_set_options(dev, 0,
0877 PUCAN_OPTION_ERROR,
0878 PCAN_UFD_FLTEXT_CALIBRATION);
0879 pdev->usb_if->dev_opened_count--;
0880
0881 return 0;
0882 }
0883
0884
0885 static int pcan_usb_fd_init(struct peak_usb_device *dev)
0886 {
0887 struct pcan_usb_fd_device *pdev =
0888 container_of(dev, struct pcan_usb_fd_device, dev);
0889 struct pcan_ufd_fw_info *fw_info;
0890 int i, err = -ENOMEM;
0891
0892
0893 if (!dev->prev_siblings) {
0894
0895 pdev->usb_if = kzalloc(sizeof(*pdev->usb_if), GFP_KERNEL);
0896 if (!pdev->usb_if)
0897 goto err_out;
0898
0899
0900 pdev->cmd_buffer_addr = kzalloc(PCAN_UFD_CMD_BUFFER_SIZE,
0901 GFP_KERNEL);
0902 if (!pdev->cmd_buffer_addr)
0903 goto err_out_1;
0904
0905
0906 pdev->usb_if->cm_ignore_count = 5;
0907
0908 fw_info = &pdev->usb_if->fw_info;
0909
0910 err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_INFO,
0911 PCAN_USBPRO_INFO_FW,
0912 fw_info,
0913 sizeof(*fw_info));
0914 if (err) {
0915 dev_err(dev->netdev->dev.parent,
0916 "unable to read %s firmware info (err %d)\n",
0917 dev->adapter->name, err);
0918 goto err_out_2;
0919 }
0920
0921
0922
0923
0924
0925 dev_info(dev->netdev->dev.parent,
0926 "PEAK-System %s v%u fw v%u.%u.%u (%u channels)\n",
0927 dev->adapter->name, fw_info->hw_version,
0928 fw_info->fw_version[0],
0929 fw_info->fw_version[1],
0930 fw_info->fw_version[2],
0931 dev->adapter->ctrl_count);
0932
0933
0934 if (fw_info->fw_version[0] >= 2) {
0935
0936 dev->can.ctrlmode_supported |= CAN_CTRLMODE_FD_NON_ISO;
0937 } else {
0938
0939 dev->can.ctrlmode |= CAN_CTRLMODE_FD_NON_ISO;
0940 }
0941
0942
0943
0944
0945 if (fw_info->type != cpu_to_le16(PCAN_USBFD_TYPE_EXT)) {
0946 fw_info->cmd_out_ep = PCAN_USBPRO_EP_CMDOUT;
0947 fw_info->cmd_in_ep = PCAN_USBPRO_EP_CMDIN;
0948 }
0949
0950
0951 err = pcan_usb_fd_drv_loaded(dev, 1);
0952 if (err) {
0953 dev_err(dev->netdev->dev.parent,
0954 "unable to tell %s driver is loaded (err %d)\n",
0955 dev->adapter->name, err);
0956 goto err_out_2;
0957 }
0958 } else {
0959
0960 struct pcan_usb_fd_device *ppdev =
0961 container_of(dev->prev_siblings,
0962 struct pcan_usb_fd_device, dev);
0963
0964 pdev->usb_if = ppdev->usb_if;
0965 pdev->cmd_buffer_addr = ppdev->cmd_buffer_addr;
0966
0967
0968 dev->can.ctrlmode = ppdev->dev.can.ctrlmode;
0969 dev->can.ctrlmode_supported = ppdev->dev.can.ctrlmode_supported;
0970
0971 fw_info = &pdev->usb_if->fw_info;
0972 }
0973
0974 pdev->usb_if->dev[dev->ctrl_idx] = dev;
0975 dev->device_number =
0976 le32_to_cpu(pdev->usb_if->fw_info.dev_id[dev->ctrl_idx]);
0977
0978
0979
0980
0981
0982 if (fw_info->type == cpu_to_le16(PCAN_USBFD_TYPE_EXT)) {
0983 dev->ep_msg_in = fw_info->data_in_ep;
0984 dev->ep_msg_out = fw_info->data_out_ep[dev->ctrl_idx];
0985 }
0986
0987
0988 for (i = 0; i < ARRAY_SIZE(pcan_usb_fd_clk_freq); i++)
0989 if (dev->adapter->clock.freq == pcan_usb_fd_clk_freq[i])
0990 break;
0991
0992 if (i >= ARRAY_SIZE(pcan_usb_fd_clk_freq)) {
0993 dev_warn(dev->netdev->dev.parent,
0994 "incompatible clock frequencies\n");
0995 err = -EINVAL;
0996 goto err_out_2;
0997 }
0998
0999 pcan_usb_fd_set_clock_domain(dev, i);
1000
1001
1002 pcan_usb_fd_set_can_led(dev, PCAN_UFD_LED_DEF);
1003
1004 return 0;
1005
1006 err_out_2:
1007 kfree(pdev->cmd_buffer_addr);
1008 err_out_1:
1009 kfree(pdev->usb_if);
1010 err_out:
1011 return err;
1012 }
1013
1014
1015 static void pcan_usb_fd_exit(struct peak_usb_device *dev)
1016 {
1017 struct pcan_usb_fd_device *pdev =
1018 container_of(dev, struct pcan_usb_fd_device, dev);
1019
1020
1021
1022
1023 if (dev->can.state != CAN_STATE_STOPPED) {
1024
1025 pcan_usb_fd_set_bus(dev, 0);
1026 }
1027
1028
1029 pcan_usb_fd_set_can_led(dev, PCAN_UFD_LED_OFF);
1030
1031
1032 if (dev->ctrl_idx == 0) {
1033
1034 if (pdev->usb_if->dev_opened_count > 0)
1035 pcan_usb_fd_set_options(dev, 0,
1036 PUCAN_OPTION_ERROR,
1037 PCAN_UFD_FLTEXT_CALIBRATION);
1038
1039
1040 pcan_usb_fd_drv_loaded(dev, 0);
1041 }
1042 }
1043
1044
1045 static void pcan_usb_fd_free(struct peak_usb_device *dev)
1046 {
1047
1048 if (!dev->prev_siblings && !dev->next_siblings) {
1049 struct pcan_usb_fd_device *pdev =
1050 container_of(dev, struct pcan_usb_fd_device, dev);
1051
1052
1053 kfree(pdev->cmd_buffer_addr);
1054
1055
1056 kfree(pdev->usb_if);
1057 }
1058 }
1059
1060
1061 static int pcan_usb_fd_set_phys_id(struct net_device *netdev,
1062 enum ethtool_phys_id_state state)
1063 {
1064 struct peak_usb_device *dev = netdev_priv(netdev);
1065 int err = 0;
1066
1067 switch (state) {
1068 case ETHTOOL_ID_ACTIVE:
1069 err = pcan_usb_fd_set_can_led(dev, PCAN_UFD_LED_FAST);
1070 break;
1071 case ETHTOOL_ID_INACTIVE:
1072 err = pcan_usb_fd_set_can_led(dev, PCAN_UFD_LED_DEF);
1073 break;
1074 default:
1075 break;
1076 }
1077
1078 return err;
1079 }
1080
1081 static const struct ethtool_ops pcan_usb_fd_ethtool_ops = {
1082 .set_phys_id = pcan_usb_fd_set_phys_id,
1083 .get_ts_info = pcan_get_ts_info,
1084 };
1085
1086
1087 static const struct can_bittiming_const pcan_usb_fd_const = {
1088 .name = "pcan_usb_fd",
1089 .tseg1_min = 1,
1090 .tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
1091 .tseg2_min = 1,
1092 .tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
1093 .sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
1094 .brp_min = 1,
1095 .brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
1096 .brp_inc = 1,
1097 };
1098
1099 static const struct can_bittiming_const pcan_usb_fd_data_const = {
1100 .name = "pcan_usb_fd",
1101 .tseg1_min = 1,
1102 .tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
1103 .tseg2_min = 1,
1104 .tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
1105 .sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
1106 .brp_min = 1,
1107 .brp_max = (1 << PUCAN_TFAST_BRP_BITS),
1108 .brp_inc = 1,
1109 };
1110
1111 const struct peak_usb_adapter pcan_usb_fd = {
1112 .name = "PCAN-USB FD",
1113 .device_id = PCAN_USBFD_PRODUCT_ID,
1114 .ctrl_count = PCAN_USBFD_CHANNEL_COUNT,
1115 .ctrlmode_supported = CAN_CTRLMODE_FD |
1116 CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY |
1117 CAN_CTRLMODE_ONE_SHOT | CAN_CTRLMODE_CC_LEN8_DLC,
1118 .clock = {
1119 .freq = PCAN_UFD_CRYSTAL_HZ,
1120 },
1121 .bittiming_const = &pcan_usb_fd_const,
1122 .data_bittiming_const = &pcan_usb_fd_data_const,
1123
1124
1125 .sizeof_dev_private = sizeof(struct pcan_usb_fd_device),
1126
1127 .ethtool_ops = &pcan_usb_fd_ethtool_ops,
1128
1129
1130 .ts_used_bits = 32,
1131 .us_per_ts_scale = 1,
1132 .us_per_ts_shift = 0,
1133
1134
1135 .ep_msg_in = PCAN_USBPRO_EP_MSGIN,
1136 .ep_msg_out = {PCAN_USBPRO_EP_MSGOUT_0},
1137
1138
1139 .rx_buffer_size = PCAN_UFD_RX_BUFFER_SIZE,
1140 .tx_buffer_size = PCAN_UFD_TX_BUFFER_SIZE,
1141
1142
1143 .intf_probe = pcan_usb_fd_probe,
1144 .dev_init = pcan_usb_fd_init,
1145
1146 .dev_exit = pcan_usb_fd_exit,
1147 .dev_free = pcan_usb_fd_free,
1148 .dev_set_bus = pcan_usb_fd_set_bus,
1149 .dev_set_bittiming = pcan_usb_fd_set_bittiming_slow,
1150 .dev_set_data_bittiming = pcan_usb_fd_set_bittiming_fast,
1151 .dev_decode_buf = pcan_usb_fd_decode_buf,
1152 .dev_start = pcan_usb_fd_start,
1153 .dev_stop = pcan_usb_fd_stop,
1154 .dev_restart_async = pcan_usb_fd_restart_async,
1155 .dev_encode_msg = pcan_usb_fd_encode_msg,
1156
1157 .do_get_berr_counter = pcan_usb_fd_get_berr_counter,
1158 };
1159
1160
1161 static const struct can_bittiming_const pcan_usb_chip_const = {
1162 .name = "pcan_chip_usb",
1163 .tseg1_min = 1,
1164 .tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
1165 .tseg2_min = 1,
1166 .tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
1167 .sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
1168 .brp_min = 1,
1169 .brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
1170 .brp_inc = 1,
1171 };
1172
1173 static const struct can_bittiming_const pcan_usb_chip_data_const = {
1174 .name = "pcan_chip_usb",
1175 .tseg1_min = 1,
1176 .tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
1177 .tseg2_min = 1,
1178 .tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
1179 .sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
1180 .brp_min = 1,
1181 .brp_max = (1 << PUCAN_TFAST_BRP_BITS),
1182 .brp_inc = 1,
1183 };
1184
1185 const struct peak_usb_adapter pcan_usb_chip = {
1186 .name = "PCAN-Chip USB",
1187 .device_id = PCAN_USBCHIP_PRODUCT_ID,
1188 .ctrl_count = PCAN_USBFD_CHANNEL_COUNT,
1189 .ctrlmode_supported = CAN_CTRLMODE_FD |
1190 CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY |
1191 CAN_CTRLMODE_ONE_SHOT | CAN_CTRLMODE_CC_LEN8_DLC,
1192 .clock = {
1193 .freq = PCAN_UFD_CRYSTAL_HZ,
1194 },
1195 .bittiming_const = &pcan_usb_chip_const,
1196 .data_bittiming_const = &pcan_usb_chip_data_const,
1197
1198
1199 .sizeof_dev_private = sizeof(struct pcan_usb_fd_device),
1200
1201 .ethtool_ops = &pcan_usb_fd_ethtool_ops,
1202
1203
1204 .ts_used_bits = 32,
1205 .us_per_ts_scale = 1,
1206 .us_per_ts_shift = 0,
1207
1208
1209 .ep_msg_in = PCAN_USBPRO_EP_MSGIN,
1210 .ep_msg_out = {PCAN_USBPRO_EP_MSGOUT_0},
1211
1212
1213 .rx_buffer_size = PCAN_UFD_RX_BUFFER_SIZE,
1214 .tx_buffer_size = PCAN_UFD_TX_BUFFER_SIZE,
1215
1216
1217 .intf_probe = pcan_usb_pro_probe,
1218 .dev_init = pcan_usb_fd_init,
1219
1220 .dev_exit = pcan_usb_fd_exit,
1221 .dev_free = pcan_usb_fd_free,
1222 .dev_set_bus = pcan_usb_fd_set_bus,
1223 .dev_set_bittiming = pcan_usb_fd_set_bittiming_slow,
1224 .dev_set_data_bittiming = pcan_usb_fd_set_bittiming_fast,
1225 .dev_decode_buf = pcan_usb_fd_decode_buf,
1226 .dev_start = pcan_usb_fd_start,
1227 .dev_stop = pcan_usb_fd_stop,
1228 .dev_restart_async = pcan_usb_fd_restart_async,
1229 .dev_encode_msg = pcan_usb_fd_encode_msg,
1230
1231 .do_get_berr_counter = pcan_usb_fd_get_berr_counter,
1232 };
1233
1234
1235 static const struct can_bittiming_const pcan_usb_pro_fd_const = {
1236 .name = "pcan_usb_pro_fd",
1237 .tseg1_min = 1,
1238 .tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
1239 .tseg2_min = 1,
1240 .tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
1241 .sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
1242 .brp_min = 1,
1243 .brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
1244 .brp_inc = 1,
1245 };
1246
1247 static const struct can_bittiming_const pcan_usb_pro_fd_data_const = {
1248 .name = "pcan_usb_pro_fd",
1249 .tseg1_min = 1,
1250 .tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
1251 .tseg2_min = 1,
1252 .tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
1253 .sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
1254 .brp_min = 1,
1255 .brp_max = (1 << PUCAN_TFAST_BRP_BITS),
1256 .brp_inc = 1,
1257 };
1258
1259 const struct peak_usb_adapter pcan_usb_pro_fd = {
1260 .name = "PCAN-USB Pro FD",
1261 .device_id = PCAN_USBPROFD_PRODUCT_ID,
1262 .ctrl_count = PCAN_USBPROFD_CHANNEL_COUNT,
1263 .ctrlmode_supported = CAN_CTRLMODE_FD |
1264 CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY |
1265 CAN_CTRLMODE_ONE_SHOT | CAN_CTRLMODE_CC_LEN8_DLC,
1266 .clock = {
1267 .freq = PCAN_UFD_CRYSTAL_HZ,
1268 },
1269 .bittiming_const = &pcan_usb_pro_fd_const,
1270 .data_bittiming_const = &pcan_usb_pro_fd_data_const,
1271
1272
1273 .sizeof_dev_private = sizeof(struct pcan_usb_fd_device),
1274
1275 .ethtool_ops = &pcan_usb_fd_ethtool_ops,
1276
1277
1278 .ts_used_bits = 32,
1279 .us_per_ts_scale = 1,
1280 .us_per_ts_shift = 0,
1281
1282
1283 .ep_msg_in = PCAN_USBPRO_EP_MSGIN,
1284 .ep_msg_out = {PCAN_USBPRO_EP_MSGOUT_0, PCAN_USBPRO_EP_MSGOUT_1},
1285
1286
1287 .rx_buffer_size = PCAN_UFD_RX_BUFFER_SIZE,
1288 .tx_buffer_size = PCAN_UFD_TX_BUFFER_SIZE,
1289
1290
1291 .intf_probe = pcan_usb_pro_probe,
1292 .dev_init = pcan_usb_fd_init,
1293
1294 .dev_exit = pcan_usb_fd_exit,
1295 .dev_free = pcan_usb_fd_free,
1296 .dev_set_bus = pcan_usb_fd_set_bus,
1297 .dev_set_bittiming = pcan_usb_fd_set_bittiming_slow,
1298 .dev_set_data_bittiming = pcan_usb_fd_set_bittiming_fast,
1299 .dev_decode_buf = pcan_usb_fd_decode_buf,
1300 .dev_start = pcan_usb_fd_start,
1301 .dev_stop = pcan_usb_fd_stop,
1302 .dev_restart_async = pcan_usb_fd_restart_async,
1303 .dev_encode_msg = pcan_usb_fd_encode_msg,
1304
1305 .do_get_berr_counter = pcan_usb_fd_get_berr_counter,
1306 };
1307
1308
1309 static const struct can_bittiming_const pcan_usb_x6_const = {
1310 .name = "pcan_usb_x6",
1311 .tseg1_min = 1,
1312 .tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
1313 .tseg2_min = 1,
1314 .tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
1315 .sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
1316 .brp_min = 1,
1317 .brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
1318 .brp_inc = 1,
1319 };
1320
1321 static const struct can_bittiming_const pcan_usb_x6_data_const = {
1322 .name = "pcan_usb_x6",
1323 .tseg1_min = 1,
1324 .tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
1325 .tseg2_min = 1,
1326 .tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
1327 .sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
1328 .brp_min = 1,
1329 .brp_max = (1 << PUCAN_TFAST_BRP_BITS),
1330 .brp_inc = 1,
1331 };
1332
1333 const struct peak_usb_adapter pcan_usb_x6 = {
1334 .name = "PCAN-USB X6",
1335 .device_id = PCAN_USBX6_PRODUCT_ID,
1336 .ctrl_count = PCAN_USBPROFD_CHANNEL_COUNT,
1337 .ctrlmode_supported = CAN_CTRLMODE_FD |
1338 CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY |
1339 CAN_CTRLMODE_ONE_SHOT | CAN_CTRLMODE_CC_LEN8_DLC,
1340 .clock = {
1341 .freq = PCAN_UFD_CRYSTAL_HZ,
1342 },
1343 .bittiming_const = &pcan_usb_x6_const,
1344 .data_bittiming_const = &pcan_usb_x6_data_const,
1345
1346
1347 .sizeof_dev_private = sizeof(struct pcan_usb_fd_device),
1348
1349 .ethtool_ops = &pcan_usb_fd_ethtool_ops,
1350
1351
1352 .ts_used_bits = 32,
1353 .us_per_ts_scale = 1,
1354 .us_per_ts_shift = 0,
1355
1356
1357 .ep_msg_in = PCAN_USBPRO_EP_MSGIN,
1358 .ep_msg_out = {PCAN_USBPRO_EP_MSGOUT_0, PCAN_USBPRO_EP_MSGOUT_1},
1359
1360
1361 .rx_buffer_size = PCAN_UFD_RX_BUFFER_SIZE,
1362 .tx_buffer_size = PCAN_UFD_TX_BUFFER_SIZE,
1363
1364
1365 .intf_probe = pcan_usb_pro_probe,
1366 .dev_init = pcan_usb_fd_init,
1367
1368 .dev_exit = pcan_usb_fd_exit,
1369 .dev_free = pcan_usb_fd_free,
1370 .dev_set_bus = pcan_usb_fd_set_bus,
1371 .dev_set_bittiming = pcan_usb_fd_set_bittiming_slow,
1372 .dev_set_data_bittiming = pcan_usb_fd_set_bittiming_fast,
1373 .dev_decode_buf = pcan_usb_fd_decode_buf,
1374 .dev_start = pcan_usb_fd_start,
1375 .dev_stop = pcan_usb_fd_stop,
1376 .dev_restart_async = pcan_usb_fd_restart_async,
1377 .dev_encode_msg = pcan_usb_fd_encode_msg,
1378
1379 .do_get_berr_counter = pcan_usb_fd_get_berr_counter,
1380 };