Skip to content

Commit

Permalink
wl12xx: AP mode - fetch appropriate firmware for AP
Browse files Browse the repository at this point in the history
AP and STA modes use different firmwares.

Differentiate the firmware files by name and fetch the appropriate one
when add_interface is called by mac80211. The STA firmware is chosen for
PLT mode.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Reviewed-by: Luciano Coelho <coelho@ti.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
  • Loading branch information
Arik Nemtsov authored and Luciano Coelho committed Jan 24, 2011
1 parent 7f179b4 commit 166d504
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 3 deletions.
33 changes: 30 additions & 3 deletions drivers/net/wireless/wl12xx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -658,9 +658,26 @@ static void wl1271_irq_work(struct work_struct *work)
static int wl1271_fetch_firmware(struct wl1271 *wl)
{
const struct firmware *fw;
const char *fw_name;
int ret;

ret = request_firmware(&fw, WL1271_FW_NAME, wl1271_wl_to_dev(wl));
switch (wl->bss_type) {
case BSS_TYPE_AP_BSS:
fw_name = WL1271_AP_FW_NAME;
break;
case BSS_TYPE_IBSS:
case BSS_TYPE_STA_BSS:
fw_name = WL1271_FW_NAME;
break;
default:
wl1271_error("no compatible firmware for bss_type %d",
wl->bss_type);
return -EINVAL;
}

wl1271_debug(DEBUG_BOOT, "booting firmware %s", fw_name);

ret = request_firmware(&fw, fw_name, wl1271_wl_to_dev(wl));

if (ret < 0) {
wl1271_error("could not get firmware: %d", ret);
Expand All @@ -674,6 +691,7 @@ static int wl1271_fetch_firmware(struct wl1271 *wl)
goto out;
}

vfree(wl->fw);
wl->fw_len = fw->size;
wl->fw = vmalloc(wl->fw_len);

Expand All @@ -684,7 +702,7 @@ static int wl1271_fetch_firmware(struct wl1271 *wl)
}

memcpy(wl->fw, fw->data, wl->fw_len);

wl->fw_bss_type = wl->bss_type;
ret = 0;

out:
Expand Down Expand Up @@ -820,7 +838,8 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
goto out;
}

if (wl->fw == NULL) {
/* Make sure the firmware type matches the BSS type */
if (wl->fw == NULL || wl->fw_bss_type != wl->bss_type) {
ret = wl1271_fetch_firmware(wl);
if (ret < 0)
goto out;
Expand Down Expand Up @@ -853,6 +872,8 @@ int wl1271_plt_start(struct wl1271 *wl)
goto out;
}

wl->bss_type = BSS_TYPE_STA_BSS;

while (retries) {
retries--;
ret = wl1271_chip_wakeup(wl);
Expand Down Expand Up @@ -1010,6 +1031,9 @@ static int wl1271_op_start(struct ieee80211_hw *hw)
*
* The MAC address is first known when the corresponding interface
* is added. That is where we will initialize the hardware.
*
* In addition, we currently have different firmwares for AP and managed
* operation. We will know which to boot according to interface type.
*/

return 0;
Expand Down Expand Up @@ -3183,6 +3207,9 @@ struct ieee80211_hw *wl1271_alloc_hw(void)
wl->flags = 0;
wl->sg_enabled = true;
wl->hw_pg_ver = -1;
wl->bss_type = MAX_BSS_TYPE;
wl->set_bss_type = MAX_BSS_TYPE;
wl->fw_bss_type = MAX_BSS_TYPE;

memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
Expand Down
3 changes: 3 additions & 0 deletions drivers/net/wireless/wl12xx/wl12xx.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ extern u32 wl12xx_debug_level;


#define WL1271_FW_NAME "wl1271-fw.bin"
#define WL1271_AP_FW_NAME "wl1271-fw-ap.bin"

#define WL1271_NVS_NAME "wl1271-nvs.bin"

#define WL1271_TX_SECURITY_LO16(s) ((u16)((s) & 0xffff))
Expand Down Expand Up @@ -311,6 +313,7 @@ struct wl1271 {

u8 *fw;
size_t fw_len;
u8 fw_bss_type;
struct wl1271_nvs_file *nvs;
size_t nvs_len;

Expand Down

0 comments on commit 166d504

Please sign in to comment.