[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 12/31] lsi: implement basic SBCL functionality
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL v2 12/31] lsi: implement basic SBCL functionality |
Date: |
Mon, 11 Mar 2019 17:55:16 +0100 |
From: Sven Schnelle <address@hidden>
HP-UX checks this register after sending data to the target. If there's no valid
information present, it assumes the client disconnected because the kernel sent
to much data. Implement at least some of the SBCL functionality that is possible
without having a real SCSI bus.
Signed-off-by: Sven Schnelle <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/scsi/lsi53c895a.c | 31 +++++++++++++++++++++++++++----
1 file changed, 27 insertions(+), 4 deletions(-)
diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
index 89def14..8ba07f8 100644
--- a/hw/scsi/lsi53c895a.c
+++ b/hw/scsi/lsi53c895a.c
@@ -160,6 +160,11 @@ static const char *names[] = {
#define LSI_CCNTL1_DDAC 0x08
#define LSI_CCNTL1_ZMOD 0x80
+#define LSI_SBCL_ATN 0x08
+#define LSI_SBCL_BSY 0x20
+#define LSI_SBCL_ACK 0x40
+#define LSI_SBCL_REQ 0x80
+
/* Enable Response to Reselection */
#define LSI_SCID_RRE 0x60
@@ -258,6 +263,7 @@ typedef struct {
uint8_t sdid;
uint8_t ssid;
uint8_t sfbr;
+ uint8_t sbcl;
uint8_t stest1;
uint8_t stest2;
uint8_t stest3;
@@ -356,6 +362,7 @@ static void lsi_soft_reset(LSIState *s)
s->socl = 0;
s->sdid = 0;
s->ssid = 0;
+ s->sbcl = 0;
s->stest1 = 0;
s->stest2 = 0;
s->stest3 = 0;
@@ -530,6 +537,8 @@ static void lsi_script_dma_interrupt(LSIState *s, int stat)
static inline void lsi_set_phase(LSIState *s, int phase)
{
+ s->sbcl &= ~PHASE_MASK;
+ s->sbcl |= phase | LSI_SBCL_REQ;
s->sstat1 = (s->sstat1 & ~PHASE_MASK) | phase;
}
@@ -567,6 +576,7 @@ static void lsi_disconnect(LSIState *s)
{
s->scntl1 &= ~LSI_SCNTL1_CON;
s->sstat1 &= ~PHASE_MASK;
+ s->sbcl = 0;
}
static void lsi_bad_selection(LSIState *s, uint32_t id)
@@ -1265,7 +1275,9 @@ again:
s->scntl1 |= LSI_SCNTL1_CON;
if (insn & (1 << 3)) {
s->socl |= LSI_SOCL_ATN;
+ s->sbcl |= LSI_SBCL_ATN;
}
+ s->sbcl |= LSI_SBCL_BSY;
lsi_set_phase(s, PHASE_MO);
break;
case 1: /* Disconnect */
@@ -1297,8 +1309,14 @@ again:
insn & (1 << 10) ? " CC" : "");
if (insn & (1 << 3)) {
s->socl |= LSI_SOCL_ATN;
+ s->sbcl |= LSI_SBCL_ATN;
lsi_set_phase(s, PHASE_MO);
}
+
+ if (insn & (1 << 6)) {
+ s->sbcl |= LSI_SBCL_ACK;
+ }
+
if (insn & (1 << 9)) {
qemu_log_mask(LOG_UNIMP,
"lsi_scsi: Target mode not implemented\n");
@@ -1314,7 +1332,13 @@ again:
insn & (1 << 10) ? " CC" : "");
if (insn & (1 << 3)) {
s->socl &= ~LSI_SOCL_ATN;
+ s->sbcl &= ~LSI_SBCL_ATN;
}
+
+ if (insn & (1 << 6)) {
+ s->sbcl &= ~LSI_SBCL_ACK;
+ }
+
if (insn & (1 << 10))
s->carry = 0;
break;
@@ -1591,9 +1615,7 @@ static uint8_t lsi_reg_readb(LSIState *s, int offset)
ret = s->ssid;
break;
case 0xb: /* SBCL */
- /* ??? This is not correct. However it's (hopefully) only
- used for diagnostics, so should be ok. */
- ret = 0;
+ ret = s->sbcl;
break;
case 0xc: /* DSTAT */
ret = s->dstat | LSI_DSTAT_DFE;
@@ -2143,7 +2165,7 @@ static int lsi_post_load(void *opaque, int version_id)
static const VMStateDescription vmstate_lsi_scsi = {
.name = "lsiscsi",
- .version_id = 0,
+ .version_id = 1,
.minimum_version_id = 0,
.pre_save = lsi_pre_save,
.post_load = lsi_post_load,
@@ -2202,6 +2224,7 @@ static const VMStateDescription vmstate_lsi_scsi = {
VMSTATE_UINT8(stime0, LSIState),
VMSTATE_UINT8(respid0, LSIState),
VMSTATE_UINT8(respid1, LSIState),
+ VMSTATE_UINT8_V(sbcl, LSIState, 1),
VMSTATE_UINT32(mmrs, LSIState),
VMSTATE_UINT32(mmws, LSIState),
VMSTATE_UINT32(sfs, LSIState),
--
1.8.3.1
- [Qemu-devel] [PULL v2 03/31] riscv/Kconfig: enable PCI_DEVICES, (continued)
- [Qemu-devel] [PULL v2 03/31] riscv/Kconfig: enable PCI_DEVICES, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 02/31] vfio-pci: enable by default, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 04/31] tests: test-qgraph: fix a memory leak, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 05/31] hw/i386/pc: run the multiboot loader before the PVH loader, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 06/31] block/iscsi: Restrict Linux-specific code, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 07/31] contrib/elf2dmp: add kernel start address checking, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 08/31] configure: Enable werror for git worktrees, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 10/31] i386: extended the cpuid_level when Intel PT is enabled, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 11/31] virtio-scsi: Fix build with gcc 9, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 15/31] build: get rid of target-obj-y, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 12/31] lsi: implement basic SBCL functionality,
Paolo Bonzini <=
- [Qemu-devel] [PULL v2 09/31] target-i386: add kvm stubs to user-mode emulators, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 13/31] lsi: check if SIGP bit is already set in Wait reselect, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 14/31] update copyright notice, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 16/31] build: remove unnecessary assignments from Makefile.target, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 17/31] build: clean trace/generated-helpers.c, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 19/31] oslib-posix: Ignore fcntl("/dev/null", F_SETFL, O_NONBLOCK) failure, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 18/31] accel: Allow to build QEMU without TCG or KVM support, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 21/31] scsi-disk: Fix crash if request is invaild or disk is no medium, Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 22/31] lsi: use ldn_le_p()/stn_le_p(), Paolo Bonzini, 2019/03/11
- [Qemu-devel] [PULL v2 25/31] lsi: use SCSI phase names instead of numbers in trace, Paolo Bonzini, 2019/03/11