Skip to content

Commit

Permalink
wl1251: read default MAC address from EEPROM when available
Browse files Browse the repository at this point in the history
Some wl1251 hardware configurations (like in WG7210 module) have
EEPROM attached where NVS data is kept, which includes MAC address.

In such configurations, let's read default MAC address from EEPROM,
instead of using random one.

Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Acked-by: Kalle Valo <kvalo@adurom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Grazvydas Ignotas authored and John W. Linville committed Apr 16, 2010
1 parent a5e944f commit 61c2a80
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 0 deletions.
63 changes: 63 additions & 0 deletions drivers/net/wireless/wl12xx/wl1251_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1195,6 +1195,66 @@ static const struct ieee80211_ops wl1251_ops = {
.conf_tx = wl1251_op_conf_tx,
};

static int wl1251_read_eeprom_byte(struct wl1251 *wl, off_t offset, u8 *data)
{
unsigned long timeout;

wl1251_reg_write32(wl, EE_ADDR, offset);
wl1251_reg_write32(wl, EE_CTL, EE_CTL_READ);

/* EE_CTL_READ clears when data is ready */
timeout = jiffies + msecs_to_jiffies(100);
while (1) {
if (!(wl1251_reg_read32(wl, EE_CTL) & EE_CTL_READ))
break;

if (time_after(jiffies, timeout))
return -ETIMEDOUT;

msleep(1);
}

*data = wl1251_reg_read32(wl, EE_DATA);
return 0;
}

static int wl1251_read_eeprom(struct wl1251 *wl, off_t offset,
u8 *data, size_t len)
{
size_t i;
int ret;

wl1251_reg_write32(wl, EE_START, 0);

for (i = 0; i < len; i++) {
ret = wl1251_read_eeprom_byte(wl, offset + i, &data[i]);
if (ret < 0)
return ret;
}

return 0;
}

static int wl1251_read_eeprom_mac(struct wl1251 *wl)
{
u8 mac[ETH_ALEN];
int i, ret;

wl1251_set_partition(wl, 0, 0, REGISTERS_BASE, REGISTERS_DOWN_SIZE);

ret = wl1251_read_eeprom(wl, 0x1c, mac, sizeof(mac));
if (ret < 0) {
wl1251_warning("failed to read MAC address from EEPROM");
return ret;
}

/* MAC is stored in reverse order */
for (i = 0; i < ETH_ALEN; i++)
wl->mac_addr[i] = mac[ETH_ALEN - i - 1];

return 0;
}

static int wl1251_register_hw(struct wl1251 *wl)
{
int ret;
Expand Down Expand Up @@ -1241,6 +1301,9 @@ int wl1251_init_ieee80211(struct wl1251 *wl)

wl->hw->queues = 4;

if (wl->use_eeprom)
wl1251_read_eeprom_mac(wl);

ret = wl1251_register_hw(wl);
if (ret)
goto out;
Expand Down
7 changes: 7 additions & 0 deletions drivers/net/wireless/wl12xx/wl1251_reg.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,14 @@
#define SOR_CFG (REGISTERS_BASE + 0x0800)
#define ECPU_CTRL (REGISTERS_BASE + 0x0804)
#define HI_CFG (REGISTERS_BASE + 0x0808)

/* EEPROM registers */
#define EE_START (REGISTERS_BASE + 0x080C)
#define EE_CTL (REGISTERS_BASE + 0x2000)
#define EE_DATA (REGISTERS_BASE + 0x2004)
#define EE_ADDR (REGISTERS_BASE + 0x2008)

#define EE_CTL_READ 2

#define CHIP_ID_B (REGISTERS_BASE + 0x5674)

Expand Down

0 comments on commit 61c2a80

Please sign in to comment.