aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2x00dev.c
diff options
context:
space:
mode:
authorIvo van Doorn <ivdoorn@gmail.com>2008-11-01 19:38:10 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-11-21 11:06:05 -0500
commit6d64360ac56cda95243f15738a06f2a123c663e5 (patch)
tree61005d0d992773ead469590e63477199f0e63f7e /drivers/net/wireless/rt2x00/rt2x00dev.c
parent8058409c4fb8e38632207d572ed29943d2585520 (diff)
rt2x00: Fix BUG_ON() with antenna handling
With the new configuration handling, and more specifically splitting the configuration of the antenna from the normal configuration steps allowed a BUG_ON() to be triggered in the driver because the SW_DIVERSITY was send to the driver. This fixes that by catching the value early in rt2x00config.c and replacing it with a sensible value. This also fixes a problem where the antenna is not being initialized at all when the radio is enabled. Since it no longer is part of the mac80211 configuration the only place where rt2x00 configured it was the SW diversity handler. Obviously this is broken for all non-diversity hardware and breaks SW diversity due to a broken initialization. When the radio is enabled the antenna will be configured once as soon as the config() callback function is called. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00dev.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index a8fee68a419e..e8ca1cbfeb90 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -176,13 +176,14 @@ void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state)
176 176
177static void rt2x00lib_evaluate_antenna_sample(struct rt2x00_dev *rt2x00dev) 177static void rt2x00lib_evaluate_antenna_sample(struct rt2x00_dev *rt2x00dev)
178{ 178{
179 enum antenna rx = rt2x00dev->link.ant.active.rx; 179 struct antenna_setup ant;
180 enum antenna tx = rt2x00dev->link.ant.active.tx;
181 int sample_a = 180 int sample_a =
182 rt2x00_get_link_ant_rssi_history(&rt2x00dev->link, ANTENNA_A); 181 rt2x00_get_link_ant_rssi_history(&rt2x00dev->link, ANTENNA_A);
183 int sample_b = 182 int sample_b =
184 rt2x00_get_link_ant_rssi_history(&rt2x00dev->link, ANTENNA_B); 183 rt2x00_get_link_ant_rssi_history(&rt2x00dev->link, ANTENNA_B);
185 184
185 memcpy(&ant, &rt2x00dev->link.ant.active, sizeof(ant));
186
186 /* 187 /*
187 * We are done sampling. Now we should evaluate the results. 188 * We are done sampling. Now we should evaluate the results.
188 */ 189 */
@@ -200,21 +201,22 @@ static void rt2x00lib_evaluate_antenna_sample(struct rt2x00_dev *rt2x00dev)
200 return; 201 return;
201 202
202 if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY) 203 if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY)
203 rx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B; 204 ant.rx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B;
204 205
205 if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY) 206 if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY)
206 tx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B; 207 ant.tx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B;
207 208
208 rt2x00lib_config_antenna(rt2x00dev, rx, tx); 209 rt2x00lib_config_antenna(rt2x00dev, &ant);
209} 210}
210 211
211static void rt2x00lib_evaluate_antenna_eval(struct rt2x00_dev *rt2x00dev) 212static void rt2x00lib_evaluate_antenna_eval(struct rt2x00_dev *rt2x00dev)
212{ 213{
213 enum antenna rx = rt2x00dev->link.ant.active.rx; 214 struct antenna_setup ant;
214 enum antenna tx = rt2x00dev->link.ant.active.tx;
215 int rssi_curr = rt2x00_get_link_ant_rssi(&rt2x00dev->link); 215 int rssi_curr = rt2x00_get_link_ant_rssi(&rt2x00dev->link);
216 int rssi_old = rt2x00_update_ant_rssi(&rt2x00dev->link, rssi_curr); 216 int rssi_old = rt2x00_update_ant_rssi(&rt2x00dev->link, rssi_curr);
217 217
218 memcpy(&ant, &rt2x00dev->link.ant.active, sizeof(ant));
219
218 /* 220 /*
219 * Legacy driver indicates that we should swap antenna's 221 * Legacy driver indicates that we should swap antenna's
220 * when the difference in RSSI is greater that 5. This 222 * when the difference in RSSI is greater that 5. This
@@ -230,12 +232,12 @@ static void rt2x00lib_evaluate_antenna_eval(struct rt2x00_dev *rt2x00dev)
230 rt2x00dev->link.ant.flags |= ANTENNA_MODE_SAMPLE; 232 rt2x00dev->link.ant.flags |= ANTENNA_MODE_SAMPLE;
231 233
232 if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY) 234 if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY)
233 rx = (rx == ANTENNA_A) ? ANTENNA_B : ANTENNA_A; 235 ant.rx = (ant.rx == ANTENNA_A) ? ANTENNA_B : ANTENNA_A;
234 236
235 if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY) 237 if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY)
236 tx = (tx == ANTENNA_A) ? ANTENNA_B : ANTENNA_A; 238 ant.tx = (ant.tx == ANTENNA_A) ? ANTENNA_B : ANTENNA_A;
237 239
238 rt2x00lib_config_antenna(rt2x00dev, rx, tx); 240 rt2x00lib_config_antenna(rt2x00dev, &ant);
239} 241}
240 242
241static void rt2x00lib_evaluate_antenna(struct rt2x00_dev *rt2x00dev) 243static void rt2x00lib_evaluate_antenna(struct rt2x00_dev *rt2x00dev)