public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
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


             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