Skip to content

Commit 262d7a5

Browse files
Jimmy Assarssonmarckleinebudde
authored andcommitted
can: kvaser_pciefd: Do not send EFLUSH command on TFD interrupt
Under certain circumstances we send two EFLUSH commands, resulting in two EFLUSH ack packets, while only expecting a single EFLUSH ack. This can cause the driver Tx flush completion to get out of sync. To avoid this problem, don't enable the "Transmit buffer flush done" (TFD) interrupt and remove the code handling it. Now we only send EFLUSH command after receiving status packet with "Init detected" (IDET) bit set. Fixes: 26ad340 ("can: kvaser_pciefd: Add driver for Kvaser PCIEcan devices") Cc: [email protected] Signed-off-by: Jimmy Assarsson <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent c589557 commit 262d7a5

File tree

1 file changed

+4
-17
lines changed

1 file changed

+4
-17
lines changed

drivers/net/can/kvaser_pciefd.c

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ static int kvaser_pciefd_set_tx_irq(struct kvaser_pciefd_can *can)
531531
KVASER_PCIEFD_KCAN_IRQ_TOF | KVASER_PCIEFD_KCAN_IRQ_ABD |
532532
KVASER_PCIEFD_KCAN_IRQ_TAE | KVASER_PCIEFD_KCAN_IRQ_TAL |
533533
KVASER_PCIEFD_KCAN_IRQ_FDIC | KVASER_PCIEFD_KCAN_IRQ_BPP |
534-
KVASER_PCIEFD_KCAN_IRQ_TAR | KVASER_PCIEFD_KCAN_IRQ_TFD;
534+
KVASER_PCIEFD_KCAN_IRQ_TAR;
535535

536536
iowrite32(msk, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
537537

@@ -579,7 +579,7 @@ static void kvaser_pciefd_start_controller_flush(struct kvaser_pciefd_can *can)
579579

580580
spin_lock_irqsave(&can->lock, irq);
581581
iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
582-
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD | KVASER_PCIEFD_KCAN_IRQ_TFD,
582+
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
583583
can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
584584

585585
status = ioread32(can->reg_base + KVASER_PCIEFD_KCAN_STAT_REG);
@@ -622,7 +622,7 @@ static int kvaser_pciefd_bus_on(struct kvaser_pciefd_can *can)
622622
iowrite32(0, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
623623
iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
624624

625-
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD | KVASER_PCIEFD_KCAN_IRQ_TFD,
625+
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
626626
can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
627627

628628
mode = ioread32(can->reg_base + KVASER_PCIEFD_KCAN_MODE_REG);
@@ -1015,8 +1015,7 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie)
10151015
SET_NETDEV_DEV(netdev, &pcie->pci->dev);
10161016

10171017
iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
1018-
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD |
1019-
KVASER_PCIEFD_KCAN_IRQ_TFD,
1018+
iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
10201019
can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
10211020

10221021
pcie->can[i] = can;
@@ -1443,9 +1442,6 @@ static int kvaser_pciefd_handle_status_packet(struct kvaser_pciefd *pcie,
14431442
cmd = KVASER_PCIEFD_KCAN_CMD_AT;
14441443
cmd |= ++can->cmd_seq << KVASER_PCIEFD_KCAN_CMD_SEQ_SHIFT;
14451444
iowrite32(cmd, can->reg_base + KVASER_PCIEFD_KCAN_CMD_REG);
1446-
1447-
iowrite32(KVASER_PCIEFD_KCAN_IRQ_TFD,
1448-
can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
14491445
} else if (p->header[0] & KVASER_PCIEFD_SPACK_IDET &&
14501446
p->header[0] & KVASER_PCIEFD_SPACK_IRM &&
14511447
cmdseq == (p->header[1] & KVASER_PCIEFD_PACKET_SEQ_MSK) &&
@@ -1732,15 +1728,6 @@ static int kvaser_pciefd_transmit_irq(struct kvaser_pciefd_can *can)
17321728
if (irq & KVASER_PCIEFD_KCAN_IRQ_TOF)
17331729
netdev_err(can->can.dev, "Tx FIFO overflow\n");
17341730

1735-
if (irq & KVASER_PCIEFD_KCAN_IRQ_TFD) {
1736-
u8 count = ioread32(can->reg_base +
1737-
KVASER_PCIEFD_KCAN_TX_NPACKETS_REG) & 0xff;
1738-
1739-
if (count == 0)
1740-
iowrite32(KVASER_PCIEFD_KCAN_CTRL_EFLUSH,
1741-
can->reg_base + KVASER_PCIEFD_KCAN_CTRL_REG);
1742-
}
1743-
17441731
if (irq & KVASER_PCIEFD_KCAN_IRQ_BPP)
17451732
netdev_err(can->can.dev,
17461733
"Fail to change bittiming, when not in reset mode\n");

0 commit comments

Comments
 (0)