staging: fsl-mc: Changed version matching rules for MC object drivers
authorJ. German Rivera <German.Rivera@freescale.com>
Fri, 27 Mar 2015 21:01:09 +0000 (16:01 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 3 Apr 2015 11:55:03 +0000 (13:55 +0200)
Before this change, we were requiring a complete version match (major and
minor version numbers) between MC objects and corresponding drivers, to
allow MC objects to be bound to their drivers. We realized that a mismatch
in minor version numbers should be tolerated, as long as the major version
numbers match. This allows the driver to decide what to do in the minor
version mismatch case. For example, a driver may decide to run with
downgraded functionality if the MC firmware object has older minor version
number than the driver. Also, a driver with older minor version than the
MC firmware object may decide to run even though it cannot use newer
functionality of the MC object.

As part of this change, the dpmng Flib version was also updated
to match the latest MC firmware version.

Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/fsl-mc/bus/mc-bus.c
drivers/staging/fsl-mc/include/dpmng.h

index b347db927484e3e732c5eb9ebb57be776faec164..23512d09642728cad7bcb95103e54e850b73152f 100644 (file)
@@ -36,6 +36,8 @@ static int fsl_mc_bus_match(struct device *dev, struct device_driver *drv)
        struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
        struct fsl_mc_driver *mc_drv = to_fsl_mc_driver(drv);
        bool found = false;
+       bool major_version_mismatch = false;
+       bool minor_version_mismatch = false;
 
        if (WARN_ON(!fsl_mc_bus_type.dev_root))
                goto out;
@@ -57,14 +59,33 @@ static int fsl_mc_bus_match(struct device *dev, struct device_driver *drv)
         */
        for (id = mc_drv->match_id_table; id->vendor != 0x0; id++) {
                if (id->vendor == mc_dev->obj_desc.vendor &&
-                   strcmp(id->obj_type, mc_dev->obj_desc.type) == 0 &&
-                   id->ver_major == mc_dev->obj_desc.ver_major &&
-                   id->ver_minor == mc_dev->obj_desc.ver_minor) {
-                       found = true;
+                   strcmp(id->obj_type, mc_dev->obj_desc.type) == 0) {
+                       if (id->ver_major == mc_dev->obj_desc.ver_major) {
+                               found = true;
+                               if (id->ver_minor != mc_dev->obj_desc.ver_minor)
+                                       minor_version_mismatch = true;
+                       } else {
+                               major_version_mismatch = true;
+                       }
+
                        break;
                }
        }
 
+       if (major_version_mismatch) {
+               dev_warn(dev,
+                        "Major version mismatch: driver version %u.%u, MC object version %u.%u\n",
+                        id->ver_major, id->ver_minor,
+                        mc_dev->obj_desc.ver_major,
+                        mc_dev->obj_desc.ver_minor);
+       } else if (minor_version_mismatch) {
+               dev_warn(dev,
+                        "Minor version mismatch: driver version %u.%u, MC object version %u.%u\n",
+                        id->ver_major, id->ver_minor,
+                        mc_dev->obj_desc.ver_major,
+                        mc_dev->obj_desc.ver_minor);
+       }
+
 out:
        dev_dbg(dev, "%smatched\n", found ? "" : "not ");
        return found;
index 0fc0a57490bb69f580e5fd15f56d8cb2235ae68e..1b052b83099386f7e7c4894d8287781cb90ce1c2 100644 (file)
@@ -41,7 +41,7 @@ struct fsl_mc_io;
 /**
  * Management Complex firmware version information
  */
-#define MC_VER_MAJOR 5
+#define MC_VER_MAJOR 6
 #define MC_VER_MINOR 0
 
 /**