]> err.no Git - linux-2.6/blobdiff - drivers/net/wireless/libertas/join.c
Pull battery into release branch
[linux-2.6] / drivers / net / wireless / libertas / join.c
index 11682cbe752b841ffb37e497a69a7abcf9d1b9d0..78ac3064a0bd20d3852c1d1e7b530573df26aa9a 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
 #include <linux/wireless.h>
+#include <linux/etherdevice.h>
 
 #include <net/iw_handler.h>
 
@@ -14,6 +15,9 @@
 #include "decl.h"
 #include "join.h"
 #include "dev.h"
+#include "assoc.h"
+
+#define AD_HOC_CAP_PRIVACY_ON 1
 
 /**
  *  @brief This function finds out the common rates between rate1 and rate2.
@@ -58,7 +62,7 @@ static int get_common_rates(wlan_adapter * adapter, u8 * rate1,
        lbs_dbg_hex("rate1 (AP) rates:", tmp, sizeof(tmp));
        lbs_dbg_hex("rate2 (Card) rates:", rate2, rate2_size);
        lbs_dbg_hex("Common rates:", ptr, rate1_size);
-       lbs_pr_debug(1, "Tx datarate is set to 0x%X\n", adapter->datarate);
+       lbs_deb_join("Tx datarate is set to 0x%X\n", adapter->datarate);
 
        if (!adapter->is_datarate_auto) {
                while (*ptr) {
@@ -85,7 +89,7 @@ int libertas_send_deauth(wlan_private * priv)
        wlan_adapter *adapter = priv->adapter;
        int ret = 0;
 
-       if (adapter->inframode == wlan802_11infrastructure &&
+       if (adapter->mode == IW_MODE_INFRA &&
            adapter->connect_status == libertas_connected)
                ret = libertas_send_deauthentication(priv);
        else
@@ -94,20 +98,6 @@ int libertas_send_deauth(wlan_private * priv)
        return ret;
 }
 
-int libertas_do_adhocstop_ioctl(wlan_private * priv)
-{
-       wlan_adapter *adapter = priv->adapter;
-       int ret = 0;
-
-       if (adapter->inframode == wlan802_11ibss &&
-           adapter->connect_status == libertas_connected)
-               ret = libertas_stop_adhoc_network(priv);
-       else
-               ret = -ENOTSUPP;
-
-       return ret;
-}
-
 /**
  *  @brief Associate to a specific BSS discovered in a scan
  *
@@ -116,24 +106,22 @@ int libertas_do_adhocstop_ioctl(wlan_private * priv)
  *
  *  @return          0-success, otherwise fail
  */
-int wlan_associate(wlan_private * priv, struct bss_descriptor * pbssdesc)
+int wlan_associate(wlan_private * priv, struct assoc_request * assoc_req)
 {
        wlan_adapter *adapter = priv->adapter;
        int ret;
 
-       ENTER();
+       lbs_deb_enter(LBS_DEB_JOIN);
 
        ret = libertas_prepare_and_send_command(priv, cmd_802_11_authenticate,
                                    0, cmd_option_waitforrsp,
-                                   0, pbssdesc->macaddress);
+                                   0, assoc_req->bss.bssid);
 
-       if (ret) {
-               LEAVE();
-               return ret;
-       }
+       if (ret)
+               goto done;
 
        /* set preamble to firmware */
-       if (adapter->capinfo.shortpreamble && pbssdesc->cap.shortpreamble)
+       if (adapter->capinfo.shortpreamble && assoc_req->bss.cap.shortpreamble)
                adapter->preamble = cmd_type_short_preamble;
        else
                adapter->preamble = cmd_type_long_preamble;
@@ -141,9 +129,10 @@ int wlan_associate(wlan_private * priv, struct bss_descriptor * pbssdesc)
        libertas_set_radio_control(priv);
 
        ret = libertas_prepare_and_send_command(priv, cmd_802_11_associate,
-                                   0, cmd_option_waitforrsp, 0, pbssdesc);
+                                   0, cmd_option_waitforrsp, 0, assoc_req);
 
-       LEAVE();
+done:
+       lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret);
        return ret;
 }
 
@@ -154,7 +143,7 @@ int wlan_associate(wlan_private * priv, struct bss_descriptor * pbssdesc)
  *  @param adhocssid    The ssid of the Adhoc Network
  *  @return             0--success, -1--fail
  */
-int libertas_start_adhoc_network(wlan_private * priv, struct WLAN_802_11_SSID *adhocssid)
+int libertas_start_adhoc_network(wlan_private * priv, struct assoc_request * assoc_req)
 {
        wlan_adapter *adapter = priv->adapter;
        int ret = 0;
@@ -162,22 +151,20 @@ int libertas_start_adhoc_network(wlan_private * priv, struct WLAN_802_11_SSID *a
        adapter->adhoccreate = 1;
 
        if (!adapter->capinfo.shortpreamble) {
-               lbs_pr_debug(1, "AdhocStart: Long preamble\n");
+               lbs_deb_join("AdhocStart: Long preamble\n");
                adapter->preamble = cmd_type_long_preamble;
        } else {
-               lbs_pr_debug(1, "AdhocStart: Short preamble\n");
+               lbs_deb_join("AdhocStart: Short preamble\n");
                adapter->preamble = cmd_type_short_preamble;
        }
 
        libertas_set_radio_control(priv);
 
-       lbs_pr_debug(1, "Adhoc channel = %d\n", adapter->adhocchannel);
-       lbs_pr_debug(1, "curbssparams.channel = %d\n",
-              adapter->curbssparams.channel);
-       lbs_pr_debug(1, "curbssparams.band = %d\n", adapter->curbssparams.band);
+       lbs_deb_join("AdhocStart: channel = %d\n", assoc_req->channel);
+       lbs_deb_join("AdhocStart: band = %d\n", assoc_req->band);
 
        ret = libertas_prepare_and_send_command(priv, cmd_802_11_ad_hoc_start,
-                                   0, cmd_option_waitforrsp, 0, adhocssid);
+                                   0, cmd_option_waitforrsp, 0, assoc_req);
 
        return ret;
 }
