Commit 7f097988 authored by Eliad Peller's avatar Eliad Peller Committed by Luciano Coelho

wl12xx: update acx commands

Update the acx commands according to the new fw api
(fw >= 6/7.3.0.0.75).

The main change in most of the ACXs is the addition
of a new role_id/link_id field, which is required
for multi-role operation.

Currently, we don't really support multi-role, as
most of our data (inside wl) is global.
As the current fw doesn't support concurrent roles
yet, keep it this way and add wl->role_id and
wl->sta_hlid to save the active role/link.
Signed-off-by: default avatarEliad Peller <eliad@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent 4d56ad9c
...@@ -46,6 +46,7 @@ int wl1271_acx_wake_up_conditions(struct wl1271 *wl) ...@@ -46,6 +46,7 @@ int wl1271_acx_wake_up_conditions(struct wl1271 *wl)
goto out; goto out;
} }
wake_up->role_id = wl->role_id;
wake_up->wake_up_event = wl->conf.conn.wake_up_event; wake_up->wake_up_event = wl->conf.conn.wake_up_event;
wake_up->listen_interval = wl->conf.conn.listen_interval; wake_up->listen_interval = wl->conf.conn.listen_interval;
...@@ -101,6 +102,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power) ...@@ -101,6 +102,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power)
goto out; goto out;
} }
acx->role_id = wl->role_id;
acx->current_tx_power = power * 10; acx->current_tx_power = power * 10;
ret = wl1271_cmd_configure(wl, DOT11_CUR_TX_PWR, acx, sizeof(*acx)); ret = wl1271_cmd_configure(wl, DOT11_CUR_TX_PWR, acx, sizeof(*acx));
...@@ -128,6 +130,7 @@ int wl1271_acx_feature_cfg(struct wl1271 *wl) ...@@ -128,6 +130,7 @@ int wl1271_acx_feature_cfg(struct wl1271 *wl)
} }
/* DF_ENCRYPTION_DISABLE and DF_SNIFF_MODE_ENABLE are disabled */ /* DF_ENCRYPTION_DISABLE and DF_SNIFF_MODE_ENABLE are disabled */
feature->role_id = wl->role_id;
feature->data_flow_options = 0; feature->data_flow_options = 0;
feature->options = 0; feature->options = 0;
...@@ -222,6 +225,7 @@ int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time) ...@@ -222,6 +225,7 @@ int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time)
goto out; goto out;
} }
slot->role_id = wl->role_id;
slot->wone_index = STATION_WONE_INDEX; slot->wone_index = STATION_WONE_INDEX;
slot->slot_time = slot_time; slot->slot_time = slot_time;
...@@ -251,6 +255,7 @@ int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable, ...@@ -251,6 +255,7 @@ int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable,
} }
/* MAC filtering */ /* MAC filtering */
acx->role_id = wl->role_id;
acx->enabled = enable; acx->enabled = enable;
acx->num_groups = mc_list_len; acx->num_groups = mc_list_len;
memcpy(acx->mac_table, mc_list, mc_list_len * ETH_ALEN); memcpy(acx->mac_table, mc_list, mc_list_len * ETH_ALEN);
...@@ -280,6 +285,7 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl) ...@@ -280,6 +285,7 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl)
wl1271_debug(DEBUG_ACX, "acx service period timeout"); wl1271_debug(DEBUG_ACX, "acx service period timeout");
rx_timeout->role_id = wl->role_id;
rx_timeout->ps_poll_timeout = cpu_to_le16(wl->conf.rx.ps_poll_timeout); rx_timeout->ps_poll_timeout = cpu_to_le16(wl->conf.rx.ps_poll_timeout);
rx_timeout->upsd_timeout = cpu_to_le16(wl->conf.rx.upsd_timeout); rx_timeout->upsd_timeout = cpu_to_le16(wl->conf.rx.upsd_timeout);
...@@ -316,6 +322,7 @@ int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold) ...@@ -316,6 +322,7 @@ int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold)
goto out; goto out;
} }
rts->role_id = wl->role_id;
rts->threshold = cpu_to_le16((u16)rts_threshold); rts->threshold = cpu_to_le16((u16)rts_threshold);
ret = wl1271_cmd_configure(wl, DOT11_RTS_THRESHOLD, rts, sizeof(*rts)); ret = wl1271_cmd_configure(wl, DOT11_RTS_THRESHOLD, rts, sizeof(*rts));
...@@ -375,6 +382,7 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter) ...@@ -375,6 +382,7 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter)
goto out; goto out;
} }
beacon_filter->role_id = wl->role_id;
beacon_filter->enable = enable_filter; beacon_filter->enable = enable_filter;
/* /*
...@@ -411,6 +419,7 @@ int wl1271_acx_beacon_filter_table(struct wl1271 *wl) ...@@ -411,6 +419,7 @@ int wl1271_acx_beacon_filter_table(struct wl1271 *wl)
} }
/* configure default beacon pass-through rules */ /* configure default beacon pass-through rules */
ie_table->role_id = wl->role_id;
ie_table->num_ie = 0; ie_table->num_ie = 0;
for (i = 0; i < wl->conf.conn.bcn_filt_ie_count; i++) { for (i = 0; i < wl->conf.conn.bcn_filt_ie_count; i++) {
struct conf_bcn_filt_rule *r = &(wl->conf.conn.bcn_filt_ie[i]); struct conf_bcn_filt_rule *r = &(wl->conf.conn.bcn_filt_ie[i]);
...@@ -472,6 +481,7 @@ int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable) ...@@ -472,6 +481,7 @@ int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable)
timeout = wl->conf.conn.bss_lose_timeout; timeout = wl->conf.conn.bss_lose_timeout;
} }
acx->role_id = wl->role_id;
acx->synch_fail_thold = cpu_to_le32(threshold); acx->synch_fail_thold = cpu_to_le32(threshold);
acx->bss_lose_timeout = cpu_to_le32(timeout); acx->bss_lose_timeout = cpu_to_le32(timeout);
...@@ -619,6 +629,7 @@ int wl1271_acx_bcn_dtim_options(struct wl1271 *wl) ...@@ -619,6 +629,7 @@ int wl1271_acx_bcn_dtim_options(struct wl1271 *wl)
goto out; goto out;
} }
bb->role_id = wl->role_id;
bb->beacon_rx_timeout = cpu_to_le16(wl->conf.conn.beacon_rx_timeout); bb->beacon_rx_timeout = cpu_to_le16(wl->conf.conn.beacon_rx_timeout);
bb->broadcast_timeout = cpu_to_le16(wl->conf.conn.broadcast_timeout); bb->broadcast_timeout = cpu_to_le16(wl->conf.conn.broadcast_timeout);
bb->rx_broadcast_in_ps = wl->conf.conn.rx_broadcast_in_ps; bb->rx_broadcast_in_ps = wl->conf.conn.rx_broadcast_in_ps;
...@@ -648,6 +659,7 @@ int wl1271_acx_aid(struct wl1271 *wl, u16 aid) ...@@ -648,6 +659,7 @@ int wl1271_acx_aid(struct wl1271 *wl, u16 aid)
goto out; goto out;
} }
acx_aid->role_id = wl->role_id;
acx_aid->aid = cpu_to_le16(aid); acx_aid->aid = cpu_to_le16(aid);
ret = wl1271_cmd_configure(wl, ACX_AID, acx_aid, sizeof(*acx_aid)); ret = wl1271_cmd_configure(wl, ACX_AID, acx_aid, sizeof(*acx_aid));
...@@ -703,6 +715,7 @@ int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble) ...@@ -703,6 +715,7 @@ int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble)
goto out; goto out;
} }
acx->role_id = wl->role_id;
acx->preamble = preamble; acx->preamble = preamble;
ret = wl1271_cmd_configure(wl, ACX_PREAMBLE_TYPE, acx, sizeof(*acx)); ret = wl1271_cmd_configure(wl, ACX_PREAMBLE_TYPE, acx, sizeof(*acx));
...@@ -730,6 +743,7 @@ int wl1271_acx_cts_protect(struct wl1271 *wl, ...@@ -730,6 +743,7 @@ int wl1271_acx_cts_protect(struct wl1271 *wl,
goto out; goto out;
} }
acx->role_id = wl->role_id;
acx->ctsprotect = ctsprotect; acx->ctsprotect = ctsprotect;
ret = wl1271_cmd_configure(wl, ACX_CTS_PROTECTION, acx, sizeof(*acx)); ret = wl1271_cmd_configure(wl, ACX_CTS_PROTECTION, acx, sizeof(*acx));
...@@ -761,9 +775,8 @@ int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats) ...@@ -761,9 +775,8 @@ int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats)
int wl1271_acx_sta_rate_policies(struct wl1271 *wl) int wl1271_acx_sta_rate_policies(struct wl1271 *wl)
{ {
struct acx_sta_rate_policy *acx; struct acx_rate_policy *acx;
struct conf_tx_rate_class *c = &wl->conf.tx.sta_rc_conf; struct conf_tx_rate_class *c = &wl->conf.tx.sta_rc_conf;
int idx = 0;
int ret = 0; int ret = 0;
wl1271_debug(DEBUG_ACX, "acx rate policies"); wl1271_debug(DEBUG_ACX, "acx rate policies");
...@@ -775,25 +788,30 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl) ...@@ -775,25 +788,30 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl)
goto out; goto out;
} }
wl1271_debug(DEBUG_ACX, "basic_rate: 0x%x, full_rate: 0x%x",
wl->basic_rate, wl->rate_set);
/* configure one basic rate class */ /* configure one basic rate class */
idx = ACX_TX_BASIC_RATE; acx->rate_policy_idx = cpu_to_le32(ACX_TX_BASIC_RATE);
acx->rate_class[idx].enabled_rates = cpu_to_le32(wl->basic_rate); acx->rate_policy.enabled_rates = cpu_to_le32(wl->basic_rate);
acx->rate_class[idx].short_retry_limit = c->short_retry_limit; acx->rate_policy.short_retry_limit = c->short_retry_limit;
acx->rate_class[idx].long_retry_limit = c->long_retry_limit; acx->rate_policy.long_retry_limit = c->long_retry_limit;
acx->rate_class[idx].aflags = c->aflags; acx->rate_policy.aflags = c->aflags;
ret = wl1271_cmd_configure(wl, ACX_RATE_POLICY, acx, sizeof(*acx));
if (ret < 0) {
wl1271_warning("Setting of rate policies failed: %d", ret);
goto out;
}
/* configure one AP supported rate class */ /* configure one AP supported rate class */
idx = ACX_TX_AP_FULL_RATE; acx->rate_policy_idx = cpu_to_le32(ACX_TX_AP_FULL_RATE);
acx->rate_class[idx].enabled_rates = cpu_to_le32(wl->rate_set); acx->rate_policy.enabled_rates = cpu_to_le32(wl->rate_set);
acx->rate_class[idx].short_retry_limit = c->short_retry_limit; acx->rate_policy.short_retry_limit = c->short_retry_limit;
acx->rate_class[idx].long_retry_limit = c->long_retry_limit; acx->rate_policy.long_retry_limit = c->long_retry_limit;
acx->rate_class[idx].aflags = c->aflags; acx->rate_policy.aflags = c->aflags;
acx->rate_class_cnt = cpu_to_le32(ACX_TX_RATE_POLICY_CNT);
wl1271_debug(DEBUG_ACX, "basic_rate: 0x%x, full_rate: 0x%x",
acx->rate_class[ACX_TX_BASIC_RATE].enabled_rates,
acx->rate_class[ACX_TX_AP_FULL_RATE].enabled_rates);
ret = wl1271_cmd_configure(wl, ACX_RATE_POLICY, acx, sizeof(*acx)); ret = wl1271_cmd_configure(wl, ACX_RATE_POLICY, acx, sizeof(*acx));
if (ret < 0) { if (ret < 0) {
...@@ -809,7 +827,7 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl) ...@@ -809,7 +827,7 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl)
int wl1271_acx_ap_rate_policy(struct wl1271 *wl, struct conf_tx_rate_class *c, int wl1271_acx_ap_rate_policy(struct wl1271 *wl, struct conf_tx_rate_class *c,
u8 idx) u8 idx)
{ {
struct acx_ap_rate_policy *acx; struct acx_rate_policy *acx;
int ret = 0; int ret = 0;
wl1271_debug(DEBUG_ACX, "acx ap rate policy %d rates 0x%x", wl1271_debug(DEBUG_ACX, "acx ap rate policy %d rates 0x%x",
...@@ -855,6 +873,7 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, ...@@ -855,6 +873,7 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max,
goto out; goto out;
} }
acx->role_id = wl->role_id;
acx->ac = ac; acx->ac = ac;
acx->cw_min = cw_min; acx->cw_min = cw_min;
acx->cw_max = cpu_to_le16(cw_max); acx->cw_max = cpu_to_le16(cw_max);
...@@ -888,6 +907,7 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, ...@@ -888,6 +907,7 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type,
goto out; goto out;
} }
acx->role_id = wl->role_id;
acx->queue_id = queue_id; acx->queue_id = queue_id;
acx->channel_type = channel_type; acx->channel_type = channel_type;
acx->tsid = tsid; acx->tsid = tsid;
...@@ -967,52 +987,9 @@ int wl1271_acx_tx_config_options(struct wl1271 *wl) ...@@ -967,52 +987,9 @@ int wl1271_acx_tx_config_options(struct wl1271 *wl)
return ret; return ret;
} }
int wl1271_acx_ap_mem_cfg(struct wl1271 *wl) int wl12xx_acx_mem_cfg(struct wl1271 *wl)
{
struct wl1271_acx_ap_config_memory *mem_conf;
struct conf_memory_settings *mem;
int ret;
wl1271_debug(DEBUG_ACX, "wl1271 mem cfg");
mem_conf = kzalloc(sizeof(*mem_conf), GFP_KERNEL);
if (!mem_conf) {
ret = -ENOMEM;
goto out;
}
if (wl->chip.id == CHIP_ID_1283_PG20)
/*
* FIXME: The 128x AP FW does not yet support dynamic memory.
* Use the base memory configuration for 128x for now. This
* should be fine tuned in the future.
*/
mem = &wl->conf.mem_wl128x;
else
mem = &wl->conf.mem_wl127x;
/* memory config */
mem_conf->num_stations = mem->num_stations;
mem_conf->rx_mem_block_num = mem->rx_block_num;
mem_conf->tx_min_mem_block_num = mem->tx_min_block_num;
mem_conf->num_ssid_profiles = mem->ssid_profiles;
mem_conf->total_tx_descriptors = cpu_to_le32(ACX_TX_DESCRIPTORS);
ret = wl1271_cmd_configure(wl, ACX_MEM_CFG, mem_conf,
sizeof(*mem_conf));
if (ret < 0) {
wl1271_warning("wl1271 mem config failed: %d", ret);
goto out;
}
out:
kfree(mem_conf);
return ret;
}
int wl1271_acx_sta_mem_cfg(struct wl1271 *wl)
{ {
struct wl1271_acx_sta_config_memory *mem_conf; struct wl12xx_acx_config_memory *mem_conf;
struct conf_memory_settings *mem; struct conf_memory_settings *mem;
int ret; int ret;
...@@ -1155,6 +1132,7 @@ int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable) ...@@ -1155,6 +1132,7 @@ int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable)
goto out; goto out;
} }
acx->role_id = wl->role_id;
acx->enable = enable ? CONF_BET_MODE_ENABLE : CONF_BET_MODE_DISABLE; acx->enable = enable ? CONF_BET_MODE_ENABLE : CONF_BET_MODE_DISABLE;
acx->max_consecutive = wl->conf.conn.bet_max_consecutive; acx->max_consecutive = wl->conf.conn.bet_max_consecutive;
...@@ -1182,6 +1160,7 @@ int wl1271_acx_arp_ip_filter(struct wl1271 *wl, u8 enable, __be32 address) ...@@ -1182,6 +1160,7 @@ int wl1271_acx_arp_ip_filter(struct wl1271 *wl, u8 enable, __be32 address)
goto out; goto out;
} }
acx->role_id = wl->role_id;
acx->version = ACX_IPV4_VERSION; acx->version = ACX_IPV4_VERSION;
acx->enable = enable; acx->enable = enable;
...@@ -1241,6 +1220,7 @@ int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable) ...@@ -1241,6 +1220,7 @@ int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable)
goto out; goto out;
} }
acx->role_id = wl->role_id;
acx->enabled = enable; acx->enabled = enable;
ret = wl1271_cmd_configure(wl, ACX_KEEP_ALIVE_MODE, acx, sizeof(*acx)); ret = wl1271_cmd_configure(wl, ACX_KEEP_ALIVE_MODE, acx, sizeof(*acx));
...@@ -1267,6 +1247,7 @@ int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid) ...@@ -1267,6 +1247,7 @@ int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid)
goto out; goto out;
} }
acx->role_id = wl->role_id;
acx->period = cpu_to_le32(wl->conf.conn.keep_alive_interval); acx->period = cpu_to_le32(wl->conf.conn.keep_alive_interval);
acx->index = index; acx->index = index;
acx->tpl_validation = tpl_valid; acx->tpl_validation = tpl_valid;
...@@ -1300,6 +1281,7 @@ int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable, ...@@ -1300,6 +1281,7 @@ int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable,
wl->last_rssi_event = -1; wl->last_rssi_event = -1;
acx->role_id = wl->role_id;
acx->pacing = cpu_to_le16(wl->conf.roam_trigger.trigger_pacing); acx->pacing = cpu_to_le16(wl->conf.roam_trigger.trigger_pacing);
acx->metric = WL1271_ACX_TRIG_METRIC_RSSI_BEACON; acx->metric = WL1271_ACX_TRIG_METRIC_RSSI_BEACON;
acx->type = WL1271_ACX_TRIG_TYPE_EDGE; acx->type = WL1271_ACX_TRIG_TYPE_EDGE;
...@@ -1338,6 +1320,7 @@ int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl) ...@@ -1338,6 +1320,7 @@ int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl)
goto out; goto out;
} }
acx->role_id = wl->role_id;
acx->rssi_beacon = c->avg_weight_rssi_beacon; acx->rssi_beacon = c->avg_weight_rssi_beacon;
acx->rssi_data = c->avg_weight_rssi_data; acx->rssi_data = c->avg_weight_rssi_data;
acx->snr_beacon = c->avg_weight_snr_beacon; acx->snr_beacon = c->avg_weight_snr_beacon;
...@@ -1359,7 +1342,6 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl, ...@@ -1359,7 +1342,6 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
bool allow_ht_operation) bool allow_ht_operation)
{ {
struct wl1271_acx_ht_capabilities *acx; struct wl1271_acx_ht_capabilities *acx;
u8 mac_address[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
int ret = 0; int ret = 0;
u32 ht_capabilites = 0; u32 ht_capabilites = 0;
...@@ -1390,7 +1372,7 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl, ...@@ -1390,7 +1372,7 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
acx->ampdu_min_spacing = ht_cap->ampdu_density; acx->ampdu_min_spacing = ht_cap->ampdu_density;
} }
memcpy(acx->mac_address, mac_address, ETH_ALEN); acx->hlid = wl->sta_hlid;
acx->ht_capabilites = cpu_to_le32(ht_capabilites); acx->ht_capabilites = cpu_to_le32(ht_capabilites);
ret = wl1271_cmd_configure(wl, ACX_PEER_HT_CAP, acx, sizeof(*acx)); ret = wl1271_cmd_configure(wl, ACX_PEER_HT_CAP, acx, sizeof(*acx));
...@@ -1418,6 +1400,7 @@ int wl1271_acx_set_ht_information(struct wl1271 *wl, ...@@ -1418,6 +1400,7 @@ int wl1271_acx_set_ht_information(struct wl1271 *wl,
goto out; goto out;
} }
acx->role_id = wl->role_id;
acx->ht_protection = acx->ht_protection =
(u8)(ht_operation_mode & IEEE80211_HT_OP_MODE_PROTECTION); (u8)(ht_operation_mode & IEEE80211_HT_OP_MODE_PROTECTION);
acx->rifs_mode = 0; acx->rifs_mode = 0;
...@@ -1578,6 +1561,7 @@ int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable) ...@@ -1578,6 +1561,7 @@ int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable)
if (!(conf_queues & BIT(i))) if (!(conf_queues & BIT(i)))
continue; continue;
rx_streaming->role_id = wl->role_id;
rx_streaming->tid = i; rx_streaming->tid = i;
rx_streaming->enable = enable_queues & BIT(i); rx_streaming->enable = enable_queues & BIT(i);
rx_streaming->period = wl->conf.rx_streaming.interval; rx_streaming->period = wl->conf.rx_streaming.interval;
...@@ -1607,6 +1591,7 @@ int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) ...@@ -1607,6 +1591,7 @@ int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl)
if (!acx) if (!acx)
return -ENOMEM; return -ENOMEM;
acx->role_id = wl->role_id;
acx->max_tx_retry = cpu_to_le16(wl->conf.tx.max_tx_retries); acx->max_tx_retry = cpu_to_le16(wl->conf.tx.max_tx_retries);
ret = wl1271_cmd_configure(wl, ACX_MAX_TX_FAILURE, acx, sizeof(*acx)); ret = wl1271_cmd_configure(wl, ACX_MAX_TX_FAILURE, acx, sizeof(*acx));
......
...@@ -101,6 +101,17 @@ struct acx_error_counter { ...@@ -101,6 +101,17 @@ struct acx_error_counter {
__le32 seq_num_miss; __le32 seq_num_miss;
} __packed; } __packed;
enum wl12xx_role {
WL1271_ROLE_STA = 0,
WL1271_ROLE_IBSS,
WL1271_ROLE_AP,
WL1271_ROLE_DEVICE,
WL1271_ROLE_P2P_CL,
WL1271_ROLE_P2P_GO,
WL12XX_INVALID_ROLE_TYPE = 0xff
};
enum wl1271_psm_mode { enum wl1271_psm_mode {
/* Active mode */ /* Active mode */
WL1271_PSM_CAM = 0, WL1271_PSM_CAM = 0,
...@@ -179,9 +190,10 @@ enum acx_slot_type { ...@@ -179,9 +190,10 @@ enum acx_slot_type {
struct acx_slot { struct acx_slot {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 wone_index; /* Reserved */ u8 wone_index; /* Reserved */
u8 slot_time; u8 slot_time;
u8 reserved[6]; u8 reserved[5];
} __packed; } __packed;
...@@ -191,29 +203,35 @@ struct acx_slot { ...@@ -191,29 +203,35 @@ struct acx_slot {
struct acx_dot11_grp_addr_tbl { struct acx_dot11_grp_addr_tbl {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 enabled; u8 enabled;
u8 num_groups; u8 num_groups;
u8 pad[2]; u8 pad[1];
u8 mac_table[ADDRESS_GROUP_MAX_LEN]; u8 mac_table[ADDRESS_GROUP_MAX_LEN];
} __packed; } __packed;
struct acx_rx_timeout { struct acx_rx_timeout {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 reserved;
__le16 ps_poll_timeout; __le16 ps_poll_timeout;
__le16 upsd_timeout; __le16 upsd_timeout;
u8 padding[2];
} __packed; } __packed;
struct acx_rts_threshold { struct acx_rts_threshold {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 reserved;
__le16 threshold; __le16 threshold;
u8 pad[2];
} __packed; } __packed;
struct acx_beacon_filter_option { struct acx_beacon_filter_option {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 enable; u8 enable;
/* /*
* The number of beacons without the unicast TIM * The number of beacons without the unicast TIM
...@@ -223,7 +241,7 @@ struct acx_beacon_filter_option { ...@@ -223,7 +241,7 @@ struct acx_beacon_filter_option {
* without the unicast TIM bit set are dropped. * without the unicast TIM bit set are dropped.
*/ */
u8 max_num_beacons; u8 max_num_beacons;
u8 pad[2]; u8 pad[1];
} __packed; } __packed;
/* /*
...@@ -262,14 +280,17 @@ struct acx_beacon_filter_option { ...@@ -262,14 +280,17 @@ struct acx_beacon_filter_option {
struct acx_beacon_filter_ie_table { struct acx_beacon_filter_ie_table {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 num_ie; u8 num_ie;
u8 pad[3]; u8 pad[2];
u8 table[BEACON_FILTER_TABLE_MAX_SIZE]; u8 table[BEACON_FILTER_TABLE_MAX_SIZE];
} __packed; } __packed;
struct acx_conn_monit_params { struct acx_conn_monit_params {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 padding[3];
__le32 synch_fail_thold; /* number of beacons missed */ __le32 synch_fail_thold; /* number of beacons missed */
__le32 bss_lose_timeout; /* number of TU's from synch fail */ __le32 bss_lose_timeout; /* number of TU's from synch fail */
} __packed; } __packed;
...@@ -318,15 +339,16 @@ struct acx_energy_detection { ...@@ -318,15 +339,16 @@ struct acx_energy_detection {
struct acx_beacon_broadcast { struct acx_beacon_broadcast {
struct acx_header header; struct acx_header header;
__le16 beacon_rx_timeout; u8 role_id;
__le16 broadcast_timeout;
/* Enables receiving of broadcast packets in PS mode */ /* Enables receiving of broadcast packets in PS mode */
u8 rx_broadcast_in_ps; u8 rx_broadcast_in_ps;
__le16 beacon_rx_timeout;
__le16 broadcast_timeout;
/* Consecutive PS Poll failures before updating the host */ /* Consecutive PS Poll failures before updating the host */
u8 ps_poll_threshold; u8 ps_poll_threshold;
u8 pad[2]; u8 pad[1];
} __packed; } __packed;
struct acx_event_mask { struct acx_event_mask {
...@@ -348,6 +370,8 @@ struct acx_event_mask { ...@@ -348,6 +370,8 @@ struct acx_event_mask {
struct acx_feature_config { struct acx_feature_config {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 padding[3];
__le32 options; __le32 options;
__le32 data_flow_options; __le32 data_flow_options;
} __packed; } __packed;
...@@ -355,16 +379,18 @@ struct acx_feature_config { ...@@ -355,16 +379,18 @@ struct acx_feature_config {
struct acx_current_tx_power { struct acx_current_tx_power {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 current_tx_power; u8 current_tx_power;
u8 padding[3]; u8 padding[2];
} __packed; } __packed;
struct acx_wake_up_condition { struct acx_wake_up_condition {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 wake_up_event; /* Only one bit can be set */ u8 wake_up_event; /* Only one bit can be set */
u8 listen_interval; u8 listen_interval;
u8 pad[2]; u8 pad[1];
} __packed; } __packed;
struct acx_aid { struct acx_aid {
...@@ -373,8 +399,9 @@ struct acx_aid { ...@@ -373,8 +399,9 @@ struct acx_aid {
/* /*
* To be set when associated with an AP. * To be set when associated with an AP.
*/ */
u8 role_id;
u8 reserved;
__le16 aid; __le16 aid;
u8 pad[2];
} __packed; } __packed;
enum acx_preamble_type { enum acx_preamble_type {
...@@ -389,8 +416,9 @@ struct acx_preamble { ...@@ -389,8 +416,9 @@ struct acx_preamble {
* When set, the WiLink transmits the frames with a short preamble and * When set, the WiLink transmits the frames with a short preamble and
* when cleared, the WiLink transmits the frames with a long preamble. * when cleared, the WiLink transmits the frames with a long preamble.
*/ */
u8 role_id;
u8 preamble; u8 preamble;
u8 padding[3]; u8 padding[2];
} __packed; } __packed;
enum acx_ctsprotect_type { enum acx_ctsprotect_type {
...@@ -400,8 +428,9 @@ enum acx_ctsprotect_type { ...@@ -400,8 +428,9 @@ enum acx_ctsprotect_type {
struct acx_ctsprotect { struct acx_ctsprotect {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 ctsprotect; u8 ctsprotect;
u8 padding[3]; u8 padding[2];
} __packed; } __packed;
struct acx_tx_statistics { struct acx_tx_statistics {
...@@ -636,18 +665,9 @@ struct acx_rate_class { ...@@ -636,18 +665,9 @@ struct acx_rate_class {
#define ACX_TX_BASIC_RATE 0 #define ACX_TX_BASIC_RATE 0
#define ACX_TX_AP_FULL_RATE 1 #define ACX_TX_AP_FULL_RATE 1
#define ACX_TX_RATE_POLICY_CNT 2
struct acx_sta_rate_policy {
struct acx_header header;
__le32 rate_class_cnt;
struct acx_rate_class rate_class[CONF_TX_MAX_RATE_CLASSES];
} __packed;
#define ACX_TX_AP_MODE_MGMT_RATE 4 #define ACX_TX_AP_MODE_MGMT_RATE 4
#define ACX_TX_AP_MODE_BCST_RATE 5 #define ACX_TX_AP_MODE_BCST_RATE 5
struct acx_ap_rate_policy { struct acx_rate_policy {
struct acx_header header; struct acx_header header;
__le32 rate_policy_idx; __le32 rate_policy_idx;
...@@ -656,22 +676,23 @@ struct acx_ap_rate_policy { ...@@ -656,22 +676,23 @@ struct acx_ap_rate_policy {
struct acx_ac_cfg { struct acx_ac_cfg {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 ac; u8 ac;
u8 aifsn;
u8 cw_min; u8 cw_min;
__le16 cw_max; __le16 cw_max;
u8 aifsn;
u8 reserved;
__le16 tx_op_limit; __le16 tx_op_limit;
} __packed; } __packed;
struct acx_tid_config { struct acx_tid_config {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 queue_id; u8 queue_id;
u8 channel_type; u8 channel_type;
u8 tsid; u8 tsid;
u8 ps_scheme; u8 ps_scheme;
u8 ack_policy; u8 ack_policy;
u8 padding[3]; u8 padding[2];
__le32 apsd_conf[2]; __le32 apsd_conf[2];
} __packed; } __packed;
...@@ -687,19 +708,7 @@ struct acx_tx_config_options { ...@@ -687,19 +708,7 @@ struct acx_tx_config_options {
__le16 tx_compl_threshold; /* number of packets */ __le16 tx_compl_threshold; /* number of packets */
} __packed; } __packed;
#define ACX_TX_DESCRIPTORS 32 struct wl12xx_acx_config_memory {
struct wl1271_acx_ap_config_memory {
struct acx_header header;
u8 rx_mem_block_num;
u8 tx_min_mem_block_num;
u8 num_stations;
u8 num_ssid_profiles;
__le32 total_tx_descriptors;
} __packed;
struct wl1271_acx_sta_config_memory {
struct acx_header header; struct acx_header header;
u8 rx_mem_block_num; u8 rx_mem_block_num;
...@@ -773,9 +782,10 @@ struct wl1271_acx_rx_config_opt { ...@@ -773,9 +782,10 @@ struct wl1271_acx_rx_config_opt {
struct wl1271_acx_bet_enable { struct wl1271_acx_bet_enable {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 enable; u8 enable;
u8 max_consecutive; u8 max_consecutive;
u8 padding[2]; u8 padding[1];
} __packed; } __packed;
#define ACX_IPV4_VERSION 4 #define ACX_IPV4_VERSION 4
...@@ -788,9 +798,10 @@ struct wl1271_acx_bet_enable { ...@@ -788,9 +798,10 @@ struct wl1271_acx_bet_enable {
struct wl1271_acx_arp_filter { struct wl1271_acx_arp_filter {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 version; /* ACX_IPV4_VERSION, ACX_IPV6_VERSION */ u8 version; /* ACX_IPV4_VERSION, ACX_IPV6_VERSION */
u8 enable; /* bitmap of enabled ARP filtering features */ u8 enable; /* bitmap of enabled ARP filtering features */
u8 padding[2]; u8 padding[1];
u8 address[16]; /* The configured device IP address - all ARP u8 address[16]; /* The configured device IP address - all ARP
requests directed to this IP address will pass requests directed to this IP address will pass
through. For IPv4, the first four bytes are through. For IPv4, the first four bytes are
...@@ -808,8 +819,9 @@ struct wl1271_acx_pm_config { ...@@ -808,8 +819,9 @@ struct wl1271_acx_pm_config {
struct wl1271_acx_keep_alive_mode { struct wl1271_acx_keep_alive_mode {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 enabled; u8 enabled;
u8 padding[3]; u8 padding[2];
} __packed; } __packed;
enum { enum {
...@@ -825,11 +837,11 @@ enum { ...@@ -825,11 +837,11 @@ enum {
struct wl1271_acx_keep_alive_config { struct wl1271_acx_keep_alive_config {
struct acx_header header; struct acx_header header;
__le32 period; u8 role_id;
u8 index; u8 index;
u8 tpl_validation; u8 tpl_validation;
u8 trigger; u8 trigger;
u8 padding; __le32 period;
} __packed; } __packed;
#define HOST_IF_CFG_RX_FIFO_ENABLE BIT(0) #define HOST_IF_CFG_RX_FIFO_ENABLE BIT(0)
...@@ -873,20 +885,23 @@ enum { ...@@ -873,20 +885,23 @@ enum {
struct wl1271_acx_rssi_snr_trigger { struct wl1271_acx_rssi_snr_trigger {
struct acx_header header; struct acx_header header;
__le16 threshold; u8 role_id;
__le16 pacing; /* 0 - 60000 ms */
u8 metric; u8 metric;
u8 type; u8 type;
u8 dir; u8 dir;
__le16 threshold;
__le16 pacing; /* 0 - 60000 ms */
u8 hysteresis; u8 hysteresis;
u8 index; u8 index;
u8 enable; u8 enable;
u8 padding[2]; u8 padding[1];
}; };
struct wl1271_acx_rssi_snr_avg_weights { struct wl1271_acx_rssi_snr_avg_weights {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 padding[3];
u8 rssi_beacon; u8 rssi_beacon;
u8 rssi_data; u8 rssi_data;
u8 snr_beacon; u8 snr_beacon;
...@@ -916,13 +931,8 @@ struct wl1271_acx_ht_capabilities { ...@@ -916,13 +931,8 @@ struct wl1271_acx_ht_capabilities {
*/ */
__le32 ht_capabilites; __le32 ht_capabilites;
/* /* Indicates to which link these capabilities apply. */
* Indicates to which peer these capabilities apply. u8 hlid;
* For infrastructure use ff:ff:ff:ff:ff:ff that indicates relevance
* for all peers.
* Only valid for IBSS/DLS operation.
*/
u8 mac_address[ETH_ALEN];
/* /*
* This the maximum A-MPDU length supported by the AP. The FW may not * This the maximum A-MPDU length supported by the AP. The FW may not
...@@ -932,6 +942,8 @@ struct wl1271_acx_ht_capabilities { ...@@ -932,6 +942,8 @@ struct wl1271_acx_ht_capabilities {
/* This is the minimal spacing required when sending A-MPDUs to the AP*/ /* This is the minimal spacing required when sending A-MPDUs to the AP*/
u8 ampdu_min_spacing; u8 ampdu_min_spacing;
u8 padding;
} __packed; } __packed;
/* HT Capabilites Fw Bit Mask Mapping */ /* HT Capabilites Fw Bit Mask Mapping */
...@@ -950,6 +962,8 @@ struct wl1271_acx_ht_capabilities { ...@@ -950,6 +962,8 @@ struct wl1271_acx_ht_capabilities {
struct wl1271_acx_ht_information { struct wl1271_acx_ht_information {
struct acx_header header; struct acx_header header;
u8 role_id;
/* Values: 0 - RIFS not allowed, 1 - RIFS allowed */ /* Values: 0 - RIFS not allowed, 1 - RIFS allowed */
u8 rifs_mode; u8 rifs_mode;
...@@ -971,7 +985,7 @@ struct wl1271_acx_ht_information { ...@@ -971,7 +985,7 @@ struct wl1271_acx_ht_information {
*/ */
u8 dual_cts_protection; u8 dual_cts_protection;
u8 padding[3]; u8 padding[2];
} __packed; } __packed;
#define RX_BA_WIN_SIZE 8 #define RX_BA_WIN_SIZE 8
...@@ -1041,6 +1055,7 @@ struct wl1271_acx_fw_tsf_information { ...@@ -1041,6 +1055,7 @@ struct wl1271_acx_fw_tsf_information {
struct wl1271_acx_ps_rx_streaming { struct wl1271_acx_ps_rx_streaming {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 tid; u8 tid;
u8 enable; u8 enable;
...@@ -1049,17 +1064,20 @@ struct wl1271_acx_ps_rx_streaming { ...@@ -1049,17 +1064,20 @@ struct wl1271_acx_ps_rx_streaming {
/* timeout before first trigger (0-200 msec) */ /* timeout before first trigger (0-200 msec) */
u8 timeout; u8 timeout;
u8 padding[3];
} __packed; } __packed;
struct wl1271_acx_ap_max_tx_retry { struct wl1271_acx_ap_max_tx_retry {
struct acx_header header; struct acx_header header;
u8 role_id;
u8 padding_1;
/* /*
* the number of frames transmission failures before * the number of frames transmission failures before
* issuing the aging event. * issuing the aging event.
*/ */
__le16 max_tx_retry; __le16 max_tx_retry;
u8 padding_1[2];
} __packed; } __packed;
struct wl1271_acx_config_ps { struct wl1271_acx_config_ps {
...@@ -1151,10 +1169,7 @@ enum { ...@@ -1151,10 +1169,7 @@ enum {
ACX_AC_CFG = 0x0007, ACX_AC_CFG = 0x0007,
ACX_MEM_MAP = 0x0008, ACX_MEM_MAP = 0x0008,
ACX_AID = 0x000A, ACX_AID = 0x000A,
/* ACX_FW_REV is missing in the ref driver, but seems to work */
ACX_FW_REV = 0x000D,
ACX_MEDIUM_USAGE = 0x000F, ACX_MEDIUM_USAGE = 0x000F,
ACX_RX_CFG = 0x0010,
ACX_TX_QUEUE_CFG = 0x0011, /* FIXME: only used by wl1251 */ ACX_TX_QUEUE_CFG = 0x0011, /* FIXME: only used by wl1251 */
ACX_STATISTICS = 0x0013, /* Debug API */ ACX_STATISTICS = 0x0013, /* Debug API */
ACX_PWR_CONSUMPTION_STATISTICS = 0x0014, ACX_PWR_CONSUMPTION_STATISTICS = 0x0014,
...@@ -1170,7 +1185,6 @@ enum { ...@@ -1170,7 +1185,6 @@ enum {
ACX_CCA_THRESHOLD = 0x0025, ACX_CCA_THRESHOLD = 0x0025,
ACX_EVENT_MBOX_MASK = 0x0026, ACX_EVENT_MBOX_MASK = 0x0026,
ACX_CONN_MONIT_PARAMS = 0x002D, ACX_CONN_MONIT_PARAMS = 0x002D,
ACX_CONS_TX_FAILURE = 0x002F,
ACX_BCN_DTIM_OPTIONS = 0x0031, ACX_BCN_DTIM_OPTIONS = 0x0031,
ACX_SG_ENABLE = 0x0032, ACX_SG_ENABLE = 0x0032,
ACX_SG_CFG = 0x0033, ACX_SG_CFG = 0x0033,
...@@ -1202,6 +1216,9 @@ enum { ...@@ -1202,6 +1216,9 @@ enum {
ACX_PEER_HT_CAP = 0x0057, ACX_PEER_HT_CAP = 0x0057,
ACX_HT_BSS_OPERATION = 0x0058, ACX_HT_BSS_OPERATION = 0x0058,
ACX_COEX_ACTIVITY = 0x0059, ACX_COEX_ACTIVITY = 0x0059,
ACX_BURST_MODE = 0x005C,
ACX_SET_RATE_MGMT_PARAMS = 0x005D,
ACX_SET_RATE_ADAPT_PARAMS = 0x0060,
ACX_SET_DCO_ITRIM_PARAMS = 0x0061, ACX_SET_DCO_ITRIM_PARAMS = 0x0061,
ACX_GEN_FW_CMD = 0x0070, ACX_GEN_FW_CMD = 0x0070,
ACX_HOST_IF_CFG_BITMAP = 0x0071, ACX_HOST_IF_CFG_BITMAP = 0x0071,
...@@ -1256,8 +1273,7 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, ...@@ -1256,8 +1273,7 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type,
u32 apsd_conf0, u32 apsd_conf1); u32 apsd_conf0, u32 apsd_conf1);
int wl1271_acx_frag_threshold(struct wl1271 *wl, u32 frag_threshold); int wl1271_acx_frag_threshold(struct wl1271 *wl, u32 frag_threshold);
int wl1271_acx_tx_config_options(struct wl1271 *wl); int wl1271_acx_tx_config_options(struct wl1271 *wl);
int wl1271_acx_ap_mem_cfg(struct wl1271 *wl); int wl12xx_acx_mem_cfg(struct wl1271 *wl);
int wl1271_acx_sta_mem_cfg(struct wl1271 *wl);
int wl1271_acx_init_mem_config(struct wl1271 *wl); int wl1271_acx_init_mem_config(struct wl1271 *wl);
int wl1271_acx_host_if_cfg_bitmap(struct wl1271 *wl, u32 host_cfg_bitmap); int wl1271_acx_host_if_cfg_bitmap(struct wl1271 *wl, u32 host_cfg_bitmap);
int wl1271_acx_init_rx_interrupt(struct wl1271 *wl); int wl1271_acx_init_rx_interrupt(struct wl1271 *wl);
......
...@@ -388,7 +388,7 @@ static int wl1271_sta_hw_init(struct wl1271 *wl) ...@@ -388,7 +388,7 @@ static int wl1271_sta_hw_init(struct wl1271 *wl)
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = wl1271_acx_sta_mem_cfg(wl); ret = wl12xx_acx_mem_cfg(wl);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -447,7 +447,7 @@ static int wl1271_ap_hw_init(struct wl1271 *wl) ...@@ -447,7 +447,7 @@ static int wl1271_ap_hw_init(struct wl1271 *wl)
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = wl1271_acx_ap_mem_cfg(wl); ret = wl12xx_acx_mem_cfg(wl);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -718,7 +718,7 @@ static int wl1271_plt_init(struct wl1271 *wl) ...@@ -718,7 +718,7 @@ static int wl1271_plt_init(struct wl1271 *wl)
if (ret < 0) if (ret < 0)
goto out_free_memmap; goto out_free_memmap;
ret = wl1271_acx_sta_mem_cfg(wl); ret = wl12xx_acx_mem_cfg(wl);
if (ret < 0) if (ret < 0)
goto out_free_memmap; goto out_free_memmap;
...@@ -1981,6 +1981,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl, ...@@ -1981,6 +1981,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl,
wl->ap_fw_ps_map = 0; wl->ap_fw_ps_map = 0;
wl->ap_ps_map = 0; wl->ap_ps_map = 0;
wl->sched_scanning = false; wl->sched_scanning = false;
wl->role_id = WL12XX_INVALID_ROLE_ID;
/* /*
* this is performed after the cancel_work calls and the associated * this is performed after the cancel_work calls and the associated
...@@ -4317,6 +4318,8 @@ struct ieee80211_hw *wl1271_alloc_hw(void) ...@@ -4317,6 +4318,8 @@ struct ieee80211_hw *wl1271_alloc_hw(void)
wl->sched_scanning = false; wl->sched_scanning = false;
wl->tx_security_seq = 0; wl->tx_security_seq = 0;
wl->tx_security_last_seq_lsb = 0; wl->tx_security_last_seq_lsb = 0;
wl->role_id = WL12XX_INVALID_ROLE_ID;
wl->sta_hlid = WL12XX_INVALID_LINK_ID;
setup_timer(&wl->rx_streaming_timer, wl1271_rx_streaming_timer, setup_timer(&wl->rx_streaming_timer, wl1271_rx_streaming_timer,
(unsigned long) wl); (unsigned long) wl);
......
...@@ -138,6 +138,8 @@ extern u32 wl12xx_debug_level; ...@@ -138,6 +138,8 @@ extern u32 wl12xx_debug_level;
#define WL1271_DEFAULT_DTIM_PERIOD 1 #define WL1271_DEFAULT_DTIM_PERIOD 1
#define WL12XX_MAX_LINKS 8 #define WL12XX_MAX_LINKS 8
#define WL12XX_INVALID_ROLE_ID 0xff
#define WL12XX_INVALID_LINK_ID 0xff
#define WL1271_AP_GLOBAL_HLID 0 #define WL1271_AP_GLOBAL_HLID 0
#define WL1271_AP_BROADCAST_HLID 1 #define WL1271_AP_BROADCAST_HLID 1
#define WL1271_AP_STA_HLID_START 2 #define WL1271_AP_STA_HLID_START 2
...@@ -390,6 +392,8 @@ struct wl1271 { ...@@ -390,6 +392,8 @@ struct wl1271 {
u8 ssid[IEEE80211_MAX_SSID_LEN + 1]; u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
u8 ssid_len; u8 ssid_len;
int channel; int channel;
u8 role_id;
u8 sta_hlid;
struct wl1271_acx_mem_map *target_mem_map; struct wl1271_acx_mem_map *target_mem_map;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment