diff options
Diffstat (limited to 'drivers/net/wireless/wl12xx/wl1271_debugfs.c')
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_debugfs.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271_debugfs.c b/drivers/net/wireless/wl12xx/wl1271_debugfs.c index c1805e5f8964..4eaf40c57567 100644 --- a/drivers/net/wireless/wl12xx/wl1271_debugfs.c +++ b/drivers/net/wireless/wl12xx/wl1271_debugfs.c | |||
@@ -237,6 +237,57 @@ static const struct file_operations tx_queue_len_ops = { | |||
237 | .open = wl1271_open_file_generic, | 237 | .open = wl1271_open_file_generic, |
238 | }; | 238 | }; |
239 | 239 | ||
240 | static ssize_t gpio_power_read(struct file *file, char __user *user_buf, | ||
241 | size_t count, loff_t *ppos) | ||
242 | { | ||
243 | struct wl1271 *wl = file->private_data; | ||
244 | int res; | ||
245 | char buf[10]; | ||
246 | |||
247 | res = scnprintf(buf, sizeof(buf), "%d\n", wl->gpio_power); | ||
248 | |||
249 | return simple_read_from_buffer(user_buf, count, ppos, buf, res); | ||
250 | } | ||
251 | |||
252 | static ssize_t gpio_power_write(struct file *file, | ||
253 | const char __user *user_buf, | ||
254 | size_t count, loff_t *ppos) | ||
255 | { | ||
256 | struct wl1271 *wl = file->private_data; | ||
257 | char buf[10]; | ||
258 | size_t len; | ||
259 | unsigned long value; | ||
260 | int ret; | ||
261 | |||
262 | mutex_lock(&wl->mutex); | ||
263 | |||
264 | len = min(count, sizeof(buf) - 1); | ||
265 | if (copy_from_user(buf, user_buf, len)) { | ||
266 | ret = -EFAULT; | ||
267 | goto out; | ||
268 | } | ||
269 | buf[len] = '\0'; | ||
270 | |||
271 | ret = strict_strtoul(buf, 0, &value); | ||
272 | if (ret < 0) { | ||
273 | wl1271_warning("illegal value in gpio_power"); | ||
274 | goto out; | ||
275 | } | ||
276 | |||
277 | wl->set_power(!!value); | ||
278 | wl->gpio_power = !!value; | ||
279 | |||
280 | out: | ||
281 | mutex_unlock(&wl->mutex); | ||
282 | return count; | ||
283 | } | ||
284 | |||
285 | static const struct file_operations gpio_power_ops = { | ||
286 | .read = gpio_power_read, | ||
287 | .write = gpio_power_write, | ||
288 | .open = wl1271_open_file_generic | ||
289 | }; | ||
290 | |||
240 | static void wl1271_debugfs_delete_files(struct wl1271 *wl) | 291 | static void wl1271_debugfs_delete_files(struct wl1271 *wl) |
241 | { | 292 | { |
242 | DEBUGFS_FWSTATS_DEL(tx, internal_desc_overflow); | 293 | DEBUGFS_FWSTATS_DEL(tx, internal_desc_overflow); |
@@ -333,6 +384,8 @@ static void wl1271_debugfs_delete_files(struct wl1271 *wl) | |||
333 | DEBUGFS_DEL(tx_queue_len); | 384 | DEBUGFS_DEL(tx_queue_len); |
334 | DEBUGFS_DEL(retry_count); | 385 | DEBUGFS_DEL(retry_count); |
335 | DEBUGFS_DEL(excessive_retries); | 386 | DEBUGFS_DEL(excessive_retries); |
387 | |||
388 | DEBUGFS_DEL(gpio_power); | ||
336 | } | 389 | } |
337 | 390 | ||
338 | static int wl1271_debugfs_add_files(struct wl1271 *wl) | 391 | static int wl1271_debugfs_add_files(struct wl1271 *wl) |
@@ -434,6 +487,8 @@ static int wl1271_debugfs_add_files(struct wl1271 *wl) | |||
434 | DEBUGFS_ADD(retry_count, wl->debugfs.rootdir); | 487 | DEBUGFS_ADD(retry_count, wl->debugfs.rootdir); |
435 | DEBUGFS_ADD(excessive_retries, wl->debugfs.rootdir); | 488 | DEBUGFS_ADD(excessive_retries, wl->debugfs.rootdir); |
436 | 489 | ||
490 | DEBUGFS_ADD(gpio_power, wl->debugfs.rootdir); | ||
491 | |||
437 | out: | 492 | out: |
438 | if (ret < 0) | 493 | if (ret < 0) |
439 | wl1271_debugfs_delete_files(wl); | 494 | wl1271_debugfs_delete_files(wl); |