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