mwifiex: set MAC address from wifi_addr module parameter.

backports-0500-wifi-hwaddr-param.patch

Change-Id: Ia4c0a3bcc2e8745e5c0120e091927318644d4e8a
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c
index 5fe0574..6c23346 100644
--- a/drivers/net/wireless/mwifiex/main.c
+++ b/drivers/net/wireless/mwifiex/main.c
@@ -27,6 +27,12 @@
 const char driver_version[] = "mwifiex " VERSION " (%s) ";
 static char *cal_data_cfg;
 module_param(cal_data_cfg, charp, 0);
+static char *wifi_addr;
+module_param(wifi_addr, charp, 0644);
+MODULE_PARM_DESC(wifi_addr, "Wifi adapter base mac address");
+
+extern bool mac_pton(const char *s, u8 *mac);
+static int mwifiex_set_mac_address(struct net_device *dev, void *addr);
 
 static unsigned short driver_mode;
 module_param(driver_mode, ushort, 0);
@@ -549,6 +555,23 @@
 	}
 	rtnl_unlock();
 
+	/* set mac address if provided */
+	if (!wifi_addr) {
+		pr_info("%s: optionally set macaddr with wifi_addr=XX:XX:XX:XX:XX:XX\n", __func__);
+	} else {
+		struct sockaddr hwaddr = { 0 };
+		if (!mac_pton(wifi_addr, hwaddr.sa_data)) {
+			pr_err("%s: failed to parse macaddr: %s\n", __func__, wifi_addr);
+		} else {
+			struct mwifiex_private *priv = adapter->priv[MWIFIEX_BSS_ROLE_UAP];
+			if (priv && priv->netdev && mwifiex_set_mac_address(priv->netdev, &hwaddr)) {
+				pr_err("%s: failed to set wlan0 macaddr: %s\n", __func__, wifi_addr);
+			} else {
+				pr_info("%s: set wlan0 macaddr to %s\n", __func__, wifi_addr);
+			}
+		}
+	}
+
 	mwifiex_drv_get_driver_version(adapter, fmt, sizeof(fmt) - 1);
 	dev_notice(adapter->dev, "driver_version = %s\n", fmt);
 	goto done;