@@ -191,53 +178,53 @@ int libertas_start_adhoc_network(wlan_private * priv, struct WLAN_802_11_SSID *a
  *
  *  @return             0--success, -1--fail
  */
-int libertas_join_adhoc_network(wlan_private * priv, struct bss_descriptor * pbssdesc)
+int libertas_join_adhoc_network(wlan_private * priv, struct assoc_request * assoc_req)
 {
        wlan_adapter *adapter = priv->adapter;
+       struct bss_descriptor * bss = &assoc_req->bss;
        int ret = 0;
 
-       lbs_pr_debug(1, "libertas_join_adhoc_network: CurBss.ssid =%s\n",
-              adapter->curbssparams.ssid.ssid);
-       lbs_pr_debug(1, "libertas_join_adhoc_network: CurBss.ssid_len =%u\n",
-              adapter->curbssparams.ssid.ssidlength);
-       lbs_pr_debug(1, "libertas_join_adhoc_network: ssid =%s\n", pbssdesc->ssid.ssid);
-       lbs_pr_debug(1, "libertas_join_adhoc_network: ssid len =%u\n",
-              pbssdesc->ssid.ssidlength);
+       lbs_deb_join("%s: Current SSID '%s', ssid length %u\n",
+                    __func__,
+                    escape_essid(adapter->curbssparams.ssid,
+                                 adapter->curbssparams.ssid_len),
+                    adapter->curbssparams.ssid_len);
+       lbs_deb_join("%s: requested ssid '%s', ssid length %u\n",
+                    __func__, escape_essid(bss->ssid, bss->ssid_len),
+                    bss->ssid_len);
 
        /* check if the requested SSID is already joined */
-       if (adapter->curbssparams.ssid.ssidlength
-           && !libertas_SSID_cmp(&pbssdesc->ssid, &adapter->curbssparams.ssid)
-           && (adapter->curbssparams.bssdescriptor.inframode ==
-               wlan802_11ibss)) {
-
-        lbs_pr_debug(1,
+       if (adapter->curbssparams.ssid_len
+           && !libertas_ssid_cmp(adapter->curbssparams.ssid,
+                                 adapter->curbssparams.ssid_len,
+                                 bss->ssid, bss->ssid_len)
+           && (adapter->mode == IW_MODE_ADHOC)) {
+               lbs_deb_join(
                       "ADHOC_J_CMD: New ad-hoc SSID is the same as current, "
                       "not attempting to re-join");
-
                return -1;
        }
 
        /*Use shortpreamble only when both creator and card supports
           short preamble */
-       if (!pbssdesc->cap.shortpreamble || !adapter->capinfo.shortpreamble) {
-               lbs_pr_debug(1, "AdhocJoin: Long preamble\n");
+       if (!bss->cap.shortpreamble || !adapter->capinfo.shortpreamble) {
+               lbs_deb_join("AdhocJoin: Long preamble\n");
                adapter->preamble = cmd_type_long_preamble;
        } else {
-               lbs_pr_debug(1, "AdhocJoin: Short preamble\n");
+               lbs_deb_join("AdhocJoin: Short preamble\n");
                adapter->preamble = cmd_type_short_preamble;
        }
 
        libertas_set_radio_control(priv);
 
-       lbs_pr_debug(1, "curbssparams.channel = %d\n",
-              adapter->curbssparams.channel);
-       lbs_pr_debug(1, "curbssparams.band = %c\n", adapter->curbssparams.band);
+       lbs_deb_join("AdhocJoin: channel = %d\n", assoc_req->channel);
+       lbs_deb_join("AdhocJoin: band = %c\n", assoc_req->band);
 
        adapter->adhoccreate = 0;
 
        ret = libertas_prepare_and_send_command(priv, cmd_802_11_ad_hoc_join,
                                    0, cmd_option_waitforrsp,
-                                   OID_802_11_SSID, pbssdesc);
+                                   OID_802_11_SSID, assoc_req);
 
        return ret;
 }
@@ -260,130 +247,6 @@ int libertas_send_deauthentication(wlan_private * priv)
                                     0, cmd_option_waitforrsp, 0, NULL);
 }
 
-/**
- *  @brief Set Idle Off
- *
- *  @param priv         A pointer to wlan_private structure
- *  @return             0 --success, otherwise fail
- */
-int libertas_idle_off(wlan_private * priv)
-{
-       wlan_adapter *adapter = priv->adapter;
-       int ret = 0;
-       const u8 zeromac[] = { 0, 0, 0, 0, 0, 0 };
-       int i;
-
-       ENTER();
-
-       if (adapter->connect_status == libertas_disconnected) {
-               if (adapter->inframode == wlan802_11infrastructure) {
-                       if (memcmp(adapter->previousbssid, zeromac,
-                                  sizeof(zeromac)) != 0) {
-
-                               lbs_pr_debug(1, "Previous SSID = %s\n",
-                                      adapter->previousssid.ssid);
-                               lbs_pr_debug(1, "Previous BSSID = "
-                                      "%02x:%02x:%02x:%02x:%02x:%02x:\n",
-                                      adapter->previousbssid[0],
-                                      adapter->previousbssid[1],
-                                      adapter->previousbssid[2],
-                                      adapter->previousbssid[3],
-                                      adapter->previousbssid[4],
-                                      adapter->previousbssid[5]);
-
-                               i = libertas_find_SSID_in_list(adapter,
-                                                  &adapter->previousssid,
-                                                  adapter->previousbssid,
-                                                  adapter->inframode);
-
-                               if (i < 0) {
-                                       libertas_send_specific_BSSID_scan(priv,
-                                                             adapter->
-                                                             previousbssid,
-                                                             1);
-                                       i = libertas_find_SSID_in_list(adapter,
-                                                          &adapter->
-                                                          previousssid,
-                                                          adapter->
-                                                          previousbssid,
-                                                          adapter->
-                                                          inframode);
-                               }
-
-                               if (i < 0) {
-                                       /* If the BSSID could not be found, try just the SSID */
-                                       i = libertas_find_SSID_in_list(adapter,
-                                                          &adapter->
-                                                          previousssid, NULL,
-                                                          adapter->
-                                                          inframode);
-                               }
-
-                               if (i < 0) {
-                                       libertas_send_specific_SSID_scan(priv,
-                                                            &adapter->
-                                                            previousssid,
-                                                            1);
-                                       i = libertas_find_SSID_in_list(adapter,
-                                                          &adapter->
-                                                          previousssid, NULL,
-                                                          adapter->
-                                                          inframode);
-                               }
-
-                               if (i >= 0) {
-                                       ret =
-                                           wlan_associate(priv,
-                                                          &adapter->
-                                                          scantable[i]);
-                               }
-                       }
-               } else if (adapter->inframode == wlan802_11ibss) {
-                       ret = libertas_prepare_and_send_command(priv,
-                                                   cmd_802_11_ad_hoc_start,
-                                                   0,
-                                                   cmd_option_waitforrsp,
-                                                   0, &adapter->previousssid);
-               }
-       }
-       /* else it is connected */
-
-       lbs_pr_debug(1, "\nwlanidle is off");
-       LEAVE();
-       return ret;
-}
-
-/**
- *  @brief Set Idle On
- *
- *  @param priv         A pointer to wlan_private structure
- *  @return             0 --success, otherwise fail
- */
-int libertas_idle_on(wlan_private * priv)
-{
-       wlan_adapter *adapter = priv->adapter;
-       int ret = 0;
-
-       if (adapter->connect_status == libertas_connected) {
-               if (adapter->inframode == wlan802_11infrastructure) {
-                       lbs_pr_debug(1, "Previous SSID = %s\n",
-                              adapter->previousssid.ssid);
-                       memmove(&adapter->previousssid,
-                               &adapter->curbssparams.ssid,
-                               sizeof(struct WLAN_802_11_SSID));
-                       libertas_send_deauth(priv);
-
-               } else if (adapter->inframode == wlan802_11ibss) {
-                       ret = libertas_stop_adhoc_network(priv);
-               }
-
-       }
-
-       lbs_pr_debug(1, "\nwlanidle is on");
-
-       return ret;
-}
-
 /**
  *  @brief This function prepares command of authenticate.
  *
@@ -398,22 +261,42 @@ int libertas_cmd_80211_authenticate(wlan_private * priv,
                                 void *pdata_buf)
 {
        wlan_adapter *adapter = priv->adapter;
-       struct cmd_ds_802_11_authenticate *pauthenticate =
-           &cmd->params.auth;
+       struct cmd_ds_802_11_authenticate *pauthenticate = &cmd->params.auth;
+       int ret = -1;
        u8 *bssid = pdata_buf;
 
+       lbs_deb_enter(LBS_DEB_JOIN);
+
        cmd->command = cpu_to_le16(cmd_802_11_authenticate);
-       cmd->size =
-           cpu_to_le16(sizeof(struct cmd_ds_802_11_authenticate)
-                            + S_DS_GEN);
+       cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_authenticate)
+                               + S_DS_GEN);
+
+       /* translate auth mode to 802.11 defined wire value */
+       switch (adapter->secinfo.auth_mode) {
+       case IW_AUTH_ALG_OPEN_SYSTEM:
+               pauthenticate->authtype = 0x00;
+               break;
+       case IW_AUTH_ALG_SHARED_KEY:
+               pauthenticate->authtype = 0x01;
+               break;
+       case IW_AUTH_ALG_LEAP:
+               pauthenticate->authtype = 0x80;
+               break;
+       default:
+               lbs_deb_join("AUTH_CMD: invalid auth alg 0x%X\n",
+                            adapter->secinfo.auth_mode);
+               goto out;
+       }
 
-       pauthenticate->authtype = adapter->secinfo.authmode;
        memcpy(pauthenticate->macaddr, bssid, ETH_ALEN);
 
-       lbs_pr_debug(1, "AUTH_CMD: Bssid is : %x:%x:%x:%x:%x:%x\n",
-              bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
+       lbs_deb_join("AUTH_CMD: BSSID is : " MAC_FMT " auth=0x%X\n",
+                    MAC_ARG(bssid), pauthenticate->authtype);
+       ret = 0;
 
-       return 0;
+out:
+       lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret);
+       return ret;
 }
 
 int libertas_cmd_80211_deauthenticate(wlan_private * priv,
@@ -422,22 +305,20 @@ int libertas_cmd_80211_deauthenticate(wlan_private * priv,
        wlan_adapter *adapter = priv->adapter;
        struct cmd_ds_802_11_deauthenticate *dauth = &cmd->params.deauth;
 
-       ENTER();
+       lbs_deb_enter(LBS_DEB_JOIN);
 
        cmd->command = cpu_to_le16(cmd_802_11_deauthenticate);
-       cmd->size =
-           cpu_to_le16(sizeof(struct cmd_ds_802_11_deauthenticate) +
+       cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_deauthenticate) +
                             S_DS_GEN);
 
        /* set AP MAC address */
-       memmove(dauth->macaddr, adapter->curbssparams.bssid,
-               ETH_ALEN);
+       memmove(dauth->macaddr, adapter->curbssparams.bssid, ETH_ALEN);
 
        /* Reason code 3 = Station is leaving */
 #define REASON_CODE_STA_LEAVING 3
        dauth->reasoncode = cpu_to_le16(REASON_CODE_STA_LEAVING);
 
-       LEAVE();
+       lbs_deb_leave(LBS_DEB_JOIN);
        return 0;
 }
 
