summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTroy Kisky <troy.kisky@boundarydevices.com>2012-05-23 18:38:54 -0700
committerEric Nelson <eric.nelson@boundarydevices.com>2012-08-31 18:06:50 -0700
commit895923281247bf9acb68e9c7546387f8bea25ce7 (patch)
tree2bed9e765429382e3e7f95f997ae5bc838f3c71b
parent3ef1a4c2b053fcce566c3522253337da33daf933 (diff)
wl12xx: add mac override parameter
Note the cmdline parameter would be wl12xx.mac=nn:nn:nn:nn:nn:nn Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
-rw-r--r--drivers/net/wireless/wl12xx/main.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c
index e6497dc669df..81e31344640f 100644
--- a/drivers/net/wireless/wl12xx/main.c
+++ b/drivers/net/wireless/wl12xx/main.c
@@ -3781,9 +3781,39 @@ static ssize_t wl1271_sysfs_show_hw_pg_ver(struct device *dev,
static DEVICE_ATTR(hw_pg_ver, S_IRUGO | S_IWUSR,
wl1271_sysfs_show_hw_pg_ver, NULL);
+
+static int parse_mac(unsigned char *mac, unsigned char const *str_mac)
+{
+ int i = 0;
+ char *end;
+ int ret = -EINVAL;
+
+ for (;;) {
+ mac[i++] = simple_strtoul(str_mac, &end, 16);
+ if (i == 6) {
+ if (!*end || (*end == ' '))
+ ret = 0;
+ break;
+ }
+ str_mac = end + 1;
+ if ((*end != '-') && (*end != ':'))
+ break;
+ }
+ return ret;
+}
+
+static char *mac;
+module_param(mac, charp, S_IRUGO);
+MODULE_PARM_DESC(mac, "mac address override");
+
int wl1271_register_hw(struct wl1271 *wl)
{
int ret;
+ u8 override_mac[ETH_ALEN];
+ memset(override_mac, 0, ETH_ALEN);
+ if (mac)
+ if (parse_mac(override_mac, mac))
+ memset(override_mac, 0, ETH_ALEN);
if (wl->mac80211_registered)
return 0;
@@ -3804,6 +3834,9 @@ int wl1271_register_hw(struct wl1271 *wl)
wl->mac_addr[5] = nvs_ptr[3];
}
+ if (is_valid_ether_addr(override_mac))
+ memcpy(wl->mac_addr, override_mac, sizeof(wl->mac_addr));
+
SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
ret = ieee80211_register_hw(wl->hw);