diff options
Diffstat (limited to 'drivers/net/wireless/wl12xx/boot.c')
-rw-r--r-- | drivers/net/wireless/wl12xx/boot.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/boot.c b/drivers/net/wireless/wl12xx/boot.c index 7ccec07a600..101f7e0f632 100644 --- a/drivers/net/wireless/wl12xx/boot.c +++ b/drivers/net/wireless/wl12xx/boot.c | |||
@@ -102,6 +102,33 @@ static void wl1271_boot_set_ecpu_ctrl(struct wl1271 *wl, u32 flag) | |||
102 | wl1271_write32(wl, ACX_REG_ECPU_CONTROL, cpu_ctrl); | 102 | wl1271_write32(wl, ACX_REG_ECPU_CONTROL, cpu_ctrl); |
103 | } | 103 | } |
104 | 104 | ||
105 | static unsigned int wl12xx_get_fw_ver_quirks(struct wl1271 *wl) | ||
106 | { | ||
107 | unsigned int quirks = 0; | ||
108 | unsigned int *fw_ver = wl->chip.fw_ver; | ||
109 | |||
110 | /* Only for wl127x */ | ||
111 | if ((fw_ver[FW_VER_CHIP] == FW_VER_CHIP_WL127X) && | ||
112 | /* Check STA version */ | ||
113 | (((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_STA) && | ||
114 | (fw_ver[FW_VER_MINOR] < FW_VER_MINOR_1_SPARE_STA_MIN)) || | ||
115 | /* Check AP version */ | ||
116 | ((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_AP) && | ||
117 | (fw_ver[FW_VER_MINOR] < FW_VER_MINOR_1_SPARE_AP_MIN)))) | ||
118 | quirks |= WL12XX_QUIRK_USE_2_SPARE_BLOCKS; | ||
119 | |||
120 | /* Only new station firmwares support routing fw logs to the host */ | ||
121 | if ((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_STA) && | ||
122 | (fw_ver[FW_VER_MINOR] < FW_VER_MINOR_FWLOG_STA_MIN)) | ||
123 | quirks |= WL12XX_QUIRK_FWLOG_NOT_IMPLEMENTED; | ||
124 | |||
125 | /* This feature is not yet supported for AP mode */ | ||
126 | if (fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_AP) | ||
127 | quirks |= WL12XX_QUIRK_FWLOG_NOT_IMPLEMENTED; | ||
128 | |||
129 | return quirks; | ||
130 | } | ||
131 | |||
105 | static void wl1271_parse_fw_ver(struct wl1271 *wl) | 132 | static void wl1271_parse_fw_ver(struct wl1271 *wl) |
106 | { | 133 | { |
107 | int ret; | 134 | int ret; |
@@ -116,6 +143,9 @@ static void wl1271_parse_fw_ver(struct wl1271 *wl) | |||
116 | memset(wl->chip.fw_ver, 0, sizeof(wl->chip.fw_ver)); | 143 | memset(wl->chip.fw_ver, 0, sizeof(wl->chip.fw_ver)); |
117 | return; | 144 | return; |
118 | } | 145 | } |
146 | |||
147 | /* Check if any quirks are needed with older fw versions */ | ||
148 | wl->quirks |= wl12xx_get_fw_ver_quirks(wl); | ||
119 | } | 149 | } |
120 | 150 | ||
121 | static void wl1271_boot_fw_version(struct wl1271 *wl) | 151 | static void wl1271_boot_fw_version(struct wl1271 *wl) |
@@ -749,6 +779,9 @@ int wl1271_load_firmware(struct wl1271 *wl) | |||
749 | clk |= (wl->ref_clock << 1) << 4; | 779 | clk |= (wl->ref_clock << 1) << 4; |
750 | } | 780 | } |
751 | 781 | ||
782 | if (wl->quirks & WL12XX_QUIRK_LPD_MODE) | ||
783 | clk |= SCRATCH_ENABLE_LPD; | ||
784 | |||
752 | wl1271_write32(wl, DRPW_SCRATCH_START, clk); | 785 | wl1271_write32(wl, DRPW_SCRATCH_START, clk); |
753 | 786 | ||
754 | wl1271_set_partition(wl, &part_table[PART_WORK]); | 787 | wl1271_set_partition(wl, &part_table[PART_WORK]); |