Source-Changes-HG archive

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

[src/trunk]: src/sys/dev Add newer cars supports. Tested on MegaRAID SAS 9260...



details:   https://anonhg.NetBSD.org/src/rev/56634bf8369a
branches:  trunk
changeset: 751932:56634bf8369a
user:      msaitoh <msaitoh%NetBSD.org@localhost>
date:      Tue Feb 09 00:05:18 2010 +0000

description:
Add newer cars supports. Tested on MegaRAID SAS 9260-8i.
 - Add MFI gen2 support from OpenBSD.
 - Add entry for MegaRAID SAS 9260-8i

diffstat:

 sys/dev/ic/mfi.c      |  66 ++++++++++++++++++++++++++++++++++++++++++++++++--
 sys/dev/ic/mfireg.h   |   3 +-
 sys/dev/ic/mfivar.h   |   5 ++-
 sys/dev/pci/mfi_pci.c |  34 +++++++++++++++++++++----
 4 files changed, 96 insertions(+), 12 deletions(-)

diffs (235 lines):

diff -r b9f5c54dfdf2 -r 56634bf8369a sys/dev/ic/mfi.c
--- a/sys/dev/ic/mfi.c  Mon Feb 08 23:59:09 2010 +0000
+++ b/sys/dev/ic/mfi.c  Tue Feb 09 00:05:18 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mfi.c,v 1.32 2010/02/08 23:54:33 msaitoh Exp $ */
+/* $NetBSD: mfi.c,v 1.33 2010/02/09 00:05:18 msaitoh 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.32 2010/02/08 23:54:33 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.33 2010/02/09 00:05:18 msaitoh Exp $");
 
 #include "bio.h"
 
@@ -137,6 +137,20 @@
        mfi_ppc_post
 };
 
+uint32_t       mfi_gen2_fw_state(struct mfi_softc *sc);
+void           mfi_gen2_intr_ena(struct mfi_softc *sc);
+void           mfi_gen2_intr_dis(struct mfi_softc *sc);
+int            mfi_gen2_intr(struct mfi_softc *sc);
+void           mfi_gen2_post(struct mfi_softc *sc, struct mfi_ccb *ccb);
+
+static const struct mfi_iop_ops mfi_iop_gen2 = {
+       mfi_gen2_fw_state,
+       mfi_gen2_intr_dis,
+       mfi_gen2_intr_ena,
+       mfi_gen2_intr,
+       mfi_gen2_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))
@@ -709,6 +723,9 @@
        case MFI_IOP_PPC:
                sc->sc_iop = &mfi_iop_ppc;
                break;
+       case MFI_IOP_GEN2:
+               sc->sc_iop = &mfi_iop_gen2;
+               break;
        default:
                 panic("%s: unknown iop %d", DEVNAME(sc), iop);
        }
@@ -1299,7 +1316,8 @@
 
 static int
 mfi_mgmt_internal(struct mfi_softc *sc, uint32_t opc, uint32_t dir,
-    uint32_t len, void *buf, uint8_t *mbox) {
+    uint32_t len, void *buf, uint8_t *mbox)
+{
        struct mfi_ccb          *ccb;
        int                     rv = 1;
 
@@ -2168,3 +2186,45 @@
        mfi_write(sc, MFI_IQP, 0x1 | ccb->ccb_pframe |
            (ccb->ccb_extra_frames << 1));
 }
+
+u_int32_t
+mfi_gen2_fw_state(struct mfi_softc *sc)
+{
+       return (mfi_read(sc, MFI_OSP));
+}
+
+void
+mfi_gen2_intr_dis(struct mfi_softc *sc)
+{
+       mfi_write(sc, MFI_OMSK, 0xffffffff);
+       mfi_write(sc, MFI_ODC, 0xffffffff);
+}
+
+void
+mfi_gen2_intr_ena(struct mfi_softc *sc)
+{
+       mfi_write(sc, MFI_ODC, 0xffffffff);
+       mfi_write(sc, MFI_OMSK, ~MFI_OSTS_GEN2_INTR_VALID);
+}
+
+int
+mfi_gen2_intr(struct mfi_softc *sc)
+{
+       u_int32_t status;
+
+       status = mfi_read(sc, MFI_OSTS);
+       if (!ISSET(status, MFI_OSTS_GEN2_INTR_VALID))
+               return (0);
+
+       /* write status back to acknowledge interrupt */
+       mfi_write(sc, MFI_ODC, status);
+
+       return (1);
+}
+
+void
+mfi_gen2_post(struct mfi_softc *sc, struct mfi_ccb *ccb)
+{
+       mfi_write(sc, MFI_IQP, 0x1 | ccb->ccb_pframe |
+           (ccb->ccb_extra_frames << 1));
+}
diff -r b9f5c54dfdf2 -r 56634bf8369a sys/dev/ic/mfireg.h
--- a/sys/dev/ic/mfireg.h       Mon Feb 08 23:59:09 2010 +0000
+++ b/sys/dev/ic/mfireg.h       Tue Feb 09 00:05:18 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mfireg.h,v 1.3 2008/02/25 10:46:02 xtraeme Exp $ */
+/* $NetBSD: mfireg.h,v 1.4 2010/02/09 00:05:18 msaitoh Exp $ */
 /* $OpenBSD: mfireg.h,v 1.24 2006/06/19 19:05:45 marco Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <marco%peereboom.us@localhost>
@@ -25,6 +25,7 @@
 #define MFI_SENSE_SIZE                         128
 #define MFI_OSTS_INTR_VALID                    0x00000002 /* valid interrupt */
 #define MFI_OSTS_PPC_INTR_VALID                        0x80000000
