Source-Changes-HG archive

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

[src/netbsd-8]: src Pull up following revision(s) via patch (requested by msa...



details:   https://anonhg.NetBSD.org/src/rev/982646defdc7
branches:  netbsd-8
changeset: 366184:982646defdc7
user:      bouyer <bouyer%NetBSD.org@localhost>
date:      Tue May 17 10:33:46 2022 +0000

description:
Pull up following revision(s) via patch (requested by msaitoh in ticket #1454):
        sys/dev/ic/mfi.c: revisions 1.63, 1.66-77
        sys/dev/ic/mfireg.h: revisions 1.11-1.20 via patch
        sys/dev/pci/mfi_pci.c: revision 1.21
        sys/dev/pci/mfii.c: revisions 1.6-1.7, 1.10-1.15
        share/man/man4/mfi.4: revision 1.13

Improve mfi(4) and mfii(4):
- Set 'ld_sync' to NULL as part of 'again', to prevent use-after-free.
- Add some code for the SKINNY variant to make Dell PERC H310 work.
- Print the percentage correctly when the background initialization is
  running.
- Clear mailbox to not to pass garbage data.
- Use union mbox instead of unit8_t xxx[] to avoid unaligned access.
- Set stripe size for BIOCVOL to show the size correctly in bioctl.
- Add support for iBBU-09 to show BBU voltage, current and temperature
  correctly.
- Fix typos in comments.
- Sprinkle static.
- Improve debug printf()s.
- KNF. Remove extra semicolon. Whitespace fixes.

diffstat:

 share/man/man4/mfi.4  |   15 +-
 sys/dev/ic/mfi.c      |  243 +++++++++++++++-------------
 sys/dev/ic/mfireg.h   |  410 +++++++++++++++++++++++++------------------------
 sys/dev/pci/mfi_pci.c |    5 +-
 sys/dev/pci/mfii.c    |  349 +++++++++++++++++++++--------------------
 5 files changed, 527 insertions(+), 495 deletions(-)

diffs (truncated from 2510 to 300 lines):

diff -r e598e2d97a4a -r 982646defdc7 share/man/man4/mfi.4
--- a/share/man/man4/mfi.4      Sun May 15 12:18:18 2022 +0000
+++ b/share/man/man4/mfi.4      Tue May 17 10:33:46 2022 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: mfi.4,v 1.11.24.1 2019/09/02 16:39:20 martin Exp $
+.\"    $NetBSD: mfi.4,v 1.11.24.2 2022/05/17 10:33:46 bouyer Exp $
 .\"    $OpenBSD: mfi.4,v 1.7 2006/09/01 09:58:09 jmc Exp $
 .\"
 .\" Written by Marco Peereboom <marco%peereboom.us@localhost>
@@ -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 March 22, 2012
+.Dd May 5, 2022
 .Dt MFI 4
 .Os
 .Sh NAME
@@ -43,7 +43,10 @@
 Dell PERC 5/e,
 PERC 5/i,
 PERC 6/e,
-PERC 6/i
+PERC 6/i,
+PERC H310,
+PERC H700,
+PERC H800
 .It
 Intel RAID Controller SRCSAS18E,
 SRCSAS144E
@@ -56,9 +59,11 @@
 MegaRAID SAS 8408E,
 MegaRAID SAS 8480E,
 MegaRAID SAS 8708ELP,
+MegaRAID SAS 8880EM2,
 MegaRAID SAS 8888ELP,
-MegaRAID SAS 8880EM2,
-MegaRAID SAS 9260-8i
+MegaRAID SAS 9260-8i,
+MegaRAID SAS 9261-8i,
+MegaRAID SAS 9265-8i
 .It
 IBM ServeRAID M1015,
 ServeRAID M5014
diff -r e598e2d97a4a -r 982646defdc7 sys/dev/ic/mfi.c
--- a/sys/dev/ic/mfi.c  Sun May 15 12:18:18 2022 +0000
+++ b/sys/dev/ic/mfi.c  Tue May 17 10:33:46 2022 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mfi.c,v 1.57.10.1 2018/12/07 17:11:37 martin Exp $ */
+/* $NetBSD: mfi.c,v 1.57.10.2 2022/05/17 10:33:46 bouyer Exp $ */
 /* $OpenBSD: mfi.c,v 1.66 2006/11/28 23:59:45 dlg Exp $ */
 
 /*
@@ -73,7 +73,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.57.10.1 2018/12/07 17:11:37 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.57.10.2 2022/05/17 10:33:46 bouyer Exp $");
 
 #include "bio.h"
 
@@ -110,7 +110,7 @@
 
 #ifdef MFI_DEBUG
 uint32_t       mfi_debug = 0
-/*                 | MFI_D_CMD  */
+/*                 | MFI_D_CMD */
 /*                 | MFI_D_INTR */
 /*                 | MFI_D_MISC */
 /*                 | MFI_D_DMA */
@@ -154,9 +154,11 @@
 static void            mfi_scsi_ld_done(struct mfi_ccb *);
 static void            mfi_scsi_xs_done(struct mfi_ccb *, int, int);
 static int             mfi_mgmt_internal(struct mfi_softc *, uint32_t,
-                           uint32_t, uint32_t, void *, uint8_t *, bool);
+                           uint32_t, uint32_t, void *, const union mfi_mbox *,
+                           bool);
 static int             mfi_mgmt(struct mfi_ccb *,struct scsipi_xfer *,
-                           uint32_t, uint32_t, uint32_t, void *, uint8_t *);
+                           uint32_t, uint32_t, uint32_t, void *,
+                           const union mfi_mbox *);
 static void            mfi_mgmt_done(struct mfi_ccb *);
 
 #if NBIO > 0
