diff options
Diffstat (limited to 'drivers/net/wireless/libertas/cmd.c')
-rw-r--r-- | drivers/net/wireless/libertas/cmd.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index 749fbde4fd54..4454988fc00b 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <linux/kfifo.h> | 6 | #include <linux/kfifo.h> |
7 | #include <linux/sched.h> | 7 | #include <linux/sched.h> |
8 | #include <linux/slab.h> | 8 | #include <linux/slab.h> |
9 | #include <linux/if_arp.h> | ||
9 | 10 | ||
10 | #include "decl.h" | 11 | #include "decl.h" |
11 | #include "cfg.h" | 12 | #include "cfg.h" |
@@ -576,23 +577,35 @@ int lbs_set_tx_power(struct lbs_private *priv, s16 dbm) | |||
576 | return ret; | 577 | return ret; |
577 | } | 578 | } |
578 | 579 | ||
579 | static int lbs_cmd_802_11_monitor_mode(struct cmd_ds_command *cmd, | 580 | /** |
580 | u16 cmd_action, void *pdata_buf) | 581 | * @brief Enable or disable monitor mode (only implemented on OLPC usb8388 FW) |
582 | * | ||
583 | * @param priv A pointer to struct lbs_private structure | ||
584 | * @param enable 1 to enable monitor mode, 0 to disable | ||
585 | * | ||
586 | * @return 0 on success, error on failure | ||
587 | */ | ||
588 | int lbs_set_monitor_mode(struct lbs_private *priv, int enable) | ||
581 | { | 589 | { |
582 | struct cmd_ds_802_11_monitor_mode *monitor = &cmd->params.monitor; | 590 | struct cmd_ds_802_11_monitor_mode cmd; |
591 | int ret; | ||
583 | 592 | ||
584 | cmd->command = cpu_to_le16(CMD_802_11_MONITOR_MODE); | 593 | memset(&cmd, 0, sizeof(cmd)); |
585 | cmd->size = | 594 | cmd.hdr.size = cpu_to_le16(sizeof(cmd)); |
586 | cpu_to_le16(sizeof(struct cmd_ds_802_11_monitor_mode) + | 595 | cmd.action = cpu_to_le16(CMD_ACT_SET); |
587 | sizeof(struct cmd_header)); | 596 | if (enable) |
597 | cmd.mode = cpu_to_le16(0x1); | ||
588 | 598 | ||
589 | monitor->action = cpu_to_le16(cmd_action); | 599 | lbs_deb_cmd("SET_MONITOR_MODE: %d\n", enable); |
590 | if (cmd_action == CMD_ACT_SET) { | 600 | |
591 | monitor->mode = | 601 | ret = lbs_cmd_with_response(priv, CMD_802_11_MONITOR_MODE, &cmd); |
592 | cpu_to_le16((u16) (*(u32 *) pdata_buf)); | 602 | if (ret == 0) { |
603 | priv->dev->type = enable ? ARPHRD_IEEE80211_RADIOTAP : | ||
604 | ARPHRD_ETHER; | ||
593 | } | 605 | } |
594 | 606 | ||
595 | return 0; | 607 | lbs_deb_leave(LBS_DEB_CMD); |
608 | return ret; | ||
596 | } | 609 | } |
597 | 610 | ||
598 | /** | 611 | /** |
@@ -1093,11 +1106,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv, | |||
1093 | ret = lbs_cmd_reg_access(cmdptr, cmd_action, pdata_buf); | 1106 | ret = lbs_cmd_reg_access(cmdptr, cmd_action, pdata_buf); |
1094 | break; | 1107 | break; |
1095 | 1108 | ||
1096 | case CMD_802_11_MONITOR_MODE: | ||
1097 | ret = lbs_cmd_802_11_monitor_mode(cmdptr, | ||
1098 | cmd_action, pdata_buf); | ||
1099 | break; | ||
1100 | |||
1101 | case CMD_802_11_RSSI: | 1109 | case CMD_802_11_RSSI: |
1102 | ret = lbs_cmd_802_11_rssi(priv, cmdptr); | 1110 | ret = lbs_cmd_802_11_rssi(priv, cmdptr); |
1103 | break; | 1111 | break; |