diff options
| -rw-r--r-- | core/hdd/src/wlan_hdd_main.c | 54 |
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; |
