2012-05-14 13:10:03

by Victor Goldenshtein

[permalink] [raw]
Subject: [PATCH] wlcore: wait for roc complete only for the first roc command

In some multi role scenarios the driver might send multi
roc requests without sending a croc first, the fw queues
those requests and starts service the next roc request as
soon as the driver sends a croc for the previous one. So,
if the fw rocs on channel X and driver asks to roc also
on channel Y, the fw will not start service Y (and will
not send roc complete event for this request) until the
driver releases the fw with croc X.

Signed-off-by: Victor Goldenshtein <[email protected]>
Signed-off-by: Igal Chernobelsky <[email protected]>
---
drivers/net/wireless/ti/wlcore/cmd.c | 16 +++++++++++-----
1 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/ti/wlcore/cmd.c b/drivers/net/wireless/ti/wlcore/cmd.c
index 5b128a9..a742554 100644
--- a/drivers/net/wireless/ti/wlcore/cmd.c
+++ b/drivers/net/wireless/ti/wlcore/cmd.c
@@ -1573,19 +1573,25 @@ out:
int wl12xx_roc(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 role_id)
{
int ret = 0;
+ bool is_first_roc;

if (WARN_ON(test_bit(role_id, wl->roc_map)))
return 0;

+ is_first_roc = (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) >=
+ WL12XX_MAX_ROLES);
+
ret = wl12xx_cmd_roc(wl, wlvif, role_id);
if (ret < 0)
goto out;

- ret = wl1271_cmd_wait_for_event(wl,
- REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID);
- if (ret < 0) {
- wl1271_error("cmd roc event completion error");
- goto out;
+ if (is_first_roc) {
+ ret = wl1271_cmd_wait_for_event(wl,
+ REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID);
+ if (ret < 0) {
+ wl1271_error("cmd roc event completion error");
+ goto out;
+ }
}

__set_bit(role_id, wl->roc_map);
--
1.7.5.4



2012-06-06 08:18:52

by Luciano Coelho

[permalink] [raw]
Subject: Re: [PATCH] wlcore: wait for roc complete only for the first roc command

On Mon, 2012-05-14 at 16:07 +0300, Victor Goldenshtein wrote:
> In some multi role scenarios the driver might send multi
> roc requests without sending a croc first, the fw queues
> those requests and starts service the next roc request as
> soon as the driver sends a croc for the previous one. So,
> if the fw rocs on channel X and driver asks to roc also
> on channel Y, the fw will not start service Y (and will
> not send roc complete event for this request) until the
> driver releases the fw with croc X.
>
> Signed-off-by: Victor Goldenshtein <[email protected]>
> Signed-off-by: Igal Chernobelsky <[email protected]>
> ---

Applied and pushed!

--
Luca.