Module Name:    src
Committed By:   riz
Date:           Thu Mar 22 23:04:27 UTC 2012

Modified Files:
        src/sys/dev/ic [netbsd-6]: mfi.c mfireg.h mfivar.h
        src/sys/dev/pci [netbsd-6]: mfi_pci.c

Log Message:
Pull up following revision(s) (requested by sborrill in ticket #138):
        sys/dev/pci/mfi_pci.c: revision 1.13
        sys/dev/ic/mfi.c: revision 1.38
        sys/dev/ic/mfivar.h: revision 1.15
        sys/dev/ic/mfireg.h: revision 1.5
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.


To generate a diff of this commit:
cvs rdiff -u -r1.36.8.1 -r1.36.8.2 src/sys/dev/ic/mfi.c
cvs rdiff -u -r1.4 -r1.4.16.1 src/sys/dev/ic/mfireg.h
cvs rdiff -u -r1.14 -r1.14.16.1 src/sys/dev/ic/mfivar.h
cvs rdiff -u -r1.12 -r1.12.16.1 src/sys/dev/pci/mfi_pci.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/mfi.c
diff -u src/sys/dev/ic/mfi.c:1.36.8.1 src/sys/dev/ic/mfi.c:1.36.8.2
--- src/sys/dev/ic/mfi.c:1.36.8.1	Thu Mar 22 22:58:23 2012
+++ src/sys/dev/ic/mfi.c	Thu Mar 22 23:04:27 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: mfi.c,v 1.36.8.1 2012/03/22 22:58:23 riz Exp $ */
+/* $NetBSD: mfi.c,v 1.36.8.2 2012/03/22 23:04:27 riz Exp $ */
 /* $OpenBSD: mfi.c,v 1.66 2006/11/28 23:59:45 dlg Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <[email protected]>
@@ -17,7 +17,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.36.8.1 2012/03/22 22:58:23 riz Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.36.8.2 2012/03/22 23:04:27 riz Exp $");
 
 #include "bio.h"
 
@@ -151,6 +151,20 @@ static const struct mfi_iop_ops mfi_iop_
 	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 @@ mfi_transition_firmware(struct mfi_softc
 			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 @@ mfi_attach(struct mfi_softc *sc, enum mf
 	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_gen2_post(struct mfi_softc *sc, stru
 	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);
+}

Index: src/sys/dev/ic/mfireg.h
diff -u src/sys/dev/ic/mfireg.h:1.4 src/sys/dev/ic/mfireg.h:1.4.16.1
--- src/sys/dev/ic/mfireg.h:1.4	Tue Feb  9 00:05:18 2010
+++ src/sys/dev/ic/mfireg.h	Thu Mar 22 23:04:27 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: mfireg.h,v 1.4 2010/02/09 00:05:18 msaitoh Exp $ */
+/* $NetBSD: mfireg.h,v 1.4.16.1 2012/03/22 23:04:27 riz Exp $ */
 /* $OpenBSD: mfireg.h,v 1.24 2006/06/19 19:05:45 marco Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <[email protected]>
@@ -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

Index: src/sys/dev/ic/mfivar.h
diff -u src/sys/dev/ic/mfivar.h:1.14 src/sys/dev/ic/mfivar.h:1.14.16.1
--- src/sys/dev/ic/mfivar.h:1.14	Tue Feb  9 00:05:18 2010
+++ src/sys/dev/ic/mfivar.h	Thu Mar 22 23:04:27 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: mfivar.h,v 1.14 2010/02/09 00:05:18 msaitoh Exp $ */
+/* $NetBSD: mfivar.h,v 1.14.16.1 2012/03/22 23:04:27 riz Exp $ */
 /* $OpenBSD: mfivar.h,v 1.28 2006/08/31 18:18:46 marco Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <[email protected]>
@@ -99,7 +99,8 @@ TAILQ_HEAD(mfi_ccb_list, mfi_ccb);
 enum mfi_iop {
 	MFI_IOP_XSCALE,
 	MFI_IOP_PPC,
-	MFI_IOP_GEN2
+	MFI_IOP_GEN2,
+	MFI_IOP_SKINNY
 };
 
 struct mfi_iop_ops {

Index: src/sys/dev/pci/mfi_pci.c
diff -u src/sys/dev/pci/mfi_pci.c:1.12 src/sys/dev/pci/mfi_pci.c:1.12.16.1
--- src/sys/dev/pci/mfi_pci.c:1.12	Tue Feb  9 00:05:18 2010
+++ src/sys/dev/pci/mfi_pci.c	Thu Mar 22 23:04:26 2012
@@ -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.12.16.1 2012/03/22 23:04:26 riz Exp $ */
 /* $OpenBSD: mfi_pci.c,v 1.11 2006/08/06 04:40:08 brad Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <[email protected]>
@@ -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.12.16.1 2012/03/22 23:04:26 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -88,6 +88,11 @@ static const struct mfi_pci_subtype mfi_
 	{ 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 @@ struct mfi_pci_device {
 	  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 @@ mfi_pci_attach(device_t parent, device_t
 		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;

Reply via email to