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: Eliad Peller <eliad@wizery.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
This commit is contained in:
parent
4d56ad9cae
commit
7f097988f1
5 changed files with 138 additions and 130 deletions
|
@ -46,6 +46,7 @@ int wl1271_acx_wake_up_conditions(struct wl1271 *wl)
|
|||
goto out;
|
||||
}
|
||||
|
||||
wake_up->role_id = wl->role_id;
|
||||
wake_up->wake_up_event = wl->conf.conn.wake_up_event;
|
||||
wake_up->listen_interval = wl->conf.conn.listen_interval;
|
||||
|
||||
|
@ -101,6 +102,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power)
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->current_tx_power = power * 10;
|
||||
|
||||
ret = wl1271_cmd_configure(wl, DOT11_CUR_TX_PWR, acx, sizeof(*acx));
|
||||
|
@ -128,6 +130,7 @@ int wl1271_acx_feature_cfg(struct wl1271 *wl)
|
|||
}
|
||||
|
||||
/* DF_ENCRYPTION_DISABLE and DF_SNIFF_MODE_ENABLE are disabled */
|
||||
feature->role_id = wl->role_id;
|
||||
feature->data_flow_options = 0;
|
||||
feature->options = 0;
|
||||
|
||||
|
@ -222,6 +225,7 @@ int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time)
|
|||
goto out;
|
||||
}
|
||||
|
||||
slot->role_id = wl->role_id;
|
||||
slot->wone_index = STATION_WONE_INDEX;
|
||||
slot->slot_time = slot_time;
|
||||
|
||||
|
@ -251,6 +255,7 @@ int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable,
|
|||
}
|
||||
|
||||
/* MAC filtering */
|
||||
acx->role_id = wl->role_id;
|
||||
acx->enabled = enable;
|
||||
acx->num_groups = mc_list_len;
|
||||
memcpy(acx->mac_table, mc_list, mc_list_len * ETH_ALEN);
|
||||
|
@ -280,6 +285,7 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl)
|
|||
|
||||
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->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)
|
|||
goto out;
|
||||
}
|
||||
|
||||
rts->role_id = wl->role_id;
|
||||
rts->threshold = cpu_to_le16((u16)rts_threshold);
|
||||
|
||||
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)
|
|||
goto out;
|
||||
}
|
||||
|
||||
beacon_filter->role_id = wl->role_id;
|
||||
beacon_filter->enable = enable_filter;
|
||||
|
||||
/*
|
||||
|
@ -411,6 +419,7 @@ int wl1271_acx_beacon_filter_table(struct wl1271 *wl)
|
|||
}
|
||||
|
||||
/* configure default beacon pass-through rules */
|
||||
ie_table->role_id = wl->role_id;
|
||||
ie_table->num_ie = 0;
|
||||
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]);
|
||||
|
@ -472,6 +481,7 @@ int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable)
|
|||
timeout = wl->conf.conn.bss_lose_timeout;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->synch_fail_thold = cpu_to_le32(threshold);
|
||||
acx->bss_lose_timeout = cpu_to_le32(timeout);
|
||||
|
||||
|
@ -619,6 +629,7 @@ int wl1271_acx_bcn_dtim_options(struct wl1271 *wl)
|
|||
goto out;
|
||||
}
|
||||
|
||||
bb->role_id = wl->role_id;
|
||||
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->rx_broadcast_in_ps = wl->conf.conn.rx_broadcast_in_ps;
|
||||
|
@ -648,6 +659,7 @@ int wl1271_acx_aid(struct wl1271 *wl, u16 aid)
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx_aid->role_id = wl->role_id;
|
||||
acx_aid->aid = cpu_to_le16(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)
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->preamble = preamble;
|
||||
|
||||
ret = wl1271_cmd_configure(wl, ACX_PREAMBLE_TYPE, acx, sizeof(*acx));
|
||||
|
@ -730,6 +743,7 @@ int wl1271_acx_cts_protect(struct wl1271 *wl,
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->ctsprotect = ctsprotect;
|
||||
|
||||
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)
|
|||
|
||||
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;
|
||||
int idx = 0;
|
||||
int ret = 0;
|
||||
|
||||
wl1271_debug(DEBUG_ACX, "acx rate policies");
|
||||
|
@ -775,25 +788,30 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl)
|
|||
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 */
|
||||
idx = ACX_TX_BASIC_RATE;
|
||||
acx->rate_class[idx].enabled_rates = cpu_to_le32(wl->basic_rate);
|
||||
acx->rate_class[idx].short_retry_limit = c->short_retry_limit;
|
||||
acx->rate_class[idx].long_retry_limit = c->long_retry_limit;
|
||||
acx->rate_class[idx].aflags = c->aflags;
|
||||
acx->rate_policy_idx = cpu_to_le32(ACX_TX_BASIC_RATE);
|
||||
acx->rate_policy.enabled_rates = cpu_to_le32(wl->basic_rate);
|
||||
acx->rate_policy.short_retry_limit = c->short_retry_limit;
|
||||
acx->rate_policy.long_retry_limit = c->long_retry_limit;
|
||||
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 */
|
||||
idx = ACX_TX_AP_FULL_RATE;
|
||||
acx->rate_class[idx].enabled_rates = cpu_to_le32(wl->rate_set);
|
||||
acx->rate_class[idx].short_retry_limit = c->short_retry_limit;
|
||||
acx->rate_class[idx].long_retry_limit = c->long_retry_limit;
|
||||
acx->rate_class[idx].aflags = c->aflags;
|
||||
acx->rate_policy_idx = cpu_to_le32(ACX_TX_AP_FULL_RATE);
|
||||
acx->rate_policy.enabled_rates = cpu_to_le32(wl->rate_set);
|
||||
acx->rate_policy.short_retry_limit = c->short_retry_limit;
|
||||
acx->rate_policy.long_retry_limit = c->long_retry_limit;
|
||||
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));
|
||||
if (ret < 0) {
|
||||
|
@ -809,7 +827,7 @@ out:
|
|||
int wl1271_acx_ap_rate_policy(struct wl1271 *wl, struct conf_tx_rate_class *c,
|
||||
u8 idx)
|
||||
{
|
||||
struct acx_ap_rate_policy *acx;
|
||||
struct acx_rate_policy *acx;
|
||||
int ret = 0;
|
||||
|
||||
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,
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->ac = ac;
|
||||
acx->cw_min = cw_min;
|
||||
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,
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->queue_id = queue_id;
|
||||
acx->channel_type = channel_type;
|
||||
acx->tsid = tsid;
|
||||
|
@ -967,52 +987,9 @@ out:
|
|||
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;
|
||||
int ret;
|
||||
|
||||
|
@ -1155,6 +1132,7 @@ int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable)
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->enable = enable ? CONF_BET_MODE_ENABLE : CONF_BET_MODE_DISABLE;
|
||||
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)
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->version = ACX_IPV4_VERSION;
|
||||
acx->enable = enable;
|
||||
|
||||
|
@ -1241,6 +1220,7 @@ int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable)
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->enabled = enable;
|
||||
|
||||
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)
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->period = cpu_to_le32(wl->conf.conn.keep_alive_interval);
|
||||
acx->index = index;
|
||||
acx->tpl_validation = tpl_valid;
|
||||
|
@ -1300,6 +1281,7 @@ int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable,
|
|||
|
||||
wl->last_rssi_event = -1;
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->pacing = cpu_to_le16(wl->conf.roam_trigger.trigger_pacing);
|
||||
acx->metric = WL1271_ACX_TRIG_METRIC_RSSI_BEACON;
|
||||
acx->type = WL1271_ACX_TRIG_TYPE_EDGE;
|
||||
|
@ -1338,6 +1320,7 @@ int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl)
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->rssi_beacon = c->avg_weight_rssi_beacon;
|
||||
acx->rssi_data = c->avg_weight_rssi_data;
|
||||
acx->snr_beacon = c->avg_weight_snr_beacon;
|
||||
|
@ -1359,7 +1342,6 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
|
|||
bool allow_ht_operation)
|
||||
{
|
||||
struct wl1271_acx_ht_capabilities *acx;
|
||||
u8 mac_address[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
||||
int ret = 0;
|
||||
u32 ht_capabilites = 0;
|
||||
|
||||
|
@ -1390,7 +1372,7 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
|
|||
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);
|
||||
|
||||
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,
|
|||
goto out;
|
||||
}
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
acx->ht_protection =
|
||||
(u8)(ht_operation_mode & IEEE80211_HT_OP_MODE_PROTECTION);
|
||||
acx->rifs_mode = 0;
|
||||
|
@ -1578,6 +1561,7 @@ int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable)
|
|||
if (!(conf_queues & BIT(i)))
|
||||
continue;
|
||||
|
||||
rx_streaming->role_id = wl->role_id;
|
||||
rx_streaming->tid = i;
|
||||
rx_streaming->enable = enable_queues & BIT(i);
|
||||
rx_streaming->period = wl->conf.rx_streaming.interval;
|
||||
|
@ -1607,6 +1591,7 @@ int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl)
|
|||
if (!acx)
|
||||
return -ENOMEM;
|
||||
|
||||
acx->role_id = wl->role_id;
|
||||
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));
|
||||
|
|
|
@ -101,6 +101,17 @@ struct acx_error_counter {
|
|||
__le32 seq_num_miss;
|
||||
} __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 {
|
||||
/* Active mode */
|
||||
WL1271_PSM_CAM = 0,
|
||||
|
@ -179,9 +190,10 @@ enum acx_slot_type {
|
|||
struct acx_slot {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 wone_index; /* Reserved */
|
||||
u8 slot_time;
|
||||
u8 reserved[6];
|
||||
u8 reserved[5];
|
||||
} __packed;
|
||||
|
||||
|
||||
|
@ -191,29 +203,35 @@ struct acx_slot {
|
|||
struct acx_dot11_grp_addr_tbl {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 enabled;
|
||||
u8 num_groups;
|
||||
u8 pad[2];
|
||||
u8 pad[1];
|
||||
u8 mac_table[ADDRESS_GROUP_MAX_LEN];
|
||||
} __packed;
|
||||
|
||||
struct acx_rx_timeout {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 reserved;
|
||||
__le16 ps_poll_timeout;
|
||||
__le16 upsd_timeout;
|
||||
u8 padding[2];
|
||||
} __packed;
|
||||
|
||||
struct acx_rts_threshold {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 reserved;
|
||||
__le16 threshold;
|
||||
u8 pad[2];
|
||||
} __packed;
|
||||
|
||||
struct acx_beacon_filter_option {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 enable;
|
||||
/*
|
||||
* The number of beacons without the unicast TIM
|
||||
|
@ -223,7 +241,7 @@ struct acx_beacon_filter_option {
|
|||
* without the unicast TIM bit set are dropped.
|
||||
*/
|
||||
u8 max_num_beacons;
|
||||
u8 pad[2];
|
||||
u8 pad[1];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
|
@ -262,14 +280,17 @@ struct acx_beacon_filter_option {
|
|||
struct acx_beacon_filter_ie_table {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 num_ie;
|
||||
u8 pad[3];
|
||||
u8 pad[2];
|
||||
u8 table[BEACON_FILTER_TABLE_MAX_SIZE];
|
||||
} __packed;
|
||||
|
||||
struct acx_conn_monit_params {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 padding[3];
|
||||
__le32 synch_fail_thold; /* number of beacons missed */
|
||||
__le32 bss_lose_timeout; /* number of TU's from synch fail */
|
||||
} __packed;
|
||||
|
@ -318,15 +339,16 @@ struct acx_energy_detection {
|
|||
struct acx_beacon_broadcast {
|
||||
struct acx_header header;
|
||||
|
||||
__le16 beacon_rx_timeout;
|
||||
__le16 broadcast_timeout;
|
||||
|
||||
u8 role_id;
|
||||
/* Enables receiving of broadcast packets in PS mode */
|
||||
u8 rx_broadcast_in_ps;
|
||||
|
||||
__le16 beacon_rx_timeout;
|
||||
__le16 broadcast_timeout;
|
||||
|
||||
/* Consecutive PS Poll failures before updating the host */
|
||||
u8 ps_poll_threshold;
|
||||
u8 pad[2];
|
||||
u8 pad[1];
|
||||
} __packed;
|
||||
|
||||
struct acx_event_mask {
|
||||
|
@ -348,6 +370,8 @@ struct acx_event_mask {
|
|||
struct acx_feature_config {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 padding[3];
|
||||
__le32 options;
|
||||
__le32 data_flow_options;
|
||||
} __packed;
|
||||
|
@ -355,16 +379,18 @@ struct acx_feature_config {
|
|||
struct acx_current_tx_power {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 current_tx_power;
|
||||
u8 padding[3];
|
||||
u8 padding[2];
|
||||
} __packed;
|
||||
|
||||
struct acx_wake_up_condition {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 wake_up_event; /* Only one bit can be set */
|
||||
u8 listen_interval;
|
||||
u8 pad[2];
|
||||
u8 pad[1];
|
||||
} __packed;
|
||||
|
||||
struct acx_aid {
|
||||
|
@ -373,8 +399,9 @@ struct acx_aid {
|
|||
/*
|
||||
* To be set when associated with an AP.
|
||||
*/
|
||||
u8 role_id;
|
||||
u8 reserved;
|
||||
__le16 aid;
|
||||
u8 pad[2];
|
||||
} __packed;
|
||||
|
||||
enum acx_preamble_type {
|
||||
|
@ -389,8 +416,9 @@ struct acx_preamble {
|
|||
* When set, the WiLink transmits the frames with a short preamble and
|
||||
* when cleared, the WiLink transmits the frames with a long preamble.
|
||||
*/
|
||||
u8 role_id;
|
||||
u8 preamble;
|
||||
u8 padding[3];
|
||||
u8 padding[2];
|
||||
} __packed;
|
||||
|
||||
enum acx_ctsprotect_type {
|
||||
|
@ -400,8 +428,9 @@ enum acx_ctsprotect_type {
|
|||
|
||||
struct acx_ctsprotect {
|
||||
struct acx_header header;
|
||||
u8 role_id;
|
||||
u8 ctsprotect;
|
||||
u8 padding[3];
|
||||
u8 padding[2];
|
||||
} __packed;
|
||||
|
||||
struct acx_tx_statistics {
|
||||
|
@ -636,18 +665,9 @@ struct acx_rate_class {
|
|||
|
||||
#define ACX_TX_BASIC_RATE 0
|
||||
#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_BCST_RATE 5
|
||||
struct acx_ap_rate_policy {
|
||||
struct acx_rate_policy {
|
||||
struct acx_header header;
|
||||
|
||||
__le32 rate_policy_idx;
|
||||
|
@ -656,22 +676,23 @@ struct acx_ap_rate_policy {
|
|||
|
||||
struct acx_ac_cfg {
|
||||
struct acx_header header;
|
||||
u8 role_id;
|
||||
u8 ac;
|
||||
u8 aifsn;
|
||||
u8 cw_min;
|
||||
__le16 cw_max;
|
||||
u8 aifsn;
|
||||
u8 reserved;
|
||||
__le16 tx_op_limit;
|
||||
} __packed;
|
||||
|
||||
struct acx_tid_config {
|
||||
struct acx_header header;
|
||||
u8 role_id;
|
||||
u8 queue_id;
|
||||
u8 channel_type;
|
||||
u8 tsid;
|
||||
u8 ps_scheme;
|
||||
u8 ack_policy;
|
||||
u8 padding[3];
|
||||
u8 padding[2];
|
||||
__le32 apsd_conf[2];
|
||||
} __packed;
|
||||
|
||||
|
@ -687,19 +708,7 @@ struct acx_tx_config_options {
|
|||
__le16 tx_compl_threshold; /* number of packets */
|
||||
} __packed;
|
||||
|
||||
#define ACX_TX_DESCRIPTORS 32
|
||||
|
||||
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 wl12xx_acx_config_memory {
|
||||
struct acx_header header;
|
||||
|
||||
u8 rx_mem_block_num;
|
||||
|
@ -773,9 +782,10 @@ struct wl1271_acx_rx_config_opt {
|
|||
struct wl1271_acx_bet_enable {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 enable;
|
||||
u8 max_consecutive;
|
||||
u8 padding[2];
|
||||
u8 padding[1];
|
||||
} __packed;
|
||||
|
||||
#define ACX_IPV4_VERSION 4
|
||||
|
@ -788,9 +798,10 @@ struct wl1271_acx_bet_enable {
|
|||
|
||||
struct wl1271_acx_arp_filter {
|
||||
struct acx_header header;
|
||||
u8 role_id;
|
||||
u8 version; /* ACX_IPV4_VERSION, ACX_IPV6_VERSION */
|
||||
u8 enable; /* bitmap of enabled ARP filtering features */
|
||||
u8 padding[2];
|
||||
u8 padding[1];
|
||||
u8 address[16]; /* The configured device IP address - all ARP
|
||||
requests directed to this IP address will pass
|
||||
through. For IPv4, the first four bytes are
|
||||
|
@ -808,8 +819,9 @@ struct wl1271_acx_pm_config {
|
|||
struct wl1271_acx_keep_alive_mode {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 enabled;
|
||||
u8 padding[3];
|
||||
u8 padding[2];
|
||||
} __packed;
|
||||
|
||||
enum {
|
||||
|
@ -825,11 +837,11 @@ enum {
|
|||
struct wl1271_acx_keep_alive_config {
|
||||
struct acx_header header;
|
||||
|
||||
__le32 period;
|
||||
u8 role_id;
|
||||
u8 index;
|
||||
u8 tpl_validation;
|
||||
u8 trigger;
|
||||
u8 padding;
|
||||
__le32 period;
|
||||
} __packed;
|
||||
|
||||
#define HOST_IF_CFG_RX_FIFO_ENABLE BIT(0)
|
||||
|
@ -873,20 +885,23 @@ enum {
|
|||
struct wl1271_acx_rssi_snr_trigger {
|
||||
struct acx_header header;
|
||||
|
||||
__le16 threshold;
|
||||
__le16 pacing; /* 0 - 60000 ms */
|
||||
u8 role_id;
|
||||
u8 metric;
|
||||
u8 type;
|
||||
u8 dir;
|
||||
__le16 threshold;
|
||||
__le16 pacing; /* 0 - 60000 ms */
|
||||
u8 hysteresis;
|
||||
u8 index;
|
||||
u8 enable;
|
||||
u8 padding[2];
|
||||
u8 padding[1];
|
||||
};
|
||||
|
||||
struct wl1271_acx_rssi_snr_avg_weights {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 padding[3];
|
||||
u8 rssi_beacon;
|
||||
u8 rssi_data;
|
||||
u8 snr_beacon;
|
||||
|
@ -916,13 +931,8 @@ struct wl1271_acx_ht_capabilities {
|
|||
*/
|
||||
__le32 ht_capabilites;
|
||||
|
||||
/*
|
||||
* Indicates to which peer these capabilities apply.
|
||||
* 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];
|
||||
/* Indicates to which link these capabilities apply. */
|
||||
u8 hlid;
|
||||
|
||||
/*
|
||||
* This the maximum A-MPDU length supported by the AP. The FW may not
|
||||
|
@ -932,6 +942,8 @@ struct wl1271_acx_ht_capabilities {
|
|||
|
||||
/* This is the minimal spacing required when sending A-MPDUs to the AP*/
|
||||
u8 ampdu_min_spacing;
|
||||
|
||||
u8 padding;
|
||||
} __packed;
|
||||
|
||||
/* HT Capabilites Fw Bit Mask Mapping */
|
||||
|
@ -950,6 +962,8 @@ struct wl1271_acx_ht_capabilities {
|
|||
struct wl1271_acx_ht_information {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
|
||||
/* Values: 0 - RIFS not allowed, 1 - RIFS allowed */
|
||||
u8 rifs_mode;
|
||||
|
||||
|
@ -971,7 +985,7 @@ struct wl1271_acx_ht_information {
|
|||
*/
|
||||
u8 dual_cts_protection;
|
||||
|
||||
u8 padding[3];
|
||||
u8 padding[2];
|
||||
} __packed;
|
||||
|
||||
#define RX_BA_WIN_SIZE 8
|
||||
|
@ -1041,6 +1055,7 @@ struct wl1271_acx_fw_tsf_information {
|
|||
struct wl1271_acx_ps_rx_streaming {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 tid;
|
||||
u8 enable;
|
||||
|
||||
|
@ -1049,17 +1064,20 @@ struct wl1271_acx_ps_rx_streaming {
|
|||
|
||||
/* timeout before first trigger (0-200 msec) */
|
||||
u8 timeout;
|
||||
u8 padding[3];
|
||||
} __packed;
|
||||
|
||||
struct wl1271_acx_ap_max_tx_retry {
|
||||
struct acx_header header;
|
||||
|
||||
u8 role_id;
|
||||
u8 padding_1;
|
||||
|
||||
/*
|
||||
* the number of frames transmission failures before
|
||||
* issuing the aging event.
|
||||
*/
|
||||
__le16 max_tx_retry;
|
||||
u8 padding_1[2];
|
||||
} __packed;
|
||||
|
||||
struct wl1271_acx_config_ps {
|
||||
|
@ -1151,10 +1169,7 @@ enum {
|
|||
ACX_AC_CFG = 0x0007,
|
||||
ACX_MEM_MAP = 0x0008,
|
||||
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_RX_CFG = 0x0010,
|
||||
ACX_TX_QUEUE_CFG = 0x0011, /* FIXME: only used by wl1251 */
|
||||
ACX_STATISTICS = 0x0013, /* Debug API */
|
||||
ACX_PWR_CONSUMPTION_STATISTICS = 0x0014,
|
||||
|
@ -1170,7 +1185,6 @@ enum {
|
|||
ACX_CCA_THRESHOLD = 0x0025,
|
||||
ACX_EVENT_MBOX_MASK = 0x0026,
|
||||
ACX_CONN_MONIT_PARAMS = 0x002D,
|
||||
ACX_CONS_TX_FAILURE = 0x002F,
|
||||
ACX_BCN_DTIM_OPTIONS = 0x0031,
|
||||
ACX_SG_ENABLE = 0x0032,
|
||||
ACX_SG_CFG = 0x0033,
|
||||
|
@ -1202,6 +1216,9 @@ enum {
|
|||
ACX_PEER_HT_CAP = 0x0057,
|
||||
ACX_HT_BSS_OPERATION = 0x0058,
|
||||
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_GEN_FW_CMD = 0x0070,
|
||||
ACX_HOST_IF_CFG_BITMAP = 0x0071,
|
||||
|
@ -1256,8 +1273,7 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type,
|
|||
u32 apsd_conf0, u32 apsd_conf1);
|
||||
int wl1271_acx_frag_threshold(struct wl1271 *wl, u32 frag_threshold);
|
||||
int wl1271_acx_tx_config_options(struct wl1271 *wl);
|
||||
int wl1271_acx_ap_mem_cfg(struct wl1271 *wl);
|
||||
int wl1271_acx_sta_mem_cfg(struct wl1271 *wl);
|
||||
int wl12xx_acx_mem_cfg(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_init_rx_interrupt(struct wl1271 *wl);
|
||||
|
|
|
@ -388,7 +388,7 @@ static int wl1271_sta_hw_init(struct wl1271 *wl)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = wl1271_acx_sta_mem_cfg(wl);
|
||||
ret = wl12xx_acx_mem_cfg(wl);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -447,7 +447,7 @@ static int wl1271_ap_hw_init(struct wl1271 *wl)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = wl1271_acx_ap_mem_cfg(wl);
|
||||
ret = wl12xx_acx_mem_cfg(wl);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -718,7 +718,7 @@ static int wl1271_plt_init(struct wl1271 *wl)
|
|||
if (ret < 0)
|
||||
goto out_free_memmap;
|
||||
|
||||
ret = wl1271_acx_sta_mem_cfg(wl);
|
||||
ret = wl12xx_acx_mem_cfg(wl);
|
||||
if (ret < 0)
|
||||
goto out_free_memmap;
|
||||
|
||||
|
@ -1981,6 +1981,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl,
|
|||
wl->ap_fw_ps_map = 0;
|
||||
wl->ap_ps_map = 0;
|
||||
wl->sched_scanning = false;
|
||||
wl->role_id = WL12XX_INVALID_ROLE_ID;
|
||||
|
||||
/*
|
||||
* this is performed after the cancel_work calls and the associated
|
||||
|
@ -4317,6 +4318,8 @@ struct ieee80211_hw *wl1271_alloc_hw(void)
|
|||
wl->sched_scanning = false;
|
||||
wl->tx_security_seq = 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,
|
||||
(unsigned long) wl);
|
||||
|
|
|
@ -138,6 +138,8 @@ extern u32 wl12xx_debug_level;
|
|||
#define WL1271_DEFAULT_DTIM_PERIOD 1
|
||||
|
||||
#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_BROADCAST_HLID 1
|
||||
#define WL1271_AP_STA_HLID_START 2
|
||||
|
@ -390,6 +392,8 @@ struct wl1271 {
|
|||
u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
|
||||
u8 ssid_len;
|
||||
int channel;
|
||||
u8 role_id;
|
||||
u8 sta_hlid;
|
||||
|
||||
struct wl1271_acx_mem_map *target_mem_map;
|
||||
|
||||
|
|
Loading…
Reference in a new issue