summaryrefslogtreecommitdiffstats
path: root/package/system/hostap-driver/patches/001-fix-txpower.patch
blob: 94ca344943e623c348c6f3ef58b2207dc2636c72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
diff -Naur hostap-driver-0.3.7/driver/modules/hostap.c hostap-driver-0.3.7-patched/driver/modules/hostap.c
--- hostap-driver-0.3.7/driver/modules/hostap.c	2004-08-28 06:26:46.000000000 +0300
+++ hostap-driver-0.3.7-patched/driver/modules/hostap.c	2005-04-20 17:20:56.000000000 +0300
@@ -1164,6 +1164,36 @@
 	return ret;
 }
 
+/* BUG FIX: Restore power setting value when lost due to F/W bug */
+
+int hostap_restore_power(struct net_device *dev)
+{
+        struct hostap_interface *iface = dev->priv;
+       local_info_t *local = iface->local;
+               
+       u16 val;
+       int ret = 0;
+
+       if (local->txpower_type == PRISM2_TXPOWER_OFF) {
+                       val = 0xff; /* use all standby and sleep modes */
+                       ret = local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
+                                              HFA386X_CR_A_D_TEST_MODES2,
+                                              &val, NULL);
+       }
+
+#ifdef RAW_TXPOWER_SETTING
+       if (local->txpower_type == PRISM2_TXPOWER_FIXED) {
+               val = HFA384X_TEST_CFG_BIT_ALC;
+               local->func->cmd(dev, HFA384X_CMDCODE_TEST |
+                                (HFA384X_TEST_CFG_BITS << 8), 0, &val, NULL);
+               val = prism2_txpower_dBm_to_hfa386x(local->txpower);
+               ret = (local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
+                            HFA386X_CR_MANUAL_TX_POWER, &val, NULL));
+       }
+#endif /* RAW_TXPOWER_SETTING */
+       return (ret ? -EOPNOTSUPP : 0);
+}
+
 
 struct proc_dir_entry *hostap_proc;
 
@@ -1214,6 +1244,7 @@
 EXPORT_SYMBOL(hostap_set_hostapd_sta);
 EXPORT_SYMBOL(hostap_add_interface);
 EXPORT_SYMBOL(hostap_remove_interface);
+EXPORT_SYMBOL(hostap_restore_power);
 EXPORT_SYMBOL(prism2_update_comms_qual);
 
 module_init(hostap_init);
diff -Naur hostap-driver-0.3.7/driver/modules/hostap.h hostap-driver-0.3.7-patched/driver/modules/hostap.h
--- hostap-driver-0.3.7/driver/modules/hostap.h	2003-11-30 04:14:26.000000000 +0200
+++ hostap-driver-0.3.7-patched/driver/modules/hostap.h	2005-04-20 17:21:23.000000000 +0300
@@ -36,6 +36,7 @@
 					 const char *prefix, const char *name);
 void hostap_remove_interface(struct net_device *dev, int rtnl_locked,
 			     int remove_from_list);
+int hostap_restore_power(struct net_device *dev);
 int prism2_update_comms_qual(struct net_device *dev);
 int prism2_sta_send_mgmt(local_info_t *local, u8 *dst, u8 stype,
 			 u8 *body, size_t bodylen);
diff -Naur hostap-driver-0.3.7/driver/modules/hostap_ap.c hostap-driver-0.3.7-patched/driver/modules/hostap_ap.c
--- hostap-driver-0.3.7/driver/modules/hostap_ap.c	2005-01-24 04:52:00.000000000 +0200
+++ hostap-driver-0.3.7-patched/driver/modules/hostap_ap.c	2005-04-21 20:06:12.000000000 +0300
@@ -2346,13 +2346,13 @@
 		addr[count].sa_family = ARPHRD_ETHER;
 		memcpy(addr[count].sa_data, sta->addr, ETH_ALEN);
 		if (sta->last_rx_silence == 0)
-			qual[count].qual = sta->last_rx_signal < 27 ?
-				0 : (sta->last_rx_signal - 27) * 92 / 127;
+                        qual[count].qual = (sta->last_rx_signal - 156) == 0 ?
+                                0 : (sta->last_rx_signal - 156) * 92 / 64;
 		else
-			qual[count].qual = sta->last_rx_signal -
-				sta->last_rx_silence - 35;
-		qual[count].level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
-		qual[count].noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
+                        qual[count].qual = (sta->last_rx_signal -
+                                sta->last_rx_silence) * 92 / 64;
+                qual[count].level = sta->last_rx_signal;
+                qual[count].noise = sta->last_rx_silence;
 		qual[count].updated = sta->last_rx_updated;
 
 		sta->last_rx_updated = 0;
