linux/drivers/net/dsa
John David Anglin 7c0db24cc4 dsa: mv88e6xxx: Ensure all pending interrupts are handled prior to exit
The GPIO interrupt controller on the espressobin board only supports edge interrupts.
If one enables the use of hardware interrupts in the device tree for the 88E6341, it is
possible to miss an edge.  When this happens, the INTn pin on the Marvell switch is
stuck low and no further interrupts occur.

I found after adding debug statements to mv88e6xxx_g1_irq_thread_work() that there is
a race in handling device interrupts (e.g. PHY link interrupts).  Some interrupts are
directly cleared by reading the Global 1 status register.  However, the device interrupt
flag, for example, is not cleared until all the unmasked SERDES and PHY ports are serviced.
This is done by reading the relevant SERDES and PHY status register.

The code only services interrupts whose status bit is set at the time of reading its status
register.  If an interrupt event occurs after its status is read and before all interrupts
are serviced, then this event will not be serviced and the INTn output pin will remain low.

This is not a problem with polling or level interrupts since the handler will be called
again to process the event.  However, it's a big problem when using level interrupts.

The fix presented here is to add a loop around the code servicing switch interrupts.  If
any pending interrupts remain after the current set has been handled, we loop and process
the new set.  If there are no pending interrupts after servicing, we are sure that INTn has
gone high and we will get an edge when a new event occurs.

Tested on espressobin board.

Fixes: dc30c35be7 ("net: dsa: mv88e6xxx: Implement interrupt support.")
Signed-off-by:  John David Anglin <dave.anglin@bell.net>
Tested-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
2019-02-13 20:46:38 -08:00
..
b53 net: dsa: b53: Fix for failure when irq is not defined in dt 2019-02-07 18:18:37 -08:00
microchip net: dsa: microchip: Drop unused GPIO includes 2019-01-04 12:58:25 -08:00
mv88e6xxx dsa: mv88e6xxx: Ensure all pending interrupts are handled prior to exit 2019-02-13 20:46:38 -08:00
bcm_sf2_cfp.c net: dsa: bcm_sf2: fix semicolon.cocci warnings 2018-11-07 22:14:05 -08:00
bcm_sf2_regs.h net: dsa: bcm_sf2: Disable learning while in WoL 2018-08-03 12:11:43 -07:00
bcm_sf2.c net: dsa: bcm_sf2: Propagate error value from mdio_write 2018-12-27 16:22:13 -08:00
bcm_sf2.h net: dsa: bcm_sf2: Restore CFP rules during system resume 2018-11-06 15:05:22 -08:00
dsa_loop_bdinfo.c net: dsa: Mock-up driver 2017-04-01 12:39:32 -07:00
dsa_loop.c net: dsa: dsa_loop: Make dynamic debugging helpful 2018-05-25 16:46:29 -04:00
dsa_loop.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
Kconfig net: dsa: lantiq_gswip: Depend on HAS_IOMEM 2018-09-25 20:27:43 -07:00
lan9303_i2c.c net: dsa: lan9303: Adjust indenting 2017-11-08 13:29:06 +09:00
lan9303_mdio.c net: dsa: lan9303: Adjust indenting 2017-11-08 13:29:06 +09:00
lan9303-core.c net: dsa: Pass stringset to ethtool operations 2018-04-27 11:53:03 -04:00
lan9303.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-04 09:26:51 +09:00
lantiq_gswip.c net: dsa: lantiq_gswip: Minor code style improvements 2018-09-17 08:12:11 -07:00
lantiq_pce.h net: dsa: Add Lantiq / Intel DSA driver for vrx200 2018-09-13 08:14:33 -07:00
Makefile net: dsa: Add Lantiq / Intel DSA driver for vrx200 2018-09-13 08:14:33 -07:00
mt7530.c net: dsa: mt7530: Drop unused GPIO include 2019-01-04 13:07:23 -08:00
mt7530.h net: dsa: mediatek: add VLAN support for MT7530 2017-12-15 10:31:54 -05:00
mv88e6060.c mv88e6060: disable hardware level MAC learning 2018-12-03 16:04:21 -08:00
mv88e6060.h
qca8k.c net: dsa: qca8k: simplify getting .driver_data 2018-10-21 21:10:11 -07:00
qca8k.h net: dsa: qca8k: Allow overwriting CPU port setting 2018-05-23 15:46:18 -04:00
realtek-smi.c net: dsa: realtek-smi: fix OF child-node lookup 2019-01-17 14:04:49 -08:00
realtek-smi.h net: dsa: realtek-smi: Add Realtek SMI driver 2018-07-18 13:43:38 +09:00
rtl8366.c dsa: rtl8366: Remove unused variable. 2018-07-18 14:42:18 +09:00
rtl8366rb.c net: dsa: rtl8366rb: Support port 4 (WAN) 2018-08-09 14:15:00 -07:00
vitesse-vsc73xx.c net: dsa: vsc73xx: Make some functions static 2018-07-05 19:29:29 +09:00