]> err.no Git - linux-2.6/blobdiff - drivers/net/wireless/libertas/join.c
libertas: implement new scanning logic
[linux-2.6] / drivers / net / wireless / libertas / join.c
index 2b538ab51d409f8518dcb6a038f8b5aa098ccdea..1550e6afb0537bfa4ef53d7e4041a9288be47e4e 100644 (file)
 #include "dev.h"
 #include "assoc.h"
 
-/* Supported rates for ad-hoc B mode */
-static u8 adhoc_rates_b[5] = { 0x02, 0x04, 0x0b, 0x16, 0x00 };
-
+/* The firmware needs certain bits masked out of the beacon-derviced capability
+ * field when associating/joining to BSSs.
+ */
+#define CAPINFO_MASK   (~(0xda00))
 
 /**
  *  @brief This function finds common rates between rate1 and card rates.
@@ -29,16 +30,18 @@ static u8 adhoc_rates_b[5] = { 0x02, 0x04, 0x0b, 0x16, 0x00 };
  * NOTE: Setting the MSB of the basic rates need to be taken
  *   care, either before or after calling this function
  *
- *  @param adapter     A pointer to wlan_adapter structure
+ *  @param adapter     A pointer to struct lbs_adapter structure
  *  @param rate1       the buffer which keeps input and output
  *  @param rate1_size  the size of rate1 buffer; new size of buffer on return
  *
  *  @return            0 or -1
  */
