libertas: pass channel argument directly to lbs_mesh_config()
authorDavid Woodhouse <dwmw2@infradead.org>
Thu, 13 Dec 2007 05:32:36 +0000 (00:32 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 23:07:07 +0000 (15:07 -0800)
There is weirdness here; the firmware seems to refuse to change channels
at will.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/libertas/assoc.c
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/libertas/cmd.h
drivers/net/wireless/libertas/main.c
drivers/net/wireless/libertas/wext.c

index ff976ebcd014c87255dbe424f1e5893931bddddc..cd8e043b16f47a6ea671fd74661958e0b13730be 100644 (file)
@@ -205,13 +205,14 @@ static int assoc_helper_channel(struct lbs_private *priv,
                goto done;
 
        if (priv->mesh_dev) {
-               /* Disconnect mesh while associating -- otherwise it
-                  won't let us change channels */
-               lbs_mesh_config(priv, 0);
+               /* Change mesh channel first; 21.p21 firmware won't let
+                  you change channel otherwise (even though it'll return
+                  an error to this */
+               lbs_mesh_config(priv, 0, assoc_req->channel);
        }
 
        lbs_deb_assoc("ASSOC: channel: %d -> %d\n",
-              priv->curbssparams.channel, assoc_req->channel);
+                     priv->curbssparams.channel, assoc_req->channel);
 
        ret = lbs_set_channel(priv, assoc_req->channel);
        if (ret < 0)
@@ -244,7 +245,7 @@ static int assoc_helper_channel(struct lbs_private *priv,
 
  restore_mesh:
        if (priv->mesh_dev)
-               lbs_mesh_config(priv, 1);
+               lbs_mesh_config(priv, 1, priv->curbssparams.channel);
 
  done:
        lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
index c4299ae1774eabad3acd2a0dfc3c5586894b847d..171acc27ffba33e9599b65bc110983552b140656 100644 (file)
@@ -1114,13 +1114,13 @@ int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
 }
 EXPORT_SYMBOL_GPL(lbs_mesh_access);
 
-int lbs_mesh_config(struct lbs_private *priv, int enable)
+int lbs_mesh_config(struct lbs_private *priv, uint16_t enable, uint16_t chan)
 {
        struct cmd_ds_mesh_config cmd;
 
        memset(&cmd, 0, sizeof(cmd));
        cmd.action = cpu_to_le16(enable);
-       cmd.channel = cpu_to_le16(priv->curbssparams.channel);
+       cmd.channel = cpu_to_le16(chan);
        cmd.type = cpu_to_le16(priv->mesh_tlv);
        
        if (enable) {
@@ -1128,7 +1128,7 @@ int lbs_mesh_config(struct lbs_private *priv, int enable)
                memcpy(cmd.data, priv->mesh_ssid, priv->mesh_ssid_len);
        }
        lbs_deb_cmd("mesh config enable %d TLV %x channel %d SSID %s\n",
-                   enable, priv->mesh_tlv, priv->curbssparams.channel,
+                   enable, priv->mesh_tlv, chan,
                    escape_essid(priv->mesh_ssid, priv->mesh_ssid_len));
        return lbs_cmd_with_response(priv, CMD_MESH_CONFIG, &cmd);
 }
index 55f2436574df307465e1da77ae78bc0775c79635..a4aaa6b34a70908099d1edb2288eaad3440b49d2 100644 (file)
@@ -31,7 +31,7 @@ int lbs_set_data_rate(struct lbs_private *priv, u8 rate);
 int lbs_get_channel(struct lbs_private *priv);
 int lbs_set_channel(struct lbs_private *priv, u8 channel);
 
-int lbs_mesh_config(struct lbs_private *priv, int enable);
+int lbs_mesh_config(struct lbs_private *priv, uint16_t enable, uint16_t chan);
 
 int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria);
 int lbs_suspend(struct lbs_private *priv);
index 2409df85c2e06b52bb4632b865f61387924db743..9232b975a42c1e28d7d557e9773c32ca101af2b9 100644 (file)
@@ -344,7 +344,7 @@ static ssize_t lbs_mesh_set(struct device *dev,
        if (enable == !!priv->mesh_dev)
                return count;
 
-       ret = lbs_mesh_config(priv, enable);
+       ret = lbs_mesh_config(priv, enable, priv->curbssparams.channel);
        if (ret)
                return ret;
                
@@ -1187,9 +1187,9 @@ int lbs_start_card(struct lbs_private *priv)
 
        lbs_update_channel(priv);
        priv->mesh_tlv = 0x100 + 291;
-       if (lbs_mesh_config(priv, 1)) {
+       if (lbs_mesh_config(priv, 1, priv->curbssparams.channel)) {
                priv->mesh_tlv = 0x100 + 37;
-               if (lbs_mesh_config(priv, 1))
+               if (lbs_mesh_config(priv, 1, priv->curbssparams.channel))
                        priv->mesh_tlv = 0;
        }
        if (priv->mesh_tlv) {
index 262d4cc580460ddf224ecddecafe0fa88cb49056..b1e24723f2f9f9b83fbed281d04ec82f75d8a099 100644 (file)
@@ -1000,9 +1000,8 @@ static int lbs_mesh_set_freq(struct net_device *dev,
                else if (priv->mode == IW_MODE_ADHOC)
                        lbs_stop_adhoc_network(priv);
        }
-       priv->curbssparams.channel = fwrq->m;
-       lbs_mesh_config(priv, 0);
-       lbs_mesh_config(priv, 1);
+       lbs_mesh_config(priv, 1, fwrq->m);
+       lbs_update_channel(priv);
        ret = 0;
 
 out:
@@ -2010,7 +2009,7 @@ static int lbs_mesh_set_essid(struct net_device *dev,
                priv->mesh_ssid_len = dwrq->length;
        }
 
-       lbs_mesh_config(priv, 1);
+       lbs_mesh_config(priv, 1, priv->curbssparams.channel);
  out:
        lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
        return ret;