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;
        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)
 
        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);
        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
        .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
        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;
 
        wl1271_notice("loaded");
 
-       return 0;
+out:
+       return ret;
 }
 
 static void wl1271_unregister_hw(struct wl1271 *wl)