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