wlcore: add ability to reduce FW interrupts during suspend

Add the ability to mask FW interrupts on RX BA activity, PSM
entry/exit and fast-link notifications. This is used when the host
is suspended in order to decrease redundant wake ups.

Signed-off-by: Ram Amrani <ramrani@ti.com>
Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
Ram Amrani
2014-12-29 08:24:04 +02:00
gecommit door Kalle Valo
bovenliggende 7d3b29e5c8
commit 6d5a748d48
8 gewijzigde bestanden met toevoegingen van 155 en 25 verwijderingen

Bestand weergeven

@@ -194,3 +194,59 @@ out:
kfree(acx);
return ret;
}
/*
* When the host is suspended, we don't want to get any fast-link/PSM
* notifications
*/
int wl18xx_acx_interrupt_notify_config(struct wl1271 *wl,
bool action)
{
struct wl18xx_acx_interrupt_notify *acx;
int ret = 0;
acx = kzalloc(sizeof(*acx), GFP_KERNEL);
if (!acx) {
ret = -ENOMEM;
goto out;
}
acx->enable = action;
ret = wl1271_cmd_configure(wl, ACX_INTERRUPT_NOTIFY, acx, sizeof(*acx));
if (ret < 0) {
wl1271_warning("acx interrupt notify setting failed: %d", ret);
goto out;
}
out:
kfree(acx);
return ret;
}
/*
* When the host is suspended, we can configure the FW to disable RX BA
* notifications.
*/
int wl18xx_acx_rx_ba_filter(struct wl1271 *wl, bool action)
{
struct wl18xx_acx_rx_ba_filter *acx;
int ret = 0;
acx = kzalloc(sizeof(*acx), GFP_KERNEL);
if (!acx) {
ret = -ENOMEM;
goto out;
}
acx->enable = (u32)action;
ret = wl1271_cmd_configure(wl, ACX_RX_BA_FILTER, acx, sizeof(*acx));
if (ret < 0) {
wl1271_warning("acx rx ba activity filter setting failed: %d",
ret);
goto out;
}
out:
kfree(acx);
return ret;
}

Bestand weergeven

@@ -32,7 +32,10 @@ enum {
ACX_SIM_CONFIG = 0x0053,
ACX_CLEAR_STATISTICS = 0x0054,
ACX_AUTO_RX_STREAMING = 0x0055,
ACX_PEER_CAP = 0x0056
ACX_PEER_CAP = 0x0056,
ACX_INTERRUPT_NOTIFY = 0x0057,
ACX_RX_BA_FILTER = 0x0058
};
/* numbers of bits the length field takes (add 1 for the actual number) */
@@ -326,6 +329,24 @@ struct wlcore_acx_peer_cap {
u8 padding;
} __packed;
/*
* ACX_INTERRUPT_NOTIFY
* enable/disable fast-link/PSM notification from FW
*/
struct wl18xx_acx_interrupt_notify {
struct acx_header header;
u32 enable;
};
/*
* ACX_RX_BA_FILTER
* enable/disable RX BA filtering in FW
*/
struct wl18xx_acx_rx_ba_filter {
struct acx_header header;
u32 enable;
};
int wl18xx_acx_host_if_cfg_bitmap(struct wl1271 *wl, u32 host_cfg_bitmap,
u32 sdio_blk_size, u32 extra_mem_blks,
u32 len_field_size);
@@ -336,5 +357,7 @@ int wl18xx_acx_set_peer_cap(struct wl1271 *wl,
struct ieee80211_sta_ht_cap *ht_cap,
bool allow_ht_operation,
u32 rate_set, u8 hlid);
int wl18xx_acx_interrupt_notify_config(struct wl1271 *wl, bool action);
int wl18xx_acx_rx_ba_filter(struct wl1271 *wl, bool action);
#endif /* __WL18XX_ACX_H__ */

Bestand weergeven

@@ -378,6 +378,7 @@ static struct wlcore_conf wl18xx_conf = {
.keep_alive_interval = 55000,
.max_listen_interval = 20,
.sta_sleep_auth = WL1271_PSM_ILLEGAL,
.suspend_rx_ba_activity = 0,
},
.itrim = {
.enable = false,
@@ -1693,6 +1694,8 @@ static struct wlcore_ops wl18xx_ops = {
.smart_config_start = wl18xx_cmd_smart_config_start,
.smart_config_stop = wl18xx_cmd_smart_config_stop,
.smart_config_set_group_key = wl18xx_cmd_smart_config_set_group_key,
.interrupt_notify = wl18xx_acx_interrupt_notify_config,
.rx_ba_filter = wl18xx_acx_rx_ba_filter,
};
/* HT cap appropriate for wide channels in 2Ghz */