On 10 March 2018 at 23:04, Guenter Roeck <li...@roeck-us.net> wrote: > The sabrelite machine model used by qemu-system-arm is based on the > Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet > controller which is supported in QEMU using the imx_fec.c module > (actually called imx.enet for this model.) > > The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the > imx.enet device like this: > > #define FSL_IMX6_ENET_MAC_1588_IRQ 118 > #define FSL_IMX6_ENET_MAC_IRQ 119 > > According to https://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf, > page 225, in Table 3-1. ARM Cortex A9 domain interrupt summary, > interrupts are as follows. > > 150 ENET MAC 0 IRQ > 151 ENET MAC 0 1588 Timer interrupt > > where > > 150 - 32 == 118 > 151 - 32 == 119 > > In other words, the vector definitions in the fsl-imx6.h file are reversed. > > Fixing the interrupts alone causes problems with older Linux kernels: > The Ethernet interface will fail to probe with Linux v4.9 and earlier. > Linux v4.1 and earlier will crash due to a bug in Ethernet driver probe > error handling. This is a Linux kernel problem, not a qemu problem: > the Linux kernel only worked by accident since it requested both interrupts. > > For backward compatibility, generate the Ethernet interrupt on both interrupt > lines. This was shown to work from all Linux kernel releases starting with > v3.16. > > Link: https://bugs.launchpad.net/qemu/+bug/1753309 > Signed-off-by: Guenter Roeck <li...@roeck-us.net>
Applied to target-arm.next for 2.12. Thanks to everybody who helped in identifying what the behaviour here was and coming up with this useful workaround to avoid breaking previously-working guests. -- PMM