mwifiex: set wiphy params only once
[deliverable/linux.git] / drivers / net / wireless / mwifiex / cfg80211.c
index 7be1e9b83fd0204faff07bb0127cf1fc4a46e974..dd0e410559f8368bff0e6b745824f6a406bb815b 100644 (file)
@@ -590,77 +590,62 @@ mwifiex_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
        struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
        struct mwifiex_private *priv;
        struct mwifiex_uap_bss_param *bss_cfg;
-       int ret, bss_started, i;
-
-       for (i = 0; i < adapter->priv_num; i++) {
-               priv = adapter->priv[i];
-
-               switch (priv->bss_role) {
-               case MWIFIEX_BSS_ROLE_UAP:
-                       bss_cfg = kzalloc(sizeof(struct mwifiex_uap_bss_param),
-                                         GFP_KERNEL);
-                       if (!bss_cfg)
-                               return -ENOMEM;
-
-                       mwifiex_set_sys_config_invalid_data(bss_cfg);
-
-                       if (changed & WIPHY_PARAM_RTS_THRESHOLD)
-                               bss_cfg->rts_threshold = wiphy->rts_threshold;
-                       if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
-                               bss_cfg->frag_threshold = wiphy->frag_threshold;
-                       if (changed & WIPHY_PARAM_RETRY_LONG)
-                               bss_cfg->retry_limit = wiphy->retry_long;
-
-                       bss_started = priv->bss_started;
-
-                       ret = mwifiex_send_cmd(priv, HostCmd_CMD_UAP_BSS_STOP,
-                                              HostCmd_ACT_GEN_SET, 0,
-                                              NULL, true);
-                       if (ret) {
-                               wiphy_err(wiphy, "Failed to stop the BSS\n");
-                               kfree(bss_cfg);
-                               return ret;
-                       }
+       int ret;
 
-                       ret = mwifiex_send_cmd(priv, HostCmd_CMD_UAP_SYS_CONFIG,
-                                              HostCmd_ACT_GEN_SET,
-                                              UAP_BSS_PARAMS_I, bss_cfg,
-                                              false);
+       priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
 
-                       kfree(bss_cfg);
+       switch (priv->bss_role) {
+       case MWIFIEX_BSS_ROLE_UAP:
+               if (priv->bss_started) {
+                       dev_err(adapter->dev,
+                               "cannot change wiphy params when bss started");
+                       return -EINVAL;
+               }
 
-                       if (ret) {
-                               wiphy_err(wiphy, "Failed to set bss config\n");
-                               return ret;
-                       }
+               bss_cfg = kzalloc(sizeof(*bss_cfg), GFP_KERNEL);
+               if (!bss_cfg)
+                       return -ENOMEM;
 
-                       if (!bss_started)
-                               break;
+               mwifiex_set_sys_config_invalid_data(bss_cfg);
 
-                       ret = mwifiex_send_cmd(priv, HostCmd_CMD_UAP_BSS_START,
-                                              HostCmd_ACT_GEN_SET, 0,
-                                              NULL, false);
-                       if (ret) {
-                               wiphy_err(wiphy, "Failed to start BSS\n");
-                               return ret;
-                       }
+               if (changed & WIPHY_PARAM_RTS_THRESHOLD)
+                       bss_cfg->rts_threshold = wiphy->rts_threshold;
+               if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
+                       bss_cfg->frag_threshold = wiphy->frag_threshold;
+               if (changed & WIPHY_PARAM_RETRY_LONG)
+                       bss_cfg->retry_limit = wiphy->retry_long;
+
+               ret = mwifiex_send_cmd(priv, HostCmd_CMD_UAP_SYS_CONFIG,
+                                      HostCmd_ACT_GEN_SET,
+                                      UAP_BSS_PARAMS_I, bss_cfg,
+                                      false);
+
+               kfree(bss_cfg);
+               if (ret) {
+                       wiphy_err(wiphy, "Failed to set wiphy phy params\n");
+                       return ret;
+               }
+               break;
 
-                       break;
                case MWIFIEX_BSS_ROLE_STA:
-                       if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
-                               ret = mwifiex_set_rts(priv,
-                                                     wiphy->rts_threshold);
-                               if (ret)
-                                       return ret;
-                       }
-                       if (changed & WIPHY_PARAM_FRAG_THRESHOLD) {
-                               ret = mwifiex_set_frag(priv,
-                                                      wiphy->frag_threshold);
-                               if (ret)
-                                       return ret;
-                       }
-                       break;
+               if (priv->media_connected) {
+                       dev_err(adapter->dev,
+                               "cannot change wiphy params when connected");
+                       return -EINVAL;
+               }
+               if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
+                       ret = mwifiex_set_rts(priv,
+                                             wiphy->rts_threshold);
+                       if (ret)
+                               return ret;
                }
+               if (changed & WIPHY_PARAM_FRAG_THRESHOLD) {
+                       ret = mwifiex_set_frag(priv,
+                                              wiphy->frag_threshold);
+                       if (ret)
+                               return ret;
+               }
+               break;
        }
 
        return 0;
This page took 0.025616 seconds and 5 git commands to generate.