Skip to content

Commit 6e42fae

Browse files
author
Paolo Abeni
committed
Merge tag 'linux-can-fixes-for-6.4-20230518' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can
Marc Kleine-Budde says: ==================== pull-request: can 2023-05-18 this is a pull request of 7 patches for net/master. The first 6 patches are by Jimmy Assarsson and fix several bugs in the kvaser_pciefd driver. The latest patch is from me and reverts a change in stm32f746.dtsi that causes build errors due to a missing dependent patch. * tag 'linux-can-fixes-for-6.4-20230518' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can: Revert "ARM: dts: stm32: add CAN support on stm32f746" can: kvaser_pciefd: Disable interrupts in probe error path can: kvaser_pciefd: Do not send EFLUSH command on TFD interrupt can: kvaser_pciefd: Empty SRB buffer in probe can: kvaser_pciefd: Call request_irq() before enabling interrupts can: kvaser_pciefd: Clear listen-only bit if not explicitly requested can: kvaser_pciefd: Set CAN_STATE_STOPPED in kvaser_pciefd_stop() ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Paolo Abeni <[email protected]>
2 parents 30a0f49 + 36a6418 commit 6e42fae

File tree

2 files changed

+29
-69
lines changed

2 files changed

+29
-69
lines changed

arch/arm/boot/dts/stm32f746.dtsi

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -257,23 +257,6 @@
257257
status = "disabled";
258258
};
259259

260-
can3: can@40003400 {
261-
compatible = "st,stm32f4-bxcan";
262-
reg = <0x40003400 0x200>;
263-
interrupts = <104>, <105>, <106>, <107>;
264-
interrupt-names = "tx", "rx0", "rx1", "sce";
265-
resets = <&rcc STM32F7_APB1_RESET(CAN3)>;
266-
clocks = <&rcc 0 STM32F7_APB1_CLOCK(CAN3)>;
267-
st,gcan = <&gcan3>;
268-
status = "disabled";
269-
};
270-
271-
gcan3: gcan@40003600 {
272-
compatible = "st,stm32f4-gcan", "syscon";
273-
reg = <0x40003600 0x200>;
274-
clocks = <&rcc 0 STM32F7_APB1_CLOCK(CAN3)>;
275-
};
276-
277260
usart2: serial@40004400 {
278261
compatible = "st,stm32f7-uart";
279262
reg = <0x40004400 0x400>;
@@ -354,36 +337,6 @@
354337
status = "disabled";
355338
};
356339

