diff options
author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2011-07-17 02:11:27 +0200 |
---|---|---|
committer | Philippe LANGLAIS <philippe.langlais@stericsson.com> | 2011-10-13 09:45:17 +0200 |
commit | 287bfdb84e714636bff9a0814a1224797f2b3973 (patch) | |
tree | f7351bafee40025c8ecf5c784d8d5a22cfffc538 /drivers/staging/cw1200/bh.c | |
parent | 8777e41f161c3a785d04d439ceec2657492802ba (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.c | 9 |
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; } } |