Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev Add support for skinny variants (e.g. IBM ServeRAID ...



details:   https://anonhg.NetBSD.org/src/rev/80ca64c4b9e7
branches:  trunk
changeset: 778300:80ca64c4b9e7
user:      sborrill <sborrill%NetBSD.org@localhost>
date:      Wed Mar 21 14:22:35 2012 +0000

description:
Add support for skinny variants (e.g. IBM ServeRAID M1015). Based on OpenBSD
changes with some improvements. Tested on IBM x3550M3 with RAID0 and RAID1
volumes including bioctl(8) operation.

diffstat:

 sys/dev/ic/mfi.c      |  72 ++++++++++++++++++++++++++++++++++++++++++++++++--
 sys/dev/ic/mfireg.h   |  10 ++++++-
 sys/dev/ic/mfivar.h   |   5 ++-
 sys/dev/pci/mfi_pci.c |  15 ++++++++--
 4 files changed, 92 insertions(+), 10 deletions(-)

diffs (207 lines):

diff -r 3bbf3170aac9 -r 80ca64c4b9e7 sys/dev/ic/mfi.c
--- a/sys/dev/ic/mfi.c  Wed Mar 21 14:19:15 2012 +0000
+++ b/sys/dev/ic/mfi.c  Wed Mar 21 14:22:35 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mfi.c,v 1.37 2012/03/21 13:19:11 sborrill Exp $ */
+/* $NetBSD: mfi.c,v 1.38 2012/03/21 14:22:36 sborrill Exp $ */
 /* $OpenBSD: mfi.c,v 1.66 2006/11/28 23:59:45 dlg Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <marco%peereboom.us@localhost>
@@ -17,7 +17,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.37 2012/03/21 13:19:11 sborrill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.38 2012/03/21 14:22:36 sborrill Exp $");
 
 #include "bio.h"
 
@@ -151,6 +151,20 @@
        mfi_gen2_post
 };
 
+u_int32_t      mfi_skinny_fw_state(struct mfi_softc *);
+void           mfi_skinny_intr_dis(struct mfi_softc *);
+void           mfi_skinny_intr_ena(struct mfi_softc *);
+int            mfi_skinny_intr(struct mfi_softc *);
+void           mfi_skinny_post(struct mfi_softc *, struct mfi_ccb *);
+
+static const struct mfi_iop_ops mfi_iop_skinny = {
+       mfi_skinny_fw_state,
+       mfi_skinny_intr_dis,
+       mfi_skinny_intr_ena,
+       mfi_skinny_intr,
+       mfi_skinny_post
+};
+
 #define mfi_fw_state(_s)       ((_s)->sc_iop->mio_fw_state(_s))
 #define mfi_intr_enable(_s)    ((_s)->sc_iop->mio_intr_ena(_s))
 #define mfi_intr_disable(_s)   ((_s)->sc_iop->mio_intr_dis(_s))
@@ -402,11 +416,17 @@
                        printf("%s: firmware fault\n", DEVNAME(sc));
                        return 1;
                case MFI_STATE_WAIT_HANDSHAKE:
-                       mfi_write(sc, MFI_IDB, MFI_INIT_CLEAR_HANDSHAKE);
+                       if (sc->sc_flags & MFI_IOP_SKINNY)
+                               mfi_write(sc, MFI_SKINNY_IDB, MFI_INIT_CLEAR_HANDSHAKE);
+                       else
+                               mfi_write(sc, MFI_IDB, MFI_INIT_CLEAR_HANDSHAKE);
                        max_wait = 2;
                        break;
                case MFI_STATE_OPERATIONAL:
-                       mfi_write(sc, MFI_IDB, MFI_INIT_READY);
+                       if (sc->sc_flags & MFI_IOP_SKINNY)
+                               mfi_write(sc, MFI_SKINNY_IDB, MFI_INIT_READY);
+                       else
+                               mfi_write(sc, MFI_IDB, MFI_INIT_READY);
                        max_wait = 10;
                        break;
                case MFI_STATE_UNDEFINED:
@@ -730,6 +750,9 @@
        case MFI_IOP_GEN2:
                sc->sc_iop = &mfi_iop_gen2;
                break;
+       case MFI_IOP_SKINNY:
+               sc->sc_iop = &mfi_iop_skinny;
+               break;
        default:
                 panic("%s: unknown iop %d", DEVNAME(sc), iop);
        }
@@ -2233,3 +2256,44 @@
        mfi_write(sc, MFI_IQP, 0x1 | ccb->ccb_pframe |
            (ccb->ccb_extra_frames << 1));
 }
+
+u_int32_t
+mfi_skinny_fw_state(struct mfi_softc *sc)
+{
+       return (mfi_read(sc, MFI_OSP));
+}
+
+void
+mfi_skinny_intr_dis(struct mfi_softc *sc)
+{
+       mfi_write(sc, MFI_OMSK, 0);
+}
+
+void
+mfi_skinny_intr_ena(struct mfi_softc *sc)
+{
+       mfi_write(sc, MFI_OMSK, ~0x00000001);
+}
+
+int
+mfi_skinny_intr(struct mfi_softc *sc)
+{
+       u_int32_t status;
+
+       status = mfi_read(sc, MFI_OSTS);
+       if (!ISSET(status, MFI_OSTS_SKINNY_INTR_VALID))
+               return (0);
+
+       /* write status back to acknowledge interrupt */
+       mfi_write(sc, MFI_OSTS, status);
+
+       return (1);
+}
+
+void
+mfi_skinny_post(struct mfi_softc *sc, struct mfi_ccb *ccb)
+{
+       mfi_write(sc, MFI_IQPL, 0x1 | ccb->ccb_pframe |
+           (ccb->ccb_extra_frames << 1));
+       mfi_write(sc, MFI_IQPH, 0x00000000);
+}
diff -r 3bbf3170aac9 -r 80ca64c4b9e7 sys/dev/ic/mfireg.h
--- a/sys/dev/ic/mfireg.h       Wed Mar 21 14:19:15 2012 +0000
+++ b/sys/dev/ic/mfireg.h       Wed Mar 21 14:22:35 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mfireg.h,v 1.4 2010/02/09 00:05:18 msaitoh Exp $ */
+/* $NetBSD: mfireg.h,v 1.5 2012/03/21 14:22:36 sborrill Exp $ */
 /* $OpenBSD: mfireg.h,v 1.24 2006/06/19 19:05:45 marco Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <marco%peereboom.us@localhost>
@@ -46,6 +46,14 @@
 #define MFI_ODC                                        0xa0 /* outbound doorbell clr */
 #define MFI_OSP                                0xb0 /* outbound scratch pad */
 
