Author: scottl
Date: Fri Feb  7 12:15:39 2020
New Revision: 357651
URL: https://svnweb.freebsd.org/changeset/base/357651

Log:
  Advertise the MPI Message Version that's contained in the IOCFacts message
  in the sysctl block for the driver.  mpsutil/mprutil needs this so it can
  know how big of a buffer to allocate when requesting the IOCFacts from the
  controller.  This eliminates the kernel console messages about wrong
  allocation sizes.
  
  Reported by:  imp

Modified:
  head/sys/dev/mpr/mpr.c
  head/sys/dev/mpr/mprvar.h
  head/sys/dev/mps/mps.c
  head/sys/dev/mps/mpsvar.h
  head/usr.sbin/mpsutil/mps_cmd.c

Modified: head/sys/dev/mpr/mpr.c
==============================================================================
--- head/sys/dev/mpr/mpr.c      Fri Feb  7 11:48:26 2020        (r357650)
+++ head/sys/dev/mpr/mpr.c      Fri Feb  7 12:15:39 2020        (r357651)
@@ -520,6 +520,12 @@ mpr_iocfacts_allocate(struct mpr_softc *sc, uint8_t at
            sc->facts->FWVersion.Struct.Unit,
            sc->facts->FWVersion.Struct.Dev);
 
+       snprintf(sc->msg_version, sizeof(sc->msg_version), "%d.%d",
+           (sc->facts->MsgVersion & MPI2_IOCFACTS_MSGVERSION_MAJOR_MASK) >>
+           MPI2_IOCFACTS_MSGVERSION_MAJOR_SHIFT,
+           (sc->facts->MsgVersion & MPI2_IOCFACTS_MSGVERSION_MINOR_MASK) >>
+           MPI2_IOCFACTS_MSGVERSION_MINOR_SHIFT);
+
        mpr_dprint(sc, MPR_INFO, "Firmware: %s, Driver: %s\n", sc->fw_version,
            MPR_DRIVER_VERSION);
        mpr_dprint(sc, MPR_INFO,
@@ -1833,12 +1839,16 @@ mpr_setup_sysctl(struct mpr_softc *sc)
            "Total number of event frames allocated");
 
        SYSCTL_ADD_STRING(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
-           OID_AUTO, "firmware_version", CTLFLAG_RW, sc->fw_version,
+           OID_AUTO, "firmware_version", CTLFLAG_RD, sc->fw_version,
            strlen(sc->fw_version), "firmware version");
 
        SYSCTL_ADD_STRING(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
-           OID_AUTO, "driver_version", CTLFLAG_RW, MPR_DRIVER_VERSION,
+           OID_AUTO, "driver_version", CTLFLAG_RD, MPR_DRIVER_VERSION,
            strlen(MPR_DRIVER_VERSION), "driver version");
+
+       SYSCTL_ADD_STRING(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
+           OID_AUTO, "msg_version", CTLFLAG_RD, sc->msg_version,
+           strlen(sc->msg_version), "message interface version");
 
        SYSCTL_ADD_INT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
            OID_AUTO, "io_cmds_active", CTLFLAG_RD,

