summaryrefslogtreecommitdiff
path: root/drivers/staging/cw1200/wsm.c
diff options
context:
space:
mode:
authorDmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>2011-08-02 15:18:24 +0200
committerPhilippe Langlais <philippe.langlais@linaro.org>2012-03-19 09:01:47 +0100
commit145181b0a2182e4e7498dfca99605cd3bec660af (patch)
tree05678181a14507bda4827da3666aad5dc8a7ff68 /drivers/staging/cw1200/wsm.c
parent248aab2902d11683058cd85233a5e842aa5fdc04 (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.c26
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;