aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2007-09-20 21:10:07 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:52:25 -0400
commit1065de1562b1552a24f83e379bcb5fed351a8bc4 (patch)
tree742e644b0f4fee21b63b27deda2a95818c6e0ae4
parent42a9174f541d2338d35b91869415d9ae9312ca0d (diff)
[B43LEGACY]: Change the hardware radio enable logic and cleanup code
This change cleans up the radio-related messages in several ways. (1) The state of the rfkill switch is assumed to be on, rather than tested. Now, any user without such a switch will not see any messages. For devices with such a switch, a message will be logged only if the initial state is off, or if the switch is toggled. (2) The routine for testing the switch state is no longer inline. (3) The LED handling routine is simplified. (4) The "Radio turned off" message that has confused some users has been changed to "Radio initialized". This patch is patterned after a similar change to b43 by Michael Buesch. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/wireless/b43legacy/leds.c12
-rw-r--r--drivers/net/wireless/b43legacy/main.c25
-rw-r--r--drivers/net/wireless/b43legacy/main.h20
-rw-r--r--drivers/net/wireless/b43legacy/radio.c2
4 files changed, 25 insertions, 34 deletions
diff --git a/drivers/net/wireless/b43legacy/leds.c b/drivers/net/wireless/b43legacy/leds.c
index 498912ddeddb..a584ea810502 100644
--- a/drivers/net/wireless/b43legacy/leds.c
+++ b/drivers/net/wireless/b43legacy/leds.c
@@ -182,6 +182,7 @@ void b43legacy_leds_update(struct b43legacy_wldev *dev, int activity)
182 unsigned long interval = 0; 182 unsigned long interval = 0;
183 u16 ledctl; 183 u16 ledctl;
184 unsigned long flags; 184 unsigned long flags;
185 bool radio_enabled = (phy->radio_on && dev->radio_hw_enable);
185 186
186 spin_lock_irqsave(&dev->wl->leds_lock, flags); 187 spin_lock_irqsave(&dev->wl->leds_lock, flags);
187 ledctl = b43legacy_read16(dev, B43legacy_MMIO_GPIO_CONTROL); 188 ledctl = b43legacy_read16(dev, B43legacy_MMIO_GPIO_CONTROL);
@@ -201,20 +202,15 @@ void b43legacy_leds_update(struct b43legacy_wldev *dev, int activity)
201 turn_on = activity; 202 turn_on = activity;
202 break; 203 break;
203 case B43legacy_LED_RADIO_ALL: 204 case B43legacy_LED_RADIO_ALL:
204 turn_on = phy->radio_on && 205 turn_on = radio_enabled;
205 b43legacy_is_hw_radio_enabled(dev);
206 break; 206 break;
207 case B43legacy_LED_RADIO_A: 207 case B43legacy_LED_RADIO_A:
208 break; 208 break;
209 case B43legacy_LED_RADIO_B: 209 case B43legacy_LED_RADIO_B:
210 turn_on = (phy->radio_on && 210 turn_on = radio_enabled;
211 b43legacy_is_hw_radio_enabled(dev) &&
212 (phy->type == B43legacy_PHYTYPE_B ||
213 phy->type == B43legacy_PHYTYPE_G));
214 break; 211 break;
215 case B43legacy_LED_MODE_BG: 212 case B43legacy_LED_MODE_BG:
216 if (phy->type == B43legacy_PHYTYPE_G && 213 if (phy->type == B43legacy_PHYTYPE_G && radio_enabled)
217 b43legacy_is_hw_radio_enabled(dev))
218 turn_on = 1; 214 turn_on = 1;
219 break; 215 break;
220 case B43legacy_LED_TRANSFER: 216 case B43legacy_LED_TRANSFER:
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
index 3e935d0d4b80..a793f183a2c0 100644
--- a/drivers/net/wireless/b43legacy/main.c
+++ b/drivers/net/wireless/b43legacy/main.c
@@ -2007,6 +2007,21 @@ static void b43legacy_mgmtframe_txantenna(struct b43legacy_wldev *dev,
2007 B43legacy_SHM_SH_PRPHYCTL, tmp); 2007 B43legacy_SHM_SH_PRPHYCTL, tmp);
2008} 2008}
2009 2009
2010/* Returns TRUE, if the radio is enabled in hardware. */
2011static bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev)
2012{
2013 if (dev->phy.rev >= 3) {
2014 if (!(b43legacy_read32(dev, B43legacy_MMIO_RADIO_HWENABLED_HI)
2015 & B43legacy_MMIO_RADIO_HWENABLED_HI_MASK))
2016 return 1;
2017 } else {
2018 if (b43legacy_read16(dev, B43legacy_MMIO_RADIO_HWENABLED_LO)
2019 & B43legacy_MMIO_RADIO_HWENABLED_LO_MASK)
2020 return 1;
2021 }
2022 return 0;
2023}
2024
2010/* This is the opposite of b43legacy_chip_init() */ 2025/* This is the opposite of b43legacy_chip_init() */
2011static void b43legacy_chip_exit(struct b43legacy_wldev *dev) 2026static void b43legacy_chip_exit(struct b43legacy_wldev *dev)
2012{ 2027{
@@ -2046,9 +2061,6 @@ static int b43legacy_chip_init(struct b43legacy_wldev *dev)
2046 if (err) 2061 if (err)
2047 goto err_gpio_cleanup; 2062 goto err_gpio_cleanup;
2048 b43legacy_radio_turn_on(dev); 2063 b43legacy_radio_turn_on(dev);
2049 dev->radio_hw_enable = b43legacy_is_hw_radio_enabled(dev);
2050 b43legacyinfo(dev->wl, "Radio %s by hardware\n",
2051 (dev->radio_hw_enable == 0) ? "disabled" : "enabled");
2052 2064
2053 b43legacy_write16(dev, 0x03E6, 0x0000); 2065 b43legacy_write16(dev, 0x03E6, 0x0000);
2054 err = b43legacy_phy_init(dev); 2066 err = b43legacy_phy_init(dev);
@@ -2170,14 +2182,14 @@ static void b43legacy_periodic_every15sec(struct b43legacy_wldev *dev)
2170 2182
2171static void b43legacy_periodic_every1sec(struct b43legacy_wldev *dev) 2183static void b43legacy_periodic_every1sec(struct b43legacy_wldev *dev)
2172{ 2184{
2173 int radio_hw_enable; 2185 bool radio_hw_enable;
2174 2186
2175 /* check if radio hardware enabled status changed */ 2187 /* check if radio hardware enabled status changed */
2176 radio_hw_enable = b43legacy_is_hw_radio_enabled(dev); 2188 radio_hw_enable = b43legacy_is_hw_radio_enabled(dev);
2177 if (unlikely(dev->radio_hw_enable != radio_hw_enable)) { 2189 if (unlikely(dev->radio_hw_enable != radio_hw_enable)) {
2178 dev->radio_hw_enable = radio_hw_enable; 2190 dev->radio_hw_enable = radio_hw_enable;
2179 b43legacyinfo(dev->wl, "Radio hardware status changed to %s\n", 2191 b43legacyinfo(dev->wl, "Radio hardware status changed to %s\n",
2180 (radio_hw_enable == 0) ? "disabled" : "enabled"); 2192 (radio_hw_enable) ? "enabled" : "disabled");
2181 b43legacy_leds_update(dev, 0); 2193 b43legacy_leds_update(dev, 0);
2182 } 2194 }
2183} 2195}
@@ -2933,6 +2945,9 @@ static void setup_struct_phy_for_init(struct b43legacy_wldev *dev,
2933 2945
2934 /* Flags */ 2946 /* Flags */
2935 phy->locked = 0; 2947 phy->locked = 0;
2948 /* Assume the radio is enabled. If it's not enabled, the state will
2949 * immediately get fixed on the first periodic work run. */
2950 dev->radio_hw_enable = 1;
2936 2951
2937 phy->savedpctlreg = 0xFFFF; 2952 phy->savedpctlreg = 0xFFFF;
2938 phy->aci_enable = 0; 2953 phy->aci_enable = 0;
diff --git a/drivers/net/wireless/b43legacy/main.h b/drivers/net/wireless/b43legacy/main.h
index 673935e67e64..68435c50d8e0 100644
--- a/drivers/net/wireless/b43legacy/main.h
+++ b/drivers/net/wireless/b43legacy/main.h
@@ -97,26 +97,6 @@ int b43legacy_is_ofdm_rate(int rate)
97 return !b43legacy_is_cck_rate(rate); 97 return !b43legacy_is_cck_rate(rate);
98} 98}
99 99
100static inline
101int b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev)
102{
103 /* function to return state of hardware enable of radio
104 * returns 0 if radio disabled, 1 if radio enabled
105 */
106 struct b43legacy_phy *phy = &dev->phy;
107
108 if (phy->rev >= 3)
109 return ((b43legacy_read32(dev,
110 B43legacy_MMIO_RADIO_HWENABLED_HI)
111 & B43legacy_MMIO_RADIO_HWENABLED_HI_MASK)
112 == 0) ? 1 : 0;
113 else
114 return ((b43legacy_read16(dev,
115 B43legacy_MMIO_RADIO_HWENABLED_LO)
116 & B43legacy_MMIO_RADIO_HWENABLED_LO_MASK)
117 == 0) ? 0 : 1;
118}
119
120void b43legacy_tsf_read(struct b43legacy_wldev *dev, u64 *tsf); 100void b43legacy_tsf_read(struct b43legacy_wldev *dev, u64 *tsf);
121void b43legacy_tsf_write(struct b43legacy_wldev *dev, u64 tsf); 101void b43legacy_tsf_write(struct b43legacy_wldev *dev, u64 tsf);
122 102
diff --git a/drivers/net/wireless/b43legacy/radio.c b/drivers/net/wireless/b43legacy/radio.c
index 54067f082825..a361dee664af 100644
--- a/drivers/net/wireless/b43legacy/radio.c
+++ b/drivers/net/wireless/b43legacy/radio.c
@@ -2134,7 +2134,7 @@ void b43legacy_radio_turn_off(struct b43legacy_wldev *dev)
2134 } else 2134 } else
2135 b43legacy_phy_write(dev, 0x0015, 0xAA00); 2135 b43legacy_phy_write(dev, 0x0015, 0xAA00);
2136 phy->radio_on = 0; 2136 phy->radio_on = 0;
2137 b43legacydbg(dev->wl, "Radio turned off\n"); 2137 b43legacydbg(dev->wl, "Radio initialized\n");
2138 b43legacy_leds_update(dev, 0); 2138 b43legacy_leds_update(dev, 0);
2139} 2139}
2140 2140