wl18xx: fallback to default conf in case of invalid conf file
authorEliad Peller <eliad@wizery.com>
Wed, 6 May 2015 08:29:54 +0000 (11:29 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Sat, 9 May 2015 13:49:16 +0000 (16:49 +0300)
If the wl18xx-conf.bin file is missing or invalid (e.g. due
to recent driver change), fallback to default configuration
instead of failing driver load.

Reported-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ti/wl18xx/main.c

index dc48448..49aca2c 100644 (file)
@@ -1375,9 +1375,10 @@ out:
 }
 
 #define WL18XX_CONF_FILE_NAME "ti-connectivity/wl18xx-conf.bin"
-static int wl18xx_conf_init(struct wl1271 *wl, struct device *dev)
+
+static int wl18xx_load_conf_file(struct device *dev, struct wlcore_conf *conf,
+                                struct wl18xx_priv_conf *priv_conf)
 {
-       struct wl18xx_priv *priv = wl->priv;
        struct wlcore_conf_file *conf_file;
        const struct firmware *fw;
        int ret;
@@ -1386,14 +1387,14 @@ static int wl18xx_conf_init(struct wl1271 *wl, struct device *dev)
        if (ret < 0) {
                wl1271_error("could not get configuration binary %s: %d",
                             WL18XX_CONF_FILE_NAME, ret);
-               goto out_fallback;
+               return ret;
        }
 
        if (fw->size != WL18XX_CONF_SIZE) {
                wl1271_error("configuration binary file size is wrong, expected %zu got %zu",
                             WL18XX_CONF_SIZE, fw->size);
                ret = -EINVAL;
-               goto out;
+               goto out_release;
        }
 
        conf_file = (struct wlcore_conf_file *) fw->data;
@@ -1403,7 +1404,7 @@ static int wl18xx_conf_init(struct wl1271 *wl, struct device *dev)
                             "expected 0x%0x got 0x%0x", WL18XX_CONF_MAGIC,
                             conf_file->header.magic);
                ret = -EINVAL;
-               goto out;
+               goto out_release;
        }
 
        if (conf_file->header.version != cpu_to_le32(WL18XX_CONF_VERSION)) {
@@ -1411,28 +1412,32 @@ static int wl18xx_conf_init(struct wl1271 *wl, struct device *dev)
                             "expected 0x%08x got 0x%08x",
                             WL18XX_CONF_VERSION, conf_file->header.version);
                ret = -EINVAL;
-               goto out;
+               goto out_release;
        }
 
-       memcpy(&wl->conf, &conf_file->core, sizeof(wl18xx_conf));
-       memcpy(&priv->conf, &conf_file->priv, sizeof(priv->conf));
+       memcpy(conf, &conf_file->core, sizeof(*conf));
+       memcpy(priv_conf, &conf_file->priv, sizeof(*priv_conf));
 
-       goto out;
+out_release:
+       release_firmware(fw);
+       return ret;
+}
 
-out_fallback:
-       wl1271_warning("falling back to default config");
+static int wl18xx_conf_init(struct wl1271 *wl, struct device *dev)
+{
+       struct wl18xx_priv *priv = wl->priv;
 
-       /* apply driver default configuration */
-       memcpy(&wl->conf, &wl18xx_conf, sizeof(wl18xx_conf));
-       /* apply default private configuration */
-       memcpy(&priv->conf, &wl18xx_default_priv_conf, sizeof(priv->conf));
+       if (wl18xx_load_conf_file(dev, &wl->conf, &priv->conf) < 0) {
+               wl1271_warning("falling back to default config");
 
-       /* For now we just fallback */
-       return 0;
+               /* apply driver default configuration */
+               memcpy(&wl->conf, &wl18xx_conf, sizeof(wl->conf));
+               /* apply default private configuration */
+               memcpy(&priv->conf, &wl18xx_default_priv_conf,
+                      sizeof(priv->conf));
+       }
 
-out:
-       release_firmware(fw);
-       return ret;
+       return 0;
 }
 
 static int wl18xx_plt_init(struct wl1271 *wl)