@@ -201,10 +203,10 @@
 extern struct cfdriver mfi_cd;
 
 static uint32_t        mfi_xscale_fw_state(struct mfi_softc *sc);
-static void            mfi_xscale_intr_ena(struct mfi_softc *sc);
-static void            mfi_xscale_intr_dis(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 void            mfi_xscale_intr_ena(struct mfi_softc *sc);
+static void            mfi_xscale_intr_dis(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,
@@ -216,10 +218,10 @@
 };
 
 static uint32_t        mfi_ppc_fw_state(struct mfi_softc *sc);
-static void            mfi_ppc_intr_ena(struct mfi_softc *sc);
-static void            mfi_ppc_intr_dis(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 void            mfi_ppc_intr_ena(struct mfi_softc *sc);
+static void            mfi_ppc_intr_dis(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,
@@ -285,11 +287,11 @@
        mfi_tbolt_scsi_ld_io,
 };
 
-#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))
-#define mfi_my_intr(_s)        ((_s)->sc_iop->mio_intr(_s))
-#define mfi_post(_s, _c)       ((_s)->sc_iop->mio_post((_s), (_c)))
+#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))
+#define mfi_my_intr(_s)                ((_s)->sc_iop->mio_intr(_s))
+#define mfi_post(_s, _c)       ((_s)->sc_iop->mio_post((_s), (_c)))
 
 static struct mfi_ccb *
 mfi_get_ccb(struct mfi_softc *sc)
@@ -439,11 +441,11 @@
                }
 
                DNPRINTF(MFI_D_CCB,
-                   "ccb(%d): %p frame: %#lx (%#lx) sense: %#lx (%#lx) map: %#lx\n",
+                   "ccb(%d): %p frame: %p (%#lx) sense: %p (%#lx) map: %p\n",
                    ccb->ccb_frame->mfr_header.mfh_context, ccb,
-                   (u_long)ccb->ccb_frame, (u_long)ccb->ccb_pframe,
-                   (u_long)ccb->ccb_sense, (u_long)ccb->ccb_psense,
-                   (u_long)ccb->ccb_dmamap);
+                   ccb->ccb_frame, (u_long)ccb->ccb_pframe,
+                   ccb->ccb_sense, (u_long)ccb->ccb_psense,
+                   ccb->ccb_dmamap);
 
                /* add ccb to queue */
                mfi_put_ccb(ccb);
