diff options
author | Ivo van Doorn <ivdoorn@gmail.com> | 2008-11-01 19:38:10 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-11-21 11:06:05 -0500 |
commit | 6d64360ac56cda95243f15738a06f2a123c663e5 (patch) | |
tree | 61005d0d992773ead469590e63477199f0e63f7e /drivers/net/wireless/rt2x00/rt2x00dev.c | |
parent | 8058409c4fb8e38632207d572ed29943d2585520 (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.c | 22 |
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 | ||
177 | static void rt2x00lib_evaluate_antenna_sample(struct rt2x00_dev *rt2x00dev) | 177 | static 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 | ||
211 | static void rt2x00lib_evaluate_antenna_eval(struct rt2x00_dev *rt2x00dev) | 212 | static 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 | ||
241 | static void rt2x00lib_evaluate_antenna(struct rt2x00_dev *rt2x00dev) | 243 | static void rt2x00lib_evaluate_antenna(struct rt2x00_dev *rt2x00dev) |