hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c
....@@ -43,6 +43,8 @@
4343
4444 /* Minihydra command IDs */
4545 #define CMD_SET_BUSPARAMS_REQ 16
46
+#define CMD_GET_BUSPARAMS_REQ 17
47
+#define CMD_GET_BUSPARAMS_RESP 18
4648 #define CMD_GET_CHIP_STATE_REQ 19
4749 #define CMD_CHIP_STATE_EVENT 20
4850 #define CMD_SET_DRIVERMODE_REQ 21
....@@ -193,19 +195,24 @@
193195 #define KVASER_USB_HYDRA_BUS_MODE_CANFD_ISO 0x01
194196 #define KVASER_USB_HYDRA_BUS_MODE_NONISO 0x02
195197 struct kvaser_cmd_set_busparams {
196
- __le32 bitrate;
197
- u8 tseg1;
198
- u8 tseg2;
199
- u8 sjw;
200
- u8 nsamples;
198
+ struct kvaser_usb_busparams busparams_nominal;
201199 u8 reserved0[4];
202
- __le32 bitrate_d;
203
- u8 tseg1_d;
204
- u8 tseg2_d;
205
- u8 sjw_d;
206
- u8 nsamples_d;
200
+ struct kvaser_usb_busparams busparams_data;
207201 u8 canfd_mode;
208202 u8 reserved1[7];
203
+} __packed;
204
+
205
+/* Busparam type */
206
+#define KVASER_USB_HYDRA_BUSPARAM_TYPE_CAN 0x00
207
+#define KVASER_USB_HYDRA_BUSPARAM_TYPE_CANFD 0x01
208
+struct kvaser_cmd_get_busparams_req {
209
+ u8 type;
210
+ u8 reserved[27];
211
+} __packed;
212
+
213
+struct kvaser_cmd_get_busparams_res {
214
+ struct kvaser_usb_busparams busparams;
215
+ u8 reserved[20];
209216 } __packed;
210217
211218 /* Ctrl modes */
....@@ -278,6 +285,8 @@
278285 struct kvaser_cmd_error_event error_event;
279286
280287 struct kvaser_cmd_set_busparams set_busparams_req;
288
+ struct kvaser_cmd_get_busparams_req get_busparams_req;
289
+ struct kvaser_cmd_get_busparams_res get_busparams_res;
281290
282291 struct kvaser_cmd_chip_state_event chip_state_event;
283292
....@@ -293,6 +302,7 @@
293302 #define KVASER_USB_HYDRA_CF_FLAG_OVERRUN BIT(1)
294303 #define KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME BIT(4)
295304 #define KVASER_USB_HYDRA_CF_FLAG_EXTENDED_ID BIT(5)
305
+#define KVASER_USB_HYDRA_CF_FLAG_TX_ACK BIT(6)
296306 /* CAN frame flags. Used in ext_rx_can and ext_tx_can */
297307 #define KVASER_USB_HYDRA_CF_FLAG_OSM_NACK BIT(12)
298308 #define KVASER_USB_HYDRA_CF_FLAG_ABL BIT(13)
....@@ -358,6 +368,10 @@
358368 struct kvaser_cmd_ext_tx_ack tx_ack;
359369 } __packed;
360370 } __packed;
371
+
372
+struct kvaser_usb_net_hydra_priv {
373
+ int pending_get_busparams_type;
374
+};
361375
362376 static const struct can_bittiming_const kvaser_usb_hydra_kcan_bittiming_c = {
363377 .name = "kvaser_usb_kcan",
....@@ -504,6 +518,7 @@
504518 u8 cmd_no, int channel)
505519 {
506520 struct kvaser_cmd *cmd;
521
+ size_t cmd_len;
507522 int err;
508523
509524 cmd = kcalloc(1, sizeof(struct kvaser_cmd), GFP_KERNEL);
....@@ -511,6 +526,7 @@
511526 return -ENOMEM;
512527
513528 cmd->header.cmd_no = cmd_no;
529
+ cmd_len = kvaser_usb_hydra_cmd_size(cmd);
514530 if (channel < 0) {
515531 kvaser_usb_hydra_set_cmd_dest_he
516532 (cmd, KVASER_USB_HYDRA_HE_ADDRESS_ILLEGAL);
....@@ -527,7 +543,7 @@
527543 kvaser_usb_hydra_set_cmd_transid
528544 (cmd, kvaser_usb_hydra_get_next_transid(dev));
529545
530
- err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
546
+ err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
531547 if (err)
532548 goto end;
533549
....@@ -543,6 +559,7 @@
543559 {
544560 struct kvaser_cmd *cmd;
545561 struct kvaser_usb *dev = priv->dev;
562
+ size_t cmd_len;
546563 int err;
547564
548565 cmd = kcalloc(1, sizeof(struct kvaser_cmd), GFP_ATOMIC);
....@@ -550,14 +567,14 @@
550567 return -ENOMEM;
551568
552569 cmd->header.cmd_no = cmd_no;
570
+ cmd_len = kvaser_usb_hydra_cmd_size(cmd);
553571
554572 kvaser_usb_hydra_set_cmd_dest_he
555573 (cmd, dev->card_data.hydra.channel_to_he[priv->channel]);
556574 kvaser_usb_hydra_set_cmd_transid
557575 (cmd, kvaser_usb_hydra_get_next_transid(dev));
558576
559
- err = kvaser_usb_send_cmd_async(priv, cmd,
560
- kvaser_usb_hydra_cmd_size(cmd));
577
+ err = kvaser_usb_send_cmd_async(priv, cmd, cmd_len);
561578 if (err)
562579 kfree(cmd);
563580
....@@ -701,6 +718,7 @@
701718 {
702719 struct kvaser_usb_dev_card_data *card_data = &dev->card_data;
703720 struct kvaser_cmd *cmd;
721
+ size_t cmd_len;
704722 u32 value = 0;
705723 u32 mask = 0;
706724 u16 cap_cmd_res;
....@@ -712,13 +730,14 @@
712730 return -ENOMEM;
713731
714732 cmd->header.cmd_no = CMD_GET_CAPABILITIES_REQ;
733
+ cmd_len = kvaser_usb_hydra_cmd_size(cmd);
715734 cmd->cap_req.cap_cmd = cpu_to_le16(cap_cmd_req);
716735
717736 kvaser_usb_hydra_set_cmd_dest_he(cmd, card_data->hydra.sysdbg_he);
718737 kvaser_usb_hydra_set_cmd_transid
719738 (cmd, kvaser_usb_hydra_get_next_transid(dev));
720739
721
- err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
740
+ err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
722741 if (err)
723742 goto end;
724743
....@@ -810,6 +829,39 @@
810829 return;
811830
812831 complete(&priv->flush_comp);
832
+}
833
+
834
+static void kvaser_usb_hydra_get_busparams_reply(const struct kvaser_usb *dev,
835
+ const struct kvaser_cmd *cmd)
836
+{
837
+ struct kvaser_usb_net_priv *priv;
838
+ struct kvaser_usb_net_hydra_priv *hydra;
839
+
840
+ priv = kvaser_usb_hydra_net_priv_from_cmd(dev, cmd);
841
+ if (!priv)
842
+ return;
843
+
844
+ hydra = priv->sub_priv;
845
+ if (!hydra)
846
+ return;
847
+
848
+ switch (hydra->pending_get_busparams_type) {
849
+ case KVASER_USB_HYDRA_BUSPARAM_TYPE_CAN:
850
+ memcpy(&priv->busparams_nominal, &cmd->get_busparams_res.busparams,
851
+ sizeof(priv->busparams_nominal));
852
+ break;
853
+ case KVASER_USB_HYDRA_BUSPARAM_TYPE_CANFD:
854
+ memcpy(&priv->busparams_data, &cmd->get_busparams_res.busparams,
855
+ sizeof(priv->busparams_nominal));
856
+ break;
857
+ default:
858
+ dev_warn(&dev->intf->dev, "Unknown get_busparams_type %d\n",
859
+ hydra->pending_get_busparams_type);
860
+ break;
861
+ }
862
+ hydra->pending_get_busparams_type = -1;
863
+
864
+ complete(&priv->get_busparams_comp);
813865 }
814866
815867 static void
....@@ -1099,6 +1151,7 @@
10991151 struct kvaser_usb_net_priv *priv;
11001152 unsigned long irq_flags;
11011153 bool one_shot_fail = false;
1154
+ bool is_err_frame = false;
11021155 u16 transid = kvaser_usb_hydra_get_cmd_transid(cmd);
11031156
11041157 priv = kvaser_usb_hydra_net_priv_from_cmd(dev, cmd);
....@@ -1117,10 +1170,13 @@
11171170 kvaser_usb_hydra_one_shot_fail(priv, cmd_ext);
11181171 one_shot_fail = true;
11191172 }
1173
+
1174
+ is_err_frame = flags & KVASER_USB_HYDRA_CF_FLAG_TX_ACK &&
1175
+ flags & KVASER_USB_HYDRA_CF_FLAG_ERROR_FRAME;
11201176 }
11211177
11221178 context = &priv->tx_contexts[transid % dev->max_tx_urbs];
1123
- if (!one_shot_fail) {
1179
+ if (!one_shot_fail && !is_err_frame) {
11241180 struct net_device_stats *stats = &priv->netdev->stats;
11251181
11261182 stats->tx_packets++;
....@@ -1292,6 +1348,10 @@
12921348
12931349 case CMD_CHIP_STATE_EVENT:
12941350 kvaser_usb_hydra_state_event(dev, cmd);
1351
+ break;
1352
+
1353
+ case CMD_GET_BUSPARAMS_RESP:
1354
+ kvaser_usb_hydra_get_busparams_reply(dev, cmd);
12951355 break;
12961356
12971357 case CMD_ERROR_EVENT:
....@@ -1494,15 +1554,61 @@
14941554 return err;
14951555 }
14961556
1497
-static int kvaser_usb_hydra_set_bittiming(struct net_device *netdev)
1557
+static int kvaser_usb_hydra_get_busparams(struct kvaser_usb_net_priv *priv,
1558
+ int busparams_type)
1559
+{
1560
+ struct kvaser_usb *dev = priv->dev;
1561
+ struct kvaser_usb_net_hydra_priv *hydra = priv->sub_priv;
1562
+ struct kvaser_cmd *cmd;
1563
+ size_t cmd_len;
1564
+ int err;
1565
+
1566
+ if (!hydra)
1567
+ return -EINVAL;
1568
+
1569
+ cmd = kcalloc(1, sizeof(struct kvaser_cmd), GFP_KERNEL);
1570
+ if (!cmd)
1571
+ return -ENOMEM;
1572
+
1573
+ cmd->header.cmd_no = CMD_GET_BUSPARAMS_REQ;
1574
+ cmd_len = kvaser_usb_hydra_cmd_size(cmd);
1575
+ kvaser_usb_hydra_set_cmd_dest_he
1576
+ (cmd, dev->card_data.hydra.channel_to_he[priv->channel]);
1577
+ kvaser_usb_hydra_set_cmd_transid
1578
+ (cmd, kvaser_usb_hydra_get_next_transid(dev));
1579
+ cmd->get_busparams_req.type = busparams_type;
1580
+ hydra->pending_get_busparams_type = busparams_type;
1581
+
1582
+ reinit_completion(&priv->get_busparams_comp);
1583
+
1584
+ err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
1585
+ if (err)
1586
+ return err;
1587
+
1588
+ if (!wait_for_completion_timeout(&priv->get_busparams_comp,
1589
+ msecs_to_jiffies(KVASER_USB_TIMEOUT)))
1590
+ return -ETIMEDOUT;
1591
+
1592
+ return err;
1593
+}
1594
+
1595
+static int kvaser_usb_hydra_get_nominal_busparams(struct kvaser_usb_net_priv *priv)
1596
+{
1597
+ return kvaser_usb_hydra_get_busparams(priv, KVASER_USB_HYDRA_BUSPARAM_TYPE_CAN);
1598
+}
1599
+
1600
+static int kvaser_usb_hydra_get_data_busparams(struct kvaser_usb_net_priv *priv)
1601
+{
1602
+ return kvaser_usb_hydra_get_busparams(priv, KVASER_USB_HYDRA_BUSPARAM_TYPE_CANFD);
1603
+}
1604
+
1605
+static int kvaser_usb_hydra_set_bittiming(const struct net_device *netdev,
1606
+ const struct kvaser_usb_busparams *busparams)
14981607 {
14991608 struct kvaser_cmd *cmd;
15001609 struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
1501
- struct can_bittiming *bt = &priv->can.bittiming;
15021610 struct kvaser_usb *dev = priv->dev;
1503
- int tseg1 = bt->prop_seg + bt->phase_seg1;
1504
- int tseg2 = bt->phase_seg2;
1505
- int sjw = bt->sjw;
1611
+ size_t cmd_len;
15061612 int err;
15071613
15081614 cmd = kcalloc(1, sizeof(struct kvaser_cmd), GFP_KERNEL);
....@@ -1510,33 +1616,29 @@
15101616 return -ENOMEM;
15111617
15121618 cmd->header.cmd_no = CMD_SET_BUSPARAMS_REQ;
1513
- cmd->set_busparams_req.bitrate = cpu_to_le32(bt->bitrate);
1514
- cmd->set_busparams_req.sjw = (u8)sjw;
1515
- cmd->set_busparams_req.tseg1 = (u8)tseg1;
1516
- cmd->set_busparams_req.tseg2 = (u8)tseg2;
1517
- cmd->set_busparams_req.nsamples = 1;
1619
+ cmd_len = kvaser_usb_hydra_cmd_size(cmd);
1620
+ memcpy(&cmd->set_busparams_req.busparams_nominal, busparams,
1621
+ sizeof(cmd->set_busparams_req.busparams_nominal));
15181622
15191623 kvaser_usb_hydra_set_cmd_dest_he
15201624 (cmd, dev->card_data.hydra.channel_to_he[priv->channel]);
15211625 kvaser_usb_hydra_set_cmd_transid
15221626 (cmd, kvaser_usb_hydra_get_next_transid(dev));
15231627
1524
- err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1628
+ err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
15251629
15261630 kfree(cmd);
15271631
15281632 return err;
15291633 }
15301634
1531
-static int kvaser_usb_hydra_set_data_bittiming(struct net_device *netdev)
1635
+static int kvaser_usb_hydra_set_data_bittiming(const struct net_device *netdev,
1636
+ const struct kvaser_usb_busparams *busparams)
15321637 {
15331638 struct kvaser_cmd *cmd;
15341639 struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
1535
- struct can_bittiming *dbt = &priv->can.data_bittiming;
15361640 struct kvaser_usb *dev = priv->dev;
1537
- int tseg1 = dbt->prop_seg + dbt->phase_seg1;
1538
- int tseg2 = dbt->phase_seg2;
1539
- int sjw = dbt->sjw;
1641
+ size_t cmd_len;
15401642 int err;
15411643
15421644 cmd = kcalloc(1, sizeof(struct kvaser_cmd), GFP_KERNEL);
....@@ -1544,11 +1646,9 @@
15441646 return -ENOMEM;
15451647
15461648 cmd->header.cmd_no = CMD_SET_BUSPARAMS_FD_REQ;
1547
- cmd->set_busparams_req.bitrate_d = cpu_to_le32(dbt->bitrate);
1548
- cmd->set_busparams_req.sjw_d = (u8)sjw;
1549
- cmd->set_busparams_req.tseg1_d = (u8)tseg1;
1550
- cmd->set_busparams_req.tseg2_d = (u8)tseg2;
1551
- cmd->set_busparams_req.nsamples_d = 1;
1649
+ cmd_len = kvaser_usb_hydra_cmd_size(cmd);
1650
+ memcpy(&cmd->set_busparams_req.busparams_data, busparams,
1651
+ sizeof(cmd->set_busparams_req.busparams_data));
15521652
15531653 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) {
15541654 if (priv->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO)
....@@ -1564,7 +1664,7 @@
15641664 kvaser_usb_hydra_set_cmd_transid
15651665 (cmd, kvaser_usb_hydra_get_next_transid(dev));
15661666
1567
- err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1667
+ err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
15681668
15691669 kfree(cmd);
15701670
....@@ -1655,6 +1755,19 @@
16551755 return 0;
16561756 }
16571757
1758
+static int kvaser_usb_hydra_init_channel(struct kvaser_usb_net_priv *priv)
1759
+{
1760
+ struct kvaser_usb_net_hydra_priv *hydra;
1761
+
1762
+ hydra = devm_kzalloc(&priv->dev->intf->dev, sizeof(*hydra), GFP_KERNEL);
1763
+ if (!hydra)
1764
+ return -ENOMEM;
1765
+
1766
+ priv->sub_priv = hydra;
1767
+
1768
+ return 0;
1769
+}
1770
+
16581771 static int kvaser_usb_hydra_get_software_info(struct kvaser_usb *dev)
16591772 {
16601773 struct kvaser_cmd cmd;
....@@ -1679,6 +1792,7 @@
16791792 static int kvaser_usb_hydra_get_software_details(struct kvaser_usb *dev)
16801793 {
16811794 struct kvaser_cmd *cmd;
1795
+ size_t cmd_len;
16821796 int err;
16831797 u32 flags;
16841798 struct kvaser_usb_dev_card_data *card_data = &dev->card_data;
....@@ -1688,6 +1802,7 @@
16881802 return -ENOMEM;
16891803
16901804 cmd->header.cmd_no = CMD_GET_SOFTWARE_DETAILS_REQ;
1805
+ cmd_len = kvaser_usb_hydra_cmd_size(cmd);
16911806 cmd->sw_detail_req.use_ext_cmd = 1;
16921807 kvaser_usb_hydra_set_cmd_dest_he
16931808 (cmd, KVASER_USB_HYDRA_HE_ADDRESS_ILLEGAL);
....@@ -1695,7 +1810,7 @@
16951810 kvaser_usb_hydra_set_cmd_transid
16961811 (cmd, kvaser_usb_hydra_get_next_transid(dev));
16971812
1698
- err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1813
+ err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
16991814 if (err)
17001815 goto end;
17011816
....@@ -1811,6 +1926,7 @@
18111926 {
18121927 struct kvaser_usb *dev = priv->dev;
18131928 struct kvaser_cmd *cmd;
1929
+ size_t cmd_len;
18141930 int err;
18151931
18161932 if ((priv->can.ctrlmode &
....@@ -1826,6 +1942,7 @@
18261942 return -ENOMEM;
18271943
18281944 cmd->header.cmd_no = CMD_SET_DRIVERMODE_REQ;
1945
+ cmd_len = kvaser_usb_hydra_cmd_size(cmd);
18291946 kvaser_usb_hydra_set_cmd_dest_he
18301947 (cmd, dev->card_data.hydra.channel_to_he[priv->channel]);
18311948 kvaser_usb_hydra_set_cmd_transid
....@@ -1835,7 +1952,7 @@
18351952 else
18361953 cmd->set_ctrlmode.mode = KVASER_USB_HYDRA_CTRLMODE_NORMAL;
18371954
1838
- err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1955
+ err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
18391956 kfree(cmd);
18401957
18411958 return err;
....@@ -1997,10 +2114,13 @@
19972114 const struct kvaser_usb_dev_ops kvaser_usb_hydra_dev_ops = {
19982115 .dev_set_mode = kvaser_usb_hydra_set_mode,
19992116 .dev_set_bittiming = kvaser_usb_hydra_set_bittiming,
2117
+ .dev_get_busparams = kvaser_usb_hydra_get_nominal_busparams,
20002118 .dev_set_data_bittiming = kvaser_usb_hydra_set_data_bittiming,
2119
+ .dev_get_data_busparams = kvaser_usb_hydra_get_data_busparams,
20012120 .dev_get_berr_counter = kvaser_usb_hydra_get_berr_counter,
20022121 .dev_setup_endpoints = kvaser_usb_hydra_setup_endpoints,
20032122 .dev_init_card = kvaser_usb_hydra_init_card,
2123
+ .dev_init_channel = kvaser_usb_hydra_init_channel,
20042124 .dev_get_software_info = kvaser_usb_hydra_get_software_info,
20052125 .dev_get_software_details = kvaser_usb_hydra_get_software_details,
20062126 .dev_get_card_info = kvaser_usb_hydra_get_card_info,