@@ -472,14 +474,14 @@
            BUS_SPACE_BARRIER_READ);
        rv = bus_space_read_4(sc->sc_iot, sc->sc_ioh, r);
 
-       DNPRINTF(MFI_D_RW, "%s: mr 0x%lx 0x08%x ", DEVNAME(sc), (u_long)r, rv);
+       DNPRINTF(MFI_D_RW, "%s: mr %#zx 0x08%x ", DEVNAME(sc), r, rv);
        return rv;
 }
 
 static void
 mfi_write(struct mfi_softc *sc, bus_size_t r, uint32_t v)
 {
-       DNPRINTF(MFI_D_RW, "%s: mw 0x%lx 0x%08x", DEVNAME(sc), (u_long)r, v);
+       DNPRINTF(MFI_D_RW, "%s: mw %#zx 0x%08x", DEVNAME(sc), r, v);
 
        bus_space_write_4(sc->sc_iot, sc->sc_ioh, r, v);
        bus_space_barrier(sc->sc_iot, sc->sc_ioh, r, 4,
@@ -492,8 +494,8 @@
        struct mfi_mem          *mm;
        int                     nsegs;
 
-       DNPRINTF(MFI_D_MEM, "%s: mfi_allocmem: %ld\n", DEVNAME(sc),
-           (long)size);
+       DNPRINTF(MFI_D_MEM, "%s: mfi_allocmem: %zu\n", DEVNAME(sc),
+           size);
 
        mm = malloc(sizeof(struct mfi_mem), M_DEVBUF, M_NOWAIT|M_ZERO);
        if (mm == NULL)
@@ -585,7 +587,7 @@
                case MFI_STATE_OPERATIONAL:
                        if (sc->sc_ioptype == MFI_IOP_SKINNY ||
                            sc->sc_ioptype == MFI_IOP_TBOLT)
-                               mfi_write(sc, MFI_SKINNY_IDB, MFI_INIT_READY);
+                               mfi_write(sc, MFI_SKINNY_IDB, MFI_RESET_FLAGS);
                        else
                                mfi_write(sc, MFI_IDB, MFI_INIT_READY);
                        max_wait = 10;
@@ -687,7 +689,6 @@
                return 1;
 
 #ifdef MFI_DEBUG
-
        for (i = 0; i < sc->sc_info.mci_image_component_count; i++) {
                printf("%s: active FW %s Version %s date %s time %s\n",
                    DEVNAME(sc),
@@ -848,7 +849,7 @@
            "status 0x%x\n", stat->battery_type, stat->voltage, stat->current,
            stat->temperature, stat->fw_status);
        printf("details: ");
-       switch(stat->battery_type) {
+       switch (stat->battery_type) {
        case MFI_BBU_TYPE_IBBU:
                printf("guage %d relative charge %d charger state %d "
                    "charger ctrl %d\n", stat->detail.ibbu.gas_guage_status,
@@ -869,13 +870,14 @@
                    stat->detail.bbu.remaining_capacity ,
                    stat->detail.bbu.full_charge_capacity ,
                    stat->detail.bbu.is_SOH_good);
+               break;
        default:
                printf("\n");
        }
 #endif
-       switch(stat->battery_type) {
+       switch (stat->battery_type) {
        case MFI_BBU_TYPE_BBU:
-               return (stat->detail.bbu.is_SOH_good ? 
+               return (stat->detail.bbu.is_SOH_good ?
                    MFI_BBU_GOOD : MFI_BBU_BAD);
        case MFI_BBU_TYPE_NONE:
                return MFI_BBU_UNKNOWN;
@@ -971,20 +973,22 @@
 mfi_shutdown(device_t dev, int how)
 {
        struct mfi_softc        *sc = device_private(dev);
-       uint8_t                 mbox[MFI_MBOX_SIZE];
+       union mfi_mbox          mbox;
        int s = splbio();
+
        DNPRINTF(MFI_D_MISC, "%s: mfi_shutdown\n", DEVNAME(sc));
        if (sc->sc_running) {
-               mbox[0] = MR_FLUSH_CTRL_CACHE | MR_FLUSH_DISK_CACHE;
+               memset(&mbox, 0, sizeof(mbox));
+               mbox.b[0] = MR_FLUSH_CTRL_CACHE | MR_FLUSH_DISK_CACHE;
                if (mfi_mgmt_internal(sc, MR_DCMD_CTRL_CACHE_FLUSH,
-                   MFI_DATA_NONE, 0, NULL, mbox, true)) {
+                   MFI_DATA_NONE, 0, NULL, &mbox, true)) {
                        aprint_error_dev(dev, "shutdown: cache flush failed\n");
                        goto fail;
                }
 
-               mbox[0] = 0;
+               mbox.b[0] = 0;
                if (mfi_mgmt_internal(sc, MR_DCMD_CTRL_SHUTDOWN,
-                   MFI_DATA_NONE, 0, NULL, mbox, true)) {
+                   MFI_DATA_NONE, 0, NULL, &mbox, true)) {
                        aprint_error_dev(dev, "shutdown: "
                            "firmware shutdown failed\n");
                        goto fail;
@@ -1041,7 +1045,7 @@
                sc->sc_iop = &mfi_iop_tbolt;
                break;
        default:
-                panic("%s: unknown iop %d", DEVNAME(sc), iop);
+               panic("%s: unknown iop %d", DEVNAME(sc), iop);
        }
 
        if (mfi_transition_firmware(sc))
@@ -1062,13 +1066,15 @@
                sc->sc_max_sgl = max_sgl;
                sc->sc_sgl_size = sizeof(struct mfi_sg32);
        }
+       if (sc->sc_ioptype == MFI_IOP_SKINNY)
+               sc->sc_sgl_size = sizeof(struct mfi_sg_ieee);
        DNPRINTF(MFI_D_MISC, "%s: max commands: %u, max sgl: %u\n",
            DEVNAME(sc), sc->sc_max_cmds, sc->sc_max_sgl);
 
        if (sc->sc_ioptype == MFI_IOP_TBOLT) {
                uint32_t tb_mem_size;
                /* for Alignment */
-               tb_mem_size = MEGASAS_THUNDERBOLT_MSG_ALLIGNMENT;
+               tb_mem_size = MEGASAS_THUNDERBOLT_MSG_ALIGNMENT;
 
                tb_mem_size +=
                    MEGASAS_THUNDERBOLT_NEW_MSG_SIZE * (sc->sc_max_cmds + 1);
@@ -1204,7 +1210,7 @@
                        aprint_normal("unknown type %d", bbu_stat.battery_type);
                }
                aprint_normal(", status ");
-               switch(mfi_bbu_status) {
+               switch (mfi_bbu_status) {
                case MFI_BBU_GOOD:
                        aprint_normal("good\n");
                        sc->sc_bbuok = true;
@@ -1371,8 +1377,7 @@
 
        pcq = MFIMEM_KVA(sc->sc_pcq);
 
-       DNPRINTF(MFI_D_INTR, "%s: mfi_intr %#lx %#lx\n", DEVNAME(sc),
-           (u_long)sc, (u_long)pcq);
+       DNPRINTF(MFI_D_INTR, "%s: mfi_intr %p %p\n", DEVNAME(sc), sc, pcq);
 
        bus_dmamap_sync(sc->sc_dmat, MFIMEM_MAP(sc->sc_pcq), 0,
            sizeof(uint32_t) * sc->sc_max_cmds + sizeof(struct mfi_prod_cons),
@@ -1476,8 +1481,8 @@
        struct scsipi_xfer      *xs = ccb->ccb_xs;
        struct mfi_softc        *sc = ccb->ccb_sc;
 
-       DNPRINTF(MFI_D_INTR, "%s: mfi_scsi_xs_done %#lx %#lx\n",
-           DEVNAME(sc), (u_long)ccb, (u_long)ccb->ccb_frame);
+       DNPRINTF(MFI_D_INTR, "%s: mfi_scsi_xs_done %p %p\n",
+           DEVNAME(sc), ccb, ccb->ccb_frame);



Home | Main Index | Thread Index | Old Index