1*ca47d344SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 258619b14SKalle Valo /* 358619b14SKalle Valo 458619b14SKalle Valo Broadcom B43 wireless driver 558619b14SKalle Valo RFKILL support 658619b14SKalle Valo 758619b14SKalle Valo Copyright (c) 2007 Michael Buesch <m@bues.ch> 858619b14SKalle Valo 958619b14SKalle Valo 1058619b14SKalle Valo */ 1158619b14SKalle Valo 1258619b14SKalle Valo #include "b43.h" 1358619b14SKalle Valo 1458619b14SKalle Valo 1558619b14SKalle Valo /* Returns TRUE, if the radio is enabled in hardware. */ b43_is_hw_radio_enabled(struct b43_wldev * dev)1658619b14SKalle Valobool b43_is_hw_radio_enabled(struct b43_wldev *dev) 1758619b14SKalle Valo { 1858619b14SKalle Valo return !(b43_read32(dev, B43_MMIO_RADIO_HWENABLED_HI) 1958619b14SKalle Valo & B43_MMIO_RADIO_HWENABLED_HI_MASK); 2058619b14SKalle Valo } 2158619b14SKalle Valo 2258619b14SKalle Valo /* The poll callback for the hardware button. */ b43_rfkill_poll(struct ieee80211_hw * hw)2358619b14SKalle Valovoid b43_rfkill_poll(struct ieee80211_hw *hw) 2458619b14SKalle Valo { 2558619b14SKalle Valo struct b43_wl *wl = hw_to_b43_wl(hw); 2658619b14SKalle Valo struct b43_wldev *dev = wl->current_dev; 2758619b14SKalle Valo bool enabled; 2858619b14SKalle Valo bool brought_up = false; 2958619b14SKalle Valo 3058619b14SKalle Valo mutex_lock(&wl->mutex); 3158619b14SKalle Valo if (unlikely(b43_status(dev) < B43_STAT_INITIALIZED)) { 3258619b14SKalle Valo if (b43_bus_powerup(dev, 0)) { 3358619b14SKalle Valo mutex_unlock(&wl->mutex); 3458619b14SKalle Valo return; 3558619b14SKalle Valo } 3658619b14SKalle Valo b43_device_enable(dev, 0); 3758619b14SKalle Valo brought_up = true; 3858619b14SKalle Valo } 3958619b14SKalle Valo 4058619b14SKalle Valo enabled = b43_is_hw_radio_enabled(dev); 4158619b14SKalle Valo 4258619b14SKalle Valo if (unlikely(enabled != dev->radio_hw_enable)) { 4358619b14SKalle Valo dev->radio_hw_enable = enabled; 4458619b14SKalle Valo b43info(wl, "Radio hardware status changed to %s\n", 4558619b14SKalle Valo enabled ? "ENABLED" : "DISABLED"); 4658619b14SKalle Valo wiphy_rfkill_set_hw_state(hw->wiphy, !enabled); 4758619b14SKalle Valo if (enabled != dev->phy.radio_on) 4858619b14SKalle Valo b43_software_rfkill(dev, !enabled); 4958619b14SKalle Valo } 5058619b14SKalle Valo 5158619b14SKalle Valo if (brought_up) { 5258619b14SKalle Valo b43_device_disable(dev, 0); 5358619b14SKalle Valo b43_bus_may_powerdown(dev); 5458619b14SKalle Valo } 5558619b14SKalle Valo 5658619b14SKalle Valo mutex_unlock(&wl->mutex); 5758619b14SKalle Valo } 58