-static int get_common_rates(wlan_adapter * adapter, u8 * rates, u16 *rates_size)
+static int get_common_rates(struct lbs_adapter *adapter,
+       u8 *rates,
+       u16 *rates_size)
 {
-       u8 *card_rates = libertas_bg_rates;
-       size_t num_card_rates = sizeof(libertas_bg_rates);
+       u8 *card_rates = lbs_bg_rates;
+       size_t num_card_rates = sizeof(lbs_bg_rates);
        int ret = 0, i, j;
        u8 tmp[30];
        size_t tmp_size = 0;
@@ -54,7 +57,7 @@ static int get_common_rates(wlan_adapter * adapter, u8 * rates, u16 *rates_size)
        lbs_deb_hex(LBS_DEB_JOIN, "AP rates    ", rates, *rates_size);
        lbs_deb_hex(LBS_DEB_JOIN, "card rates  ", card_rates, num_card_rates);
        lbs_deb_hex(LBS_DEB_JOIN, "common rates", tmp, tmp_size);
-       lbs_deb_join("Tx datarate is currently 0x%X\n", adapter->cur_rate);
+       lbs_deb_join("TX data rate 0x%02x\n", adapter->cur_rate);
 
        if (!adapter->auto_rate) {
                for (i = 0; i < tmp_size; i++) {
@@ -84,7 +87,7 @@ done:
  *  @param rates     buffer of data rates
  *  @param len       size of buffer
  */
-static void libertas_set_basic_rate_flags(u8 * rates, size_t len)
+static void lbs_set_basic_rate_flags(u8 *rates, size_t len)
 {
        int i;
 
@@ -103,7 +106,7 @@ static void libertas_set_basic_rate_flags(u8 * rates, size_t len)
  *  @param rates     buffer of data rates
  *  @param len       size of buffer
  */
-void libertas_unset_basic_rate_flags(u8 * rates, size_t len)
+void lbs_unset_basic_rate_flags(u8 *rates, size_t len)
 {
        int i;
 
@@ -115,19 +118,19 @@ void libertas_unset_basic_rate_flags(u8 * rates, size_t len)
 /**
  *  @brief Associate to a specific BSS discovered in a scan
  *
- *  @param priv      A pointer to wlan_private structure
+ *  @param priv      A pointer to struct lbs_private structure
  *  @param pbssdesc  Pointer to the BSS descriptor to associate with.
  *
  *  @return          0-success, otherwise fail
  */
-int wlan_associate(wlan_private * priv, struct assoc_request * assoc_req)
+int lbs_associate(struct lbs_private *priv, struct assoc_request *assoc_req)
 {
-       wlan_adapter *adapter = priv->adapter;
+       struct lbs_adapter *adapter = priv->adapter;
        int ret;
 
-       lbs_deb_enter(LBS_DEB_JOIN);
+       lbs_deb_enter(LBS_DEB_ASSOC);
 
-       ret = libertas_prepare_and_send_command(priv, CMD_802_11_AUTHENTICATE,
+       ret = lbs_prepare_and_send_command(priv, CMD_802_11_AUTHENTICATE,
                                    0, CMD_OPTION_WAITFORRSP,
                                    0, assoc_req->bss.bssid);
 
@@ -141,26 +144,27 @@ int wlan_associate(wlan_private * priv, struct assoc_request * assoc_req)
        else
                adapter->preamble = CMD_TYPE_LONG_PREAMBLE;
 
-       libertas_set_radio_control(priv);
+       lbs_set_radio_control(priv);
 
-       ret = libertas_prepare_and_send_command(priv, CMD_802_11_ASSOCIATE,
+       ret = lbs_prepare_and_send_command(priv, CMD_802_11_ASSOCIATE,
                                    0, CMD_OPTION_WAITFORRSP, 0, assoc_req);
 
 done:
-       lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret);
+       lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
        return ret;
 }
 
 /**
  *  @brief Start an Adhoc Network
  *
- *  @param priv         A pointer to wlan_private structure
+ *  @param priv         A pointer to struct lbs_private structure
  *  @param adhocssid    The ssid of the Adhoc Network
  *  @return             0--success, -1--fail
  */
-int libertas_start_adhoc_network(wlan_private * priv, struct assoc_request * assoc_req)
+int lbs_start_adhoc_network(struct lbs_private *priv,
+       struct assoc_request *assoc_req)
 {
-       wlan_adapter *adapter = priv->adapter;
+       struct lbs_adapter *adapter = priv->adapter;
        int ret = 0;
 
        adapter->adhoccreate = 1;
@@ -173,12 +177,12 @@ int libertas_start_adhoc_network(wlan_private * priv, struct assoc_request * ass
                adapter->preamble = CMD_TYPE_LONG_PREAMBLE;
        }
 
-       libertas_set_radio_control(priv);
+       lbs_set_radio_control(priv);
 
        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,
+       ret = lbs_prepare_and_send_command(priv, CMD_802_11_AD_HOC_START,
                                    0, CMD_OPTION_WAITFORRSP, 0, assoc_req);
 
        return ret;
@@ -187,15 +191,16 @@ int libertas_start_adhoc_network(wlan_private * priv, struct assoc_request * ass
 /**
  *  @brief Join an adhoc network found in a previous scan
  *
- *  @param priv         A pointer to wlan_private structure
+ *  @param priv         A pointer to struct lbs_private structure
  *  @param pbssdesc     Pointer to a BSS descriptor found in a previous scan
  *                      to attempt to join
  *
  *  @return             0--success, -1--fail
  */
-int libertas_join_adhoc_network(wlan_private * priv, struct assoc_request * assoc_req)
+int lbs_join_adhoc_network(struct lbs_private *priv,
+       struct assoc_request *assoc_req)
 {
-       wlan_adapter *adapter = priv->adapter;
+       struct lbs_adapter *adapter = priv->adapter;
        struct bss_descriptor * bss = &assoc_req->bss;
        int ret = 0;
 
@@ -209,15 +214,26 @@ int libertas_join_adhoc_network(wlan_private * priv, struct assoc_request * asso
                     bss->ssid_len);
 
        /* check if the requested SSID is already joined */
-       if (adapter->curbssparams.ssid_len
-           && !libertas_ssid_cmp(adapter->curbssparams.ssid,
+       if (   adapter->curbssparams.ssid_len
+           && !lbs_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;
+           && (adapter->mode == IW_MODE_ADHOC)
+           && (adapter->connect_status == LBS_CONNECTED)) {
+               union iwreq_data wrqu;
+
+               lbs_deb_join("ADHOC_J_CMD: New ad-hoc SSID is the same as "
+                            "current, not attempting to re-join");
+
+               /* Send the re-association event though, because the association
+                * request really was successful, even if just a null-op.
+                */
+               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->dev, SIOCGIWAP, &wrqu, NULL);
+               goto out;
        }
 
        /* Use shortpreamble only when both creator and card supports
@@ -231,55 +247,57 @@ int libertas_join_adhoc_network(wlan_private * priv, struct assoc_request * asso
                adapter->preamble = CMD_TYPE_SHORT_PREAMBLE;
        }
 
-       libertas_set_radio_control(priv);
+       lbs_set_radio_control(priv);
 
        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,
+       ret = lbs_prepare_and_send_command(priv, CMD_802_11_AD_HOC_JOIN,
                                    0, CMD_OPTION_WAITFORRSP,
                                    OID_802_11_SSID, assoc_req);
 
+out:
        return ret;
 }
 
-int libertas_stop_adhoc_network(wlan_private * priv)
+int lbs_stop_adhoc_network(struct lbs_private *priv)
 {
-       return libertas_prepare_and_send_command(priv, CMD_802_11_AD_HOC_STOP,
+       return lbs_prepare_and_send_command(priv, CMD_802_11_AD_HOC_STOP,
                                     0, CMD_OPTION_WAITFORRSP, 0, NULL);
 }
 
 /**
  *  @brief Send Deauthentication Request
  *
- *  @param priv      A pointer to wlan_private structure
+ *  @param priv      A pointer to struct lbs_private structure
  *  @return          0--success, -1--fail
  */
-int libertas_send_deauthentication(wlan_private * priv)
+int lbs_send_deauthentication(struct lbs_private *priv)
 {
-       return libertas_prepare_and_send_command(priv, CMD_802_11_DEAUTHENTICATE,
+       return lbs_prepare_and_send_command(priv, CMD_802_11_DEAUTHENTICATE,
                                     0, CMD_OPTION_WAITFORRSP, 0, NULL);
 }
 
 /**
  *  @brief This function prepares command of authenticate.
  *
- *  @param priv      A pointer to wlan_private structure
+ *  @param priv      A pointer to struct lbs_private structure
  *  @param cmd       A pointer to cmd_ds_command structure
  *  @param pdata_buf Void cast of pointer to a BSSID to authenticate with
  *
  *  @return         0 or -1
  */
-int libertas_cmd_80211_authenticate(wlan_private * priv,
+int lbs_cmd_80211_authenticate(struct lbs_private *priv,
                                 struct cmd_ds_command *cmd,
                                 void *pdata_buf)
 {
-       wlan_adapter *adapter = priv->adapter;
+       struct lbs_adapter *adapter = priv->adapter;
        struct cmd_ds_802_11_authenticate *pauthenticate = &cmd->params.auth;
        int ret = -1;
        u8 *bssid = pdata_buf;
+       DECLARE_MAC_BUF(mac);
 
        lbs_deb_enter(LBS_DEB_JOIN);
 
@@ -306,8 +324,8 @@ int libertas_cmd_80211_authenticate(wlan_private * priv,
 
        memcpy(pauthenticate->macaddr, bssid, ETH_ALEN);
 
-       lbs_deb_join("AUTH_CMD: BSSID is : " MAC_FMT " auth=0x%X\n",
-                    MAC_ARG(bssid), pauthenticate->authtype);
+       lbs_deb_join("AUTH_CMD: BSSID %s, auth 0x%x\n",
+                    print_mac(mac, bssid), pauthenticate->authtype);
        ret = 0;
 
 out:
@@ -315,10 +333,10 @@ out:
        return ret;
 }
 
-int libertas_cmd_80211_deauthenticate(wlan_private * priv,
+int lbs_cmd_80211_deauthenticate(struct lbs_private *priv,
                                   struct cmd_ds_command *cmd)
 {
-       wlan_adapter *adapter = priv->adapter;
+       struct lbs_adapter *adapter = priv->adapter;
        struct cmd_ds_802_11_deauthenticate *dauth = &cmd->params.deauth;
 
        lbs_deb_enter(LBS_DEB_JOIN);
@@ -338,10 +356,10 @@ int libertas_cmd_80211_deauthenticate(wlan_private * priv,
        return 0;
 }
 
-int libertas_cmd_80211_associate(wlan_private * priv,
+int lbs_cmd_80211_associate(struct lbs_private *priv,
                              struct cmd_ds_command *cmd, void *pdata_buf)
 {
-       wlan_adapter *adapter = priv->adapter;
+       struct lbs_adapter *adapter = priv->adapter;
        struct cmd_ds_802_11_associate *passo = &cmd->params.associate;
        int ret = 0;
        struct assoc_request * assoc_req = pdata_buf;
@@ -354,7 +372,7 @@ int libertas_cmd_80211_associate(wlan_private * priv,
        struct mrvlietypes_ratesparamset *rates;
        struct mrvlietypes_rsnparamset *rsn;
 
-       lbs_deb_enter(LBS_DEB_JOIN);
+       lbs_deb_enter(LBS_DEB_ASSOC);
 
        pos = (u8 *) passo;
 
@@ -369,7 +387,7 @@ int libertas_cmd_80211_associate(wlan_private * priv,
        pos += sizeof(passo->peerstaaddr);
 
        /* set the listen interval */
-       passo->listeninterval = cpu_to_le16(adapter->listeninterval);
+       passo->listeninterval = cpu_to_le16(MRVDRV_DEFAULT_LISTEN_INTERVAL);
 
        pos += sizeof(passo->capability);
        pos += sizeof(passo->listeninterval);
@@ -408,7 +426,7 @@ int libertas_cmd_80211_associate(wlan_private * priv,
        }
        pos += sizeof(rates->header) + tmplen;
        rates->header.len = cpu_to_le16(tmplen);
-       lbs_deb_join("ASSOC_CMD: num rates = %u\n", tmplen);
+       lbs_deb_assoc("ASSOC_CMD: num rates %u\n", tmplen);
 
        /* Copy the infra. association rates into Current BSS state structure */
        memset(&adapter->curbssparams.rates, 0, sizeof(adapter->curbssparams.rates));
@@ -417,7 +435,7 @@ int libertas_cmd_80211_associate(wlan_private * priv,
        /* Set MSB on basic rates as the firmware requires, but _after_
         * copying to current bss rates.
         */
-       libertas_set_basic_rate_flags(rates->rates, tmplen);
+       lbs_set_basic_rate_flags(rates->rates, tmplen);
 
        if (assoc_req->secinfo.WPAenabled || assoc_req->secinfo.WPA2enabled) {
                rsn = (struct mrvlietypes_rsnparamset *) pos;
@@ -434,7 +452,7 @@ int libertas_cmd_80211_associate(wlan_private * priv,
        /* update curbssparams */
        adapter->curbssparams.channel = bss->phyparamset.dsparamset.currentchan;
 
-       if (libertas_parse_dnld_countryinfo_11d(priv, bss)) {
+       if (lbs_parse_dnld_countryinfo_11d(priv, bss)) {
                ret = -1;
                goto done;
        }
@@ -446,18 +464,17 @@ int libertas_cmd_80211_associate(wlan_private * priv,
        if (bss->mode == IW_MODE_INFRA)
                tmpcap |= WLAN_CAPABILITY_ESS;
        passo->capability = cpu_to_le16(tmpcap);
-       lbs_deb_join("ASSOC_CMD: capability=%4X CAPINFO_MASK=%4X\n",
-                    tmpcap, CAPINFO_MASK);
+       lbs_deb_assoc("ASSOC_CMD: capability 0x%04x\n", tmpcap);
 
 done:
-       lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret);
+       lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
        return ret;
 }
 
-int libertas_cmd_80211_ad_hoc_start(wlan_private * priv,
+int lbs_cmd_80211_ad_hoc_start(struct lbs_private *priv,
                                 struct cmd_ds_command *cmd, void *pdata_buf)
 {
-       wlan_adapter *adapter = priv->adapter;
+       struct lbs_adapter *adapter = priv->adapter;
        struct cmd_ds_802_11_ad_hoc_start *adhs = &cmd->params.ads;
        int ret = 0;
        int cmdappendsize = 0;
@@ -496,7 +513,9 @@ int libertas_cmd_80211_ad_hoc_start(wlan_private * priv,
        /* set the BSS type */
        adhs->bsstype = CMD_BSS_TYPE_IBSS;
        adapter->mode = IW_MODE_ADHOC;
-       adhs->beaconperiod = cpu_to_le16(adapter->beaconperiod);
+       if (adapter->beacon_period == 0)
+               adapter->beacon_period = MRVDRV_BEACON_INTERVAL;
+       adhs->beaconperiod = cpu_to_le16(adapter->beacon_period);
 
        /* set Physical param set */
 #define DS_PARA_IE_ID   3
@@ -518,7 +537,7 @@ 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 = cpu_to_le16(adapter->atimwindow);
+       adhs->ssparamset.ibssparamset.atimwindow = 0;
 
        /* set capability info */
        tmpcap = WLAN_CAPABILITY_IBSS;
@@ -534,13 +553,8 @@ int libertas_cmd_80211_ad_hoc_start(wlan_private * priv,
        adhs->probedelay = cpu_to_le16(CMD_SCAN_PROBE_DELAY_TIME);
 
        memset(adhs->rates, 0, sizeof(adhs->rates));
-       if (adapter->adhoc_grate_enabled) {
-               ratesize = min(sizeof(adhs->rates), sizeof(libertas_bg_rates));
-               memcpy(adhs->rates, libertas_bg_rates, ratesize);
-       } else {
-               ratesize = min(sizeof(adhs->rates), sizeof(adhoc_rates_b));
-               memcpy(adhs->rates, adhoc_rates_b, ratesize);
-       }
+       ratesize = min(sizeof(adhs->rates), sizeof(lbs_bg_rates));
+       memcpy(adhs->rates, lbs_bg_rates, ratesize);
 
        /* Copy the ad-hoc creating rates into Current BSS state structure */
        memset(&adapter->curbssparams.rates, 0, sizeof(adapter->curbssparams.rates));
@@ -549,14 +563,14 @@ int libertas_cmd_80211_ad_hoc_start(wlan_private * priv,
        /* Set MSB on basic rates as the firmware requires, but _after_
         * copying to current bss rates.
         */
-       libertas_set_basic_rate_flags(adhs->rates, ratesize);
+       lbs_set_basic_rate_flags(adhs->rates, ratesize);
 
        lbs_deb_join("ADHOC_S_CMD: rates=%02x %02x %02x %02x \n",
               adhs->rates[0], adhs->rates[1], adhs->rates[2], adhs->rates[3]);
 
        lbs_deb_join("ADHOC_S_CMD: AD HOC Start command is ready\n");
 
-       if (libertas_create_dnld_countryinfo_11d(priv)) {
+       if (lbs_create_dnld_countryinfo_11d(priv)) {
                lbs_deb_join("ADHOC_S_CMD: dnld_countryinfo_11d failed\n");
                ret = -1;
                goto done;
@@ -571,7 +585,7 @@ done:
        return ret;
 }
 
-int libertas_cmd_80211_ad_hoc_stop(wlan_private * priv,
+int lbs_cmd_80211_ad_hoc_stop(struct lbs_private *priv,
                                struct cmd_ds_command *cmd)
 {
        cmd->command = cpu_to_le16(CMD_802_11_AD_HOC_STOP);
@@ -580,16 +594,17 @@ int libertas_cmd_80211_ad_hoc_stop(wlan_private * priv,
        return 0;
 }
 
-int libertas_cmd_80211_ad_hoc_join(wlan_private * priv,
+int lbs_cmd_80211_ad_hoc_join(struct lbs_private *priv,
                                struct cmd_ds_command *cmd, void *pdata_buf)
 {
-       wlan_adapter *adapter = priv->adapter;
+       struct lbs_adapter *adapter = priv->adapter;
        struct cmd_ds_802_11_ad_hoc_join *join_cmd = &cmd->params.adj;
        struct assoc_request * assoc_req = pdata_buf;
        struct bss_descriptor *bss = &assoc_req->bss;
        int cmdappendsize = 0;
        int ret = 0;
        u16 ratesize = 0;
+       DECLARE_MAC_BUF(mac);
 
        lbs_deb_enter(LBS_DEB_JOIN);
 
@@ -613,8 +628,9 @@ int libertas_cmd_80211_ad_hoc_join(wlan_private * priv,
 
        /* information on BSSID descriptor passed to FW */
        lbs_deb_join(
-              "ADHOC_J_CMD: BSSID = " MAC_FMT ", SSID = '%s'\n",
-              MAC_ARG(join_cmd->bss.bssid), join_cmd->bss.ssid);
+              "ADHOC_J_CMD: BSSID = %s, SSID = '%s'\n",
+              print_mac(mac, join_cmd->bss.bssid),
+              join_cmd->bss.ssid);
 
        /* failtimeout */
        join_cmd->failtimeout = cpu_to_le16(MRVDRV_ASSOCIATION_TIME_OUT);
@@ -641,7 +657,7 @@ int libertas_cmd_80211_ad_hoc_join(wlan_private * priv,
        /* Set MSB on basic rates as the firmware requires, but _after_
         * copying to current bss rates.
         */
-       libertas_set_basic_rate_flags(join_cmd->bss.rates, ratesize);
+       lbs_set_basic_rate_flags(join_cmd->bss.rates, ratesize);
 
        join_cmd->bss.ssparamset.ibssparamset.atimwindow =
            cpu_to_le16(bss->atimwindow);
@@ -652,12 +668,12 @@ int libertas_cmd_80211_ad_hoc_join(wlan_private * priv,
                join_cmd->bss.capability = cpu_to_le16(tmp);
        }
 
-       if (adapter->psmode == WLAN802_11POWERMODEMAX_PSP) {
+       if (adapter->psmode == LBS802_11POWERMODEMAX_PSP) {
                /* wake up first */
                __le32 Localpsmode;
 
-               Localpsmode = cpu_to_le32(WLAN802_11POWERMODECAM);
-               ret = libertas_prepare_and_send_command(priv,
+               Localpsmode = cpu_to_le32(LBS802_11POWERMODECAM);
+               ret = lbs_prepare_and_send_command(priv,
                                            CMD_802_11_PS_MODE,
                                            CMD_ACT_SET,
                                            0, 0, &Localpsmode);
@@ -668,7 +684,7 @@ int libertas_cmd_80211_ad_hoc_join(wlan_private * priv,
                }
        }
 
-       if (libertas_parse_dnld_countryinfo_11d(priv, bss)) {
+       if (lbs_parse_dnld_countryinfo_11d(priv, bss)) {
                ret = -1;
                goto done;
        }
@@ -681,19 +697,20 @@ done:
        return ret;
 }
 
-int libertas_ret_80211_associate(wlan_private * priv,
+int lbs_ret_80211_associate(struct lbs_private *priv,
                              struct cmd_ds_command *resp)
 {
-       wlan_adapter *adapter = priv->adapter;
+       struct lbs_adapter *adapter = priv->adapter;
        int ret = 0;
        union iwreq_data wrqu;
        struct ieeetypes_assocrsp *passocrsp;
        struct bss_descriptor * bss;
+       u16 status_code;
 
-       lbs_deb_enter(LBS_DEB_JOIN);
+       lbs_deb_enter(LBS_DEB_ASSOC);
 
        if (!adapter->in_progress_assoc_req) {
-               lbs_deb_join("ASSOC_RESP: no in-progress association request\n");
+               lbs_deb_assoc("ASSOC_RESP: no in-progress assoc request\n");
                ret = -1;
                goto done;
        }
@@ -701,32 +718,68 @@ int libertas_ret_80211_associate(wlan_private * priv,
 
        passocrsp = (struct ieeetypes_assocrsp *) & resp->params;
 
-       if (le16_to_cpu(passocrsp->statuscode)) {
-               libertas_mac_event_disconnected(priv);
+       /*
+        * Older FW versions map the IEEE 802.11 Status Code in the association
+        * response to the following values returned in passocrsp->statuscode:
+        *
+        *    IEEE Status Code                Marvell Status Code
+        *    0                       ->      0x0000 ASSOC_RESULT_SUCCESS
+        *    13                      ->      0x0004 ASSOC_RESULT_AUTH_REFUSED
+        *    14                      ->      0x0004 ASSOC_RESULT_AUTH_REFUSED
+        *    15                      ->      0x0004 ASSOC_RESULT_AUTH_REFUSED
+        *    16                      ->      0x0004 ASSOC_RESULT_AUTH_REFUSED
+        *    others                  ->      0x0003 ASSOC_RESULT_REFUSED
+        *
+        * Other response codes:
+        *    0x0001 -> ASSOC_RESULT_INVALID_PARAMETERS (unused)
+        *    0x0002 -> ASSOC_RESULT_TIMEOUT (internal timer expired waiting for
+        *                                    association response from the AP)
+        */
 
-               lbs_deb_join("ASSOC_RESP: Association failed, status code = %d\n",
-                            le16_to_cpu(passocrsp->statuscode));
+       status_code = le16_to_cpu(passocrsp->statuscode);
+       switch (status_code) {
+       case 0x00:
+               break;
+       case 0x01:
+               lbs_deb_assoc("ASSOC_RESP: invalid parameters\n");
+               break;
+       case 0x02:
+               lbs_deb_assoc("ASSOC_RESP: internal timer "
+                       "expired while waiting for the AP\n");
+               break;
+       case 0x03:
+               lbs_deb_assoc("ASSOC_RESP: association "
+                       "refused by AP\n");
+               break;
+       case 0x04:
+               lbs_deb_assoc("ASSOC_RESP: authentication "
+                       "refused by AP\n");
+               break;
+       default:
+               lbs_deb_assoc("ASSOC_RESP: failure reason 0x%02x "
+                       " unknown\n", status_code);
+               break;
+       }
 
+       if (status_code) {
+               lbs_mac_event_disconnected(priv);
                ret = -1;
                goto done;
        }
 
-       lbs_deb_hex(LBS_DEB_JOIN, "ASSOC_RESP", (void *)&resp->params,
+       lbs_deb_hex(LBS_DEB_ASSOC, "ASSOC_RESP", (void *)&resp->params,
                le16_to_cpu(resp->size) - S_DS_GEN);
 
        /* Send a Media Connected event, according to the Spec */
-       adapter->connect_status = LIBERTAS_CONNECTED;
-
-       lbs_deb_join("ASSOC_RESP: assocated to '%s'\n",
-                    escape_essid(bss->ssid, bss->ssid_len));
+       adapter->connect_status = LBS_CONNECTED;
 
        /* 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);
 
-       lbs_deb_join("ASSOC_RESP: currentpacketfilter is %x\n",
-              adapter->currentpacketfilter);
+       lbs_deb_assoc("ASSOC_RESP: currentpacketfilter is 0x%x\n",
+               adapter->currentpacketfilter);
 
        adapter->SNR[TYPE_RXPD][TYPE_AVG] = 0;
        adapter->NF[TYPE_RXPD][TYPE_AVG] = 0;
@@ -739,43 +792,38 @@ int libertas_ret_80211_associate(wlan_private * priv,
        netif_carrier_on(priv->dev);
        netif_wake_queue(priv->dev);
 
-       if (priv->mesh_dev) {
-               netif_carrier_on(priv->mesh_dev);
-               netif_wake_queue(priv->mesh_dev);
-       }
-
-       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->dev, SIOCGIWAP, &wrqu, NULL);
 
 done:
-       lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret);
+       lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
        return ret;
 }
 
-int libertas_ret_80211_disassociate(wlan_private * priv,
+int lbs_ret_80211_disassociate(struct lbs_private *priv,
                                 struct cmd_ds_command *resp)
 {
        lbs_deb_enter(LBS_DEB_JOIN);
 
-       libertas_mac_event_disconnected(priv);
+       lbs_mac_event_disconnected(priv);
 
        lbs_deb_leave(LBS_DEB_JOIN);
        return 0;
 }
 
-int libertas_ret_80211_ad_hoc_start(wlan_private * priv,
+int lbs_ret_80211_ad_hoc_start(struct lbs_private *priv,
                                 struct cmd_ds_command *resp)
 {
-       wlan_adapter *adapter = priv->adapter;
+       struct lbs_adapter *adapter = priv->adapter;
        int ret = 0;
        u16 command = le16_to_cpu(resp->command);
        u16 result = le16_to_cpu(resp->result);
        struct cmd_ds_802_11_ad_hoc_result *padhocresult;
        union iwreq_data wrqu;
        struct bss_descriptor *bss;
+       DECLARE_MAC_BUF(mac);
 
        lbs_deb_enter(LBS_DEB_JOIN);
 
@@ -797,8 +845,8 @@ int libertas_ret_80211_ad_hoc_start(wlan_private * priv,
         */
        if (result) {
                lbs_deb_join("ADHOC_RESP: failed\n");
-               if (adapter->connect_status == LIBERTAS_CONNECTED) {
-                       libertas_mac_event_disconnected(priv);
+               if (adapter->connect_status == LBS_CONNECTED) {
+                       lbs_mac_event_disconnected(priv);
                }
                ret = -1;
                goto done;
@@ -812,9 +860,9 @@ int libertas_ret_80211_ad_hoc_start(wlan_private * priv,
                     escape_essid(bss->ssid, bss->ssid_len));
 
        /* Send a Media Connected event, according to the Spec */
-       adapter->connect_status = LIBERTAS_CONNECTED;
+       adapter->connect_status = LBS_CONNECTED;
 
-       if (command == CMD_RET_802_11_AD_HOC_START) {
+       if (command == CMD_RET(CMD_802_11_AD_HOC_START)) {
                /* Update the created network descriptor with the new BSSID */
                memcpy(bss->bssid, padhocresult->bssid, ETH_ALEN);
        }
@@ -829,11 +877,6 @@ int libertas_ret_80211_ad_hoc_start(wlan_private * priv,
        netif_carrier_on(priv->dev);
        netif_wake_queue(priv->dev);
 
-       if (priv->mesh_dev) {
-               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;
@@ -841,20 +884,20 @@ int libertas_ret_80211_ad_hoc_start(wlan_private * priv,
 
        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));
+       lbs_deb_join("ADHOC_RESP: BSSID = %s\n",
+                    print_mac(mac, padhocresult->bssid));
 
 done:
        lbs_deb_leave_args(LBS_DEB_JOIN, "ret %d", ret);
        return ret;
 }
 
-int libertas_ret_80211_ad_hoc_stop(wlan_private * priv,
+int lbs_ret_80211_ad_hoc_stop(struct lbs_private *priv,
                                struct cmd_ds_command *resp)
 {
        lbs_deb_enter(LBS_DEB_JOIN);
 
-       libertas_mac_event_disconnected(priv);
+       lbs_mac_event_disconnected(priv);
 
        lbs_deb_leave(LBS_DEB_JOIN);
        return 0;