wl1271: Add support for NVS files with 5GHz band parameters
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>
Fri, 14 May 2010 07:46:23 +0000 (10:46 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 2 Jun 2010 20:13:05 +0000 (16:13 -0400)
This patch adds support for NVS files with 5GHz band parameters. The change
is done in a backward compatible manner - if 11a is not enabled in the driver,
the driver will allow also old NVS files to be loaded.

Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/wl12xx/wl1271_cmd.c
drivers/net/wireless/wl12xx/wl1271_ini.h
drivers/net/wireless/wl12xx/wl1271_main.c
drivers/net/wireless/wl12xx/wl1271_testmode.c

index 241b4778186539284c037059548e2afbe9217301..d7bcce887c4138a604f734dc0ed21367e1dfef34 100644 (file)
@@ -238,13 +238,20 @@ int wl1271_cmd_radio_parms(struct wl1271 *wl)
 
        radio_parms->test.id = TEST_CMD_INI_FILE_RADIO_PARAM;
 
+       /* 2.4GHz parameters */
        memcpy(&radio_parms->static_params_2, &wl->nvs->stat_radio_params_2,
               sizeof(struct wl1271_ini_band_params_2));
        memcpy(&radio_parms->dyn_params_2,
               &wl->nvs->dyn_radio_params_2[rparam->fem].params,
               sizeof(struct wl1271_ini_fem_params_2));
 
-       /* FIXME: current NVS is missing 5GHz parameters */
+       /* 5GHz parameters */
+       memcpy(&radio_parms->static_params_5,
+              &wl->nvs->stat_radio_params_5,
+              sizeof(struct wl1271_ini_band_params_5));
+       memcpy(&radio_parms->dyn_params_5,
+              &wl->nvs->dyn_radio_params_5[rparam->fem].params,
+              sizeof(struct wl1271_ini_fem_params_5));
 
        wl1271_dump(DEBUG_CMD, "TEST_CMD_INI_FILE_RADIO_PARAM: ",
                    radio_parms, sizeof(*radio_parms));
index d1590bc1bf831bfe51d245f919acf005c8f4bfd3..0fb156a5af1289f89a7d4b6f6e4ea0370e5cc740 100644 (file)
@@ -95,9 +95,10 @@ struct wl1271_ini_fem_params_5 {
 
 /* NVS data structure */
 #define WL1271_INI_NVS_SECTION_SIZE                 468
-#define WL1271_INI_SPARE_SIZE                       124
 #define WL1271_INI_FEM_MODULE_COUNT                  2
 
+#define WL1271_INI_LEGACY_NVS_FILE_SIZE              800
+
 struct wl1271_nvs_file {
        /* NVS section */
        u8 nvs[WL1271_INI_NVS_SECTION_SIZE];
@@ -111,8 +112,12 @@ struct wl1271_nvs_file {
                struct wl1271_ini_fem_params_2 params;
                u8 padding;
        } dyn_radio_params_2[WL1271_INI_FEM_MODULE_COUNT];
-
-       u8 ini_spare[WL1271_INI_SPARE_SIZE];
+       struct wl1271_ini_band_params_5 stat_radio_params_5;
+       u8 padding3;
+       struct {
+               struct wl1271_ini_fem_params_5 params;
+               u8 padding;
+       } dyn_radio_params_5[WL1271_INI_FEM_MODULE_COUNT];
 } __attribute__ ((packed));
 
 #endif
index b7d9137851acd1ec71af9fdcb3271a9a773082a0..5568f559a16b79ced765f30f35d7207c204a459a 100644 (file)
@@ -566,14 +566,21 @@ static int wl1271_fetch_nvs(struct wl1271 *wl)
                return ret;
        }
 
-       if (fw->size != sizeof(struct wl1271_nvs_file)) {
+       /*
+        * FIXME: the LEGACY NVS image support (NVS's missing the 5GHz band
+        * configurations) can be removed when those NVS files stop floating
+        * around.
+        */
+       if (fw->size != sizeof(struct wl1271_nvs_file) &&
+           (fw->size != WL1271_INI_LEGACY_NVS_FILE_SIZE ||
+            wl1271_11a_enabled())) {
                wl1271_error("nvs size is not as expected: %zu != %zu",
                             fw->size, sizeof(struct wl1271_nvs_file));
                ret = -EILSEQ;
                goto out;
        }
 
-       wl->nvs = kmalloc(sizeof(struct wl1271_nvs_file), GFP_KERNEL);
+       wl->nvs = kzalloc(sizeof(struct wl1271_nvs_file), GFP_KERNEL);
 
        if (!wl->nvs) {
                wl1271_error("could not allocate memory for the nvs file");
@@ -581,7 +588,7 @@ static int wl1271_fetch_nvs(struct wl1271 *wl)
                goto out;
        }
 
-       memcpy(wl->nvs, fw->data, sizeof(struct wl1271_nvs_file));
+       memcpy(wl->nvs, fw->data, fw->size);
 
 out:
        release_firmware(fw);
index 554deb4d024eae483d6895a5da9b86868d26c158..6e0952f79e9a79e942a4ed3182ab6f419cba07c6 100644 (file)
@@ -199,7 +199,14 @@ static int wl1271_tm_cmd_nvs_push(struct wl1271 *wl, struct nlattr *tb[])
        buf = nla_data(tb[WL1271_TM_ATTR_DATA]);
        len = nla_len(tb[WL1271_TM_ATTR_DATA]);
 
-       if (len != sizeof(struct wl1271_nvs_file)) {
+       /*
+        * FIXME: the LEGACY NVS image support (NVS's missing the 5GHz band
+        * configurations) can be removed when those NVS files stop floating
+        * around.
+        */
+       if (len != sizeof(struct wl1271_nvs_file) &&
+           (len != WL1271_INI_LEGACY_NVS_FILE_SIZE ||
+            wl1271_11a_enabled())) {
                wl1271_error("nvs size is not as expected: %zu != %zu",
                             len, sizeof(struct wl1271_nvs_file));
                return -EMSGSIZE;
@@ -209,7 +216,7 @@ static int wl1271_tm_cmd_nvs_push(struct wl1271 *wl, struct nlattr *tb[])
 
        kfree(wl->nvs);
 
-       wl->nvs = kmalloc(sizeof(struct wl1271_nvs_file), GFP_KERNEL);
+       wl->nvs = kzalloc(sizeof(struct wl1271_nvs_file), GFP_KERNEL);
        if (!wl->nvs) {
                wl1271_error("could not allocate memory for the nvs file");
                ret = -ENOMEM;