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 <ma...@peereboom.us> @@ -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 <ma...@peereboom.us> @@ -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 <ma...@peereboom.us> @@ -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 <ma...@peereboom.us> @@ -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 <ma...@peereboom.us> @@ -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