diff options
Diffstat (limited to 'drivers/net/wireless/libertas/rx.c')
-rw-r--r-- | drivers/net/wireless/libertas/rx.c | 121 |
1 files changed, 11 insertions, 110 deletions
diff --git a/drivers/net/wireless/libertas/rx.c b/drivers/net/wireless/libertas/rx.c index 1c63f8ce7349..a4d0bca9ef2c 100644 --- a/drivers/net/wireless/libertas/rx.c +++ b/drivers/net/wireless/libertas/rx.c | |||
@@ -4,12 +4,13 @@ | |||
4 | #include <linux/etherdevice.h> | 4 | #include <linux/etherdevice.h> |
5 | #include <linux/slab.h> | 5 | #include <linux/slab.h> |
6 | #include <linux/types.h> | 6 | #include <linux/types.h> |
7 | #include <net/cfg80211.h> | ||
7 | 8 | ||
9 | #include "defs.h" | ||
8 | #include "host.h" | 10 | #include "host.h" |
9 | #include "radiotap.h" | 11 | #include "radiotap.h" |
10 | #include "decl.h" | 12 | #include "decl.h" |
11 | #include "dev.h" | 13 | #include "dev.h" |
12 | #include "wext.h" | ||
13 | 14 | ||
14 | struct eth803hdr { | 15 | struct eth803hdr { |
15 | u8 dest_addr[6]; | 16 | u8 dest_addr[6]; |
@@ -39,98 +40,6 @@ static int process_rxed_802_11_packet(struct lbs_private *priv, | |||
39 | struct sk_buff *skb); | 40 | struct sk_buff *skb); |
40 | 41 | ||
41 | /** | 42 | /** |
42 | * @brief This function computes the avgSNR . | ||
43 | * | ||
44 | * @param priv A pointer to struct lbs_private structure | ||
45 | * @return avgSNR | ||
46 | */ | ||
47 | static u8 lbs_getavgsnr(struct lbs_private *priv) | ||
48 | { | ||
49 | u8 i; | ||
50 | u16 temp = 0; | ||
51 | if (priv->numSNRNF == 0) | ||
52 | return 0; | ||
53 | for (i = 0; i < priv->numSNRNF; i++) | ||
54 | temp += priv->rawSNR[i]; | ||
55 | return (u8) (temp / priv->numSNRNF); | ||
56 | |||
57 | } | ||
58 | |||
59 | /** | ||
60 | * @brief This function computes the AvgNF | ||
61 | * | ||
62 | * @param priv A pointer to struct lbs_private structure | ||
63 | * @return AvgNF | ||
64 | */ | ||
65 | static u8 lbs_getavgnf(struct lbs_private *priv) | ||
66 | { | ||
67 | u8 i; | ||
68 | u16 temp = 0; | ||
69 | if (priv->numSNRNF == 0) | ||
70 | return 0; | ||
71 | for (i = 0; i < priv->numSNRNF; i++) | ||
72 | temp += priv->rawNF[i]; | ||
73 | return (u8) (temp / priv->numSNRNF); | ||
74 | |||
75 | } | ||
76 | |||
77 | /** | ||
78 | * @brief This function save the raw SNR/NF to our internel buffer | ||
79 | * | ||
80 | * @param priv A pointer to struct lbs_private structure | ||
81 | * @param prxpd A pointer to rxpd structure of received packet | ||
82 | * @return n/a | ||
83 | */ | ||
84 | static void lbs_save_rawSNRNF(struct lbs_private *priv, struct rxpd *p_rx_pd) | ||
85 | { | ||
86 | if (priv->numSNRNF < DEFAULT_DATA_AVG_FACTOR) | ||
87 | priv->numSNRNF++; | ||
88 | priv->rawSNR[priv->nextSNRNF] = p_rx_pd->snr; | ||
89 | priv->rawNF[priv->nextSNRNF] = p_rx_pd->nf; | ||
90 | priv->nextSNRNF++; | ||
91 | if (priv->nextSNRNF >= DEFAULT_DATA_AVG_FACTOR) | ||
92 | priv->nextSNRNF = 0; | ||
93 | } | ||
94 | |||
95 | /** | ||
96 | * @brief This function computes the RSSI in received packet. | ||
97 | * | ||
98 | * @param priv A pointer to struct lbs_private structure | ||
99 | * @param prxpd A pointer to rxpd structure of received packet | ||
100 | * @return n/a | ||
101 | */ | ||
102 | static void lbs_compute_rssi(struct lbs_private *priv, struct rxpd *p_rx_pd) | ||
103 | { | ||
104 | |||
105 | lbs_deb_enter(LBS_DEB_RX); | ||
106 | |||
107 | lbs_deb_rx("rxpd: SNR %d, NF %d\n", p_rx_pd->snr, p_rx_pd->nf); | ||
108 | lbs_deb_rx("before computing SNR: SNR-avg = %d, NF-avg = %d\n", | ||
109 | priv->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE, | ||
110 | priv->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE); | ||
111 | |||
112 | priv->SNR[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->snr; | ||
113 | priv->NF[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->nf; | ||
114 | lbs_save_rawSNRNF(priv, p_rx_pd); | ||
115 | |||
116 | priv->SNR[TYPE_RXPD][TYPE_AVG] = lbs_getavgsnr(priv) * AVG_SCALE; | ||
117 | priv->NF[TYPE_RXPD][TYPE_AVG] = lbs_getavgnf(priv) * AVG_SCALE; | ||
118 | lbs_deb_rx("after computing SNR: SNR-avg = %d, NF-avg = %d\n", | ||
119 | priv->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE, | ||
120 | priv->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE); | ||
121 | |||
122 | priv->RSSI[TYPE_RXPD][TYPE_NOAVG] = | ||
123 | CAL_RSSI(priv->SNR[TYPE_RXPD][TYPE_NOAVG], | ||
124 | priv->NF[TYPE_RXPD][TYPE_NOAVG]); | ||
125 | |||
126 | priv->RSSI[TYPE_RXPD][TYPE_AVG] = | ||
127 | CAL_RSSI(priv->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE, | ||
128 | priv->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE); | ||
129 | |||
130 | lbs_deb_leave(LBS_DEB_RX); | ||
131 | } | ||
132 | |||
133 | /** | ||
134 | * @brief This function processes received packet and forwards it | 43 | * @brief This function processes received packet and forwards it |
135 | * to kernel/upper layer | 44 | * to kernel/upper layer |
136 | * | 45 | * |
@@ -154,7 +63,7 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb) | |||
154 | 63 | ||
155 | skb->ip_summed = CHECKSUM_NONE; | 64 | skb->ip_summed = CHECKSUM_NONE; |
156 | 65 | ||
157 | if (priv->monitormode) | 66 | if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR) |
158 | return process_rxed_802_11_packet(priv, skb); | 67 | return process_rxed_802_11_packet(priv, skb); |
159 | 68 | ||
160 | p_rx_pd = (struct rxpd *) skb->data; | 69 | p_rx_pd = (struct rxpd *) skb->data; |
@@ -225,13 +134,7 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb) | |||
225 | */ | 134 | */ |
226 | skb_pull(skb, hdrchop); | 135 | skb_pull(skb, hdrchop); |
227 | 136 | ||
228 | /* Take the data rate from the rxpd structure | 137 | priv->cur_rate = lbs_fw_index_to_data_rate(p_rx_pd->rx_rate); |
229 | * only if the rate is auto | ||
230 | */ | ||
231 | if (priv->enablehwauto) | ||
232 | priv->cur_rate = lbs_fw_index_to_data_rate(p_rx_pd->rx_rate); | ||
233 | |||
234 | lbs_compute_rssi(priv, p_rx_pd); | ||
235 | 138 | ||
236 | lbs_deb_rx("rx data: size of actual packet %d\n", skb->len); | 139 | lbs_deb_rx("rx data: size of actual packet %d\n", skb->len); |
237 | dev->stats.rx_bytes += skb->len; | 140 | dev->stats.rx_bytes += skb->len; |
@@ -352,20 +255,18 @@ static int process_rxed_802_11_packet(struct lbs_private *priv, | |||
352 | pradiotap_hdr = (void *)skb_push(skb, sizeof(struct rx_radiotap_hdr)); | 255 | pradiotap_hdr = (void *)skb_push(skb, sizeof(struct rx_radiotap_hdr)); |
353 | memcpy(pradiotap_hdr, &radiotap_hdr, sizeof(struct rx_radiotap_hdr)); | 256 | memcpy(pradiotap_hdr, &radiotap_hdr, sizeof(struct rx_radiotap_hdr)); |
354 | 257 | ||
355 | /* Take the data rate from the rxpd structure | 258 | priv->cur_rate = lbs_fw_index_to_data_rate(prxpd->rx_rate); |
356 | * only if the rate is auto | ||
357 | */ | ||
358 | if (priv->enablehwauto) | ||
359 | priv->cur_rate = lbs_fw_index_to_data_rate(prxpd->rx_rate); | ||
360 | |||
361 | lbs_compute_rssi(priv, prxpd); | ||
362 | 259 | ||
363 | lbs_deb_rx("rx data: size of actual packet %d\n", skb->len); | 260 | lbs_deb_rx("rx data: size of actual packet %d\n", skb->len); |
364 | dev->stats.rx_bytes += skb->len; | 261 | dev->stats.rx_bytes += skb->len; |
365 | dev->stats.rx_packets++; | 262 | dev->stats.rx_packets++; |
366 | 263 | ||
367 | skb->protocol = eth_type_trans(skb, priv->rtap_net_dev); | 264 | skb->protocol = eth_type_trans(skb, priv->dev); |
368 | netif_rx(skb); | 265 | |
266 | if (in_interrupt()) | ||
267 | netif_rx(skb); | ||
268 | else | ||
269 | netif_rx_ni(skb); | ||
369 | 270 | ||
370 | ret = 0; | 271 | ret = 0; |
371 | 272 | ||