[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 16/54] esp-pci: Fix status register write erase contr
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 16/54] esp-pci: Fix status register write erase control |
Date: |
Wed, 12 Dec 2018 16:22:37 +0100 |
From: Guenter Roeck <address@hidden>
Per AM53C974 datasheet, definition of "SCSI Bus and Control (SBAC)"
register:
Bit 24 'STATUS' Write Erase Control
This bit controls the Write Erase feature on bits 3:1 and bit 6 of the DMA
Status Register ((B)+54h). When this bit is programmed to '1', the state
of bits 3:1 are preserved when read. Bits 3:1 are only cleared when a '1'
is written to the corresponding bit location. For example, to clear bit 1,
the value of '0000_0010b' should be written to the register. When the DMA
Status Preserve bit is '0', bits 3:1 are cleared when read.
The status register is currently defined to bit 12, not bit 24.
Also, its implementation is reversed: The status is auto-cleared if
the bit is set to 1, and must be cleared explicitly when the bit is
set to 0. This results in spurious interrupts reported by the Linux
kernel, and in some cases even results in stalled SCSI operations.
Set SBAC_STATUS to bit 24 and reverse the logic to fix the problem.
Signed-off-by: Guenter Roeck <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/scsi/esp-pci.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
index 419fc66..d956909 100644
--- a/hw/scsi/esp-pci.c
+++ b/hw/scsi/esp-pci.c
@@ -59,7 +59,7 @@
#define DMA_STAT_SCSIINT 0x10
#define DMA_STAT_BCMBLT 0x20
-#define SBAC_STATUS 0x1000
+#define SBAC_STATUS (1 << 24)
typedef struct PCIESPState {
/*< private >*/
@@ -136,7 +136,7 @@ static void esp_pci_dma_write(PCIESPState *pci, uint32_t
saddr, uint32_t val)
pci->dma_regs[saddr] = val;
break;
case DMA_STAT:
- if (!(pci->sbac & SBAC_STATUS)) {
+ if (pci->sbac & SBAC_STATUS) {
/* clear some bits on write */
uint32_t mask = DMA_STAT_ERROR | DMA_STAT_ABORT | DMA_STAT_DONE;
pci->dma_regs[DMA_STAT] &= ~(val & mask);
@@ -157,7 +157,7 @@ static uint32_t esp_pci_dma_read(PCIESPState *pci, uint32_t
saddr)
if (pci->esp.rregs[ESP_RSTAT] & STAT_INT) {
val |= DMA_STAT_SCSIINT;
}
- if (pci->sbac & SBAC_STATUS) {
+ if (!(pci->sbac & SBAC_STATUS)) {
pci->dma_regs[DMA_STAT] &= ~(DMA_STAT_ERROR | DMA_STAT_ABORT |
DMA_STAT_DONE);
}
--
1.8.3.1
- [Qemu-devel] [PULL 08/54] memory: extract flat_range_coalesced_io_{del, add}, (continued)
- [Qemu-devel] [PULL 08/54] memory: extract flat_range_coalesced_io_{del, add}, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 14/54] block/iscsi: fix ioctl cancel use-after-free, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 05/54] checkpatch: improve handling of multiple patches or files, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 20/54] build-sys: build with Vista API by default, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 07/54] pam: wrap MemoryRegion initialization in a transaction, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 03/54] checkpatch: fix premature exit when no input or --mailback, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 06/54] checkpatch: colorize output to terminal, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 25/54] qemu/queue.h: do not access tqe_prev directly, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 24/54] compiler.h: Add an explicit check for the compiler version, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 13/54] block/iscsi: take iscsilun->mutex in iscsi_timed_check_events(), Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 16/54] esp-pci: Fix status register write erase control,
Paolo Bonzini <=
- [Qemu-devel] [PULL 15/54] block/iscsi: cancel libiscsi task when ABORT TASK TMF completes, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 02/54] vhost-user-bridge: fix "unknown type name" compilation error, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 26/54] vfio: make vfio_address_spaces static, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 22/54] test: execute g_test_run when tests are skipped, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 17/54] scsi: esp: Defer command completion until previous interrupts have been handled, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 21/54] RFC: qga: drop < Vista compatibility, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 19/54] build-sys: move windows defines in osdep.h header, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 10/54] memory: update coalesced_range on transaction_commit, Paolo Bonzini, 2018/12/12
- [Qemu-devel] [PULL 28/54] qemu/queue.h: typedef QTAILQ heads, Paolo Bonzini, 2018/12/12