diff options
author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2011-08-02 15:18:24 +0200 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@linaro.org> | 2012-03-19 09:01:47 +0100 |
commit | 145181b0a2182e4e7498dfca99605cd3bec660af (patch) | |
tree | 05678181a14507bda4827da3666aad5dc8a7ff68 /drivers/staging/cw1200/wsm.c | |
parent | 248aab2902d11683058cd85233a5e842aa5fdc04 (diff) |
cw1200: Fix for buffered multicasts in AP-PS mode: bugfix.
Bugfix of Change-Id I15b134bf847913a907f00293ae99d7a71bbc7343.
+ Locking semantic is simplified.
+ Overcomplicated check of aid0_bit_timestamp removed: FW is doing it.
+ wsm_get_tx_queue_and_mask() mistakely ignored suspend_multicast.
Change-Id: I0152fefd167dbb8a6fdc8dd8f5582b10fb645006
Signed-off-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/28152
Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com>
Tested-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33492
Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
Diffstat (limited to 'drivers/staging/cw1200/wsm.c')
-rw-r--r-- | drivers/staging/cw1200/wsm.c | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/drivers/staging/cw1200/wsm.c b/drivers/staging/cw1200/wsm.c index 4db5129394e..035f8e3d8ce 100644 --- a/drivers/staging/cw1200/wsm.c +++ b/drivers/staging/cw1200/wsm.c @@ -1427,7 +1427,7 @@ static int wsm_get_tx_queue_and_mask(struct cw1200_common *priv, int mcasts = 0; /* Search for a queue with multicast frames buffered */ - if (priv->sta_asleep_mask && !priv->suspend_multicast) { + if (priv->tx_multicast) { tx_allowed_mask = BIT(CW1200_LINK_ID_AFTER_DTIM); for (i = 0; i < 4; ++i) { mcasts += cw1200_queue_get_num_queued( @@ -1447,6 +1447,7 @@ static int wsm_get_tx_queue_and_mask(struct cw1200_common *priv, tx_allowed_mask = ~priv->sta_asleep_mask; if (priv->sta_asleep_mask) { tx_allowed_mask |= ~priv->tx_suspend_mask[i]; + tx_allowed_mask &= ~BIT(CW1200_LINK_ID_AFTER_DTIM); } else { tx_allowed_mask |= BIT(CW1200_LINK_ID_AFTER_DTIM); } @@ -1491,34 +1492,27 @@ int wsm_get_tx(struct cw1200_common *priv, u8 **data, spin_unlock(&priv->wsm_cmd.lock); } else { for (;;) { - bool obtain_lock = priv->sta_asleep_mask && - !priv->suspend_multicast; int ret; if (atomic_add_return(0, &priv->tx_lock)) break; - if (obtain_lock) - spin_lock_bh( - &priv->buffered_multicasts_lock); + spin_lock_bh(&priv->buffered_multicasts_lock); ret = wsm_get_tx_queue_and_mask(priv, &queue, &tx_allowed_mask, &more); if (priv->buffered_multicasts && - priv->sta_asleep_mask && - !priv->suspend_multicast && - (ret || tx_allowed_mask != - BIT(CW1200_LINK_ID_AFTER_DTIM))) { + (ret || !more) && + (priv->tx_multicast || + !priv->sta_asleep_mask)) { priv->buffered_multicasts = false; - priv->suspend_multicast = true; - queue_work(priv->workqueue, - &priv->multicast_stop_work); + if (priv->tx_multicast) + queue_work(priv->workqueue, + &priv->multicast_stop_work); } - if (obtain_lock) - spin_unlock_bh( - &priv->buffered_multicasts_lock); + spin_unlock_bh(&priv->buffered_multicasts_lock); if (ret) break; |