UPSTREAM: mwifiex: implement cfg80211 mgmt_frame_register handler
authorBing Zhao <bzhao@marvell.com>
Fri, 5 Oct 2012 23:02:02 +0000 (16:02 -0700)
committerGerrit <chrome-bot@google.com>
Mon, 8 Oct 2012 06:33:28 +0000 (23:33 -0700)
Add a new command to implement mgmt_frame_register.

Signed-off-by: Stone Piao <piaoyun@marvell.com>
Signed-off-by: Kiran Divekar <dkiran@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
BUG=chrome-os-partner:14959
TEST=pass pre-WiFi Cert. test case 5.2.48

Change-Id: I7ff7594ec8b7d407b8425210f2830586136ff39c
Reviewed-on: https://gerrit.chromium.org/gerrit/34851
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Ready: Bing Zhao <bzhao@marvell.com>
Tested-by: Bing Zhao <bzhao@marvell.com>
drivers/net/wireless/mwifiex/cfg80211.c
drivers/net/wireless/mwifiex/fw.h
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/sta_cmd.c
drivers/net/wireless/mwifiex/sta_cmdresp.c

index 4bc0539..1d93761 100644 (file)
@@ -208,6 +208,27 @@ mwifiex_cfg80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
        return 0;
 }
 
+/*
+ * CFG802.11 operation handler to register a mgmt frame.
+ */
+static void
+mwifiex_cfg80211_mgmt_frame_register(struct wiphy *wiphy,
+                                    struct net_device *dev,
+                                    u16 frame_type, bool reg)
+{
+       struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
+
+       if (reg)
+               priv->mgmt_frame_mask |= BIT(frame_type >> 4);
+       else
+               priv->mgmt_frame_mask &= ~BIT(frame_type >> 4);
+
+       mwifiex_send_cmd_async(priv, HostCmd_CMD_MGMT_FRAME_REG,
+                              HostCmd_ACT_GEN_SET, 0, &priv->mgmt_frame_mask);
+
+       wiphy_dbg(wiphy, "info: mgmt frame registered\n");
+}
+
 /*
  * CFG802.11 operation handler to set Tx power.
  */
@@ -1587,6 +1608,7 @@ static struct cfg80211_ops mwifiex_cfg80211_ops = {
        .add_key = mwifiex_cfg80211_add_key,
        .del_key = mwifiex_cfg80211_del_key,
        .mgmt_tx = mwifiex_cfg80211_mgmt_tx,
+       .mgmt_frame_register = mwifiex_cfg80211_mgmt_frame_register,
        .set_default_key = mwifiex_cfg80211_set_default_key,
        .set_power_mgmt = mwifiex_cfg80211_set_power_mgmt,
        .set_tx_power = mwifiex_cfg80211_set_tx_power,
index 92c2615..896e192 100644 (file)
@@ -217,6 +217,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
 #define HostCmd_CMD_CAU_REG_ACCESS                    0x00ed
 #define HostCmd_CMD_SET_BSS_MODE                      0x00f7
 #define HostCmd_CMD_PCIE_DESC_DETAILS                 0x00fa
+#define HostCmd_CMD_MGMT_FRAME_REG                    0x010c
 
 enum ENH_PS_MODES {
        EN_PS = 1,
@@ -1112,6 +1113,11 @@ struct host_cmd_ds_version_ext {
        char version_str[128];
 } __packed;
 
+struct host_cmd_ds_mgmt_frame_reg {
+       __le16 action;
+       __le32 mask;
+} __packed;
+
 struct host_cmd_ds_802_11_ibss_status {
        __le16 action;
        __le16 enable;
@@ -1204,6 +1210,7 @@ struct host_cmd_ds_command {
                struct host_cmd_ds_wmm_get_status get_wmm_status;
                struct host_cmd_ds_802_11_key_material key_material;
                struct host_cmd_ds_version_ext verext;
+               struct host_cmd_ds_mgmt_frame_reg reg_mask;
                struct host_cmd_ds_802_11_ibss_status ibss_coalescing;
                struct host_cmd_ds_mac_reg_access mac_reg;
                struct host_cmd_ds_bbp_reg_access bbp_reg;
index cd2c07b..d2a754e 100644 (file)
@@ -471,6 +471,7 @@ struct mwifiex_private {
        u8 subsc_evt_rssi_state;
        struct timer_list scan_delay_timer;
        struct mwifiex_ds_misc_subsc_evt async_subsc_evt_storage;
+       u32 mgmt_frame_mask;
 };
 
 enum mwifiex_ba_status {
index 1f71105..ce3fa4c 100644 (file)
@@ -1105,6 +1105,15 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
                ret = mwifiex_cmd_802_11_rf_channel(priv, cmd_ptr, cmd_action,
                                                    data_buf);
                break;
+       case HostCmd_CMD_MGMT_FRAME_REG:
+               cmd_ptr->command = cpu_to_le16(cmd_no);
+               cmd_ptr->params.reg_mask.action = cpu_to_le16(cmd_action);
+               cmd_ptr->params.reg_mask.mask = cpu_to_le32(*(u32 *)data_buf);
+               cmd_ptr->size =
+                       cpu_to_le16(sizeof(struct host_cmd_ds_mgmt_frame_reg) +
+                                   S_DS_GEN);
+               ret = 0;
+               break;
        case HostCmd_CMD_FUNC_INIT:
                if (priv->adapter->hw_status == MWIFIEX_HW_STATUS_RESET)
                        priv->adapter->hw_status = MWIFIEX_HW_STATUS_READY;
index 5caaf34..cdc8f2e 100644 (file)
@@ -886,6 +886,7 @@ int mwifiex_process_sta_cmdresp(struct mwifiex_private *priv, u16 cmdresp_no,
        case HostCmd_CMD_VERSION_EXT:
                ret = mwifiex_ret_ver_ext(priv, resp, data_buf);
                break;
+       case HostCmd_CMD_MGMT_FRAME_REG:
        case HostCmd_CMD_FUNC_INIT:
        case HostCmd_CMD_FUNC_SHUTDOWN:
                break;