diff options
author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2011-06-04 17:08:40 +0200 |
---|---|---|
committer | Robert Marklund <robert.marklund@stericsson.com> | 2011-10-05 12:16:14 +0200 |
commit | 551b00d61e77bef3d05f9970897b7b93d287a8aa (patch) | |
tree | 1f4af83c6f9fd7e63873984143ab4612e83860a1 /drivers/staging/cw1200/txrx.c | |
parent | 7450c4048a63e76b343c2cb5743d67fd3d2c3a31 (diff) |
cw1200: stylistic change: move RX callback to txrx.c
WSM RX callback is moved form sta.c to txrx.
Change-Id: Id56e07c3b71d8a2fb52b3b974feaed8c48364390
Signed-off-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/24479
Reviewed-by: Robert MARKLUND <robert.marklund@stericsson.com>
Tested-by: Robert MARKLUND <robert.marklund@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/25619
Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
Diffstat (limited to 'drivers/staging/cw1200/txrx.c')
-rw-r--r-- | drivers/staging/cw1200/txrx.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/drivers/staging/cw1200/txrx.c b/drivers/staging/cw1200/txrx.c index fd04156dcb5..005654eabe8 100644 --- a/drivers/staging/cw1200/txrx.c +++ b/drivers/staging/cw1200/txrx.c @@ -563,6 +563,66 @@ void cw1200_tx_confirm_cb(struct cw1200_common *priv, } } +void cw1200_rx_cb(struct cw1200_common *priv, + struct wsm_rx *arg, + struct sk_buff **skb_p) +{ + struct sk_buff *skb = *skb_p; + struct ieee80211_rx_status *hdr = IEEE80211_SKB_RXCB(skb); + hdr->flag = 0; + + if (unlikely(priv->mode == NL80211_IFTYPE_UNSPECIFIED)) { + /* STA is stopped. */ + return; + } + + if (unlikely(arg->status)) { + if (arg->status == WSM_STATUS_MICFAILURE) { + txrx_printk(KERN_DEBUG "[RX] MIC failure.\n"); + hdr->flag |= RX_FLAG_MMIC_ERROR; + } else if (arg->status == WSM_STATUS_NO_KEY_FOUND) { + txrx_printk(KERN_DEBUG "[RX] No key found.\n"); + return; + } else { + txrx_printk(KERN_DEBUG "[RX] Receive failure: %d.\n", + arg->status); + return; + } + } + + hdr->mactime = 0; /* Not supported by WSM */ + hdr->freq = ieee80211_channel_to_frequency(arg->channelNumber); + hdr->band = (hdr->freq >= 5000) ? + IEEE80211_BAND_5GHZ : IEEE80211_BAND_2GHZ; + hdr->rate_idx = arg->rxedRate; + if (hdr->rate_idx >= 4) /* TODO: Use common convert function. */ + hdr->rate_idx -= 2; + hdr->signal = (s8)arg->rcpiRssi; + hdr->antenna = 0; + + if (WSM_RX_STATUS_ENCRYPTION(arg->flags)) { + hdr->flag |= RX_FLAG_DECRYPTED; + if (!arg->status && + (WSM_RX_STATUS_ENCRYPTION(arg->flags) == + WSM_RX_STATUS_TKIP)) { + hdr->flag |= RX_FLAG_MMIC_STRIPPED; + skb_trim(skb, skb->len - 8 /*MICHAEL_MIC_LEN*/); + } + } + if (arg->flags & WSM_RX_STATUS_HT) + hdr->flag |= RX_FLAG_HT; + + cw1200_debug_rxed(priv); + if (arg->flags & WSM_RX_STATUS_AGGREGATE) + cw1200_debug_rxed_agg(priv); + + /* Not that we really need _irqsafe variant here, + * but it offloads realtime bh thread and improve + * system performance. */ + ieee80211_rx_irqsafe(priv->hw, skb); + *skb_p = NULL; +} + /* ******************************************************************** */ /* Security */ |