From: "Nicholas A. Bellinger" <nab@linux-iscsi.org>
To: Paul Brook <paul@codesourcery.com>,
Jan Kiszka <jan.kiszka@siemens.com>,
Kevin Wolf <kwolf@redhat.com>, Gerd Hoffmann <kraxel@redhat.com>
Cc: Hannes Reinecke <hare@suse.de>,
FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>,
Matthew Wilcox <willy@linux.intel.com>,
kvm-devel <kvm@vger.kernel.org>,
qemu-devel <qemu-devel@nongnu.org>,
Nicholas Bellinger <nab@linux-iscsi.org>
Subject: [PATCH] lsi53c895a: Add missing registers and workaround for OS/2 Warp SYM8XX.ADD driver
Date: Wed, 29 Sep 2010 22:07:34 -0700 [thread overview]
Message-ID: <1285823254-6699-1-git-send-email-nab@linux-iscsi.org> (raw)
From: Nicholas Bellinger <nab@linux-iscsi.org>
This patch adds support for using lsi53c895a HBA with SYM8XXX.ADD driver v4.10.
This includes adding the missing SOCL and STIME1 registers from lsi_reg_readb(),
and missing SOCL and a workaround for bogus SDID WRITE that is requred to
function with the SYM8XXX.ADD driver.
Note that this patch also includes ISTAT1 in lsi_reg_writeb(), which currently
will BADF() as this register is (supposed) to be reserved for 53c896 silicon.
Note that the other lsi53c895a capable driver from LSI (SYM_HI.ADD) currently
tries to read these, even though we are reporting PCI_DEVICE_ID_LSI_53C895A.
So far this patch is able to successfully boot OS/2 Warp v4 (SP15) and complete
the LUN scan with a scsi-generic <-> TCM_Loop + TCM/FILEIO connected LUN running
on TCM/KVM host.
Signed-off-by: Nicholas A. Bellinger <nab@linux-iscsi.org>
---
hw/lsi53c895a.c | 26 ++++++++++++++++++++++----
1 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c
index 983f6cb..87e1a04 100644
--- a/hw/lsi53c895a.c
+++ b/hw/lsi53c895a.c
@@ -437,8 +437,8 @@ static void lsi_update_irq(LSIState *s)
level = 1;
if (level != last_level) {
- DPRINTF("Update IRQ level %d dstat %02x sist %02x%02x\n",
- level, s->dstat, s->sist1, s->sist0);
+ DPRINTF("Update IRQ level %d dstat %02x sist %02x%02x, istat: %02x%02x\n",
+ level, s->dstat, s->sist1, s->sist0, s->istat1, s->istat0);
last_level = level;
}
qemu_set_irq(s->dev.irq[0], level);
@@ -1425,6 +1425,8 @@ static uint8_t lsi_reg_readb(LSIState *s, int offset)
return 0x7f;
case 0x08: /* Revision ID */
return 0x00;
+ case 0x09: /* SOCL */
+ return s->socl;
case 0xa: /* SSID */
return s->ssid;
case 0xb: /* SBCL */
@@ -1509,6 +1511,10 @@ static uint8_t lsi_reg_readb(LSIState *s, int offset)
return 0x0f;
case 0x48: /* STIME0 */
return s->stime0;
+ case 0x49: /* STIME1 */
+ /* Generate purpose timer, disabled by default in the Linux driver
+ and required for the OS/2 SYM_HI.ADD driver */
+ return 0;
case 0x4a: /* RESPID0 */
return s->respid0;
case 0x4b: /* RESPID1 */
@@ -1625,8 +1631,14 @@ static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val)
s->sxfer = val;
break;
case 0x06: /* SDID */
- if ((val & 0xf) != (s->ssid & 0xf))
- BADF("Destination ID does not match SSID\n");
+ /*
+ * This workaround is required by the SYM8XX.ADD driver for OS/2 Warp.
+ */
+ if ((val & 0xf) != (s->ssid & 0xf)) {
+ DPRINTF("Destination ID does not match SSID, val: %02x"
+ " s->ssid: %02x, fixing up val\n", val, s->ssid);
+ val = s->ssid;
+ }
s->sdid = val & 0xf;
break;
case 0x07: /* GPREG0 */
@@ -1636,6 +1648,9 @@ static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val)
SCRIPTS register move instructions are. */
s->sfbr = val;
break;
+ case 0x09: /* SOCL - SCSI Output Control Latch */
+ s->socl = val;
+ break;
case 0x0a: case 0x0b:
/* Openserver writes to these readonly registers on startup */
return;
@@ -1662,6 +1677,9 @@ static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val)
lsi_soft_reset(s);
}
break;
+ case 0x15: /* ISTAT1 */
+ BADF(" ISTAT1 not implemented for 53c896 silicon");
+ break;
case 0x16: /* MBOX0 */
s->mbox0 = val;
break;
--
1.5.6.5
next reply other threads:[~2010-09-30 5:07 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-30 5:07 Nicholas A. Bellinger [this message]
2010-09-30 8:07 ` [PATCH] lsi53c895a: Add missing registers and workaround for OS/2 Warp SYM8XX.ADD driver Paolo Bonzini
2010-09-30 21:29 ` Nicholas A. Bellinger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1285823254-6699-1-git-send-email-nab@linux-iscsi.org \
--to=nab@linux-iscsi.org \
--cc=fujita.tomonori@lab.ntt.co.jp \
--cc=hare@suse.de \
--cc=jan.kiszka@siemens.com \
--cc=kraxel@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=kwolf@redhat.com \
--cc=paul@codesourcery.com \
--cc=qemu-devel@nongnu.org \
--cc=willy@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox