summaryrefslogtreecommitdiff
path: root/drivers/staging/cw1200/bh.c
diff options
context:
space:
mode:
authorDmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>2011-07-17 02:11:27 +0200
committerPhilippe LANGLAIS <philippe.langlais@stericsson.com>2011-10-13 09:45:17 +0200
commit287bfdb84e714636bff9a0814a1224797f2b3973 (patch)
treef7351bafee40025c8ecf5c784d8d5a22cfffc538 /drivers/staging/cw1200/bh.c
parent8777e41f161c3a785d04d439ceec2657492802ba (diff)
cw1200: Fix for firmware exception on requeued TXed frames.
TX sequence number was not cleared properly in requeued frames. Firmware checked it and triggered exception. Fix clears TX sequence part of id field before applying (or-ing) a new sequence number. Also handling of TX confirmation frames with "requeue" status was slightly changed with respect to PS flow control (suspend/resume link). Note that multicast TX-ing in SoftAP mode still be completly broken, to be fixed later. Signed-off-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> Change-Id: I4eacfa3e6cf8dc6e63e161489977228d8016c8d8 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/27305 Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com> Tested-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33485 Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
Diffstat (limited to 'drivers/staging/cw1200/bh.c')
-rw-r--r--drivers/staging/cw1200/bh.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/staging/cw1200/bh.c b/drivers/staging/cw1200/bh.c
index 2d438a96e38..cddfd9dfaa4 100644
--- a/drivers/staging/cw1200/bh.c
+++ b/drivers/staging/cw1200/bh.c
@@ -476,8 +476,10 @@ tx:
}
#endif /* CONFIG_CW1200_NON_POWER_OF_TWO_BLOCKSIZES */
- wsm->id |= __cpu_to_le32(
- priv->wsm_tx_seq << 13);
+ wsm->id &= __cpu_to_le32(
+ ~WSM_TX_SEQ(WSM_TX_SEQ_MAX));
+ wsm->id |= cpu_to_le32(
+ WSM_TX_SEQ(priv->wsm_tx_seq));
if (WARN_ON(cw1200_data_write(priv,
data, tx_len))) {
@@ -491,7 +493,8 @@ tx:
#endif /* CONFIG_CW1200_WSM_DUMPS */
wsm_txed(priv, data);
- priv->wsm_tx_seq = (priv->wsm_tx_seq + 1) & 7;
+ priv->wsm_tx_seq = (priv->wsm_tx_seq + 1) &
+ WSM_TX_SEQ_MAX;
}
}