Skip to content

Commit

Permalink
wl1271: Add support for NVS files with 5GHz band parameters
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Juuso Oikarinen authored and John W. Linville committed Jun 2, 2010
1 parent eb70eb7 commit a7da74f
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 9 deletions.
9 changes: 8 additions & 1 deletion drivers/net/wireless/wl12xx/wl1271_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
11 changes: 8 additions & 3 deletions drivers/net/wireless/wl12xx/wl1271_ini.h
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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
13 changes: 10 additions & 3 deletions drivers/net/wireless/wl12xx/wl1271_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -566,22 +566,29 @@ 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");
ret = -ENOMEM;
goto out;
}

memcpy(wl->nvs, fw->data, sizeof(struct wl1271_nvs_file));
memcpy(wl->nvs, fw->data, fw->size);

out:
release_firmware(fw);
Expand Down
11 changes: 9 additions & 2 deletions drivers/net/wireless/wl12xx/wl1271_testmode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit a7da74f

Please sign in to comment.