diff options
Diffstat (limited to 'drivers/net/wireless/b43legacy/main.c')
-rw-r--r-- | drivers/net/wireless/b43legacy/main.c | 25 |
1 files changed, 20 insertions, 5 deletions
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. */ | ||
2011 | static 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() */ |
2011 | static void b43legacy_chip_exit(struct b43legacy_wldev *dev) | 2026 | static 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 | ||
2171 | static void b43legacy_periodic_every1sec(struct b43legacy_wldev *dev) | 2183 | static 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; |