linux-next/drivers/net
Matthias Schiffer 743375f8de can: m_can: fix missed interrupts with m_can_pci
The interrupt line of PCI devices is interpreted as edge-triggered,
however the interrupt signal of the m_can controller integrated in Intel
Elkhart Lake CPUs appears to be generated level-triggered.

Consider the following sequence of events:

- IR register is read, interrupt X is set
- A new interrupt Y is triggered in the m_can controller
- IR register is written to acknowledge interrupt X. Y remains set in IR

As at no point in this sequence no interrupt flag is set in IR, the
m_can interrupt line will never become deasserted, and no edge will ever
be observed to trigger another run of the ISR. This was observed to
result in the TX queue of the EHL m_can to get stuck under high load,
because frames were queued to the hardware in m_can_start_xmit(), but
m_can_finish_tx() was never run to account for their successful
transmission.

On an Elkhart Lake based board with the two CAN interfaces connected to
each other, the following script can reproduce the issue:

    ip link set can0 up type can bitrate 1000000
    ip link set can1 up type can bitrate 1000000

    cangen can0 -g 2 -I 000 -L 8 &
    cangen can0 -g 2 -I 001 -L 8 &
    cangen can0 -g 2 -I 002 -L 8 &
    cangen can0 -g 2 -I 003 -L 8 &
    cangen can0 -g 2 -I 004 -L 8 &
    cangen can0 -g 2 -I 005 -L 8 &
    cangen can0 -g 2 -I 006 -L 8 &
    cangen can0 -g 2 -I 007 -L 8 &

    cangen can1 -g 2 -I 100 -L 8 &
    cangen can1 -g 2 -I 101 -L 8 &
    cangen can1 -g 2 -I 102 -L 8 &
    cangen can1 -g 2 -I 103 -L 8 &
    cangen can1 -g 2 -I 104 -L 8 &
    cangen can1 -g 2 -I 105 -L 8 &
    cangen can1 -g 2 -I 106 -L 8 &
    cangen can1 -g 2 -I 107 -L 8 &

    stress-ng --matrix 0 &

To fix the issue, repeatedly read and acknowledge interrupts at the
start of the ISR until no interrupt flags are set, so the next incoming
interrupt will also result in an edge on the interrupt line.

While we have received a report that even with this patch, the TX queue
can become stuck under certain (currently unknown) circumstances on the
Elkhart Lake, this patch completely fixes the issue with the above
reproducer, and it is unclear whether the remaining issue has a similar
cause at all.

