forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
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)
....@@ -359,6 +369,10 @@
359369 } __packed;
360370 } __packed;
361371
372
+struct kvaser_usb_net_hydra_priv {
373
+ int pending_get_busparams_type;
374
+};
375
+
362376 static const struct can_bittiming_const kvaser_usb_hydra_kcan_bittiming_c = {
363377 .name = "kvaser_usb_kcan",
364378 .tseg1_min = 1,
....@@ -371,7 +385,7 @@
371385 .brp_inc = 1,
372386 };
373387
374
-static const struct can_bittiming_const kvaser_usb_hydra_flexc_bittiming_c = {
388
+const struct can_bittiming_const kvaser_usb_flexc_bittiming_const = {
375389 .name = "kvaser_usb_flex",
376390 .tseg1_min = 4,
377391 .tseg1_max = 16,
....@@ -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
....@@ -812,6 +831,39 @@
812831 complete(&priv->flush_comp);
813832 }
814833
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);
865
+}
866
+
815867 static void
816868 kvaser_usb_hydra_bus_status_to_can_state(const struct kvaser_usb_net_priv *priv,
817869 u8 bus_status,
....@@ -890,8 +942,10 @@
890942 new_state < CAN_STATE_BUS_OFF)
891943 priv->can.can_stats.restarts++;
892944
893
- cf->data[6] = bec->txerr;
894
- cf->data[7] = bec->rxerr;
945
+ if (new_state != CAN_STATE_BUS_OFF) {
946
+ cf->data[6] = bec->txerr;
947
+ cf->data[7] = bec->rxerr;
948
+ }
895949
896950 stats = &netdev->stats;
897951 stats->rx_packets++;
....@@ -1045,8 +1099,10 @@
10451099 shhwtstamps->hwtstamp = hwtstamp;
10461100
10471101 cf->can_id |= CAN_ERR_BUSERROR;
1048
- cf->data[6] = bec.txerr;
1049
- cf->data[7] = bec.rxerr;
1102
+ if (new_state != CAN_STATE_BUS_OFF) {
1103
+ cf->data[6] = bec.txerr;
1104
+ cf->data[7] = bec.rxerr;
1105
+ }
10501106
10511107 stats->rx_packets++;
10521108 stats->rx_bytes += cf->can_dlc;
....@@ -1095,6 +1151,7 @@
10951151 struct kvaser_usb_net_priv *priv;
10961152 unsigned long irq_flags;
10971153 bool one_shot_fail = false;
1154
+ bool is_err_frame = false;
10981155 u16 transid = kvaser_usb_hydra_get_cmd_transid(cmd);
10991156
11001157 priv = kvaser_usb_hydra_net_priv_from_cmd(dev, cmd);
....@@ -1113,10 +1170,13 @@
11131170 kvaser_usb_hydra_one_shot_fail(priv, cmd_ext);
11141171 one_shot_fail = true;
11151172 }
1173
+
1174
+ is_err_frame = flags & KVASER_USB_HYDRA_CF_FLAG_TX_ACK &&
1175
+ flags & KVASER_USB_HYDRA_CF_FLAG_ERROR_FRAME;
11161176 }
11171177
11181178 context = &priv->tx_contexts[transid % dev->max_tx_urbs];
1119
- if (!one_shot_fail) {
1179
+ if (!one_shot_fail && !is_err_frame) {
11201180 struct net_device_stats *stats = &priv->netdev->stats;
11211181
11221182 stats->tx_packets++;
....@@ -1288,6 +1348,10 @@
12881348
12891349 case CMD_CHIP_STATE_EVENT:
12901350 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);
12911355 break;
12921356
12931357 case CMD_ERROR_EVENT:
....@@ -1490,15 +1554,61 @@
14901554 return err;
14911555 }
14921556
1493
-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)
14941607 {
14951608 struct kvaser_cmd *cmd;
14961609 struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
1497
- struct can_bittiming *bt = &priv->can.bittiming;
14981610 struct kvaser_usb *dev = priv->dev;
1499
- int tseg1 = bt->prop_seg + bt->phase_seg1;
1500
- int tseg2 = bt->phase_seg2;
1501
- int sjw = bt->sjw;
1611
+ size_t cmd_len;
15021612 int err;
15031613
15041614 cmd = kcalloc(1, sizeof(struct kvaser_cmd), GFP_KERNEL);
....@@ -1506,33 +1616,29 @@
15061616 return -ENOMEM;
15071617
15081618 cmd->header.cmd_no = CMD_SET_BUSPARAMS_REQ;
1509
- cmd->set_busparams_req.bitrate = cpu_to_le32(bt->bitrate);
1510
- cmd->set_busparams_req.sjw = (u8)sjw;
1511
- cmd->set_busparams_req.tseg1 = (u8)tseg1;
1512
- cmd->set_busparams_req.tseg2 = (u8)tseg2;
1513
- 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));
15141622
15151623 kvaser_usb_hydra_set_cmd_dest_he
15161624 (cmd, dev->card_data.hydra.channel_to_he[priv->channel]);
15171625 kvaser_usb_hydra_set_cmd_transid
15181626 (cmd, kvaser_usb_hydra_get_next_transid(dev));
15191627
1520
- err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1628
+ err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
15211629
15221630 kfree(cmd);
15231631
15241632 return err;
15251633 }
15261634
1527
-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)
15281637 {
15291638 struct kvaser_cmd *cmd;
15301639 struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
1531
- struct can_bittiming *dbt = &priv->can.data_bittiming;
15321640 struct kvaser_usb *dev = priv->dev;
1533
- int tseg1 = dbt->prop_seg + dbt->phase_seg1;
1534
- int tseg2 = dbt->phase_seg2;
1535
- int sjw = dbt->sjw;
1641
+ size_t cmd_len;
15361642 int err;
15371643
15381644 cmd = kcalloc(1, sizeof(struct kvaser_cmd), GFP_KERNEL);
....@@ -1540,11 +1646,9 @@
15401646 return -ENOMEM;
15411647
15421648 cmd->header.cmd_no = CMD_SET_BUSPARAMS_FD_REQ;
1543
- cmd->set_busparams_req.bitrate_d = cpu_to_le32(dbt->bitrate);
1544
- cmd->set_busparams_req.sjw_d = (u8)sjw;
1545
- cmd->set_busparams_req.tseg1_d = (u8)tseg1;
1546
- cmd->set_busparams_req.tseg2_d = (u8)tseg2;
1547
- 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));
15481652
15491653 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) {
15501654 if (priv->can.ctrlmode & CAN_CTRLMODE_FD_NON_ISO)
....@@ -1560,7 +1664,7 @@
15601664 kvaser_usb_hydra_set_cmd_transid
15611665 (cmd, kvaser_usb_hydra_get_next_transid(dev));
15621666
1563
- err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1667
+ err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
15641668
15651669 kfree(cmd);
15661670
....@@ -1651,6 +1755,19 @@
16511755 return 0;
16521756 }
16531757
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
+
16541771 static int kvaser_usb_hydra_get_software_info(struct kvaser_usb *dev)
16551772 {
16561773 struct kvaser_cmd cmd;
....@@ -1675,6 +1792,7 @@
16751792 static int kvaser_usb_hydra_get_software_details(struct kvaser_usb *dev)
16761793 {
16771794 struct kvaser_cmd *cmd;
1795
+ size_t cmd_len;
16781796 int err;
16791797 u32 flags;
16801798 struct kvaser_usb_dev_card_data *card_data = &dev->card_data;
....@@ -1684,6 +1802,7 @@
16841802 return -ENOMEM;
16851803
16861804 cmd->header.cmd_no = CMD_GET_SOFTWARE_DETAILS_REQ;
1805
+ cmd_len = kvaser_usb_hydra_cmd_size(cmd);
16871806 cmd->sw_detail_req.use_ext_cmd = 1;
16881807 kvaser_usb_hydra_set_cmd_dest_he
16891808 (cmd, KVASER_USB_HYDRA_HE_ADDRESS_ILLEGAL);
....@@ -1691,7 +1810,7 @@
16911810 kvaser_usb_hydra_set_cmd_transid
16921811 (cmd, kvaser_usb_hydra_get_next_transid(dev));
16931812
1694
- err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1813
+ err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
16951814 if (err)
16961815 goto end;
16971816
....@@ -1807,6 +1926,7 @@
18071926 {
18081927 struct kvaser_usb *dev = priv->dev;
18091928 struct kvaser_cmd *cmd;
1929
+ size_t cmd_len;
18101930 int err;
18111931
18121932 if ((priv->can.ctrlmode &
....@@ -1822,6 +1942,7 @@
18221942 return -ENOMEM;
18231943
18241944 cmd->header.cmd_no = CMD_SET_DRIVERMODE_REQ;
1945
+ cmd_len = kvaser_usb_hydra_cmd_size(cmd);
18251946 kvaser_usb_hydra_set_cmd_dest_he
18261947 (cmd, dev->card_data.hydra.channel_to_he[priv->channel]);
18271948 kvaser_usb_hydra_set_cmd_transid
....@@ -1831,7 +1952,7 @@
18311952 else
18321953 cmd->set_ctrlmode.mode = KVASER_USB_HYDRA_CTRLMODE_NORMAL;
18331954
1834
- err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1955
+ err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
18351956 kfree(cmd);
18361957
18371958 return err;
....@@ -1841,7 +1962,7 @@
18411962 {
18421963 int err;
18431964
1844
- init_completion(&priv->start_comp);
1965
+ reinit_completion(&priv->start_comp);
18451966
18461967 err = kvaser_usb_hydra_send_simple_cmd(priv->dev, CMD_START_CHIP_REQ,
18471968 priv->channel);
....@@ -1859,7 +1980,7 @@
18591980 {
18601981 int err;
18611982
1862
- init_completion(&priv->stop_comp);
1983
+ reinit_completion(&priv->stop_comp);
18631984
18641985 /* Make sure we do not report invalid BUS_OFF from CMD_CHIP_STATE_EVENT
18651986 * see comment in kvaser_usb_hydra_update_state()
....@@ -1882,7 +2003,7 @@
18822003 {
18832004 int err;
18842005
1885
- init_completion(&priv->flush_comp);
2006
+ reinit_completion(&priv->flush_comp);
18862007
18872008 err = kvaser_usb_hydra_send_simple_cmd(priv->dev, CMD_FLUSH_QUEUE,
18882009 priv->channel);
....@@ -1993,10 +2114,13 @@
19932114 const struct kvaser_usb_dev_ops kvaser_usb_hydra_dev_ops = {
19942115 .dev_set_mode = kvaser_usb_hydra_set_mode,
19952116 .dev_set_bittiming = kvaser_usb_hydra_set_bittiming,
2117
+ .dev_get_busparams = kvaser_usb_hydra_get_nominal_busparams,
19962118 .dev_set_data_bittiming = kvaser_usb_hydra_set_data_bittiming,
2119
+ .dev_get_data_busparams = kvaser_usb_hydra_get_data_busparams,
19972120 .dev_get_berr_counter = kvaser_usb_hydra_get_berr_counter,
19982121 .dev_setup_endpoints = kvaser_usb_hydra_setup_endpoints,
19992122 .dev_init_card = kvaser_usb_hydra_init_card,
2123
+ .dev_init_channel = kvaser_usb_hydra_init_channel,
20002124 .dev_get_software_info = kvaser_usb_hydra_get_software_info,
20012125 .dev_get_software_details = kvaser_usb_hydra_get_software_details,
20022126 .dev_get_card_info = kvaser_usb_hydra_get_card_info,
....@@ -2024,5 +2148,5 @@
20242148 .freq = 24000000,
20252149 },
20262150 .timestamp_freq = 1,
2027
- .bittiming_const = &kvaser_usb_hydra_flexc_bittiming_c,
2151
+ .bittiming_const = &kvaser_usb_flexc_bittiming_const,
20282152 };