1ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski/*
2ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski * Linux RFKILL support for RTL8187
3ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski *
4ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski * Copyright (c) 2009 Herton Ronaldo Krzesinski <herton@mandriva.com.br>
5ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski *
6ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski * Based on the RFKILL handling in the r8187 driver, which is:
7ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski * Copyright (c) Realtek Semiconductor Corp. All rights reserved.
8ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski *
9ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski * Thanks to Realtek for their support!
10ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski *
11ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski * This program is free software; you can redistribute it and/or modify
12ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski * it under the terms of the GNU General Public License version 2 as
13ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski * published by the Free Software Foundation.
14ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski */
15ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski
16ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski#include <linux/types.h>
17ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski#include <linux/usb.h>
18ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski#include <net/mac80211.h>
19ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski
20ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski#include "rtl8187.h"
213cfeb0c33f5cbcc6dde371392877ef3101b8f805John W. Linville#include "rfkill.h"
22ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski
23ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinskistatic bool rtl8187_is_radio_enabled(struct rtl8187_priv *priv)
24ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski{
25ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	u8 gpio;
26ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski
27ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	gpio = rtl818x_ioread8(priv, &priv->map->GPIO0);
2870d57139f932b9ca21026253d02af71cf53d764aLarry Finger	rtl818x_iowrite8(priv, &priv->map->GPIO0, gpio & ~priv->rfkill_mask);
29ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	gpio = rtl818x_ioread8(priv, &priv->map->GPIO1);
30ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski
3170d57139f932b9ca21026253d02af71cf53d764aLarry Finger	return gpio & priv->rfkill_mask;
32ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski}
33ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski
34ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinskivoid rtl8187_rfkill_init(struct ieee80211_hw *hw)
35ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski{
36ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	struct rtl8187_priv *priv = hw->priv;
37ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski
38ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	priv->rfkill_off = rtl8187_is_radio_enabled(priv);
39ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	printk(KERN_INFO "rtl8187: wireless switch is %s\n",
40ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	       priv->rfkill_off ? "on" : "off");
41ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	wiphy_rfkill_set_hw_state(hw->wiphy, !priv->rfkill_off);
42ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	wiphy_rfkill_start_polling(hw->wiphy);
43ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski}
44ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski
45ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinskivoid rtl8187_rfkill_poll(struct ieee80211_hw *hw)
46ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski{
47ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	bool enabled;
48ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	struct rtl8187_priv *priv = hw->priv;
49ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski
50ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	mutex_lock(&priv->conf_mutex);
51ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	enabled = rtl8187_is_radio_enabled(priv);
52ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	if (unlikely(enabled != priv->rfkill_off)) {
53ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski		priv->rfkill_off = enabled;
54ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski		printk(KERN_INFO "rtl8187: wireless radio switch turned %s\n",
55ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski		       enabled ? "on" : "off");
56ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski		wiphy_rfkill_set_hw_state(hw->wiphy, !enabled);
57ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	}
58ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	mutex_unlock(&priv->conf_mutex);
59ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski}
60ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski
61ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinskivoid rtl8187_rfkill_exit(struct ieee80211_hw *hw)
62ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski{
63ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski	wiphy_rfkill_stop_polling(hw->wiphy);
64ca9152e37f57259ca92486ca5753af16fd9155c6Herton Ronaldo Krzesinski}
65