diff options
Diffstat (limited to 'drivers/net/wireless/libertas/rx.c')
-rw-r--r-- | drivers/net/wireless/libertas/rx.c | 129 |
1 files changed, 15 insertions, 114 deletions
diff --git a/drivers/net/wireless/libertas/rx.c b/drivers/net/wireless/libertas/rx.c index 7a377f5b7662..a4d0bca9ef2c 100644 --- a/drivers/net/wireless/libertas/rx.c +++ b/drivers/net/wireless/libertas/rx.c | |||
@@ -4,18 +4,19 @@ | |||
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]; |
16 | u8 src_addr[6]; | 17 | u8 src_addr[6]; |
17 | u16 h803_len; | 18 | u16 h803_len; |
18 | } __attribute__ ((packed)); | 19 | } __packed; |
19 | 20 | ||
20 | struct rfc1042hdr { | 21 | struct rfc1042hdr { |
21 | u8 llc_dsap; | 22 | u8 llc_dsap; |
@@ -23,114 +24,22 @@ struct rfc1042hdr { | |||
23 | u8 llc_ctrl; | 24 | u8 llc_ctrl; |
24 | u8 snap_oui[3]; | 25 | u8 snap_oui[3]; |
25 | u16 snap_type; | 26 | u16 snap_type; |
26 | } __attribute__ ((packed)); | 27 | } __packed; |
27 | 28 | ||
28 | struct rxpackethdr { | 29 | struct rxpackethdr { |
29 | struct eth803hdr eth803_hdr; | 30 | struct eth803hdr eth803_hdr; |
30 | struct rfc1042hdr rfc1042_hdr; | 31 | struct rfc1042hdr rfc1042_hdr; |
31 | } __attribute__ ((packed)); | 32 | } __packed; |
32 | 33 | ||
33 | struct rx80211packethdr { | 34 | struct rx80211packethdr { |
34 | struct rxpd rx_pd; | 35 | struct rxpd rx_pd; |
35 | void *eth80211_hdr; | 36 | void *eth80211_hdr; |
36 | } __attribute__ ((packed)); | 37 | } __packed; |
37 | 38 | ||
38 | static int process_rxed_802_11_packet(struct lbs_private *priv, | 39 | 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 | ||