aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/libertas/cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/libertas/cmd.c')
-rw-r--r--drivers/net/wireless/libertas/cmd.c42
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
579static 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 */
588int 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;