1024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez/* 2024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * Intel Wireless WiMAX Connection 2400m 3024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * Implement backend for the WiMAX stack rfkill support 4024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 5024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 6024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * Copyright (C) 2007-2008 Intel Corporation <linux-wimax@intel.com> 7024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> 8024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 9024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * This program is free software; you can redistribute it and/or 10024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * modify it under the terms of the GNU General Public License version 11024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 2 as published by the Free Software Foundation. 12024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 13024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * This program is distributed in the hope that it will be useful, 14024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * but WITHOUT ANY WARRANTY; without even the implied warranty of 15024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * GNU General Public License for more details. 17024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 18024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * You should have received a copy of the GNU General Public License 19024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * along with this program; if not, write to the Free Software 20024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 21024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 02110-1301, USA. 22024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 23024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 24024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * The WiMAX kernel stack integrates into RF-Kill and keeps the 25024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * switches's status. We just need to: 26024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 27024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * - report changes in the HW RF Kill switch [with 28024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * wimax_rfkill_{sw,hw}_report(), which happens when we detect those 29024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * indications coming through hardware reports]. We also do it on 3025985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * initialization to let the stack know the initial HW state. 31024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 32024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * - implement indications from the stack to change the SW RF Kill 33024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * switch (coming from sysfs, the wimax stack or user space). 34024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez */ 35024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez#include "i2400m.h" 36024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez#include <linux/wimax/i2400m.h> 375a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 38024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 39024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 40024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 41024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez#define D_SUBMODULE rfkill 42024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez#include "debug-levels.h" 43024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 44024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez/* 45024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * Return true if the i2400m radio is in the requested wimax_rf_state state 46024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 47024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez */ 48024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalezstatic 49024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalezint i2400m_radio_is(struct i2400m *i2400m, enum wimax_rf_state state) 50024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez{ 51024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez if (state == WIMAX_RF_OFF) 52024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez return i2400m->state == I2400M_SS_RF_OFF 53024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez || i2400m->state == I2400M_SS_RF_SHUTDOWN; 54024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez else if (state == WIMAX_RF_ON) 55024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez /* state == WIMAX_RF_ON */ 56024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez return i2400m->state != I2400M_SS_RF_OFF 57024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez && i2400m->state != I2400M_SS_RF_SHUTDOWN; 5898eb0f53e2fc66482e2ea8033c58b20a079e5260Inaky Perez-Gonzalez else { 59024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez BUG(); 6098eb0f53e2fc66482e2ea8033c58b20a079e5260Inaky Perez-Gonzalez return -EINVAL; /* shut gcc warnings on certain arches */ 6198eb0f53e2fc66482e2ea8033c58b20a079e5260Inaky Perez-Gonzalez } 62024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez} 63024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 64024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 65024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez/* 66024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * WiMAX stack operation: implement SW RFKill toggling 67024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 68024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * @wimax_dev: device descriptor 69024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * @skb: skb where the message has been received; skb->data is 70024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * expected to point to the message payload. 71024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * @genl_info: passed by the generic netlink layer 72024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 73024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * Generic Netlink will call this function when a message is sent from 74024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * userspace to change the software RF-Kill switch status. 75024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 7625985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * This function will set the device's software RF-Kill switch state to 77024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * match what is requested. 78024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 79024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * NOTE: the i2400m has a strict state machine; we can only set the 80024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * RF-Kill switch when it is on, the HW RF-Kill is on and the 81024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * device is initialized. So we ignore errors steaming from not 82024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * being in the right state (-EILSEQ). 83024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez */ 84024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalezint i2400m_op_rfkill_sw_toggle(struct wimax_dev *wimax_dev, 85024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez enum wimax_rf_state state) 86024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez{ 87024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez int result; 88024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez struct i2400m *i2400m = wimax_dev_to_i2400m(wimax_dev); 89024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez struct device *dev = i2400m_dev(i2400m); 90024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez struct sk_buff *ack_skb; 91024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez struct { 92024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez struct i2400m_l3l4_hdr hdr; 93024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez struct i2400m_tlv_rf_operation sw_rf; 94ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet } __packed *cmd; 95024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez char strerr[32]; 96024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 97024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez d_fnstart(4, dev, "(wimax_dev %p state %d)\n", wimax_dev, state); 98024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 99024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez result = -ENOMEM; 100024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); 101024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez if (cmd == NULL) 102024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez goto error_alloc; 103024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez cmd->hdr.type = cpu_to_le16(I2400M_MT_CMD_RF_CONTROL); 104024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez cmd->hdr.length = sizeof(cmd->sw_rf); 105024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez cmd->hdr.version = cpu_to_le16(I2400M_L3L4_VERSION); 106024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez cmd->sw_rf.hdr.type = cpu_to_le16(I2400M_TLV_RF_OPERATION); 107024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez cmd->sw_rf.hdr.length = cpu_to_le16(sizeof(cmd->sw_rf.status)); 108024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez switch (state) { 109024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez case WIMAX_RF_OFF: /* RFKILL ON, radio OFF */ 110024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez cmd->sw_rf.status = cpu_to_le32(2); 111024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez break; 112024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez case WIMAX_RF_ON: /* RFKILL OFF, radio ON */ 113024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez cmd->sw_rf.status = cpu_to_le32(1); 114024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez break; 115024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez default: 116024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez BUG(); 117024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez } 118024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 119024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez ack_skb = i2400m_msg_to_dev(i2400m, cmd, sizeof(*cmd)); 120024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez result = PTR_ERR(ack_skb); 121024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez if (IS_ERR(ack_skb)) { 122024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez dev_err(dev, "Failed to issue 'RF Control' command: %d\n", 123024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez result); 124024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez goto error_msg_to_dev; 125024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez } 126024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez result = i2400m_msg_check_status(wimax_msg_data(ack_skb), 127024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez strerr, sizeof(strerr)); 128024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez if (result < 0) { 129024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez dev_err(dev, "'RF Control' (0x%04x) command failed: %d - %s\n", 130024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez I2400M_MT_CMD_RF_CONTROL, result, strerr); 131024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez goto error_cmd; 132024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez } 133024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 134024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez /* Now we wait for the state to change to RADIO_OFF or RADIO_ON */ 135024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez result = wait_event_timeout( 136024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez i2400m->state_wq, i2400m_radio_is(i2400m, state), 137024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 5 * HZ); 138024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez if (result == 0) 139024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez result = -ETIMEDOUT; 140024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez if (result < 0) 141024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez dev_err(dev, "Error waiting for device to toggle RF state: " 142024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez "%d\n", result); 143024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez result = 0; 144024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalezerror_cmd: 145024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez kfree_skb(ack_skb); 146024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalezerror_msg_to_dev: 147024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalezerror_alloc: 148024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez d_fnend(4, dev, "(wimax_dev %p state %d) = %d\n", 149024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez wimax_dev, state, result); 150024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez return result; 151024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez} 152024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 153024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 154024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez/* 155024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * Inform the WiMAX stack of changes in the RF Kill switches reported 156024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * by the device 157024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 158024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * @i2400m: device descriptor 159024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * @rfss: TLV for RF Switches status; already validated 160024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * 161024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * NOTE: the reports on RF switch status cannot be trusted 162024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * or used until the device is in a state of RADIO_OFF 163024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * or greater. 164024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez */ 165024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalezvoid i2400m_report_tlv_rf_switches_status( 166024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez struct i2400m *i2400m, 167024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez const struct i2400m_tlv_rf_switches_status *rfss) 168024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez{ 169024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez struct device *dev = i2400m_dev(i2400m); 170024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez enum i2400m_rf_switch_status hw, sw; 171024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez enum wimax_st wimax_state; 172024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 173024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez sw = le32_to_cpu(rfss->sw_rf_switch); 174024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez hw = le32_to_cpu(rfss->hw_rf_switch); 175024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 176024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez d_fnstart(3, dev, "(i2400m %p rfss %p [hw %u sw %u])\n", 177024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez i2400m, rfss, hw, sw); 178024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez /* We only process rw switch evens when the device has been 179024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez * fully initialized */ 180024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez wimax_state = wimax_state_get(&i2400m->wimax_dev); 181024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez if (wimax_state < WIMAX_ST_RADIO_OFF) { 182024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez d_printf(3, dev, "ignoring RF switches report, state %u\n", 183024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez wimax_state); 184024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez goto out; 185024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez } 186024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez switch (sw) { 187024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez case I2400M_RF_SWITCH_ON: /* RF Kill disabled (radio on) */ 188024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez wimax_report_rfkill_sw(&i2400m->wimax_dev, WIMAX_RF_ON); 189024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez break; 190024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez case I2400M_RF_SWITCH_OFF: /* RF Kill enabled (radio off) */ 191024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez wimax_report_rfkill_sw(&i2400m->wimax_dev, WIMAX_RF_OFF); 192024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez break; 193024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez default: 194024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez dev_err(dev, "HW BUG? Unknown RF SW state 0x%x\n", sw); 195024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez } 196024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez 197024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez switch (hw) { 198024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez case I2400M_RF_SWITCH_ON: /* RF Kill disabled (radio on) */ 199024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez wimax_report_rfkill_hw(&i2400m->wimax_dev, WIMAX_RF_ON); 200024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez break; 201024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez case I2400M_RF_SWITCH_OFF: /* RF Kill enabled (radio off) */ 202024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez wimax_report_rfkill_hw(&i2400m->wimax_dev, WIMAX_RF_OFF); 203024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez break; 204024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez default: 205024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez dev_err(dev, "HW BUG? Unknown RF HW state 0x%x\n", hw); 206024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez } 207024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalezout: 208024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez d_fnend(3, dev, "(i2400m %p rfss %p [hw %u sw %u]) = void\n", 209024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez i2400m, rfss, hw, sw); 210024f7f31ed15c471f80408d8b5045497e27e1135Inaky Perez-Gonzalez} 211