aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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