aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2010-07-27 15:54:34 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-07-27 15:03:29 -0400
commita45b6f4f9ef7fde2321da5aaa7db0e1e793a5b1e (patch)
treed38142f7db7ad6b63f37ca902ff40f70bc439969 /drivers
parent98ec62185cd940765a096c88a3f14147dd1d3bd4 (diff)
libertas: clean up MONITOR_MODE command
Convert to a full direct command; previous code rolled a direct command by handle but left the original indirect command code lying around. Signed-off-by: Dan Williams <dcbw@redhat.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/libertas/cfg.c57
-rw-r--r--drivers/net/wireless/libertas/cmd.c42
-rw-r--r--drivers/net/wireless/libertas/cmd.h2
-rw-r--r--drivers/net/wireless/libertas/host.h4
4 files changed, 33 insertions, 72 deletions
diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c
index 7e0741608856..5110a771464b 100644
--- a/drivers/net/wireless/libertas/cfg.c
+++ b/drivers/net/wireless/libertas/cfg.c
@@ -7,7 +7,6 @@
7 */ 7 */
8 8
9#include <linux/slab.h> 9#include <linux/slab.h>
10#include <linux/if_arp.h>
11#include <linux/ieee80211.h> 10#include <linux/ieee80211.h>
12#include <net/cfg80211.h> 11#include <net/cfg80211.h>
13#include <asm/unaligned.h> 12#include <asm/unaligned.h>
@@ -1383,56 +1382,6 @@ static int lbs_cfg_del_key(struct wiphy *wiphy, struct net_device *netdev,
1383} 1382}
1384 1383
1385 1384
1386
1387/***************************************************************************
1388 * Monitor mode
1389 */
1390
1391/* like "struct cmd_ds_802_11_monitor_mode", but with cmd_header. Once we
1392 * get rid of WEXT, this should go into host.h */
1393struct cmd_monitor_mode {
1394 struct cmd_header hdr;
1395
1396 __le16 action;
1397 __le16 mode;
1398} __packed;
1399
1400static int lbs_enable_monitor_mode(struct lbs_private *priv, int mode)
1401{
1402 struct cmd_monitor_mode cmd;
1403 int ret;
1404
1405 lbs_deb_enter(LBS_DEB_CFG80211);
1406
1407 /*
1408 * cmd 98 00
1409 * size 0c 00
1410 * sequence xx xx
1411 * result 00 00
1412 * action 01 00 ACT_SET
1413 * enable 01 00
1414 */
1415 memset(&cmd, 0, sizeof(cmd));
1416 cmd.hdr.size = cpu_to_le16(sizeof(cmd));
1417 cmd.action = cpu_to_le16(CMD_ACT_SET);
1418 cmd.mode = cpu_to_le16(mode);
1419
1420 ret = lbs_cmd_with_response(priv, CMD_802_11_MONITOR_MODE, &cmd);
1421
1422 if (ret == 0)
1423 priv->dev->type = ARPHRD_IEEE80211_RADIOTAP;
1424 else
1425 priv->dev->type = ARPHRD_ETHER;
1426
1427 lbs_deb_leave(LBS_DEB_CFG80211);
1428 return ret;
1429}
1430
1431
1432
1433
1434
1435
1436/*************************************************************************** 1385/***************************************************************************
1437 * Get station 1386 * Get station
1438 */ 1387 */
@@ -1558,17 +1507,17 @@ static int lbs_change_intf(struct wiphy *wiphy, struct net_device *dev,
1558 1507
1559 switch (type) { 1508 switch (type) {
1560 case NL80211_IFTYPE_MONITOR: 1509 case NL80211_IFTYPE_MONITOR:
1561 ret = lbs_enable_monitor_mode(priv, 1); 1510 ret = lbs_set_monitor_mode(priv, 1);
1562 break; 1511 break;
1563 case NL80211_IFTYPE_STATION: 1512 case NL80211_IFTYPE_STATION:
1564 if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR) 1513 if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
1565 ret = lbs_enable_monitor_mode(priv, 0); 1514 ret = lbs_set_monitor_mode(priv, 0);
1566 if (!ret) 1515 if (!ret)
1567 ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 1); 1516 ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 1);
1568 break; 1517 break;
1569 case NL80211_IFTYPE_ADHOC: 1518 case NL80211_IFTYPE_ADHOC:
1570 if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR) 1519 if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
1571 ret = lbs_enable_monitor_mode(priv, 0); 1520 ret = lbs_set_monitor_mode(priv, 0);
1572 if (!ret) 1521 if (!ret)
1573 ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 2); 1522 ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 2);
1574 break; 1523 break;
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;
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 386e565d99ad..1b9092f95676 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -129,4 +129,6 @@ int lbs_set_deep_sleep(struct lbs_private *priv, int deep_sleep);
129 129
130int lbs_set_host_sleep(struct lbs_private *priv, int host_sleep); 130int lbs_set_host_sleep(struct lbs_private *priv, int host_sleep);
131 131
132int lbs_set_monitor_mode(struct lbs_private *priv, int enable);
133
132#endif /* _LBS_CMD_H */ 134#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
index 43d020cd7403..dd67334765ef 100644
--- a/drivers/net/wireless/libertas/host.h
+++ b/drivers/net/wireless/libertas/host.h
@@ -675,7 +675,10 @@ struct cmd_ds_802_11_rf_tx_power {
675 s8 minlevel; 675 s8 minlevel;
676} __packed; 676} __packed;
677 677
678/* MONITOR_MODE only exists in OLPC v5 firmware */
678struct cmd_ds_802_11_monitor_mode { 679struct cmd_ds_802_11_monitor_mode {
680 struct cmd_header hdr;
681
679 __le16 action; 682 __le16 action;
680 __le16 mode; 683 __le16 mode;
681} __packed; 684} __packed;
@@ -966,7 +969,6 @@ struct cmd_ds_command {
966 /* command Body */ 969 /* command Body */
967 union { 970 union {
968 struct cmd_ds_802_11_ps_mode psmode; 971 struct cmd_ds_802_11_ps_mode psmode;
969 struct cmd_ds_802_11_monitor_mode monitor;
970 struct cmd_ds_802_11_rssi rssi; 972 struct cmd_ds_802_11_rssi rssi;
971 struct cmd_ds_802_11_rssi_rsp rssirsp; 973 struct cmd_ds_802_11_rssi_rsp rssirsp;
972 struct cmd_ds_mac_reg_access macreg; 974 struct cmd_ds_mac_reg_access macreg;