+#define MFI_OSTS_GEN2_INTR_VALID               (0x00000001 | 0x00000004)
 #define MFI_INVALID_CTX                                0xffffffff
 #define MFI_ENABLE_INTR                                0x01
 #define MFI_MAXFER                             MAXPHYS /* XXX bogus */
diff -r b9f5c54dfdf2 -r 56634bf8369a sys/dev/ic/mfivar.h
--- a/sys/dev/ic/mfivar.h       Mon Feb 08 23:59:09 2010 +0000
+++ b/sys/dev/ic/mfivar.h       Tue Feb 09 00:05:18 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mfivar.h,v 1.13 2009/07/16 18:58:38 dyoung Exp $ */
+/* $NetBSD: mfivar.h,v 1.14 2010/02/09 00:05:18 msaitoh Exp $ */
 /* $OpenBSD: mfivar.h,v 1.28 2006/08/31 18:18:46 marco Exp $ */
 /*
  * Copyright (c) 2006 Marco Peereboom <marco%peereboom.us@localhost>
@@ -98,7 +98,8 @@
 
 enum mfi_iop {
        MFI_IOP_XSCALE,
-       MFI_IOP_PPC
+       MFI_IOP_PPC,
+       MFI_IOP_GEN2
 };
 
 struct mfi_iop_ops {
diff -r b9f5c54dfdf2 -r 56634bf8369a sys/dev/pci/mfi_pci.c
--- a/sys/dev/pci/mfi_pci.c     Mon Feb 08 23:59:09 2010 +0000
+++ b/sys/dev/pci/mfi_pci.c     Tue Feb 09 00:05:18 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mfi_pci.c,v 1.11 2009/07/16 18:58:38 dyoung Exp $ */
+/* $NetBSD: mfi_pci.c,v 1.12 2010/02/09 00:05:18 msaitoh 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.11 2009/07/16 18:58:38 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfi_pci.c,v 1.12 2010/02/09 00:05:18 msaitoh Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -38,6 +38,7 @@
 #include <dev/ic/mfivar.h>
 
 #define        MFI_BAR         0x10
+#define        MFI_BAR_GEN2    0x14
 #define        MFI_PCI_MEMSIZE 0x2000 /* 8k */
 
 struct mfi_pci_softc {
@@ -82,6 +83,11 @@
        { 0,                    0,              NULL }
 };
 
+static const struct mfi_pci_subtype mfi_gen2_subtypes[] = {
+       { PCI_VENDOR_SYMBIOS,   0x9261,         "SAS 9260-8i" },
+       { 0x0,                  0,              "" }
+};
+
 static const
 struct mfi_pci_device {
        pcireg_t                        mpd_vendor;
@@ -95,10 +101,16 @@
          MFI_IOP_XSCALE,       NULL },
        { PCI_VENDOR_SYMBIOS,   PCI_PRODUCT_SYMBIOS_SAS1078,
          MFI_IOP_PPC,          mfi_1078_subtypes },
+       { PCI_VENDOR_SYMBIOS,   PCI_PRODUCT_SYMBIOS_SAS1078DE,
+         MFI_IOP_PPC,          mfi_1078_subtypes },
        { PCI_VENDOR_DELL,      PCI_PRODUCT_DELL_PERC_5,
          MFI_IOP_XSCALE,       mfi_perc5_subtypes },
        { PCI_VENDOR_DELL,      PCI_PRODUCT_DELL_PERC_6,
          MFI_IOP_PPC,          mfi_1078_subtypes },
+       { PCI_VENDOR_SYMBIOS,   PCI_PRODUCT_SYMBIOS_SAS2108_1,
+         MFI_IOP_GEN2,         mfi_gen2_subtypes },
+       { PCI_VENDOR_SYMBIOS,   PCI_PRODUCT_SYMBIOS_SAS2108_2,
+         MFI_IOP_GEN2,         mfi_gen2_subtypes },
 };
 
 const struct mfi_pci_device *
@@ -151,15 +163,27 @@
        const char              *intrstr;
        pci_intr_handle_t       ih;
        pcireg_t                csr;
+       int                     regbar;
        const char              *subtype = NULL;
        uint32_t                subsysid;
 
        sc->sc_dev = self;
        psc->psc_pc = pa->pa_pc;
 
-       csr = pci_mapreg_type(pa->pa_pc, pa->pa_tag, MFI_BAR);
+       mpd = mfi_pci_find_device(pa);
+       if (mpd == NULL) {
+               printf(": can't find matching pci device\n");
+               return;
+       }
+
+       if (mpd->mpd_iop == MFI_IOP_GEN2)
+               regbar = MFI_BAR_GEN2;
+       else
+               regbar = MFI_BAR;
+
+       csr = pci_mapreg_type(pa->pa_pc, pa->pa_tag, regbar);
        csr |= PCI_MAPREG_MEM_TYPE_32BIT;
-       if (pci_mapreg_map(pa, MFI_BAR, csr, 0,
+       if (pci_mapreg_map(pa, regbar, csr, 0,
            &sc->sc_iot, &sc->sc_ioh, NULL, &sc->sc_size)) {
                aprint_error(": can't map controller pci space\n");
                return;
@@ -183,8 +207,6 @@
                return;
        }
 
-       mpd = mfi_pci_find_device(pa);
-
        subsysid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
        if (mpd->mpd_subtype != NULL) {
                st = mpd->mpd_subtype;



Home | Main Index | Thread Index | Old Index