Commit 68d069c4 authored by Arik Nemtsov's avatar Arik Nemtsov Committed by Luciano Coelho

wl1271: add support for HW TX fragmentation

Indicate to mac80211 we support HW fragmentation.
Support updates of the fragmentation threshold via the
set_frag_threshold callback.
Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
parent fa97f46b
...@@ -862,7 +862,7 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, ...@@ -862,7 +862,7 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type,
return ret; return ret;
} }
int wl1271_acx_frag_threshold(struct wl1271 *wl) int wl1271_acx_frag_threshold(struct wl1271 *wl, u16 frag_threshold)
{ {
struct acx_frag_threshold *acx; struct acx_frag_threshold *acx;
int ret = 0; int ret = 0;
...@@ -876,7 +876,7 @@ int wl1271_acx_frag_threshold(struct wl1271 *wl) ...@@ -876,7 +876,7 @@ int wl1271_acx_frag_threshold(struct wl1271 *wl)
goto out; goto out;
} }
acx->frag_threshold = cpu_to_le16(wl->conf.tx.frag_threshold); acx->frag_threshold = cpu_to_le16(frag_threshold);
ret = wl1271_cmd_configure(wl, ACX_FRAG_CFG, acx, sizeof(*acx)); ret = wl1271_cmd_configure(wl, ACX_FRAG_CFG, acx, sizeof(*acx));
if (ret < 0) { if (ret < 0) {
wl1271_warning("Setting of frag threshold failed: %d", ret); wl1271_warning("Setting of frag threshold failed: %d", ret);
......
...@@ -1161,7 +1161,7 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, ...@@ -1161,7 +1161,7 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max,
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,
u8 tsid, u8 ps_scheme, u8 ack_policy, u8 tsid, u8 ps_scheme, u8 ack_policy,
u32 apsd_conf0, u32 apsd_conf1); u32 apsd_conf0, u32 apsd_conf1);
int wl1271_acx_frag_threshold(struct wl1271 *wl); int wl1271_acx_frag_threshold(struct wl1271 *wl, u16 frag_threshold);
int wl1271_acx_tx_config_options(struct wl1271 *wl); int wl1271_acx_tx_config_options(struct wl1271 *wl);
int wl1271_acx_mem_cfg(struct wl1271 *wl); int wl1271_acx_mem_cfg(struct wl1271 *wl);
int wl1271_acx_init_mem_config(struct wl1271 *wl); int wl1271_acx_init_mem_config(struct wl1271 *wl);
......
...@@ -290,7 +290,7 @@ int wl1271_hw_init(struct wl1271 *wl) ...@@ -290,7 +290,7 @@ int wl1271_hw_init(struct wl1271 *wl)
goto out_free_memmap; goto out_free_memmap;
/* Default fragmentation threshold */ /* Default fragmentation threshold */
ret = wl1271_acx_frag_threshold(wl); ret = wl1271_acx_frag_threshold(wl, wl->conf.tx.frag_threshold);
if (ret < 0) if (ret < 0)
goto out_free_memmap; goto out_free_memmap;
......
...@@ -425,7 +425,7 @@ static int wl1271_plt_init(struct wl1271 *wl) ...@@ -425,7 +425,7 @@ static int wl1271_plt_init(struct wl1271 *wl)
goto out_free_memmap; goto out_free_memmap;
/* Default fragmentation threshold */ /* Default fragmentation threshold */
ret = wl1271_acx_frag_threshold(wl); ret = wl1271_acx_frag_threshold(wl, wl->conf.tx.frag_threshold);
if (ret < 0) if (ret < 0)
goto out_free_memmap; goto out_free_memmap;
...@@ -1745,6 +1745,34 @@ static int wl1271_op_hw_scan(struct ieee80211_hw *hw, ...@@ -1745,6 +1745,34 @@ static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
return ret; return ret;
} }
static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
{
struct wl1271 *wl = hw->priv;
int ret = 0;
mutex_lock(&wl->mutex);
if (unlikely(wl->state == WL1271_STATE_OFF)) {
ret = -EAGAIN;
goto out;
}
ret = wl1271_ps_elp_wakeup(wl, false);
if (ret < 0)
goto out;
ret = wl1271_acx_frag_threshold(wl, (u16)value);
if (ret < 0)
wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
wl1271_ps_elp_sleep(wl);
out:
mutex_unlock(&wl->mutex);
return ret;
}
static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value) static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
{ {
struct wl1271 *wl = hw->priv; struct wl1271 *wl = hw->priv;
...@@ -2421,6 +2449,7 @@ static const struct ieee80211_ops wl1271_ops = { ...@@ -2421,6 +2449,7 @@ static const struct ieee80211_ops wl1271_ops = {
.set_key = wl1271_op_set_key, .set_key = wl1271_op_set_key,
.hw_scan = wl1271_op_hw_scan, .hw_scan = wl1271_op_hw_scan,
.bss_info_changed = wl1271_op_bss_info_changed, .bss_info_changed = wl1271_op_bss_info_changed,
.set_frag_threshold = wl1271_op_set_frag_threshold,
.set_rts_threshold = wl1271_op_set_rts_threshold, .set_rts_threshold = wl1271_op_set_rts_threshold,
.conf_tx = wl1271_op_conf_tx, .conf_tx = wl1271_op_conf_tx,
.get_tsf = wl1271_op_get_tsf, .get_tsf = wl1271_op_get_tsf,
......
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