qemu/include/hw
Guenter Roeck ea84a44250 scsi: esp: Defer command completion until previous interrupts have been handled
The guest OS reads RSTAT, RSEQ, and RINTR, and expects those registers
to reflect a consistent state. However, it is possible that the registers
can change after RSTAT was read, but before RINTR is read, when
esp_command_complete() is called.

Guest OS		qemu
--------		----
[handle interrupt]
Read RSTAT
			esp_command_complete()
			 RSTAT = STAT_ST
			 esp_dma_done()
			  RSTAT |= STAT_TC
			  RSEQ = 0
			  RINTR = INTR_BS

Read RSEQ
Read RINTR		RINTR = 0
			RSTAT &= ~STAT_TC
			RSEQ = SEQ_CD

The guest OS would then try to handle INTR_BS combined with an old
value of RSTAT. This sometimes resulted in lost events, spurious
interrupts, guest OS confusion, and stalled SCSI operations.
A typical guest error log (observed with various versions of Linux)
looks as follows.

scsi host1: Spurious irq, sreg=13.
...
scsi host1: Aborting command [84531f10:2a]
scsi host1: Current command [f882eea8:35]
scsi host1: Queued command [84531f10:2a]
scsi host1:  Active command [f882eea8:35]
scsi host1: Dumping command log
scsi host1: ent[15] CMD val[44] sreg[90] seqreg[00] sreg2[00] ireg[20] ss[00] event[0c]
scsi host1: ent[16] CMD val[01] sreg[90] seqreg[00] sreg2[00] ireg[20] ss[02] event[0c]
scsi host1: ent[17] CMD val[43] sreg[90] seqreg[00] sreg2[00] ireg[20] ss[02] event[0c]
scsi host1: ent[18] EVENT val[0d] sreg[92] seqreg[04] sreg2[00] ireg[18] ss[00] event[0c]
...

