qemu/hw/net
yuchenlin 157628d067 e1000: Delay flush queue when receive RCTL
Due to too early RCT0 interrput, win10x32 may hang on booting.
This problem can be reproduced by doing power cycle on win10x32 guest.
In our environment, we have 10 win10x32 and stress power cycle.
The problem will happen about 20 rounds.

Below shows some log with comment:

The normal case:

22831@1551928392.984687:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
22831@1551928392.985655:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
22831@1551928392.985801:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: RCTL: 0, mac_reg[RCTL] = 0x0
22831@1551928393.056710:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: ICR read: 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: RCTL: 0, mac_reg[RCTL] = 0x0
22831@1551928393.077548:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: ICR read: 0
e1000: set_ics 2, ICR 0, IMR 0
e1000: set_ics 2, ICR 2, IMR 0
e1000: RCTL: 0, mac_reg[RCTL] = 0x0
22831@1551928393.102974:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
22831@1551928393.103267:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
e1000: RCTL: 255, mac_reg[RCTL] = 0x40002 <- win10x32 says it can handle
RX now
e1000: set_ics 0, ICR 2, IMR 9d <- unmask interrupt
e1000: RCTL: 255, mac_reg[RCTL] = 0x48002
e1000: set_ics 80, ICR 2, IMR 9d <- interrupt and work!
...

The bad case:

27744@1551930483.117766:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
27744@1551930483.118398:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: RCTL: 0, mac_reg[RCTL] = 0x0
27744@1551930483.198063:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: ICR read: 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: RCTL: 0, mac_reg[RCTL] = 0x0
27744@1551930483.218675:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
e1000: set_ics 0, ICR 0, IMR 0
e1000: ICR read: 0
e1000: set_ics 2, ICR 0, IMR 0
e1000: set_ics 2, ICR 2, IMR 0
e1000: RCTL: 0, mac_reg[RCTL] = 0x0
27744@1551930483.241768:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
27744@1551930483.241979:e1000x_rx_disabled Received packet dropped
because receive is disabled RCTL = 0
e1000: RCTL: 255, mac_reg[RCTL] = 0x40002 <- win10x32 says it can handle
RX now
e1000: set_ics 80, ICR 2, IMR 0 <- flush queue (caused by setting RCTL)
e1000: set_ics 0, ICR 82, IMR 9d <- unmask interrupt and because 0x82&0x9d
!= 0 generate interrupt, hang on here...

To workaround this problem, simply delay flush queue. Also stop receiving
when timer is going to run.

Tested on CentOS, Win7SP1x64 and Win10x32.

