wlan_adapter *adapter = priv->adapter;
        int ret = 0;
        struct bss_descriptor * bss;
+       int channel = -1;
 
        lbs_deb_enter(LBS_DEB_ASSOC);
 
         * is set.
         */
 
+       if (test_bit(ASSOC_FLAG_CHANNEL, &assoc_req->flags))
+               channel = assoc_req->channel;
+
        lbs_deb_assoc("New SSID requested: %s\n", assoc_req->ssid.ssid);
        if (assoc_req->mode == IW_MODE_INFRA) {
                if (adapter->prescan) {
                }
 
                bss = libertas_find_SSID_in_list(adapter, &assoc_req->ssid,
-                               NULL, IW_MODE_INFRA);
+                               NULL, IW_MODE_INFRA, channel);
                if (bss != NULL) {
                        lbs_deb_assoc("SSID found in scan list, associating\n");
                        memcpy(&assoc_req->bss, bss, sizeof(struct bss_descriptor));
 
                /* Search for the requested SSID in the scan table */
                bss = libertas_find_SSID_in_list(adapter, &assoc_req->ssid, NULL,
-                               IW_MODE_ADHOC);
+                               IW_MODE_ADHOC, channel);
                if (bss != NULL) {
                        lbs_deb_assoc("SSID found joining\n");
                        memcpy(&assoc_req->bss, bss, sizeof(struct bss_descriptor));
 
  *  @return         index in BSSID list
  */
 struct bss_descriptor * libertas_find_SSID_in_list(wlan_adapter * adapter,
-                  struct WLAN_802_11_SSID *ssid, u8 * bssid, u8 mode)
+                  struct WLAN_802_11_SSID *ssid, u8 * bssid, u8 mode,
+                  int channel)
 {
        u8 bestrssi = 0;
        struct bss_descriptor * iter_bss = NULL;
                        continue; /* ssid doesn't match */
                if (bssid && compare_ether_addr(iter_bss->bssid, bssid) != 0)
                        continue; /* bssid doesn't match */
+               if ((channel > 0) && (iter_bss->channel != channel))
+                       continue; /* channel doesn't match */
 
                switch (mode) {
                case IW_MODE_INFRA:
                wlan_scan_networks(priv, NULL, 0);
 
        /* Update RSSI if current BSS is a locally created ad-hoc BSS */
-       if ((adapter->inframode == wlan802_11ibss) && adapter->adhoccreate) {
+       if ((adapter->mode == IW_MODE_ADHOC) && adapter->adhoccreate) {
                libertas_prepare_and_send_command(priv, cmd_802_11_rssi, 0,
                                        cmd_option_waitforrsp, 0, NULL);
        }
 
                        struct WLAN_802_11_SSID *ssid2);
 
 struct bss_descriptor * libertas_find_SSID_in_list(wlan_adapter * adapter,
-                       struct WLAN_802_11_SSID *ssid, u8 * bssid, u8 mode);
+                       struct WLAN_802_11_SSID *ssid, u8 * bssid, u8 mode,
+                       int channel);
 
 struct bss_descriptor * libertas_find_best_SSID_in_list(wlan_adapter * adapter,
                        u8 mode);