@@ -2413,13 +2413,13 @@
 		memset(&iwe, 0, sizeof(iwe));
 		iwe.cmd = IWEVQUAL;
 		if (sta->last_rx_silence == 0)
-			iwe.u.qual.qual = sta->last_rx_signal < 27 ?
-				0 : (sta->last_rx_signal - 27) * 92 / 127;
+	                iwe.u.qual.qual = (sta->last_rx_signal -156) == 0 ?
+	                        0 : (sta->last_rx_signal - 156) * 92 / 64;
 		else
-			iwe.u.qual.qual = sta->last_rx_signal -
-				sta->last_rx_silence - 35;
-		iwe.u.qual.level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);
-		iwe.u.qual.noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);
+                        iwe.u.qual.qual = (sta->last_rx_signal -
+                                sta->last_rx_silence) * 92 / 64;
+                iwe.u.qual.level = sta->last_rx_signal;
+                iwe.u.qual.noise = sta->last_rx_silence;
 		iwe.u.qual.updated = sta->last_rx_updated;
 		iwe.len = IW_EV_QUAL_LEN;
 		current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
diff -Naur hostap-driver-0.3.7/driver/modules/hostap_config.h hostap-driver-0.3.7-patched/driver/modules/hostap_config.h
--- hostap-driver-0.3.7/driver/modules/hostap_config.h	2005-02-12 18:12:56.000000000 +0200
+++ hostap-driver-0.3.7-patched/driver/modules/hostap_config.h	2005-04-20 17:25:23.000000000 +0300
@@ -94,6 +94,12 @@
  */
 /* #define PRISM2_NO_STATION_MODES */
 
+/* Enable TX power Setting functions
+ * (min att = -128 , max att =  127)
+ */
+
+#define RAW_TXPOWER_SETTING
+
 /* Use Linux crypto API instead of own encryption implementation whenever
  * possible. */
 /* #define HOSTAP_USE_CRYPTO_API */
diff -Naur hostap-driver-0.3.7/driver/modules/hostap_hw.c hostap-driver-0.3.7-patched/driver/modules/hostap_hw.c
--- hostap-driver-0.3.7/driver/modules/hostap_hw.c	2005-02-05 09:20:09.000000000 +0200
+++ hostap-driver-0.3.7-patched/driver/modules/hostap_hw.c	2005-04-20 17:25:55.000000000 +0300
@@ -1039,6 +1039,7 @@
 		       dev->name, local->fragm_threshold);
 	}
 
+	hostap_restore_power(dev);
 	return res;
 }
 
diff -Naur hostap-driver-0.3.7/driver/modules/hostap_info.c hostap-driver-0.3.7-patched/driver/modules/hostap_info.c
--- hostap-driver-0.3.7/driver/modules/hostap_info.c	2004-02-29 20:05:44.000000000 +0200
+++ hostap-driver-0.3.7-patched/driver/modules/hostap_info.c	2005-04-20 17:26:36.000000000 +0300
@@ -418,6 +418,11 @@
 	}
 
 	/* Get BSSID if we have a valid AP address */
+
+	if ( val == HFA384X_LINKSTATUS_CONNECTED ||
+	     val == HFA384X_LINKSTATUS_DISCONNECTED ) 
+			hostap_restore_power(local->dev);
+
 	if (connected) {
 		netif_carrier_on(local->dev);
 		netif_carrier_on(local->ddev);
diff -Naur hostap-driver-0.3.7/driver/modules/hostap_ioctl.c hostap-driver-0.3.7-patched/driver/modules/hostap_ioctl.c
--- hostap-driver-0.3.7/driver/modules/hostap_ioctl.c	2004-11-22 08:03:05.000000000 +0200
+++ hostap-driver-0.3.7-patched/driver/modules/hostap_ioctl.c	2005-04-20 17:42:41.000000000 +0300
@@ -1453,23 +1453,20 @@
 		val = 255;
 
 	tmp = val;
-	tmp >>= 2;
 
-	return -12 - tmp;
+	return tmp;
 }
 
 static u16 prism2_txpower_dBm_to_hfa386x(int val)
 {
 	signed char tmp;
 
-	if (val > 20)
-		return 128;
-	else if (val < -43)
+	if (val > 127)
 		return 127;
+	else if (val < -128)
+		return 128;
 
 	tmp = val;
-	tmp = -12 - tmp;
-	tmp <<= 2;
 
 	return (unsigned char) tmp;
 }