Signed-off-by: yuchenlin <yuchenlin@synology.com>
Reviewed-by: Dmitry Fleytman <dmitry.fleytman@gmail.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
2019-03-29 15:22:18 +08:00
..
can hw/net/can: Fix segfaults when using the devices without bus 2018-03-26 14:37:13 +02:00
fsl_etsec etsec: fix IRQ (un)masking 2018-07-16 11:18:09 +10:00
rocker avoid TABs in files that only contain a few 2019-01-11 15:46:56 +01:00
allwinner_emac.c qapi: Change Netdev into a flat union 2016-07-19 20:18:02 +02:00
cadence_gem.c net: cadence_gem: Remove incorrect assert() 2018-11-26 13:41:42 +00:00
dp8393x.c hw: Remove unused 'hw/devices.h' include 2019-03-07 22:16:11 +01:00
e1000_regs.h e1000: Rename the SEC symbol to SEQEC 2017-09-08 08:17:37 +08:00
e1000.c e1000: Delay flush queue when receive RCTL 2019-03-29 15:22:18 +08:00
e1000e_core.c e1000e: Prevent MSI/MSI-X storms 2018-07-20 08:30:48 +08:00
e1000e_core.h e1000e: Prevent MSI/MSI-X storms 2018-07-20 08:30:48 +08:00
e1000e.c hw/net: Use the IEC binary prefix definitions 2018-07-02 15:41:16 +02:00
e1000x_common.c hw/net: Use the IEC binary prefix definitions 2018-07-02 15:41:16 +02:00
e1000x_common.h e1000, e1000e: Move per-packet TX offload flags out of context state 2017-12-22 09:53:23 +08:00
eepro100.c hw/net: Use the IEC binary prefix definitions 2018-07-02 15:41:16 +02:00
etraxfs_eth.c net: etraxfs_eth: add a reset method 2018-10-24 06:44:59 -03:00
ftgmac100.c ftgmac100: implement the new MDIO interface on Aspeed SoC 2019-01-21 10:23:11 +00:00
imx_fec.c fsl-imx6: Swap Ethernet interrupt defines 2018-03-19 18:23:24 +00:00
Kconfig kconfig: add dependencies on CONFIG_MSI_NONBROKEN 2019-03-18 09:39:57 +01:00
lan9118.c net: lan9118: convert SysBus init method to a realize method 2018-10-24 06:44:59 -03:00
lance.c net: lance: convert SysBus init method to a realize method 2018-10-24 06:44:59 -03:00
Makefile.objs vhost-net: compile it on all targets that have virtio-net. 2019-02-21 12:28:01 -05:00
mcf_fec.c hw: Do not include "exec/address-spaces.h" if it is not necessary 2018-06-01 14:15:10 +02:00
milkymist-minimac2.c QEMU trivial patches collected between June and October 2018 2018-10-30 15:49:55 +00:00
mipsnet.c avoid TABs in files that only contain a few 2019-01-11 15:46:56 +01:00
ne2000-isa.c hw: Do not include "exec/address-spaces.h" if it is not necessary 2018-06-01 14:15:10 +02:00
ne2000.c avoid TABs in files that only contain a few 2019-01-11 15:46:56 +01:00
ne2000.h hw/net: Use the IEC binary prefix definitions 2018-07-02 15:41:16 +02:00
net_rx_pkt.c net: Transmit zero UDP checksum as 0xFFFF 2017-11-20 11:08:00 +08:00
net_rx_pkt.h net_pkt: Extend packet abstraction as required by e1000e functionality 2016-06-02 10:42:28 +08:00
net_tx_pkt.c net: fix misaligned member access 2018-03-02 18:44:00 +00:00
net_tx_pkt.h clean-includes: run it once more 2016-06-16 18:39:03 +02:00
opencores_eth.c net: opencores_eth: convert SysBus init method to a realize method 2018-10-24 06:44:59 -03:00
pcnet-pci.c hw/net/pcnet-pci: Unify pcnet_ioport_read/write and pcnet_mmio_read/write 2018-09-25 15:13:24 +01:00
pcnet.c pcnet: fix possible buffer overflow 2018-10-19 11:15:04 +08:00
pcnet.h Clean up decorations and whitespace around header guards 2016-07-12 16:20:46 +02:00
rtl8139.c rtl8139: fix possible out of bound access 2018-10-19 11:15:04 +08:00
smc91c111.c net: smc91c111: convert SysBus init method to a realize method 2018-10-24 06:44:59 -03:00
spapr_llan.c spapr: Use CamelCase properly 2019-03-12 14:33:05 +11:00
stellaris_enet.c net: stellaris_enet: add a reset method 2018-10-24 06:44:59 -03:00
sungem.c sungem: fix multicast filter CRC calculation 2017-12-22 10:00:47 +08:00
sunhme.c sunhme: switch sunhme over to use net_crc32_le() 2017-12-22 10:00:47 +08:00
trace-events trace-events: Fix attribution of trace points to source 2019-03-22 16:18:07 +00:00
vhost_net-stub.c vhost-net: move stubs to a separate file 2019-02-21 12:28:01 -05:00
vhost_net.c vhost-net: compile it on all targets that have virtio-net. 2019-02-21 12:28:01 -05:00
virtio-net.c virtio-net: Allow qemu_announce_self to trigger virtio announcements 2019-03-05 11:27:41 +08:00
vmware_utils.h hw/net/vmxnet3: Fix code to work on big endian hosts, too 2017-11-20 11:08:00 +08:00
vmxnet3_defs.h vmxnet3: Move some definitions to header file 2018-12-22 11:09:56 +02:00
vmxnet3.c avoid TABs in files that only contain a few 2019-01-11 15:46:56 +01:00
vmxnet3.h hw/net/vmxnet3: Fix code to work on big endian hosts, too 2017-11-20 11:08:00 +08:00
vmxnet_debug.h Clean up ill-advised or unusual header guards 2016-07-12 16:20:46 +02:00
xen_nic.c xen: re-name XenDevice to XenLegacyDevice... 2019-01-14 13:45:40 +00:00
xgmac.c net: xgmac: convert SysBus init method to a realize method 2018-10-24 06:44:59 -03:00
xilinx_axienet.c object: fix OBJ_PROP_LINK_UNREF_ON_RELEASE ambivalence 2018-06-12 12:07:30 +02:00
xilinx_ethlite.c hw/net: Fix a heap overflow in xlnx.xps-ethernetlite 2016-08-09 15:27:18 +08:00