+/*
+ * skinny specific changes
+*/
+#define MFI_SKINNY_IDB                         0x00 /* Inbound doorbell is at 0x00 for skinny */
+#define MFI_IQPL                               0x000000c0
+#define MFI_IQPH                               0x000000c4
+#define MFI_OSTS_SKINNY_INTR_VALID             0x00000001
+
 /* * firmware states */
 #define MFI_STATE_MASK                         0xf0000000
 #define MFI_STATE_UNDEFINED                    0x00000000
diff -r 3bbf3170aac9 -r 80ca64c4b9e7 sys/dev/ic/mfivar.h
--- a/sys/dev/ic/mfivar.h       Wed Mar 21 14:19:15 2012 +0000
+++ b/sys/dev/ic/mfivar.h       Wed Mar 21 14:22:35 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mfivar.h,v 1.14 2010/02/09 00:05:18 msaitoh Exp $ */
+/* $NetBSD: mfivar.h,v 1.15 2012/03/21 14:22:36 sborrill Exp $ */
 /* $OpenBSD: mfivar.h,v 1.28 2006/08/31 18:18:46 marco Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <marco%peereboom.us@localhost>
@@ -99,7 +99,8 @@
 enum mfi_iop {
        MFI_IOP_XSCALE,
        MFI_IOP_PPC,
-       MFI_IOP_GEN2
+       MFI_IOP_GEN2,
+       MFI_IOP_SKINNY
 };
 
 struct mfi_iop_ops {
diff -r 3bbf3170aac9 -r 80ca64c4b9e7 sys/dev/pci/mfi_pci.c
--- a/sys/dev/pci/mfi_pci.c     Wed Mar 21 14:19:15 2012 +0000
+++ b/sys/dev/pci/mfi_pci.c     Wed Mar 21 14:22:35 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mfi_pci.c,v 1.12 2010/02/09 00:05:18 msaitoh Exp $ */
+/* $NetBSD: mfi_pci.c,v 1.13 2012/03/21 14:22:35 sborrill Exp $ */
 /* $OpenBSD: mfi_pci.c,v 1.11 2006/08/06 04:40:08 brad Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <marco%peereboom.us@localhost>
@@ -17,7 +17,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mfi_pci.c,v 1.12 2010/02/09 00:05:18 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfi_pci.c,v 1.13 2012/03/21 14:22:35 sborrill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -88,6 +88,11 @@
        { 0x0,                  0,              "" }
 };
 
+static const struct mfi_pci_subtype mfi_skinny_subtypes[] = {
+       { PCI_VENDOR_IBM,       0x03b1,         "IBM ServeRAID M1015 SAS/SATA" },
+       { 0x0,                  0,              "" }
+};
+
 static const
 struct mfi_pci_device {
        pcireg_t                        mpd_vendor;
@@ -111,6 +116,8 @@
          MFI_IOP_GEN2,         mfi_gen2_subtypes },
        { PCI_VENDOR_SYMBIOS,   PCI_PRODUCT_SYMBIOS_SAS2108_2,
          MFI_IOP_GEN2,         mfi_gen2_subtypes },
+       { PCI_VENDOR_SYMBIOS,   PCI_PRODUCT_SYMBIOS_SAS2008_1,
+         MFI_IOP_SKINNY,       mfi_skinny_subtypes },
 };
 
 const struct mfi_pci_device *
@@ -176,7 +183,9 @@
                return;
        }
 
-       if (mpd->mpd_iop == MFI_IOP_GEN2)
+       sc->sc_flags = mpd->mpd_iop;
+
+       if (mpd->mpd_iop == MFI_IOP_GEN2 || mpd->mpd_iop == MFI_IOP_SKINNY)
                regbar = MFI_BAR_GEN2;
        else
                regbar = MFI_BAR;



Home | Main Index | Thread Index | Old Index