diff options
-rw-r--r-- | drivers/net/wireless/rt2x00/Kconfig | 30 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2400pci.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500pci.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00rfkill.c | 50 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 8 |
5 files changed, 42 insertions, 62 deletions
diff --git a/drivers/net/wireless/rt2x00/Kconfig b/drivers/net/wireless/rt2x00/Kconfig index 11f590d63aff..c896c9903879 100644 --- a/drivers/net/wireless/rt2x00/Kconfig +++ b/drivers/net/wireless/rt2x00/Kconfig | |||
@@ -40,7 +40,8 @@ config RT2X00_LIB_CRYPTO | |||
40 | config RT2X00_LIB_RFKILL | 40 | config RT2X00_LIB_RFKILL |
41 | boolean | 41 | boolean |
42 | depends on RT2X00_LIB | 42 | depends on RT2X00_LIB |
43 | select RFKILL | 43 | depends on RFKILL |
44 | default y | ||
44 | 45 | ||
45 | config RT2X00_LIB_LEDS | 46 | config RT2X00_LIB_LEDS |
46 | boolean | 47 | boolean |
@@ -57,15 +58,6 @@ config RT2400PCI | |||
57 | 58 | ||
58 | When compiled as a module, this driver will be called "rt2400pci.ko". | 59 | When compiled as a module, this driver will be called "rt2400pci.ko". |
59 | 60 | ||
60 | config RT2400PCI_RFKILL | ||
61 | bool "Ralink rt2400 rfkill support" | ||
62 | depends on RT2400PCI | ||
63 | select RT2X00_LIB_RFKILL | ||
64 | ---help--- | ||
65 | This adds support for integrated rt2400 hardware that features a | ||
66 | hardware button to control the radio state. | ||
67 | This feature depends on the RF switch subsystem rfkill. | ||
68 | |||
69 | config RT2400PCI_LEDS | 61 | config RT2400PCI_LEDS |
70 | bool "Ralink rt2400 leds support" | 62 | bool "Ralink rt2400 leds support" |
71 | depends on RT2400PCI && NEW_LEDS | 63 | depends on RT2400PCI && NEW_LEDS |
@@ -85,15 +77,6 @@ config RT2500PCI | |||
85 | 77 | ||
86 | When compiled as a module, this driver will be called "rt2500pci.ko". | 78 | When compiled as a module, this driver will be called "rt2500pci.ko". |
87 | 79 | ||
88 | config RT2500PCI_RFKILL | ||
89 | bool "Ralink rt2500 rfkill support" | ||
90 | depends on RT2500PCI | ||
91 | select RT2X00_LIB_RFKILL | ||
92 | ---help--- | ||
93 | This adds support for integrated rt2500 hardware that features a | ||
94 | hardware button to control the radio state. | ||
95 | This feature depends on the RF switch subsystem rfkill. | ||
96 | |||
97 | config RT2500PCI_LEDS | 80 | config RT2500PCI_LEDS |
98 | bool "Ralink rt2500 leds support" | 81 | bool "Ralink rt2500 leds support" |
99 | depends on RT2500PCI && NEW_LEDS | 82 | depends on RT2500PCI && NEW_LEDS |
@@ -116,15 +99,6 @@ config RT61PCI | |||
116 | 99 | ||
117 | When compiled as a module, this driver will be called "rt61pci.ko". | 100 | When compiled as a module, this driver will be called "rt61pci.ko". |
118 | 101 | ||
119 | config RT61PCI_RFKILL | ||
120 | bool "Ralink rt2501/rt61 rfkill support" | ||
121 | depends on RT61PCI | ||
122 | select RT2X00_LIB_RFKILL | ||
123 | ---help--- | ||
124 | This adds support for integrated rt61 hardware that features a | ||
125 | hardware button to control the radio state. | ||
126 | This feature depends on the RF switch subsystem rfkill. | ||
127 | |||
128 | config RT61PCI_LEDS | 102 | config RT61PCI_LEDS |
129 | bool "Ralink rt2501/rt61 leds support" | 103 | bool "Ralink rt2501/rt61 leds support" |
130 | depends on RT61PCI && NEW_LEDS | 104 | depends on RT61PCI && NEW_LEDS |
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index 18b703c3fc2c..0083e7e7dfcc 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c | |||
@@ -231,7 +231,7 @@ static const struct rt2x00debug rt2400pci_rt2x00debug = { | |||
231 | }; | 231 | }; |
232 | #endif /* CONFIG_RT2X00_LIB_DEBUGFS */ | 232 | #endif /* CONFIG_RT2X00_LIB_DEBUGFS */ |
233 | 233 | ||
234 | #ifdef CONFIG_RT2400PCI_RFKILL | 234 | #ifdef CONFIG_RT2X00_LIB_RFKILL |
235 | static int rt2400pci_rfkill_poll(struct rt2x00_dev *rt2x00dev) | 235 | static int rt2400pci_rfkill_poll(struct rt2x00_dev *rt2x00dev) |
236 | { | 236 | { |
237 | u32 reg; | 237 | u32 reg; |
@@ -241,7 +241,7 @@ static int rt2400pci_rfkill_poll(struct rt2x00_dev *rt2x00dev) | |||
241 | } | 241 | } |
242 | #else | 242 | #else |
243 | #define rt2400pci_rfkill_poll NULL | 243 | #define rt2400pci_rfkill_poll NULL |
244 | #endif /* CONFIG_RT2400PCI_RFKILL */ | 244 | #endif /* CONFIG_RT2X00_LIB_RFKILL */ |
245 | 245 | ||
246 | #ifdef CONFIG_RT2400PCI_LEDS | 246 | #ifdef CONFIG_RT2400PCI_LEDS |
247 | static void rt2400pci_brightness_set(struct led_classdev *led_cdev, | 247 | static void rt2400pci_brightness_set(struct led_classdev *led_cdev, |
@@ -1386,10 +1386,10 @@ static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev) | |||
1386 | /* | 1386 | /* |
1387 | * Detect if this device has an hardware controlled radio. | 1387 | * Detect if this device has an hardware controlled radio. |
1388 | */ | 1388 | */ |
1389 | #ifdef CONFIG_RT2400PCI_RFKILL | 1389 | #ifdef CONFIG_RT2X00_LIB_RFKILL |
1390 | if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) | 1390 | if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) |
1391 | __set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags); | 1391 | __set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags); |
1392 | #endif /* CONFIG_RT2400PCI_RFKILL */ | 1392 | #endif /* CONFIG_RT2X00_LIB_RFKILL */ |
1393 | 1393 | ||
1394 | /* | 1394 | /* |
1395 | * Check if the BBP tuning should be enabled. | 1395 | * Check if the BBP tuning should be enabled. |
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index 2a96a011f2ad..d8c9d67b8c84 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
@@ -231,7 +231,7 @@ static const struct rt2x00debug rt2500pci_rt2x00debug = { | |||
231 | }; | 231 | }; |
232 | #endif /* CONFIG_RT2X00_LIB_DEBUGFS */ | 232 | #endif /* CONFIG_RT2X00_LIB_DEBUGFS */ |
233 | 233 | ||
234 | #ifdef CONFIG_RT2500PCI_RFKILL | 234 | #ifdef CONFIG_RT2X00_LIB_RFKILL |
235 | static int rt2500pci_rfkill_poll(struct rt2x00_dev *rt2x00dev) | 235 | static int rt2500pci_rfkill_poll(struct rt2x00_dev *rt2x00dev) |
236 | { | 236 | { |
237 | u32 reg; | 237 | u32 reg; |
@@ -241,7 +241,7 @@ static int rt2500pci_rfkill_poll(struct rt2x00_dev *rt2x00dev) | |||
241 | } | 241 | } |
242 | #else | 242 | #else |
243 | #define rt2500pci_rfkill_poll NULL | 243 | #define rt2500pci_rfkill_poll NULL |
244 | #endif /* CONFIG_RT2500PCI_RFKILL */ | 244 | #endif /* CONFIG_RT2X00_LIB_RFKILL */ |
245 | 245 | ||
246 | #ifdef CONFIG_RT2500PCI_LEDS | 246 | #ifdef CONFIG_RT2500PCI_LEDS |
247 | static void rt2500pci_brightness_set(struct led_classdev *led_cdev, | 247 | static void rt2500pci_brightness_set(struct led_classdev *led_cdev, |
@@ -1545,10 +1545,10 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev) | |||
1545 | /* | 1545 | /* |
1546 | * Detect if this device has an hardware controlled radio. | 1546 | * Detect if this device has an hardware controlled radio. |
1547 | */ | 1547 | */ |
1548 | #ifdef CONFIG_RT2500PCI_RFKILL | 1548 | #ifdef CONFIG_RT2X00_LIB_RFKILL |
1549 | if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) | 1549 | if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) |
1550 | __set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags); | 1550 | __set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags); |
1551 | #endif /* CONFIG_RT2500PCI_RFKILL */ | 1551 | #endif /* CONFIG_RT2X00_LIB_RFKILL */ |
1552 | 1552 | ||
1553 | /* | 1553 | /* |
1554 | * Check if the BBP tuning should be enabled. | 1554 | * Check if the BBP tuning should be enabled. |
diff --git a/drivers/net/wireless/rt2x00/rt2x00rfkill.c b/drivers/net/wireless/rt2x00/rt2x00rfkill.c index 8a2fefb365b7..55eff58f1889 100644 --- a/drivers/net/wireless/rt2x00/rt2x00rfkill.c +++ b/drivers/net/wireless/rt2x00/rt2x00rfkill.c | |||
@@ -45,16 +45,15 @@ static int rt2x00rfkill_toggle_radio(void *data, enum rfkill_state state) | |||
45 | return 0; | 45 | return 0; |
46 | 46 | ||
47 | if (state == RFKILL_STATE_UNBLOCKED) { | 47 | if (state == RFKILL_STATE_UNBLOCKED) { |
48 | INFO(rt2x00dev, "Hardware button pressed, enabling radio.\n"); | 48 | INFO(rt2x00dev, "RFKILL event: enabling radio.\n"); |
49 | clear_bit(DEVICE_STATE_DISABLED_RADIO_HW, &rt2x00dev->flags); | 49 | clear_bit(DEVICE_STATE_DISABLED_RADIO_HW, &rt2x00dev->flags); |
50 | retval = rt2x00lib_enable_radio(rt2x00dev); | 50 | retval = rt2x00lib_enable_radio(rt2x00dev); |
51 | } else if (state == RFKILL_STATE_SOFT_BLOCKED) { | 51 | } else if (state == RFKILL_STATE_SOFT_BLOCKED) { |
52 | INFO(rt2x00dev, "Hardware button pressed, disabling radio.\n"); | 52 | INFO(rt2x00dev, "RFKILL event: disabling radio.\n"); |
53 | set_bit(DEVICE_STATE_DISABLED_RADIO_HW, &rt2x00dev->flags); | 53 | set_bit(DEVICE_STATE_DISABLED_RADIO_HW, &rt2x00dev->flags); |
54 | rt2x00lib_disable_radio(rt2x00dev); | 54 | rt2x00lib_disable_radio(rt2x00dev); |
55 | } else { | 55 | } else { |
56 | WARNING(rt2x00dev, "Received unexpected rfkill state %d.\n", | 56 | WARNING(rt2x00dev, "RFKILL event: unknown state %d.\n", state); |
57 | state); | ||
58 | } | 57 | } |
59 | 58 | ||
60 | return retval; | 59 | return retval; |
@@ -64,7 +63,12 @@ static int rt2x00rfkill_get_state(void *data, enum rfkill_state *state) | |||
64 | { | 63 | { |
65 | struct rt2x00_dev *rt2x00dev = data; | 64 | struct rt2x00_dev *rt2x00dev = data; |
66 | 65 | ||
67 | *state = rt2x00dev->rfkill->state; | 66 | /* |
67 | * rfkill_poll reports 1 when the key has been pressed and the | ||
68 | * radio should be blocked. | ||
69 | */ | ||
70 | *state = rt2x00dev->ops->lib->rfkill_poll(rt2x00dev) ? | ||
71 | RFKILL_STATE_SOFT_BLOCKED : RFKILL_STATE_UNBLOCKED; | ||
68 | 72 | ||
69 | return 0; | 73 | return 0; |
70 | } | 74 | } |
@@ -73,19 +77,18 @@ static void rt2x00rfkill_poll(struct work_struct *work) | |||
73 | { | 77 | { |
74 | struct rt2x00_dev *rt2x00dev = | 78 | struct rt2x00_dev *rt2x00dev = |
75 | container_of(work, struct rt2x00_dev, rfkill_work.work); | 79 | container_of(work, struct rt2x00_dev, rfkill_work.work); |
76 | int state; | 80 | enum rfkill_state state; |
77 | 81 | ||
78 | if (!test_bit(RFKILL_STATE_REGISTERED, &rt2x00dev->rfkill_state)) | 82 | if (!test_bit(RFKILL_STATE_REGISTERED, &rt2x00dev->rfkill_state) || |
83 | !test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags)) | ||
79 | return; | 84 | return; |
80 | 85 | ||
81 | /* | 86 | /* |
82 | * rfkill_poll reports 1 when the key has been pressed and the | 87 | * Poll latest state and report it to rfkill who should sort |
83 | * radio should be blocked. | 88 | * out if the state should be toggled or not. |
84 | */ | 89 | */ |
85 | state = !rt2x00dev->ops->lib->rfkill_poll(rt2x00dev) ? | 90 | if (!rt2x00rfkill_get_state(rt2x00dev, &state)) |
86 | RFKILL_STATE_UNBLOCKED : RFKILL_STATE_SOFT_BLOCKED; | 91 | rfkill_force_state(rt2x00dev->rfkill, state); |
87 | |||
88 | rfkill_force_state(rt2x00dev->rfkill, state); | ||
89 | 92 | ||
90 | queue_delayed_work(rt2x00dev->hw->workqueue, | 93 | queue_delayed_work(rt2x00dev->hw->workqueue, |
91 | &rt2x00dev->rfkill_work, RFKILL_POLL_INTERVAL); | 94 | &rt2x00dev->rfkill_work, RFKILL_POLL_INTERVAL); |
@@ -93,8 +96,8 @@ static void rt2x00rfkill_poll(struct work_struct *work) | |||
93 | 96 | ||
94 | void rt2x00rfkill_register(struct rt2x00_dev *rt2x00dev) | 97 | void rt2x00rfkill_register(struct rt2x00_dev *rt2x00dev) |
95 | { | 98 | { |
96 | if (!test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags) || | 99 | if (!test_bit(RFKILL_STATE_ALLOCATED, &rt2x00dev->rfkill_state) || |
97 | !test_bit(RFKILL_STATE_ALLOCATED, &rt2x00dev->rfkill_state)) | 100 | test_bit(RFKILL_STATE_REGISTERED, &rt2x00dev->rfkill_state)) |
98 | return; | 101 | return; |
99 | 102 | ||
100 | if (rfkill_register(rt2x00dev->rfkill)) { | 103 | if (rfkill_register(rt2x00dev->rfkill)) { |
@@ -114,7 +117,7 @@ void rt2x00rfkill_register(struct rt2x00_dev *rt2x00dev) | |||
114 | 117 | ||
115 | void rt2x00rfkill_unregister(struct rt2x00_dev *rt2x00dev) | 118 | void rt2x00rfkill_unregister(struct rt2x00_dev *rt2x00dev) |
116 | { | 119 | { |
117 | if (!test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags) || | 120 | if (!test_bit(RFKILL_STATE_ALLOCATED, &rt2x00dev->rfkill_state) || |
118 | !test_bit(RFKILL_STATE_REGISTERED, &rt2x00dev->rfkill_state)) | 121 | !test_bit(RFKILL_STATE_REGISTERED, &rt2x00dev->rfkill_state)) |
119 | return; | 122 | return; |
120 | 123 | ||
@@ -127,21 +130,25 @@ void rt2x00rfkill_unregister(struct rt2x00_dev *rt2x00dev) | |||
127 | 130 | ||
128 | void rt2x00rfkill_allocate(struct rt2x00_dev *rt2x00dev) | 131 | void rt2x00rfkill_allocate(struct rt2x00_dev *rt2x00dev) |
129 | { | 132 | { |
130 | if (!test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags)) | 133 | struct device *dev = wiphy_dev(rt2x00dev->hw->wiphy); |
134 | |||
135 | if (test_bit(RFKILL_STATE_ALLOCATED, &rt2x00dev->rfkill_state)) | ||
131 | return; | 136 | return; |
132 | 137 | ||
133 | rt2x00dev->rfkill = | 138 | rt2x00dev->rfkill = rfkill_allocate(dev, RFKILL_TYPE_WLAN); |
134 | rfkill_allocate(wiphy_dev(rt2x00dev->hw->wiphy), RFKILL_TYPE_WLAN); | ||
135 | if (!rt2x00dev->rfkill) { | 139 | if (!rt2x00dev->rfkill) { |
136 | ERROR(rt2x00dev, "Failed to allocate rfkill handler.\n"); | 140 | ERROR(rt2x00dev, "Failed to allocate rfkill handler.\n"); |
137 | return; | 141 | return; |
138 | } | 142 | } |
139 | 143 | ||
144 | __set_bit(RFKILL_STATE_ALLOCATED, &rt2x00dev->rfkill_state); | ||
145 | |||
140 | rt2x00dev->rfkill->name = rt2x00dev->ops->name; | 146 | rt2x00dev->rfkill->name = rt2x00dev->ops->name; |
141 | rt2x00dev->rfkill->data = rt2x00dev; | 147 | rt2x00dev->rfkill->data = rt2x00dev; |
142 | rt2x00dev->rfkill->state = -1; | 148 | rt2x00dev->rfkill->state = -1; |
143 | rt2x00dev->rfkill->toggle_radio = rt2x00rfkill_toggle_radio; | 149 | rt2x00dev->rfkill->toggle_radio = rt2x00rfkill_toggle_radio; |
144 | rt2x00dev->rfkill->get_state = rt2x00rfkill_get_state; | 150 | if (test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags)) |
151 | rt2x00dev->rfkill->get_state = rt2x00rfkill_get_state; | ||
145 | 152 | ||
146 | INIT_DELAYED_WORK(&rt2x00dev->rfkill_work, rt2x00rfkill_poll); | 153 | INIT_DELAYED_WORK(&rt2x00dev->rfkill_work, rt2x00rfkill_poll); |
147 | 154 | ||
@@ -150,8 +157,7 @@ void rt2x00rfkill_allocate(struct rt2x00_dev *rt2x00dev) | |||
150 | 157 | ||
151 | void rt2x00rfkill_free(struct rt2x00_dev *rt2x00dev) | 158 | void rt2x00rfkill_free(struct rt2x00_dev *rt2x00dev) |
152 | { | 159 | { |
153 | if (!test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags) || | 160 | if (!test_bit(RFKILL_STATE_ALLOCATED, &rt2x00dev->flags)) |
154 | !test_bit(RFKILL_STATE_ALLOCATED, &rt2x00dev->rfkill_state)) | ||
155 | return; | 161 | return; |
156 | 162 | ||
157 | cancel_delayed_work_sync(&rt2x00dev->rfkill_work); | 163 | cancel_delayed_work_sync(&rt2x00dev->rfkill_work); |
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index d740f560ccd0..a5c93520c372 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -271,7 +271,7 @@ static const struct rt2x00debug rt61pci_rt2x00debug = { | |||
271 | }; | 271 | }; |
272 | #endif /* CONFIG_RT2X00_LIB_DEBUGFS */ | 272 | #endif /* CONFIG_RT2X00_LIB_DEBUGFS */ |
273 | 273 | ||
274 | #ifdef CONFIG_RT61PCI_RFKILL | 274 | #ifdef CONFIG_RT2X00_LIB_RFKILL |
275 | static int rt61pci_rfkill_poll(struct rt2x00_dev *rt2x00dev) | 275 | static int rt61pci_rfkill_poll(struct rt2x00_dev *rt2x00dev) |
276 | { | 276 | { |
277 | u32 reg; | 277 | u32 reg; |
@@ -281,7 +281,7 @@ static int rt61pci_rfkill_poll(struct rt2x00_dev *rt2x00dev) | |||
281 | } | 281 | } |
282 | #else | 282 | #else |
283 | #define rt61pci_rfkill_poll NULL | 283 | #define rt61pci_rfkill_poll NULL |
284 | #endif /* CONFIG_RT61PCI_RFKILL */ | 284 | #endif /* CONFIG_RT2X00_LIB_RFKILL */ |
285 | 285 | ||
286 | #ifdef CONFIG_RT61PCI_LEDS | 286 | #ifdef CONFIG_RT61PCI_LEDS |
287 | static void rt61pci_brightness_set(struct led_classdev *led_cdev, | 287 | static void rt61pci_brightness_set(struct led_classdev *led_cdev, |
@@ -2313,10 +2313,10 @@ static int rt61pci_init_eeprom(struct rt2x00_dev *rt2x00dev) | |||
2313 | /* | 2313 | /* |
2314 | * Detect if this device has an hardware controlled radio. | 2314 | * Detect if this device has an hardware controlled radio. |
2315 | */ | 2315 | */ |
2316 | #ifdef CONFIG_RT61PCI_RFKILL | 2316 | #ifdef CONFIG_RT2X00_LIB_RFKILL |
2317 | if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) | 2317 | if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) |
2318 | __set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags); | 2318 | __set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags); |
2319 | #endif /* CONFIG_RT61PCI_RFKILL */ | 2319 | #endif /* CONFIG_RT2X00_LIB_RFKILL */ |
2320 | 2320 | ||
2321 | /* | 2321 | /* |
2322 | * Read frequency offset and RF programming sequence. | 2322 | * Read frequency offset and RF programming sequence. |