Fixes: cab7ffc032 ("can: m_can: add PCI glue driver for Intel Elkhart Lake")
Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
Reviewed-by: Markus Schneider-Pargmann <msp@baylibre.com>
Link: https://patch.msgid.link/fdf0439c51bcb3a46c21e9fb21c7f1d06363be84.1728288535.git.matthias.schiffer@ew.tq-group.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
2024-12-18 09:30:52 +01:00
..
arcnet
bonding bonding: Fix feature propagation of NETIF_F_GSO_ENCAP_ALL 2024-12-12 11:59:18 +01:00
caif
can can: m_can: fix missed interrupts with m_can_pci 2024-12-18 09:30:52 +01:00
dsa net: dsa: microchip: KSZ9896 register regmap alignment to 32 bit boundaries 2024-12-12 07:10:11 -08:00
ethernet qed: fix possible uninit pointer read in qed_mcp_nvm_info_populate() 2024-12-17 15:08:52 +01:00
fddi
fjes net: fjes: use ethtool string helpers 2024-10-31 19:36:59 -07:00
hamradio net: hamradio: scc: Switch to irq_get_nr_irqs() 2024-10-16 21:56:57 +02:00
hippi
hyperv Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-10-25 09:08:22 +02:00
ieee802154 net: Switch back to struct platform_driver::remove() 2024-10-04 16:39:57 -07:00
ipa net: Switch back to struct platform_driver::remove() 2024-10-04 16:39:57 -07:00
ipvlan ipvlan: Prepare ipvlan_process_v4_outbound() to future .flowi4_tos conversion. 2024-11-03 14:28:37 -08:00
mctp net: mctp: Expose transport binding identifier via IFLA attribute 2024-11-09 09:04:54 -08:00
mdio net: mdio-ipq4019: add missing error check 2024-11-26 11:01:39 +01:00
netdevsim net: netdevsim: fix nsim_pp_hold_write() 2024-12-17 17:46:17 -08:00
pcs net: pcs: xpcs: remove return statements in void function 2024-10-23 16:10:16 +02:00
phy net: phy: microchip: Reset LAN88xx PHY to ensure clean link state on LAN7800/7850 2024-12-02 18:56:41 -08:00
plip net: plip: fix break; causing plip to never transmit 2024-10-19 16:06:55 -05:00
ppp ppp: fix ppp_async_encode() illegal access 2024-10-10 08:47:13 -07:00
pse-pd net: pse-pd: Fix out of bound for loop 2024-10-19 15:55:56 -05:00
slip slip: make slhc_remember() more robust against malicious packets 2024-10-10 09:06:32 -07:00
team team: Fix feature exposure when no ports are present 2024-12-16 18:23:12 -08:00
thunderbolt
usb net: usb: qmi_wwan: add Telit FE910C04 compositions 2024-12-11 20:21:42 -08:00
vmxnet3 Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2024-10-21 09:14:18 +02:00
vxlan ndo_fdb_del: Add a parameter to report whether notification was sent 2024-11-15 16:39:18 -08:00
wan net: Switch back to struct platform_driver::remove() 2024-10-04 16:39:57 -07:00
wireguard wireguard: device: support big tcp GSO 2024-11-18 19:32:27 -08:00
wireless A small set of fixes: 2024-12-10 18:44:25 -08:00
wwan net: wwan: t7xx: Change PM_AUTOSUSPEND_MS to 5000 2024-11-18 18:38:20 -08:00
xen-netback
amt.c net: convert to nla_get_*_default() 2024-11-11 10:32:06 -08:00
bareudp.c bareudp: Use pcpu stats to update rx_dropped counter. 2024-10-28 11:16:32 +00:00
dummy.c rtnetlink: Remove __rtnl_link_register() 2024-11-11 17:26:51 -08:00
eql.c
geneve.c geneve: do not assume mac header is set in geneve_xmit_skb() 2024-12-04 19:21:47 -08:00
gtp.c net: convert to nla_get_*_default() 2024-11-11 10:32:06 -08:00
ifb.c rtnetlink: Remove __rtnl_link_register() 2024-11-11 17:26:51 -08:00
Kconfig testing: net-drv: add basic shaper test 2024-10-10 08:30:23 -07:00
LICENSE.SRC
loopback.c
macsec.c macsec: inherit lower device's TSO limits when offloading 2024-11-11 14:12:21 -08:00
macvlan.c ndo_fdb_del: Add a parameter to report whether notification was sent 2024-11-15 16:39:18 -08:00
macvtap.c
Makefile
mdio.c mdio: Remove mdio45_ethtool_gset_npage() 2024-11-14 19:08:55 -08:00
mhi_net.c
mii.c
net_failover.c
netconsole.c net: netconsole: split send_msg_fragmented 2024-10-22 15:44:25 +02:00
netkit.c rtnetlink: fix double call of rtnl_link_get_net_ifla() 2024-12-03 11:29:29 +01:00
nlmon.c
ntb_netdev.c
pfcp.c
rionet.c
sb1000.c
Space.c
sungem_phy.c
tap.c [tree-wide] finally take no_llseek out 2024-09-27 08:18:43 -07:00
tun.c net: tun: fix tun_napi_alloc_frags() 2024-12-13 19:33:45 -08:00
veth.c rtnetlink: fix double call of rtnl_link_get_net_ifla() 2024-12-03 11:29:29 +01:00
virtio_net.c virtio_net: ensure netdev_tx_reset_queue is called on bind xsk for tx 2024-12-10 11:22:21 +01:00
vrf.c vrf: Prepare vrf_process_v4_outbound() to future .flowi4_tos conversion. 2024-11-03 14:29:05 -08:00
vsockmon.c
xen-netfront.c