Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -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));
+8 −3
Original line number Diff line number Diff line
@@ -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
+10 −3
Original line number Diff line number Diff line
@@ -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);
+9 −2
Original line number Diff line number Diff line
@@ -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;