diff options
author | Juuso Oikarinen <juuso.oikarinen@nokia.com> | 2010-02-18 06:25:43 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-02-19 15:52:43 -0500 |
commit | 7b21b6f8216494ab6b8b4dc9d15e48051a0f0a66 (patch) | |
tree | e28d461fba550ed5ea660e408b69dd0666161250 | |
parent | 152ee6e09e2ce54d7d1cc9d338b82c0bf3cbbc95 (diff) |
wl1271: Retrieve device mac address from the nvs file
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>
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_boot.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_main.c | 36 |
2 files changed, 27 insertions, 17 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271_boot.c b/drivers/net/wireless/wl12xx/wl1271_boot.c index bc3fe0275cac..57ba78d83e87 100644 --- a/drivers/net/wireless/wl12xx/wl1271_boot.c +++ b/drivers/net/wireless/wl12xx/wl1271_boot.c | |||
@@ -228,14 +228,6 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) | |||
228 | nvs_len = sizeof(wl->nvs->nvs); | 228 | nvs_len = sizeof(wl->nvs->nvs); |
229 | nvs_ptr = (u8 *)wl->nvs->nvs; | 229 | nvs_ptr = (u8 *)wl->nvs->nvs; |
230 | 230 | ||
231 | /* Update the device MAC address into the nvs */ | ||
232 | nvs_ptr[11] = wl->mac_addr[0]; | ||
233 | nvs_ptr[10] = wl->mac_addr[1]; | ||
234 | nvs_ptr[6] = wl->mac_addr[2]; | ||
235 | nvs_ptr[5] = wl->mac_addr[3]; | ||
236 | nvs_ptr[4] = wl->mac_addr[4]; | ||
237 | nvs_ptr[3] = wl->mac_addr[5]; | ||
238 | |||
239 | /* | 231 | /* |
240 | * Layout before the actual NVS tables: | 232 | * Layout before the actual NVS tables: |
241 | * 1 byte : burst length. | 233 | * 1 byte : burst length. |
diff --git a/drivers/net/wireless/wl12xx/wl1271_main.c b/drivers/net/wireless/wl12xx/wl1271_main.c index 282c2bbfec86..b5d53a3fcc5d 100644 --- a/drivers/net/wireless/wl12xx/wl1271_main.c +++ b/drivers/net/wireless/wl12xx/wl1271_main.c | |||
@@ -467,6 +467,32 @@ out: | |||
467 | return ret; | 467 | return ret; |
468 | } | 468 | } |
469 | 469 | ||
470 | static int wl1271_update_mac_addr(struct wl1271 *wl) | ||
471 | { | ||
472 | int ret = 0; | ||
473 | u8 *nvs_ptr = (u8 *)wl->nvs->nvs; | ||
474 | |||
475 | /* get mac address from the NVS */ | ||
476 | wl->mac_addr[0] = nvs_ptr[11]; | ||
477 | wl->mac_addr[1] = nvs_ptr[10]; | ||
478 | wl->mac_addr[2] = nvs_ptr[6]; | ||
479 | wl->mac_addr[3] = nvs_ptr[5]; | ||
480 | wl->mac_addr[4] = nvs_ptr[4]; | ||
481 | wl->mac_addr[5] = nvs_ptr[3]; | ||
482 | |||
483 | /* FIXME: if it is a zero-address, we should bail out. Now, instead, | ||
484 | we randomize an address */ | ||
485 | if (is_zero_ether_addr(wl->mac_addr)) { | ||
486 | static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf}; | ||
487 | memcpy(wl->mac_addr, nokia_oui, 3); | ||
488 | get_random_bytes(wl->mac_addr + 3, 3); | ||
489 | } | ||
490 | |||
491 | SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr); | ||
492 | |||
493 | return ret; | ||
494 | } | ||
495 | |||
470 | static int wl1271_fetch_nvs(struct wl1271 *wl) | 496 | static int wl1271_fetch_nvs(struct wl1271 *wl) |
471 | { | 497 | { |
472 | const struct firmware *fw; | 498 | const struct firmware *fw; |
@@ -496,7 +522,7 @@ static int wl1271_fetch_nvs(struct wl1271 *wl) | |||
496 | 522 | ||
497 | memcpy(wl->nvs, fw->data, sizeof(struct wl1271_nvs_file)); | 523 | memcpy(wl->nvs, fw->data, sizeof(struct wl1271_nvs_file)); |
498 | 524 | ||
499 | ret = 0; | 525 | ret = wl1271_update_mac_addr(wl); |
500 | 526 | ||
501 | out: | 527 | out: |
502 | release_firmware(fw); | 528 | release_firmware(fw); |
@@ -1893,7 +1919,6 @@ static int __devinit wl1271_probe(struct spi_device *spi) | |||
1893 | struct ieee80211_hw *hw; | 1919 | struct ieee80211_hw *hw; |
1894 | struct wl1271 *wl; | 1920 | struct wl1271 *wl; |
1895 | int ret, i; | 1921 | int ret, i; |
1896 | static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf}; | ||
1897 | 1922 | ||
1898 | pdata = spi->dev.platform_data; | 1923 | pdata = spi->dev.platform_data; |
1899 | if (!pdata) { | 1924 | if (!pdata) { |
@@ -1938,13 +1963,6 @@ static int __devinit wl1271_probe(struct spi_device *spi) | |||
1938 | 1963 | ||
1939 | spin_lock_init(&wl->wl_lock); | 1964 | spin_lock_init(&wl->wl_lock); |
1940 | 1965 | ||
1941 | /* | ||
1942 | * In case our MAC address is not correctly set, | ||
1943 | * we use a random but Nokia MAC. | ||
1944 | */ | ||
1945 | memcpy(wl->mac_addr, nokia_oui, 3); | ||
1946 | get_random_bytes(wl->mac_addr + 3, 3); | ||
1947 | |||
1948 | wl->state = WL1271_STATE_OFF; | 1966 | wl->state = WL1271_STATE_OFF; |
1949 | mutex_init(&wl->mutex); | 1967 | mutex_init(&wl->mutex); |
1950 | 1968 | ||