Skip to content

Commit

Permalink
Add support for getting mac-address from devicetree
Browse files Browse the repository at this point in the history
When there is no mac address defines in the efuse / eeprom, then
try to get one from the devicetree. This allows to use a bootloader
set per device fixed mac-address based on e.g. the SoC serial number.

Note that previously the driver would assign a fixed mac-address
which was the same for all devices with no mac address in the
efuse / eeprom (BAD!).

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
  • Loading branch information
jwrdegoede committed Jul 8, 2016
1 parent a6d1997 commit 4eb4bf4
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 18 deletions.
41 changes: 25 additions & 16 deletions core/rtw_ieee80211.c
Expand Up @@ -1457,10 +1457,13 @@ extern char* rtw_initmac;
* @out: buf to store mac address decided
* @hw_mac_addr: mac address from efuse/epprom
*/
void rtw_macaddr_cfg(u8 *out, const u8 *hw_mac_addr)
void rtw_macaddr_cfg(struct device *dev, u8 *out, const u8 *hw_mac_addr)
{
#define DEFAULT_RANDOM_MACADDR 1
u8 mac[ETH_ALEN];
struct device_node *np = dev->of_node;
const unsigned char *addr;
int len;

if (out == NULL) {
rtw_warn_on(1);
Expand Down Expand Up @@ -1491,21 +1494,27 @@ void rtw_macaddr_cfg(u8 *out, const u8 *hw_mac_addr)

err_chk:
if (rtw_check_invalid_mac_address(mac) == _TRUE) {
#if DEFAULT_RANDOM_MACADDR
DBG_871X_LEVEL(_drv_err_, "invalid mac addr:"MAC_FMT", assign random MAC\n", MAC_ARG(mac));
*((u32 *)(&mac[2])) = rtw_random32();
mac[0] = 0x00;
mac[1] = 0xe0;
mac[2] = 0x4c;
#else
DBG_871X_LEVEL(_drv_err_, "invalid mac addr:"MAC_FMT", assign default one\n", MAC_ARG(mac));
mac[0] = 0x00;
mac[1] = 0xe0;
mac[2] = 0x4c;
mac[3] = 0x87;
mac[4] = 0x00;
mac[5] = 0x00;
#endif
if (np &&
(addr = of_get_property(np, "local-mac-address", &len)) &&
len == ETH_ALEN) {
memcpy(mac, addr, ETH_ALEN);
} else {
#if DEFAULT_RANDOM_MACADDR
DBG_871X_LEVEL(_drv_err_, "invalid mac addr:"MAC_FMT", assign random MAC\n", MAC_ARG(mac));
*((u32 *)(&mac[2])) = rtw_random32();
mac[0] = 0x00;
mac[1] = 0xe0;
mac[2] = 0x4c;
#else
DBG_871X_LEVEL(_drv_err_, "invalid mac addr:"MAC_FMT", assign default one\n", MAC_ARG(mac));
mac[0] = 0x00;
mac[1] = 0xe0;
mac[2] = 0x4c;
mac[3] = 0x87;
mac[4] = 0x00;
mac[5] = 0x00;
#endif
}
}

_rtw_memcpy(out, mac, ETH_ALEN);
Expand Down
2 changes: 1 addition & 1 deletion include/ieee80211.h
Expand Up @@ -1735,7 +1735,7 @@ int rtw_check_network_type(unsigned char *rate, int ratelen, int channel);
void rtw_get_bcn_info(struct wlan_network *pnetwork);

u8 rtw_check_invalid_mac_address(u8 *mac_addr);
void rtw_macaddr_cfg(u8 *out, const u8 *hw_mac_addr);
void rtw_macaddr_cfg(struct device *dev, u8 *out, const u8 *hw_mac_addr);

u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI, unsigned char * MCS_rate);
u8 rtw_ht_mcsset_to_nss(u8 *supp_mcs_set);
Expand Down
3 changes: 2 additions & 1 deletion os_dep/linux/sdio_intf.c
Expand Up @@ -493,6 +493,7 @@ _adapter *rtw_sdio_if1_init(struct dvobj_priv *dvobj)
{
int status = _FAIL;
PADAPTER padapter = NULL;
PSDIO_DATA psdio = &dvobj->intf_data;

padapter = (_adapter *)rtw_zvmalloc(sizeof(*padapter));
if (padapter == NULL)
Expand Down Expand Up @@ -564,7 +565,7 @@ _adapter *rtw_sdio_if1_init(struct dvobj_priv *dvobj)

//3 8. get WLan MAC address
// set mac addr
rtw_macaddr_cfg(adapter_mac_addr(padapter), get_hal_mac_addr(padapter));
rtw_macaddr_cfg(&psdio->func->dev, adapter_mac_addr(padapter), get_hal_mac_addr(padapter));
rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter));

rtw_hal_disable_interrupt(padapter);
Expand Down

0 comments on commit 4eb4bf4

Please sign in to comment.