Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-or-later 2 : : /* 3 : : 4 : : Broadcom B43 wireless driver 5 : : RFKILL support 6 : : 7 : : Copyright (c) 2007 Michael Buesch <m@bues.ch> 8 : : 9 : : 10 : : */ 11 : : 12 : : #include "radio.h" 13 : : #include "b43legacy.h" 14 : : 15 : : 16 : : /* Returns TRUE, if the radio is enabled in hardware. */ 17 : 0 : bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev) 18 : : { 19 [ # # ]: 0 : if (dev->dev->id.revision >= 3) { 20 : 0 : if (!(b43legacy_read32(dev, B43legacy_MMIO_RADIO_HWENABLED_HI) 21 [ # # ]: 0 : & B43legacy_MMIO_RADIO_HWENABLED_HI_MASK)) 22 : 0 : return true; 23 : : } else { 24 : : /* To prevent CPU fault on PPC, do not read a register 25 : : * unless the interface is started; however, on resume 26 : : * for hibernation, this routine is entered early. When 27 : : * that happens, unconditionally return TRUE. 28 : : */ 29 [ # # ]: 0 : if (b43legacy_status(dev) < B43legacy_STAT_STARTED) 30 : : return true; 31 [ # # ]: 0 : if (b43legacy_read16(dev, B43legacy_MMIO_RADIO_HWENABLED_LO) 32 : : & B43legacy_MMIO_RADIO_HWENABLED_LO_MASK) 33 : 0 : return true; 34 : : } 35 : : return false; 36 : : } 37 : : 38 : : /* The poll callback for the hardware button. */ 39 : 0 : void b43legacy_rfkill_poll(struct ieee80211_hw *hw) 40 : : { 41 : 0 : struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw); 42 : 0 : struct b43legacy_wldev *dev = wl->current_dev; 43 : 0 : struct ssb_bus *bus = dev->dev->bus; 44 : 0 : bool enabled; 45 : 0 : bool brought_up = false; 46 : : 47 : 0 : mutex_lock(&wl->mutex); 48 [ # # ]: 0 : if (unlikely(b43legacy_status(dev) < B43legacy_STAT_INITIALIZED)) { 49 [ # # ]: 0 : if (ssb_bus_powerup(bus, 0)) { 50 : 0 : mutex_unlock(&wl->mutex); 51 : 0 : return; 52 : : } 53 : 0 : ssb_device_enable(dev->dev, 0); 54 : 0 : brought_up = true; 55 : : } 56 : : 57 : 0 : enabled = b43legacy_is_hw_radio_enabled(dev); 58 : : 59 [ # # ]: 0 : if (unlikely(enabled != dev->radio_hw_enable)) { 60 : 0 : dev->radio_hw_enable = enabled; 61 [ # # ]: 0 : b43legacyinfo(wl, "Radio hardware status changed to %s\n", 62 : : enabled ? "ENABLED" : "DISABLED"); 63 : 0 : wiphy_rfkill_set_hw_state(hw->wiphy, !enabled); 64 [ # # ]: 0 : if (enabled != dev->phy.radio_on) { 65 [ # # ]: 0 : if (enabled) 66 : 0 : b43legacy_radio_turn_on(dev); 67 : : else 68 : 0 : b43legacy_radio_turn_off(dev, 0); 69 : : } 70 : : } 71 : : 72 [ # # ]: 0 : if (brought_up) { 73 : 0 : ssb_device_disable(dev->dev, 0); 74 : 0 : ssb_bus_may_powerdown(bus); 75 : : } 76 : : 77 : 0 : mutex_unlock(&wl->mutex); 78 : : }