Commit a7da74fc authored by Juuso Oikarinen's avatar Juuso Oikarinen Committed by John W. Linville

wl1271: Add support for NVS files with 5GHz band parameters

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: default avatarJuuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent eb70eb72
...@@ -238,13 +238,20 @@ int wl1271_cmd_radio_parms(struct wl1271 *wl) ...@@ -238,13 +238,20 @@ int wl1271_cmd_radio_parms(struct wl1271 *wl)
radio_parms->test.id = TEST_CMD_INI_FILE_RADIO_PARAM; 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, memcpy(&radio_parms->static_params_2, &wl->nvs->stat_radio_params_2,
sizeof(struct wl1271_ini_band_params_2)); sizeof(struct wl1271_ini_band_params_2));
memcpy(&radio_parms->dyn_params_2, memcpy(&radio_parms->dyn_params_2,
&wl->nvs->dyn_radio_params_2[rparam->fem].params, &wl->nvs->dyn_radio_params_2[rparam->fem].params,
sizeof(struct wl1271_ini_fem_params_2)); 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: ", wl1271_dump(DEBUG_CMD, "TEST_CMD_INI_FILE_RADIO_PARAM: ",
radio_parms, sizeof(*radio_parms)); radio_parms, sizeof(*radio_parms));
......
...@@ -95,9 +95,10 @@ struct wl1271_ini_fem_params_5 { ...@@ -95,9 +95,10 @@ struct wl1271_ini_fem_params_5 {
/* NVS data structure */ /* NVS data structure */
#define WL1271_INI_NVS_SECTION_SIZE 468 #define WL1271_INI_NVS_SECTION_SIZE 468
#define WL1271_INI_SPARE_SIZE 124
#define WL1271_INI_FEM_MODULE_COUNT 2 #define WL1271_INI_FEM_MODULE_COUNT 2
#define WL1271_INI_LEGACY_NVS_FILE_SIZE 800
struct wl1271_nvs_file { struct wl1271_nvs_file {
/* NVS section */ /* NVS section */
u8 nvs[WL1271_INI_NVS_SECTION_SIZE]; u8 nvs[WL1271_INI_NVS_SECTION_SIZE];
...@@ -111,8 +112,12 @@ struct wl1271_nvs_file { ...@@ -111,8 +112,12 @@ struct wl1271_nvs_file {
struct wl1271_ini_fem_params_2 params; struct wl1271_ini_fem_params_2 params;
u8 padding; u8 padding;
} dyn_radio_params_2[WL1271_INI_FEM_MODULE_COUNT]; } dyn_radio_params_2[WL1271_INI_FEM_MODULE_COUNT];
struct wl1271_ini_band_params_5 stat_radio_params_5;
u8 ini_spare[WL1271_INI_SPARE_SIZE]; u8 padding3;
struct {
struct wl1271_ini_fem_params_5 params;
u8 padding;
} dyn_radio_params_5[WL1271_INI_FEM_MODULE_COUNT];
} __attribute__ ((packed)); } __attribute__ ((packed));
#endif #endif
...@@ -566,14 +566,21 @@ static int wl1271_fetch_nvs(struct wl1271 *wl) ...@@ -566,14 +566,21 @@ static int wl1271_fetch_nvs(struct wl1271 *wl)
return ret; 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", wl1271_error("nvs size is not as expected: %zu != %zu",
fw->size, sizeof(struct wl1271_nvs_file)); fw->size, sizeof(struct wl1271_nvs_file));
ret = -EILSEQ; ret = -EILSEQ;
goto out; 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) { if (!wl->nvs) {
wl1271_error("could not allocate memory for the nvs file"); wl1271_error("could not allocate memory for the nvs file");
...@@ -581,7 +588,7 @@ static int wl1271_fetch_nvs(struct wl1271 *wl) ...@@ -581,7 +588,7 @@ static int wl1271_fetch_nvs(struct wl1271 *wl)
goto out; goto out;
} }
memcpy(wl->nvs, fw->data, sizeof(struct wl1271_nvs_file)); memcpy(wl->nvs, fw->data, fw->size);
out: out:
release_firmware(fw); release_firmware(fw);
......
...@@ -199,7 +199,14 @@ static int wl1271_tm_cmd_nvs_push(struct wl1271 *wl, struct nlattr *tb[]) ...@@ -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]); buf = nla_data(tb[WL1271_TM_ATTR_DATA]);
len = nla_len(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", wl1271_error("nvs size is not as expected: %zu != %zu",
len, sizeof(struct wl1271_nvs_file)); len, sizeof(struct wl1271_nvs_file));
return -EMSGSIZE; return -EMSGSIZE;
...@@ -209,7 +216,7 @@ static int wl1271_tm_cmd_nvs_push(struct wl1271 *wl, struct nlattr *tb[]) ...@@ -209,7 +216,7 @@ static int wl1271_tm_cmd_nvs_push(struct wl1271 *wl, struct nlattr *tb[])
kfree(wl->nvs); 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) { if (!wl->nvs) {
wl1271_error("could not allocate memory for the nvs file"); wl1271_error("could not allocate memory for the nvs file");
ret = -ENOMEM; ret = -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment