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