libertas: clean up MONITOR_MODE command
authorDan Williams <dcbw@redhat.com>
Tue, 27 Jul 2010 19:54:34 +0000 (12:54 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 27 Jul 2010 19:03:29 +0000 (15:03 -0400)
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>
drivers/net/wireless/libertas/cfg.c
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/libertas/cmd.h
drivers/net/wireless/libertas/host.h

index 7e0741608856fbe00db22a53621c6c56a7626dac..5110a771464bc0e248e8c1d114850d6cd71362c6 100644 (file)
@@ -7,7 +7,6 @@
  */
 
 #include <linux/slab.h>
-#include <linux/if_arp.h>
 #include <linux/ieee80211.h>
 #include <net/cfg80211.h>
 #include <asm/unaligned.h>
@@ -1383,56 +1382,6 @@ static int lbs_cfg_del_key(struct wiphy *wiphy, struct net_device *netdev,
 }
 
 
-
-/***************************************************************************
- * Monitor mode
- */
-
-/* like "struct cmd_ds_802_11_monitor_mode", but with cmd_header. Once we
- * get rid of WEXT, this should go into host.h */
-struct cmd_monitor_mode {
-       struct cmd_header hdr;
-
-       __le16 action;
-       __le16 mode;
-} __packed;
-
-static int lbs_enable_monitor_mode(struct lbs_private *priv, int mode)
-{
-       struct cmd_monitor_mode cmd;
-       int ret;
-
-       lbs_deb_enter(LBS_DEB_CFG80211);
-
-       /*
-        * cmd       98 00
-        * size      0c 00
-        * sequence  xx xx
-        * result    00 00
-        * action    01 00    ACT_SET
-        * enable    01 00
-        */
-       memset(&cmd, 0, sizeof(cmd));
-       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
-       cmd.action = cpu_to_le16(CMD_ACT_SET);
-       cmd.mode = cpu_to_le16(mode);
-
-       ret = lbs_cmd_with_response(priv, CMD_802_11_MONITOR_MODE, &cmd);
-
-       if (ret == 0)
-               priv->dev->type = ARPHRD_IEEE80211_RADIOTAP;
-       else
-               priv->dev->type = ARPHRD_ETHER;
-
-       lbs_deb_leave(LBS_DEB_CFG80211);
-       return ret;
-}
-
-
-
-
-
-
 /***************************************************************************
  * Get station
  */
@@ -1558,17 +1507,17 @@ static int lbs_change_intf(struct wiphy *wiphy, struct net_device *dev,
 
        switch (type) {
        case NL80211_IFTYPE_MONITOR:
-               ret = lbs_enable_monitor_mode(priv, 1);
+               ret = lbs_set_monitor_mode(priv, 1);
                break;
        case NL80211_IFTYPE_STATION:
                if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
-                       ret = lbs_enable_monitor_mode(priv, 0);
+                       ret = lbs_set_monitor_mode(priv, 0);
                if (!ret)
                        ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 1);
                break;
        case NL80211_IFTYPE_ADHOC:
                if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
-                       ret = lbs_enable_monitor_mode(priv, 0);
+                       ret = lbs_set_monitor_mode(priv, 0);
                if (!ret)
                        ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 2);
                break;
index 749fbde4fd54fcb270097fc3c86686d1bc619c71..4454988fc00b317d9c8422d9a3045a139e74189e 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/kfifo.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
+#include <linux/if_arp.h>
 
 #include "decl.h"
 #include "cfg.h"
@@ -576,23 +577,35 @@ int lbs_set_tx_power(struct lbs_private *priv, s16 dbm)
        return ret;
 }
 
-static int lbs_cmd_802_11_monitor_mode(struct cmd_ds_command *cmd,
-                                     u16 cmd_action, void *pdata_buf)
+/**
+ *  @brief Enable or disable monitor mode (only implemented on OLPC usb8388 FW)
+ *
+ *  @param priv        A pointer to struct lbs_private structure
+ *  @param enable      1 to enable monitor mode, 0 to disable
+ *
+ *  @return            0 on success, error on failure
+ */
+int lbs_set_monitor_mode(struct lbs_private *priv, int enable)
 {
-       struct cmd_ds_802_11_monitor_mode *monitor = &cmd->params.monitor;
+       struct cmd_ds_802_11_monitor_mode cmd;
+       int ret;
 
-       cmd->command = cpu_to_le16(CMD_802_11_MONITOR_MODE);
-       cmd->size =
-           cpu_to_le16(sizeof(struct cmd_ds_802_11_monitor_mode) +
-                            sizeof(struct cmd_header));
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.action = cpu_to_le16(CMD_ACT_SET);
+       if (enable)
+               cmd.mode = cpu_to_le16(0x1);
 
-       monitor->action = cpu_to_le16(cmd_action);
-       if (cmd_action == CMD_ACT_SET) {
-               monitor->mode =
-                   cpu_to_le16((u16) (*(u32 *) pdata_buf));
+       lbs_deb_cmd("SET_MONITOR_MODE: %d\n", enable);
+
+       ret = lbs_cmd_with_response(priv, CMD_802_11_MONITOR_MODE, &cmd);
+       if (ret == 0) {
+               priv->dev->type = enable ? ARPHRD_IEEE80211_RADIOTAP :
+                                               ARPHRD_ETHER;
        }
 
-       return 0;
+       lbs_deb_leave(LBS_DEB_CMD);
+       return ret;
 }
 
 /**
@@ -1093,11 +1106,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
                ret = lbs_cmd_reg_access(cmdptr, cmd_action, pdata_buf);
                break;
 
-       case CMD_802_11_MONITOR_MODE:
-               ret = lbs_cmd_802_11_monitor_mode(cmdptr,
-                                         cmd_action, pdata_buf);
-               break;
-
        case CMD_802_11_RSSI:
                ret = lbs_cmd_802_11_rssi(priv, cmdptr);
                break;
index 386e565d99ad3eb7008d555fbd9eeb7733c33ceb..1b9092f95676de692962bc65f66950da8aa4afa7 100644 (file)
@@ -129,4 +129,6 @@ int lbs_set_deep_sleep(struct lbs_private *priv, int deep_sleep);
 
 int lbs_set_host_sleep(struct lbs_private *priv, int host_sleep);
 
+int lbs_set_monitor_mode(struct lbs_private *priv, int enable);
+
 #endif /* _LBS_CMD_H */
index 43d020cd7403cd8b74cb22c81996af1206001735..dd67334765ef927d51a184059ff221fe33bf136b 100644 (file)
@@ -675,7 +675,10 @@ struct cmd_ds_802_11_rf_tx_power {
        s8 minlevel;
 } __packed;
 
+/* MONITOR_MODE only exists in OLPC v5 firmware */
 struct cmd_ds_802_11_monitor_mode {
+       struct cmd_header hdr;
+
        __le16 action;
        __le16 mode;
 } __packed;
@@ -966,7 +969,6 @@ struct cmd_ds_command {
        /* command Body */
        union {
                struct cmd_ds_802_11_ps_mode psmode;
-               struct cmd_ds_802_11_monitor_mode monitor;
                struct cmd_ds_802_11_rssi rssi;
                struct cmd_ds_802_11_rssi_rsp rssirsp;
                struct cmd_ds_mac_reg_access macreg;