162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci Broadcom B43 wireless driver 562306a36Sopenharmony_ci RFKILL support 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci Copyright (c) 2007 Michael Buesch <m@bues.ch> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci*/ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include "b43.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* Returns TRUE, if the radio is enabled in hardware. */ 1662306a36Sopenharmony_cibool b43_is_hw_radio_enabled(struct b43_wldev *dev) 1762306a36Sopenharmony_ci{ 1862306a36Sopenharmony_ci return !(b43_read32(dev, B43_MMIO_RADIO_HWENABLED_HI) 1962306a36Sopenharmony_ci & B43_MMIO_RADIO_HWENABLED_HI_MASK); 2062306a36Sopenharmony_ci} 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* The poll callback for the hardware button. */ 2362306a36Sopenharmony_civoid b43_rfkill_poll(struct ieee80211_hw *hw) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci struct b43_wl *wl = hw_to_b43_wl(hw); 2662306a36Sopenharmony_ci struct b43_wldev *dev = wl->current_dev; 2762306a36Sopenharmony_ci bool enabled; 2862306a36Sopenharmony_ci bool brought_up = false; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci mutex_lock(&wl->mutex); 3162306a36Sopenharmony_ci if (unlikely(b43_status(dev) < B43_STAT_INITIALIZED)) { 3262306a36Sopenharmony_ci if (b43_bus_powerup(dev, 0)) { 3362306a36Sopenharmony_ci mutex_unlock(&wl->mutex); 3462306a36Sopenharmony_ci return; 3562306a36Sopenharmony_ci } 3662306a36Sopenharmony_ci b43_device_enable(dev, 0); 3762306a36Sopenharmony_ci brought_up = true; 3862306a36Sopenharmony_ci } 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci enabled = b43_is_hw_radio_enabled(dev); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci if (unlikely(enabled != dev->radio_hw_enable)) { 4362306a36Sopenharmony_ci dev->radio_hw_enable = enabled; 4462306a36Sopenharmony_ci b43info(wl, "Radio hardware status changed to %s\n", 4562306a36Sopenharmony_ci enabled ? "ENABLED" : "DISABLED"); 4662306a36Sopenharmony_ci wiphy_rfkill_set_hw_state(hw->wiphy, !enabled); 4762306a36Sopenharmony_ci if (enabled != dev->phy.radio_on) 4862306a36Sopenharmony_ci b43_software_rfkill(dev, !enabled); 4962306a36Sopenharmony_ci } 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci if (brought_up) { 5262306a36Sopenharmony_ci b43_device_disable(dev, 0); 5362306a36Sopenharmony_ci b43_bus_may_powerdown(dev); 5462306a36Sopenharmony_ci } 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci mutex_unlock(&wl->mutex); 5762306a36Sopenharmony_ci} 58