hc
2024-05-16 8d2a02b24d66aa359e83eebc1ed3c0f85367a1cb
kernel/drivers/net/can/kvaser_pciefd.c
....@@ -70,10 +70,12 @@
7070 #define KVASER_PCIEFD_SYSID_BUILD_REG (KVASER_PCIEFD_SYSID_BASE + 0x14)
7171 /* Shared receive buffer registers */
7272 #define KVASER_PCIEFD_SRB_BASE 0x1f200
73
+#define KVASER_PCIEFD_SRB_FIFO_LAST_REG (KVASER_PCIEFD_SRB_BASE + 0x1f4)
7374 #define KVASER_PCIEFD_SRB_CMD_REG (KVASER_PCIEFD_SRB_BASE + 0x200)
7475 #define KVASER_PCIEFD_SRB_IEN_REG (KVASER_PCIEFD_SRB_BASE + 0x204)
7576 #define KVASER_PCIEFD_SRB_IRQ_REG (KVASER_PCIEFD_SRB_BASE + 0x20c)
7677 #define KVASER_PCIEFD_SRB_STAT_REG (KVASER_PCIEFD_SRB_BASE + 0x210)
78
+#define KVASER_PCIEFD_SRB_RX_NR_PACKETS_REG (KVASER_PCIEFD_SRB_BASE + 0x214)
7779 #define KVASER_PCIEFD_SRB_CTRL_REG (KVASER_PCIEFD_SRB_BASE + 0x218)
7880 /* EPCS flash controller registers */
7981 #define KVASER_PCIEFD_SPI_BASE 0x1fc00
....@@ -109,6 +111,9 @@
109111 #define KVASER_PCIEFD_SRB_STAT_DI BIT(15)
110112 /* DMA support */
111113 #define KVASER_PCIEFD_SRB_STAT_DMA BIT(24)
114
+
115
+/* SRB current packet level */
116
+#define KVASER_PCIEFD_SRB_RX_NR_PACKETS_MASK 0xff
112117
113118 /* DMA Enable */
114119 #define KVASER_PCIEFD_SRB_CTRL_DMA_ENABLE BIT(0)
....@@ -528,7 +533,7 @@
528533 KVASER_PCIEFD_KCAN_IRQ_TOF | KVASER_PCIEFD_KCAN_IRQ_ABD |
529534 KVASER_PCIEFD_KCAN_IRQ_TAE | KVASER_PCIEFD_KCAN_IRQ_TAL |
530535 KVASER_PCIEFD_KCAN_IRQ_FDIC | KVASER_PCIEFD_KCAN_IRQ_BPP |
531
- KVASER_PCIEFD_KCAN_IRQ_TAR | KVASER_PCIEFD_KCAN_IRQ_TFD;
536
+ KVASER_PCIEFD_KCAN_IRQ_TAR;
532537
533538 iowrite32(msk, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
534539
....@@ -556,6 +561,8 @@
556561
557562 if (can->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
558563 mode |= KVASER_PCIEFD_KCAN_MODE_LOM;
564
+ else
565
+ mode &= ~KVASER_PCIEFD_KCAN_MODE_LOM;
559566
560567 mode |= KVASER_PCIEFD_KCAN_MODE_EEN;
561568 mode |= KVASER_PCIEFD_KCAN_MODE_EPEN;
....@@ -574,7 +581,7 @@
574581
575582 spin_lock_irqsave(&can->lock, irq);
576583 iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
577
- iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD | KVASER_PCIEFD_KCAN_IRQ_TFD,
584
+ iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
578585 can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
579586
580587 status = ioread32(can->reg_base + KVASER_PCIEFD_KCAN_STAT_REG);
....@@ -617,7 +624,7 @@
617624 iowrite32(0, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
618625 iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
619626
620
- iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD | KVASER_PCIEFD_KCAN_IRQ_TFD,
627
+ iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
621628 can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
622629
623630 mode = ioread32(can->reg_base + KVASER_PCIEFD_KCAN_MODE_REG);
....@@ -721,6 +728,7 @@
721728 iowrite32(0, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
722729 del_timer(&can->bec_poll_timer);
723730 }
731
+ can->can.state = CAN_STATE_STOPPED;
724732 close_candev(netdev);
725733
726734 return ret;
....@@ -1003,8 +1011,7 @@
10031011 SET_NETDEV_DEV(netdev, &pcie->pci->dev);
10041012
10051013 iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
1006
- iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD |
1007
- KVASER_PCIEFD_KCAN_IRQ_TFD,
1014
+ iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
10081015 can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
10091016
10101017 pcie->can[i] = can;
....@@ -1054,6 +1061,7 @@
10541061 {
10551062 int i;
10561063 u32 srb_status;
1064
+ u32 srb_packet_count;
10571065 dma_addr_t dma_addr[KVASER_PCIEFD_DMA_COUNT];
10581066
10591067 /* Disable the DMA */
....@@ -1080,6 +1088,15 @@
10801088 iowrite32(KVASER_PCIEFD_SRB_CMD_FOR | KVASER_PCIEFD_SRB_CMD_RDB0 |
10811089 KVASER_PCIEFD_SRB_CMD_RDB1,
10821090 pcie->reg_base + KVASER_PCIEFD_SRB_CMD_REG);
1091
+
1092
+ /* Empty Rx FIFO */
1093
+ srb_packet_count = ioread32(pcie->reg_base + KVASER_PCIEFD_SRB_RX_NR_PACKETS_REG) &
1094
+ KVASER_PCIEFD_SRB_RX_NR_PACKETS_MASK;
1095
+ while (srb_packet_count) {
1096
+ /* Drop current packet in FIFO */
1097
+ ioread32(pcie->reg_base + KVASER_PCIEFD_SRB_FIFO_LAST_REG);
1098
+ srb_packet_count--;
1099
+ }
10831100
10841101 srb_status = ioread32(pcie->reg_base + KVASER_PCIEFD_SRB_STAT_REG);
10851102 if (!(srb_status & KVASER_PCIEFD_SRB_STAT_DI)) {
....@@ -1423,9 +1440,6 @@
14231440 cmd = KVASER_PCIEFD_KCAN_CMD_AT;
14241441 cmd |= ++can->cmd_seq << KVASER_PCIEFD_KCAN_CMD_SEQ_SHIFT;
14251442 iowrite32(cmd, can->reg_base + KVASER_PCIEFD_KCAN_CMD_REG);
1426
-
1427
- iowrite32(KVASER_PCIEFD_KCAN_IRQ_TFD,
1428
- can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
14291443 } else if (p->header[0] & KVASER_PCIEFD_SPACK_IDET &&
14301444 p->header[0] & KVASER_PCIEFD_SPACK_IRM &&
14311445 cmdseq == (p->header[1] & KVASER_PCIEFD_PACKET_SEQ_MSK) &&
....@@ -1714,15 +1728,6 @@
17141728 if (irq & KVASER_PCIEFD_KCAN_IRQ_TOF)
17151729 netdev_err(can->can.dev, "Tx FIFO overflow\n");
17161730
1717
- if (irq & KVASER_PCIEFD_KCAN_IRQ_TFD) {
1718
- u8 count = ioread32(can->reg_base +
1719
- KVASER_PCIEFD_KCAN_TX_NPACKETS_REG) & 0xff;
1720
-
1721
- if (count == 0)
1722
- iowrite32(KVASER_PCIEFD_KCAN_CTRL_EFLUSH,
1723
- can->reg_base + KVASER_PCIEFD_KCAN_CTRL_REG);
1724
- }
1725
-
17261731 if (irq & KVASER_PCIEFD_KCAN_IRQ_BPP)
17271732 netdev_err(can->can.dev,
17281733 "Fail to change bittiming, when not in reset mode\n");
....@@ -1824,6 +1829,11 @@
18241829 if (err)
18251830 goto err_teardown_can_ctrls;
18261831
1832
+ err = request_irq(pcie->pci->irq, kvaser_pciefd_irq_handler,
1833
+ IRQF_SHARED, KVASER_PCIEFD_DRV_NAME, pcie);
1834
+ if (err)
1835
+ goto err_teardown_can_ctrls;
1836
+
18271837 iowrite32(KVASER_PCIEFD_SRB_IRQ_DPD0 | KVASER_PCIEFD_SRB_IRQ_DPD1,
18281838 pcie->reg_base + KVASER_PCIEFD_SRB_IRQ_REG);
18291839
....@@ -1844,11 +1854,6 @@
18441854 iowrite32(KVASER_PCIEFD_SRB_CMD_RDB1,
18451855 pcie->reg_base + KVASER_PCIEFD_SRB_CMD_REG);
18461856
1847
- err = request_irq(pcie->pci->irq, kvaser_pciefd_irq_handler,
1848
- IRQF_SHARED, KVASER_PCIEFD_DRV_NAME, pcie);
1849
- if (err)
1850
- goto err_teardown_can_ctrls;
1851
-
18521857 err = kvaser_pciefd_reg_candev(pcie);
18531858 if (err)
18541859 goto err_free_irq;
....@@ -1856,6 +1861,8 @@
18561861 return 0;
18571862
18581863 err_free_irq:
1864
+ /* Disable PCI interrupts */
1865
+ iowrite32(0, pcie->reg_base + KVASER_PCIEFD_IEN_REG);
18591866 free_irq(pcie->pci->irq, pcie);
18601867
18611868 err_teardown_can_ctrls: