hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c
....@@ -20,6 +20,7 @@
2020 #include <linux/string.h>
2121 #include <linux/types.h>
2222 #include <linux/usb.h>
23
+#include <linux/workqueue.h>
2324
2425 #include <linux/can.h>
2526 #include <linux/can/dev.h>
....@@ -55,6 +56,9 @@
5556 #define CMD_RX_EXT_MESSAGE 14
5657 #define CMD_TX_EXT_MESSAGE 15
5758 #define CMD_SET_BUS_PARAMS 16
59
+#define CMD_GET_BUS_PARAMS 17
60
+#define CMD_GET_BUS_PARAMS_REPLY 18
61
+#define CMD_GET_CHIP_STATE 19
5862 #define CMD_CHIP_STATE_EVENT 20
5963 #define CMD_SET_CTRL_MODE 21
6064 #define CMD_RESET_CHIP 24
....@@ -69,10 +73,13 @@
6973 #define CMD_GET_CARD_INFO_REPLY 35
7074 #define CMD_GET_SOFTWARE_INFO 38
7175 #define CMD_GET_SOFTWARE_INFO_REPLY 39
76
+#define CMD_ERROR_EVENT 45
7277 #define CMD_FLUSH_QUEUE 48
7378 #define CMD_TX_ACKNOWLEDGE 50
7479 #define CMD_CAN_ERROR_EVENT 51
7580 #define CMD_FLUSH_QUEUE_REPLY 68
81
+#define CMD_GET_CAPABILITIES_REQ 95
82
+#define CMD_GET_CAPABILITIES_RESP 96
7683
7784 #define CMD_LEAF_LOG_MESSAGE 106
7885
....@@ -81,6 +88,8 @@
8188 #define KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK 0
8289 #define KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK BIT(5)
8390 #define KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK BIT(6)
91
+
92
+#define KVASER_USB_LEAF_SWOPTION_EXT_CAP BIT(12)
8493
8594 /* error factors */
8695 #define M16C_EF_ACKE BIT(0)
....@@ -156,11 +165,7 @@
156165 struct kvaser_cmd_busparams {
157166 u8 tid;
158167 u8 channel;
159
- __le32 bitrate;
160
- u8 tseg1;
161
- u8 tseg2;
162
- u8 sjw;
163
- u8 no_samp;
168
+ struct kvaser_usb_busparams busparams;
164169 } __packed;
165170
166171 struct kvaser_cmd_tx_can {
....@@ -229,7 +234,7 @@
229234 u8 tid;
230235 } __packed;
231236
232
-struct leaf_cmd_error_event {
237
+struct leaf_cmd_can_error_event {
233238 u8 tid;
234239 u8 flags;
235240 __le16 time[3];
....@@ -241,7 +246,7 @@
241246 u8 error_factor;
242247 } __packed;
243248
244
-struct usbcan_cmd_error_event {
249
+struct usbcan_cmd_can_error_event {
245250 u8 tid;
246251 u8 padding;
247252 u8 tx_errors_count_ch0;
....@@ -251,6 +256,28 @@
251256 u8 status_ch0;
252257 u8 status_ch1;
253258 __le16 time;
259
+} __packed;
260
+
261
+/* CMD_ERROR_EVENT error codes */
262
+#define KVASER_USB_LEAF_ERROR_EVENT_TX_QUEUE_FULL 0x8
263
+#define KVASER_USB_LEAF_ERROR_EVENT_PARAM 0x9
264
+
265
+struct leaf_cmd_error_event {
266
+ u8 tid;
267
+ u8 error_code;
268
+ __le16 timestamp[3];
269
+ __le16 padding;
270
+ __le16 info1;
271
+ __le16 info2;
272
+} __packed;
273
+
274
+struct usbcan_cmd_error_event {
275
+ u8 tid;
276
+ u8 error_code;
277
+ __le16 info1;
278
+ __le16 info2;
279
+ __le16 timestamp;
280
+ __le16 padding;
254281 } __packed;
255282
256283 struct kvaser_cmd_ctrl_mode {
....@@ -277,6 +304,28 @@
277304 u8 data[8];
278305 } __packed;
279306
307
+/* Sub commands for cap_req and cap_res */
308
+#define KVASER_USB_LEAF_CAP_CMD_LISTEN_MODE 0x02
309
+#define KVASER_USB_LEAF_CAP_CMD_ERR_REPORT 0x05
310
+struct kvaser_cmd_cap_req {
311
+ __le16 padding0;
312
+ __le16 cap_cmd;
313
+ __le16 padding1;
314
+ __le16 channel;
315
+} __packed;
316
+
317
+/* Status codes for cap_res */
318
+#define KVASER_USB_LEAF_CAP_STAT_OK 0x00
319
+#define KVASER_USB_LEAF_CAP_STAT_NOT_IMPL 0x01
320
+#define KVASER_USB_LEAF_CAP_STAT_UNAVAIL 0x02
321
+struct kvaser_cmd_cap_res {
322
+ __le16 padding;
323
+ __le16 cap_cmd;
324
+ __le16 status;
325
+ __le32 mask;
326
+ __le32 value;
327
+} __packed;
328
+
280329 struct kvaser_cmd {
281330 u8 len;
282331 u8 id;
....@@ -292,14 +341,18 @@
292341 struct leaf_cmd_softinfo softinfo;
293342 struct leaf_cmd_rx_can rx_can;
294343 struct leaf_cmd_chip_state_event chip_state_event;
295
- struct leaf_cmd_error_event error_event;
344
+ struct leaf_cmd_can_error_event can_error_event;
296345 struct leaf_cmd_log_message log_message;
346
+ struct leaf_cmd_error_event error_event;
347
+ struct kvaser_cmd_cap_req cap_req;
348
+ struct kvaser_cmd_cap_res cap_res;
297349 } __packed leaf;
298350
299351 union {
300352 struct usbcan_cmd_softinfo softinfo;
301353 struct usbcan_cmd_rx_can rx_can;
302354 struct usbcan_cmd_chip_state_event chip_state_event;
355
+ struct usbcan_cmd_can_error_event can_error_event;
303356 struct usbcan_cmd_error_event error_event;
304357 } __packed usbcan;
305358
....@@ -322,7 +375,10 @@
322375 [CMD_RX_EXT_MESSAGE] = kvaser_fsize(u.leaf.rx_can),
323376 [CMD_LEAF_LOG_MESSAGE] = kvaser_fsize(u.leaf.log_message),
324377 [CMD_CHIP_STATE_EVENT] = kvaser_fsize(u.leaf.chip_state_event),
325
- [CMD_CAN_ERROR_EVENT] = kvaser_fsize(u.leaf.error_event),
378
+ [CMD_CAN_ERROR_EVENT] = kvaser_fsize(u.leaf.can_error_event),
379
+ [CMD_GET_CAPABILITIES_RESP] = kvaser_fsize(u.leaf.cap_res),
380
+ [CMD_GET_BUS_PARAMS_REPLY] = kvaser_fsize(u.busparams),
381
+ [CMD_ERROR_EVENT] = kvaser_fsize(u.leaf.error_event),
326382 /* ignored events: */
327383 [CMD_FLUSH_QUEUE_REPLY] = CMD_SIZE_ANY,
328384 };
....@@ -336,7 +392,8 @@
336392 [CMD_RX_STD_MESSAGE] = kvaser_fsize(u.usbcan.rx_can),
337393 [CMD_RX_EXT_MESSAGE] = kvaser_fsize(u.usbcan.rx_can),
338394 [CMD_CHIP_STATE_EVENT] = kvaser_fsize(u.usbcan.chip_state_event),
339
- [CMD_CAN_ERROR_EVENT] = kvaser_fsize(u.usbcan.error_event),
395
+ [CMD_CAN_ERROR_EVENT] = kvaser_fsize(u.usbcan.can_error_event),
396
+ [CMD_ERROR_EVENT] = kvaser_fsize(u.usbcan.error_event),
340397 /* ignored events: */
341398 [CMD_USBCAN_CLOCK_OVERFLOW_EVENT] = CMD_SIZE_ANY,
342399 };
....@@ -362,6 +419,12 @@
362419 u8 error_state;
363420 } usbcan;
364421 };
422
+};
423
+
424
+struct kvaser_usb_net_leaf_priv {
425
+ struct kvaser_usb_net_priv *net;
426
+
427
+ struct delayed_work chip_state_req_work;
365428 };
366429
367430 static const struct can_bittiming_const kvaser_usb_leaf_m16c_bittiming_const = {
....@@ -607,6 +670,9 @@
607670 dev->fw_version = le32_to_cpu(softinfo->fw_version);
608671 dev->max_tx_urbs = le16_to_cpu(softinfo->max_outstanding_tx);
609672
673
+ if (sw_options & KVASER_USB_LEAF_SWOPTION_EXT_CAP)
674
+ dev->card_data.capabilities |= KVASER_USB_CAP_EXT_CAP;
675
+
610676 if (dev->driver_info->quirks & KVASER_USB_QUIRK_IGNORE_CLK_FREQ) {
611677 /* Firmware expects bittiming parameters calculated for 16MHz
612678 * clock, regardless of the actual clock
....@@ -694,6 +760,116 @@
694760 return 0;
695761 }
696762
763
+static int kvaser_usb_leaf_get_single_capability(struct kvaser_usb *dev,
764
+ u16 cap_cmd_req, u16 *status)
765
+{
766
+ struct kvaser_usb_dev_card_data *card_data = &dev->card_data;
767
+ struct kvaser_cmd *cmd;
768
+ u32 value = 0;
769
+ u32 mask = 0;
770
+ u16 cap_cmd_res;
771
+ int err;
772
+ int i;
773
+
774
+ cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
775
+ if (!cmd)
776
+ return -ENOMEM;
777
+
778
+ cmd->id = CMD_GET_CAPABILITIES_REQ;
779
+ cmd->u.leaf.cap_req.cap_cmd = cpu_to_le16(cap_cmd_req);
780
+ cmd->len = CMD_HEADER_LEN + sizeof(struct kvaser_cmd_cap_req);
781
+
782
+ err = kvaser_usb_send_cmd(dev, cmd, cmd->len);
783
+ if (err)
784
+ goto end;
785
+
786
+ err = kvaser_usb_leaf_wait_cmd(dev, CMD_GET_CAPABILITIES_RESP, cmd);
787
+ if (err)
788
+ goto end;
789
+
790
+ *status = le16_to_cpu(cmd->u.leaf.cap_res.status);
791
+
792
+ if (*status != KVASER_USB_LEAF_CAP_STAT_OK)
793
+ goto end;
794
+
795
+ cap_cmd_res = le16_to_cpu(cmd->u.leaf.cap_res.cap_cmd);
796
+ switch (cap_cmd_res) {
797
+ case KVASER_USB_LEAF_CAP_CMD_LISTEN_MODE:
798
+ case KVASER_USB_LEAF_CAP_CMD_ERR_REPORT:
799
+ value = le32_to_cpu(cmd->u.leaf.cap_res.value);
800
+ mask = le32_to_cpu(cmd->u.leaf.cap_res.mask);
801
+ break;
802
+ default:
803
+ dev_warn(&dev->intf->dev, "Unknown capability command %u\n",
804
+ cap_cmd_res);
805
+ break;
806
+ }
807
+
808
+ for (i = 0; i < dev->nchannels; i++) {
809
+ if (BIT(i) & (value & mask)) {
810
+ switch (cap_cmd_res) {
811
+ case KVASER_USB_LEAF_CAP_CMD_LISTEN_MODE:
812
+ card_data->ctrlmode_supported |=
813
+ CAN_CTRLMODE_LISTENONLY;
814
+ break;
815
+ case KVASER_USB_LEAF_CAP_CMD_ERR_REPORT:
816
+ card_data->capabilities |=
817
+ KVASER_USB_CAP_BERR_CAP;
818
+ break;
819
+ }
820
+ }
821
+ }
822
+
823
+end:
824
+ kfree(cmd);
825
+
826
+ return err;
827
+}
828
+
829
+static int kvaser_usb_leaf_get_capabilities_leaf(struct kvaser_usb *dev)
830
+{
831
+ int err;
832
+ u16 status;
833
+
834
+ if (!(dev->card_data.capabilities & KVASER_USB_CAP_EXT_CAP)) {
835
+ dev_info(&dev->intf->dev,
836
+ "No extended capability support. Upgrade device firmware.\n");
837
+ return 0;
838
+ }
839
+
840
+ err = kvaser_usb_leaf_get_single_capability(dev,
841
+ KVASER_USB_LEAF_CAP_CMD_LISTEN_MODE,
842
+ &status);
843
+ if (err)
844
+ return err;
845
+ if (status)
846
+ dev_info(&dev->intf->dev,
847
+ "KVASER_USB_LEAF_CAP_CMD_LISTEN_MODE failed %u\n",
848
+ status);
849
+
850
+ err = kvaser_usb_leaf_get_single_capability(dev,
851
+ KVASER_USB_LEAF_CAP_CMD_ERR_REPORT,
852
+ &status);
853
+ if (err)
854
+ return err;
855
+ if (status)
856
+ dev_info(&dev->intf->dev,
857
+ "KVASER_USB_LEAF_CAP_CMD_ERR_REPORT failed %u\n",
858
+ status);
859
+
860
+ return 0;
861
+}
862
+
863
+static int kvaser_usb_leaf_get_capabilities(struct kvaser_usb *dev)
864
+{
865
+ int err = 0;
866
+
867
+ if (dev->driver_info->family == KVASER_LEAF)
868
+ err = kvaser_usb_leaf_get_capabilities_leaf(dev);
869
+
870
+ return err;
871
+}
872
+
697873 static void kvaser_usb_leaf_tx_acknowledge(const struct kvaser_usb *dev,
698874 const struct kvaser_cmd *cmd)
699875 {
....@@ -722,7 +898,7 @@
722898 context = &priv->tx_contexts[tid % dev->max_tx_urbs];
723899
724900 /* Sometimes the state change doesn't come after a bus-off event */
725
- if (priv->can.restart_ms && priv->can.state >= CAN_STATE_BUS_OFF) {
901
+ if (priv->can.restart_ms && priv->can.state == CAN_STATE_BUS_OFF) {
726902 struct sk_buff *skb;
727903 struct can_frame *cf;
728904
....@@ -778,6 +954,16 @@
778954 return err;
779955 }
780956
957
+static void kvaser_usb_leaf_chip_state_req_work(struct work_struct *work)
958
+{
959
+ struct kvaser_usb_net_leaf_priv *leaf =
960
+ container_of(work, struct kvaser_usb_net_leaf_priv,
961
+ chip_state_req_work.work);
962
+ struct kvaser_usb_net_priv *priv = leaf->net;
963
+
964
+ kvaser_usb_leaf_simple_cmd_async(priv, CMD_GET_CHIP_STATE);
965
+}
966
+
781967 static void
782968 kvaser_usb_leaf_rx_error_update_can_state(struct kvaser_usb_net_priv *priv,
783969 const struct kvaser_usb_err_summary *es,
....@@ -796,20 +982,16 @@
796982 new_state = CAN_STATE_BUS_OFF;
797983 } else if (es->status & M16C_STATE_BUS_PASSIVE) {
798984 new_state = CAN_STATE_ERROR_PASSIVE;
799
- } else if (es->status & M16C_STATE_BUS_ERROR) {
985
+ } else if ((es->status & M16C_STATE_BUS_ERROR) &&
986
+ cur_state >= CAN_STATE_BUS_OFF) {
800987 /* Guard against spurious error events after a busoff */
801
- if (cur_state < CAN_STATE_BUS_OFF) {
802
- if (es->txerr >= 128 || es->rxerr >= 128)
803
- new_state = CAN_STATE_ERROR_PASSIVE;
804
- else if (es->txerr >= 96 || es->rxerr >= 96)
805
- new_state = CAN_STATE_ERROR_WARNING;
806
- else if (cur_state > CAN_STATE_ERROR_ACTIVE)
807
- new_state = CAN_STATE_ERROR_ACTIVE;
808
- }
809
- }
810
-
811
- if (!es->status)
988
+ } else if (es->txerr >= 128 || es->rxerr >= 128) {
989
+ new_state = CAN_STATE_ERROR_PASSIVE;
990
+ } else if (es->txerr >= 96 || es->rxerr >= 96) {
991
+ new_state = CAN_STATE_ERROR_WARNING;
992
+ } else {
812993 new_state = CAN_STATE_ERROR_ACTIVE;
994
+ }
813995
814996 if (new_state != cur_state) {
815997 tx_state = (es->txerr >= es->rxerr) ? new_state : 0;
....@@ -819,7 +1001,7 @@
8191001 }
8201002
8211003 if (priv->can.restart_ms &&
822
- cur_state >= CAN_STATE_BUS_OFF &&
1004
+ cur_state == CAN_STATE_BUS_OFF &&
8231005 new_state < CAN_STATE_BUS_OFF)
8241006 priv->can.can_stats.restarts++;
8251007
....@@ -853,6 +1035,7 @@
8531035 struct sk_buff *skb;
8541036 struct net_device_stats *stats;
8551037 struct kvaser_usb_net_priv *priv;
1038
+ struct kvaser_usb_net_leaf_priv *leaf;
8561039 enum can_state old_state, new_state;
8571040
8581041 if (es->channel >= dev->nchannels) {
....@@ -862,7 +1045,12 @@
8621045 }
8631046
8641047 priv = dev->nets[es->channel];
1048
+ leaf = priv->sub_priv;
8651049 stats = &priv->netdev->stats;
1050
+
1051
+ /* Ignore e.g. state change to bus-off reported just after stopping */
1052
+ if (!netif_running(priv->netdev))
1053
+ return;
8661054
8671055 /* Update all of the CAN interface's state and error counters before
8681056 * trying any memory allocation that can actually fail with -ENOMEM.
....@@ -877,6 +1065,14 @@
8771065 old_state = priv->can.state;
8781066 kvaser_usb_leaf_rx_error_update_can_state(priv, es, &tmp_cf);
8791067 new_state = priv->can.state;
1068
+
1069
+ /* If there are errors, request status updates periodically as we do
1070
+ * not get automatic notifications of improved state.
1071
+ */
1072
+ if (new_state < CAN_STATE_BUS_OFF &&
1073
+ (es->rxerr || es->txerr || new_state == CAN_STATE_ERROR_PASSIVE))
1074
+ schedule_delayed_work(&leaf->chip_state_req_work,
1075
+ msecs_to_jiffies(500));
8801076
8811077 skb = alloc_can_err_skb(priv->netdev, &cf);
8821078 if (!skb) {
....@@ -895,7 +1091,7 @@
8951091 }
8961092
8971093 if (priv->can.restart_ms &&
898
- old_state >= CAN_STATE_BUS_OFF &&
1094
+ old_state == CAN_STATE_BUS_OFF &&
8991095 new_state < CAN_STATE_BUS_OFF) {
9001096 cf->can_id |= CAN_ERR_RESTARTED;
9011097 netif_carrier_on(priv->netdev);
....@@ -995,11 +1191,11 @@
9951191
9961192 case CMD_CAN_ERROR_EVENT:
9971193 es.channel = 0;
998
- es.status = cmd->u.usbcan.error_event.status_ch0;
999
- es.txerr = cmd->u.usbcan.error_event.tx_errors_count_ch0;
1000
- es.rxerr = cmd->u.usbcan.error_event.rx_errors_count_ch0;
1194
+ es.status = cmd->u.usbcan.can_error_event.status_ch0;
1195
+ es.txerr = cmd->u.usbcan.can_error_event.tx_errors_count_ch0;
1196
+ es.rxerr = cmd->u.usbcan.can_error_event.rx_errors_count_ch0;
10011197 es.usbcan.other_ch_status =
1002
- cmd->u.usbcan.error_event.status_ch1;
1198
+ cmd->u.usbcan.can_error_event.status_ch1;
10031199 kvaser_usb_leaf_usbcan_conditionally_rx_error(dev, &es);
10041200
10051201 /* The USBCAN firmware supports up to 2 channels.
....@@ -1007,13 +1203,13 @@
10071203 */
10081204 if (dev->nchannels == MAX_USBCAN_NET_DEVICES) {
10091205 es.channel = 1;
1010
- es.status = cmd->u.usbcan.error_event.status_ch1;
1206
+ es.status = cmd->u.usbcan.can_error_event.status_ch1;
10111207 es.txerr =
1012
- cmd->u.usbcan.error_event.tx_errors_count_ch1;
1208
+ cmd->u.usbcan.can_error_event.tx_errors_count_ch1;
10131209 es.rxerr =
1014
- cmd->u.usbcan.error_event.rx_errors_count_ch1;
1210
+ cmd->u.usbcan.can_error_event.rx_errors_count_ch1;
10151211 es.usbcan.other_ch_status =
1016
- cmd->u.usbcan.error_event.status_ch0;
1212
+ cmd->u.usbcan.can_error_event.status_ch0;
10171213 kvaser_usb_leaf_usbcan_conditionally_rx_error(dev, &es);
10181214 }
10191215 break;
....@@ -1030,11 +1226,11 @@
10301226
10311227 switch (cmd->id) {
10321228 case CMD_CAN_ERROR_EVENT:
1033
- es.channel = cmd->u.leaf.error_event.channel;
1034
- es.status = cmd->u.leaf.error_event.status;
1035
- es.txerr = cmd->u.leaf.error_event.tx_errors_count;
1036
- es.rxerr = cmd->u.leaf.error_event.rx_errors_count;
1037
- es.leaf.error_factor = cmd->u.leaf.error_event.error_factor;
1229
+ es.channel = cmd->u.leaf.can_error_event.channel;
1230
+ es.status = cmd->u.leaf.can_error_event.status;
1231
+ es.txerr = cmd->u.leaf.can_error_event.tx_errors_count;
1232
+ es.rxerr = cmd->u.leaf.can_error_event.rx_errors_count;
1233
+ es.leaf.error_factor = cmd->u.leaf.can_error_event.error_factor;
10381234 break;
10391235 case CMD_LEAF_LOG_MESSAGE:
10401236 es.channel = cmd->u.leaf.log_message.channel;
....@@ -1166,6 +1362,74 @@
11661362 netif_rx(skb);
11671363 }
11681364
1365
+static void kvaser_usb_leaf_error_event_parameter(const struct kvaser_usb *dev,
1366
+ const struct kvaser_cmd *cmd)
1367
+{
1368
+ u16 info1 = 0;
1369
+
1370
+ switch (dev->driver_info->family) {
1371
+ case KVASER_LEAF:
1372
+ info1 = le16_to_cpu(cmd->u.leaf.error_event.info1);
1373
+ break;
1374
+ case KVASER_USBCAN:
1375
+ info1 = le16_to_cpu(cmd->u.usbcan.error_event.info1);
1376
+ break;
1377
+ }
1378
+
1379
+ /* info1 will contain the offending cmd_no */
1380
+ switch (info1) {
1381
+ case CMD_SET_CTRL_MODE:
1382
+ dev_warn(&dev->intf->dev,
1383
+ "CMD_SET_CTRL_MODE error in parameter\n");
1384
+ break;
1385
+
1386
+ case CMD_SET_BUS_PARAMS:
1387
+ dev_warn(&dev->intf->dev,
1388
+ "CMD_SET_BUS_PARAMS error in parameter\n");
1389
+ break;
1390
+
1391
+ default:
1392
+ dev_warn(&dev->intf->dev,
1393
+ "Unhandled parameter error event cmd_no (%u)\n",
1394
+ info1);
1395
+ break;
1396
+ }
1397
+}
1398
+
1399
+static void kvaser_usb_leaf_error_event(const struct kvaser_usb *dev,
1400
+ const struct kvaser_cmd *cmd)
1401
+{
1402
+ u8 error_code = 0;
1403
+
1404
+ switch (dev->driver_info->family) {
1405
+ case KVASER_LEAF:
1406
+ error_code = cmd->u.leaf.error_event.error_code;
1407
+ break;
1408
+ case KVASER_USBCAN:
1409
+ error_code = cmd->u.usbcan.error_event.error_code;
1410
+ break;
1411
+ }
1412
+
1413
+ switch (error_code) {
1414
+ case KVASER_USB_LEAF_ERROR_EVENT_TX_QUEUE_FULL:
1415
+ /* Received additional CAN message, when firmware TX queue is
1416
+ * already full. Something is wrong with the driver.
1417
+ * This should never happen!
1418
+ */
1419
+ dev_err(&dev->intf->dev,
1420
+ "Received error event TX_QUEUE_FULL\n");
1421
+ break;
1422
+ case KVASER_USB_LEAF_ERROR_EVENT_PARAM:
1423
+ kvaser_usb_leaf_error_event_parameter(dev, cmd);
1424
+ break;
1425
+
1426
+ default:
1427
+ dev_warn(&dev->intf->dev,
1428
+ "Unhandled error event (%d)\n", error_code);
1429
+ break;
1430
+ }
1431
+}
1432
+
11691433 static void kvaser_usb_leaf_start_chip_reply(const struct kvaser_usb *dev,
11701434 const struct kvaser_cmd *cmd)
11711435 {
....@@ -1206,6 +1470,25 @@
12061470 complete(&priv->stop_comp);
12071471 }
12081472
1473
+static void kvaser_usb_leaf_get_busparams_reply(const struct kvaser_usb *dev,
1474
+ const struct kvaser_cmd *cmd)
1475
+{
1476
+ struct kvaser_usb_net_priv *priv;
1477
+ u8 channel = cmd->u.busparams.channel;
1478
+
1479
+ if (channel >= dev->nchannels) {
1480
+ dev_err(&dev->intf->dev,
1481
+ "Invalid channel number (%d)\n", channel);
1482
+ return;
1483
+ }
1484
+
1485
+ priv = dev->nets[channel];
1486
+ memcpy(&priv->busparams_nominal, &cmd->u.busparams.busparams,
1487
+ sizeof(priv->busparams_nominal));
1488
+
1489
+ complete(&priv->get_busparams_comp);
1490
+}
1491
+
12091492 static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev,
12101493 const struct kvaser_cmd *cmd)
12111494 {
....@@ -1242,6 +1525,14 @@
12421525
12431526 case CMD_TX_ACKNOWLEDGE:
12441527 kvaser_usb_leaf_tx_acknowledge(dev, cmd);
1528
+ break;
1529
+
1530
+ case CMD_ERROR_EVENT:
1531
+ kvaser_usb_leaf_error_event(dev, cmd);
1532
+ break;
1533
+
1534
+ case CMD_GET_BUS_PARAMS_REPLY:
1535
+ kvaser_usb_leaf_get_busparams_reply(dev, cmd);
12451536 break;
12461537
12471538 /* Ignored commands */
....@@ -1340,9 +1631,12 @@
13401631
13411632 static int kvaser_usb_leaf_stop_chip(struct kvaser_usb_net_priv *priv)
13421633 {
1634
+ struct kvaser_usb_net_leaf_priv *leaf = priv->sub_priv;
13431635 int err;
13441636
13451637 reinit_completion(&priv->stop_comp);
1638
+
1639
+ cancel_delayed_work(&leaf->chip_state_req_work);
13461640
13471641 err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_STOP_CHIP,
13481642 priv->channel);
....@@ -1390,10 +1684,35 @@
13901684 return 0;
13911685 }
13921686
1393
-static int kvaser_usb_leaf_set_bittiming(struct net_device *netdev)
1687
+static int kvaser_usb_leaf_init_channel(struct kvaser_usb_net_priv *priv)
1688
+{
1689
+ struct kvaser_usb_net_leaf_priv *leaf;
1690
+
1691
+ leaf = devm_kzalloc(&priv->dev->intf->dev, sizeof(*leaf), GFP_KERNEL);
1692
+ if (!leaf)
1693
+ return -ENOMEM;
1694
+
1695
+ leaf->net = priv;
1696
+ INIT_DELAYED_WORK(&leaf->chip_state_req_work,
1697
+ kvaser_usb_leaf_chip_state_req_work);
1698
+
1699
+ priv->sub_priv = leaf;
1700
+
1701
+ return 0;
1702
+}
1703
+
1704
+static void kvaser_usb_leaf_remove_channel(struct kvaser_usb_net_priv *priv)
1705
+{
1706
+ struct kvaser_usb_net_leaf_priv *leaf = priv->sub_priv;
1707
+
1708
+ if (leaf)
1709
+ cancel_delayed_work_sync(&leaf->chip_state_req_work);
1710
+}
1711
+
1712
+static int kvaser_usb_leaf_set_bittiming(const struct net_device *netdev,
1713
+ const struct kvaser_usb_busparams *busparams)
13941714 {
13951715 struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
1396
- struct can_bittiming *bt = &priv->can.bittiming;
13971716 struct kvaser_usb *dev = priv->dev;
13981717 struct kvaser_cmd *cmd;
13991718 int rc;
....@@ -1406,20 +1725,34 @@
14061725 cmd->len = CMD_HEADER_LEN + sizeof(struct kvaser_cmd_busparams);
14071726 cmd->u.busparams.channel = priv->channel;
14081727 cmd->u.busparams.tid = 0xff;
1409
- cmd->u.busparams.bitrate = cpu_to_le32(bt->bitrate);
1410
- cmd->u.busparams.sjw = bt->sjw;
1411
- cmd->u.busparams.tseg1 = bt->prop_seg + bt->phase_seg1;
1412
- cmd->u.busparams.tseg2 = bt->phase_seg2;
1413
-
1414
- if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
1415
- cmd->u.busparams.no_samp = 3;
1416
- else
1417
- cmd->u.busparams.no_samp = 1;
1728
+ memcpy(&cmd->u.busparams.busparams, busparams,
1729
+ sizeof(cmd->u.busparams.busparams));
14181730
14191731 rc = kvaser_usb_send_cmd(dev, cmd, cmd->len);
14201732
14211733 kfree(cmd);
14221734 return rc;
1735
+}
1736
+
1737
+static int kvaser_usb_leaf_get_busparams(struct kvaser_usb_net_priv *priv)
1738
+{
1739
+ int err;
1740
+
1741
+ if (priv->dev->driver_info->family == KVASER_USBCAN)
1742
+ return -EOPNOTSUPP;
1743
+
1744
+ reinit_completion(&priv->get_busparams_comp);
1745
+
1746
+ err = kvaser_usb_leaf_send_simple_cmd(priv->dev, CMD_GET_BUS_PARAMS,
1747
+ priv->channel);
1748
+ if (err)
1749
+ return err;
1750
+
1751
+ if (!wait_for_completion_timeout(&priv->get_busparams_comp,
1752
+ msecs_to_jiffies(KVASER_USB_TIMEOUT)))
1753
+ return -ETIMEDOUT;
1754
+
1755
+ return 0;
14231756 }
14241757
14251758 static int kvaser_usb_leaf_set_mode(struct net_device *netdev,
....@@ -1483,14 +1816,18 @@
14831816 const struct kvaser_usb_dev_ops kvaser_usb_leaf_dev_ops = {
14841817 .dev_set_mode = kvaser_usb_leaf_set_mode,
14851818 .dev_set_bittiming = kvaser_usb_leaf_set_bittiming,
1819
+ .dev_get_busparams = kvaser_usb_leaf_get_busparams,
14861820 .dev_set_data_bittiming = NULL,
1821
+ .dev_get_data_busparams = NULL,
14871822 .dev_get_berr_counter = kvaser_usb_leaf_get_berr_counter,
14881823 .dev_setup_endpoints = kvaser_usb_leaf_setup_endpoints,
14891824 .dev_init_card = kvaser_usb_leaf_init_card,
1825
+ .dev_init_channel = kvaser_usb_leaf_init_channel,
1826
+ .dev_remove_channel = kvaser_usb_leaf_remove_channel,
14901827 .dev_get_software_info = kvaser_usb_leaf_get_software_info,
14911828 .dev_get_software_details = NULL,
14921829 .dev_get_card_info = kvaser_usb_leaf_get_card_info,
1493
- .dev_get_capabilities = NULL,
1830
+ .dev_get_capabilities = kvaser_usb_leaf_get_capabilities,
14941831 .dev_set_opt_mode = kvaser_usb_leaf_set_opt_mode,
14951832 .dev_start_chip = kvaser_usb_leaf_start_chip,
14961833 .dev_stop_chip = kvaser_usb_leaf_stop_chip,