Skip to content

Commit

Permalink
wl1271: Retrieve device mac address from the nvs file
Browse files Browse the repository at this point in the history
Instead of always randomizing the MAC address, retrieve and configure the
MAC address from the device specific nvs file. For now, randomize an address
only if the address in the NVS is zero.

Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: Kalle Valo <kalle.valo@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Juuso Oikarinen authored and John W. Linville committed Feb 19, 2010
1 parent 152ee6e commit 7b21b6f
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 17 deletions.
8 changes: 0 additions & 8 deletions drivers/net/wireless/wl12xx/wl1271_boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,14 +228,6 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl)
nvs_len = sizeof(wl->nvs->nvs);
nvs_ptr = (u8 *)wl->nvs->nvs;

/* Update the device MAC address into the nvs */
nvs_ptr[11] = wl->mac_addr[0];
nvs_ptr[10] = wl->mac_addr[1];
nvs_ptr[6] = wl->mac_addr[2];
nvs_ptr[5] = wl->mac_addr[3];
nvs_ptr[4] = wl->mac_addr[4];
nvs_ptr[3] = wl->mac_addr[5];

/*
* Layout before the actual NVS tables:
* 1 byte : burst length.
Expand Down
36 changes: 27 additions & 9 deletions drivers/net/wireless/wl12xx/wl1271_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,32 @@ static int wl1271_fetch_firmware(struct wl1271 *wl)
return ret;
}

static int wl1271_update_mac_addr(struct wl1271 *wl)
{
int ret = 0;
u8 *nvs_ptr = (u8 *)wl->nvs->nvs;

/* get mac address from the NVS */
wl->mac_addr[0] = nvs_ptr[11];
wl->mac_addr[1] = nvs_ptr[10];
wl->mac_addr[2] = nvs_ptr[6];
wl->mac_addr[3] = nvs_ptr[5];
wl->mac_addr[4] = nvs_ptr[4];
wl->mac_addr[5] = nvs_ptr[3];

/* FIXME: if it is a zero-address, we should bail out. Now, instead,
we randomize an address */
if (is_zero_ether_addr(wl->mac_addr)) {
static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
memcpy(wl->mac_addr, nokia_oui, 3);
get_random_bytes(wl->mac_addr + 3, 3);
}

SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);

return ret;
}

static int wl1271_fetch_nvs(struct wl1271 *wl)
{
const struct firmware *fw;
Expand Down Expand Up @@ -496,7 +522,7 @@ static int wl1271_fetch_nvs(struct wl1271 *wl)

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

ret = 0;
ret = wl1271_update_mac_addr(wl);

out:
release_firmware(fw);
Expand Down Expand Up @@ -1893,7 +1919,6 @@ static int __devinit wl1271_probe(struct spi_device *spi)
struct ieee80211_hw *hw;
struct wl1271 *wl;
int ret, i;
static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};

pdata = spi->dev.platform_data;
if (!pdata) {
Expand Down Expand Up @@ -1938,13 +1963,6 @@ static int __devinit wl1271_probe(struct spi_device *spi)

spin_lock_init(&wl->wl_lock);

/*
* In case our MAC address is not correctly set,
* we use a random but Nokia MAC.
*/
memcpy(wl->mac_addr, nokia_oui, 3);
get_random_bytes(wl->mac_addr + 3, 3);

wl->state = WL1271_STATE_OFF;
mutex_init(&wl->mutex);

Expand Down

0 comments on commit 7b21b6f

Please sign in to comment.