]>
Commit | Line | Data |
---|---|---|
d2912cb1 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
ca9152e3 HRK |
2 | /* |
3 | * Linux RFKILL support for RTL8187 | |
4 | * | |
5 | * Copyright (c) 2009 Herton Ronaldo Krzesinski <herton@mandriva.com.br> | |
6 | * | |
7 | * Based on the RFKILL handling in the r8187 driver, which is: | |
8 | * Copyright (c) Realtek Semiconductor Corp. All rights reserved. | |
9 | * | |
10 | * Thanks to Realtek for their support! | |
ca9152e3 HRK |
11 | */ |
12 | ||
13 | #include <linux/types.h> | |
14 | #include <linux/usb.h> | |
15 | #include <net/mac80211.h> | |
16 | ||
17 | #include "rtl8187.h" | |
3cfeb0c3 | 18 | #include "rfkill.h" |
ca9152e3 HRK |
19 | |
20 | static bool rtl8187_is_radio_enabled(struct rtl8187_priv *priv) | |
21 | { | |
22 | u8 gpio; | |
23 | ||
24 | gpio = rtl818x_ioread8(priv, &priv->map->GPIO0); | |
70d57139 | 25 | rtl818x_iowrite8(priv, &priv->map->GPIO0, gpio & ~priv->rfkill_mask); |
ca9152e3 HRK |
26 | gpio = rtl818x_ioread8(priv, &priv->map->GPIO1); |
27 | ||
70d57139 | 28 | return gpio & priv->rfkill_mask; |
ca9152e3 HRK |
29 | } |
30 | ||
31 | void rtl8187_rfkill_init(struct ieee80211_hw *hw) | |
32 | { | |
33 | struct rtl8187_priv *priv = hw->priv; | |
34 | ||
35 | priv->rfkill_off = rtl8187_is_radio_enabled(priv); | |
36 | printk(KERN_INFO "rtl8187: wireless switch is %s\n", | |
37 | priv->rfkill_off ? "on" : "off"); | |
38 | wiphy_rfkill_set_hw_state(hw->wiphy, !priv->rfkill_off); | |
39 | wiphy_rfkill_start_polling(hw->wiphy); | |
40 | } | |
41 | ||
42 | void rtl8187_rfkill_poll(struct ieee80211_hw *hw) | |
43 | { | |
44 | bool enabled; | |
45 | struct rtl8187_priv *priv = hw->priv; | |
46 | ||
47 | mutex_lock(&priv->conf_mutex); | |
48 | enabled = rtl8187_is_radio_enabled(priv); | |
49 | if (unlikely(enabled != priv->rfkill_off)) { | |
50 | priv->rfkill_off = enabled; | |
51 | printk(KERN_INFO "rtl8187: wireless radio switch turned %s\n", | |
52 | enabled ? "on" : "off"); | |
53 | wiphy_rfkill_set_hw_state(hw->wiphy, !enabled); | |
54 | } | |
55 | mutex_unlock(&priv->conf_mutex); | |
56 | } | |
57 | ||
58 | void rtl8187_rfkill_exit(struct ieee80211_hw *hw) | |
59 | { | |
60 | wiphy_rfkill_stop_polling(hw->wiphy); | |
61 | } |