@@ -447,20 +328,20 @@ int libertas_cmd_80211_associate(wlan_private * priv,
        wlan_adapter *adapter = priv->adapter;
        struct cmd_ds_802_11_associate *passo = &cmd->params.associate;
        int ret = 0;
-       struct bss_descriptor *pbssdesc;
+       struct assoc_request * assoc_req = pdata_buf;
+       struct bss_descriptor * bss = &assoc_req->bss;
        u8 *card_rates;
        u8 *pos;
        int card_rates_size;
-       u16 tmpcap;
+       u16 tmpcap, tmplen;
        struct mrvlietypes_ssidparamset *ssid;
        struct mrvlietypes_phyparamset *phy;
        struct mrvlietypes_ssparamset *ss;
        struct mrvlietypes_ratesparamset *rates;
        struct mrvlietypes_rsnparamset *rsn;
 
-       ENTER();
+       lbs_deb_enter(LBS_DEB_JOIN);
 
-       pbssdesc = pdata_buf;
        pos = (u8 *) passo;
 
        if (!adapter) {
@@ -470,15 +351,11 @@ int libertas_cmd_80211_associate(wlan_private * priv,
 
        cmd->command = cpu_to_le16(cmd_802_11_associate);
 
-       /* Save so we know which BSS Desc to use in the response handler */
-       adapter->pattemptedbssdesc = pbssdesc;
-
-       memcpy(passo->peerstaaddr,
-              pbssdesc->macaddress, sizeof(passo->peerstaaddr));
+       memcpy(passo->peerstaaddr, bss->bssid, sizeof(passo->peerstaaddr));
        pos += sizeof(passo->peerstaaddr);
 
        /* set the listen interval */
-       passo->listeninterval = adapter->listeninterval;
+       passo->listeninterval = cpu_to_le16(adapter->listeninterval);
 
        pos += sizeof(passo->capinfo);
        pos += sizeof(passo->listeninterval);
@@ -487,30 +364,30 @@ int libertas_cmd_80211_associate(wlan_private * priv,
 
        ssid = (struct mrvlietypes_ssidparamset *) pos;
        ssid->header.type = cpu_to_le16(TLV_TYPE_SSID);
-       ssid->header.len = pbssdesc->ssid.ssidlength;
-       memcpy(ssid->ssid, pbssdesc->ssid.ssid, ssid->header.len);
-       pos += sizeof(ssid->header) + ssid->header.len;
-       ssid->header.len = cpu_to_le16(ssid->header.len);
+       tmplen = bss->ssid_len;
+       ssid->header.len = cpu_to_le16(tmplen);
+       memcpy(ssid->ssid, bss->ssid, tmplen);
+       pos += sizeof(ssid->header) + tmplen;
 
        phy = (struct mrvlietypes_phyparamset *) pos;
        phy->header.type = cpu_to_le16(TLV_TYPE_PHY_DS);
-       phy->header.len = sizeof(phy->fh_ds.dsparamset);
+       tmplen = sizeof(phy->fh_ds.dsparamset);
+       phy->header.len = cpu_to_le16(tmplen);
        memcpy(&phy->fh_ds.dsparamset,
-              &pbssdesc->phyparamset.dsparamset.currentchan,
-              sizeof(phy->fh_ds.dsparamset));
-       pos += sizeof(phy->header) + phy->header.len;
-       phy->header.len = cpu_to_le16(phy->header.len);
+              &bss->phyparamset.dsparamset.currentchan,
+              tmplen);
+       pos += sizeof(phy->header) + tmplen;
 
        ss = (struct mrvlietypes_ssparamset *) pos;
        ss->header.type = cpu_to_le16(TLV_TYPE_CF);
-       ss->header.len = sizeof(ss->cf_ibss.cfparamset);
-       pos += sizeof(ss->header) + ss->header.len;
-       ss->header.len = cpu_to_le16(ss->header.len);
+       tmplen = sizeof(ss->cf_ibss.cfparamset);
+       ss->header.len = cpu_to_le16(tmplen);
+       pos += sizeof(ss->header) + tmplen;
 
        rates = (struct mrvlietypes_ratesparamset *) pos;
        rates->header.type = cpu_to_le16(TLV_TYPE_RATES);
 
-       memcpy(&rates->rates, &pbssdesc->libertas_supported_rates, WLAN_SUPPORTED_RATES);
+       memcpy(&rates->rates, &bss->libertas_supported_rates, WLAN_SUPPORTED_RATES);
 
        card_rates = libertas_supported_rates;
        card_rates_size = sizeof(libertas_supported_rates);
@@ -521,41 +398,42 @@ int libertas_cmd_80211_associate(wlan_private * priv,
                goto done;
        }
 
-       rates->header.len = min_t(size_t, strlen(rates->rates), WLAN_SUPPORTED_RATES);
-       adapter->curbssparams.numofrates = rates->header.len;
+       tmplen = min_t(size_t, strlen(rates->rates), WLAN_SUPPORTED_RATES);
+       adapter->curbssparams.numofrates = tmplen;
 
-       pos += sizeof(rates->header) + rates->header.len;
-       rates->header.len = cpu_to_le16(rates->header.len);
+       pos += sizeof(rates->header) + tmplen;
+       rates->header.len = cpu_to_le16(tmplen);
 
-       if (adapter->secinfo.WPAenabled || adapter->secinfo.WPA2enabled) {
+       if (assoc_req->secinfo.WPAenabled || assoc_req->secinfo.WPA2enabled) {
                rsn = (struct mrvlietypes_rsnparamset *) pos;
-               rsn->header.type = (u16) adapter->wpa_ie[0];    /* WPA_IE or WPA2_IE */
-               rsn->header.type = cpu_to_le16(rsn->header.type);
-               rsn->header.len = (u16) adapter->wpa_ie[1];
-               memcpy(rsn->rsnie, &adapter->wpa_ie[2], rsn->header.len);
+               /* WPA_IE or WPA2_IE */
+               rsn->header.type = cpu_to_le16((u16) assoc_req->wpa_ie[0]);
+               tmplen = (u16) assoc_req->wpa_ie[1];
+               rsn->header.len = cpu_to_le16(tmplen);
+               memcpy(rsn->rsnie, &assoc_req->wpa_ie[2], tmplen);
                lbs_dbg_hex("ASSOC_CMD: RSN IE", (u8 *) rsn,
-                       sizeof(rsn->header) + rsn->header.len);
-               pos += sizeof(rsn->header) + rsn->header.len;
-               rsn->header.len = cpu_to_le16(rsn->header.len);
+                       sizeof(rsn->header) + tmplen);
+               pos += sizeof(rsn->header) + tmplen;
        }
 
        /* update curbssparams */
-       adapter->curbssparams.channel =
-           (pbssdesc->phyparamset.dsparamset.currentchan);
+       adapter->curbssparams.channel = bss->phyparamset.dsparamset.currentchan;
 
        /* Copy the infra. association rates into Current BSS state structure */
        memcpy(&adapter->curbssparams.datarates, &rates->rates,
-              min_t(size_t, sizeof(adapter->curbssparams.datarates), rates->header.len));
+              min_t(size_t, sizeof(adapter->curbssparams.datarates),
+                    cpu_to_le16(rates->header.len)));
 
-       lbs_pr_debug(1, "ASSOC_CMD: rates->header.len = %d\n", rates->header.len);
+       lbs_deb_join("ASSOC_CMD: rates->header.len = %d\n",
+                    cpu_to_le16(rates->header.len));
 
        /* set IBSS field */
-       if (pbssdesc->inframode == wlan802_11infrastructure) {
+       if (bss->mode == IW_MODE_INFRA) {
 #define CAPINFO_ESS_MODE 1
                passo->capinfo.ess = CAPINFO_ESS_MODE;
        }
 
-       if (libertas_parse_dnld_countryinfo_11d(priv)) {
+       if (libertas_parse_dnld_countryinfo_11d(priv, bss)) {
                ret = -1;
                goto done;
        }
@@ -563,31 +441,28 @@ int libertas_cmd_80211_associate(wlan_private * priv,
        cmd->size = cpu_to_le16((u16) (pos - (u8 *) passo) + S_DS_GEN);
 
        /* set the capability info at last */
-       memcpy(&tmpcap, &pbssdesc->cap, sizeof(passo->capinfo));
+       memcpy(&tmpcap, &bss->cap, sizeof(passo->capinfo));
        tmpcap &= CAPINFO_MASK;
-       lbs_pr_debug(1, "ASSOC_CMD: tmpcap=%4X CAPINFO_MASK=%4X\n",
-              tmpcap, CAPINFO_MASK);
-       tmpcap = cpu_to_le16(tmpcap);
+       lbs_deb_join("ASSOC_CMD: tmpcap=%4X CAPINFO_MASK=%4X\n",
+                    tmpcap, CAPINFO_MASK);
        memcpy(&passo->capinfo, &tmpcap, sizeof(passo->capinfo));
 
-      done:
-       LEAVE();
+done:
+       lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret);
        return ret;
 }
 
 int libertas_cmd_80211_ad_hoc_start(wlan_private * priv,
-                                struct cmd_ds_command *cmd, void *pssid)
+                                struct cmd_ds_command *cmd, void *pdata_buf)
 {
        wlan_adapter *adapter = priv->adapter;
        struct cmd_ds_802_11_ad_hoc_start *adhs = &cmd->params.ads;
        int ret = 0;
        int cmdappendsize = 0;
        int i;
-       u16 tmpcap;
-       struct bss_descriptor *pbssdesc;
-       struct WLAN_802_11_SSID *ssid = pssid;
+       struct assoc_request * assoc_req = pdata_buf;
 
-       ENTER();
+       lbs_deb_enter(LBS_DEB_JOIN);
 
        if (!adapter) {
                ret = -1;
@@ -596,9 +471,6 @@ int libertas_cmd_80211_ad_hoc_start(wlan_private * priv,
 
        cmd->command = cpu_to_le16(cmd_802_11_ad_hoc_start);
 
-       pbssdesc = &adapter->curbssparams.bssdescriptor;
-       adapter->pattemptedbssdesc = pbssdesc;
-
        /*
         * Fill in the parameters for 2 data structures:
         *   1. cmd_ds_802_11_ad_hoc_start command
@@ -612,20 +484,16 @@ int libertas_cmd_80211_ad_hoc_start(wlan_private * priv,
         */
 
        memset(adhs->SSID, 0, IW_ESSID_MAX_SIZE);
+       memcpy(adhs->SSID, assoc_req->ssid, assoc_req->ssid_len);
 
-       memcpy(adhs->SSID, ssid->ssid, ssid->ssidlength);
-
-       lbs_pr_debug(1, "ADHOC_S_CMD: SSID = %s\n", adhs->SSID);
-
-       memset(pbssdesc->ssid.ssid, 0, IW_ESSID_MAX_SIZE);
-       memcpy(pbssdesc->ssid.ssid, ssid->ssid, ssid->ssidlength);
-
-       pbssdesc->ssid.ssidlength = ssid->ssidlength;
+       lbs_deb_join("ADHOC_S_CMD: SSID '%s', ssid length %u\n",
+                    escape_essid(assoc_req->ssid, assoc_req->ssid_len),
+                    assoc_req->ssid_len);
 
        /* set the BSS type */
        adhs->bsstype = cmd_bss_type_ibss;
-       pbssdesc->inframode = wlan802_11ibss;
-       adhs->beaconperiod = adapter->beaconperiod;
+       adapter->mode = IW_MODE_ADHOC;
+       adhs->beaconperiod = cpu_to_le16(adapter->beaconperiod);
 
        /* set Physical param set */
 #define DS_PARA_IE_ID   3
@@ -634,18 +502,12 @@ int libertas_cmd_80211_ad_hoc_start(wlan_private * priv,
        adhs->phyparamset.dsparamset.elementid = DS_PARA_IE_ID;
        adhs->phyparamset.dsparamset.len = DS_PARA_IE_LEN;
 
-       WARN_ON(!adapter->adhocchannel);
-
-       lbs_pr_debug(1, "ADHOC_S_CMD: Creating ADHOC on channel %d\n",
-              adapter->adhocchannel);
-
-       adapter->curbssparams.channel = adapter->adhocchannel;
+       WARN_ON(!assoc_req->channel);
 
-       pbssdesc->channel = adapter->adhocchannel;
-       adhs->phyparamset.dsparamset.currentchan = adapter->adhocchannel;
+       lbs_deb_join("ADHOC_S_CMD: Creating ADHOC on channel %d\n",
+                    assoc_req->channel);
 
-       memcpy(&pbssdesc->phyparamset,
-              &adhs->phyparamset, sizeof(union ieeetypes_phyparamset));
+       adhs->phyparamset.dsparamset.currentchan = assoc_req->channel;
 
        /* set IBSS param set */
 #define IBSS_PARA_IE_ID   6
@@ -653,29 +515,21 @@ int libertas_cmd_80211_ad_hoc_start(wlan_private * priv,
 
        adhs->ssparamset.ibssparamset.elementid = IBSS_PARA_IE_ID;
        adhs->ssparamset.ibssparamset.len = IBSS_PARA_IE_LEN;
-       adhs->ssparamset.ibssparamset.atimwindow = adapter->atimwindow;
-       memcpy(&pbssdesc->ssparamset,
-              &adhs->ssparamset, sizeof(union IEEEtypes_ssparamset));
+       adhs->ssparamset.ibssparamset.atimwindow = cpu_to_le16(adapter->atimwindow);
 
        /* set capability info */
        adhs->cap.ess = 0;
        adhs->cap.ibss = 1;
-       pbssdesc->cap.ibss = 1;
 
        /* probedelay */
        adhs->probedelay = cpu_to_le16(cmd_scan_probe_delay_time);
 
        /* set up privacy in adapter->scantable[i] */
-       if (adapter->secinfo.WEPstatus == wlan802_11WEPenabled) {
-
-#define AD_HOC_CAP_PRIVACY_ON 1
-               lbs_pr_debug(1, "ADHOC_S_CMD: WEPstatus set, privacy to WEP\n");
-               pbssdesc->privacy = wlan802_11privfilter8021xWEP;
+       if (assoc_req->secinfo.wep_enabled) {
+               lbs_deb_join("ADHOC_S_CMD: WEP enabled, setting privacy on\n");
                adhs->cap.privacy = AD_HOC_CAP_PRIVACY_ON;
        } else {
-               lbs_pr_debug(1, "ADHOC_S_CMD: WEPstatus NOT set, Setting "
-                      "privacy to ACCEPT ALL\n");
-               pbssdesc->privacy = wlan802_11privfilteracceptall;
+               lbs_deb_join("ADHOC_S_CMD: WEP disabled, setting privacy off\n");
        }
 
        memset(adhs->datarate, 0, sizeof(adhs->datarate));
@@ -697,29 +551,24 @@ int libertas_cmd_80211_ad_hoc_start(wlan_private * priv,
        memcpy(&adapter->curbssparams.datarates,
               &adhs->datarate, adapter->curbssparams.numofrates);
 
-       lbs_pr_debug(1, "ADHOC_S_CMD: rates=%02x %02x %02x %02x \n",
+       lbs_deb_join("ADHOC_S_CMD: rates=%02x %02x %02x %02x \n",
               adhs->datarate[0], adhs->datarate[1],
               adhs->datarate[2], adhs->datarate[3]);
 
-       lbs_pr_debug(1, "ADHOC_S_CMD: AD HOC Start command is ready\n");
+       lbs_deb_join("ADHOC_S_CMD: AD HOC Start command is ready\n");
 
        if (libertas_create_dnld_countryinfo_11d(priv)) {
-               lbs_pr_debug(1, "ADHOC_S_CMD: dnld_countryinfo_11d failed\n");
+               lbs_deb_join("ADHOC_S_CMD: dnld_countryinfo_11d failed\n");
                ret = -1;
                goto done;
        }
 
-       cmd->size =
-           cpu_to_le16(sizeof(struct cmd_ds_802_11_ad_hoc_start)
-                            + S_DS_GEN + cmdappendsize);
-
-       memcpy(&tmpcap, &adhs->cap, sizeof(u16));
-       tmpcap = cpu_to_le16(tmpcap);
-       memcpy(&adhs->cap, &tmpcap, sizeof(u16));
+       cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_ad_hoc_start) +
+                               S_DS_GEN + cmdappendsize);
 
        ret = 0;
 done:
-       LEAVE();
+       lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret);
        return ret;
 }
 
@@ -737,7 +586,8 @@ int libertas_cmd_80211_ad_hoc_join(wlan_private * priv,
 {
        wlan_adapter *adapter = priv->adapter;
        struct cmd_ds_802_11_ad_hoc_join *padhocjoin = &cmd->params.adj;
-       struct bss_descriptor *pbssdesc = pdata_buf;
+       struct assoc_request * assoc_req = pdata_buf;
+       struct bss_descriptor *bss = &assoc_req->bss;
        int cmdappendsize = 0;
        int ret = 0;
        u8 *card_rates;
@@ -745,73 +595,59 @@ int libertas_cmd_80211_ad_hoc_join(wlan_private * priv,
        u16 tmpcap;
        int i;
 
-       ENTER();
-
-       adapter->pattemptedbssdesc = pbssdesc;
+       lbs_deb_enter(LBS_DEB_JOIN);
 
        cmd->command = cpu_to_le16(cmd_802_11_ad_hoc_join);
 
        padhocjoin->bssdescriptor.bsstype = cmd_bss_type_ibss;
 
-       padhocjoin->bssdescriptor.beaconperiod = pbssdesc->beaconperiod;
-
-       memcpy(&padhocjoin->bssdescriptor.BSSID,
-              &pbssdesc->macaddress, ETH_ALEN);
+       padhocjoin->bssdescriptor.beaconperiod = cpu_to_le16(bss->beaconperiod);
 
-       memcpy(&padhocjoin->bssdescriptor.SSID,
-              &pbssdesc->ssid.ssid, pbssdesc->ssid.ssidlength);
+       memcpy(&padhocjoin->bssdescriptor.BSSID, &bss->bssid, ETH_ALEN);
+       memcpy(&padhocjoin->bssdescriptor.SSID, &bss->ssid, bss->ssid_len);
 
        memcpy(&padhocjoin->bssdescriptor.phyparamset,
-              &pbssdesc->phyparamset, sizeof(union ieeetypes_phyparamset));
+              &bss->phyparamset, sizeof(union ieeetypes_phyparamset));
 
        memcpy(&padhocjoin->bssdescriptor.ssparamset,
-              &pbssdesc->ssparamset, sizeof(union IEEEtypes_ssparamset));
+              &bss->ssparamset, sizeof(union IEEEtypes_ssparamset));
 
-       memcpy(&tmpcap, &pbssdesc->cap, sizeof(struct ieeetypes_capinfo));
+       memcpy(&tmpcap, &bss->cap, sizeof(struct ieeetypes_capinfo));
        tmpcap &= CAPINFO_MASK;
 
-       lbs_pr_debug(1, "ADHOC_J_CMD: tmpcap=%4X CAPINFO_MASK=%4X\n",
+       lbs_deb_join("ADHOC_J_CMD: tmpcap=%4X CAPINFO_MASK=%4X\n",
               tmpcap, CAPINFO_MASK);
        memcpy(&padhocjoin->bssdescriptor.cap, &tmpcap,
               sizeof(struct ieeetypes_capinfo));
 
        /* information on BSSID descriptor passed to FW */
-    lbs_pr_debug(1,
-              "ADHOC_J_CMD: BSSID = %2x-%2x-%2x-%2x-%2x-%2x, SSID = %s\n",
-              padhocjoin->bssdescriptor.BSSID[0],
-              padhocjoin->bssdescriptor.BSSID[1],
-              padhocjoin->bssdescriptor.BSSID[2],
-              padhocjoin->bssdescriptor.BSSID[3],
-              padhocjoin->bssdescriptor.BSSID[4],
-              padhocjoin->bssdescriptor.BSSID[5],
+       lbs_deb_join(
+              "ADHOC_J_CMD: BSSID = " MAC_FMT ", SSID = '%s'\n",
+              MAC_ARG(padhocjoin->bssdescriptor.BSSID),
               padhocjoin->bssdescriptor.SSID);
 
-       lbs_pr_debug(1, "ADHOC_J_CMD: Data Rate = %x\n",
-              (u32) padhocjoin->bssdescriptor.datarates);
-
        /* failtimeout */
        padhocjoin->failtimeout = cpu_to_le16(MRVDRV_ASSOCIATION_TIME_OUT);
 
        /* probedelay */
-       padhocjoin->probedelay =
-           cpu_to_le16(cmd_scan_probe_delay_time);
+       padhocjoin->probedelay = cpu_to_le16(cmd_scan_probe_delay_time);
 
        /* Copy Data rates from the rates recorded in scan response */
        memset(padhocjoin->bssdescriptor.datarates, 0,
               sizeof(padhocjoin->bssdescriptor.datarates));
-       memcpy(padhocjoin->bssdescriptor.datarates, pbssdesc->datarates,
+       memcpy(padhocjoin->bssdescriptor.datarates, bss->datarates,
               min(sizeof(padhocjoin->bssdescriptor.datarates),
-                  sizeof(pbssdesc->datarates)));
+                  sizeof(bss->datarates)));
 
        card_rates = libertas_supported_rates;
        card_rates_size = sizeof(libertas_supported_rates);
 
-       adapter->curbssparams.channel = pbssdesc->channel;
+       adapter->curbssparams.channel = bss->channel;
 
        if (get_common_rates(adapter, padhocjoin->bssdescriptor.datarates,
                             sizeof(padhocjoin->bssdescriptor.datarates),
                             card_rates, card_rates_size)) {
-               lbs_pr_debug(1, "ADHOC_J_CMD: get_common_rates returns error.\n");
+               lbs_deb_join("ADHOC_J_CMD: get_common_rates returns error.\n");
                ret = -1;
                goto done;
        }
@@ -830,17 +666,17 @@ int libertas_cmd_80211_ad_hoc_join(wlan_private * priv,
               adapter->curbssparams.numofrates);
 
        padhocjoin->bssdescriptor.ssparamset.ibssparamset.atimwindow =
-           cpu_to_le16(pbssdesc->atimwindow);
+           cpu_to_le16(bss->atimwindow);
 
-       if (adapter->secinfo.WEPstatus == wlan802_11WEPenabled) {
+       if (assoc_req->secinfo.wep_enabled) {
                padhocjoin->bssdescriptor.cap.privacy = AD_HOC_CAP_PRIVACY_ON;
        }
 
        if (adapter->psmode == wlan802_11powermodemax_psp) {
                /* wake up first */
-               enum WLAN_802_11_POWER_MODE Localpsmode;
+               __le32 Localpsmode;
 
-               Localpsmode = wlan802_11powermodecam;
+               Localpsmode = cpu_to_le32(wlan802_11powermodecam);
                ret = libertas_prepare_and_send_command(priv,
                                            cmd_802_11_ps_mode,
                                            cmd_act_set,
@@ -852,24 +688,16 @@ int libertas_cmd_80211_ad_hoc_join(wlan_private * priv,
                }
        }
 
-       if (libertas_parse_dnld_countryinfo_11d(priv)) {
+       if (libertas_parse_dnld_countryinfo_11d(priv, bss)) {
                ret = -1;
                goto done;
        }
 
-       cmd->size =
-           cpu_to_le16(sizeof(struct cmd_ds_802_11_ad_hoc_join)
-                            + S_DS_GEN + cmdappendsize);
-
-       memcpy(&tmpcap, &padhocjoin->bssdescriptor.cap,
-              sizeof(struct ieeetypes_capinfo));
-       tmpcap = cpu_to_le16(tmpcap);
-
-       memcpy(&padhocjoin->bssdescriptor.cap,
-              &tmpcap, sizeof(struct ieeetypes_capinfo));
+       cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_ad_hoc_join) +
+                               S_DS_GEN + cmdappendsize);
 
-      done:
-       LEAVE();
+done:
+       lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret);
        return ret;
 }
 
@@ -880,19 +708,24 @@ int libertas_ret_80211_associate(wlan_private * priv,
        int ret = 0;
        union iwreq_data wrqu;
        struct ieeetypes_assocrsp *passocrsp;
-       struct bss_descriptor *pbssdesc;
+       struct bss_descriptor * bss;
 
-       ENTER();
+       lbs_deb_enter(LBS_DEB_JOIN);
 
-       passocrsp = (struct ieeetypes_assocrsp *) & resp->params;
+       if (!adapter->in_progress_assoc_req) {
+               lbs_deb_join("ASSOC_RESP: no in-progress association request\n");
+               ret = -1;
+               goto done;
+       }
+       bss = &adapter->in_progress_assoc_req->bss;
 
-       if (passocrsp->statuscode) {
+       passocrsp = (struct ieeetypes_assocrsp *) & resp->params;
 
+       if (le16_to_cpu(passocrsp->statuscode)) {
                libertas_mac_event_disconnected(priv);
 
-        lbs_pr_debug(1,
-                      "ASSOC_RESP: Association failed, status code = %d\n",
-                      passocrsp->statuscode);
+               lbs_deb_join("ASSOC_RESP: Association failed, status code = %d\n",
+                            le16_to_cpu(passocrsp->statuscode));
 
                ret = -1;
                goto done;
@@ -904,24 +737,15 @@ int libertas_ret_80211_associate(wlan_private * priv,
        /* Send a Media Connected event, according to the Spec */
        adapter->connect_status = libertas_connected;
 
-       /* Set the attempted BSSID Index to current */
-       pbssdesc = adapter->pattemptedbssdesc;
+       lbs_deb_join("ASSOC_RESP: assocated to '%s'\n",
+                    escape_essid(bss->ssid, bss->ssid_len));
 
-       lbs_pr_debug(1, "ASSOC_RESP: %s\n", pbssdesc->ssid.ssid);
+       /* Update current SSID and BSSID */
+       memcpy(&adapter->curbssparams.ssid, &bss->ssid, IW_ESSID_MAX_SIZE);
+       adapter->curbssparams.ssid_len = bss->ssid_len;
+       memcpy(adapter->curbssparams.bssid, bss->bssid, ETH_ALEN);
 
-       /* Set the new SSID to current SSID */
-       memcpy(&adapter->curbssparams.ssid,
-              &pbssdesc->ssid, sizeof(struct WLAN_802_11_SSID));
-
-       /* Set the new BSSID (AP's MAC address) to current BSSID */
-       memcpy(adapter->curbssparams.bssid,
-              pbssdesc->macaddress, ETH_ALEN);
-
-       /* Make a copy of current BSSID descriptor */
-       memcpy(&adapter->curbssparams.bssdescriptor,
-              pbssdesc, sizeof(struct bss_descriptor));
-
-       lbs_pr_debug(1, "ASSOC_RESP: currentpacketfilter is %x\n",
+       lbs_deb_join("ASSOC_RESP: currentpacketfilter is %x\n",
               adapter->currentpacketfilter);
 
        adapter->SNR[TYPE_RXPD][TYPE_AVG] = 0;
@@ -932,28 +756,31 @@ int libertas_ret_80211_associate(wlan_private * priv,
        adapter->nextSNRNF = 0;
        adapter->numSNRNF = 0;
 
-       netif_carrier_on(priv->wlan_dev.netdev);
-       netif_wake_queue(priv->wlan_dev.netdev);
+       netif_carrier_on(priv->dev);
+       netif_wake_queue(priv->dev);
+
+       netif_carrier_on(priv->mesh_dev);
+       netif_wake_queue(priv->mesh_dev);
 
-       lbs_pr_debug(1, "ASSOC_RESP: Associated \n");
+       lbs_deb_join("ASSOC_RESP: Associated \n");
 
        memcpy(wrqu.ap_addr.sa_data, adapter->curbssparams.bssid, ETH_ALEN);
        wrqu.ap_addr.sa_family = ARPHRD_ETHER;
-       wireless_send_event(priv->wlan_dev.netdev, SIOCGIWAP, &wrqu, NULL);
+       wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
 
-      done:
-       LEAVE();
+done:
+       lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret);
        return ret;
 }
 
 int libertas_ret_80211_disassociate(wlan_private * priv,
                                 struct cmd_ds_command *resp)
 {
-       ENTER();
+       lbs_deb_enter(LBS_DEB_JOIN);
 
        libertas_mac_event_disconnected(priv);
 
-       LEAVE();
+       lbs_deb_leave(LBS_DEB_JOIN);
        return 0;
 }
 
@@ -966,90 +793,85 @@ int libertas_ret_80211_ad_hoc_start(wlan_private * priv,
        u16 result = le16_to_cpu(resp->result);
        struct cmd_ds_802_11_ad_hoc_result *padhocresult;
        union iwreq_data wrqu;
-       struct bss_descriptor *pbssdesc;
+       struct bss_descriptor *bss;
 
-       ENTER();
+       lbs_deb_enter(LBS_DEB_JOIN);
 
        padhocresult = &resp->params.result;
 
-       lbs_pr_debug(1, "ADHOC_S_RESP: size = %d\n", le16_to_cpu(resp->size));
-       lbs_pr_debug(1, "ADHOC_S_RESP: command = %x\n", command);
-       lbs_pr_debug(1, "ADHOC_S_RESP: result = %x\n", result);
+       lbs_deb_join("ADHOC_RESP: size = %d\n", le16_to_cpu(resp->size));
+       lbs_deb_join("ADHOC_RESP: command = %x\n", command);
+       lbs_deb_join("ADHOC_RESP: result = %x\n", result);
 
-       pbssdesc = adapter->pattemptedbssdesc;
+       if (!adapter->in_progress_assoc_req) {
+               lbs_deb_join("ADHOC_RESP: no in-progress association request\n");
+               ret = -1;
+               goto done;
+       }
+       bss = &adapter->in_progress_assoc_req->bss;
 
        /*
         * Join result code 0 --> SUCCESS
         */
        if (result) {
-               lbs_pr_debug(1, "ADHOC_RESP failed\n");
+               lbs_deb_join("ADHOC_RESP: failed\n");
                if (adapter->connect_status == libertas_connected) {
                        libertas_mac_event_disconnected(priv);
                }
-
-               memset(&adapter->curbssparams.bssdescriptor,
-                      0x00, sizeof(adapter->curbssparams.bssdescriptor));
-
-               LEAVE();
-               return -1;
+               ret = -1;
+               goto done;
        }
 
        /*
         * Now the join cmd should be successful
         * If BSSID has changed use SSID to compare instead of BSSID
         */
-       lbs_pr_debug(1, "ADHOC_J_RESP  %s\n", pbssdesc->ssid.ssid);
+       lbs_deb_join("ADHOC_RESP: associated to '%s'\n",
+                    escape_essid(bss->ssid, bss->ssid_len));
 
        /* Send a Media Connected event, according to the Spec */
        adapter->connect_status = libertas_connected;
 
        if (command == cmd_ret_802_11_ad_hoc_start) {
                /* Update the created network descriptor with the new BSSID */
-               memcpy(pbssdesc->macaddress,
-                      padhocresult->BSSID, ETH_ALEN);
-       } else {
-
-               /* Make a copy of current BSSID descriptor, only needed for join since
-                *   the current descriptor is already being used for adhoc start
-                */
-               memmove(&adapter->curbssparams.bssdescriptor,
-                       pbssdesc, sizeof(struct bss_descriptor));
+               memcpy(bss->bssid, padhocresult->BSSID, ETH_ALEN);
        }
 
        /* Set the BSSID from the joined/started descriptor */
-       memcpy(&adapter->curbssparams.bssid,
-              pbssdesc->macaddress, ETH_ALEN);
+       memcpy(&adapter->curbssparams.bssid, bss->bssid, ETH_ALEN);
 
        /* Set the new SSID to current SSID */
-       memcpy(&adapter->curbssparams.ssid,
-              &pbssdesc->ssid, sizeof(struct WLAN_802_11_SSID));
+       memcpy(&adapter->curbssparams.ssid, &bss->ssid, IW_ESSID_MAX_SIZE);
+       adapter->curbssparams.ssid_len = bss->ssid_len;
+
+       netif_carrier_on(priv->dev);
+       netif_wake_queue(priv->dev);
 
-       netif_carrier_on(priv->wlan_dev.netdev);
-       netif_wake_queue(priv->wlan_dev.netdev);
+       netif_carrier_on(priv->mesh_dev);
+       netif_wake_queue(priv->mesh_dev);
 
        memset(&wrqu, 0, sizeof(wrqu));
        memcpy(wrqu.ap_addr.sa_data, adapter->curbssparams.bssid, ETH_ALEN);
        wrqu.ap_addr.sa_family = ARPHRD_ETHER;
-       wireless_send_event(priv->wlan_dev.netdev, SIOCGIWAP, &wrqu, NULL);
+       wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
 
-       lbs_pr_debug(1, "ADHOC_RESP: - Joined/Started Ad Hoc\n");
-       lbs_pr_debug(1, "ADHOC_RESP: channel = %d\n", adapter->adhocchannel);
-       lbs_pr_debug(1, "ADHOC_RESP: BSSID = %02x:%02x:%02x:%02x:%02x:%02x\n",
-              padhocresult->BSSID[0], padhocresult->BSSID[1],
-              padhocresult->BSSID[2], padhocresult->BSSID[3],
-              padhocresult->BSSID[4], padhocresult->BSSID[5]);
+       lbs_deb_join("ADHOC_RESP: - Joined/Started Ad Hoc\n");
+       lbs_deb_join("ADHOC_RESP: channel = %d\n", adapter->curbssparams.channel);
+       lbs_deb_join("ADHOC_RESP: BSSID = " MAC_FMT "\n",
+              MAC_ARG(padhocresult->BSSID));
 
-       LEAVE();
+done:
+       lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret);
        return ret;
 }
 
 int libertas_ret_80211_ad_hoc_stop(wlan_private * priv,
                                struct cmd_ds_command *resp)
 {
-       ENTER();
+       lbs_deb_enter(LBS_DEB_JOIN);
 
        libertas_mac_event_disconnected(priv);
 
-       LEAVE();
+       lbs_deb_leave(LBS_DEB_JOIN);
        return 0;
 }