nexmon – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | From: Larry Finger <Larry.Finger@lwfinger.net> |
2 | Date: Thu, 4 Dec 2008 04:21:20 +0000 (-0600) |
||
3 | Subject: rtl8187: Improve wireless statistics for RTL8187 |
||
4 | X-Git-Tag: master-2009-01-05~191 |
||
5 | X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Flinville%2Fwireless-testing.git;a=commitdiff_plain;h=cd2865552927d616be4a0da7c24$ |
||
6 | |||
7 | rtl8187: Improve wireless statistics for RTL8187 |
||
8 | |||
9 | The current wireless statistics for the RTL8187 poorly indicate the signal |
||
10 | strength and quality. With testing, I found that the AGC value is inversely |
||
11 | correlated with the strength as in the RTL8187B. By implementing a similar |
||
12 | calculation, much more code becomes common to the two devices. |
||
13 | |||
14 | Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> |
||
15 | Tested by: MartÃn Ernesto Barreyro <barreyromartin@gmail.com> |
||
16 | Acked-by: Hin-Tak Leung <htl10@users.sourceforge.net> |
||
17 | Signed-off-by: John W. Linville <linville@tuxdriver.com> |
||
18 | Crudely-backported-by: Zero_Chaos <zero_chaos@pentoo.ch> |
||
19 | --- |
||
20 | |||
21 | diff -Naur linux-2.6.28-orig/drivers/net/wireless/rtl8187_dev.c linux-2.6.28/drivers/net/wireless/rtl8187_dev.c |
||
22 | --- linux-2.6.28-orig/drivers/net/wireless/rtl8187_dev.c 2009-02-09 16:52:51.000000000 -0500 |
||
23 | +++ linux-2.6.28/drivers/net/wireless/rtl8187_dev.c 2009-02-09 17:22:50.000000000 -0500 |
||
24 | @@ -303,29 +303,14 @@ |
||
25 | struct rtl8187_rx_hdr *hdr = |
||
26 | (typeof(hdr))(skb_tail_pointer(skb) - sizeof(*hdr)); |
||
27 | flags = le32_to_cpu(hdr->flags); |
||
28 | - signal = hdr->signal & 0x7f; |
||
29 | + /* As with the RTL8187B below, the AGC is used to calculate |
||
30 | + * signal strength and quality. In this case, the scaling |
||
31 | + * constants are derived from the output of p54usb. |
||
32 | + */ |
||
33 | + quality = 130 - ((41 * hdr->agc) >> 6); |
||
34 | + signal = -4 - ((27 * hdr->agc) >> 6); |
||
35 | rx_status.antenna = (hdr->signal >> 7) & 1; |
||
36 | - rx_status.noise = hdr->noise; |
||
37 | rx_status.mactime = le64_to_cpu(hdr->mac_time); |
||
38 | - priv->quality = signal; |
||
39 | - rx_status.qual = priv->quality; |
||
40 | - priv->noise = hdr->noise; |
||
41 | - rate = (flags >> 20) & 0xF; |
||
42 | - if (rate > 3) { /* OFDM rate */ |
||
43 | - if (signal > 90) |
||
44 | - signal = 90; |
||
45 | - else if (signal < 25) |
||
46 | - signal = 25; |
||
47 | - signal = 90 - signal; |
||
48 | - } else { /* CCK rate */ |
||
49 | - if (signal > 95) |
||
50 | - signal = 95; |
||
51 | - else if (signal < 30) |
||
52 | - signal = 30; |
||
53 | - signal = 95 - signal; |
||
54 | - } |
||
55 | - rx_status.signal = signal; |
||
56 | - priv->signal = signal; |
||
57 | } else { |
||
58 | struct rtl8187b_rx_hdr *hdr = |
||
59 | (typeof(hdr))(skb_tail_pointer(skb) - sizeof(*hdr)); |
||
60 | @@ -343,18 +328,18 @@ |
||
61 | */ |
||
62 | flags = le32_to_cpu(hdr->flags); |
||
63 | quality = 170 - hdr->agc; |
||
64 | - if (quality > 100) |
||
65 | - quality = 100; |
||
66 | signal = 14 - hdr->agc / 2; |
||
67 | - rx_status.qual = quality; |
||
68 | - priv->quality = quality; |
||
69 | - rx_status.signal = signal; |
||
70 | - priv->signal = signal; |
||
71 | rx_status.antenna = (hdr->rssi >> 7) & 1; |
||
72 | rx_status.mactime = le64_to_cpu(hdr->mac_time); |
||
73 | - rate = (flags >> 20) & 0xF; |
||
74 | } |
||
75 | |||
76 | + if (quality > 100) |
||
77 | + quality = 100; |
||
78 | + rx_status.qual = quality; |
||
79 | + priv->quality = quality; |
||
80 | + rx_status.signal = signal; |
||
81 | + priv->signal = signal; |
||
82 | + rate = (flags >> 20) & 0xF; |
||
83 | skb_trim(skb, flags & 0x0FFF); |
||
84 | rx_status.rate_idx = rate; |
||
85 | rx_status.freq = dev->conf.channel->center_freq; |
||
86 | @@ -1065,6 +1050,7 @@ |
||
87 | |||
88 | priv->mode = NL80211_IFTYPE_MONITOR; |
||
89 | dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | |
||
90 | + IEEE80211_HW_SIGNAL_DBM | |
||
91 | IEEE80211_HW_RX_INCLUDES_FCS; |
||
92 | |||
93 | eeprom.data = dev; |
||
94 | @@ -1184,10 +1170,6 @@ |
||
95 | printk(KERN_WARNING "rtl8187: 8187B chip detected. Support " |
||
96 | "is EXPERIMENTAL, and could damage your\n" |
||
97 | " hardware, use at your own risk\n"); |
||
98 | - dev->flags |= IEEE80211_HW_SIGNAL_DBM; |
||
99 | - } else { |
||
100 | - dev->flags |= IEEE80211_HW_SIGNAL_UNSPEC; |
||
101 | - dev->max_signal = 65; |
||
102 | } |
||
103 | |||
104 | dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); |