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
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
cpu hw/cpu: introduce CPU clusters 2019-01-07 15:23:45 +00:00
cris
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
input
intc qom: make interface types abstract 2018-12-11 15:45:22 -02:00
ipack
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
m68k
mem qom: make interface types abstract 2018-12-11 15:45:22 -02:00
mips
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
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
sh4
sparc
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
unicore32
usb
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
xtensa
boards.h compat: replace PC_COMPAT_2_1 & HW_COMPAT_2_1 macros 2019-01-07 16:18:42 +04:00
bt.h
devices.h
elf_ops.h elf_ops.h: Use address_space_write() to write memory 2018-12-14 13:30:49 +00:00
empty_slot.h
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
ide.h
irq.h
loader-fit.h
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
pcmcia.h
platform-bus.h
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
registerfields.h
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