Skip to content

Commit

Permalink
wl12xx: read chip ID and HW PG version during probe
Browse files Browse the repository at this point in the history
In order to read the MAC addresses from the fuse ROM, we need to know
the chip ID and the HW PG version.  We need to know the MAC address
during probe, because that's when we register our HW with mac80211.

To prepare for that, this patch reads the chip ID and HW PG version
during probe instead of doing it at boot time.  We power the chip on
briefly in order to do that.

Signed-off-by: Luciano Coelho <coelho@ti.com>
  • Loading branch information
Luciano Coelho committed Feb 15, 2012
1 parent 0becb14 commit 30c5dbd
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 29 deletions.
15 changes: 0 additions & 15 deletions drivers/net/wireless/wl12xx/boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -488,19 +488,6 @@ static int wl1271_boot_write_irq_polarity(struct wl1271 *wl)
return 0;
}

static void wl1271_boot_hw_version(struct wl1271 *wl)
{
u32 fuse;

if (wl->chip.id == CHIP_ID_1283_PG20)
fuse = wl1271_top_reg_read(wl, WL128X_REG_FUSE_DATA_2_1);
else
fuse = wl1271_top_reg_read(wl, WL127X_REG_FUSE_DATA_2_1);
fuse = (fuse & PG_VER_MASK) >> PG_VER_OFFSET;

wl->hw_pg_ver = (s8)fuse;
}

static int wl128x_switch_tcxo_to_fref(struct wl1271 *wl)
{
u16 spare_reg;
Expand Down Expand Up @@ -694,8 +681,6 @@ int wl1271_load_firmware(struct wl1271 *wl)
u32 tmp, clk;
int selected_clock = -1;

wl1271_boot_hw_version(wl);

if (wl->chip.id == CHIP_ID_1283_PG20) {
ret = wl128x_boot_clk(wl, &selected_clock);
if (ret < 0)
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/wl12xx/debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ enum {
DEBUG_FILTERS = BIT(15),
DEBUG_ADHOC = BIT(16),
DEBUG_AP = BIT(17),
DEBUG_PROBE = BIT(18),
DEBUG_MASTER = (DEBUG_ADHOC | DEBUG_AP),
DEBUG_ALL = ~0,
};
Expand Down
59 changes: 45 additions & 14 deletions drivers/net/wireless/wl12xx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1232,10 +1232,9 @@ static int wl1271_setup(struct wl1271 *wl)
return 0;
}

static int wl1271_chip_wakeup(struct wl1271 *wl)
static int wl12xx_set_power_on(struct wl1271 *wl)
{
struct wl1271_partition_set partition;
int ret = 0;
int ret;

msleep(WL1271_PRE_POWER_ON_SLEEP);
ret = wl1271_power_on(wl);
Expand All @@ -1245,20 +1244,22 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
wl1271_io_reset(wl);
wl1271_io_init(wl);

/* We don't need a real memory partition here, because we only want
* to use the registers at this point. */
memset(&partition, 0, sizeof(partition));
partition.reg.start = REGISTERS_BASE;
partition.reg.size = REGISTERS_DOWN_SIZE;
wl1271_set_partition(wl, &partition);
wl1271_set_partition(wl, &wl12xx_part_table[PART_DOWN]);

/* ELP module wake up */
wl1271_fw_wakeup(wl);

/* whal_FwCtrl_BootSm() */
out:
return ret;
}

/* 0. read chip id from CHIP_ID */
wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
static int wl1271_chip_wakeup(struct wl1271 *wl)
{
int ret = 0;

ret = wl12xx_set_power_on(wl);
if (ret < 0)
goto out;

/*
* For wl127x based devices we could use the default block
Expand Down Expand Up @@ -4858,13 +4859,42 @@ static struct bin_attribute fwlog_attr = {
.read = wl1271_sysfs_read_fwlog,
};

static int wl12xx_get_hw_info(struct wl1271 *wl)
{
int ret;
u32 die_info;

ret = wl12xx_set_power_on(wl);
if (ret < 0)
goto out;

wl->chip.id = wl1271_read32(wl, CHIP_ID_B);

if (wl->chip.id == CHIP_ID_1283_PG20)
die_info = wl1271_top_reg_read(wl, WL128X_REG_FUSE_DATA_2_1);
else
die_info = wl1271_top_reg_read(wl, WL127X_REG_FUSE_DATA_2_1);

wl->hw_pg_ver = (s8) (die_info & PG_VER_MASK) >> PG_VER_OFFSET;

wl1271_power_off(wl);
out:
return ret;
}

static int wl1271_register_hw(struct wl1271 *wl)
{
int ret;

if (wl->mac80211_registered)
return 0;

ret = wl12xx_get_hw_info(wl);
if (ret < 0) {
wl1271_error("couldn't get hw info");
goto out;
}

ret = wl1271_fetch_nvs(wl);
if (ret == 0) {
/* NOTE: The wl->nvs->nvs element must be first, in
Expand All @@ -4886,7 +4916,7 @@ static int wl1271_register_hw(struct wl1271 *wl)
ret = ieee80211_register_hw(wl->hw);
if (ret < 0) {
wl1271_error("unable to register mac80211 hw: %d", ret);
return ret;
goto out;
}

wl->mac80211_registered = true;
Expand All @@ -4897,7 +4927,8 @@ static int wl1271_register_hw(struct wl1271 *wl)

wl1271_notice("loaded");

return 0;
out:
return ret;
}

static void wl1271_unregister_hw(struct wl1271 *wl)
Expand Down

0 comments on commit 30c5dbd

Please sign in to comment.