hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c
....@@ -416,10 +416,6 @@
416416 if (err)
417417 return err;
418418
419
- err = kvaser_usb_setup_rx_urbs(dev);
420
- if (err)
421
- goto error;
422
-
423419 err = ops->dev_set_opt_mode(priv);
424420 if (err)
425421 goto error;
....@@ -508,6 +504,93 @@
508504 close_candev(priv->netdev);
509505
510506 return 0;
507
+}
508
+
509
+static int kvaser_usb_set_bittiming(struct net_device *netdev)
510
+{
511
+ struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
512
+ struct kvaser_usb *dev = priv->dev;
513
+ const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops;
514
+ struct can_bittiming *bt = &priv->can.bittiming;
515
+
516
+ struct kvaser_usb_busparams busparams;
517
+ int tseg1 = bt->prop_seg + bt->phase_seg1;
518
+ int tseg2 = bt->phase_seg2;
519
+ int sjw = bt->sjw;
520
+ int err = -EOPNOTSUPP;
521
+
522
+ busparams.bitrate = cpu_to_le32(bt->bitrate);
523
+ busparams.sjw = (u8)sjw;
524
+ busparams.tseg1 = (u8)tseg1;
525
+ busparams.tseg2 = (u8)tseg2;
526
+ if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
527
+ busparams.nsamples = 3;
528
+ else
529
+ busparams.nsamples = 1;
530
+
531
+ err = ops->dev_set_bittiming(netdev, &busparams);
532
+ if (err)
533
+ return err;
534
+
535
+ err = kvaser_usb_setup_rx_urbs(priv->dev);
536
+ if (err)
537
+ return err;
538
+
539
+ err = ops->dev_get_busparams(priv);
540
+ if (err) {
541
+ /* Treat EOPNOTSUPP as success */
542
+ if (err == -EOPNOTSUPP)
543
+ err = 0;
544
+ return err;
545
+ }
546
+
547
+ if (memcmp(&busparams, &priv->busparams_nominal,
548
+ sizeof(priv->busparams_nominal)) != 0)
549
+ err = -EINVAL;
550
+
551
+ return err;
552
+}
553
+
554
+static int kvaser_usb_set_data_bittiming(struct net_device *netdev)
555
+{
556
+ struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
557
+ struct kvaser_usb *dev = priv->dev;
558
+ const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops;
559
+ struct can_bittiming *dbt = &priv->can.data_bittiming;
560
+
561
+ struct kvaser_usb_busparams busparams;
562
+ int tseg1 = dbt->prop_seg + dbt->phase_seg1;
563
+ int tseg2 = dbt->phase_seg2;
564
+ int sjw = dbt->sjw;
565
+ int err;
566
+
567
+ if (!ops->dev_set_data_bittiming ||
568
+ !ops->dev_get_data_busparams)
569
+ return -EOPNOTSUPP;
570
+
571
+ busparams.bitrate = cpu_to_le32(dbt->bitrate);
572
+ busparams.sjw = (u8)sjw;
573
+ busparams.tseg1 = (u8)tseg1;
574
+ busparams.tseg2 = (u8)tseg2;
575
+ busparams.nsamples = 1;
576
+
577
+ err = ops->dev_set_data_bittiming(netdev, &busparams);
578
+ if (err)
579
+ return err;
580
+
581
+ err = kvaser_usb_setup_rx_urbs(priv->dev);
582
+ if (err)
583
+ return err;
584
+
585
+ err = ops->dev_get_data_busparams(priv);
586
+ if (err)
587
+ return err;
588
+
589
+ if (memcmp(&busparams, &priv->busparams_data,
590
+ sizeof(priv->busparams_data)) != 0)
591
+ err = -EINVAL;
592
+
593
+ return err;
511594 }
512595
513596 static void kvaser_usb_write_bulk_callback(struct urb *urb)
....@@ -645,6 +728,7 @@
645728
646729 static void kvaser_usb_remove_interfaces(struct kvaser_usb *dev)
647730 {
731
+ const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops;
648732 int i;
649733
650734 for (i = 0; i < dev->nchannels; i++) {
....@@ -659,6 +743,9 @@
659743 for (i = 0; i < dev->nchannels; i++) {
660744 if (!dev->nets[i])
661745 continue;
746
+
747
+ if (ops->dev_remove_channel)
748
+ ops->dev_remove_channel(dev->nets[i]);
662749
663750 free_candev(dev->nets[i]->netdev);
664751 }
....@@ -691,6 +778,7 @@
691778 init_completion(&priv->start_comp);
692779 init_completion(&priv->stop_comp);
693780 init_completion(&priv->flush_comp);
781
+ init_completion(&priv->get_busparams_comp);
694782 priv->can.ctrlmode_supported = 0;
695783
696784 priv->dev = dev;
....@@ -703,7 +791,7 @@
703791 priv->can.state = CAN_STATE_STOPPED;
704792 priv->can.clock.freq = dev->cfg->clock.freq;
705793 priv->can.bittiming_const = dev->cfg->bittiming_const;
706
- priv->can.do_set_bittiming = ops->dev_set_bittiming;
794
+ priv->can.do_set_bittiming = kvaser_usb_set_bittiming;
707795 priv->can.do_set_mode = ops->dev_set_mode;
708796 if ((driver_info->quirks & KVASER_USB_QUIRK_HAS_TXRX_ERRORS) ||
709797 (priv->dev->card_data.capabilities & KVASER_USB_CAP_BERR_CAP))
....@@ -715,7 +803,7 @@
715803
716804 if (priv->can.ctrlmode_supported & CAN_CTRLMODE_FD) {
717805 priv->can.data_bittiming_const = dev->cfg->data_bittiming_const;
718
- priv->can.do_set_data_bittiming = ops->dev_set_data_bittiming;
806
+ priv->can.do_set_data_bittiming = kvaser_usb_set_data_bittiming;
719807 }
720808
721809 netdev->flags |= IFF_ECHO;
....@@ -727,17 +815,26 @@
727815
728816 dev->nets[channel] = priv;
729817
818
+ if (ops->dev_init_channel) {
819
+ err = ops->dev_init_channel(priv);
820
+ if (err)
821
+ goto err;
822
+ }
823
+
730824 err = register_candev(netdev);
731825 if (err) {
732826 dev_err(&dev->intf->dev, "Failed to register CAN device\n");
733
- free_candev(netdev);
734
- dev->nets[channel] = NULL;
735
- return err;
827
+ goto err;
736828 }
737829
738830 netdev_dbg(netdev, "device registered\n");
739831
740832 return 0;
833
+
834
+err:
835
+ free_candev(netdev);
836
+ dev->nets[channel] = NULL;
837
+ return err;
741838 }
742839
743840 static int kvaser_usb_probe(struct usb_interface *intf,