357-
can1: can@40006400 {
358-
compatible = "st,stm32f4-bxcan";
359-
reg = <0x40006400 0x200>;
360-
interrupts = <19>, <20>, <21>, <22>;
361-
interrupt-names = "tx", "rx0", "rx1", "sce";
362-
resets = <&rcc STM32F7_APB1_RESET(CAN1)>;
363-
clocks = <&rcc 0 STM32F7_APB1_CLOCK(CAN1)>;
364-
st,can-primary;
365-
st,gcan = <&gcan1>;
366-
status = "disabled";
367-
};
368-
369-
gcan1: gcan@40006600 {
370-
compatible = "st,stm32f4-gcan", "syscon";
371-
reg = <0x40006600 0x200>;
372-
clocks = <&rcc 0 STM32F7_APB1_CLOCK(CAN1)>;
373-
};
374-
375-
can2: can@40006800 {
376-
compatible = "st,stm32f4-bxcan";
377-
reg = <0x40006800 0x200>;
378-
interrupts = <63>, <64>, <65>, <66>;
379-
interrupt-names = "tx", "rx0", "rx1", "sce";
380-
resets = <&rcc STM32F7_APB1_RESET(CAN2)>;
381-
clocks = <&rcc 0 STM32F7_APB1_CLOCK(CAN2)>;
382-
st,can-secondary;
383-
st,gcan = <&gcan1>;
384-
status = "disabled";
385-
};
386-
387340
cec: cec@40006c00 {
388341
compatible = "st,stm32-cec";
389342
reg = <0x40006C00 0x400>;

drivers/net/can/kvaser_pciefd.c

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,12 @@ MODULE_DESCRIPTION("CAN driver for Kvaser CAN/PCIe devices");
7171
#define KVASER_PCIEFD_SYSID_BUILD_REG (KVASER_PCIEFD_SYSID_BASE + 0x14)
7272
/* Shared receive buffer registers */
7373
#define KVASER_PCIEFD_SRB_BASE 0x1f200
74+
#define KVASER_PCIEFD_SRB_FIFO_LAST_REG (KVASER_PCIEFD_SRB_BASE + 0x1f4)
7475
#define KVASER_PCIEFD_SRB_CMD_REG (KVASER_PCIEFD_SRB_BASE + 0x200)
7576
#define KVASER_PCIEFD_SRB_IEN_REG (KVASER_PCIEFD_SRB_BASE + 0x204)
7677
#define KVASER_PCIEFD_SRB_IRQ_REG (KVASER_PCIEFD_SRB_BASE + 0x20c)
7778
#define KVASER_PCIEFD_SRB_STAT_REG (KVASER_PCIEFD_SRB_BASE + 0x210)
79+
#define KVASER_PCIEFD_SRB_RX_NR_PACKETS_REG (KVASER_PCIEFD_SRB_BASE + 0x214)
7880
#define KVASER_PCIEFD_SRB_CTRL_REG (KVASER_PCIEFD_SRB_BASE + 0x218)
7981
/* EPCS flash controller registers */
8082
#define KVASER_PCIEFD_SPI_BASE 0x1fc00
@@ -111,6 +113,9 @@ MODULE_DESCRIPTION("CAN driver for Kvaser CAN/PCIe devices");
111113
/* DMA support */
112114
#define KVASER_PCIEFD_SRB_STAT_DMA BIT(24)
113115

116+
/* SRB current packet level */
117+
#define KVASER_PCIEFD_SRB_RX_NR_PACKETS_MASK 0xff
118+
114119
/* DMA Enable */
115120
#define KVASER_PCIEFD_SRB_CTRL_DMA_ENABLE BIT(0)
116121

@@ -526,7 +531,7 @@ static int kvaser_pciefd_set_tx_irq(struct kvaser_pciefd_can *can)
526531
KVASER_PCIEFD_KCAN_IRQ_TOF | KVASER_PCIEFD_KCAN_IRQ_ABD |
527532
KVASER_PCIEFD_KCAN_IRQ_TAE | KVASER_PCIEFD_KCAN_IRQ_TAL |
528533
KVASER_PCIEFD_KCAN_IRQ_FDIC | KVASER_PCIEFD_KCAN_IRQ_BPP |
529-
KVASER_PCIEFD_KCAN_IRQ_TAR | KVASER_PCIEFD_KCAN_IRQ_TFD;
534+
KVASER_PCIEFD_KCAN_IRQ_TAR;
530535

531536
iowrite32(msk, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
532537

@@ -554,6 +559,8 @@ static void kvaser_pciefd_setup_controller(struct kvaser_pciefd_can *can)
554559

555560
if (can->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
556561
mode |= KVASER_PCIEFD_KCAN_MODE_LOM;
562+
else
563+
mode &= ~KVASER_PCIEFD_KCAN_MODE_LOM;
557564

558565
mode |= KVASER_PCIEFD_KCAN_MODE_EEN;
559566
mode |= KVASER_PCIEFD_KCAN_MODE_EPEN;
@@ -572,7 +579,7 @@ static void kvaser_pciefd_start_controller_flush(struct kvaser_pciefd_can *can)
572579

573580
spin_lock_irqsave(&can->lock, irq);
574581
iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
575-
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD | KVASER_PCIEFD_KCAN_IRQ_TFD,
582+
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
576583
can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
577584

578585
status = ioread32(can->reg_base + KVASER_PCIEFD_KCAN_STAT_REG);
@@ -615,7 +622,7 @@ static int kvaser_pciefd_bus_on(struct kvaser_pciefd_can *can)
615622
iowrite32(0, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
616623
iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
617624

618-
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD | KVASER_PCIEFD_KCAN_IRQ_TFD,
625+
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
619626
can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
620627

621628
mode = ioread32(can->reg_base + KVASER_PCIEFD_KCAN_MODE_REG);
@@ -719,6 +726,7 @@ static int kvaser_pciefd_stop(struct net_device *netdev)
719726
iowrite32(0, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
720727
del_timer(&can->bec_poll_timer);
721728
}
729+
can->can.state = CAN_STATE_STOPPED;
722730
close_candev(netdev);
723731

724732
return ret;
@@ -1007,8 +1015,7 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie)
10071015
SET_NETDEV_DEV(netdev, &pcie->pci->dev);
10081016

10091017
iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
1010-
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD |
1011-
KVASER_PCIEFD_KCAN_IRQ_TFD,
1018+
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
10121019
can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
10131020

10141021
pcie->can[i] = can;
@@ -1058,6 +1065,7 @@ static int kvaser_pciefd_setup_dma(struct kvaser_pciefd *pcie)
10581065
{
10591066
int i;
10601067
u32 srb_status;
1068+
u32 srb_packet_count;
10611069
dma_addr_t dma_addr[KVASER_PCIEFD_DMA_COUNT];
10621070

10631071
/* Disable the DMA */
@@ -1085,6 +1093,15 @@ static int kvaser_pciefd_setup_dma(struct kvaser_pciefd *pcie)
10851093
KVASER_PCIEFD_SRB_CMD_RDB1,
10861094
pcie->reg_base + KVASER_PCIEFD_SRB_CMD_REG);
10871095

1096+
/* Empty Rx FIFO */
1097+
srb_packet_count = ioread32(pcie->reg_base + KVASER_PCIEFD_SRB_RX_NR_PACKETS_REG) &
1098+
KVASER_PCIEFD_SRB_RX_NR_PACKETS_MASK;
1099+
while (srb_packet_count) {
1100+
/* Drop current packet in FIFO */
1101+
ioread32(pcie->reg_base + KVASER_PCIEFD_SRB_FIFO_LAST_REG);
1102+
srb_packet_count--;
1103+
}
1104+
10881105
srb_status = ioread32(pcie->reg_base + KVASER_PCIEFD_SRB_STAT_REG);
10891106
if (!(srb_status & KVASER_PCIEFD_SRB_STAT_DI)) {
10901107
dev_err(&pcie->pci->dev, "DMA not idle before enabling\n");
@@ -1425,9 +1442,6 @@ static int kvaser_pciefd_handle_status_packet(struct kvaser_pciefd *pcie,
14251442
cmd = KVASER_PCIEFD_KCAN_CMD_AT;
14261443
cmd |= ++can->cmd_seq << KVASER_PCIEFD_KCAN_CMD_SEQ_SHIFT;
14271444
iowrite32(cmd, can->reg_base + KVASER_PCIEFD_KCAN_CMD_REG);
1428-
1429-
iowrite32(KVASER_PCIEFD_KCAN_IRQ_TFD,
1430-
can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
14311445
} else if (p->header[0] & KVASER_PCIEFD_SPACK_IDET &&
14321446
p->header[0] & KVASER_PCIEFD_SPACK_IRM &&
14331447
cmdseq == (p->header[1] & KVASER_PCIEFD_PACKET_SEQ_MSK) &&
@@ -1714,15 +1728,6 @@ static int kvaser_pciefd_transmit_irq(struct kvaser_pciefd_can *can)
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 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
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,18 +1854,15 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
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;
18551860

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:

0 commit comments

Comments
 (0)