提交 e0a8c583 编写于 作者: J John W. Linville
...@@ -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;
...@@ -183,34 +186,6 @@ int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl) ...@@ -183,34 +186,6 @@ int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl)
return ret; return ret;
} }
int wl1271_acx_rx_config(struct wl1271 *wl, u32 config, u32 filter)
{
struct acx_rx_config *rx_config;
int ret;
wl1271_debug(DEBUG_ACX, "acx rx config");
rx_config = kzalloc(sizeof(*rx_config), GFP_KERNEL);
if (!rx_config) {
ret = -ENOMEM;
goto out;
}
rx_config->config_options = cpu_to_le32(config);
rx_config->filter_options = cpu_to_le32(filter);
ret = wl1271_cmd_configure(wl, ACX_RX_CFG,
rx_config, sizeof(*rx_config));
if (ret < 0) {
wl1271_warning("failed to set rx config: %d", ret);
goto out;
}
out:
kfree(rx_config);
return ret;
}
int wl1271_acx_pd_threshold(struct wl1271 *wl) int wl1271_acx_pd_threshold(struct wl1271 *wl)
{ {
struct acx_packet_detection *pd; struct acx_packet_detection *pd;
...@@ -250,6 +225,7 @@ int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time) ...@@ -250,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;
...@@ -279,6 +255,7 @@ int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable, ...@@ -279,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);
...@@ -308,6 +285,7 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl) ...@@ -308,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);
...@@ -344,6 +322,7 @@ int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold) ...@@ -344,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));
...@@ -403,6 +382,7 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter) ...@@ -403,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;
/* /*
...@@ -439,6 +419,7 @@ int wl1271_acx_beacon_filter_table(struct wl1271 *wl) ...@@ -439,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]);
...@@ -500,6 +481,7 @@ int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable) ...@@ -500,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);
...@@ -546,43 +528,13 @@ int wl1271_acx_sg_enable(struct wl1271 *wl, bool enable) ...@@ -546,43 +528,13 @@ int wl1271_acx_sg_enable(struct wl1271 *wl, bool enable)
return ret; return ret;
} }
int wl1271_acx_sta_sg_cfg(struct wl1271 *wl) int wl12xx_acx_sg_cfg(struct wl1271 *wl)
{
struct acx_sta_bt_wlan_coex_param *param;
struct conf_sg_settings *c = &wl->conf.sg;
int i, ret;
wl1271_debug(DEBUG_ACX, "acx sg sta cfg");
param = kzalloc(sizeof(*param), GFP_KERNEL);
if (!param) {
ret = -ENOMEM;
goto out;
}
/* BT-WLAN coext parameters */
for (i = 0; i < CONF_SG_STA_PARAMS_MAX; i++)
param->params[i] = cpu_to_le32(c->sta_params[i]);
param->param_idx = CONF_SG_PARAMS_ALL;
ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param));
if (ret < 0) {
wl1271_warning("failed to set sg config: %d", ret);
goto out;
}
out:
kfree(param);
return ret;
}
int wl1271_acx_ap_sg_cfg(struct wl1271 *wl)
{ {
struct acx_ap_bt_wlan_coex_param *param; struct acx_bt_wlan_coex_param *param;
struct conf_sg_settings *c = &wl->conf.sg; struct conf_sg_settings *c = &wl->conf.sg;
int i, ret; int i, ret;
wl1271_debug(DEBUG_ACX, "acx sg ap cfg"); wl1271_debug(DEBUG_ACX, "acx sg cfg");
param = kzalloc(sizeof(*param), GFP_KERNEL); param = kzalloc(sizeof(*param), GFP_KERNEL);
if (!param) { if (!param) {
...@@ -591,8 +543,8 @@ int wl1271_acx_ap_sg_cfg(struct wl1271 *wl) ...@@ -591,8 +543,8 @@ int wl1271_acx_ap_sg_cfg(struct wl1271 *wl)
} }
/* BT-WLAN coext parameters */ /* BT-WLAN coext parameters */
for (i = 0; i < CONF_SG_AP_PARAMS_MAX; i++) for (i = 0; i < CONF_SG_PARAMS_MAX; i++)
param->params[i] = cpu_to_le32(c->ap_params[i]); param->params[i] = cpu_to_le32(c->params[i]);
param->param_idx = CONF_SG_PARAMS_ALL; param->param_idx = CONF_SG_PARAMS_ALL;
ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param)); ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param));
...@@ -647,6 +599,7 @@ int wl1271_acx_bcn_dtim_options(struct wl1271 *wl) ...@@ -647,6 +599,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;
...@@ -676,6 +629,7 @@ int wl1271_acx_aid(struct wl1271 *wl, u16 aid) ...@@ -676,6 +629,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));
...@@ -731,6 +685,7 @@ int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble) ...@@ -731,6 +685,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));
...@@ -758,6 +713,7 @@ int wl1271_acx_cts_protect(struct wl1271 *wl, ...@@ -758,6 +713,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));
...@@ -789,9 +745,8 @@ int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats) ...@@ -789,9 +745,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");
...@@ -803,25 +758,30 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl) ...@@ -803,25 +758,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) {
...@@ -837,7 +797,7 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl) ...@@ -837,7 +797,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",
...@@ -883,6 +843,7 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, ...@@ -883,6 +843,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);
...@@ -916,6 +877,7 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, ...@@ -916,6 +877,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;
...@@ -995,52 +957,9 @@ int wl1271_acx_tx_config_options(struct wl1271 *wl) ...@@ -995,52 +957,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;
...@@ -1183,6 +1102,7 @@ int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable) ...@@ -1183,6 +1102,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;
...@@ -1210,6 +1130,7 @@ int wl1271_acx_arp_ip_filter(struct wl1271 *wl, u8 enable, __be32 address) ...@@ -1210,6 +1130,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;
...@@ -1269,6 +1190,7 @@ int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable) ...@@ -1269,6 +1190,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));
...@@ -1295,6 +1217,7 @@ int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid) ...@@ -1295,6 +1217,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;
...@@ -1328,6 +1251,7 @@ int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable, ...@@ -1328,6 +1251,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;
...@@ -1366,6 +1290,7 @@ int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl) ...@@ -1366,6 +1290,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;
...@@ -1384,14 +1309,15 @@ int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl) ...@@ -1384,14 +1309,15 @@ int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl)
int wl1271_acx_set_ht_capabilities(struct wl1271 *wl, int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
struct ieee80211_sta_ht_cap *ht_cap, struct ieee80211_sta_ht_cap *ht_cap,
bool allow_ht_operation) bool allow_ht_operation, u8 hlid)
{ {
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;
wl1271_debug(DEBUG_ACX, "acx ht capabilities setting"); wl1271_debug(DEBUG_ACX, "acx ht capabilities setting "
"sta supp: %d sta cap: %d", ht_cap->ht_supported,
ht_cap->cap);
acx = kzalloc(sizeof(*acx), GFP_KERNEL); acx = kzalloc(sizeof(*acx), GFP_KERNEL);
if (!acx) { if (!acx) {
...@@ -1399,26 +1325,22 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl, ...@@ -1399,26 +1325,22 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
goto out; goto out;
} }
/* Allow HT Operation ? */ if (allow_ht_operation && ht_cap->ht_supported) {
if (allow_ht_operation) { /* no need to translate capabilities - use the spec values */
ht_capabilites = ht_capabilites = ht_cap->cap;
WL1271_ACX_FW_CAP_HT_OPERATION;
if (ht_cap->cap & IEEE80211_HT_CAP_GRN_FLD) /*
ht_capabilites |= * this bit is not employed by the spec but only by FW to
WL1271_ACX_FW_CAP_GREENFIELD_FRAME_FORMAT; * indicate peer HT support
if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20) */
ht_capabilites |= ht_capabilites |= WL12XX_HT_CAP_HT_OPERATION;
WL1271_ACX_FW_CAP_SHORT_GI_FOR_20MHZ_PACKETS;
if (ht_cap->cap & IEEE80211_HT_CAP_LSIG_TXOP_PROT)
ht_capabilites |=
WL1271_ACX_FW_CAP_LSIG_TXOP_PROTECTION;
/* get data from A-MPDU parameters field */ /* get data from A-MPDU parameters field */
acx->ampdu_max_length = ht_cap->ampdu_factor; acx->ampdu_max_length = ht_cap->ampdu_factor;
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 = 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));
...@@ -1446,6 +1368,7 @@ int wl1271_acx_set_ht_information(struct wl1271 *wl, ...@@ -1446,6 +1368,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;
...@@ -1467,14 +1390,12 @@ int wl1271_acx_set_ht_information(struct wl1271 *wl, ...@@ -1467,14 +1390,12 @@ int wl1271_acx_set_ht_information(struct wl1271 *wl,
} }
/* Configure BA session initiator/receiver parameters setting in the FW. */ /* Configure BA session initiator/receiver parameters setting in the FW. */
int wl1271_acx_set_ba_session(struct wl1271 *wl, int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl)
enum ieee80211_back_parties direction,
u8 tid_index, u8 policy)
{ {
struct wl1271_acx_ba_session_policy *acx; struct wl1271_acx_ba_initiator_policy *acx;
int ret; int ret;
wl1271_debug(DEBUG_ACX, "acx ba session setting"); wl1271_debug(DEBUG_ACX, "acx ba initiator policy");
acx = kzalloc(sizeof(*acx), GFP_KERNEL); acx = kzalloc(sizeof(*acx), GFP_KERNEL);
if (!acx) { if (!acx) {
...@@ -1482,33 +1403,18 @@ int wl1271_acx_set_ba_session(struct wl1271 *wl, ...@@ -1482,33 +1403,18 @@ int wl1271_acx_set_ba_session(struct wl1271 *wl,
goto out; goto out;
} }
/* ANY role */ /* set for the current role */
acx->role_id = 0xff; acx->role_id = wl->role_id;
acx->tid = tid_index; acx->tid_bitmap = wl->conf.ht.tx_ba_tid_bitmap;
acx->enable = policy;
acx->ba_direction = direction;
switch (direction) {
case WLAN_BACK_INITIATOR:
acx->win_size = wl->conf.ht.tx_ba_win_size; acx->win_size = wl->conf.ht.tx_ba_win_size;
acx->inactivity_timeout = wl->conf.ht.inactivity_timeout; acx->inactivity_timeout = wl->conf.ht.inactivity_timeout;
break;
case WLAN_BACK_RECIPIENT:
acx->win_size = RX_BA_WIN_SIZE;
acx->inactivity_timeout = 0;
break;
default:
wl1271_error("Incorrect acx command id=%x\n", direction);
ret = -EINVAL;
goto out;
}
ret = wl1271_cmd_configure(wl, ret = wl1271_cmd_configure(wl,
ACX_BA_SESSION_POLICY_CFG, ACX_BA_SESSION_INIT_POLICY,
acx, acx,
sizeof(*acx)); sizeof(*acx));
if (ret < 0) { if (ret < 0) {
wl1271_warning("acx ba session setting failed: %d", ret); wl1271_warning("acx ba initiator policy failed: %d", ret);
goto out; goto out;
} }
...@@ -1518,8 +1424,8 @@ int wl1271_acx_set_ba_session(struct wl1271 *wl, ...@@ -1518,8 +1424,8 @@ int wl1271_acx_set_ba_session(struct wl1271 *wl,
} }
/* setup BA session receiver setting in the FW. */ /* setup BA session receiver setting in the FW. */
int wl1271_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index, u16 ssn, int wl12xx_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index,
bool enable) u16 ssn, bool enable, u8 peer_hlid)
{ {
struct wl1271_acx_ba_receiver_setup *acx; struct wl1271_acx_ba_receiver_setup *acx;
int ret; int ret;
...@@ -1532,11 +1438,10 @@ int wl1271_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index, u16 ssn, ...@@ -1532,11 +1438,10 @@ int wl1271_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index, u16 ssn,
goto out; goto out;
} }
/* Single link for now */ acx->hlid = peer_hlid;
acx->link_id = 1;
acx->tid = tid_index; acx->tid = tid_index;
acx->enable = enable; acx->enable = enable;
acx->win_size = 0; acx->win_size = wl->conf.ht.rx_ba_win_size;
acx->ssn = ssn; acx->ssn = ssn;
ret = wl1271_cmd_configure(wl, ACX_BA_SESSION_RX_SETUP, acx, ret = wl1271_cmd_configure(wl, ACX_BA_SESSION_RX_SETUP, acx,
...@@ -1606,6 +1511,7 @@ int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable) ...@@ -1606,6 +1511,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;
...@@ -1635,6 +1541,7 @@ int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) ...@@ -1635,6 +1541,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));
...@@ -1703,31 +1610,6 @@ int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr) ...@@ -1703,31 +1610,6 @@ int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr)
return ret; return ret;
} }
int wl1271_acx_set_ap_beacon_filter(struct wl1271 *wl, bool enable)
{
struct acx_ap_beacon_filter *acx = NULL;
int ret;
wl1271_debug(DEBUG_ACX, "acx set ap beacon filter: %d", enable);
acx = kzalloc(sizeof(*acx), GFP_KERNEL);
if (!acx)
return -ENOMEM;
acx->enable = enable ? 1 : 0;
ret = wl1271_cmd_configure(wl, ACX_AP_BEACON_FILTER_OPT,
acx, sizeof(*acx));
if (ret < 0) {
wl1271_warning("acx set ap beacon filter failed: %d", ret);
goto out;
}
out:
kfree(acx);
return ret;
}
int wl1271_acx_fm_coex(struct wl1271 *wl) int wl1271_acx_fm_coex(struct wl1271 *wl)
{ {
struct wl1271_acx_fm_coex *acx; struct wl1271_acx_fm_coex *acx;
...@@ -1767,3 +1649,45 @@ int wl1271_acx_fm_coex(struct wl1271 *wl) ...@@ -1767,3 +1649,45 @@ int wl1271_acx_fm_coex(struct wl1271 *wl)
kfree(acx); kfree(acx);
return ret; return ret;
} }
int wl12xx_acx_set_rate_mgmt_params(struct wl1271 *wl)
{
struct wl12xx_acx_set_rate_mgmt_params *acx = NULL;
struct conf_rate_policy_settings *conf = &wl->conf.rate;
int ret;
wl1271_debug(DEBUG_ACX, "acx set rate mgmt params");
acx = kzalloc(sizeof(*acx), GFP_KERNEL);
if (!acx)
return -ENOMEM;
acx->index = ACX_RATE_MGMT_ALL_PARAMS;
acx->rate_retry_score = cpu_to_le16(conf->rate_retry_score);
acx->per_add = cpu_to_le16(conf->per_add);
acx->per_th1 = cpu_to_le16(conf->per_th1);
acx->per_th2 = cpu_to_le16(conf->per_th2);
acx->max_per = cpu_to_le16(conf->max_per);
acx->inverse_curiosity_factor = conf->inverse_curiosity_factor;
acx->tx_fail_low_th = conf->tx_fail_low_th;
acx->tx_fail_high_th = conf->tx_fail_high_th;
acx->per_alpha_shift = conf->per_alpha_shift;
acx->per_add_shift = conf->per_add_shift;
acx->per_beta1_shift = conf->per_beta1_shift;
acx->per_beta2_shift = conf->per_beta2_shift;
acx->rate_check_up = conf->rate_check_up;
acx->rate_check_down = conf->rate_check_down;
memcpy(acx->rate_retry_policy, conf->rate_retry_policy,
sizeof(acx->rate_retry_policy));
ret = wl1271_cmd_configure(wl, ACX_SET_RATE_MGMT_PARAMS,
acx, sizeof(*acx));
if (ret < 0) {
wl1271_warning("acx set rate mgmt params failed: %d", ret);
goto out;
}
out:
kfree(acx);
return ret;
}
此差异已折叠。
...@@ -107,16 +107,6 @@ static unsigned int wl12xx_get_fw_ver_quirks(struct wl1271 *wl) ...@@ -107,16 +107,6 @@ static unsigned int wl12xx_get_fw_ver_quirks(struct wl1271 *wl)
unsigned int quirks = 0; unsigned int quirks = 0;
unsigned int *fw_ver = wl->chip.fw_ver; unsigned int *fw_ver = wl->chip.fw_ver;
/* Only for wl127x */
if ((fw_ver[FW_VER_CHIP] == FW_VER_CHIP_WL127X) &&
/* Check STA version */
(((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_STA) &&
(fw_ver[FW_VER_MINOR] < FW_VER_MINOR_1_SPARE_STA_MIN)) ||
/* Check AP version */
((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_AP) &&
(fw_ver[FW_VER_MINOR] < FW_VER_MINOR_1_SPARE_AP_MIN))))
quirks |= WL12XX_QUIRK_USE_2_SPARE_BLOCKS;
/* Only new station firmwares support routing fw logs to the host */ /* Only new station firmwares support routing fw logs to the host */
if ((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_STA) && if ((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_STA) &&
(fw_ver[FW_VER_MINOR] < FW_VER_MINOR_FWLOG_STA_MIN)) (fw_ver[FW_VER_MINOR] < FW_VER_MINOR_FWLOG_STA_MIN))
...@@ -504,21 +494,18 @@ static int wl1271_boot_run_firmware(struct wl1271 *wl) ...@@ -504,21 +494,18 @@ static int wl1271_boot_run_firmware(struct wl1271 *wl)
wl->event_mask = BSS_LOSE_EVENT_ID | wl->event_mask = BSS_LOSE_EVENT_ID |
SCAN_COMPLETE_EVENT_ID | SCAN_COMPLETE_EVENT_ID |
PS_REPORT_EVENT_ID | PS_REPORT_EVENT_ID |
JOIN_EVENT_COMPLETE_ID |
DISCONNECT_EVENT_COMPLETE_ID | DISCONNECT_EVENT_COMPLETE_ID |
RSSI_SNR_TRIGGER_0_EVENT_ID | RSSI_SNR_TRIGGER_0_EVENT_ID |
PSPOLL_DELIVERY_FAILURE_EVENT_ID | PSPOLL_DELIVERY_FAILURE_EVENT_ID |
SOFT_GEMINI_SENSE_EVENT_ID | SOFT_GEMINI_SENSE_EVENT_ID |
PERIODIC_SCAN_REPORT_EVENT_ID | PERIODIC_SCAN_REPORT_EVENT_ID |
PERIODIC_SCAN_COMPLETE_EVENT_ID; PERIODIC_SCAN_COMPLETE_EVENT_ID |
DUMMY_PACKET_EVENT_ID |
if (wl->bss_type == BSS_TYPE_AP_BSS) PEER_REMOVE_COMPLETE_EVENT_ID |
wl->event_mask |= STA_REMOVE_COMPLETE_EVENT_ID | BA_SESSION_RX_CONSTRAINT_EVENT_ID |
REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID |
INACTIVE_STA_EVENT_ID | INACTIVE_STA_EVENT_ID |
MAX_TX_RETRY_EVENT_ID; MAX_TX_RETRY_EVENT_ID;
else
wl->event_mask |= DUMMY_PACKET_EVENT_ID |
BA_SESSION_RX_CONSTRAINT_EVENT_ID;
ret = wl1271_event_unmask(wl); ret = wl1271_event_unmask(wl);
if (ret < 0) { if (ret < 0) {
...@@ -549,13 +536,13 @@ static void wl1271_boot_hw_version(struct wl1271 *wl) ...@@ -549,13 +536,13 @@ static void wl1271_boot_hw_version(struct wl1271 *wl)
{ {
u32 fuse; u32 fuse;
fuse = wl1271_top_reg_read(wl, REG_FUSE_DATA_2_1); if (wl->chip.id == CHIP_ID_1283_PG20)
fuse = wl1271_top_reg_read(wl, WL128X_REG_FUSE_DATA_2_1);
else
fuse = wl1271_top_reg_read(wl, WL127X_REG_FUSE_DATA_2_1);
fuse = (fuse & PG_VER_MASK) >> PG_VER_OFFSET; fuse = (fuse & PG_VER_MASK) >> PG_VER_OFFSET;
wl->hw_pg_ver = (s8)fuse; wl->hw_pg_ver = (s8)fuse;
if (((wl->hw_pg_ver & PG_MAJOR_VER_MASK) >> PG_MAJOR_VER_OFFSET) < 3)
wl->quirks |= WL12XX_QUIRK_END_OF_TRANSACTION;
} }
static int wl128x_switch_tcxo_to_fref(struct wl1271 *wl) static int wl128x_switch_tcxo_to_fref(struct wl1271 *wl)
...@@ -696,7 +683,8 @@ static int wl127x_boot_clk(struct wl1271 *wl) ...@@ -696,7 +683,8 @@ static int wl127x_boot_clk(struct wl1271 *wl)
u32 pause; u32 pause;
u32 clk; u32 clk;
wl1271_boot_hw_version(wl); if (((wl->hw_pg_ver & PG_MAJOR_VER_MASK) >> PG_MAJOR_VER_OFFSET) < 3)
wl->quirks |= WL12XX_QUIRK_END_OF_TRANSACTION;
if (wl->ref_clock == CONF_REF_CLK_19_2_E || if (wl->ref_clock == CONF_REF_CLK_19_2_E ||
wl->ref_clock == CONF_REF_CLK_38_4_E || wl->ref_clock == CONF_REF_CLK_38_4_E ||
...@@ -750,6 +738,8 @@ int wl1271_load_firmware(struct wl1271 *wl) ...@@ -750,6 +738,8 @@ int wl1271_load_firmware(struct wl1271 *wl)
u32 tmp, clk; u32 tmp, clk;
int selected_clock = -1; int selected_clock = -1;
wl1271_boot_hw_version(wl);
if (wl->chip.id == CHIP_ID_1283_PG20) { if (wl->chip.id == CHIP_ID_1283_PG20) {
ret = wl128x_boot_clk(wl, &selected_clock); ret = wl128x_boot_clk(wl, &selected_clock);
if (ret < 0) if (ret < 0)
...@@ -852,9 +842,6 @@ int wl1271_boot(struct wl1271 *wl) ...@@ -852,9 +842,6 @@ int wl1271_boot(struct wl1271 *wl)
/* Enable firmware interrupts now */ /* Enable firmware interrupts now */
wl1271_boot_enable_interrupts(wl); wl1271_boot_enable_interrupts(wl);
/* set the wl1271 default filters */
wl1271_set_default_filters(wl);
wl1271_event_mbox_config(wl); wl1271_event_mbox_config(wl);
out: out:
......
...@@ -55,7 +55,8 @@ struct wl1271_static_data { ...@@ -55,7 +55,8 @@ struct wl1271_static_data {
#define OCP_REG_CLK_POLARITY 0x0cb2 #define OCP_REG_CLK_POLARITY 0x0cb2
#define OCP_REG_CLK_PULL 0x0cb4 #define OCP_REG_CLK_PULL 0x0cb4
#define REG_FUSE_DATA_2_1 0x050a #define WL127X_REG_FUSE_DATA_2_1 0x050a
#define WL128X_REG_FUSE_DATA_2_1 0x2152
#define PG_VER_MASK 0x3c #define PG_VER_MASK 0x3c
#define PG_VER_OFFSET 2 #define PG_VER_OFFSET 2
......
此差异已折叠。
...@@ -36,7 +36,15 @@ int wl128x_cmd_general_parms(struct wl1271 *wl); ...@@ -36,7 +36,15 @@ int wl128x_cmd_general_parms(struct wl1271 *wl);
int wl1271_cmd_radio_parms(struct wl1271 *wl); int wl1271_cmd_radio_parms(struct wl1271 *wl);
int wl128x_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_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 wl12xx_cmd_role_start_ibss(struct wl1271 *wl);
int wl1271_cmd_test(struct wl1271 *wl, void *buf, size_t buf_len, u8 answer); 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_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); int wl1271_cmd_configure(struct wl1271 *wl, u16 id, void *buf, size_t len);
...@@ -56,20 +64,18 @@ struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl, ...@@ -56,20 +64,18 @@ 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_cmd_build_arp_rsp(struct wl1271 *wl, __be32 ip_addr);
int wl1271_build_qos_null_data(struct wl1271 *wl); int wl1271_build_qos_null_data(struct wl1271 *wl);
int wl1271_cmd_build_klv_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 wl12xx_cmd_set_default_wep_key(struct wl1271 *wl, u8 id, u8 hlid);
int wl1271_cmd_set_ap_default_wep_key(struct wl1271 *wl, u8 id);
int wl1271_cmd_set_sta_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type, 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, u8 key_size, const u8 *key, const u8 *addr,
u32 tx_seq_32, u16 tx_seq_16); u32 tx_seq_32, u16 tx_seq_16);
int wl1271_cmd_set_ap_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type, 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, u8 key_size, const u8 *key, u8 hlid, u32 tx_seq_32,
u16 tx_seq_16); u16 tx_seq_16);
int wl1271_cmd_disconnect(struct wl1271 *wl); int wl12xx_cmd_set_peer_state(struct wl1271 *wl, u8 hlid);
int wl1271_cmd_set_sta_state(struct wl1271 *wl); int wl12xx_roc(struct wl1271 *wl, u8 role_id);
int wl1271_cmd_start_bss(struct wl1271 *wl); int wl12xx_croc(struct wl1271 *wl, u8 role_id);
int wl1271_cmd_stop_bss(struct wl1271 *wl); int wl12xx_cmd_add_peer(struct wl1271 *wl, struct ieee80211_sta *sta, u8 hlid);
int wl1271_cmd_add_sta(struct wl1271 *wl, struct ieee80211_sta *sta, u8 hlid); int wl12xx_cmd_remove_peer(struct wl1271 *wl, u8 hlid);
int wl1271_cmd_remove_sta(struct wl1271 *wl, u8 hlid);
int wl12xx_cmd_config_fwlog(struct wl1271 *wl); int wl12xx_cmd_config_fwlog(struct wl1271 *wl);
int wl12xx_cmd_start_fwlog(struct wl1271 *wl); int wl12xx_cmd_start_fwlog(struct wl1271 *wl);
int wl12xx_cmd_stop_fwlog(struct wl1271 *wl); int wl12xx_cmd_stop_fwlog(struct wl1271 *wl);
...@@ -83,25 +89,21 @@ enum wl1271_commands { ...@@ -83,25 +89,21 @@ enum wl1271_commands {
CMD_DISABLE_TX = 6, CMD_DISABLE_TX = 6,
CMD_SCAN = 8, CMD_SCAN = 8,
CMD_STOP_SCAN = 9, CMD_STOP_SCAN = 9,
CMD_START_JOIN = 11,
CMD_SET_KEYS = 12, CMD_SET_KEYS = 12,
CMD_READ_MEMORY = 13, CMD_READ_MEMORY = 13,
CMD_WRITE_MEMORY = 14, CMD_WRITE_MEMORY = 14,
CMD_SET_TEMPLATE = 19, CMD_SET_TEMPLATE = 19,
CMD_TEST = 23, CMD_TEST = 23,
CMD_NOISE_HIST = 28, CMD_NOISE_HIST = 28,
CMD_LNA_CONTROL = 32, CMD_QUIET_ELEMENT_SET_STATE = 29,
CMD_SET_BCN_MODE = 33, CMD_SET_BCN_MODE = 33,
CMD_MEASUREMENT = 34, CMD_MEASUREMENT = 34,
CMD_STOP_MEASUREMENT = 35, CMD_STOP_MEASUREMENT = 35,
CMD_DISCONNECT = 36,
CMD_SET_PS_MODE = 37, CMD_SET_PS_MODE = 37,
CMD_CHANNEL_SWITCH = 38, CMD_CHANNEL_SWITCH = 38,
CMD_STOP_CHANNEL_SWICTH = 39, CMD_STOP_CHANNEL_SWICTH = 39,
CMD_AP_DISCOVERY = 40, CMD_AP_DISCOVERY = 40,
CMD_STOP_AP_DISCOVERY = 41, CMD_STOP_AP_DISCOVERY = 41,
CMD_SPS_SCAN = 42,
CMD_STOP_SPS_SCAN = 43,
CMD_HEALTH_CHECK = 45, CMD_HEALTH_CHECK = 45,
CMD_DEBUG = 46, CMD_DEBUG = 46,
CMD_TRIGGER_SCAN_TO = 47, CMD_TRIGGER_SCAN_TO = 47,
...@@ -109,16 +111,30 @@ enum wl1271_commands { ...@@ -109,16 +111,30 @@ enum wl1271_commands {
CMD_CONNECTION_SCAN_SSID_CFG = 49, CMD_CONNECTION_SCAN_SSID_CFG = 49,
CMD_START_PERIODIC_SCAN = 50, CMD_START_PERIODIC_SCAN = 50,
CMD_STOP_PERIODIC_SCAN = 51, CMD_STOP_PERIODIC_SCAN = 51,
CMD_SET_STA_STATE = 52, CMD_SET_PEER_STATE = 52,
CMD_CONFIG_FWLOGGER = 53, CMD_REMAIN_ON_CHANNEL = 53,
CMD_START_FWLOGGER = 54, CMD_CANCEL_REMAIN_ON_CHANNEL = 54,
CMD_STOP_FWLOGGER = 55,
/* AP mode commands */ CMD_CONFIG_FWLOGGER = 55,
CMD_BSS_START = 60, CMD_START_FWLOGGER = 56,
CMD_BSS_STOP = 61, CMD_STOP_FWLOGGER = 57,
CMD_ADD_STA = 62,
CMD_REMOVE_STA = 63, /* 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, NUM_COMMANDS,
MAX_COMMAND_ID = 0xFFFF, MAX_COMMAND_ID = 0xFFFF,
...@@ -147,21 +163,20 @@ enum cmd_templ { ...@@ -147,21 +163,20 @@ enum cmd_templ {
CMD_TEMPL_CTS, /* CMD_TEMPL_CTS, /*
* For CTS-to-self (FastCTS) mechanism * For CTS-to-self (FastCTS) mechanism
* for BT/WLAN coexistence (SoftGemini). */ * for BT/WLAN coexistence (SoftGemini). */
CMD_TEMPL_ARP_RSP, CMD_TEMPL_AP_BEACON,
CMD_TEMPL_LINK_MEASUREMENT_REPORT,
/* AP-mode specific */
CMD_TEMPL_AP_BEACON = 13,
CMD_TEMPL_AP_PROBE_RESPONSE, CMD_TEMPL_AP_PROBE_RESPONSE,
CMD_TEMPL_AP_ARP_RSP, CMD_TEMPL_ARP_RSP,
CMD_TEMPL_DEAUTH_AP, CMD_TEMPL_DEAUTH_AP,
CMD_TEMPL_TEMPORARY,
CMD_TEMPL_LINK_MEASUREMENT_REPORT,
CMD_TEMPL_MAX = 0xff CMD_TEMPL_MAX = 0xff
}; };
/* unit ms */ /* unit ms */
#define WL1271_COMMAND_TIMEOUT 2000 #define WL1271_COMMAND_TIMEOUT 2000
#define WL1271_CMD_TEMPL_MAX_SIZE 252 #define WL1271_CMD_TEMPL_DFLT_SIZE 252
#define WL1271_CMD_TEMPL_MAX_SIZE 548
#define WL1271_EVENT_TIMEOUT 750 #define WL1271_EVENT_TIMEOUT 750
struct wl1271_cmd_header { struct wl1271_cmd_header {
...@@ -193,6 +208,8 @@ enum { ...@@ -193,6 +208,8 @@ enum {
CMD_STATUS_WRONG_NESTING = 19, CMD_STATUS_WRONG_NESTING = 19,
CMD_STATUS_TIMEOUT = 21, /* Driver internal use.*/ CMD_STATUS_TIMEOUT = 21, /* Driver internal use.*/
CMD_STATUS_FW_RESET = 22, /* Driver internal use.*/ CMD_STATUS_FW_RESET = 22, /* Driver internal use.*/
CMD_STATUS_TEMPLATE_OOM = 23,
CMD_STATUS_NO_RX_BA_SESSION = 24,
MAX_COMMAND_STATUS = 0xff MAX_COMMAND_STATUS = 0xff
}; };
...@@ -210,14 +227,50 @@ enum { ...@@ -210,14 +227,50 @@ enum {
#define WL1271_JOIN_CMD_TX_SESSION_OFFSET 1 #define WL1271_JOIN_CMD_TX_SESSION_OFFSET 1
#define WL1271_JOIN_CMD_BSS_TYPE_5GHZ 0x10 #define WL1271_JOIN_CMD_BSS_TYPE_5GHZ 0x10
struct wl1271_cmd_join { struct wl12xx_cmd_role_enable {
struct wl1271_cmd_header header; struct wl1271_cmd_header header;
__le32 bssid_lsb; u8 role_id;
__le16 bssid_msb; u8 role_type;
__le16 beacon_interval; /* in TBTTs */ u8 mac_address[ETH_ALEN];
__le32 rx_config_options; } __packed;
__le32 rx_filter_options;
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 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 * The target uses this field to determine the rate at
...@@ -225,23 +278,63 @@ struct wl1271_cmd_join { ...@@ -225,23 +278,63 @@ struct wl1271_cmd_join {
* ACK or CTS frames). * ACK or CTS frames).
*/ */
__le32 basic_rate_set; __le32 basic_rate_set;
__le32 supported_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; u8 dtim_interval;
/* __le32 remote_rates; /* remote supported rates */
* bits 0-2: This bitwise field specifies the type
* of BSS to start or join (BSS_TYPE_*). __le32 basic_rate_set;
* bit 4: Band - The radio band in which to join __le32 local_rates; /* local supported rates */
* or start.
* 0 - 2.4GHz band u8 ssid_type;
* 1 - 5GHz band
* bits 3, 5-7: Reserved
*/
u8 bss_type;
u8 channel;
u8 ssid_len; u8 ssid_len;
u8 ssid[IEEE80211_MAX_SSID_LEN]; u8 ssid[IEEE80211_MAX_SSID_LEN];
u8 ctrl; /* JOIN_CMD_CTRL_* */
u8 reserved[3]; __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; } __packed;
struct cmd_enabledisable_path { struct cmd_enabledisable_path {
...@@ -287,8 +380,9 @@ enum wl1271_cmd_ps_mode { ...@@ -287,8 +380,9 @@ enum wl1271_cmd_ps_mode {
struct wl1271_cmd_ps_params { struct wl1271_cmd_ps_params {
struct wl1271_cmd_header header; struct wl1271_cmd_header header;
u8 role_id;
u8 ps_mode; /* STATION_* */ u8 ps_mode; /* STATION_* */
u8 padding[3]; u8 padding[2];
} __packed; } __packed;
/* HW encryption keys */ /* HW encryption keys */
...@@ -301,6 +395,12 @@ enum wl1271_cmd_key_action { ...@@ -301,6 +395,12 @@ enum wl1271_cmd_key_action {
MAX_KEY_ACTION = 0xffff, 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 { enum wl1271_cmd_key_type {
KEY_NONE = 0, KEY_NONE = 0,
KEY_WEP = 1, KEY_WEP = 1,
...@@ -309,44 +409,7 @@ enum wl1271_cmd_key_type { ...@@ -309,44 +409,7 @@ enum wl1271_cmd_key_type {
KEY_GEM = 4, KEY_GEM = 4,
}; };
/* FIXME: Add description for key-types */ struct wl1271_cmd_set_keys {
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_header header; struct wl1271_cmd_header header;
/* /*
...@@ -496,69 +559,39 @@ enum wl1271_disconnect_type { ...@@ -496,69 +559,39 @@ enum wl1271_disconnect_type {
DISCONNECT_DISASSOC 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 #define WL1271_CMD_STA_STATE_CONNECTED 1
struct wl1271_cmd_set_sta_state { struct wl12xx_cmd_set_peer_state {
struct wl1271_cmd_header header; struct wl1271_cmd_header header;
u8 hlid;
u8 state; u8 state;
u8 padding[3]; u8 padding[2];
} __packed; } __packed;
enum wl1271_ssid_type { struct wl12xx_cmd_roc {
SSID_TYPE_PUBLIC = 0, struct wl1271_cmd_header header;
SSID_TYPE_HIDDEN = 1
u8 role_id;
u8 channel;
u8 band;
u8 padding;
}; };
struct wl1271_cmd_bss_start { struct wl12xx_cmd_croc {
struct wl1271_cmd_header header; struct wl1271_cmd_header header;
/* wl1271_ssid_type */ u8 role_id;
u8 ssid_type; u8 padding[3];
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;
/* enum wl12xx_ssid_type {
* This field specifies the time between target beacon WL12XX_SSID_TYPE_PUBLIC = 0,
* transmission times (TBTTs), in time units (TUs). WL12XX_SSID_TYPE_HIDDEN = 1,
* Valid values are 1 to 1024. WL12XX_SSID_TYPE_ANY = 2,
*/ };
__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; struct wl1271_cmd_header header;
u8 addr[ETH_ALEN]; u8 addr[ETH_ALEN];
...@@ -572,7 +605,7 @@ struct wl1271_cmd_add_sta { ...@@ -572,7 +605,7 @@ struct wl1271_cmd_add_sta {
u8 padding1; u8 padding1;
} __packed; } __packed;
struct wl1271_cmd_remove_sta { struct wl12xx_cmd_remove_peer {
struct wl1271_cmd_header header; struct wl1271_cmd_header header;
u8 hlid; u8 hlid;
......
...@@ -99,40 +99,75 @@ enum { ...@@ -99,40 +99,75 @@ enum {
enum { enum {
/* /*
* PER threshold in PPM of the BT voice * Configure the min and max time BT gains the antenna
* in WLAN / BT master basic rate
* *
* Range: 0 - 10000000 * Range: 0 - 255 (ms)
*/ */
CONF_SG_BT_PER_THRESHOLD = 0, CONF_SG_ACL_BT_MASTER_MIN_BR = 0,
CONF_SG_ACL_BT_MASTER_MAX_BR,
/* /*
* Number of consequent RX_ACTIVE activities to override BT voice * Configure the min and max time BT gains the antenna
* frames to ensure WLAN connection * in WLAN / BT slave basic rate
* *
* Range: 0 - 100 * Range: 0 - 255 (ms)
*/ */
CONF_SG_HV3_MAX_OVERRIDE, CONF_SG_ACL_BT_SLAVE_MIN_BR,
CONF_SG_ACL_BT_SLAVE_MAX_BR,
/* /*
* Defines the PER threshold of the BT voice * Configure the min and max time BT gains the antenna
* in WLAN / BT master EDR
* *
* Range: 0 - 65000 * Range: 0 - 255 (ms)
*/ */
CONF_SG_BT_NFS_SAMPLE_INTERVAL, CONF_SG_ACL_BT_MASTER_MIN_EDR,
CONF_SG_ACL_BT_MASTER_MAX_EDR,
/* /*
* Defines the load ratio of BT * Configure the min and max time BT gains the antenna
* in WLAN / BT slave EDR
* *
* Range: 0 - 100 (%) * Range: 0 - 255 (ms)
*/ */
CONF_SG_BT_LOAD_RATIO, CONF_SG_ACL_BT_SLAVE_MIN_EDR,
CONF_SG_ACL_BT_SLAVE_MAX_EDR,
/* /*
* Defines whether the SG will force WLAN host to enter/exit PSM * The maximum time WLAN can gain the antenna
* in WLAN PSM / BT master/slave BR
* *
* Range: 1 - SG can force, 0 - host handles PSM * Range: 0 - 255 (ms)
*/ */
CONF_SG_AUTO_PS_MODE, CONF_SG_ACL_WLAN_PS_MASTER_BR,
CONF_SG_ACL_WLAN_PS_SLAVE_BR,
/*
* The maximum time WLAN can gain the antenna
* in WLAN PSM / BT master/slave EDR
*
* Range: 0 - 255 (ms)
*/
CONF_SG_ACL_WLAN_PS_MASTER_EDR,
CONF_SG_ACL_WLAN_PS_SLAVE_EDR,
/* TODO: explain these values */
CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR,
CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR,
CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR,
CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR,
CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR,
CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR,
CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR,
CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR,
CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR,
CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR,
CONF_SG_ACL_PASSIVE_SCAN_BT_BR,
CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR,
CONF_SG_ACL_PASSIVE_SCAN_BT_EDR,
CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR,
/* /*
* Compensation percentage of probe requests when scan initiated * Compensation percentage of probe requests when scan initiated
...@@ -151,102 +186,70 @@ enum { ...@@ -151,102 +186,70 @@ enum {
CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3, CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3,
/* /*
* Defines antenna configuration (single/dual antenna) * Compensation percentage of WLAN active scan window if initiated
* * during BT A2DP
* Range: 0 - single antenna, 1 - dual antenna
*/
CONF_SG_ANTENNA_CONFIGURATION,
/*
* The threshold (percent) of max consequtive beacon misses before
* increasing priority of beacon reception.
*
* Range: 0 - 100 (%)
*/
CONF_SG_BEACON_MISS_PERCENT,
/*
* The rate threshold below which receiving a data frame from the AP
* will increase the priority of the data frame above BT traffic.
*
* Range: 0,2, 5(=5.5), 6, 9, 11, 12, 18, 24, 36, 48, 54
*/
CONF_SG_RATE_ADAPT_THRESH,
/*
* Not used currently.
* *
* Range: 0 * Range: 0 - 1000 (%)
*/ */
CONF_SG_RATE_ADAPT_SNR, CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP,
/* /*
* Configure the min and max time BT gains the antenna * Compensation percentage of WLAN passive scan window if initiated
* in WLAN PSM / BT master basic rate * during BT A2DP BR
* *
* Range: 0 - 255 (ms) * Range: 0 - 1000 (%)
*/ */
CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_BR, CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_BR,
CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_BR,
/* /*
* The time after it expires no new WLAN trigger frame is trasmitted * Compensation percentage of WLAN passive scan window if initiated
* in WLAN PSM / BT master basic rate * during BT A2DP EDR
* *
* Range: 0 - 255 (ms) * Range: 0 - 1000 (%)
*/ */
CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_BR, CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_EDR,
/* /*
* Configure the min and max time BT gains the antenna * Compensation percentage of WLAN passive scan window if initiated
* in WLAN PSM / BT slave basic rate * during BT voice
* *
* Range: 0 - 255 (ms) * Range: 0 - 1000 (%)
*/ */
CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_BR, CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3,
CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_BR,
/* /* TODO: explain these values */
* The time after it expires no new WLAN trigger frame is trasmitted CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN,
* in WLAN PSM / BT slave basic rate CONF_SG_BCN_HV3_COLLISION_THRESH_IN_PASSIVE_SCAN,
* CONF_SG_TX_RX_PROTECTION_BWIDTH_IN_PASSIVE_SCAN,
* Range: 0 - 255 (ms)
*/
CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_BR,
/* /*
* Configure the min and max time BT gains the antenna * Defines whether the SG will force WLAN host to enter/exit PSM
* in WLAN PSM / BT master EDR
* *
* Range: 0 - 255 (ms) * Range: 1 - SG can force, 0 - host handles PSM
*/ */
CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_EDR, CONF_SG_STA_FORCE_PS_IN_BT_SCO,
CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_EDR,
/* /*
* The time after it expires no new WLAN trigger frame is trasmitted * Defines antenna configuration (single/dual antenna)
* in WLAN PSM / BT master EDR
* *
* Range: 0 - 255 (ms) * Range: 0 - single antenna, 1 - dual antenna
*/ */
CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_EDR, CONF_SG_ANTENNA_CONFIGURATION,
/* /*
* Configure the min and max time BT gains the antenna * The threshold (percent) of max consecutive beacon misses before
* in WLAN PSM / BT slave EDR * increasing priority of beacon reception.
* *
* Range: 0 - 255 (ms) * Range: 0 - 100 (%)
*/ */
CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_EDR, CONF_SG_BEACON_MISS_PERCENT,
CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_EDR,
/* /*
* The time after it expires no new WLAN trigger frame is trasmitted * Protection time of the DHCP procedure.
* in WLAN PSM / BT slave EDR
* *
* Range: 0 - 255 (ms) * Range: 0 - 100000 (ms)
*/ */
CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_EDR, CONF_SG_DHCP_TIME,
/* /*
* RX guard time before the beginning of a new BT voice frame during * RX guard time before the beginning of a new BT voice frame during
...@@ -273,166 +276,59 @@ enum { ...@@ -273,166 +276,59 @@ enum {
*/ */
CONF_SG_ADAPTIVE_RXT_TXT, CONF_SG_ADAPTIVE_RXT_TXT,
/* /* TODO: explain this value */
* The used WLAN legacy service period during active BT ACL link CONF_SG_GENERAL_USAGE_BIT_MAP,
*
* Range: 0 - 255 (ms)
*/
CONF_SG_PS_POLL_TIMEOUT,
/*
* The used WLAN UPSD service period during active BT ACL link
*
* Range: 0 - 255 (ms)
*/
CONF_SG_UPSD_TIMEOUT,
/*
* Configure the min and max time BT gains the antenna
* in WLAN Active / BT master EDR
*
* Range: 0 - 255 (ms)
*/
CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MIN_EDR,
CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MAX_EDR,
/*
* The maximum time WLAN can gain the antenna for
* in WLAN Active / BT master EDR
*
* Range: 0 - 255 (ms)
*/
CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_MASTER_EDR,
/*
* Configure the min and max time BT gains the antenna
* in WLAN Active / BT slave EDR
*
* Range: 0 - 255 (ms)
*/
CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MIN_EDR,
CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MAX_EDR,
/* /*
* The maximum time WLAN can gain the antenna for * Number of consecutive BT voice frames not interrupted by WLAN
* in WLAN Active / BT slave EDR
* *
* Range: 0 - 255 (ms) * Range: 0 - 100
*/ */
CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_SLAVE_EDR, CONF_SG_HV3_MAX_SERVED,
/* /*
* Configure the min and max time BT gains the antenna * The used WLAN legacy service period during active BT ACL link
* in WLAN Active / BT basic rate
* *
* Range: 0 - 255 (ms) * Range: 0 - 255 (ms)
*/ */
CONF_SG_WLAN_ACTIVE_BT_ACL_MIN_BR, CONF_SG_PS_POLL_TIMEOUT,
CONF_SG_WLAN_ACTIVE_BT_ACL_MAX_BR,
/* /*
* The maximum time WLAN can gain the antenna for * The used WLAN UPSD service period during active BT ACL link
* in WLAN Active / BT basic rate
* *
* Range: 0 - 255 (ms) * Range: 0 - 255 (ms)
*/ */
CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_BR, CONF_SG_UPSD_TIMEOUT,
/*
* Compensation percentage of WLAN passive scan window if initiated
* during BT voice
*
* Range: 0 - 1000 (%)
*/
CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3,
/*
* Compensation percentage of WLAN passive scan window if initiated
* during BT A2DP
*
* Range: 0 - 1000 (%)
*/
CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP,
/*
* Fixed time ensured for BT traffic to gain the antenna during WLAN
* passive scan.
*
* Range: 0 - 1000 ms
*/
CONF_SG_PASSIVE_SCAN_A2DP_BT_TIME,
/*
* Fixed time ensured for WLAN traffic to gain the antenna during WLAN
* passive scan.
*
* Range: 0 - 1000 ms
*/
CONF_SG_PASSIVE_SCAN_A2DP_WLAN_TIME,
/* CONF_SG_CONSECUTIVE_CTS_THRESHOLD,
* Number of consequent BT voice frames not interrupted by WLAN CONF_SG_STA_RX_WINDOW_AFTER_DTIM,
* CONF_SG_STA_CONNECTION_PROTECTION_TIME,
* Range: 0 - 100
*/
CONF_SG_HV3_MAX_SERVED,
/* /* AP params */
* Protection time of the DHCP procedure. CONF_AP_BEACON_MISS_TX,
* CONF_AP_RX_WINDOW_AFTER_BEACON,
* Range: 0 - 100000 (ms) CONF_AP_BEACON_WINDOW_INTERVAL,
*/ CONF_AP_CONNECTION_PROTECTION_TIME,
CONF_SG_DHCP_TIME, CONF_AP_BT_ACL_VAL_BT_SERVE_TIME,
CONF_AP_BT_ACL_VAL_WL_SERVE_TIME,
/*
* Compensation percentage of WLAN active scan window if initiated
* during BT A2DP
*
* Range: 0 - 1000 (%)
*/
CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP,
CONF_SG_TEMP_PARAM_1, CONF_SG_TEMP_PARAM_1,
CONF_SG_TEMP_PARAM_2, CONF_SG_TEMP_PARAM_2,
CONF_SG_TEMP_PARAM_3, CONF_SG_TEMP_PARAM_3,
CONF_SG_TEMP_PARAM_4, CONF_SG_TEMP_PARAM_4,
CONF_SG_TEMP_PARAM_5, CONF_SG_TEMP_PARAM_5,
/*
* AP beacon miss
*
* Range: 0 - 255
*/
CONF_SG_AP_BEACON_MISS_TX,
/*
* AP RX window length
*
* Range: 0 - 50
*/
CONF_SG_RX_WINDOW_LENGTH,
/*
* AP connection protection time
*
* Range: 0 - 5000
*/
CONF_SG_AP_CONNECTION_PROTECTION_TIME,
CONF_SG_TEMP_PARAM_6, CONF_SG_TEMP_PARAM_6,
CONF_SG_TEMP_PARAM_7, CONF_SG_TEMP_PARAM_7,
CONF_SG_TEMP_PARAM_8, CONF_SG_TEMP_PARAM_8,
CONF_SG_TEMP_PARAM_9, CONF_SG_TEMP_PARAM_9,
CONF_SG_TEMP_PARAM_10, CONF_SG_TEMP_PARAM_10,
CONF_SG_STA_PARAMS_MAX = CONF_SG_TEMP_PARAM_5 + 1, CONF_SG_PARAMS_MAX,
CONF_SG_AP_PARAMS_MAX = CONF_SG_TEMP_PARAM_10 + 1,
CONF_SG_PARAMS_ALL = 0xff CONF_SG_PARAMS_ALL = 0xff
}; };
struct conf_sg_settings { struct conf_sg_settings {
u32 sta_params[CONF_SG_STA_PARAMS_MAX]; u32 params[CONF_SG_PARAMS_MAX];
u32 ap_params[CONF_SG_AP_PARAMS_MAX];
u8 state; u8 state;
}; };
...@@ -545,6 +441,11 @@ struct conf_rx_settings { ...@@ -545,6 +441,11 @@ struct conf_rx_settings {
CONF_HW_BIT_RATE_36MBPS | CONF_HW_BIT_RATE_48MBPS | \ CONF_HW_BIT_RATE_36MBPS | CONF_HW_BIT_RATE_48MBPS | \
CONF_HW_BIT_RATE_54MBPS) CONF_HW_BIT_RATE_54MBPS)
#define CONF_TX_MCS_RATES (CONF_HW_BIT_RATE_MCS_0 | \
CONF_HW_BIT_RATE_MCS_1 | CONF_HW_BIT_RATE_MCS_2 | \
CONF_HW_BIT_RATE_MCS_3 | CONF_HW_BIT_RATE_MCS_4 | \
CONF_HW_BIT_RATE_MCS_5 | CONF_HW_BIT_RATE_MCS_6 | \
CONF_HW_BIT_RATE_MCS_7)
/* /*
* Default rates for management traffic when operating in AP mode. This * Default rates for management traffic when operating in AP mode. This
...@@ -661,6 +562,9 @@ struct conf_tx_ac_category { ...@@ -661,6 +562,9 @@ struct conf_tx_ac_category {
#define CONF_TX_MAX_TID_COUNT 8 #define CONF_TX_MAX_TID_COUNT 8
/* Allow TX BA on all TIDs but 6,7. These are currently reserved in the FW */
#define CONF_TX_BA_ENABLED_TID_BITMAP 0x3F
enum { enum {
CONF_CHANNEL_TYPE_DCF = 0, /* DC/LEGACY*/ CONF_CHANNEL_TYPE_DCF = 0, /* DC/LEGACY*/
CONF_CHANNEL_TYPE_EDCF = 1, /* EDCA*/ CONF_CHANNEL_TYPE_EDCF = 1, /* EDCA*/
...@@ -913,7 +817,7 @@ struct conf_conn_settings { ...@@ -913,7 +817,7 @@ struct conf_conn_settings {
struct conf_bcn_filt_rule bcn_filt_ie[CONF_MAX_BCN_FILT_IE_COUNT]; struct conf_bcn_filt_rule bcn_filt_ie[CONF_MAX_BCN_FILT_IE_COUNT];
/* /*
* The number of consequtive beacons to lose, before the firmware * The number of consecutive beacons to lose, before the firmware
* becomes out of synch. * becomes out of synch.
* *
* Range: u32 * Range: u32
...@@ -951,7 +855,7 @@ struct conf_conn_settings { ...@@ -951,7 +855,7 @@ struct conf_conn_settings {
u8 rx_broadcast_in_ps; u8 rx_broadcast_in_ps;
/* /*
* Consequtive PS Poll failures before sending event to driver * Consecutive PS Poll failures before sending event to driver
* *
* Range: u8 * Range: u8
*/ */
...@@ -1199,8 +1103,12 @@ struct conf_rf_settings { ...@@ -1199,8 +1103,12 @@ struct conf_rf_settings {
}; };
struct conf_ht_setting { struct conf_ht_setting {
u16 tx_ba_win_size; u8 rx_ba_win_size;
u8 tx_ba_win_size;
u16 inactivity_timeout; u16 inactivity_timeout;
/* bitmap of enabled TIDs for TX BA sessions */
u8 tx_ba_tid_bitmap;
}; };
struct conf_memory_settings { struct conf_memory_settings {
...@@ -1309,6 +1217,25 @@ struct conf_fwlog { ...@@ -1309,6 +1217,25 @@ struct conf_fwlog {
u8 threshold; u8 threshold;
}; };
#define ACX_RATE_MGMT_NUM_OF_RATES 13
struct conf_rate_policy_settings {
u16 rate_retry_score;
u16 per_add;
u16 per_th1;
u16 per_th2;
u16 max_per;
u8 inverse_curiosity_factor;
u8 tx_fail_low_th;
u8 tx_fail_high_th;
u8 per_alpha_shift;
u8 per_add_shift;
u8 per_beta1_shift;
u8 per_beta2_shift;
u8 rate_check_up;
u8 rate_check_down;
u8 rate_retry_policy[ACX_RATE_MGMT_NUM_OF_RATES];
};
struct conf_drv_settings { struct conf_drv_settings {
struct conf_sg_settings sg; struct conf_sg_settings sg;
struct conf_rx_settings rx; struct conf_rx_settings rx;
...@@ -1326,6 +1253,7 @@ struct conf_drv_settings { ...@@ -1326,6 +1253,7 @@ struct conf_drv_settings {
struct conf_fm_coex fm_coex; struct conf_fm_coex fm_coex;
struct conf_rx_streaming_settings rx_streaming; struct conf_rx_streaming_settings rx_streaming;
struct conf_fwlog fwlog; struct conf_fwlog fwlog;
struct conf_rate_policy_settings rate;
u8 hci_io_ds; u8 hci_io_ds;
}; };
......
...@@ -339,10 +339,11 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf, ...@@ -339,10 +339,11 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf,
#define DRIVER_STATE_PRINT_HEX(x) DRIVER_STATE_PRINT(x, "0x%x") #define DRIVER_STATE_PRINT_HEX(x) DRIVER_STATE_PRINT(x, "0x%x")
DRIVER_STATE_PRINT_INT(tx_blocks_available); DRIVER_STATE_PRINT_INT(tx_blocks_available);
DRIVER_STATE_PRINT_INT(tx_allocated_blocks[0]); DRIVER_STATE_PRINT_INT(tx_allocated_blocks);
DRIVER_STATE_PRINT_INT(tx_allocated_blocks[1]); DRIVER_STATE_PRINT_INT(tx_allocated_pkts[0]);
DRIVER_STATE_PRINT_INT(tx_allocated_blocks[2]); DRIVER_STATE_PRINT_INT(tx_allocated_pkts[1]);
DRIVER_STATE_PRINT_INT(tx_allocated_blocks[3]); DRIVER_STATE_PRINT_INT(tx_allocated_pkts[2]);
DRIVER_STATE_PRINT_INT(tx_allocated_pkts[3]);
DRIVER_STATE_PRINT_INT(tx_frames_cnt); DRIVER_STATE_PRINT_INT(tx_frames_cnt);
DRIVER_STATE_PRINT_LHEX(tx_frames_map[0]); DRIVER_STATE_PRINT_LHEX(tx_frames_map[0]);
DRIVER_STATE_PRINT_INT(tx_queue_count[0]); DRIVER_STATE_PRINT_INT(tx_queue_count[0]);
...@@ -352,10 +353,7 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf, ...@@ -352,10 +353,7 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf,
DRIVER_STATE_PRINT_INT(tx_packets_count); DRIVER_STATE_PRINT_INT(tx_packets_count);
DRIVER_STATE_PRINT_INT(tx_results_count); DRIVER_STATE_PRINT_INT(tx_results_count);
DRIVER_STATE_PRINT_LHEX(flags); DRIVER_STATE_PRINT_LHEX(flags);
DRIVER_STATE_PRINT_INT(tx_blocks_freed[0]); DRIVER_STATE_PRINT_INT(tx_blocks_freed);
DRIVER_STATE_PRINT_INT(tx_blocks_freed[1]);
DRIVER_STATE_PRINT_INT(tx_blocks_freed[2]);
DRIVER_STATE_PRINT_INT(tx_blocks_freed[3]);
DRIVER_STATE_PRINT_INT(tx_security_last_seq_lsb); DRIVER_STATE_PRINT_INT(tx_security_last_seq_lsb);
DRIVER_STATE_PRINT_INT(rx_counter); DRIVER_STATE_PRINT_INT(rx_counter);
DRIVER_STATE_PRINT_INT(session_counter); DRIVER_STATE_PRINT_INT(session_counter);
...@@ -369,9 +367,6 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf, ...@@ -369,9 +367,6 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf,
DRIVER_STATE_PRINT_INT(beacon_int); DRIVER_STATE_PRINT_INT(beacon_int);
DRIVER_STATE_PRINT_INT(psm_entry_retry); DRIVER_STATE_PRINT_INT(psm_entry_retry);
DRIVER_STATE_PRINT_INT(ps_poll_failures); DRIVER_STATE_PRINT_INT(ps_poll_failures);
DRIVER_STATE_PRINT_HEX(filters);
DRIVER_STATE_PRINT_HEX(rx_config);
DRIVER_STATE_PRINT_HEX(rx_filter);
DRIVER_STATE_PRINT_INT(power_level); DRIVER_STATE_PRINT_INT(power_level);
DRIVER_STATE_PRINT_INT(rssi_thold); DRIVER_STATE_PRINT_INT(rssi_thold);
DRIVER_STATE_PRINT_INT(last_rssi_event); DRIVER_STATE_PRINT_INT(last_rssi_event);
......
...@@ -285,13 +285,13 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox) ...@@ -285,13 +285,13 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
if ((vector & BA_SESSION_RX_CONSTRAINT_EVENT_ID) && !is_ap) { if ((vector & BA_SESSION_RX_CONSTRAINT_EVENT_ID) && !is_ap) {
wl1271_debug(DEBUG_EVENT, "BA_SESSION_RX_CONSTRAINT_EVENT_ID. " 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) 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) { if ((vector & DUMMY_PACKET_EVENT_ID)) {
wl1271_debug(DEBUG_EVENT, "DUMMY_PACKET_ID_EVENT_ID"); wl1271_debug(DEBUG_EVENT, "DUMMY_PACKET_ID_EVENT_ID");
if (wl->vif) if (wl->vif)
wl1271_tx_dummy_packet(wl); wl1271_tx_dummy_packet(wl);
......
...@@ -49,32 +49,27 @@ enum { ...@@ -49,32 +49,27 @@ enum {
MEASUREMENT_START_EVENT_ID = BIT(8), MEASUREMENT_START_EVENT_ID = BIT(8),
MEASUREMENT_COMPLETE_EVENT_ID = BIT(9), MEASUREMENT_COMPLETE_EVENT_ID = BIT(9),
SCAN_COMPLETE_EVENT_ID = BIT(10), 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), AP_DISCOVERY_COMPLETE_EVENT_ID = BIT(12),
PS_REPORT_EVENT_ID = BIT(13), PS_REPORT_EVENT_ID = BIT(13),
PSPOLL_DELIVERY_FAILURE_EVENT_ID = BIT(14), PSPOLL_DELIVERY_FAILURE_EVENT_ID = BIT(14),
DISCONNECT_EVENT_COMPLETE_ID = BIT(15), DISCONNECT_EVENT_COMPLETE_ID = BIT(15),
JOIN_EVENT_COMPLETE_ID = BIT(16), /* BIT(16) is reserved */
CHANNEL_SWITCH_COMPLETE_EVENT_ID = BIT(17), CHANNEL_SWITCH_COMPLETE_EVENT_ID = BIT(17),
BSS_LOSE_EVENT_ID = BIT(18), BSS_LOSE_EVENT_ID = BIT(18),
REGAINED_BSS_EVENT_ID = BIT(19), REGAINED_BSS_EVENT_ID = BIT(19),
MAX_TX_RETRY_EVENT_ID = BIT(20), MAX_TX_RETRY_EVENT_ID = BIT(20),
/* STA: dummy paket for dynamic mem blocks */
DUMMY_PACKET_EVENT_ID = BIT(21), DUMMY_PACKET_EVENT_ID = BIT(21),
/* AP: STA remove complete */
STA_REMOVE_COMPLETE_EVENT_ID = BIT(21),
SOFT_GEMINI_SENSE_EVENT_ID = BIT(22), SOFT_GEMINI_SENSE_EVENT_ID = BIT(22),
/* STA: SG prediction */ CHANGE_AUTO_MODE_TIMEOUT_EVENT_ID = BIT(23),
SOFT_GEMINI_PREDICTION_EVENT_ID = BIT(23),
/* AP: Inactive STA */
INACTIVE_STA_EVENT_ID = BIT(23),
SOFT_GEMINI_AVALANCHE_EVENT_ID = BIT(24), SOFT_GEMINI_AVALANCHE_EVENT_ID = BIT(24),
PLT_RX_CALIBRATION_COMPLETE_EVENT_ID = BIT(25), PLT_RX_CALIBRATION_COMPLETE_EVENT_ID = BIT(25),
DBG_EVENT_ID = BIT(26), INACTIVE_STA_EVENT_ID = BIT(26),
HEALTH_CHECK_REPLY_EVENT_ID = BIT(27), PEER_REMOVE_COMPLETE_EVENT_ID = BIT(27),
PERIODIC_SCAN_COMPLETE_EVENT_ID = BIT(28), PERIODIC_SCAN_COMPLETE_EVENT_ID = BIT(28),
PERIODIC_SCAN_REPORT_EVENT_ID = BIT(29), PERIODIC_SCAN_REPORT_EVENT_ID = BIT(29),
BA_SESSION_RX_CONSTRAINT_EVENT_ID = BIT(30), BA_SESSION_RX_CONSTRAINT_EVENT_ID = BIT(30),
REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID = BIT(31),
EVENT_MBOX_ALL_EVENT_ID = 0x7fffffff, EVENT_MBOX_ALL_EVENT_ID = 0x7fffffff,
}; };
...@@ -83,15 +78,6 @@ enum { ...@@ -83,15 +78,6 @@ enum {
EVENT_ENTER_POWER_SAVE_SUCCESS, 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 #define NUM_OF_RSSI_SNR_TRIGGERS 8
struct event_mailbox { struct event_mailbox {
...@@ -100,49 +86,45 @@ struct event_mailbox { ...@@ -100,49 +86,45 @@ struct event_mailbox {
__le32 reserved_1; __le32 reserved_1;
__le32 reserved_2; __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 number_of_scan_results;
u8 scan_tag; u8 scan_tag;
u8 reserved_4[2]; u8 completed_scan_status;
__le32 compl_scheduled_scan_status; u8 reserved_3;
__le16 scheduled_scan_attended_channels;
u8 soft_gemini_sense_info; u8 soft_gemini_sense_info;
u8 soft_gemini_protective_info; u8 soft_gemini_protective_info;
s8 rssi_snr_trigger_metric[NUM_OF_RSSI_SNR_TRIGGERS]; s8 rssi_snr_trigger_metric[NUM_OF_RSSI_SNR_TRIGGERS];
u8 channel_switch_status; u8 channel_switch_status;
u8 scheduled_scan_status; u8 scheduled_scan_status;
u8 ps_status; u8 ps_status;
/* tuned channel (roc) */
u8 roc_channel;
/* AP FW only */ __le16 hlid_removed_bitmap;
u8 hlid_removed;
/* a bitmap of hlids for stations that have been inactive too long */ /* bitmap of aged stations (by HLID) */
__le16 sta_aging_status; __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; __le16 sta_tx_retry_exceeded;
/* /* discovery completed results */
* Bitmap, Each bit set represents the Role ID for which this constraint u8 discovery_tag;
* is set. Range: 0 - FF, FF means ANY role u8 number_of_preq_results;
*/ u8 number_of_prsp_results;
u8 ba_role_id; u8 reserved_5;
/*
* Bitmap, Each bit set represents the Link ID for which this constraint /* rx ba constraint */
* is set. Not applicable if ba_role_id is set to ANY role (FF). u8 role_id; /* 0xFF means any role. */
* Range: 0 - FFFF, FFFF means ANY link in that role u8 rx_ba_allowed;
*/ u8 reserved_6[2];
u8 ba_link_id;
u8 ba_allowed; u8 ps_poll_delivery_failure_role_ids;
u8 stopped_role_ids;
u8 started_role_ids;
u8 change_auto_mode_timeout;
u8 reserved_5[21]; u8 reserved_7[12];
} __packed; } __packed;
int wl1271_event_unmask(struct wl1271 *wl); int wl1271_event_unmask(struct wl1271 *wl);
......
...@@ -39,13 +39,13 @@ int wl1271_sta_init_templates_config(struct wl1271 *wl) ...@@ -39,13 +39,13 @@ int wl1271_sta_init_templates_config(struct wl1271 *wl)
/* send empty templates for fw memory reservation */ /* send empty templates for fw memory reservation */
ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_2_4, NULL, ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_2_4, NULL,
WL1271_CMD_TEMPL_MAX_SIZE, WL1271_CMD_TEMPL_DFLT_SIZE,
0, WL1271_RATE_AUTOMATIC); 0, WL1271_RATE_AUTOMATIC);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5, ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5,
NULL, WL1271_CMD_TEMPL_MAX_SIZE, 0, NULL, WL1271_CMD_TEMPL_DFLT_SIZE, 0,
WL1271_RATE_AUTOMATIC); WL1271_RATE_AUTOMATIC);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -70,15 +70,13 @@ int wl1271_sta_init_templates_config(struct wl1271 *wl) ...@@ -70,15 +70,13 @@ int wl1271_sta_init_templates_config(struct wl1271 *wl)
return ret; return ret;
ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PROBE_RESPONSE, NULL, ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PROBE_RESPONSE, NULL,
sizeof WL1271_CMD_TEMPL_DFLT_SIZE,
(struct wl12xx_probe_resp_template),
0, WL1271_RATE_AUTOMATIC); 0, WL1271_RATE_AUTOMATIC);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON, NULL, ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON, NULL,
sizeof WL1271_CMD_TEMPL_DFLT_SIZE,
(struct wl12xx_beacon_template),
0, WL1271_RATE_AUTOMATIC); 0, WL1271_RATE_AUTOMATIC);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -92,7 +90,7 @@ int wl1271_sta_init_templates_config(struct wl1271 *wl) ...@@ -92,7 +90,7 @@ int wl1271_sta_init_templates_config(struct wl1271 *wl)
for (i = 0; i < CMD_TEMPL_KLV_IDX_MAX; i++) { for (i = 0; i < CMD_TEMPL_KLV_IDX_MAX; i++) {
ret = wl1271_cmd_template_set(wl, CMD_TEMPL_KLV, NULL, ret = wl1271_cmd_template_set(wl, CMD_TEMPL_KLV, NULL,
WL1271_CMD_TEMPL_MAX_SIZE, i, WL1271_CMD_TEMPL_DFLT_SIZE, i,
WL1271_RATE_AUTOMATIC); WL1271_RATE_AUTOMATIC);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -191,15 +189,13 @@ static int wl1271_ap_init_templates_config(struct wl1271 *wl) ...@@ -191,15 +189,13 @@ static int wl1271_ap_init_templates_config(struct wl1271 *wl)
* reserve memory for later. * reserve memory for later.
*/ */
ret = wl1271_cmd_template_set(wl, CMD_TEMPL_AP_PROBE_RESPONSE, NULL, ret = wl1271_cmd_template_set(wl, CMD_TEMPL_AP_PROBE_RESPONSE, NULL,
sizeof WL1271_CMD_TEMPL_MAX_SIZE,
(struct wl12xx_probe_resp_template),
0, WL1271_RATE_AUTOMATIC); 0, WL1271_RATE_AUTOMATIC);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = wl1271_cmd_template_set(wl, CMD_TEMPL_AP_BEACON, NULL, ret = wl1271_cmd_template_set(wl, CMD_TEMPL_AP_BEACON, NULL,
sizeof WL1271_CMD_TEMPL_MAX_SIZE,
(struct wl12xx_beacon_template),
0, WL1271_RATE_AUTOMATIC); 0, WL1271_RATE_AUTOMATIC);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -227,7 +223,7 @@ static int wl1271_ap_init_templates_config(struct wl1271 *wl) ...@@ -227,7 +223,7 @@ static int wl1271_ap_init_templates_config(struct wl1271 *wl)
return 0; return 0;
} }
static int wl1271_init_rx_config(struct wl1271 *wl, u32 config, u32 filter) static int wl12xx_init_rx_config(struct wl1271 *wl)
{ {
int ret; int ret;
...@@ -235,10 +231,6 @@ static int wl1271_init_rx_config(struct wl1271 *wl, u32 config, u32 filter) ...@@ -235,10 +231,6 @@ static int wl1271_init_rx_config(struct wl1271 *wl, u32 config, u32 filter)
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = wl1271_acx_rx_config(wl, config, filter);
if (ret < 0)
return ret;
return 0; return 0;
} }
...@@ -285,10 +277,7 @@ int wl1271_init_pta(struct wl1271 *wl) ...@@ -285,10 +277,7 @@ int wl1271_init_pta(struct wl1271 *wl)
{ {
int ret; int ret;
if (wl->bss_type == BSS_TYPE_AP_BSS) ret = wl12xx_acx_sg_cfg(wl);
ret = wl1271_acx_ap_sg_cfg(wl);
else
ret = wl1271_acx_sta_sg_cfg(wl);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -392,7 +381,7 @@ static int wl1271_sta_hw_init(struct wl1271 *wl) ...@@ -392,7 +381,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;
...@@ -408,12 +397,6 @@ static int wl1271_sta_hw_init_post_mem(struct wl1271 *wl) ...@@ -408,12 +397,6 @@ static int wl1271_sta_hw_init_post_mem(struct wl1271 *wl)
{ {
int ret, i; 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 */ /* disable all keep-alive templates */
for (i = 0; i < CMD_TEMPL_KLV_IDX_MAX; i++) { for (i = 0; i < CMD_TEMPL_KLV_IDX_MAX; i++) {
ret = wl1271_acx_keep_alive_config(wl, i, ret = wl1271_acx_keep_alive_config(wl, i,
...@@ -451,7 +434,7 @@ static int wl1271_ap_hw_init(struct wl1271 *wl) ...@@ -451,7 +434,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;
...@@ -483,7 +466,7 @@ int wl1271_ap_init_templates(struct wl1271 *wl) ...@@ -483,7 +466,7 @@ int wl1271_ap_init_templates(struct wl1271 *wl)
* when operating as AP we want to receive external beacons for * when operating as AP we want to receive external beacons for
* configuring ERP protection. * configuring ERP protection.
*/ */
ret = wl1271_acx_set_ap_beacon_filter(wl, false); ret = wl1271_acx_beacon_filter_opt(wl, false);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -532,6 +515,9 @@ int wl1271_init_ap_rates(struct wl1271 *wl) ...@@ -532,6 +515,9 @@ int wl1271_init_ap_rates(struct wl1271 *wl)
else else
supported_rates = CONF_TX_AP_ENABLED_RATES; supported_rates = CONF_TX_AP_ENABLED_RATES;
/* unconditionally enable HT rates */
supported_rates |= CONF_TX_MCS_RATES;
/* configure unicast TX rate classes */ /* configure unicast TX rate classes */
for (i = 0; i < wl->conf.tx.ac_conf_count; i++) { for (i = 0; i < wl->conf.tx.ac_conf_count; i++) {
rc.enabled_rates = supported_rates; rc.enabled_rates = supported_rates;
...@@ -546,41 +532,24 @@ int wl1271_init_ap_rates(struct wl1271 *wl) ...@@ -546,41 +532,24 @@ int wl1271_init_ap_rates(struct wl1271 *wl)
return 0; return 0;
} }
static void wl1271_check_ba_support(struct wl1271 *wl)
{
/* validate FW cose ver x.x.x.50-60.x */
if ((wl->chip.fw_ver[3] >= WL12XX_BA_SUPPORT_FW_COST_VER2_START) &&
(wl->chip.fw_ver[3] < WL12XX_BA_SUPPORT_FW_COST_VER2_END)) {
wl->ba_support = true;
return;
}
wl->ba_support = false;
}
static int wl1271_set_ba_policies(struct wl1271 *wl) static int wl1271_set_ba_policies(struct wl1271 *wl)
{ {
u8 tid_index;
int ret = 0;
/* Reset the BA RX indicators */ /* Reset the BA RX indicators */
wl->ba_rx_bitmap = 0; wl->ba_rx_bitmap = 0;
wl->ba_allowed = true; wl->ba_allowed = true;
wl->ba_rx_session_count = 0;
/* validate that FW support BA */ /* BA is supported in STA/AP modes */
wl1271_check_ba_support(wl); if (wl->bss_type != BSS_TYPE_AP_BSS &&
wl->bss_type != BSS_TYPE_STA_BSS) {
if (wl->ba_support) wl->ba_support = false;
/* 802.11n initiator BA session setting */ return 0;
for (tid_index = 0; tid_index < CONF_TX_MAX_TID_COUNT;
++tid_index) {
ret = wl1271_acx_set_ba_session(wl, WLAN_BACK_INITIATOR,
tid_index, true);
if (ret < 0)
break;
} }
return ret; wl->ba_support = true;
/* 802.11n initiator BA session setting */
return wl12xx_acx_set_ba_initiator_policy(wl);
} }
int wl1271_chip_specific_init(struct wl1271 *wl) int wl1271_chip_specific_init(struct wl1271 *wl)
...@@ -650,11 +619,7 @@ int wl1271_hw_init(struct wl1271 *wl) ...@@ -650,11 +619,7 @@ int wl1271_hw_init(struct wl1271 *wl)
return ret; return ret;
/* RX config */ /* RX config */
ret = wl1271_init_rx_config(wl, ret = wl12xx_init_rx_config(wl);
RX_CFG_PROMISCUOUS | RX_CFG_TSF,
RX_FILTER_OPTION_DEF);
/* RX_CONFIG_OPTION_ANY_DST_ANY_BSS,
RX_FILTER_OPTION_FILTER_ALL); */
if (ret < 0) if (ret < 0)
goto out_free_memmap; goto out_free_memmap;
...@@ -733,6 +698,10 @@ int wl1271_hw_init(struct wl1271 *wl) ...@@ -733,6 +698,10 @@ int wl1271_hw_init(struct wl1271 *wl)
if (ret < 0) if (ret < 0)
goto out_free_memmap; goto out_free_memmap;
ret = wl12xx_acx_set_rate_mgmt_params(wl);
if (ret < 0)
goto out_free_memmap;
/* Configure initiator BA sessions policies */ /* Configure initiator BA sessions policies */
ret = wl1271_set_ba_policies(wl); ret = wl1271_set_ba_policies(wl);
if (ret < 0) if (ret < 0)
......
...@@ -186,6 +186,5 @@ int wl1271_free_hw(struct wl1271 *wl); ...@@ -186,6 +186,5 @@ int wl1271_free_hw(struct wl1271 *wl);
irqreturn_t wl1271_irq(int irq, void *data); irqreturn_t wl1271_irq(int irq, void *data);
bool wl1271_set_block_size(struct wl1271 *wl); bool wl1271_set_block_size(struct wl1271 *wl);
int wl1271_tx_dummy_packet(struct wl1271 *wl); int wl1271_tx_dummy_packet(struct wl1271 *wl);
void wl1271_configure_filters(struct wl1271 *wl, unsigned int filters);
#endif #endif
此差异已折叠。
...@@ -226,8 +226,8 @@ void wl1271_ps_link_start(struct wl1271 *wl, u8 hlid, bool clean_queues) ...@@ -226,8 +226,8 @@ void wl1271_ps_link_start(struct wl1271 *wl, u8 hlid, bool clean_queues)
if (test_bit(hlid, &wl->ap_ps_map)) if (test_bit(hlid, &wl->ap_ps_map))
return; return;
wl1271_debug(DEBUG_PSM, "start mac80211 PSM on hlid %d blks %d " wl1271_debug(DEBUG_PSM, "start mac80211 PSM on hlid %d pkts %d "
"clean_queues %d", hlid, wl->links[hlid].allocated_blks, "clean_queues %d", hlid, wl->links[hlid].allocated_pkts,
clean_queues); clean_queues);
rcu_read_lock(); rcu_read_lock();
......
...@@ -296,81 +296,6 @@ ...@@ -296,81 +296,6 @@
===============================================*/ ===============================================*/
#define REG_EVENT_MAILBOX_PTR (SCR_PAD1) #define REG_EVENT_MAILBOX_PTR (SCR_PAD1)
/* Misc */
#define REG_ENABLE_TX_RX (ENABLE)
/*
* Rx configuration (filter) information element
* ---------------------------------------------
*/
#define REG_RX_CONFIG (RX_CFG)
#define REG_RX_FILTER (RX_FILTER_CFG)
#define RX_CFG_ENABLE_PHY_HEADER_PLCP 0x0002
/* promiscuous - receives all valid frames */
#define RX_CFG_PROMISCUOUS 0x0008
/* receives frames from any BSSID */
#define RX_CFG_BSSID 0x0020
/* receives frames destined to any MAC address */
#define RX_CFG_MAC 0x0010
#define RX_CFG_ENABLE_ONLY_MY_DEST_MAC 0x0010
#define RX_CFG_ENABLE_ANY_DEST_MAC 0x0000
#define RX_CFG_ENABLE_ONLY_MY_BSSID 0x0020
#define RX_CFG_ENABLE_ANY_BSSID 0x0000
/* discards all broadcast frames */
#define RX_CFG_DISABLE_BCAST 0x0200
#define RX_CFG_ENABLE_ONLY_MY_SSID 0x0400
#define RX_CFG_ENABLE_RX_CMPLT_FCS_ERROR 0x0800
#define RX_CFG_COPY_RX_STATUS 0x2000
#define RX_CFG_TSF 0x10000
#define RX_CONFIG_OPTION_ANY_DST_MY_BSS (RX_CFG_ENABLE_ANY_DEST_MAC | \
RX_CFG_ENABLE_ONLY_MY_BSSID)
#define RX_CONFIG_OPTION_MY_DST_ANY_BSS (RX_CFG_ENABLE_ONLY_MY_DEST_MAC\
| RX_CFG_ENABLE_ANY_BSSID)
#define RX_CONFIG_OPTION_ANY_DST_ANY_BSS (RX_CFG_ENABLE_ANY_DEST_MAC | \
RX_CFG_ENABLE_ANY_BSSID)
#define RX_CONFIG_OPTION_MY_DST_MY_BSS (RX_CFG_ENABLE_ONLY_MY_DEST_MAC\
| RX_CFG_ENABLE_ONLY_MY_BSSID)
#define RX_CONFIG_OPTION_FOR_SCAN (RX_CFG_ENABLE_PHY_HEADER_PLCP \
| RX_CFG_ENABLE_RX_CMPLT_FCS_ERROR \
| RX_CFG_COPY_RX_STATUS | RX_CFG_TSF)
#define RX_CONFIG_OPTION_FOR_MEASUREMENT (RX_CFG_ENABLE_ANY_DEST_MAC)
#define RX_CONFIG_OPTION_FOR_JOIN (RX_CFG_ENABLE_ONLY_MY_BSSID | \
RX_CFG_ENABLE_ONLY_MY_DEST_MAC)
#define RX_CONFIG_OPTION_FOR_IBSS_JOIN (RX_CFG_ENABLE_ONLY_MY_SSID | \
RX_CFG_ENABLE_ONLY_MY_DEST_MAC)
#define RX_FILTER_OPTION_DEF (CFG_RX_MGMT_EN | CFG_RX_DATA_EN\
| CFG_RX_CTL_EN | CFG_RX_BCN_EN\
| CFG_RX_AUTH_EN | CFG_RX_ASSOC_EN)
#define RX_FILTER_OPTION_FILTER_ALL 0
#define RX_FILTER_OPTION_DEF_PRSP_BCN (CFG_RX_PRSP_EN | CFG_RX_MGMT_EN\
| CFG_RX_RCTS_ACK | CFG_RX_BCN_EN)
#define RX_FILTER_OPTION_JOIN (CFG_RX_MGMT_EN | CFG_RX_DATA_EN\
| CFG_RX_BCN_EN | CFG_RX_AUTH_EN\
| CFG_RX_ASSOC_EN | CFG_RX_RCTS_ACK\
| CFG_RX_PRSP_EN)
/*=============================================== /*===============================================
EEPROM Read/Write Request 32bit RW EEPROM Read/Write Request 32bit RW
------------------------------------------ ------------------------------------------
......
...@@ -30,20 +30,28 @@ ...@@ -30,20 +30,28 @@
#include "rx.h" #include "rx.h"
#include "io.h" #include "io.h"
static u8 wl1271_rx_get_mem_block(struct wl1271_fw_common_status *status, static u8 wl12xx_rx_get_mem_block(struct wl12xx_fw_status *status,
u32 drv_rx_counter) u32 drv_rx_counter)
{ {
return le32_to_cpu(status->rx_pkt_descs[drv_rx_counter]) & return le32_to_cpu(status->rx_pkt_descs[drv_rx_counter]) &
RX_MEM_BLOCK_MASK; RX_MEM_BLOCK_MASK;
} }
static u32 wl1271_rx_get_buf_size(struct wl1271_fw_common_status *status, static u32 wl12xx_rx_get_buf_size(struct wl12xx_fw_status *status,
u32 drv_rx_counter) u32 drv_rx_counter)
{ {
return (le32_to_cpu(status->rx_pkt_descs[drv_rx_counter]) & return (le32_to_cpu(status->rx_pkt_descs[drv_rx_counter]) &
RX_BUF_SIZE_MASK) >> RX_BUF_SIZE_SHIFT_DIV; RX_BUF_SIZE_MASK) >> RX_BUF_SIZE_SHIFT_DIV;
} }
static bool wl12xx_rx_get_unaligned(struct wl12xx_fw_status *status,
u32 drv_rx_counter)
{
/* Convert the value to bool */
return !!(le32_to_cpu(status->rx_pkt_descs[drv_rx_counter]) &
RX_BUF_UNALIGNED_PAYLOAD);
}
static void wl1271_rx_status(struct wl1271 *wl, static void wl1271_rx_status(struct wl1271 *wl,
struct wl1271_rx_descriptor *desc, struct wl1271_rx_descriptor *desc,
struct ieee80211_rx_status *status, struct ieee80211_rx_status *status,
...@@ -89,7 +97,8 @@ static void wl1271_rx_status(struct wl1271 *wl, ...@@ -89,7 +97,8 @@ static void wl1271_rx_status(struct wl1271 *wl,
} }
} }
static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length) static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length,
bool unaligned)
{ {
struct wl1271_rx_descriptor *desc; struct wl1271_rx_descriptor *desc;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -97,6 +106,7 @@ static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length) ...@@ -97,6 +106,7 @@ static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length)
u8 *buf; u8 *buf;
u8 beacon = 0; u8 beacon = 0;
u8 is_data = 0; u8 is_data = 0;
u8 reserved = unaligned ? NET_IP_ALIGN : 0;
/* /*
* In PLT mode we seem to get frames and mac80211 warns about them, * In PLT mode we seem to get frames and mac80211 warns about them,
...@@ -131,17 +141,25 @@ static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length) ...@@ -131,17 +141,25 @@ static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length)
return -EINVAL; return -EINVAL;
} }
skb = __dev_alloc_skb(length, GFP_KERNEL); /* skb length not included rx descriptor */
skb = __dev_alloc_skb(length + reserved - sizeof(*desc), GFP_KERNEL);
if (!skb) { if (!skb) {
wl1271_error("Couldn't allocate RX frame"); wl1271_error("Couldn't allocate RX frame");
return -ENOMEM; return -ENOMEM;
} }
buf = skb_put(skb, length); /* reserve the unaligned payload(if any) */
memcpy(buf, data, length); skb_reserve(skb, reserved);
/* now we pull the descriptor out of the buffer */ buf = skb_put(skb, length - sizeof(*desc));
skb_pull(skb, sizeof(*desc));
/*
* Copy packets from aggregation buffer to the skbs without rx
* descriptor and with packet payload aligned care. In case of unaligned
* packets copy the packets in offset of 2 bytes guarantee IP header
* payload aligned to 4 bytes.
*/
memcpy(buf, data + sizeof(*desc), length - sizeof(*desc));
hdr = (struct ieee80211_hdr *)skb->data; hdr = (struct ieee80211_hdr *)skb->data;
if (ieee80211_is_beacon(hdr->frame_control)) if (ieee80211_is_beacon(hdr->frame_control))
...@@ -163,7 +181,7 @@ static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length) ...@@ -163,7 +181,7 @@ static int wl1271_rx_handle_data(struct wl1271 *wl, u8 *data, u32 length)
return is_data; return is_data;
} }
void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status) void wl12xx_rx(struct wl1271 *wl, struct wl12xx_fw_status *status)
{ {
struct wl1271_acx_mem_map *wl_mem_map = wl->target_mem_map; struct wl1271_acx_mem_map *wl_mem_map = wl->target_mem_map;
u32 buf_size; u32 buf_size;
...@@ -175,12 +193,13 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status) ...@@ -175,12 +193,13 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status)
u32 pkt_offset; u32 pkt_offset;
bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS); bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
bool had_data = false; bool had_data = false;
bool unaligned = false;
while (drv_rx_counter != fw_rx_counter) { while (drv_rx_counter != fw_rx_counter) {
buf_size = 0; buf_size = 0;
rx_counter = drv_rx_counter; rx_counter = drv_rx_counter;
while (rx_counter != fw_rx_counter) { while (rx_counter != fw_rx_counter) {
pkt_length = wl1271_rx_get_buf_size(status, rx_counter); pkt_length = wl12xx_rx_get_buf_size(status, rx_counter);
if (buf_size + pkt_length > WL1271_AGGR_BUFFER_SIZE) if (buf_size + pkt_length > WL1271_AGGR_BUFFER_SIZE)
break; break;
buf_size += pkt_length; buf_size += pkt_length;
...@@ -199,7 +218,7 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status) ...@@ -199,7 +218,7 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status)
* For aggregated packets, only the first memory block * For aggregated packets, only the first memory block
* should be retrieved. The FW takes care of the rest. * should be retrieved. The FW takes care of the rest.
*/ */
mem_block = wl1271_rx_get_mem_block(status, mem_block = wl12xx_rx_get_mem_block(status,
drv_rx_counter); drv_rx_counter);
wl->rx_mem_pool_addr.addr = (mem_block << 8) + wl->rx_mem_pool_addr.addr = (mem_block << 8) +
...@@ -220,8 +239,12 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status) ...@@ -220,8 +239,12 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status)
/* Split data into separate packets */ /* Split data into separate packets */
pkt_offset = 0; pkt_offset = 0;
while (pkt_offset < buf_size) { while (pkt_offset < buf_size) {
pkt_length = wl1271_rx_get_buf_size(status, pkt_length = wl12xx_rx_get_buf_size(status,
drv_rx_counter); drv_rx_counter);
unaligned = wl12xx_rx_get_unaligned(status,
drv_rx_counter);
/* /*
* the handle data call can only fail in memory-outage * the handle data call can only fail in memory-outage
* conditions, in that case the received frame will just * conditions, in that case the received frame will just
...@@ -229,7 +252,7 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status) ...@@ -229,7 +252,7 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status)
*/ */
if (wl1271_rx_handle_data(wl, if (wl1271_rx_handle_data(wl,
wl->aggr_buf + pkt_offset, wl->aggr_buf + pkt_offset,
pkt_length) == 1) pkt_length, unaligned) == 1)
had_data = true; had_data = true;
wl->rx_counter++; wl->rx_counter++;
...@@ -260,14 +283,3 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status) ...@@ -260,14 +283,3 @@ void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status)
jiffies + msecs_to_jiffies(timeout)); jiffies + msecs_to_jiffies(timeout));
} }
} }
void wl1271_set_default_filters(struct wl1271 *wl)
{
if (wl->bss_type == BSS_TYPE_AP_BSS) {
wl->rx_config = WL1271_DEFAULT_AP_RX_CONFIG;
wl->rx_filter = WL1271_DEFAULT_AP_RX_FILTER;
} else {
wl->rx_config = WL1271_DEFAULT_STA_RX_CONFIG;
wl->rx_filter = WL1271_DEFAULT_STA_RX_FILTER;
}
}
...@@ -86,7 +86,7 @@ ...@@ -86,7 +86,7 @@
* Bits 3-5 - process_id tag (AP mode FW) * Bits 3-5 - process_id tag (AP mode FW)
* Bits 6-7 - reserved * Bits 6-7 - reserved
*/ */
#define WL1271_RX_DESC_STATUS_MASK 0x07 #define WL1271_RX_DESC_STATUS_MASK 0x03
#define WL1271_RX_DESC_SUCCESS 0x00 #define WL1271_RX_DESC_SUCCESS 0x00
#define WL1271_RX_DESC_DECRYPT_FAIL 0x01 #define WL1271_RX_DESC_DECRYPT_FAIL 0x01
...@@ -96,6 +96,8 @@ ...@@ -96,6 +96,8 @@
#define RX_MEM_BLOCK_MASK 0xFF #define RX_MEM_BLOCK_MASK 0xFF
#define RX_BUF_SIZE_MASK 0xFFF00 #define RX_BUF_SIZE_MASK 0xFFF00
#define RX_BUF_SIZE_SHIFT_DIV 6 #define RX_BUF_SIZE_SHIFT_DIV 6
/* If set, the start of IP payload is not 4 bytes aligned */
#define RX_BUF_UNALIGNED_PAYLOAD BIT(20)
enum { enum {
WL12XX_RX_CLASS_UNKNOWN, WL12XX_RX_CLASS_UNKNOWN,
...@@ -119,16 +121,12 @@ struct wl1271_rx_descriptor { ...@@ -119,16 +121,12 @@ struct wl1271_rx_descriptor {
u8 snr; u8 snr;
__le32 timestamp; __le32 timestamp;
u8 packet_class; u8 packet_class;
union { u8 hlid;
u8 process_id; /* STA FW */
u8 hlid; /* AP FW */
} __packed;
u8 pad_len; u8 pad_len;
u8 reserved; u8 reserved;
} __packed; } __packed;
void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_common_status *status); void wl12xx_rx(struct wl1271 *wl, struct wl12xx_fw_status *status);
u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band); u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band);
void wl1271_set_default_filters(struct wl1271 *wl);
#endif #endif
...@@ -33,6 +33,8 @@ void wl1271_scan_complete_work(struct work_struct *work) ...@@ -33,6 +33,8 @@ void wl1271_scan_complete_work(struct work_struct *work)
{ {
struct delayed_work *dwork; struct delayed_work *dwork;
struct wl1271 *wl; struct wl1271 *wl;
int ret;
bool is_sta, is_ibss;
dwork = container_of(work, struct delayed_work, work); dwork = container_of(work, struct delayed_work, work);
wl = container_of(dwork, struct wl1271, scan_complete_work); wl = container_of(dwork, struct wl1271, scan_complete_work);
...@@ -50,21 +52,34 @@ void wl1271_scan_complete_work(struct work_struct *work) ...@@ -50,21 +52,34 @@ void wl1271_scan_complete_work(struct work_struct *work)
wl->scan.state = WL1271_SCAN_STATE_IDLE; wl->scan.state = WL1271_SCAN_STATE_IDLE;
memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch)); memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
wl->scan.req = NULL; wl->scan.req = NULL;
ieee80211_scan_completed(wl->hw, false);
/* restore hardware connection monitoring template */ ret = wl1271_ps_elp_wakeup(wl);
if (ret < 0)
goto out;
if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) { if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
if (wl1271_ps_elp_wakeup(wl) == 0) { /* restore hardware connection monitoring template */
wl1271_cmd_build_ap_probe_req(wl, wl->probereq); wl1271_cmd_build_ap_probe_req(wl, wl->probereq);
wl1271_ps_elp_sleep(wl);
} }
/* return to ROC if needed */
is_sta = (wl->bss_type == BSS_TYPE_STA_BSS);
is_ibss = (wl->bss_type == BSS_TYPE_IBSS);
if ((is_sta && !test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) ||
(is_ibss && !test_bit(WL1271_FLAG_IBSS_JOINED, &wl->flags))) {
/* restore remain on channel */
wl12xx_cmd_role_start_dev(wl);
wl12xx_roc(wl, wl->dev_role_id);
} }
wl1271_ps_elp_sleep(wl);
if (wl->scan.failed) { if (wl->scan.failed) {
wl1271_info("Scan completed due to error."); wl1271_info("Scan completed due to error.");
wl12xx_queue_recovery_work(wl); wl12xx_queue_recovery_work(wl);
} }
ieee80211_scan_completed(wl->hw, false);
out: out:
mutex_unlock(&wl->mutex); mutex_unlock(&wl->mutex);
...@@ -156,6 +171,11 @@ static int wl1271_scan_send(struct wl1271 *wl, enum ieee80211_band band, ...@@ -156,6 +171,11 @@ static int wl1271_scan_send(struct wl1271 *wl, enum ieee80211_band band,
if (passive || wl->scan.req->n_ssids == 0) if (passive || wl->scan.req->n_ssids == 0)
scan_options |= WL1271_SCAN_OPT_PASSIVE; scan_options |= WL1271_SCAN_OPT_PASSIVE;
if (WARN_ON(wl->role_id == WL12XX_INVALID_ROLE_ID)) {
ret = -EINVAL;
goto out;
}
cmd->params.role_id = wl->role_id;
cmd->params.scan_options = cpu_to_le16(scan_options); cmd->params.scan_options = cpu_to_le16(scan_options);
cmd->params.n_ch = wl1271_get_scan_channels(wl, wl->scan.req, cmd->params.n_ch = wl1271_get_scan_channels(wl, wl->scan.req,
...@@ -167,10 +187,6 @@ static int wl1271_scan_send(struct wl1271 *wl, enum ieee80211_band band, ...@@ -167,10 +187,6 @@ static int wl1271_scan_send(struct wl1271 *wl, enum ieee80211_band band,
} }
cmd->params.tx_rate = cpu_to_le32(basic_rate); cmd->params.tx_rate = cpu_to_le32(basic_rate);
cmd->params.rx_config_options = cpu_to_le32(CFG_RX_ALL_GOOD);
cmd->params.rx_filter_options =
cpu_to_le32(CFG_RX_PRSP_EN | CFG_RX_MGMT_EN | CFG_RX_BCN_EN);
cmd->params.n_probe_reqs = wl->conf.scan.num_probe_reqs; cmd->params.n_probe_reqs = wl->conf.scan.num_probe_reqs;
cmd->params.tx_rate = cpu_to_le32(basic_rate); cmd->params.tx_rate = cpu_to_le32(basic_rate);
cmd->params.tid_trigger = 0; cmd->params.tid_trigger = 0;
...@@ -186,6 +202,8 @@ static int wl1271_scan_send(struct wl1271 *wl, enum ieee80211_band band, ...@@ -186,6 +202,8 @@ static int wl1271_scan_send(struct wl1271 *wl, enum ieee80211_band band,
memcpy(cmd->params.ssid, wl->scan.ssid, wl->scan.ssid_len); memcpy(cmd->params.ssid, wl->scan.ssid, wl->scan.ssid_len);
} }
memcpy(cmd->addr, wl->mac_addr, ETH_ALEN);
ret = wl1271_cmd_build_probe_req(wl, wl->scan.ssid, wl->scan.ssid_len, ret = wl1271_cmd_build_probe_req(wl, wl->scan.ssid, wl->scan.ssid_len,
wl->scan.req->ie, wl->scan.req->ie_len, wl->scan.req->ie, wl->scan.req->ie_len,
band); band);
......
...@@ -46,7 +46,10 @@ void wl1271_scan_sched_scan_results(struct wl1271 *wl); ...@@ -46,7 +46,10 @@ void wl1271_scan_sched_scan_results(struct wl1271 *wl);
#define WL1271_SCAN_CURRENT_TX_PWR 0 #define WL1271_SCAN_CURRENT_TX_PWR 0
#define WL1271_SCAN_OPT_ACTIVE 0 #define WL1271_SCAN_OPT_ACTIVE 0
#define WL1271_SCAN_OPT_PASSIVE 1 #define WL1271_SCAN_OPT_PASSIVE 1
#define WL1271_SCAN_OPT_TRIGGERED_SCAN 2
#define WL1271_SCAN_OPT_PRIORITY_HIGH 4 #define WL1271_SCAN_OPT_PRIORITY_HIGH 4
/* scan even if we fail to enter psm */
#define WL1271_SCAN_OPT_FORCE 8
#define WL1271_SCAN_BAND_2_4_GHZ 0 #define WL1271_SCAN_BAND_2_4_GHZ 0
#define WL1271_SCAN_BAND_5_GHZ 1 #define WL1271_SCAN_BAND_5_GHZ 1
...@@ -62,27 +65,27 @@ enum { ...@@ -62,27 +65,27 @@ enum {
}; };
struct basic_scan_params { struct basic_scan_params {
__le32 rx_config_options;
__le32 rx_filter_options;
/* Scan option flags (WL1271_SCAN_OPT_*) */ /* Scan option flags (WL1271_SCAN_OPT_*) */
__le16 scan_options; __le16 scan_options;
u8 role_id;
/* Number of scan channels in the list (maximum 30) */ /* Number of scan channels in the list (maximum 30) */
u8 n_ch; u8 n_ch;
/* This field indicates the number of probe requests to send /* This field indicates the number of probe requests to send
per channel for an active scan */ per channel for an active scan */
u8 n_probe_reqs; u8 n_probe_reqs;
/* Rate bit field for sending the probes */
__le32 tx_rate;
u8 tid_trigger; u8 tid_trigger;
u8 ssid_len; u8 ssid_len;
/* in order to align */ u8 use_ssid_list;
u8 padding1[2];
/* Rate bit field for sending the probes */
__le32 tx_rate;
u8 ssid[IEEE80211_MAX_SSID_LEN]; u8 ssid[IEEE80211_MAX_SSID_LEN];
/* Band to scan */ /* Band to scan */
u8 band; u8 band;
u8 use_ssid_list;
u8 scan_tag; u8 scan_tag;
u8 padding2; u8 padding2[2];
} __packed; } __packed;
struct basic_scan_channel_params { struct basic_scan_channel_params {
...@@ -105,6 +108,10 @@ struct wl1271_cmd_scan { ...@@ -105,6 +108,10 @@ struct wl1271_cmd_scan {
struct basic_scan_params params; struct basic_scan_params params;
struct basic_scan_channel_params channels[WL1271_SCAN_MAX_CHANNELS]; struct basic_scan_channel_params channels[WL1271_SCAN_MAX_CHANNELS];
/* src mac address */
u8 addr[ETH_ALEN];
u8 padding[2];
} __packed; } __packed;
struct wl1271_cmd_trigger_scan_to { struct wl1271_cmd_trigger_scan_to {
...@@ -184,7 +191,7 @@ struct wl1271_cmd_sched_scan_config { ...@@ -184,7 +191,7 @@ struct wl1271_cmd_sched_scan_config {
} __packed; } __packed;
#define SCHED_SCAN_MAX_SSIDS 8 #define SCHED_SCAN_MAX_SSIDS 16
enum { enum {
SCAN_SSID_TYPE_PUBLIC = 0, SCAN_SSID_TYPE_PUBLIC = 0,
......
...@@ -412,7 +412,5 @@ module_exit(wl1271_exit); ...@@ -412,7 +412,5 @@ module_exit(wl1271_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>"); MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>"); MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
MODULE_FIRMWARE(WL1271_FW_NAME); MODULE_FIRMWARE(WL127X_FW_NAME);
MODULE_FIRMWARE(WL128X_FW_NAME); MODULE_FIRMWARE(WL128X_FW_NAME);
MODULE_FIRMWARE(WL127X_AP_FW_NAME);
MODULE_FIRMWARE(WL128X_AP_FW_NAME);
...@@ -486,8 +486,6 @@ module_exit(wl1271_exit); ...@@ -486,8 +486,6 @@ module_exit(wl1271_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>"); MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>"); MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
MODULE_FIRMWARE(WL1271_FW_NAME); MODULE_FIRMWARE(WL127X_FW_NAME);
MODULE_FIRMWARE(WL128X_FW_NAME); MODULE_FIRMWARE(WL128X_FW_NAME);
MODULE_FIRMWARE(WL127X_AP_FW_NAME);
MODULE_FIRMWARE(WL128X_AP_FW_NAME);
MODULE_ALIAS("spi:wl1271"); MODULE_ALIAS("spi:wl1271");
...@@ -37,9 +37,10 @@ static int wl1271_set_default_wep_key(struct wl1271 *wl, u8 id) ...@@ -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); bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
if (is_ap) if (is_ap)
ret = wl1271_cmd_set_ap_default_wep_key(wl, id); ret = wl12xx_cmd_set_default_wep_key(wl, id,
wl->ap_bcast_hlid);
else 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) if (ret < 0)
return ret; return ret;
...@@ -77,6 +78,7 @@ static int wl1271_tx_update_filters(struct wl1271 *wl, ...@@ -77,6 +78,7 @@ static int wl1271_tx_update_filters(struct wl1271 *wl,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
int ret;
hdr = (struct ieee80211_hdr *)(skb->data + hdr = (struct ieee80211_hdr *)(skb->data +
sizeof(struct wl1271_tx_hw_descr)); sizeof(struct wl1271_tx_hw_descr));
...@@ -90,9 +92,19 @@ static int wl1271_tx_update_filters(struct wl1271 *wl, ...@@ -90,9 +92,19 @@ static int wl1271_tx_update_filters(struct wl1271 *wl,
if (!ieee80211_is_auth(hdr->frame_control)) if (!ieee80211_is_auth(hdr->frame_control))
return 0; return 0;
wl1271_configure_filters(wl, FIF_OTHER_BSS); if (wl->dev_hlid != WL12XX_INVALID_LINK_ID)
goto out;
return wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter); wl1271_debug(DEBUG_CMD, "starting device role for roaming");
ret = wl12xx_cmd_role_start_dev(wl);
if (ret < 0)
goto out;
ret = wl12xx_roc(wl, wl->dev_role_id);
if (ret < 0)
goto out;
out:
return 0;
} }
static void wl1271_tx_ap_update_inconnection_sta(struct wl1271 *wl, static void wl1271_tx_ap_update_inconnection_sta(struct wl1271 *wl,
...@@ -114,24 +126,29 @@ static void wl1271_tx_ap_update_inconnection_sta(struct wl1271 *wl, ...@@ -114,24 +126,29 @@ static void wl1271_tx_ap_update_inconnection_sta(struct wl1271 *wl,
static void wl1271_tx_regulate_link(struct wl1271 *wl, u8 hlid) static void wl1271_tx_regulate_link(struct wl1271 *wl, u8 hlid)
{ {
bool fw_ps; bool fw_ps;
u8 tx_blks; u8 tx_pkts;
/* only regulate station links */ /* only regulate station links */
if (hlid < WL1271_AP_STA_HLID_START) if (hlid < WL1271_AP_STA_HLID_START)
return; return;
fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map); fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
tx_blks = wl->links[hlid].allocated_blks; tx_pkts = wl->links[hlid].allocated_pkts;
/* /*
* if in FW PS and there is enough data in FW we can put the link * if in FW PS and there is enough data in FW we can put the link
* into high-level PS and clean out its TX queues. * into high-level PS and clean out its TX queues.
*/ */
if (fw_ps && tx_blks >= WL1271_PS_STA_MAX_BLOCKS) if (fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
wl1271_ps_link_start(wl, hlid, true); wl1271_ps_link_start(wl, hlid, true);
} }
u8 wl1271_tx_get_hlid(struct sk_buff *skb) static bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb)
{
return wl->dummy_packet == skb;
}
u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct sk_buff *skb)
{ {
struct ieee80211_tx_info *control = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *control = IEEE80211_SKB_CB(skb);
...@@ -144,14 +161,32 @@ u8 wl1271_tx_get_hlid(struct sk_buff *skb) ...@@ -144,14 +161,32 @@ u8 wl1271_tx_get_hlid(struct sk_buff *skb)
} else { } else {
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
if (!test_bit(WL1271_FLAG_AP_STARTED, &wl->flags))
return wl->system_hlid;
hdr = (struct ieee80211_hdr *)skb->data; hdr = (struct ieee80211_hdr *)skb->data;
if (ieee80211_is_mgmt(hdr->frame_control)) if (ieee80211_is_mgmt(hdr->frame_control))
return WL1271_AP_GLOBAL_HLID; return wl->ap_global_hlid;
else else
return WL1271_AP_BROADCAST_HLID; return wl->ap_bcast_hlid;
} }
} }
static u8 wl1271_tx_get_hlid(struct wl1271 *wl, struct sk_buff *skb)
{
if (wl12xx_is_dummy_packet(wl, skb))
return wl->system_hlid;
if (wl->bss_type == BSS_TYPE_AP_BSS)
return wl12xx_tx_get_hlid_ap(wl, skb);
if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags) ||
test_bit(WL1271_FLAG_IBSS_JOINED, &wl->flags))
return wl->sta_hlid;
else
return wl->dev_hlid;
}
static unsigned int wl12xx_calc_packet_alignment(struct wl1271 *wl, static unsigned int wl12xx_calc_packet_alignment(struct wl1271 *wl,
unsigned int packet_length) unsigned int packet_length)
{ {
...@@ -169,12 +204,9 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra, ...@@ -169,12 +204,9 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra,
u32 len; u32 len;
u32 total_blocks; u32 total_blocks;
int id, ret = -EBUSY, ac; int id, ret = -EBUSY, ac;
u32 spare_blocks;
if (unlikely(wl->quirks & WL12XX_QUIRK_USE_2_SPARE_BLOCKS)) /* we use 1 spare block */
spare_blocks = 2; u32 spare_blocks = 1;
else
spare_blocks = 1;
if (buf_offset + total_len > WL1271_AGGR_BUFFER_SIZE) if (buf_offset + total_len > WL1271_AGGR_BUFFER_SIZE)
return -EAGAIN; return -EAGAIN;
...@@ -206,12 +238,14 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra, ...@@ -206,12 +238,14 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra,
desc->id = id; desc->id = id;
wl->tx_blocks_available -= total_blocks; wl->tx_blocks_available -= total_blocks;
wl->tx_allocated_blocks += total_blocks;
ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb)); ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
wl->tx_allocated_blocks[ac] += total_blocks; wl->tx_allocated_pkts[ac]++;
if (wl->bss_type == BSS_TYPE_AP_BSS) if (wl->bss_type == BSS_TYPE_AP_BSS &&
wl->links[hlid].allocated_blks += total_blocks; hlid >= WL1271_AP_STA_HLID_START)
wl->links[hlid].allocated_pkts++;
ret = 0; ret = 0;
...@@ -225,11 +259,6 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra, ...@@ -225,11 +259,6 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct sk_buff *skb, u32 extra,
return ret; return ret;
} }
static bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb)
{
return wl->dummy_packet == skb;
}
static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb, static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb,
u32 extra, struct ieee80211_tx_info *control, u32 extra, struct ieee80211_tx_info *control,
u8 hlid) u8 hlid)
...@@ -280,9 +309,9 @@ static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb, ...@@ -280,9 +309,9 @@ static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb,
wl->session_counter << TX_HW_ATTR_OFST_SESSION_COUNTER; wl->session_counter << TX_HW_ATTR_OFST_SESSION_COUNTER;
} }
if (wl->bss_type != BSS_TYPE_AP_BSS) { desc->hlid = hlid;
desc->aid = hlid;
if (wl->bss_type != BSS_TYPE_AP_BSS) {
/* if the packets are destined for AP (have a STA entry) /* if the packets are destined for AP (have a STA entry)
send them with AP rate policies, otherwise use default send them with AP rate policies, otherwise use default
basic rates */ basic rates */
...@@ -291,18 +320,12 @@ static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb, ...@@ -291,18 +320,12 @@ static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct sk_buff *skb,
else else
rate_idx = ACX_TX_BASIC_RATE; rate_idx = ACX_TX_BASIC_RATE;
} else { } else {
desc->hlid = hlid; if (hlid == wl->ap_global_hlid)
switch (hlid) {
case WL1271_AP_GLOBAL_HLID:
rate_idx = ACX_TX_AP_MODE_MGMT_RATE; rate_idx = ACX_TX_AP_MODE_MGMT_RATE;
break; else if (hlid == wl->ap_bcast_hlid)
case WL1271_AP_BROADCAST_HLID:
rate_idx = ACX_TX_AP_MODE_BCST_RATE; rate_idx = ACX_TX_AP_MODE_BCST_RATE;
break; else
default:
rate_idx = ac; rate_idx = ac;
break;
}
} }
tx_attr |= rate_idx << TX_HW_ATTR_OFST_RATE_POLICY; tx_attr |= rate_idx << TX_HW_ATTR_OFST_RATE_POLICY;
...@@ -376,10 +399,11 @@ static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct sk_buff *skb, ...@@ -376,10 +399,11 @@ static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct sk_buff *skb,
} }
} }
if (wl->bss_type == BSS_TYPE_AP_BSS) hlid = wl1271_tx_get_hlid(wl, skb);
hlid = wl1271_tx_get_hlid(skb); if (hlid == WL12XX_INVALID_LINK_ID) {
else wl1271_error("invalid hlid. dropping skb 0x%p", skb);
hlid = TX_HW_DEFAULT_AID; return -EINVAL;
}
ret = wl1271_tx_allocate(wl, skb, extra, buf_offset, hlid); ret = wl1271_tx_allocate(wl, skb, extra, buf_offset, hlid);
if (ret < 0) if (ret < 0)
...@@ -462,19 +486,23 @@ void wl1271_handle_tx_low_watermark(struct wl1271 *wl) ...@@ -462,19 +486,23 @@ void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
static struct sk_buff_head *wl1271_select_queue(struct wl1271 *wl, static struct sk_buff_head *wl1271_select_queue(struct wl1271 *wl,
struct sk_buff_head *queues) struct sk_buff_head *queues)
{ {
int i, q = -1; int i, q = -1, ac;
u32 min_blks = 0xffffffff; u32 min_pkts = 0xffffffff;
/* /*
* Find a non-empty ac where: * Find a non-empty ac where:
* 1. There are packets to transmit * 1. There are packets to transmit
* 2. The FW has the least allocated blocks * 2. The FW has the least allocated blocks
*
* We prioritize the ACs according to VO>VI>BE>BK
*/ */
for (i = 0; i < NUM_TX_QUEUES; i++) for (i = 0; i < NUM_TX_QUEUES; i++) {
if (!skb_queue_empty(&queues[i]) && ac = wl1271_tx_get_queue(i);
(wl->tx_allocated_blocks[i] < min_blks)) { if (!skb_queue_empty(&queues[ac]) &&
q = i; (wl->tx_allocated_pkts[ac] < min_pkts)) {
min_blks = wl->tx_allocated_blocks[q]; q = ac;
min_pkts = wl->tx_allocated_pkts[q];
}
} }
if (q == -1) if (q == -1)
...@@ -579,7 +607,7 @@ static void wl1271_skb_queue_head(struct wl1271 *wl, struct sk_buff *skb) ...@@ -579,7 +607,7 @@ static void wl1271_skb_queue_head(struct wl1271 *wl, struct sk_buff *skb)
if (wl12xx_is_dummy_packet(wl, skb)) { if (wl12xx_is_dummy_packet(wl, skb)) {
set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags); set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
} else if (wl->bss_type == BSS_TYPE_AP_BSS) { } else if (wl->bss_type == BSS_TYPE_AP_BSS) {
u8 hlid = wl1271_tx_get_hlid(skb); u8 hlid = wl1271_tx_get_hlid(wl, skb);
skb_queue_head(&wl->links[hlid].tx_queue[q], skb); skb_queue_head(&wl->links[hlid].tx_queue[q], skb);
/* make sure we dequeue the same packet next time */ /* make sure we dequeue the same packet next time */
...@@ -826,10 +854,14 @@ void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid) ...@@ -826,10 +854,14 @@ void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
total[i] = 0; total[i] = 0;
while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) { while ((skb = skb_dequeue(&wl->links[hlid].tx_queue[i]))) {
wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb); wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
if (!wl12xx_is_dummy_packet(wl, skb)) {
info = IEEE80211_SKB_CB(skb); info = IEEE80211_SKB_CB(skb);
info->status.rates[0].idx = -1; info->status.rates[0].idx = -1;
info->status.rates[0].count = 0; info->status.rates[0].count = 0;
ieee80211_tx_status_ni(wl->hw, skb); ieee80211_tx_status_ni(wl->hw, skb);
}
total[i]++; total[i]++;
} }
} }
...@@ -853,8 +885,8 @@ void wl1271_tx_reset(struct wl1271 *wl, bool reset_tx_queues) ...@@ -853,8 +885,8 @@ void wl1271_tx_reset(struct wl1271 *wl, bool reset_tx_queues)
if (wl->bss_type == BSS_TYPE_AP_BSS) { if (wl->bss_type == BSS_TYPE_AP_BSS) {
for (i = 0; i < AP_MAX_LINKS; i++) { for (i = 0; i < AP_MAX_LINKS; i++) {
wl1271_tx_reset_link_queues(wl, i); wl1271_tx_reset_link_queues(wl, i);
wl->links[i].allocated_blks = 0; wl->links[i].allocated_pkts = 0;
wl->links[i].prev_freed_blks = 0; wl->links[i].prev_freed_pkts = 0;
} }
wl->last_tx_hlid = 0; wl->last_tx_hlid = 0;
......
...@@ -29,9 +29,6 @@ ...@@ -29,9 +29,6 @@
#define TX_HW_MGMT_PKT_LIFETIME_TU 2000 #define TX_HW_MGMT_PKT_LIFETIME_TU 2000
#define TX_HW_AP_MODE_PKT_LIFETIME_TU 8000 #define TX_HW_AP_MODE_PKT_LIFETIME_TU 8000
/* The chipset reference driver states, that the "aid" value 1
* is for infra-BSS, but is still always used */
#define TX_HW_DEFAULT_AID 1
#define TX_HW_ATTR_SAVE_RETRIES BIT(0) #define TX_HW_ATTR_SAVE_RETRIES BIT(0)
#define TX_HW_ATTR_HEADER_PAD BIT(1) #define TX_HW_ATTR_HEADER_PAD BIT(1)
...@@ -116,12 +113,8 @@ struct wl1271_tx_hw_descr { ...@@ -116,12 +113,8 @@ struct wl1271_tx_hw_descr {
u8 id; u8 id;
/* The packet TID value (as User-Priority) */ /* The packet TID value (as User-Priority) */
u8 tid; u8 tid;
union { /* host link ID (HLID) */
/* STA - Identifier of the remote STA in IBSS, 1 in infra-BSS */
u8 aid;
/* AP - host link ID (HLID) */
u8 hlid; u8 hlid;
} __packed;
u8 reserved; u8 reserved;
} __packed; } __packed;
...@@ -133,7 +126,8 @@ enum wl1271_tx_hw_res_status { ...@@ -133,7 +126,8 @@ enum wl1271_tx_hw_res_status {
TX_TIMEOUT = 4, TX_TIMEOUT = 4,
TX_KEY_NOT_FOUND = 5, TX_KEY_NOT_FOUND = 5,
TX_PEER_NOT_FOUND = 6, TX_PEER_NOT_FOUND = 6,
TX_SESSION_MISMATCH = 7 TX_SESSION_MISMATCH = 7,
TX_LINK_NOT_VALID = 8,
}; };
struct wl1271_tx_hw_res_descr { struct wl1271_tx_hw_res_descr {
...@@ -216,7 +210,7 @@ void wl1271_tx_flush(struct wl1271 *wl); ...@@ -216,7 +210,7 @@ void wl1271_tx_flush(struct wl1271 *wl);
u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band); u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band);
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set); u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set);
u32 wl1271_tx_min_rate_get(struct wl1271 *wl); u32 wl1271_tx_min_rate_get(struct wl1271 *wl);
u8 wl1271_tx_get_hlid(struct sk_buff *skb); u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct sk_buff *skb);
void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid); void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid);
void wl1271_handle_tx_low_watermark(struct wl1271 *wl); void wl1271_handle_tx_low_watermark(struct wl1271 *wl);
......
...@@ -112,28 +112,8 @@ extern u32 wl12xx_debug_level; ...@@ -112,28 +112,8 @@ extern u32 wl12xx_debug_level;
true); \ true); \
} while (0) } while (0)
#define WL1271_DEFAULT_STA_RX_CONFIG (CFG_UNI_FILTER_EN | \ #define WL127X_FW_NAME "ti-connectivity/wl127x-fw-3.bin"
CFG_BSSID_FILTER_EN | \ #define WL128X_FW_NAME "ti-connectivity/wl128x-fw-3.bin"
CFG_MC_FILTER_EN)
#define WL1271_DEFAULT_STA_RX_FILTER (CFG_RX_RCTS_ACK | CFG_RX_PRSP_EN | \
CFG_RX_MGMT_EN | CFG_RX_DATA_EN | \
CFG_RX_CTL_EN | CFG_RX_BCN_EN | \
CFG_RX_AUTH_EN | CFG_RX_ASSOC_EN)
#define WL1271_DEFAULT_AP_RX_CONFIG 0
#define WL1271_DEFAULT_AP_RX_FILTER (CFG_RX_RCTS_ACK | CFG_RX_PREQ_EN | \
CFG_RX_MGMT_EN | CFG_RX_DATA_EN | \
CFG_RX_CTL_EN | CFG_RX_AUTH_EN | \
CFG_RX_ASSOC_EN)
#define WL1271_FW_NAME "ti-connectivity/wl1271-fw-2.bin"
#define WL128X_FW_NAME "ti-connectivity/wl128x-fw.bin"
#define WL127X_AP_FW_NAME "ti-connectivity/wl1271-fw-ap.bin"
#define WL128X_AP_FW_NAME "ti-connectivity/wl128x-fw-ap.bin"
/* /*
* wl127x and wl128x are using the same NVS file name. However, the * wl127x and wl128x are using the same NVS file name. However, the
...@@ -157,25 +137,34 @@ extern u32 wl12xx_debug_level; ...@@ -157,25 +137,34 @@ extern u32 wl12xx_debug_level;
#define WL1271_DEFAULT_BEACON_INT 100 #define WL1271_DEFAULT_BEACON_INT 100
#define WL1271_DEFAULT_DTIM_PERIOD 1 #define WL1271_DEFAULT_DTIM_PERIOD 1
#define WL1271_AP_GLOBAL_HLID 0 #define WL12XX_MAX_ROLES 4
#define WL1271_AP_BROADCAST_HLID 1 #define WL12XX_MAX_LINKS 8
#define WL1271_AP_STA_HLID_START 2 #define WL12XX_INVALID_ROLE_ID 0xff
#define WL12XX_INVALID_LINK_ID 0xff
/* Defined by FW as 0. Will not be freed or allocated. */
#define WL12XX_SYSTEM_HLID 0
/*
* TODO: we currently don't support multirole. remove
* this constant from the code when we do.
*/
#define WL1271_AP_STA_HLID_START 3
/* /*
* When in AP-mode, we allow (at least) this number of mem-blocks * When in AP-mode, we allow (at least) this number of packets
* to be transmitted to FW for a STA in PS-mode. Only when packets are * to be transmitted to FW for a STA in PS-mode. Only when packets are
* present in the FW buffers it will wake the sleeping STA. We want to put * present in the FW buffers it will wake the sleeping STA. We want to put
* enough packets for the driver to transmit all of its buffered data before * enough packets for the driver to transmit all of its buffered data before
* the STA goes to sleep again. But we don't want to take too much mem-blocks * the STA goes to sleep again. But we don't want to take too much memory
* as it might hurt the throughput of active STAs. * as it might hurt the throughput of active STAs.
* The number of blocks (18) is enough for 2 large packets.
*/ */
#define WL1271_PS_STA_MAX_BLOCKS (2 * 9) #define WL1271_PS_STA_MAX_PACKETS 2
#define WL1271_AP_BSS_INDEX 0 #define WL1271_AP_BSS_INDEX 0
#define WL1271_AP_DEF_BEACON_EXP 20 #define WL1271_AP_DEF_BEACON_EXP 20
#define ACX_TX_DESCRIPTORS 32 #define ACX_TX_DESCRIPTORS 16
#define WL1271_AGGR_BUFFER_SIZE (4 * PAGE_SIZE) #define WL1271_AGGR_BUFFER_SIZE (4 * PAGE_SIZE)
...@@ -247,26 +236,22 @@ struct wl1271_stats { ...@@ -247,26 +236,22 @@ struct wl1271_stats {
#define AP_MAX_STATIONS 5 #define AP_MAX_STATIONS 5
/* Broadcast and Global links + links to stations */ /* Broadcast and Global links + system link + links to stations */
#define AP_MAX_LINKS (AP_MAX_STATIONS + 2) /*
* TODO: when WL1271_AP_STA_HLID_START is no longer constant, change all
* the places that use this.
*/
#define AP_MAX_LINKS (AP_MAX_STATIONS + 3)
/* FW status registers common for AP/STA */ /* FW status registers */
struct wl1271_fw_common_status { struct wl12xx_fw_status {
__le32 intr; __le32 intr;
u8 fw_rx_counter; u8 fw_rx_counter;
u8 drv_rx_counter; u8 drv_rx_counter;
u8 reserved; u8 reserved;
u8 tx_results_counter; u8 tx_results_counter;
__le32 rx_pkt_descs[NUM_RX_PKT_DESC]; __le32 rx_pkt_descs[NUM_RX_PKT_DESC];
__le32 tx_released_blks[NUM_TX_QUEUES];
__le32 fw_localtime; __le32 fw_localtime;
} __packed;
/* FW status registers for AP */
struct wl1271_fw_ap_status {
struct wl1271_fw_common_status common;
/* Next fields valid only in AP FW */
/* /*
* A bitmap (where each bit represents a single HLID) * A bitmap (where each bit represents a single HLID)
...@@ -274,29 +259,29 @@ struct wl1271_fw_ap_status { ...@@ -274,29 +259,29 @@ struct wl1271_fw_ap_status {
*/ */
__le32 link_ps_bitmap; __le32 link_ps_bitmap;
/* Number of freed MBs per HLID */ /*
u8 tx_lnk_free_blks[AP_MAX_LINKS]; * A bitmap (where each bit represents a single HLID) to indicate
u8 padding_1[1]; * if the station is in Fast mode
} __packed; */
__le32 link_fast_bitmap;
/* FW status registers for STA */ /* Cumulative counter of total released mem blocks since FW-reset */
struct wl1271_fw_sta_status { __le32 total_released_blks;
struct wl1271_fw_common_status common;
u8 tx_total; /* Size (in Memory Blocks) of TX pool */
u8 reserved1; __le32 tx_total;
__le16 reserved2;
__le32 log_start_addr;
} __packed;
struct wl1271_fw_full_status { /* Cumulative counter of released packets per AC */
union { u8 tx_released_pkts[NUM_TX_QUEUES];
struct wl1271_fw_common_status common;
struct wl1271_fw_sta_status sta; /* Cumulative counter of freed packets per HLID */
struct wl1271_fw_ap_status ap; u8 tx_lnk_free_pkts[WL12XX_MAX_LINKS];
};
} __packed;
/* Cumulative counter of released Voice memory blocks */
u8 tx_voice_released_blks;
u8 padding_1[7];
__le32 log_start_addr;
} __packed;
struct wl1271_rx_mem_pool_addr { struct wl1271_rx_mem_pool_addr {
u32 addr; u32 addr;
...@@ -342,7 +327,7 @@ struct wl1271_ap_key { ...@@ -342,7 +327,7 @@ struct wl1271_ap_key {
enum wl12xx_flags { enum wl12xx_flags {
WL1271_FLAG_STA_ASSOCIATED, WL1271_FLAG_STA_ASSOCIATED,
WL1271_FLAG_JOINED, WL1271_FLAG_IBSS_JOINED,
WL1271_FLAG_GPIO_POWER, WL1271_FLAG_GPIO_POWER,
WL1271_FLAG_TX_QUEUE_STOPPED, WL1271_FLAG_TX_QUEUE_STOPPED,
WL1271_FLAG_TX_PENDING, WL1271_FLAG_TX_PENDING,
...@@ -369,11 +354,14 @@ struct wl1271_link { ...@@ -369,11 +354,14 @@ struct wl1271_link {
/* AP-mode - TX queue per AC in link */ /* AP-mode - TX queue per AC in link */
struct sk_buff_head tx_queue[NUM_TX_QUEUES]; struct sk_buff_head tx_queue[NUM_TX_QUEUES];
/* accounting for allocated / available TX blocks in FW */ /* accounting for allocated / freed packets in FW */
u8 allocated_blks; u8 allocated_pkts;
u8 prev_freed_blks; u8 prev_freed_pkts;
u8 addr[ETH_ALEN]; u8 addr[ETH_ALEN];
/* bitmap of TIDs where RX BA sessions are active for this link */
u8 ba_bitmap;
}; };
struct wl1271 { struct wl1271 {
...@@ -405,7 +393,6 @@ struct wl1271 { ...@@ -405,7 +393,6 @@ struct wl1271 {
u8 *fw; u8 *fw;
size_t fw_len; size_t fw_len;
u8 fw_bss_type;
void *nvs; void *nvs;
size_t nvs_len; size_t nvs_len;
...@@ -418,15 +405,30 @@ struct wl1271 { ...@@ -418,15 +405,30 @@ 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 dev_role_id;
u8 system_hlid;
u8 sta_hlid;
u8 dev_hlid;
u8 ap_global_hlid;
u8 ap_bcast_hlid;
unsigned long links_map[BITS_TO_LONGS(WL12XX_MAX_LINKS)];
unsigned long roles_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];
unsigned long roc_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];
struct wl1271_acx_mem_map *target_mem_map; struct wl1271_acx_mem_map *target_mem_map;
/* Accounting for allocated / available TX blocks on HW */ /* Accounting for allocated / available TX blocks on HW */
u32 tx_blocks_freed[NUM_TX_QUEUES]; u32 tx_blocks_freed;
u32 tx_blocks_available; u32 tx_blocks_available;
u32 tx_allocated_blocks[NUM_TX_QUEUES]; u32 tx_allocated_blocks;
u32 tx_results_count; u32 tx_results_count;
/* Accounting for allocated / available Tx packets in HW */
u32 tx_pkts_freed[NUM_TX_QUEUES];
u32 tx_allocated_pkts[NUM_TX_QUEUES];
/* Transmitted TX packets counter for chipset interface */ /* Transmitted TX packets counter for chipset interface */
u32 tx_packets_count; u32 tx_packets_count;
...@@ -535,10 +537,6 @@ struct wl1271 { ...@@ -535,10 +537,6 @@ struct wl1271 {
struct work_struct rx_streaming_disable_work; struct work_struct rx_streaming_disable_work;
struct timer_list rx_streaming_timer; struct timer_list rx_streaming_timer;
unsigned int filters;
unsigned int rx_config;
unsigned int rx_filter;
struct completion *elp_compl; struct completion *elp_compl;
struct completion *ps_compl; struct completion *ps_compl;
struct delayed_work elp_work; struct delayed_work elp_work;
...@@ -562,7 +560,7 @@ struct wl1271 { ...@@ -562,7 +560,7 @@ struct wl1271 {
u32 buffer_cmd; u32 buffer_cmd;
u32 buffer_busyword[WL1271_BUSY_WORD_CNT]; u32 buffer_busyword[WL1271_BUSY_WORD_CNT];
struct wl1271_fw_full_status *fw_status; struct wl12xx_fw_status *fw_status;
struct wl1271_tx_hw_res_if *tx_res_if; struct wl1271_tx_hw_res_if *tx_res_if;
struct ieee80211_vif *vif; struct ieee80211_vif *vif;
...@@ -622,6 +620,9 @@ struct wl1271 { ...@@ -622,6 +620,9 @@ struct wl1271 {
/* Platform limitations */ /* Platform limitations */
unsigned int platform_quirks; unsigned int platform_quirks;
/* number of currently active RX BA sessions */
int ba_rx_session_count;
}; };
struct wl1271_station { struct wl1271_station {
...@@ -659,12 +660,6 @@ size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen); ...@@ -659,12 +660,6 @@ size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen);
/* Each RX/TX transaction requires an end-of-transaction transfer */ /* Each RX/TX transaction requires an end-of-transaction transfer */
#define WL12XX_QUIRK_END_OF_TRANSACTION BIT(0) #define WL12XX_QUIRK_END_OF_TRANSACTION BIT(0)
/*
* Older firmwares use 2 spare TX blocks
* (for STA < 6.1.3.50.58 or for AP < 6.2.0.0.47)
*/
#define WL12XX_QUIRK_USE_2_SPARE_BLOCKS BIT(1)
/* WL128X requires aggregated packets to be aligned to the SDIO block size */ /* WL128X requires aggregated packets to be aligned to the SDIO block size */
#define WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT BIT(2) #define WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT BIT(2)
......
...@@ -105,18 +105,6 @@ struct wl12xx_ie_country { ...@@ -105,18 +105,6 @@ struct wl12xx_ie_country {
/* Templates */ /* Templates */
struct wl12xx_beacon_template {
struct ieee80211_header header;
__le32 time_stamp[2];
__le16 beacon_interval;
__le16 capability;
struct wl12xx_ie_ssid ssid;
struct wl12xx_ie_rates rates;
struct wl12xx_ie_rates ext_rates;
struct wl12xx_ie_ds_params ds_params;
struct wl12xx_ie_country country;
} __packed;
struct wl12xx_null_data_template { struct wl12xx_null_data_template {
struct ieee80211_header header; struct ieee80211_header header;
} __packed; } __packed;
...@@ -146,19 +134,6 @@ struct wl12xx_arp_rsp_template { ...@@ -146,19 +134,6 @@ struct wl12xx_arp_rsp_template {
__be32 target_ip; __be32 target_ip;
} __packed; } __packed;
struct wl12xx_probe_resp_template {
struct ieee80211_header header;
__le32 time_stamp[2];
__le16 beacon_interval;
__le16 capability;
struct wl12xx_ie_ssid ssid;
struct wl12xx_ie_rates rates;
struct wl12xx_ie_rates ext_rates;
struct wl12xx_ie_ds_params ds_params;
struct wl12xx_ie_country country;
} __packed;
struct wl12xx_disconn_template { struct wl12xx_disconn_template {
struct ieee80211_header header; struct ieee80211_header header;
__le16 disconn_reason; __le16 disconn_reason;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册