mwifiex: advertise multichannel support to cfg80211
authorAvinash Patil <patila@marvell.com>
Mon, 22 Jun 2015 13:36:21 +0000 (19:06 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 21 Jul 2015 13:40:38 +0000 (16:40 +0300)
This patch adds support to advetise mwifiex multichannel support to
cfg80211. If module parameter drcs is enabled and FW supports multichannel
operation we advertise this support to cfg80211. As of now 2 simultaneous
channels are supported.

Signed-off-by: Avinash Patil <patila@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/mwifiex/cfg80211.c
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/sta_cmd.c

index 46f9dc2b1736996730cd41bdfcd0df2eb2cc5386..bc863e95114065ee889b3ae2be3795b1e4d1e819 100644 (file)
@@ -43,6 +43,15 @@ static const struct ieee80211_iface_combination mwifiex_iface_comb_ap_sta = {
        .beacon_int_infra_match = true,
 };
 
+static const struct
+ieee80211_iface_combination mwifiex_drcs_iface_comb_ap_sta = {
+       .limits = mwifiex_ap_sta_limits,
+       .num_different_channels = 2,
+       .n_limits = ARRAY_SIZE(mwifiex_ap_sta_limits),
+       .max_interfaces = MWIFIEX_MAX_BSS_NUM,
+       .beacon_int_infra_match = true,
+};
+
 /*
  * This function maps the nl802.11 channel type into driver channel type.
  *
@@ -3745,7 +3754,10 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)
        else
                wiphy->bands[IEEE80211_BAND_5GHZ] = NULL;
 
-       wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta;
+       if (adapter->drcs_enabled && ISSUPP_DRCS_ENABLED(adapter->fw_cap_info))
+               wiphy->iface_combinations = &mwifiex_drcs_iface_comb_ap_sta;
+       else
+               wiphy->iface_combinations = &mwifiex_iface_comb_ap_sta;
        wiphy->n_iface_combinations = 1;
 
        /* Initialize cipher suits */
index 6e82058c0eab11459189261bb9607d76bc1e709c..f3264f2231d33d434541720805f91ad78b4ff708 100644 (file)
@@ -985,6 +985,7 @@ struct mwifiex_adapter {
        u8 coex_win_size;
        u8 coex_tx_win_size;
        u8 coex_rx_win_size;
+       bool drcs_enabled;
 };
 
 void mwifiex_process_tx_queue(struct mwifiex_adapter *adapter);
index f250b61a9ff7952b039748f71fad576ef6116334..36cb6bdbe49bb7c183fec948c1ccbc60abb82660 100644 (file)
@@ -2155,12 +2155,17 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
                                return -1;
                }
 
-               if (ISSUPP_DRCS_ENABLED(adapter->fw_cap_info))
-                       ret = mwifiex_send_cmd(priv, HostCmd_CMD_MC_POLICY,
-                                              HostCmd_ACT_GEN_SET, 0, &drcs,
-                                              true);
+               if (drcs) {
+                       adapter->drcs_enabled = true;
+                       if (ISSUPP_DRCS_ENABLED(adapter->fw_cap_info))
+                               ret = mwifiex_send_cmd(priv,
+                                                      HostCmd_CMD_MC_POLICY,
+                                                      HostCmd_ACT_GEN_SET, 0,
+                                                      &adapter->drcs_enabled,
+                                                      true);
                        if (ret)
                                return -1;
+               }
        }
 
        /* get tx rate */