Commit 79b223f4 authored by Arik Nemtsov's avatar Arik Nemtsov Committed by Luciano Coelho

wl12xx: AP mode - AP specific CMD_CONFIGURE sub-commands

Add AP max retries and rate policy configuration.
Rename STA rate policy configuration function.
Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Reviewed-by: default avatarLuciano Coelho <coelho@ti.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent 1e05a818
...@@ -751,9 +751,9 @@ int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats) ...@@ -751,9 +751,9 @@ int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats)
return 0; return 0;
} }
int wl1271_acx_rate_policies(struct wl1271 *wl) int wl1271_acx_sta_rate_policies(struct wl1271 *wl)
{ {
struct acx_rate_policy *acx; struct acx_sta_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 idx = 0;
int ret = 0; int ret = 0;
...@@ -794,6 +794,38 @@ int wl1271_acx_rate_policies(struct wl1271 *wl) ...@@ -794,6 +794,38 @@ int wl1271_acx_rate_policies(struct wl1271 *wl)
return ret; return ret;
} }
int wl1271_acx_ap_rate_policy(struct wl1271 *wl, struct conf_tx_rate_class *c,
u8 idx)
{
struct acx_ap_rate_policy *acx;
int ret = 0;
wl1271_debug(DEBUG_ACX, "acx ap rate policy");
acx = kzalloc(sizeof(*acx), GFP_KERNEL);
if (!acx) {
ret = -ENOMEM;
goto out;
}
acx->rate_policy.enabled_rates = cpu_to_le32(c->enabled_rates);
acx->rate_policy.short_retry_limit = c->short_retry_limit;
acx->rate_policy.long_retry_limit = c->long_retry_limit;
acx->rate_policy.aflags = c->aflags;
acx->rate_policy_idx = idx;
ret = wl1271_cmd_configure(wl, ACX_RATE_POLICY, acx, sizeof(*acx));
if (ret < 0) {
wl1271_warning("Setting of ap rate policy failed: %d", ret);
goto out;
}
out:
kfree(acx);
return ret;
}
int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max,
u8 aifsn, u16 txop) u8 aifsn, u16 txop)
{ {
...@@ -1335,3 +1367,27 @@ int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime) ...@@ -1335,3 +1367,27 @@ int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime)
kfree(tsf_info); kfree(tsf_info);
return ret; return ret;
} }
int wl1271_acx_max_tx_retry(struct wl1271 *wl)
{
struct wl1271_acx_max_tx_retry *acx = NULL;
int ret;
wl1271_debug(DEBUG_ACX, "acx max tx retry");
acx = kzalloc(sizeof(*acx), GFP_KERNEL);
if (!acx)
return -ENOMEM;
acx->max_tx_retry = cpu_to_le16(wl->conf.tx.ap_max_tx_retries);
ret = wl1271_cmd_configure(wl, ACX_MAX_TX_FAILURE, acx, sizeof(*acx));
if (ret < 0) {
wl1271_warning("acx max tx retry failed: %d", ret);
goto out;
}
out:
kfree(acx);
return ret;
}
...@@ -747,13 +747,23 @@ struct acx_rate_class { ...@@ -747,13 +747,23 @@ struct acx_rate_class {
#define ACX_TX_BASIC_RATE 0 #define ACX_TX_BASIC_RATE 0
#define ACX_TX_AP_FULL_RATE 1 #define ACX_TX_AP_FULL_RATE 1
#define ACX_TX_RATE_POLICY_CNT 2 #define ACX_TX_RATE_POLICY_CNT 2
struct acx_rate_policy { struct acx_sta_rate_policy {
struct acx_header header; struct acx_header header;
__le32 rate_class_cnt; __le32 rate_class_cnt;
struct acx_rate_class rate_class[CONF_TX_MAX_RATE_CLASSES]; struct acx_rate_class rate_class[CONF_TX_MAX_RATE_CLASSES];
} __packed; } __packed;
#define ACX_TX_AP_MODE_MGMT_RATE 4
#define ACX_TX_AP_MODE_BCST_RATE 5
struct acx_ap_rate_policy {
struct acx_header header;
__le32 rate_policy_idx;
struct acx_rate_class rate_policy;
} __packed;
struct acx_ac_cfg { struct acx_ac_cfg {
struct acx_header header; struct acx_header header;
u8 ac; u8 ac;
...@@ -1062,6 +1072,17 @@ struct wl1271_acx_fw_tsf_information { ...@@ -1062,6 +1072,17 @@ struct wl1271_acx_fw_tsf_information {
u8 padding[3]; u8 padding[3];
} __packed; } __packed;
struct wl1271_acx_max_tx_retry {
struct acx_header header;
/*
* the number of frames transmission failures before
* issuing the aging event.
*/
__le16 max_tx_retry;
u8 padding_1[2];
} __packed;
enum { enum {
ACX_WAKE_UP_CONDITIONS = 0x0002, ACX_WAKE_UP_CONDITIONS = 0x0002,
ACX_MEM_CFG = 0x0003, ACX_MEM_CFG = 0x0003,
...@@ -1119,6 +1140,7 @@ enum { ...@@ -1119,6 +1140,7 @@ enum {
ACX_HT_BSS_OPERATION = 0x0058, ACX_HT_BSS_OPERATION = 0x0058,
ACX_COEX_ACTIVITY = 0x0059, ACX_COEX_ACTIVITY = 0x0059,
ACX_SET_DCO_ITRIM_PARAMS = 0x0061, ACX_SET_DCO_ITRIM_PARAMS = 0x0061,
ACX_MAX_TX_FAILURE = 0x0072,
DOT11_RX_MSDU_LIFE_TIME = 0x1004, DOT11_RX_MSDU_LIFE_TIME = 0x1004,
DOT11_CUR_TX_PWR = 0x100D, DOT11_CUR_TX_PWR = 0x100D,
DOT11_RX_DOT11_MODE = 0x1012, DOT11_RX_DOT11_MODE = 0x1012,
...@@ -1160,7 +1182,9 @@ int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble); ...@@ -1160,7 +1182,9 @@ int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble);
int wl1271_acx_cts_protect(struct wl1271 *wl, int wl1271_acx_cts_protect(struct wl1271 *wl,
enum acx_ctsprotect_type ctsprotect); enum acx_ctsprotect_type ctsprotect);
int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats); int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats);
int wl1271_acx_rate_policies(struct wl1271 *wl); int wl1271_acx_sta_rate_policies(struct wl1271 *wl);
int wl1271_acx_ap_rate_policy(struct wl1271 *wl, struct conf_tx_rate_class *c,
u8 idx);
int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max,
u8 aifsn, u16 txop); u8 aifsn, u16 txop);
int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type,
...@@ -1186,5 +1210,6 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl, ...@@ -1186,5 +1210,6 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl,
int wl1271_acx_set_ht_information(struct wl1271 *wl, int wl1271_acx_set_ht_information(struct wl1271 *wl,
u16 ht_operation_mode); u16 ht_operation_mode);
int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime); int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime);
int wl1271_acx_max_tx_retry(struct wl1271 *wl);
#endif /* __WL1271_ACX_H__ */ #endif /* __WL1271_ACX_H__ */
...@@ -682,6 +682,12 @@ struct conf_tx_settings { ...@@ -682,6 +682,12 @@ struct conf_tx_settings {
*/ */
struct conf_tx_rate_class ap_bcst_conf; struct conf_tx_rate_class ap_bcst_conf;
/*
* AP-mode - allow this number of TX retries to a station before an
* event is triggered from FW.
*/
u16 ap_max_tx_retries;
/* /*
* Configuration for TID parameters. * Configuration for TID parameters.
*/ */
......
...@@ -322,7 +322,7 @@ int wl1271_hw_init(struct wl1271 *wl) ...@@ -322,7 +322,7 @@ int wl1271_hw_init(struct wl1271 *wl)
} }
/* Configure TX rate classes */ /* Configure TX rate classes */
ret = wl1271_acx_rate_policies(wl); ret = wl1271_acx_sta_rate_policies(wl);
if (ret < 0) if (ret < 0)
goto out_free_memmap; goto out_free_memmap;
......
...@@ -191,7 +191,7 @@ static struct conf_drv_settings default_conf = { ...@@ -191,7 +191,7 @@ static struct conf_drv_settings default_conf = {
.long_retry_limit = 10, .long_retry_limit = 10,
.aflags = 0, .aflags = 0,
}, },
.ap_max_tx_retries = 100,
.tid_conf_count = 4, .tid_conf_count = 4,
.tid_conf = { .tid_conf = {
[CONF_TX_AC_BE] = { [CONF_TX_AC_BE] = {
...@@ -1393,7 +1393,7 @@ static int wl1271_handle_idle(struct wl1271 *wl, bool idle) ...@@ -1393,7 +1393,7 @@ static int wl1271_handle_idle(struct wl1271 *wl, bool idle)
} }
wl->rate_set = wl1271_min_rate_get(wl); wl->rate_set = wl1271_min_rate_get(wl);
wl->sta_rate_set = 0; wl->sta_rate_set = 0;
ret = wl1271_acx_rate_policies(wl); ret = wl1271_acx_sta_rate_policies(wl);
if (ret < 0) if (ret < 0)
goto out; goto out;
ret = wl1271_acx_keep_alive_config( ret = wl1271_acx_keep_alive_config(
...@@ -1468,7 +1468,7 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed) ...@@ -1468,7 +1468,7 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
wl1271_set_band_rate(wl); wl1271_set_band_rate(wl);
wl->basic_rate = wl1271_min_rate_get(wl); wl->basic_rate = wl1271_min_rate_get(wl);
ret = wl1271_acx_rate_policies(wl); ret = wl1271_acx_sta_rate_policies(wl);
if (ret < 0) if (ret < 0)
wl1271_warning("rate policy for update channel " wl1271_warning("rate policy for update channel "
"failed %d", ret); "failed %d", ret);
...@@ -2017,7 +2017,7 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw, ...@@ -2017,7 +2017,7 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
wl->basic_rate_set = wl1271_tx_enabled_rates_get(wl, wl->basic_rate_set = wl1271_tx_enabled_rates_get(wl,
rates); rates);
wl->basic_rate = wl1271_min_rate_get(wl); wl->basic_rate = wl1271_min_rate_get(wl);
ret = wl1271_acx_rate_policies(wl); ret = wl1271_acx_sta_rate_policies(wl);
if (ret < 0) if (ret < 0)
goto out_sleep; goto out_sleep;
...@@ -2071,7 +2071,7 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw, ...@@ -2071,7 +2071,7 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
/* revert back to minimum rates for the current band */ /* revert back to minimum rates for the current band */
wl1271_set_band_rate(wl); wl1271_set_band_rate(wl);
wl->basic_rate = wl1271_min_rate_get(wl); wl->basic_rate = wl1271_min_rate_get(wl);
ret = wl1271_acx_rate_policies(wl); ret = wl1271_acx_sta_rate_policies(wl);
if (ret < 0) if (ret < 0)
goto out_sleep; goto out_sleep;
......
...@@ -303,7 +303,7 @@ void wl1271_tx_work_locked(struct wl1271 *wl) ...@@ -303,7 +303,7 @@ void wl1271_tx_work_locked(struct wl1271 *wl)
woken_up = true; woken_up = true;
wl->rate_set = wl1271_tx_enabled_rates_get(wl, sta_rates); wl->rate_set = wl1271_tx_enabled_rates_get(wl, sta_rates);
wl1271_acx_rate_policies(wl); wl1271_acx_sta_rate_policies(wl);
} }
while ((skb = wl1271_skb_dequeue(wl))) { while ((skb = wl1271_skb_dequeue(wl))) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment