aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2x00config.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/rt2x00config.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/rt2x00config.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00config.c35
1 files changed, 26 insertions, 9 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c
index 3e4eee3ab7d..1059b4d1868 100644
--- a/drivers/net/wireless/rt2x00/rt2x00config.c
+++ b/drivers/net/wireless/rt2x00/rt2x00config.c
@@ -109,15 +109,32 @@ void rt2x00lib_config_erp(struct rt2x00_dev *rt2x00dev,
109} 109}
110 110
111void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, 111void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
112 enum antenna rx, enum antenna tx) 112 struct antenna_setup *ant)
113{ 113{
114 struct antenna_setup ant; 114 /*
115 115 * Failsafe: Make sure we are not sending the
116 ant.rx = rx; 116 * ANTENNA_SW_DIVERSITY state to the driver.
117 ant.tx = tx; 117 * If that happes fallback to hardware default,
118 * or our own default.
119 */
120 if (ant->rx == ANTENNA_SW_DIVERSITY) {
121 if (rt2x00dev->default_ant.rx == ANTENNA_SW_DIVERSITY)
122 ant->rx = ANTENNA_B;
123 else
124 ant->rx = rt2x00dev->default_ant.rx;
125 }
126 if (ant->tx == ANTENNA_SW_DIVERSITY) {
127 if (rt2x00dev->default_ant.tx == ANTENNA_SW_DIVERSITY)
128 ant->tx = ANTENNA_B;
129 else
130 ant->tx = rt2x00dev->default_ant.tx;
131 }
118 132
119 if (rx == rt2x00dev->link.ant.active.rx && 133 /*
120 tx == rt2x00dev->link.ant.active.tx) 134 * Only reconfigure when something has changed.
135 */
136 if (ant->rx == rt2x00dev->link.ant.active.rx &&
137 ant->tx == rt2x00dev->link.ant.active.tx)
121 return; 138 return;
122 139
123 /* 140 /*
@@ -132,12 +149,12 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev,
132 * The latter is required since we need to recalibrate the 149 * The latter is required since we need to recalibrate the
133 * noise-sensitivity ratio for the new setup. 150 * noise-sensitivity ratio for the new setup.
134 */ 151 */
135 rt2x00dev->ops->lib->config_ant(rt2x00dev, &ant); 152 rt2x00dev->ops->lib->config_ant(rt2x00dev, ant);
136 153
137 rt2x00lib_reset_link_tuner(rt2x00dev); 154 rt2x00lib_reset_link_tuner(rt2x00dev);
138 rt2x00_reset_link_ant_rssi(&rt2x00dev->link); 155 rt2x00_reset_link_ant_rssi(&rt2x00dev->link);
139 156
140 memcpy(&rt2x00dev->link.ant.active, &ant, sizeof(ant)); 157 memcpy(&rt2x00dev->link.ant.active, ant, sizeof(*ant));
141 158
142 if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) 159 if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
143 rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK); 160 rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK);