Module Name: src
Committed By: snj
Date: Sun Mar 28 15:03:23 UTC 2010
Modified Files:
src/share/man/man4 [netbsd-5]: mfi.4
src/sys/dev/ic [netbsd-5]: mfi.c mfireg.h mfivar.h
src/sys/dev/pci [netbsd-5]: mfi_pci.c pcidevs
Log Message:
Apply patch (requested by msaitoh in ticket #1326):
Add support for MFI gen2 devices. Mention newer devices, RAID 6 and
RAID60 in mfi.4.
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.7.8.1 src/share/man/man4/mfi.4
cvs rdiff -u -r1.19.4.3 -r1.19.4.4 src/sys/dev/ic/mfi.c
cvs rdiff -u -r1.3 -r1.3.14.1 src/sys/dev/ic/mfireg.h
cvs rdiff -u -r1.10 -r1.10.6.1 src/sys/dev/ic/mfivar.h
cvs rdiff -u -r1.5 -r1.5.14.1 src/sys/dev/pci/mfi_pci.c
cvs rdiff -u -r1.962.4.10 -r1.962.4.11 src/sys/dev/pci/pcidevs
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/share/man/man4/mfi.4
diff -u src/share/man/man4/mfi.4:1.7 src/share/man/man4/mfi.4:1.7.8.1
--- src/share/man/man4/mfi.4:1.7 Fri Feb 29 20:56:33 2008
+++ src/share/man/man4/mfi.4 Sun Mar 28 15:03:23 2010
@@ -1,4 +1,4 @@
-.\" $NetBSD: mfi.4,v 1.7 2008/02/29 20:56:33 xtraeme Exp $
+.\" $NetBSD: mfi.4,v 1.7.8.1 2010/03/28 15:03:23 snj Exp $
.\" $OpenBSD: mfi.4,v 1.7 2006/09/01 09:58:09 jmc Exp $
.\"
.\" Written by Marco Peereboom <[email protected]>
@@ -24,7 +24,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd February 29, 2008
+.Dd February 9, 2010
.Dt MFI 4
.Os
.Sh NAME
@@ -55,12 +55,14 @@
MegaRAID SAS 8344ELP,
MegaRAID SAS 8408E,
MegaRAID SAS 8480E,
+MegaRAID SAS 8708ELP,
MegaRAID SAS 8888ELP,
-MegaRAID SAS 8880EM2
+MegaRAID SAS 8880EM2,
+MegaRAID SAS 9260-8i
.El
.Pp
-These controllers support RAID 0, RAID 1, RAID 5, RAID 10, and RAID 50
-using either SAS or SATA II drives.
+These controllers support RAID 0, RAID 1, RAID 5, RAID 6, RAID 10, RAID 50 and
+RAID 60 using either SAS or SATA II drives.
.Pp
Although the controllers are actual RAID controllers,
the driver makes them look just like SCSI controllers.
Index: src/sys/dev/ic/mfi.c
diff -u src/sys/dev/ic/mfi.c:1.19.4.3 src/sys/dev/ic/mfi.c:1.19.4.4
--- src/sys/dev/ic/mfi.c:1.19.4.3 Wed Jan 27 21:40:25 2010
+++ src/sys/dev/ic/mfi.c Sun Mar 28 15:03:22 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: mfi.c,v 1.19.4.3 2010/01/27 21:40:25 sborrill Exp $ */
+/* $NetBSD: mfi.c,v 1.19.4.4 2010/03/28 15:03:22 snj 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.19.4.3 2010/01/27 21:40:25 sborrill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.19.4.4 2010/03/28 15:03:22 snj Exp $");
#include "bio.h"
@@ -92,7 +92,7 @@
static void mfi_mgmt_done(struct mfi_ccb *);
#if NBIO > 0
-static int mfi_ioctl(struct device *, u_long, void *);
+static int mfi_ioctl(device_t, u_long, void *);
static int mfi_ioctl_inq(struct mfi_softc *, struct bioc_inq *);
static int mfi_ioctl_vol(struct mfi_softc *, struct bioc_vol *);
static int mfi_ioctl_disk(struct mfi_softc *, struct bioc_disk *);
@@ -112,26 +112,38 @@
static void mfi_xscale_intr_ena(struct mfi_softc *sc);
static int mfi_xscale_intr(struct mfi_softc *sc);
static void mfi_xscale_post(struct mfi_softc *sc, struct mfi_ccb *ccb);
-
+
static const struct mfi_iop_ops mfi_iop_xscale = {
mfi_xscale_fw_state,
mfi_xscale_intr_ena,
mfi_xscale_intr,
mfi_xscale_post
};
-
+
static uint32_t mfi_ppc_fw_state(struct mfi_softc *sc);
static void mfi_ppc_intr_ena(struct mfi_softc *sc);
static int mfi_ppc_intr(struct mfi_softc *sc);
static void mfi_ppc_post(struct mfi_softc *sc, struct mfi_ccb *ccb);
-
+
static const struct mfi_iop_ops mfi_iop_ppc = {
mfi_ppc_fw_state,
mfi_ppc_intr_ena,
mfi_ppc_intr,
mfi_ppc_post
};
-
+
+uint32_t mfi_gen2_fw_state(struct mfi_softc *sc);
+void mfi_gen2_intr_ena(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_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_my_intr(_s) ((_s)->sc_iop->mio_intr(_s))
@@ -284,7 +296,7 @@
if (bus_dmamap_create(sc->sc_dmat, size, 1, size, 0,
BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &mm->am_map) != 0)
- goto amfree;
+ goto amfree;
if (bus_dmamem_alloc(sc->sc_dmat, size, PAGE_SIZE, 0, &mm->am_seg, 1,
&nsegs, BUS_DMA_NOWAIT) != 0)
@@ -617,6 +629,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);
}
@@ -701,7 +716,7 @@
sc->sc_ld[i].ld_present = 1;
memset(adapt, 0, sizeof(*adapt));
- adapt->adapt_dev = &sc->sc_dev;
+ adapt->adapt_dev = sc->sc_dev;
adapt->adapt_nchannels = 1;
if (sc->sc_ld_cnt)
adapt->adapt_openings = sc->sc_max_cmds / sc->sc_ld_cnt;
@@ -720,13 +735,13 @@
chan->chan_ntargets = MFI_MAX_LD;
chan->chan_id = MFI_MAX_LD;
- (void)config_found(&sc->sc_dev, &sc->sc_chan, scsiprint);
+ (void)config_found(sc->sc_dev, &sc->sc_chan, scsiprint);
/* enable interrupts */
mfi_intr_enable(sc);
#if NBIO > 0
- if (bio_register(&sc->sc_dev, mfi_ioctl) != 0)
+ if (bio_register(sc->sc_dev, mfi_ioctl) != 0)
panic("%s: controller registration failed", DEVNAME(sc));
if (mfi_create_sensors(sc) != 0)
aprint_error("%s: unable to create sensors\n", DEVNAME(sc));
@@ -790,7 +805,7 @@
ccb->ccb_flags |= MFI_CCB_F_ERR;
return 1;
}
-
+
return 0;
}
@@ -1003,7 +1018,7 @@
struct scsipi_periph *periph;
struct scsipi_xfer *xs;
struct scsipi_adapter *adapt = chan->chan_adapter;
- struct mfi_softc *sc = (void *) adapt->adapt_dev;
+ struct mfi_softc *sc = device_private(adapt->adapt_dev);
struct mfi_ccb *ccb;
struct scsi_rw_6 *rw;
struct scsipi_rw_10 *rwb;
@@ -1087,7 +1102,7 @@
case SCSI_TEST_UNIT_READY:
/* save off sd? after autoconf */
if (!cold) /* XXX bogus */
- strlcpy(sc->sc_ld[target].ld_dev, device_xname(&sc->sc_dev),
+ strlcpy(sc->sc_ld[target].ld_dev, device_xname(sc->sc_dev),
sizeof(sc->sc_ld[target].ld_dev));
/* FALLTHROUGH */
@@ -1207,7 +1222,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;
@@ -1310,15 +1326,15 @@
}
mfi_put_ccb(ccb);
scsipi_done(xs);
- } else
+ } else
wakeup(ccb);
}
#if NBIO > 0
int
-mfi_ioctl(struct device *dev, u_long cmd, void *addr)
+mfi_ioctl(device_t dev, u_long cmd, void *addr)
{
- struct mfi_softc *sc = (struct mfi_softc *)dev;
+ struct mfi_softc *sc = device_private(dev);
int error = 0;
int s;
@@ -1687,7 +1703,7 @@
memset(mbox, 0, sizeof mbox);
- *((uint16_t *)&mbox) = pd->mpl_address[i].mpa_pd_id;;
+ *((uint16_t *)&mbox) = pd->mpl_address[i].mpa_pd_id;
switch (bb->bb_status) {
case BIOC_SBUNBLINK:
@@ -1744,7 +1760,7 @@
memset(mbox, 0, sizeof mbox);
- *((uint16_t *)&mbox) = pd->mpl_address[i].mpa_pd_id;;
+ *((uint16_t *)&mbox) = pd->mpl_address[i].mpa_pd_id;
switch (bs->bs_status) {
case BIOC_SSONLINE:
@@ -1980,13 +1996,13 @@
{
return mfi_read(sc, MFI_OMSG0);
}
-
+
static void
mfi_xscale_intr_ena(struct mfi_softc *sc)
{
mfi_write(sc, MFI_OMSK, MFI_ENABLE_INTR);
}
-
+
static int
mfi_xscale_intr(struct mfi_softc *sc)
{
@@ -2000,7 +2016,7 @@
mfi_write(sc, MFI_OSTS, status);
return 1;
}
-
+
static void
mfi_xscale_post(struct mfi_softc *sc, struct mfi_ccb *ccb)
{
@@ -2014,37 +2030,72 @@
mfi_write(sc, MFI_IQP, (ccb->ccb_pframe >> 3) |
ccb->ccb_extra_frames);
}
-
+
static uint32_t
mfi_ppc_fw_state(struct mfi_softc *sc)
{
return mfi_read(sc, MFI_OSP);
}
-
+
static void
mfi_ppc_intr_ena(struct mfi_softc *sc)
{
mfi_write(sc, MFI_ODC, 0xffffffff);
mfi_write(sc, MFI_OMSK, ~0x80000004);
}
-
+
static int
mfi_ppc_intr(struct mfi_softc *sc)
{
uint32_t status;
-
+
status = mfi_read(sc, MFI_OSTS);
if (!ISSET(status, MFI_OSTS_PPC_INTR_VALID))
return 0;
-
+
/* write status back to acknowledge interrupt */
mfi_write(sc, MFI_ODC, status);
return 1;
}
-
+
static void
mfi_ppc_post(struct mfi_softc *sc, struct mfi_ccb *ccb)
{
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_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));
+}
Index: src/sys/dev/ic/mfireg.h
diff -u src/sys/dev/ic/mfireg.h:1.3 src/sys/dev/ic/mfireg.h:1.3.14.1
--- src/sys/dev/ic/mfireg.h:1.3 Mon Feb 25 10:46:02 2008
+++ src/sys/dev/ic/mfireg.h Sun Mar 28 15:03:22 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: mfireg.h,v 1.3 2008/02/25 10:46:02 xtraeme Exp $ */
+/* $NetBSD: mfireg.h,v 1.3.14.1 2010/03/28 15:03:22 snj Exp $ */
/* $OpenBSD: mfireg.h,v 1.24 2006/06/19 19:05:45 marco Exp $ */
/*
* Copyright (c) 2006 Marco Peereboom <[email protected]>
@@ -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 */
Index: src/sys/dev/ic/mfivar.h
diff -u src/sys/dev/ic/mfivar.h:1.10 src/sys/dev/ic/mfivar.h:1.10.6.1
--- src/sys/dev/ic/mfivar.h:1.10 Tue Jun 24 10:09:24 2008
+++ src/sys/dev/ic/mfivar.h Sun Mar 28 15:03:22 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: mfivar.h,v 1.10 2008/06/24 10:09:24 gmcgarry Exp $ */
+/* $NetBSD: mfivar.h,v 1.10.6.1 2010/03/28 15:03:22 snj Exp $ */
/* $OpenBSD: mfivar.h,v 1.28 2006/08/31 18:18:46 marco Exp $ */
/*
* Copyright (c) 2006 Marco Peereboom <[email protected]>
@@ -19,7 +19,7 @@
#include <dev/sysmon/sysmonvar.h>
#include <sys/envsys.h>
-#define DEVNAME(_s) (device_xname(&(_s)->sc_dev))
+#define DEVNAME(_s) (device_xname((_s)->sc_dev))
/* #define MFI_DEBUG */
#ifdef MFI_DEBUG
@@ -98,7 +98,8 @@
enum mfi_iop {
MFI_IOP_XSCALE,
- MFI_IOP_PPC
+ MFI_IOP_PPC,
+ MFI_IOP_GEN2
};
struct mfi_iop_ops {
@@ -109,7 +110,7 @@
};
struct mfi_softc {
- struct device sc_dev;
+ device_t sc_dev;
struct scsipi_channel sc_chan;
struct scsipi_adapter sc_adapt;
Index: src/sys/dev/pci/mfi_pci.c
diff -u src/sys/dev/pci/mfi_pci.c:1.5 src/sys/dev/pci/mfi_pci.c:1.5.14.1
--- src/sys/dev/pci/mfi_pci.c:1.5 Tue Feb 26 18:16:51 2008
+++ src/sys/dev/pci/mfi_pci.c Sun Mar 28 15:03:22 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: mfi_pci.c,v 1.5 2008/02/26 18:16:51 xtraeme Exp $ */
+/* $NetBSD: mfi_pci.c,v 1.5.14.1 2010/03/28 15:03:22 snj 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.5 2008/02/26 18:16:51 xtraeme Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfi_pci.c,v 1.5.14.1 2010/03/28 15:03:22 snj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -38,13 +38,14 @@
#include <dev/ic/mfivar.h>
#define MFI_BAR 0x10
+#define MFI_BAR_GEN2 0x14
#define MFI_PCI_MEMSIZE 0x2000 /* 8k */
const struct mfi_pci_device *mfi_pci_find_device(struct pci_attach_args *);
-int mfi_pci_match(struct device *, struct cfdata *, void *);
-void mfi_pci_attach(struct device *, struct device *, void *);
+int mfi_pci_match(device_t, cfdata_t, void *);
+void mfi_pci_attach(device_t, device_t, void *);
-CFATTACH_DECL(mfi_pci, sizeof(struct mfi_softc),
+CFATTACH_DECL_NEW(mfi_pci, sizeof(struct mfi_softc),
mfi_pci_match, mfi_pci_attach, NULL, NULL);
struct mfi_pci_subtype {
@@ -75,6 +76,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;
@@ -88,10 +94,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 *
@@ -112,15 +124,15 @@
}
int
-mfi_pci_match(struct device *parent, struct cfdata *match, void *aux)
+mfi_pci_match(device_t parent, cfdata_t match, void *aux)
{
return (mfi_pci_find_device(aux) != NULL) ? 1 : 0;
}
void
-mfi_pci_attach(struct device *parent, struct device *self, void *aux)
+mfi_pci_attach(device_t parent, device_t self, void *aux)
{
- struct mfi_softc *sc = (struct mfi_softc *)self;
+ struct mfi_softc *sc = device_private(self);
struct pci_attach_args *pa = aux;
const struct mfi_pci_device *mpd;
const struct mfi_pci_subtype *st;
@@ -128,12 +140,25 @@
pci_intr_handle_t ih;
bus_size_t size;
pcireg_t csr;
+ int regbar;
const char *subtype = NULL;
uint32_t subsysid;
- csr = pci_mapreg_type(pa->pa_pc, pa->pa_tag, MFI_BAR);
+ sc->sc_dev = self;
+ 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, &size)) {
aprint_error(": can't map controller pci space\n");
return;
@@ -157,8 +182,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;
Index: src/sys/dev/pci/pcidevs
diff -u src/sys/dev/pci/pcidevs:1.962.4.10 src/sys/dev/pci/pcidevs:1.962.4.11
--- src/sys/dev/pci/pcidevs:1.962.4.10 Wed Jan 27 22:27:42 2010
+++ src/sys/dev/pci/pcidevs Sun Mar 28 15:03:22 2010
@@ -1,4 +1,4 @@
-$NetBSD: pcidevs,v 1.962.4.10 2010/01/27 22:27:42 sborrill Exp $
+$NetBSD: pcidevs,v 1.962.4.11 2010/03/28 15:03:22 snj Exp $
/*
* Copyright (c) 1995, 1996 Christopher G. Demetriou
@@ -2967,6 +2967,10 @@
product SYMBIOS SAS1066 0x005E SAS1066
product SYMBIOS SAS1078 0x0060 SAS1078 PCI
product SYMBIOS SAS1078_PCIE 0x0062 SAS1078 PCI Express
+product SYMBIOS SAS2008 0x0072 SAS2008
+product SYMBIOS SAS2108_1 0x0078 MegaRAID SAS2108 CRYPTO GEN2
+product SYMBIOS SAS2108_2 0x0079 MegaRAID SAS2108 GEN2
+product SYMBIOS SAS1078DE 0x007c SAS1078DE
product SYMBIOS 875J 0x008f 53c875J
product SYMBIOS FC909 0x0620 FC909
product SYMBIOS FC909A 0x0621 FC909A