mirror of
https://github.com/torvalds/linux.git
synced 2024-12-30 06:41:43 +00:00
wl12xx: update commands & events
Change the commands and events according to the new fw api (fw >= 6/7.3.0.0.75). The main change is the replacement of JOIN/DISCONNECT commands, with ROLE_START/ROLE_STOP commands. The use of these commands should be preceded by the ROLE_ENABLE command (allocating role resources), and followed by the ROLE_DISABLE command (freeing role resources). Signed-off-by: Eliad Peller <eliad@wizery.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
This commit is contained in:
parent
7f097988f1
commit
c690ec816f
@ -494,21 +494,18 @@ static int wl1271_boot_run_firmware(struct wl1271 *wl)
|
||||
wl->event_mask = BSS_LOSE_EVENT_ID |
|
||||
SCAN_COMPLETE_EVENT_ID |
|
||||
PS_REPORT_EVENT_ID |
|
||||
JOIN_EVENT_COMPLETE_ID |
|
||||
DISCONNECT_EVENT_COMPLETE_ID |
|
||||
RSSI_SNR_TRIGGER_0_EVENT_ID |
|
||||
PSPOLL_DELIVERY_FAILURE_EVENT_ID |
|
||||
SOFT_GEMINI_SENSE_EVENT_ID |
|
||||
PERIODIC_SCAN_REPORT_EVENT_ID |
|
||||
PERIODIC_SCAN_COMPLETE_EVENT_ID;
|
||||
|
||||
if (wl->bss_type == BSS_TYPE_AP_BSS)
|
||||
wl->event_mask |= STA_REMOVE_COMPLETE_EVENT_ID |
|
||||
INACTIVE_STA_EVENT_ID |
|
||||
MAX_TX_RETRY_EVENT_ID;
|
||||
else
|
||||
wl->event_mask |= DUMMY_PACKET_EVENT_ID |
|
||||
BA_SESSION_RX_CONSTRAINT_EVENT_ID;
|
||||
PERIODIC_SCAN_COMPLETE_EVENT_ID |
|
||||
DUMMY_PACKET_EVENT_ID |
|
||||
PEER_REMOVE_COMPLETE_EVENT_ID |
|
||||
BA_SESSION_RX_CONSTRAINT_EVENT_ID |
|
||||
REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID |
|
||||
INACTIVE_STA_EVENT_ID |
|
||||
MAX_TX_RETRY_EVENT_ID;
|
||||
|
||||
ret = wl1271_event_unmask(wl);
|
||||
if (ret < 0) {
|
||||
|
@ -363,61 +363,294 @@ static int wl1271_cmd_wait_for_event(struct wl1271 *wl, u32 mask)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int wl1271_cmd_join(struct wl1271 *wl, u8 bss_type)
|
||||
int wl12xx_cmd_role_enable(struct wl1271 *wl, u8 role_type, u8 *role_id)
|
||||
{
|
||||
struct wl1271_cmd_join *join;
|
||||
int ret, i;
|
||||
u8 *bssid;
|
||||
struct wl12xx_cmd_role_enable *cmd;
|
||||
int ret;
|
||||
|
||||
join = kzalloc(sizeof(*join), GFP_KERNEL);
|
||||
if (!join) {
|
||||
wl1271_debug(DEBUG_CMD, "cmd role enable");
|
||||
|
||||
if (WARN_ON(*role_id != WL12XX_INVALID_ROLE_ID))
|
||||
return -EBUSY;
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd join");
|
||||
|
||||
/* Reverse order BSSID */
|
||||
bssid = (u8 *) &join->bssid_lsb;
|
||||
for (i = 0; i < ETH_ALEN; i++)
|
||||
bssid[i] = wl->bssid[ETH_ALEN - i - 1];
|
||||
|
||||
join->bss_type = bss_type;
|
||||
join->basic_rate_set = cpu_to_le32(wl->basic_rate_set);
|
||||
join->supported_rate_set = cpu_to_le32(wl->rate_set);
|
||||
|
||||
if (wl->band == IEEE80211_BAND_5GHZ)
|
||||
join->bss_type |= WL1271_JOIN_CMD_BSS_TYPE_5GHZ;
|
||||
|
||||
join->beacon_interval = cpu_to_le16(wl->beacon_int);
|
||||
join->dtim_interval = WL1271_DEFAULT_DTIM_PERIOD;
|
||||
|
||||
join->channel = wl->channel;
|
||||
join->ssid_len = wl->ssid_len;
|
||||
memcpy(join->ssid, wl->ssid, wl->ssid_len);
|
||||
|
||||
join->ctrl |= wl->session_counter << WL1271_JOIN_CMD_TX_SESSION_OFFSET;
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd join: basic_rate_set=0x%x, rate_set=0x%x",
|
||||
join->basic_rate_set, join->supported_rate_set);
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_START_JOIN, join, sizeof(*join), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to initiate cmd join");
|
||||
/* get role id */
|
||||
cmd->role_id = find_first_zero_bit(wl->roles_map, WL12XX_MAX_ROLES);
|
||||
if (cmd->role_id >= WL12XX_MAX_ROLES) {
|
||||
ret = -EBUSY;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
ret = wl1271_cmd_wait_for_event(wl, JOIN_EVENT_COMPLETE_ID);
|
||||
if (ret < 0)
|
||||
wl1271_error("cmd join event completion error");
|
||||
memcpy(cmd->mac_address, wl->mac_addr, ETH_ALEN);
|
||||
cmd->role_type = role_type;
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_ROLE_ENABLE, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to initiate cmd role enable");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
__set_bit(cmd->role_id, wl->roles_map);
|
||||
*role_id = cmd->role_id;
|
||||
|
||||
out_free:
|
||||
kfree(join);
|
||||
kfree(cmd);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl12xx_cmd_role_disable(struct wl1271 *wl, u8 *role_id)
|
||||
{
|
||||
struct wl12xx_cmd_role_disable *cmd;
|
||||
int ret;
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd role disable");
|
||||
|
||||
if (WARN_ON(*role_id == WL12XX_INVALID_ROLE_ID))
|
||||
return -ENOENT;
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
cmd->role_id = *role_id;
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_ROLE_DISABLE, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to initiate cmd role disable");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
__clear_bit(*role_id, wl->roles_map);
|
||||
*role_id = WL12XX_INVALID_ROLE_ID;
|
||||
|
||||
out_free:
|
||||
kfree(cmd);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int wl12xx_allocate_link(struct wl1271 *wl, u8 *hlid)
|
||||
{
|
||||
u8 link = find_first_zero_bit(wl->links_map, WL12XX_MAX_LINKS);
|
||||
if (link >= WL12XX_MAX_LINKS)
|
||||
return -EBUSY;
|
||||
|
||||
__set_bit(link, wl->links_map);
|
||||
*hlid = link;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void wl12xx_free_link(struct wl1271 *wl, u8 *hlid)
|
||||
{
|
||||
if (*hlid == WL12XX_INVALID_LINK_ID)
|
||||
return;
|
||||
|
||||
__clear_bit(*hlid, wl->links_map);
|
||||
*hlid = WL12XX_INVALID_LINK_ID;
|
||||
}
|
||||
|
||||
int wl12xx_cmd_role_start_sta(struct wl1271 *wl)
|
||||
{
|
||||
struct wl12xx_cmd_role_start *cmd;
|
||||
int ret;
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd role start sta %d", wl->role_id);
|
||||
|
||||
cmd->role_id = wl->role_id;
|
||||
if (wl->band == IEEE80211_BAND_5GHZ)
|
||||
cmd->band = WL12XX_BAND_5GHZ;
|
||||
cmd->channel = wl->channel;
|
||||
cmd->sta.basic_rate_set = cpu_to_le32(wl->basic_rate_set);
|
||||
cmd->sta.beacon_interval = cpu_to_le16(wl->beacon_int);
|
||||
cmd->sta.ssid_type = WL12XX_SSID_TYPE_ANY;
|
||||
cmd->sta.ssid_len = wl->ssid_len;
|
||||
memcpy(cmd->sta.ssid, wl->ssid, wl->ssid_len);
|
||||
memcpy(cmd->sta.bssid, wl->bssid, ETH_ALEN);
|
||||
cmd->sta.local_rates = cpu_to_le32(wl->rate_set);
|
||||
|
||||
if (wl->sta_hlid == WL12XX_INVALID_LINK_ID) {
|
||||
ret = wl12xx_allocate_link(wl, &wl->sta_hlid);
|
||||
if (ret)
|
||||
goto out_free;
|
||||
}
|
||||
cmd->sta.hlid = wl->sta_hlid;
|
||||
cmd->sta.session = wl->session_counter;
|
||||
cmd->sta.remote_rates = cpu_to_le32(wl->rate_set);
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "role start: roleid=%d, hlid=%d, session=%d "
|
||||
"basic_rate_set: 0x%x, remote_rates: 0x%x",
|
||||
wl->role_id, cmd->sta.hlid, cmd->sta.session,
|
||||
wl->basic_rate_set, wl->rate_set);
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_ROLE_START, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to initiate cmd role start sta");
|
||||
goto err_hlid;
|
||||
}
|
||||
|
||||
goto out_free;
|
||||
|
||||
err_hlid:
|
||||
/* clear links on error. */
|
||||
wl12xx_free_link(wl, &wl->sta_hlid);
|
||||
|
||||
out_free:
|
||||
kfree(cmd);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl12xx_cmd_role_stop_sta(struct wl1271 *wl)
|
||||
{
|
||||
struct wl12xx_cmd_role_stop *cmd;
|
||||
int ret;
|
||||
|
||||
if (WARN_ON(wl->sta_hlid == WL12XX_INVALID_LINK_ID))
|
||||
return -EINVAL;
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd role stop sta %d", wl->role_id);
|
||||
|
||||
cmd->role_id = wl->role_id;
|
||||
cmd->disc_type = DISCONNECT_IMMEDIATE;
|
||||
cmd->reason = cpu_to_le16(WLAN_REASON_UNSPECIFIED);
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_ROLE_STOP, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to initiate cmd role stop sta");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
ret = wl1271_cmd_wait_for_event(wl, DISCONNECT_EVENT_COMPLETE_ID);
|
||||
if (ret < 0) {
|
||||
wl1271_error("cmd role stop sta event completion error");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
wl12xx_free_link(wl, &wl->sta_hlid);
|
||||
|
||||
out_free:
|
||||
kfree(cmd);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl12xx_cmd_role_start_ap(struct wl1271 *wl)
|
||||
{
|
||||
struct wl12xx_cmd_role_start *cmd;
|
||||
struct ieee80211_bss_conf *bss_conf = &wl->vif->bss_conf;
|
||||
int ret;
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd role start ap %d", wl->role_id);
|
||||
|
||||
/*
|
||||
* We currently do not support hidden SSID. The real SSID
|
||||
* should be fetched from mac80211 first.
|
||||
*/
|
||||
if (wl->ssid_len == 0) {
|
||||
wl1271_warning("Hidden SSID currently not supported for AP");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
cmd->role_id = wl->role_id;
|
||||
cmd->ap.aging_period = cpu_to_le16(wl->conf.tx.ap_aging_period);
|
||||
cmd->ap.bss_index = WL1271_AP_BSS_INDEX;
|
||||
cmd->ap.global_hlid = WL1271_AP_GLOBAL_HLID;
|
||||
cmd->ap.broadcast_hlid = WL1271_AP_BROADCAST_HLID;
|
||||
cmd->ap.basic_rate_set = cpu_to_le32(wl->basic_rate_set);
|
||||
cmd->ap.beacon_interval = cpu_to_le16(wl->beacon_int);
|
||||
cmd->ap.dtim_interval = bss_conf->dtim_period;
|
||||
cmd->ap.beacon_expiry = WL1271_AP_DEF_BEACON_EXP;
|
||||
cmd->channel = wl->channel;
|
||||
cmd->ap.ssid_len = wl->ssid_len;
|
||||
cmd->ap.ssid_type = WL12XX_SSID_TYPE_PUBLIC;
|
||||
memcpy(cmd->ap.ssid, wl->ssid, wl->ssid_len);
|
||||
cmd->ap.local_rates = cpu_to_le32(0xffffffff);
|
||||
|
||||
switch (wl->band) {
|
||||
case IEEE80211_BAND_2GHZ:
|
||||
cmd->band = RADIO_BAND_2_4GHZ;
|
||||
break;
|
||||
case IEEE80211_BAND_5GHZ:
|
||||
cmd->band = RADIO_BAND_5GHZ;
|
||||
break;
|
||||
default:
|
||||
wl1271_warning("ap start - unknown band: %d", (int)wl->band);
|
||||
cmd->band = RADIO_BAND_2_4GHZ;
|
||||
break;
|
||||
}
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_ROLE_START, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to initiate cmd role start ap");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
out_free:
|
||||
kfree(cmd);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl12xx_cmd_role_stop_ap(struct wl1271 *wl)
|
||||
{
|
||||
struct wl12xx_cmd_role_stop *cmd;
|
||||
int ret;
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd role stop ap %d", wl->role_id);
|
||||
|
||||
cmd->role_id = wl->role_id;
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_ROLE_STOP, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to initiate cmd role stop ap");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
out_free:
|
||||
kfree(cmd);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* send test command to firmware
|
||||
*
|
||||
@ -565,6 +798,7 @@ int wl1271_cmd_ps_mode(struct wl1271 *wl, u8 ps_mode)
|
||||
goto out;
|
||||
}
|
||||
|
||||
ps_params->role_id = wl->role_id;
|
||||
ps_params->ps_mode = ps_mode;
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_SET_PS_MODE, ps_params,
|
||||
@ -811,9 +1045,9 @@ int wl1271_build_qos_null_data(struct wl1271 *wl)
|
||||
wl->basic_rate);
|
||||
}
|
||||
|
||||
int wl1271_cmd_set_sta_default_wep_key(struct wl1271 *wl, u8 id)
|
||||
int wl12xx_cmd_set_default_wep_key(struct wl1271 *wl, u8 id, u8 hlid)
|
||||
{
|
||||
struct wl1271_cmd_set_sta_keys *cmd;
|
||||
struct wl1271_cmd_set_keys *cmd;
|
||||
int ret = 0;
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd set_default_wep_key %d", id);
|
||||
@ -824,7 +1058,9 @@ int wl1271_cmd_set_sta_default_wep_key(struct wl1271 *wl, u8 id)
|
||||
goto out;
|
||||
}
|
||||
|
||||
cmd->id = id;
|
||||
cmd->hlid = hlid;
|
||||
cmd->key_id = id;
|
||||
cmd->lid_key_type = WEP_DEFAULT_LID_TYPE;
|
||||
cmd->key_action = cpu_to_le16(KEY_SET_ID);
|
||||
cmd->key_type = KEY_WEP;
|
||||
|
||||
@ -840,42 +1076,11 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl1271_cmd_set_ap_default_wep_key(struct wl1271 *wl, u8 id)
|
||||
{
|
||||
struct wl1271_cmd_set_ap_keys *cmd;
|
||||
int ret = 0;
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd set_ap_default_wep_key %d", id);
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
cmd->hlid = WL1271_AP_BROADCAST_HLID;
|
||||
cmd->key_id = id;
|
||||
cmd->lid_key_type = WEP_DEFAULT_LID_TYPE;
|
||||
cmd->key_action = cpu_to_le16(KEY_SET_ID);
|
||||
cmd->key_type = KEY_WEP;
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_SET_KEYS, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_warning("cmd set_ap_default_wep_key failed: %d", ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
kfree(cmd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl1271_cmd_set_sta_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
|
||||
u8 key_size, const u8 *key, const u8 *addr,
|
||||
u32 tx_seq_32, u16 tx_seq_16)
|
||||
{
|
||||
struct wl1271_cmd_set_sta_keys *cmd;
|
||||
struct wl1271_cmd_set_keys *cmd;
|
||||
int ret = 0;
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
@ -884,8 +1089,14 @@ int wl1271_cmd_set_sta_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (key_type != KEY_WEP)
|
||||
memcpy(cmd->addr, addr, ETH_ALEN);
|
||||
cmd->hlid = wl->sta_hlid;
|
||||
|
||||
if (key_type == KEY_WEP)
|
||||
cmd->lid_key_type = WEP_DEFAULT_LID_TYPE;
|
||||
else if (is_broadcast_ether_addr(addr))
|
||||
cmd->lid_key_type = BROADCAST_LID_TYPE;
|
||||
else
|
||||
cmd->lid_key_type = UNICAST_LID_TYPE;
|
||||
|
||||
cmd->key_action = cpu_to_le16(action);
|
||||
cmd->key_size = key_size;
|
||||
@ -894,10 +1105,7 @@ int wl1271_cmd_set_sta_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
|
||||
cmd->ac_seq_num16[0] = cpu_to_le16(tx_seq_16);
|
||||
cmd->ac_seq_num32[0] = cpu_to_le32(tx_seq_32);
|
||||
|
||||
/* we have only one SSID profile */
|
||||
cmd->ssid_profile = 0;
|
||||
|
||||
cmd->id = id;
|
||||
cmd->key_id = id;
|
||||
|
||||
if (key_type == KEY_TKIP) {
|
||||
/*
|
||||
@ -928,11 +1136,15 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: merge with sta/ibss into 1 set_key function.
|
||||
* note there are slight diffs
|
||||
*/
|
||||
int wl1271_cmd_set_ap_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
|
||||
u8 key_size, const u8 *key, u8 hlid, u32 tx_seq_32,
|
||||
u16 tx_seq_16)
|
||||
{
|
||||
struct wl1271_cmd_set_ap_keys *cmd;
|
||||
struct wl1271_cmd_set_keys *cmd;
|
||||
int ret = 0;
|
||||
u8 lid_type;
|
||||
|
||||
@ -989,45 +1201,12 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl1271_cmd_disconnect(struct wl1271 *wl)
|
||||
int wl12xx_cmd_set_peer_state(struct wl1271 *wl)
|
||||
{
|
||||
struct wl1271_cmd_disconnect *cmd;
|
||||
struct wl12xx_cmd_set_peer_state *cmd;
|
||||
int ret = 0;
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd disconnect");
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* disconnect reason is not used in immediate disconnections */
|
||||
cmd->type = DISCONNECT_IMMEDIATE;
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_DISCONNECT, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to send disconnect command");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
ret = wl1271_cmd_wait_for_event(wl, DISCONNECT_EVENT_COMPLETE_ID);
|
||||
if (ret < 0)
|
||||
wl1271_error("cmd disconnect event completion error");
|
||||
|
||||
out_free:
|
||||
kfree(cmd);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl1271_cmd_set_sta_state(struct wl1271 *wl)
|
||||
{
|
||||
struct wl1271_cmd_set_sta_state *cmd;
|
||||
int ret = 0;
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd set sta state");
|
||||
wl1271_debug(DEBUG_CMD, "cmd set peer state (hlid=%d)", wl->sta_hlid);
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
@ -1035,11 +1214,12 @@ int wl1271_cmd_set_sta_state(struct wl1271 *wl)
|
||||
goto out;
|
||||
}
|
||||
|
||||
cmd->hlid = wl->sta_hlid;
|
||||
cmd->state = WL1271_CMD_STA_STATE_CONNECTED;
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_SET_STA_STATE, cmd, sizeof(*cmd), 0);
|
||||
ret = wl1271_cmd_send(wl, CMD_SET_PEER_STATE, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to send set STA state command");
|
||||
wl1271_error("failed to send set peer state command");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
@ -1049,106 +1229,12 @@ out_free:
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl1271_cmd_start_bss(struct wl1271 *wl)
|
||||
int wl12xx_cmd_add_peer(struct wl1271 *wl, struct ieee80211_sta *sta, u8 hlid)
|
||||
{
|
||||
struct wl1271_cmd_bss_start *cmd;
|
||||
struct ieee80211_bss_conf *bss_conf = &wl->vif->bss_conf;
|
||||
struct wl12xx_cmd_add_peer *cmd;
|
||||
int ret;
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd start bss");
|
||||
|
||||
/*
|
||||
* FIXME: We currently do not support hidden SSID. The real SSID
|
||||
* should be fetched from mac80211 first.
|
||||
*/
|
||||
if (wl->ssid_len == 0) {
|
||||
wl1271_warning("Hidden SSID currently not supported for AP");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
memcpy(cmd->bssid, bss_conf->bssid, ETH_ALEN);
|
||||
|
||||
cmd->aging_period = cpu_to_le16(wl->conf.tx.ap_aging_period);
|
||||
cmd->bss_index = WL1271_AP_BSS_INDEX;
|
||||
cmd->global_hlid = WL1271_AP_GLOBAL_HLID;
|
||||
cmd->broadcast_hlid = WL1271_AP_BROADCAST_HLID;
|
||||
cmd->basic_rate_set = cpu_to_le32(wl->basic_rate_set);
|
||||
cmd->beacon_interval = cpu_to_le16(wl->beacon_int);
|
||||
cmd->dtim_interval = bss_conf->dtim_period;
|
||||
cmd->beacon_expiry = WL1271_AP_DEF_BEACON_EXP;
|
||||
cmd->channel = wl->channel;
|
||||
cmd->ssid_len = wl->ssid_len;
|
||||
cmd->ssid_type = SSID_TYPE_PUBLIC;
|
||||
memcpy(cmd->ssid, wl->ssid, wl->ssid_len);
|
||||
|
||||
switch (wl->band) {
|
||||
case IEEE80211_BAND_2GHZ:
|
||||
cmd->band = RADIO_BAND_2_4GHZ;
|
||||
break;
|
||||
case IEEE80211_BAND_5GHZ:
|
||||
cmd->band = RADIO_BAND_5GHZ;
|
||||
break;
|
||||
default:
|
||||
wl1271_warning("bss start - unknown band: %d", (int)wl->band);
|
||||
cmd->band = RADIO_BAND_2_4GHZ;
|
||||
break;
|
||||
}
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_BSS_START, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to initiate cmd start bss");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
out_free:
|
||||
kfree(cmd);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl1271_cmd_stop_bss(struct wl1271 *wl)
|
||||
{
|
||||
struct wl1271_cmd_bss_start *cmd;
|
||||
int ret;
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd stop bss");
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
cmd->bss_index = WL1271_AP_BSS_INDEX;
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_BSS_STOP, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to initiate cmd stop bss");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
out_free:
|
||||
kfree(cmd);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl1271_cmd_add_sta(struct wl1271 *wl, struct ieee80211_sta *sta, u8 hlid)
|
||||
{
|
||||
struct wl1271_cmd_add_sta *cmd;
|
||||
int ret;
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd add sta %d", (int)hlid);
|
||||
wl1271_debug(DEBUG_CMD, "cmd add peer %d", (int)hlid);
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
@ -1168,11 +1254,11 @@ int wl1271_cmd_add_sta(struct wl1271 *wl, struct ieee80211_sta *sta, u8 hlid)
|
||||
cmd->supported_rates = cpu_to_le32(wl1271_tx_enabled_rates_get(wl,
|
||||
sta->supp_rates[wl->band]));
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "new sta rates: 0x%x", cmd->supported_rates);
|
||||
wl1271_debug(DEBUG_CMD, "new peer rates: 0x%x", cmd->supported_rates);
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_ADD_STA, cmd, sizeof(*cmd), 0);
|
||||
ret = wl1271_cmd_send(wl, CMD_ADD_PEER, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to initiate cmd add sta");
|
||||
wl1271_error("failed to initiate cmd add peer");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
@ -1183,12 +1269,12 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wl1271_cmd_remove_sta(struct wl1271 *wl, u8 hlid)
|
||||
int wl12xx_cmd_remove_peer(struct wl1271 *wl, u8 hlid)
|
||||
{
|
||||
struct wl1271_cmd_remove_sta *cmd;
|
||||
struct wl12xx_cmd_remove_peer *cmd;
|
||||
int ret;
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "cmd remove sta %d", (int)hlid);
|
||||
wl1271_debug(DEBUG_CMD, "cmd remove peer %d", (int)hlid);
|
||||
|
||||
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
|
||||
if (!cmd) {
|
||||
@ -1201,9 +1287,9 @@ int wl1271_cmd_remove_sta(struct wl1271 *wl, u8 hlid)
|
||||
cmd->reason_opcode = 0;
|
||||
cmd->send_deauth_flag = 0;
|
||||
|
||||
ret = wl1271_cmd_send(wl, CMD_REMOVE_STA, cmd, sizeof(*cmd), 0);
|
||||
ret = wl1271_cmd_send(wl, CMD_REMOVE_PEER, cmd, sizeof(*cmd), 0);
|
||||
if (ret < 0) {
|
||||
wl1271_error("failed to initiate cmd remove sta");
|
||||
wl1271_error("failed to initiate cmd remove peer");
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
@ -1211,7 +1297,8 @@ int wl1271_cmd_remove_sta(struct wl1271 *wl, u8 hlid)
|
||||
* We are ok with a timeout here. The event is sometimes not sent
|
||||
* due to a firmware bug.
|
||||
*/
|
||||
wl1271_cmd_wait_for_event_or_timeout(wl, STA_REMOVE_COMPLETE_EVENT_ID);
|
||||
wl1271_cmd_wait_for_event_or_timeout(wl,
|
||||
PEER_REMOVE_COMPLETE_EVENT_ID);
|
||||
|
||||
out_free:
|
||||
kfree(cmd);
|
||||
|
@ -36,7 +36,14 @@ int wl128x_cmd_general_parms(struct wl1271 *wl);
|
||||
int wl1271_cmd_radio_parms(struct wl1271 *wl);
|
||||
int wl128x_cmd_radio_parms(struct wl1271 *wl);
|
||||
int wl1271_cmd_ext_radio_parms(struct wl1271 *wl);
|
||||
int wl1271_cmd_join(struct wl1271 *wl, u8 bss_type);
|
||||
int wl12xx_cmd_role_enable(struct wl1271 *wl, u8 role_type, u8 *role_id);
|
||||
int wl12xx_cmd_role_disable(struct wl1271 *wl, u8 *role_id);
|
||||
int wl12xx_cmd_role_start_dev(struct wl1271 *wl);
|
||||
int wl12xx_cmd_role_stop_dev(struct wl1271 *wl);
|
||||
int wl12xx_cmd_role_start_sta(struct wl1271 *wl);
|
||||
int wl12xx_cmd_role_stop_sta(struct wl1271 *wl);
|
||||
int wl12xx_cmd_role_start_ap(struct wl1271 *wl);
|
||||
int wl12xx_cmd_role_stop_ap(struct wl1271 *wl);
|
||||
int wl1271_cmd_test(struct wl1271 *wl, void *buf, size_t buf_len, u8 answer);
|
||||
int wl1271_cmd_interrogate(struct wl1271 *wl, u16 id, void *buf, size_t len);
|
||||
int wl1271_cmd_configure(struct wl1271 *wl, u16 id, void *buf, size_t len);
|
||||
@ -56,20 +63,16 @@ struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl,
|
||||
int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, __be32 ip_addr);
|
||||
int wl1271_build_qos_null_data(struct wl1271 *wl);
|
||||
int wl1271_cmd_build_klv_null_data(struct wl1271 *wl);
|
||||
int wl1271_cmd_set_sta_default_wep_key(struct wl1271 *wl, u8 id);
|
||||
int wl1271_cmd_set_ap_default_wep_key(struct wl1271 *wl, u8 id);
|
||||
int wl12xx_cmd_set_default_wep_key(struct wl1271 *wl, u8 id, u8 hlid);
|
||||
int wl1271_cmd_set_sta_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
|
||||
u8 key_size, const u8 *key, const u8 *addr,
|
||||
u32 tx_seq_32, u16 tx_seq_16);
|
||||
int wl1271_cmd_set_ap_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
|
||||
u8 key_size, const u8 *key, u8 hlid, u32 tx_seq_32,
|
||||
u16 tx_seq_16);
|
||||
int wl1271_cmd_disconnect(struct wl1271 *wl);
|
||||
int wl1271_cmd_set_sta_state(struct wl1271 *wl);
|
||||
int wl1271_cmd_start_bss(struct wl1271 *wl);
|
||||
int wl1271_cmd_stop_bss(struct wl1271 *wl);
|
||||
int wl1271_cmd_add_sta(struct wl1271 *wl, struct ieee80211_sta *sta, u8 hlid);
|
||||
int wl1271_cmd_remove_sta(struct wl1271 *wl, u8 hlid);
|
||||
int wl12xx_cmd_set_peer_state(struct wl1271 *wl);
|
||||
int wl12xx_cmd_add_peer(struct wl1271 *wl, struct ieee80211_sta *sta, u8 hlid);
|
||||
int wl12xx_cmd_remove_peer(struct wl1271 *wl, u8 hlid);
|
||||
int wl12xx_cmd_config_fwlog(struct wl1271 *wl);
|
||||
int wl12xx_cmd_start_fwlog(struct wl1271 *wl);
|
||||
int wl12xx_cmd_stop_fwlog(struct wl1271 *wl);
|
||||
@ -83,25 +86,21 @@ enum wl1271_commands {
|
||||
CMD_DISABLE_TX = 6,
|
||||
CMD_SCAN = 8,
|
||||
CMD_STOP_SCAN = 9,
|
||||
CMD_START_JOIN = 11,
|
||||
CMD_SET_KEYS = 12,
|
||||
CMD_READ_MEMORY = 13,
|
||||
CMD_WRITE_MEMORY = 14,
|
||||
CMD_SET_TEMPLATE = 19,
|
||||
CMD_TEST = 23,
|
||||
CMD_NOISE_HIST = 28,
|
||||
CMD_LNA_CONTROL = 32,
|
||||
CMD_QUIET_ELEMENT_SET_STATE = 29,
|
||||
CMD_SET_BCN_MODE = 33,
|
||||
CMD_MEASUREMENT = 34,
|
||||
CMD_STOP_MEASUREMENT = 35,
|
||||
CMD_DISCONNECT = 36,
|
||||
CMD_SET_PS_MODE = 37,
|
||||
CMD_CHANNEL_SWITCH = 38,
|
||||
CMD_STOP_CHANNEL_SWICTH = 39,
|
||||
CMD_AP_DISCOVERY = 40,
|
||||
CMD_STOP_AP_DISCOVERY = 41,
|
||||
CMD_SPS_SCAN = 42,
|
||||
CMD_STOP_SPS_SCAN = 43,
|
||||
CMD_HEALTH_CHECK = 45,
|
||||
CMD_DEBUG = 46,
|
||||
CMD_TRIGGER_SCAN_TO = 47,
|
||||
@ -109,16 +108,30 @@ enum wl1271_commands {
|
||||
CMD_CONNECTION_SCAN_SSID_CFG = 49,
|
||||
CMD_START_PERIODIC_SCAN = 50,
|
||||
CMD_STOP_PERIODIC_SCAN = 51,
|
||||
CMD_SET_STA_STATE = 52,
|
||||
CMD_CONFIG_FWLOGGER = 53,
|
||||
CMD_START_FWLOGGER = 54,
|
||||
CMD_STOP_FWLOGGER = 55,
|
||||
CMD_SET_PEER_STATE = 52,
|
||||
CMD_REMAIN_ON_CHANNEL = 53,
|
||||
CMD_CANCEL_REMAIN_ON_CHANNEL = 54,
|
||||
|
||||
/* AP mode commands */
|
||||
CMD_BSS_START = 60,
|
||||
CMD_BSS_STOP = 61,
|
||||
CMD_ADD_STA = 62,
|
||||
CMD_REMOVE_STA = 63,
|
||||
CMD_CONFIG_FWLOGGER = 55,
|
||||
CMD_START_FWLOGGER = 56,
|
||||
CMD_STOP_FWLOGGER = 57,
|
||||
|
||||
/* AP commands */
|
||||
CMD_ADD_PEER = 62,
|
||||
CMD_REMOVE_PEER = 63,
|
||||
|
||||
/* Role API */
|
||||
CMD_ROLE_ENABLE = 70,
|
||||
CMD_ROLE_DISABLE = 71,
|
||||
CMD_ROLE_START = 72,
|
||||
CMD_ROLE_STOP = 73,
|
||||
|
||||
/* WIFI Direct */
|
||||
CMD_WFD_START_DISCOVERY = 80,
|
||||
CMD_WFD_STOP_DISCOVERY = 81,
|
||||
CMD_WFD_ATTRIBUTE_CONFIG = 82,
|
||||
|
||||
CMD_NOP = 100,
|
||||
|
||||
NUM_COMMANDS,
|
||||
MAX_COMMAND_ID = 0xFFFF,
|
||||
@ -147,14 +160,12 @@ enum cmd_templ {
|
||||
CMD_TEMPL_CTS, /*
|
||||
* For CTS-to-self (FastCTS) mechanism
|
||||
* for BT/WLAN coexistence (SoftGemini). */
|
||||
CMD_TEMPL_ARP_RSP,
|
||||
CMD_TEMPL_LINK_MEASUREMENT_REPORT,
|
||||
|
||||
/* AP-mode specific */
|
||||
CMD_TEMPL_AP_BEACON = 13,
|
||||
CMD_TEMPL_AP_BEACON,
|
||||
CMD_TEMPL_AP_PROBE_RESPONSE,
|
||||
CMD_TEMPL_AP_ARP_RSP,
|
||||
CMD_TEMPL_ARP_RSP,
|
||||
CMD_TEMPL_DEAUTH_AP,
|
||||
CMD_TEMPL_TEMPORARY,
|
||||
CMD_TEMPL_LINK_MEASUREMENT_REPORT,
|
||||
|
||||
CMD_TEMPL_MAX = 0xff
|
||||
};
|
||||
@ -193,6 +204,7 @@ enum {
|
||||
CMD_STATUS_WRONG_NESTING = 19,
|
||||
CMD_STATUS_TIMEOUT = 21, /* Driver internal use.*/
|
||||
CMD_STATUS_FW_RESET = 22, /* Driver internal use.*/
|
||||
CMD_STATUS_TEMPLATE_OOM = 23,
|
||||
MAX_COMMAND_STATUS = 0xff
|
||||
};
|
||||
|
||||
@ -210,38 +222,114 @@ enum {
|
||||
#define WL1271_JOIN_CMD_TX_SESSION_OFFSET 1
|
||||
#define WL1271_JOIN_CMD_BSS_TYPE_5GHZ 0x10
|
||||
|
||||
struct wl1271_cmd_join {
|
||||
struct wl12xx_cmd_role_enable {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
__le32 bssid_lsb;
|
||||
__le16 bssid_msb;
|
||||
__le16 beacon_interval; /* in TBTTs */
|
||||
__le32 rx_config_options;
|
||||
__le32 rx_filter_options;
|
||||
u8 role_id;
|
||||
u8 role_type;
|
||||
u8 mac_address[ETH_ALEN];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* The target uses this field to determine the rate at
|
||||
* which to transmit control frame responses (such as
|
||||
* ACK or CTS frames).
|
||||
*/
|
||||
__le32 basic_rate_set;
|
||||
__le32 supported_rate_set;
|
||||
u8 dtim_interval;
|
||||
/*
|
||||
* bits 0-2: This bitwise field specifies the type
|
||||
* of BSS to start or join (BSS_TYPE_*).
|
||||
* bit 4: Band - The radio band in which to join
|
||||
* or start.
|
||||
* 0 - 2.4GHz band
|
||||
* 1 - 5GHz band
|
||||
* bits 3, 5-7: Reserved
|
||||
*/
|
||||
u8 bss_type;
|
||||
struct wl12xx_cmd_role_disable {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 padding[3];
|
||||
} __packed;
|
||||
|
||||
enum wl12xx_band {
|
||||
WL12XX_BAND_2_4GHZ = 0,
|
||||
WL12XX_BAND_5GHZ = 1,
|
||||
WL12XX_BAND_JAPAN_4_9_GHZ = 2,
|
||||
WL12XX_BAND_DEFAULT = WL12XX_BAND_2_4GHZ,
|
||||
WL12XX_BAND_INVALID = 0x7E,
|
||||
WL12XX_BAND_MAX_RADIO = 0x7F,
|
||||
};
|
||||
|
||||
struct wl12xx_cmd_role_start {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 band;
|
||||
u8 channel;
|
||||
u8 ssid_len;
|
||||
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
||||
u8 ctrl; /* JOIN_CMD_CTRL_* */
|
||||
u8 reserved[3];
|
||||
u8 padding;
|
||||
|
||||
union {
|
||||
struct {
|
||||
u8 hlid;
|
||||
u8 session;
|
||||
u8 padding_1[54];
|
||||
} __packed device;
|
||||
/* sta & p2p_cli use the same struct */
|
||||
struct {
|
||||
u8 bssid[ETH_ALEN];
|
||||
u8 hlid; /* data hlid */
|
||||
u8 session;
|
||||
__le32 remote_rates; /* remote supported rates */
|
||||
|
||||
/*
|
||||
* The target uses this field to determine the rate at
|
||||
* which to transmit control frame responses (such as
|
||||
* ACK or CTS frames).
|
||||
*/
|
||||
__le32 basic_rate_set;
|
||||
__le32 local_rates; /* local supported rates */
|
||||
|
||||
u8 ssid_type;
|
||||
u8 ssid_len;
|
||||
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
||||
|
||||
__le16 beacon_interval; /* in TBTTs */
|
||||
} __packed sta;
|
||||
struct {
|
||||
u8 bssid[ETH_ALEN];
|
||||
u8 hlid; /* data hlid */
|
||||
u8 dtim_interval;
|
||||
__le32 remote_rates; /* remote supported rates */
|
||||
|
||||
__le32 basic_rate_set;
|
||||
__le32 local_rates; /* local supported rates */
|
||||
|
||||
u8 ssid_type;
|
||||
u8 ssid_len;
|
||||
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
||||
|
||||
__le16 beacon_interval; /* in TBTTs */
|
||||
|
||||
u8 padding_1[4];
|
||||
} __packed ibss;
|
||||
/* ap & p2p_go use the same struct */
|
||||
struct {
|
||||
__le16 aging_period; /* in secs */
|
||||
u8 beacon_expiry; /* in ms */
|
||||
u8 bss_index;
|
||||
/* The host link id for the AP's global queue */
|
||||
u8 global_hlid;
|
||||
/* The host link id for the AP's broadcast queue */
|
||||
u8 broadcast_hlid;
|
||||
|
||||
__le16 beacon_interval; /* in TBTTs */
|
||||
|
||||
__le32 basic_rate_set;
|
||||
__le32 local_rates; /* local supported rates */
|
||||
|
||||
u8 dtim_interval;
|
||||
|
||||
u8 ssid_type;
|
||||
u8 ssid_len;
|
||||
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
||||
|
||||
u8 padding_1[5];
|
||||
} __packed ap;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct wl12xx_cmd_role_stop {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 disc_type; /* only STA and P2P_CLI */
|
||||
__le16 reason; /* only STA and P2P_CLI */
|
||||
} __packed;
|
||||
|
||||
struct cmd_enabledisable_path {
|
||||
@ -287,8 +375,9 @@ enum wl1271_cmd_ps_mode {
|
||||
struct wl1271_cmd_ps_params {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 ps_mode; /* STATION_* */
|
||||
u8 padding[3];
|
||||
u8 padding[2];
|
||||
} __packed;
|
||||
|
||||
/* HW encryption keys */
|
||||
@ -301,6 +390,12 @@ enum wl1271_cmd_key_action {
|
||||
MAX_KEY_ACTION = 0xffff,
|
||||
};
|
||||
|
||||
enum wl1271_cmd_lid_key_type {
|
||||
UNICAST_LID_TYPE = 0,
|
||||
BROADCAST_LID_TYPE = 1,
|
||||
WEP_DEFAULT_LID_TYPE = 2
|
||||
};
|
||||
|
||||
enum wl1271_cmd_key_type {
|
||||
KEY_NONE = 0,
|
||||
KEY_WEP = 1,
|
||||
@ -309,44 +404,7 @@ enum wl1271_cmd_key_type {
|
||||
KEY_GEM = 4,
|
||||
};
|
||||
|
||||
/* FIXME: Add description for key-types */
|
||||
|
||||
struct wl1271_cmd_set_sta_keys {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
/* Ignored for default WEP key */
|
||||
u8 addr[ETH_ALEN];
|
||||
|
||||
/* key_action_e */
|
||||
__le16 key_action;
|
||||
|
||||
__le16 reserved_1;
|
||||
|
||||
/* key size in bytes */
|
||||
u8 key_size;
|
||||
|
||||
/* key_type_e */
|
||||
u8 key_type;
|
||||
u8 ssid_profile;
|
||||
|
||||
/*
|
||||
* TKIP, AES: frame's key id field.
|
||||
* For WEP default key: key id;
|
||||
*/
|
||||
u8 id;
|
||||
u8 reserved_2[6];
|
||||
u8 key[MAX_KEY_SIZE];
|
||||
__le16 ac_seq_num16[NUM_ACCESS_CATEGORIES_COPY];
|
||||
__le32 ac_seq_num32[NUM_ACCESS_CATEGORIES_COPY];
|
||||
} __packed;
|
||||
|
||||
enum wl1271_cmd_lid_key_type {
|
||||
UNICAST_LID_TYPE = 0,
|
||||
BROADCAST_LID_TYPE = 1,
|
||||
WEP_DEFAULT_LID_TYPE = 2
|
||||
};
|
||||
|
||||
struct wl1271_cmd_set_ap_keys {
|
||||
struct wl1271_cmd_set_keys {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
/*
|
||||
@ -496,69 +554,23 @@ enum wl1271_disconnect_type {
|
||||
DISCONNECT_DISASSOC
|
||||
};
|
||||
|
||||
struct wl1271_cmd_disconnect {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
__le32 rx_config_options;
|
||||
__le32 rx_filter_options;
|
||||
|
||||
__le16 reason;
|
||||
u8 type;
|
||||
|
||||
u8 padding;
|
||||
} __packed;
|
||||
|
||||
#define WL1271_CMD_STA_STATE_CONNECTED 1
|
||||
|
||||
struct wl1271_cmd_set_sta_state {
|
||||
struct wl12xx_cmd_set_peer_state {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
u8 hlid;
|
||||
u8 state;
|
||||
u8 padding[3];
|
||||
u8 padding[2];
|
||||
} __packed;
|
||||
|
||||
enum wl1271_ssid_type {
|
||||
SSID_TYPE_PUBLIC = 0,
|
||||
SSID_TYPE_HIDDEN = 1
|
||||
enum wl12xx_ssid_type {
|
||||
WL12XX_SSID_TYPE_PUBLIC = 0,
|
||||
WL12XX_SSID_TYPE_HIDDEN = 1,
|
||||
WL12XX_SSID_TYPE_ANY = 2,
|
||||
};
|
||||
|
||||
struct wl1271_cmd_bss_start {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
/* wl1271_ssid_type */
|
||||
u8 ssid_type;
|
||||
u8 ssid_len;
|
||||
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
||||
u8 padding_1[2];
|
||||
|
||||
/* Basic rate set */
|
||||
__le32 basic_rate_set;
|
||||
/* Aging period in seconds*/
|
||||
__le16 aging_period;
|
||||
|
||||
/*
|
||||
* This field specifies the time between target beacon
|
||||
* transmission times (TBTTs), in time units (TUs).
|
||||
* Valid values are 1 to 1024.
|
||||
*/
|
||||
__le16 beacon_interval;
|
||||
u8 bssid[ETH_ALEN];
|
||||
u8 bss_index;
|
||||
/* Radio band */
|
||||
u8 band;
|
||||
u8 channel;
|
||||
/* The host link id for the AP's global queue */
|
||||
u8 global_hlid;
|
||||
/* The host link id for the AP's broadcast queue */
|
||||
u8 broadcast_hlid;
|
||||
/* DTIM count */
|
||||
u8 dtim_interval;
|
||||
/* Beacon expiry time in ms */
|
||||
u8 beacon_expiry;
|
||||
u8 padding_2[3];
|
||||
} __packed;
|
||||
|
||||
struct wl1271_cmd_add_sta {
|
||||
struct wl12xx_cmd_add_peer {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
u8 addr[ETH_ALEN];
|
||||
@ -572,7 +584,7 @@ struct wl1271_cmd_add_sta {
|
||||
u8 padding1;
|
||||
} __packed;
|
||||
|
||||
struct wl1271_cmd_remove_sta {
|
||||
struct wl12xx_cmd_remove_peer {
|
||||
struct wl1271_cmd_header header;
|
||||
|
||||
u8 hlid;
|
||||
|
@ -285,10 +285,10 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
|
||||
|
||||
if ((vector & BA_SESSION_RX_CONSTRAINT_EVENT_ID) && !is_ap) {
|
||||
wl1271_debug(DEBUG_EVENT, "BA_SESSION_RX_CONSTRAINT_EVENT_ID. "
|
||||
"ba_allowed = 0x%x", mbox->ba_allowed);
|
||||
"ba_allowed = 0x%x", mbox->rx_ba_allowed);
|
||||
|
||||
if (wl->vif)
|
||||
wl1271_stop_ba_event(wl, mbox->ba_allowed);
|
||||
wl1271_stop_ba_event(wl, mbox->rx_ba_allowed);
|
||||
}
|
||||
|
||||
if ((vector & DUMMY_PACKET_EVENT_ID) && !is_ap) {
|
||||
|
@ -49,32 +49,27 @@ enum {
|
||||
MEASUREMENT_START_EVENT_ID = BIT(8),
|
||||
MEASUREMENT_COMPLETE_EVENT_ID = BIT(9),
|
||||
SCAN_COMPLETE_EVENT_ID = BIT(10),
|
||||
SCHEDULED_SCAN_COMPLETE_EVENT_ID = BIT(11),
|
||||
WFD_DISCOVERY_COMPLETE_EVENT_ID = BIT(11),
|
||||
AP_DISCOVERY_COMPLETE_EVENT_ID = BIT(12),
|
||||
PS_REPORT_EVENT_ID = BIT(13),
|
||||
PSPOLL_DELIVERY_FAILURE_EVENT_ID = BIT(14),
|
||||
DISCONNECT_EVENT_COMPLETE_ID = BIT(15),
|
||||
JOIN_EVENT_COMPLETE_ID = BIT(16),
|
||||
/* BIT(16) is reserved */
|
||||
CHANNEL_SWITCH_COMPLETE_EVENT_ID = BIT(17),
|
||||
BSS_LOSE_EVENT_ID = BIT(18),
|
||||
REGAINED_BSS_EVENT_ID = BIT(19),
|
||||
MAX_TX_RETRY_EVENT_ID = BIT(20),
|
||||
/* STA: dummy paket for dynamic mem blocks */
|
||||
DUMMY_PACKET_EVENT_ID = BIT(21),
|
||||
/* AP: STA remove complete */
|
||||
STA_REMOVE_COMPLETE_EVENT_ID = BIT(21),
|
||||
DUMMY_PACKET_EVENT_ID = BIT(21),
|
||||
SOFT_GEMINI_SENSE_EVENT_ID = BIT(22),
|
||||
/* STA: SG prediction */
|
||||
SOFT_GEMINI_PREDICTION_EVENT_ID = BIT(23),
|
||||
/* AP: Inactive STA */
|
||||
INACTIVE_STA_EVENT_ID = BIT(23),
|
||||
CHANGE_AUTO_MODE_TIMEOUT_EVENT_ID = BIT(23),
|
||||
SOFT_GEMINI_AVALANCHE_EVENT_ID = BIT(24),
|
||||
PLT_RX_CALIBRATION_COMPLETE_EVENT_ID = BIT(25),
|
||||
DBG_EVENT_ID = BIT(26),
|
||||
HEALTH_CHECK_REPLY_EVENT_ID = BIT(27),
|
||||
INACTIVE_STA_EVENT_ID = BIT(26),
|
||||
PEER_REMOVE_COMPLETE_EVENT_ID = BIT(27),
|
||||
PERIODIC_SCAN_COMPLETE_EVENT_ID = BIT(28),
|
||||
PERIODIC_SCAN_REPORT_EVENT_ID = BIT(29),
|
||||
BA_SESSION_RX_CONSTRAINT_EVENT_ID = BIT(30),
|
||||
REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID = BIT(31),
|
||||
EVENT_MBOX_ALL_EVENT_ID = 0x7fffffff,
|
||||
};
|
||||
|
||||
@ -83,15 +78,6 @@ enum {
|
||||
EVENT_ENTER_POWER_SAVE_SUCCESS,
|
||||
};
|
||||
|
||||
struct event_debug_report {
|
||||
u8 debug_event_id;
|
||||
u8 num_params;
|
||||
__le16 pad;
|
||||
__le32 report_1;
|
||||
__le32 report_2;
|
||||
__le32 report_3;
|
||||
} __packed;
|
||||
|
||||
#define NUM_OF_RSSI_SNR_TRIGGERS 8
|
||||
|
||||
struct event_mailbox {
|
||||
@ -100,49 +86,45 @@ struct event_mailbox {
|
||||
__le32 reserved_1;
|
||||
__le32 reserved_2;
|
||||
|
||||
u8 dbg_event_id;
|
||||
u8 num_relevant_params;
|
||||
__le16 reserved_3;
|
||||
__le32 event_report_p1;
|
||||
__le32 event_report_p2;
|
||||
__le32 event_report_p3;
|
||||
|
||||
u8 number_of_scan_results;
|
||||
u8 scan_tag;
|
||||
u8 reserved_4[2];
|
||||
__le32 compl_scheduled_scan_status;
|
||||
u8 completed_scan_status;
|
||||
u8 reserved_3;
|
||||
|
||||
__le16 scheduled_scan_attended_channels;
|
||||
u8 soft_gemini_sense_info;
|
||||
u8 soft_gemini_protective_info;
|
||||
s8 rssi_snr_trigger_metric[NUM_OF_RSSI_SNR_TRIGGERS];
|
||||
u8 channel_switch_status;
|
||||
u8 scheduled_scan_status;
|
||||
u8 ps_status;
|
||||
/* tuned channel (roc) */
|
||||
u8 roc_channel;
|
||||
|
||||
/* AP FW only */
|
||||
u8 hlid_removed;
|
||||
__le16 hlid_removed_bitmap;
|
||||
|
||||
/* a bitmap of hlids for stations that have been inactive too long */
|
||||
/* bitmap of aged stations (by HLID) */
|
||||
__le16 sta_aging_status;
|
||||
|
||||
/* a bitmap of hlids for stations which didn't respond to TX */
|
||||
/* bitmap of stations (by HLID) which exceeded max tx retries */
|
||||
__le16 sta_tx_retry_exceeded;
|
||||
|
||||
/*
|
||||
* Bitmap, Each bit set represents the Role ID for which this constraint
|
||||
* is set. Range: 0 - FF, FF means ANY role
|
||||
*/
|
||||
u8 ba_role_id;
|
||||
/*
|
||||
* Bitmap, Each bit set represents the Link ID for which this constraint
|
||||
* is set. Not applicable if ba_role_id is set to ANY role (FF).
|
||||
* Range: 0 - FFFF, FFFF means ANY link in that role
|
||||
*/
|
||||
u8 ba_link_id;
|
||||
u8 ba_allowed;
|
||||
/* discovery completed results */
|
||||
u8 discovery_tag;
|
||||
u8 number_of_preq_results;
|
||||
u8 number_of_prsp_results;
|
||||
u8 reserved_5;
|
||||
|
||||
u8 reserved_5[21];
|
||||
/* rx ba constraint */
|
||||
u8 role_id; /* 0xFF means any role. */
|
||||
u8 rx_ba_allowed;
|
||||
u8 reserved_6[2];
|
||||
|
||||
u8 ps_poll_delivery_failure_role_ids;
|
||||
u8 stopped_role_ids;
|
||||
u8 started_role_ids;
|
||||
u8 change_auto_mode_timeout;
|
||||
|
||||
u8 reserved_7[12];
|
||||
} __packed;
|
||||
|
||||
int wl1271_event_unmask(struct wl1271 *wl);
|
||||
|
@ -404,12 +404,6 @@ static int wl1271_sta_hw_init_post_mem(struct wl1271 *wl)
|
||||
{
|
||||
int ret, i;
|
||||
|
||||
ret = wl1271_cmd_set_sta_default_wep_key(wl, wl->default_key);
|
||||
if (ret < 0) {
|
||||
wl1271_warning("couldn't set default key");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* disable all keep-alive templates */
|
||||
for (i = 0; i < CMD_TEMPL_KLV_IDX_MAX; i++) {
|
||||
ret = wl1271_acx_keep_alive_config(wl, i,
|
||||
|
@ -415,7 +415,7 @@ static int wl1271_check_operstate(struct wl1271 *wl, unsigned char operstate)
|
||||
if (test_and_set_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags))
|
||||
return 0;
|
||||
|
||||
ret = wl1271_cmd_set_sta_state(wl);
|
||||
ret = wl12xx_cmd_set_peer_state(wl);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@ -1982,6 +1982,8 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl,
|
||||
wl->ap_ps_map = 0;
|
||||
wl->sched_scanning = false;
|
||||
wl->role_id = WL12XX_INVALID_ROLE_ID;
|
||||
memset(wl->roles_map, 0, sizeof(wl->roles_map));
|
||||
memset(wl->links_map, 0, sizeof(wl->links_map));
|
||||
|
||||
/*
|
||||
* this is performed after the cancel_work calls and the associated
|
||||
@ -2030,7 +2032,7 @@ static int wl1271_dummy_join(struct wl1271 *wl)
|
||||
|
||||
memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
|
||||
|
||||
ret = wl1271_cmd_join(wl, wl->set_bss_type);
|
||||
ret = wl12xx_cmd_role_start_sta(wl);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
@ -2059,7 +2061,7 @@ static int wl1271_join(struct wl1271 *wl, bool set_assoc)
|
||||
if (set_assoc)
|
||||
set_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
|
||||
|
||||
ret = wl1271_cmd_join(wl, wl->set_bss_type);
|
||||
ret = wl12xx_cmd_role_start_sta(wl);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
@ -2100,7 +2102,7 @@ static int wl1271_unjoin(struct wl1271 *wl)
|
||||
int ret;
|
||||
|
||||
/* to stop listening to a channel, we disconnect */
|
||||
ret = wl1271_cmd_disconnect(wl);
|
||||
ret = wl12xx_cmd_role_stop_sta(wl);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
@ -2472,7 +2474,8 @@ static int wl1271_ap_init_hwenc(struct wl1271 *wl)
|
||||
}
|
||||
|
||||
if (wep_key_added) {
|
||||
ret = wl1271_cmd_set_ap_default_wep_key(wl, wl->default_key);
|
||||
ret = wl12xx_cmd_set_default_wep_key(wl, wl->default_key,
|
||||
WL1271_AP_BROADCAST_HLID);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
}
|
||||
@ -2550,8 +2553,9 @@ static int wl1271_set_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
|
||||
|
||||
/* the default WEP key needs to be configured at least once */
|
||||
if (key_type == KEY_WEP) {
|
||||
ret = wl1271_cmd_set_sta_default_wep_key(wl,
|
||||
wl->default_key);
|
||||
ret = wl12xx_cmd_set_default_wep_key(wl,
|
||||
wl->default_key,
|
||||
wl->sta_hlid);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
@ -3008,7 +3012,7 @@ static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
|
||||
if ((changed & BSS_CHANGED_BEACON_ENABLED)) {
|
||||
if (bss_conf->enable_beacon) {
|
||||
if (!test_bit(WL1271_FLAG_AP_STARTED, &wl->flags)) {
|
||||
ret = wl1271_cmd_start_bss(wl);
|
||||
ret = wl12xx_cmd_role_start_ap(wl);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
@ -3021,7 +3025,7 @@ static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
|
||||
}
|
||||
} else {
|
||||
if (test_bit(WL1271_FLAG_AP_STARTED, &wl->flags)) {
|
||||
ret = wl1271_cmd_stop_bss(wl);
|
||||
ret = wl12xx_cmd_role_stop_ap(wl);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
@ -3532,7 +3536,7 @@ static int wl1271_op_sta_add(struct ieee80211_hw *hw,
|
||||
if (ret < 0)
|
||||
goto out_free_sta;
|
||||
|
||||
ret = wl1271_cmd_add_sta(wl, sta, hlid);
|
||||
ret = wl12xx_cmd_add_peer(wl, sta, hlid);
|
||||
if (ret < 0)
|
||||
goto out_sleep;
|
||||
|
||||
@ -3575,7 +3579,7 @@ static int wl1271_op_sta_remove(struct ieee80211_hw *hw,
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = wl1271_cmd_remove_sta(wl, wl_sta->hlid);
|
||||
ret = wl12xx_cmd_remove_peer(wl, wl_sta->hlid);
|
||||
if (ret < 0)
|
||||
goto out_sleep;
|
||||
|
||||
|
@ -37,9 +37,10 @@ static int wl1271_set_default_wep_key(struct wl1271 *wl, u8 id)
|
||||
bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
|
||||
|
||||
if (is_ap)
|
||||
ret = wl1271_cmd_set_ap_default_wep_key(wl, id);
|
||||
ret = wl12xx_cmd_set_default_wep_key(wl, id,
|
||||
WL1271_AP_BROADCAST_HLID);
|
||||
else
|
||||
ret = wl1271_cmd_set_sta_default_wep_key(wl, id);
|
||||
ret = wl12xx_cmd_set_default_wep_key(wl, id, wl->sta_hlid);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -137,6 +137,7 @@ extern u32 wl12xx_debug_level;
|
||||
#define WL1271_DEFAULT_BEACON_INT 100
|
||||
#define WL1271_DEFAULT_DTIM_PERIOD 1
|
||||
|
||||
#define WL12XX_MAX_ROLES 4
|
||||
#define WL12XX_MAX_LINKS 8
|
||||
#define WL12XX_INVALID_ROLE_ID 0xff
|
||||
#define WL12XX_INVALID_LINK_ID 0xff
|
||||
@ -394,6 +395,10 @@ struct wl1271 {
|
||||
int channel;
|
||||
u8 role_id;
|
||||
u8 sta_hlid;
|
||||
u8 dev_hlid;
|
||||
|
||||
unsigned long links_map[BITS_TO_LONGS(WL12XX_MAX_LINKS)];
|
||||
unsigned long roles_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];
|
||||
|
||||
struct wl1271_acx_mem_map *target_mem_map;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user