Defer handling command completion until previous interrupts have been
handled to fix the problem.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
2019-01-11 13:57:24 +01:00
..
acpi pci/pcihp: perform unplug via the hotplug handler 2018-12-20 11:19:12 -05:00
adc STM32F2xx: Add the ADC device 2016-10-04 13:28:07 +01:00
arm arm: Add Clock peripheral stub to NRF51 SOC 2019-01-07 15:23:47 +00:00
audio audio: use TYPE_MV88W8618_AUDIO instead of hardcoded string 2018-10-29 13:50:15 +01:00
block block: Remove deprecated -drive option serial 2018-08-15 12:50:39 +02:00
char arm: Add header to host common definition for nRF51 SOC peripherals 2019-01-07 15:23:47 +00:00
core hw/core/split-irq: Device that splits IRQ lines 2018-03-02 11:03:45 +00:00
cpu hw/cpu: introduce CPU clusters 2019-01-07 15:23:45 +00:00
cris char: rename CharDriverState Chardev 2017-01-27 18:07:59 +01:00
display edid: fix vendor default 2018-10-05 11:26:56 +02:00
dma hw/dma/pl080: Don't use CPU address space for DMA accesses 2018-08-20 11:24:33 +01:00
firmware hw/smbios: Move to the hw/firmware/ subdirectory 2018-12-19 16:48:16 -05:00
gpio hw/gpio/nrf51_gpio: Add nRF51 GPIO peripheral 2019-01-07 15:23:47 +00:00
hyperv hyperv: process POST_MESSAGE hypercall 2018-10-19 13:44:14 +02:00
i2c i2c: Move typedef of bitbang_i2c_interface to i2c.h 2018-12-12 10:01:13 +01:00
i386 ioapic: use TYPE_FOO MACRO than constant string 2019-01-09 11:33:47 +01:00
ide ide: introduce ide_transfer_start_norecurse 2018-06-08 13:36:31 -04:00
input adb: add property to disable direct reg 3 writes 2018-06-16 16:32:33 +10:00
intc qom: make interface types abstract 2018-12-11 15:45:22 -02:00
ipack ipack: Update e-mail address 2016-05-18 15:04:27 +03:00
ipmi qom: make interface types abstract 2018-12-11 15:45:22 -02:00
isa qom: make interface types abstract 2018-12-11 15:45:22 -02:00
kvm
lm32 intc: make HMP 'info irq' and 'info pic' commands use InterruptStatsProvider interface 2016-10-04 10:00:25 +02:00
m68k hw/char/mcf_uart: QOMify the ColdFire UART 2017-02-16 14:06:56 +01:00
mem qom: make interface types abstract 2018-12-11 15:45:22 -02:00
mips hw/mips: Use the IEC binary prefix definitions 2018-07-02 15:41:16 +02:00
misc hw/misc/nrf51_rng: Add NRF51 random number generator peripheral 2019-01-07 15:23:47 +00:00
net net: cadence_gem: Add support for selecting the DMA MemoryRegion 2018-10-16 17:13:49 +01:00
nvram fw_cfg: import & use linux/qemu_fw_cfg.h 2018-08-23 18:46:25 +02:00
pci pci: allow cleanup/unregistration of PCI root buses 2019-01-09 09:28:14 +11:00
pci-bridge Clean up includes 2018-02-09 05:05:11 +01:00
pci-host spapr_pci: Define SPAPR_MAX_PHBS in hw/pci-host/spapr.h 2019-01-09 09:28:14 +11:00
ppc spapr: enable XIVE MMIOs at reset 2019-01-09 09:28:14 +11:00
riscv sifive_uart: Implement interrupt pending register 2018-12-20 12:08:43 -08:00
s390x hw/s390x: Fix bad mask in time2tod() 2018-12-20 17:07:24 +01:00
scsi scsi: esp: Defer command completion until previous interrupts have been handled 2019-01-11 13:57:24 +01:00
sd sdcard: Reflect when the Spec v3 is supported in the Config Register (SCR) 2018-06-08 13:15:34 +01:00
sh4 hw: Do not include "exec/address-spaces.h" if it is not necessary 2018-06-01 14:15:10 +02:00
sparc sun4u_iommu: update to reflect IOMMU is no longer part of the APB device 2018-01-09 21:48:20 +00:00
ssi hw/ssi/pl022: Allow use as embedded-struct device 2018-08-24 13:17:44 +01:00
timer hw/timer/nrf51_timer: Add nRF51 Timer peripheral 2019-01-07 15:23:47 +00:00
tricore Clean up header guards that don't match their file name 2016-07-12 16:19:16 +02:00
unicore32 hw/unicore32: restrict hw addr defines to source file 2017-12-18 17:07:02 +03:00
usb usb: Add basic code to emulate Chipidea USB IP 2018-02-09 10:40:30 +00:00
vfio vfio: Clean up error reporting after previous commit 2018-10-19 14:51:34 +02:00
virtio virtio-gpu: pass down VirtIOGPU pointer to a bunch of functions 2018-09-03 08:31:50 +02:00
watchdog hw/watchdog/cmsdk_apb_watchdog: Implement CMSDK APB watchdog module 2018-08-20 11:24:33 +01:00
xen compiler: add a sizeof_field() macro 2018-06-27 13:01:40 +01:00
xtensa Clean up includes 2018-02-09 05:05:11 +01:00
boards.h compat: replace PC_COMPAT_2_1 & HW_COMPAT_2_1 macros 2019-01-07 16:18:42 +04:00
bt.h char: rename CharDriverState Chardev 2017-01-27 18:07:59 +01:00
devices.h hw: Clean "hw/devices.h" includes 2018-06-01 14:15:10 +02:00
elf_ops.h elf_ops.h: Use address_space_write() to write memory 2018-12-14 13:30:49 +00:00
empty_slot.h Clean up decorations and whitespace around header guards 2016-07-12 16:20:46 +02:00
fw-path-provider.h qom: make interface types abstract 2018-12-11 15:45:22 -02:00
hotplug.h qom: make interface types abstract 2018-12-11 15:45:22 -02:00
hw.h migration: Split qemu-file.h 2017-06-01 18:49:22 +02:00
ide.h xen-platform: add missing disk unplug option 2017-01-27 15:23:29 -08:00
irq.h hw/core/split-irq: Device that splits IRQ lines 2018-03-02 11:03:45 +00:00
loader-fit.h Use #include "..." for our own headers, <...> for others 2018-02-09 05:05:11 +01:00
loader.h Support u-boot noload images for arm as used by, NetBSD/evbarm GENERIC kernel. 2019-01-07 15:46:20 +00:00
nmi.h qom: make interface types abstract 2018-12-11 15:45:22 -02:00
or-irq.h hw/core/or-irq: Support more than 16 inputs to an OR gate 2018-06-15 15:23:34 +01:00
pcmcia.h Clean up decorations and whitespace around header guards 2016-07-12 16:20:46 +02:00
platform-bus.h platform-bus-device: use device plug callback instead of machine_done notifier 2018-05-10 18:10:56 +01:00
ptimer.h ptimer: Add TRIGGER_ONLY_ON_DECREMENT policy option 2018-07-09 14:51:34 +01:00
qdev-core.h qdev-props: remove errp from GlobalProperty 2019-01-07 16:18:42 +04:00
qdev-dma.h
qdev-properties.h qapi: Define PCIe link speed and width properties 2018-12-19 16:48:16 -05:00
qdev.h
register.h hw: register: Run post_write hook on reset 2018-03-01 11:05:43 +00:00
registerfields.h Use #include "..." for our own headers, <...> for others 2018-02-09 05:05:11 +01:00
stream.h qom: make interface types abstract 2018-12-11 15:45:22 -02:00
sysbus.h core/sysbus: remove the SysBusDeviceClass::init path 2018-12-13 13:48:03 +00:00
usb.h usb: move ehci_create_ich9_with_companions to hw/i386 2019-01-08 12:43:41 +01:00