hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/net/can/rockchip/rockchip_canfd.c
....@@ -27,6 +27,7 @@
2727 #include <linux/can/led.h>
2828 #include <linux/reset.h>
2929 #include <linux/pm_runtime.h>
30
+#include <linux/rockchip/cpu.h>
3031
3132 /* registers definition */
3233 enum rockchip_canfd_reg {
....@@ -105,6 +106,7 @@
105106 ROCKCHIP_CANFD_MODE = 0,
106107 ROCKCHIP_CAN_MODE,
107108 ROCKCHIP_RK3568_CAN_MODE,
109
+ ROCKCHIP_RK3568_CAN_MODE_V2,
108110 };
109111
110112 #define DATE_LENGTH_12_BYTE (0x9)
....@@ -220,6 +222,7 @@
220222 struct rockchip_canfd {
221223 struct can_priv can;
222224 struct device *dev;
225
+ struct napi_struct napi;
223226 struct clk_bulk_data *clks;
224227 int num_clks;
225228 struct reset_control *reset;
....@@ -292,8 +295,6 @@
292295
293296 val = rockchip_canfd_read(rcan, CAN_MODE);
294297 val |= WORK_MODE;
295
- if (rcan->mode >= ROCKCHIP_CAN_MODE && rcan->txtorx)
296
- val |= MODE_RXSTX;
297298 rockchip_canfd_write(rcan, CAN_MODE, val);
298299
299300 netdev_dbg(ndev, "%s MODE=0x%08x\n", __func__,
....@@ -427,8 +428,6 @@
427428 if (rcan->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
428429 val |= MODE_SELF_TEST | MODE_LBACK;
429430
430
- val |= MODE_AUTO_RETX;
431
-
432431 rockchip_canfd_write(rcan, CAN_MODE, val);
433432
434433 rockchip_canfd_set_bittiming(ndev);
....@@ -488,19 +487,13 @@
488487 {
489488 struct rockchip_canfd *rcan =
490489 container_of(work, struct rockchip_canfd, tx_err_work.work);
491
- u32 mode, err_code, id;
490
+ u32 mode;
492491
493
- id = rockchip_canfd_read(rcan, CAN_TXID);
494
- err_code = rockchip_canfd_read(rcan, CAN_ERR_CODE);
495
- if (err_code & 0x1fe0000) {
496
- mode = rockchip_canfd_read(rcan, CAN_MODE);
497
- rockchip_canfd_write(rcan, CAN_MODE, 0);
498
- rockchip_canfd_write(rcan, CAN_MODE, mode);
499
- rockchip_canfd_write(rcan, CAN_CMD, CAN_TX0_REQ);
500
- schedule_delayed_work(&rcan->tx_err_work, 1);
501
- } else if (rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && id & CAN_EFF_FLAG) {
502
- schedule_delayed_work(&rcan->tx_err_work, 1);
503
- }
492
+ mode = rockchip_canfd_read(rcan, CAN_MODE);
493
+ rockchip_canfd_write(rcan, CAN_MODE, 0);
494
+ rockchip_canfd_write(rcan, CAN_MODE, mode);
495
+ rockchip_canfd_write(rcan, CAN_CMD, CAN_TX0_REQ);
496
+ schedule_delayed_work(&rcan->tx_err_work, 1);
504497 }
505498
506499 /* transmit a CAN message
....@@ -552,7 +545,14 @@
552545 dlc |= TX_FD_BRS_ENABLE;
553546 }
554547
555
- if (!rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && cf->can_id & CAN_EFF_FLAG) {
548
+ if (rcan->txtorx && rcan->mode <= ROCKCHIP_RK3568_CAN_MODE && cf->can_id & CAN_EFF_FLAG)
549
+ rockchip_canfd_write(rcan, CAN_MODE,
550
+ rockchip_canfd_read(rcan, CAN_MODE) | MODE_RXSTX);
551
+ else
552
+ rockchip_canfd_write(rcan, CAN_MODE,
553
+ rockchip_canfd_read(rcan, CAN_MODE) & (~MODE_RXSTX));
554
+
555
+ if (!rcan->txtorx && rcan->mode <= ROCKCHIP_RK3568_CAN_MODE && cf->can_id & CAN_EFF_FLAG) {
556556 /* Two frames are sent consecutively.
557557 * Before the first frame is tx finished,
558558 * the register of the second frame is configured.
....@@ -583,10 +583,9 @@
583583 rockchip_canfd_write(rcan, CAN_TXDAT0 + i,
584584 *(u32 *)(cf->data + i));
585585
586
- rockchip_canfd_write(rcan, CAN_CMD, CAN_TX1_REQ);
586
+ rockchip_canfd_write(rcan, CAN_CMD, cmd);
587587
588
- if (rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && cf->can_id & CAN_EFF_FLAG)
589
- schedule_delayed_work(&rcan->tx_err_work, 1);
588
+ schedule_delayed_work(&rcan->tx_err_work, 1);
590589
591590 can_put_echo_skb(skb, ndev, 0);
592591
....@@ -602,15 +601,15 @@
602601 u32 id_rockchip_canfd, dlc;
603602 int i = 0;
604603 u32 __maybe_unused ts, ret;
605
- u32 data[16] = {0};
604
+ u32 data[16];
606605
607606 dlc = rockchip_canfd_read(rcan, CAN_RXFRD);
608607 id_rockchip_canfd = rockchip_canfd_read(rcan, CAN_RXFRD);
609608 ts = rockchip_canfd_read(rcan, CAN_RXFRD);
610
- for (i = 0; i < 16; i++)
609
+ for (i = 0; i < ARRAY_SIZE(data); i++)
611610 data[i] = rockchip_canfd_read(rcan, CAN_RXFRD);
612611
613
- if (rcan->mode >= ROCKCHIP_CAN_MODE) {
612
+ if (rcan->mode <= ROCKCHIP_RK3568_CAN_MODE) {
614613 /* may be an empty frame */
615614 if (!dlc && !id_rockchip_canfd)
616615 return 1;
....@@ -618,11 +617,10 @@
618617 if (rcan->txtorx) {
619618 if (rockchip_canfd_read(rcan, CAN_TX_CHECK_FIC) & FORMAT_MASK) {
620619 ret = rockchip_canfd_read(rcan, CAN_TXID) & CAN_SFF_MASK;
621
- if (id_rockchip_canfd == ret) {
620
+ if ((id_rockchip_canfd == ret) && !(dlc & FORMAT_MASK))
622621 rockchip_canfd_write(rcan, CAN_TX_CHECK_FIC,
623622 ts | CAN_TX0_REQ);
624
- return 1;
625
- }
623
+ return 1;
626624 }
627625 }
628626 }
....@@ -675,6 +673,53 @@
675673 return 1;
676674 }
677675
676
+static int rockchip_canfd_get_rx_fifo_cnt(struct net_device *ndev)
677
+{
678
+ struct rockchip_canfd *rcan = netdev_priv(ndev);
679
+ int quota = 0;
680
+
681
+ if (read_poll_timeout_atomic(rockchip_canfd_read, quota,
682
+ (quota & rcan->rx_fifo_mask) >> rcan->rx_fifo_shift,
683
+ 0, 500000, false, rcan, CAN_RXFC))
684
+ netdev_dbg(ndev, "Warning: get fifo cnt failed\n");
685
+
686
+ quota = (quota & rcan->rx_fifo_mask) >> rcan->rx_fifo_shift;
687
+
688
+ return quota;
689
+}
690
+
691
+/* rockchip_canfd_rx_poll - Poll routine for rx packets (NAPI)
692
+ * @napi: napi structure pointer
693
+ * @quota: Max number of rx packets to be processed.
694
+ *
695
+ * This is the poll routine for rx part.
696
+ * It will process the packets maximux quota value.
697
+ *
698
+ * Return: number of packets received
699
+ */
700
+static int rockchip_canfd_rx_poll(struct napi_struct *napi, int quota)
701
+{
702
+ struct net_device *ndev = napi->dev;
703
+ struct rockchip_canfd *rcan = netdev_priv(ndev);
704
+ int work_done = 0;
705
+
706
+ quota = rockchip_canfd_get_rx_fifo_cnt(ndev);
707
+ if (quota) {
708
+ while (work_done < quota)
709
+ work_done += rockchip_canfd_rx(ndev);
710
+ }
711
+
712
+ if (work_done)
713
+ can_led_event(ndev, CAN_LED_EVENT_RX);
714
+
715
+ if (work_done < 6) {
716
+ napi_complete_done(napi, work_done);
717
+ rockchip_canfd_write(rcan, CAN_INT_MASK, 0);
718
+ }
719
+
720
+ return work_done;
721
+}
722
+
678723 static int rockchip_canfd_err(struct net_device *ndev, u32 isr)
679724 {
680725 struct rockchip_canfd *rcan = netdev_priv(ndev);
....@@ -694,6 +739,9 @@
694739 cf->data[6] = txerr;
695740 cf->data[7] = rxerr;
696741 }
742
+
743
+ if (isr & TX_LOSTARB_INT)
744
+ schedule_delayed_work(&rcan->tx_err_work, 1);
697745
698746 if (isr & BUS_OFF_INT) {
699747 rcan->can.state = CAN_STATE_BUS_OFF;
....@@ -754,12 +802,10 @@
754802 else
755803 stats->tx_bytes += (dlc & DLC_MASK);
756804 stats->tx_packets++;
757
- if (rcan->txtorx && rcan->mode >= ROCKCHIP_CAN_MODE && dlc & FORMAT_MASK) {
758
- cancel_delayed_work(&rcan->tx_err_work);
805
+ cancel_delayed_work(&rcan->tx_err_work);
806
+ if (rcan->txtorx && rcan->mode <= ROCKCHIP_RK3568_CAN_MODE && dlc & FORMAT_MASK) {
759807 rockchip_canfd_write(rcan, CAN_TX_CHECK_FIC, FORMAT_MASK);
760
- quota = (rockchip_canfd_read(rcan, CAN_RXFC) &
761
- rcan->rx_fifo_mask) >>
762
- rcan->rx_fifo_shift;
808
+ quota = rockchip_canfd_get_rx_fifo_cnt(ndev);
763809 if (quota) {
764810 while (work_done < quota)
765811 work_done += rockchip_canfd_rx(ndev);
....@@ -775,11 +821,15 @@
775821 }
776822
777823 if (isr & RX_FINISH_INT) {
778
- quota = (rockchip_canfd_read(rcan, CAN_RXFC) & rcan->rx_fifo_mask) >>
779
- rcan->rx_fifo_shift;
780
- if (quota) {
781
- while (work_done < quota)
782
- work_done += rockchip_canfd_rx(ndev);
824
+ if (rcan->mode == ROCKCHIP_RK3568_CAN_MODE_V2) {
825
+ rockchip_canfd_write(rcan, CAN_INT_MASK, 0x1);
826
+ napi_schedule(&rcan->napi);
827
+ } else {
828
+ quota = rockchip_canfd_get_rx_fifo_cnt(ndev);
829
+ if (quota) {
830
+ while (work_done < quota)
831
+ work_done += rockchip_canfd_rx(ndev);
832
+ }
783833 }
784834 }
785835
....@@ -817,6 +867,8 @@
817867 }
818868
819869 can_led_event(ndev, CAN_LED_EVENT_OPEN);
870
+ if (rcan->mode == ROCKCHIP_RK3568_CAN_MODE_V2)
871
+ napi_enable(&rcan->napi);
820872 netif_start_queue(ndev);
821873
822874 netdev_dbg(ndev, "%s\n", __func__);
....@@ -834,6 +886,8 @@
834886 struct rockchip_canfd *rcan = netdev_priv(ndev);
835887
836888 netif_stop_queue(ndev);
889
+ if (rcan->mode == ROCKCHIP_RK3568_CAN_MODE_V2)
890
+ napi_disable(&rcan->napi);
837891 rockchip_canfd_stop(ndev);
838892 close_candev(ndev);
839893 can_led_event(ndev, CAN_LED_EVENT_STOP);
....@@ -1011,6 +1065,9 @@
10111065
10121066 rcan->mode = (unsigned long)of_device_get_match_data(&pdev->dev);
10131067
1068
+ if ((cpu_is_rk3566() || cpu_is_rk3568()) && (rockchip_get_cpu_version() == 3))
1069
+ rcan->mode = ROCKCHIP_RK3568_CAN_MODE_V2;
1070
+
10141071 rcan->base = addr;
10151072 rcan->can.clock.freq = clk_get_rate(rcan->clks[0].clk);
10161073 rcan->dev = &pdev->dev;
....@@ -1032,6 +1089,7 @@
10321089 break;
10331090 case ROCKCHIP_CAN_MODE:
10341091 case ROCKCHIP_RK3568_CAN_MODE:
1092
+ case ROCKCHIP_RK3568_CAN_MODE_V2:
10351093 rcan->can.bittiming_const = &rockchip_canfd_bittiming_const;
10361094 rcan->can.do_set_mode = rockchip_canfd_set_mode;
10371095 rcan->can.do_get_berr_counter = rockchip_canfd_get_berr_counter;
....@@ -1056,10 +1114,17 @@
10561114 rcan->tx_invalid, 4))
10571115 rcan->txtorx = 1;
10581116
1117
+ if (rcan->mode == ROCKCHIP_RK3568_CAN_MODE_V2) {
1118
+ rcan->txtorx = 0;
1119
+ netif_napi_add(ndev, &rcan->napi, rockchip_canfd_rx_poll, 6);
1120
+ }
1121
+
10591122 ndev->netdev_ops = &rockchip_canfd_netdev_ops;
10601123 ndev->irq = irq;
10611124 ndev->flags |= IFF_ECHO;
10621125 rcan->can.restart_ms = 1;
1126
+
1127
+ irq_set_affinity_hint(irq, get_cpu_mask(num_online_cpus() - 1));
10631128
10641129 INIT_DELAYED_WORK(&rcan->tx_err_work, rockchip_canfd_tx_err_delay_work);
10651130
....@@ -1097,9 +1162,12 @@
10971162 static int rockchip_canfd_remove(struct platform_device *pdev)
10981163 {
10991164 struct net_device *ndev = platform_get_drvdata(pdev);
1165
+ struct rockchip_canfd *rcan = netdev_priv(ndev);
11001166
11011167 unregister_netdev(ndev);
11021168 pm_runtime_disable(&pdev->dev);
1169
+ if (rcan->mode == ROCKCHIP_RK3568_CAN_MODE_V2)
1170
+ netif_napi_del(&rcan->napi);
11031171 free_candev(ndev);
11041172
11051173 return 0;