summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/hdd/src/wlan_hdd_main.c54
1 files changed, 49 insertions, 5 deletions
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index caf39aae25f0..388d388613a5 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -77,6 +77,7 @@
#ifdef MSM_PLATFORM
#include <soc/qcom/subsystem_restart.h>
#endif
+#include <soc/qcom/socinfo.h>
#include <wlan_hdd_hostapd.h>
#include <wlan_hdd_softap_tx_rx.h>
#include "cfg_api.h"
@@ -1342,6 +1343,38 @@ static void hdd_update_tgt_vht_cap(hdd_context_t *hdd_ctx,
}
+/**
+ * hdd_generate_macaddr_auto() - Auto-generate mac address
+ * @hdd_ctx: Pointer to the HDD context
+ *
+ * Auto-generate mac address using device serial number.
+ * Keep the first 3 bytes of OUI as before and replace
+ * the last 3 bytes with the lower 3 bytes of serial number.
+ *
+ * Return: 0 for success
+ * Non zero failure code for errors
+ */
+static int hdd_generate_macaddr_auto(hdd_context_t *hdd_ctx)
+{
+ unsigned int serialno = 0;
+ struct qdf_mac_addr mac_addr = {
+ {0x00, 0x0A, 0xF5, 0x00, 0x00, 0x00}
+ };
+
+ serialno = socinfo_get_serial_number();
+ if (serialno == 0)
+ return -EINVAL;
+
+ serialno &= 0x00ffffff;
+
+ mac_addr.bytes[3] = (serialno >> 16) & 0xff;
+ mac_addr.bytes[4] = (serialno >> 8) & 0xff;
+ mac_addr.bytes[5] = serialno & 0xff;
+
+ hdd_update_macaddr(hdd_ctx->config, mac_addr);
+ return 0;
+}
+
void hdd_update_tgt_cfg(void *context, void *param)
{
hdd_context_t *hdd_ctx = (hdd_context_t *) context;
@@ -1389,11 +1422,22 @@ void hdd_update_tgt_cfg(void *context, void *param)
if (!qdf_is_macaddr_zero(&cfg->hw_macaddr)) {
hdd_update_macaddr(hdd_ctx->config, cfg->hw_macaddr);
} else {
- hddLog(QDF_TRACE_LEVEL_ERROR,
- FL(
- "Invalid MAC passed from target, using MAC from ini file"
- MAC_ADDRESS_STR),
- MAC_ADDR_ARRAY(hdd_ctx->config->intfMacAddr[0].bytes));
+ static struct qdf_mac_addr default_mac_addr = {
+ {0x00, 0x0A, 0xF5, 0x89, 0x89, 0xFF}
+ };
+ if (qdf_is_macaddr_equal(&hdd_ctx->config->intfMacAddr[0],
+ &default_mac_addr)) {
+ if (hdd_generate_macaddr_auto(hdd_ctx) != 0)
+ hdd_err("Fail to auto-generate MAC, using MAC from ini file "
+ MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(hdd_ctx->config->
+ intfMacAddr[0].bytes));
+ } else {
+ hdd_err("Invalid MAC passed from target, using MAC from ini file "
+ MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(hdd_ctx->config->
+ intfMacAddr[0].bytes));
+ }
}
hdd_ctx->target_fw_version = cfg->target_fw_version;