aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/p54
diff options
context:
space:
mode:
authorChristian Lamparter <chunkeey@web.de>2009-06-20 15:13:46 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-07-10 15:01:57 -0400
commit1795378ee8d162084c6f98fc62ec309e418dfbe9 (patch)
tree0f94532cbf1f1318b90ba27de67a0bcc99ac9a93 /drivers/net/wireless/p54
parent92179986ba5221a21e0f8a1e9b7b82a2883fef79 (diff)
p54: redo rx_status into skb->cb
This patch slightly optimizes p54_rx_data's stack and code size. Signed-off-by: Christian Lamparter <chunkeey@web.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/p54')
-rw-r--r--drivers/net/wireless/p54/p54common.c28
1 files changed, 13 insertions, 15 deletions
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c
index 1b15f9e0b861..d1ea609a6905 100644
--- a/drivers/net/wireless/p54/p54common.c
+++ b/drivers/net/wireless/p54/p54common.c
@@ -743,7 +743,7 @@ static int p54_rx_data(struct ieee80211_hw *dev, struct sk_buff *skb)
743{ 743{
744 struct p54_common *priv = dev->priv; 744 struct p54_common *priv = dev->priv;
745 struct p54_rx_data *hdr = (struct p54_rx_data *) skb->data; 745 struct p54_rx_data *hdr = (struct p54_rx_data *) skb->data;
746 struct ieee80211_rx_status rx_status = {0}; 746 struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
747 u16 freq = le16_to_cpu(hdr->freq); 747 u16 freq = le16_to_cpu(hdr->freq);
748 size_t header_len = sizeof(*hdr); 748 size_t header_len = sizeof(*hdr);
749 u32 tsf32; 749 u32 tsf32;
@@ -762,39 +762,37 @@ static int p54_rx_data(struct ieee80211_hw *dev, struct sk_buff *skb)
762 } 762 }
763 763
764 if (hdr->decrypt_status == P54_DECRYPT_OK) 764 if (hdr->decrypt_status == P54_DECRYPT_OK)
765 rx_status.flag |= RX_FLAG_DECRYPTED; 765 rx_status->flag |= RX_FLAG_DECRYPTED;
766 if ((hdr->decrypt_status == P54_DECRYPT_FAIL_MICHAEL) || 766 if ((hdr->decrypt_status == P54_DECRYPT_FAIL_MICHAEL) ||
767 (hdr->decrypt_status == P54_DECRYPT_FAIL_TKIP)) 767 (hdr->decrypt_status == P54_DECRYPT_FAIL_TKIP))
768 rx_status.flag |= RX_FLAG_MMIC_ERROR; 768 rx_status->flag |= RX_FLAG_MMIC_ERROR;
769 769
770 rx_status.signal = p54_rssi_to_dbm(dev, hdr->rssi); 770 rx_status->signal = p54_rssi_to_dbm(dev, hdr->rssi);
771 rx_status.noise = priv->noise; 771 rx_status->noise = priv->noise;
772 if (hdr->rate & 0x10) 772 if (hdr->rate & 0x10)
773 rx_status.flag |= RX_FLAG_SHORTPRE; 773 rx_status->flag |= RX_FLAG_SHORTPRE;
774 if (dev->conf.channel->band == IEEE80211_BAND_5GHZ) 774 if (dev->conf.channel->band == IEEE80211_BAND_5GHZ)
775 rx_status.rate_idx = (rate < 4) ? 0 : rate - 4; 775 rx_status->rate_idx = (rate < 4) ? 0 : rate - 4;
776 else 776 else
777 rx_status.rate_idx = rate; 777 rx_status->rate_idx = rate;
778 778
779 rx_status.freq = freq; 779 rx_status->freq = freq;
780 rx_status.band = dev->conf.channel->band; 780 rx_status->band = dev->conf.channel->band;
781 rx_status.antenna = hdr->antenna; 781 rx_status->antenna = hdr->antenna;
782 782
783 tsf32 = le32_to_cpu(hdr->tsf32); 783 tsf32 = le32_to_cpu(hdr->tsf32);
784 if (tsf32 < priv->tsf_low32) 784 if (tsf32 < priv->tsf_low32)
785 priv->tsf_high32++; 785 priv->tsf_high32++;
786 rx_status.mactime = ((u64)priv->tsf_high32) << 32 | tsf32; 786 rx_status->mactime = ((u64)priv->tsf_high32) << 32 | tsf32;
787 priv->tsf_low32 = tsf32; 787 priv->tsf_low32 = tsf32;
788 788
789 rx_status.flag |= RX_FLAG_TSFT; 789 rx_status->flag |= RX_FLAG_TSFT;
790 790
791 if (hdr->flags & cpu_to_le16(P54_HDR_FLAG_DATA_ALIGN)) 791 if (hdr->flags & cpu_to_le16(P54_HDR_FLAG_DATA_ALIGN))
792 header_len += hdr->align[0]; 792 header_len += hdr->align[0];
793 793
794 skb_pull(skb, header_len); 794 skb_pull(skb, header_len);
795 skb_trim(skb, le16_to_cpu(hdr->len)); 795 skb_trim(skb, le16_to_cpu(hdr->len));
796
797 memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status));
798 ieee80211_rx_irqsafe(dev, skb); 796 ieee80211_rx_irqsafe(dev, skb);
799 797
800 queue_delayed_work(dev->workqueue, &priv->work, 798 queue_delayed_work(dev->workqueue, &priv->work,