Modified: head/sys/dev/mpr/mprvar.h
==============================================================================
--- head/sys/dev/mpr/mprvar.h   Fri Feb  7 11:48:26 2020        (r357650)
+++ head/sys/dev/mpr/mprvar.h   Fri Feb  7 12:15:39 2020        (r357651)
@@ -372,6 +372,7 @@ struct mpr_softc {
        struct sysctl_ctx_list          sysctl_ctx;
        struct sysctl_oid               *sysctl_tree;
        char                            fw_version[16];
+       char                            msg_version[8];
        struct mpr_command              *commands;
        struct mpr_chain                *chains;
        struct mpr_prp_page             *prps;

Modified: head/sys/dev/mps/mps.c
==============================================================================
--- head/sys/dev/mps/mps.c      Fri Feb  7 11:48:26 2020        (r357650)
+++ head/sys/dev/mps/mps.c      Fri Feb  7 12:15:39 2020        (r357651)
@@ -498,6 +498,12 @@ mps_iocfacts_allocate(struct mps_softc *sc, uint8_t at
            sc->facts->FWVersion.Struct.Unit,
            sc->facts->FWVersion.Struct.Dev);
 
+       snprintf(sc->msg_version, sizeof(sc->msg_version), "%d.%d",
+           (sc->facts->MsgVersion & MPI2_IOCFACTS_MSGVERSION_MAJOR_MASK) >>
+           MPI2_IOCFACTS_MSGVERSION_MAJOR_SHIFT, 
+           (sc->facts->MsgVersion & MPI2_IOCFACTS_MSGVERSION_MINOR_MASK) >>
+           MPI2_IOCFACTS_MSGVERSION_MINOR_SHIFT);
+
        mps_dprint(sc, MPS_INFO, "Firmware: %s, Driver: %s\n", sc->fw_version,
            MPS_DRIVER_VERSION);
        mps_dprint(sc, MPS_INFO, "IOCCapabilities: %b\n",
@@ -1742,12 +1748,16 @@ mps_setup_sysctl(struct mps_softc *sc)
            "Total number of event frames allocated");
 
        SYSCTL_ADD_STRING(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
-           OID_AUTO, "firmware_version", CTLFLAG_RW, sc->fw_version,
+           OID_AUTO, "firmware_version", CTLFLAG_RD, sc->fw_version,
            strlen(sc->fw_version), "firmware version");
 
        SYSCTL_ADD_STRING(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
-           OID_AUTO, "driver_version", CTLFLAG_RW, MPS_DRIVER_VERSION,
+           OID_AUTO, "driver_version", CTLFLAG_RD, MPS_DRIVER_VERSION,
            strlen(MPS_DRIVER_VERSION), "driver version");
+
+       SYSCTL_ADD_STRING(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
+           OID_AUTO, "msg_version", CTLFLAG_RD, sc->msg_version,
+           strlen(sc->msg_version), "message interface version");
 
        SYSCTL_ADD_INT(sysctl_ctx, SYSCTL_CHILDREN(sysctl_tree),
            OID_AUTO, "io_cmds_active", CTLFLAG_RD,

Modified: head/sys/dev/mps/mpsvar.h
==============================================================================
--- head/sys/dev/mps/mpsvar.h   Fri Feb  7 11:48:26 2020        (r357650)
+++ head/sys/dev/mps/mpsvar.h   Fri Feb  7 12:15:39 2020        (r357651)
@@ -330,6 +330,7 @@ struct mps_softc {
        struct sysctl_ctx_list          sysctl_ctx;
        struct sysctl_oid               *sysctl_tree;
        char                            fw_version[16];
+       char                            msg_version[8];
        struct mps_command              *commands;
        struct mps_chain                *chains;
        struct callout                  periodic;

Modified: head/usr.sbin/mpsutil/mps_cmd.c
==============================================================================
--- head/usr.sbin/mpsutil/mps_cmd.c     Fri Feb  7 11:48:26 2020        
(r357650)
+++ head/usr.sbin/mpsutil/mps_cmd.c     Fri Feb  7 12:15:39 2020        
(r357651)
@@ -724,23 +724,36 @@ mps_get_iocfacts(int fd)
 {
        MPI2_IOC_FACTS_REPLY *facts;
        MPI2_IOC_FACTS_REQUEST req;
+       char msgver[8], sysctlname[128];
+       size_t len, factslen;
        int error;
 
-       facts = malloc(sizeof(MPI2_IOC_FACTS_REPLY));
+       snprintf(sysctlname, sizeof(sysctlname), "dev.%s.%d.msg_version",
+           is_mps ? "mps" : "mpr", mps_unit);
+
+       factslen = sizeof(MPI2_IOC_FACTS_REPLY);
+       len = sizeof(msgver);
+       error = sysctlbyname(sysctlname, msgver, &len, NULL, 0);
+       if (error == 0) {
+               if (strncmp(msgver, "2.6", sizeof(msgver)) == 0)
+                       factslen += 4;
+       }
+
+       facts = malloc(factslen);
        if (facts == NULL) {
                errno = ENOMEM;
                return (NULL);
        }
 
-       bzero(&req, sizeof(MPI2_IOC_FACTS_REQUEST));
+       bzero(&req, factslen);
        req.Function = MPI2_FUNCTION_IOC_FACTS;
 
 #if 1
        error = mps_pass_command(fd, &req, sizeof(MPI2_IOC_FACTS_REQUEST),
-           facts, sizeof(MPI2_IOC_FACTS_REPLY), NULL, 0, NULL, 0, 10);
+           facts, factslen, NULL, 0, NULL, 0, 10);
 #else
        error = mps_user_command(fd, &req, sizeof(MPI2_IOC_FACTS_REQUEST),
-           facts, sizeof(MPI2_IOC_FACTS_REPLY), NULL, 0, 0);
+           facts, factslen, NULL, 0, 0);
 #endif
        if (error) {
                free(facts);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to