These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / net / wireless / mwifiex / scan.c
index 0ffdb7c..c20017c 100644 (file)
@@ -241,20 +241,21 @@ mwifiex_is_bss_wpa(struct mwifiex_private *priv,
            * LinkSys WRT54G && bss_desc->privacy
            */
         ) {
-               dev_dbg(priv->adapter->dev, "info: %s: WPA:"
-                       " wpa_ie=%#x wpa2_ie=%#x WEP=%s WPA=%s WPA2=%s "
-                       "EncMode=%#x privacy=%#x\n", __func__,
-                       (bss_desc->bcn_wpa_ie) ?
-                       (*(bss_desc->bcn_wpa_ie)).
-                       vend_hdr.element_id : 0,
-                       (bss_desc->bcn_rsn_ie) ?
-                       (*(bss_desc->bcn_rsn_ie)).
-                       ieee_hdr.element_id : 0,
-                       (priv->sec_info.wep_enabled) ? "e" : "d",
-                       (priv->sec_info.wpa_enabled) ? "e" : "d",
-                       (priv->sec_info.wpa2_enabled) ? "e" : "d",
-                       priv->sec_info.encryption_mode,
-                       bss_desc->privacy);
+               mwifiex_dbg(priv->adapter, INFO,
+                           "info: %s: WPA:\t"
+                           "wpa_ie=%#x wpa2_ie=%#x WEP=%s WPA=%s WPA2=%s\t"
+                           "EncMode=%#x privacy=%#x\n", __func__,
+                           (bss_desc->bcn_wpa_ie) ?
+                           (*bss_desc->bcn_wpa_ie).
+                           vend_hdr.element_id : 0,
+                           (bss_desc->bcn_rsn_ie) ?
+                           (*bss_desc->bcn_rsn_ie).
+                           ieee_hdr.element_id : 0,
+                           (priv->sec_info.wep_enabled) ? "e" : "d",
+                           (priv->sec_info.wpa_enabled) ? "e" : "d",
+                           (priv->sec_info.wpa2_enabled) ? "e" : "d",
+                           priv->sec_info.encryption_mode,
+                           bss_desc->privacy);
                return true;
        }
        return false;
@@ -277,20 +278,21 @@ mwifiex_is_bss_wpa2(struct mwifiex_private *priv,
                 * Privacy bit may NOT be set in some APs like
                 * LinkSys WRT54G && bss_desc->privacy
                 */
-               dev_dbg(priv->adapter->dev, "info: %s: WPA2: "
-                       " wpa_ie=%#x wpa2_ie=%#x WEP=%s WPA=%s WPA2=%s "
-                       "EncMode=%#x privacy=%#x\n", __func__,
-                       (bss_desc->bcn_wpa_ie) ?
-                       (*(bss_desc->bcn_wpa_ie)).
-                       vend_hdr.element_id : 0,
-                       (bss_desc->bcn_rsn_ie) ?
-                       (*(bss_desc->bcn_rsn_ie)).
-                       ieee_hdr.element_id : 0,
-                       (priv->sec_info.wep_enabled) ? "e" : "d",
-                       (priv->sec_info.wpa_enabled) ? "e" : "d",
-                       (priv->sec_info.wpa2_enabled) ? "e" : "d",
-                       priv->sec_info.encryption_mode,
-                       bss_desc->privacy);
+               mwifiex_dbg(priv->adapter, INFO,
+                           "info: %s: WPA2:\t"
+                           "wpa_ie=%#x wpa2_ie=%#x WEP=%s WPA=%s WPA2=%s\t"
+                           "EncMode=%#x privacy=%#x\n", __func__,
+                           (bss_desc->bcn_wpa_ie) ?
+                           (*bss_desc->bcn_wpa_ie).
+                           vend_hdr.element_id : 0,
+                           (bss_desc->bcn_rsn_ie) ?
+                           (*bss_desc->bcn_rsn_ie).
+                           ieee_hdr.element_id : 0,
+                           (priv->sec_info.wep_enabled) ? "e" : "d",
+                           (priv->sec_info.wpa_enabled) ? "e" : "d",
+                           (priv->sec_info.wpa2_enabled) ? "e" : "d",
+                           priv->sec_info.encryption_mode,
+                           bss_desc->privacy);
                return true;
        }
        return false;
@@ -333,18 +335,19 @@ mwifiex_is_bss_dynamic_wep(struct mwifiex_private *priv,
            ((!bss_desc->bcn_rsn_ie) ||
             ((*(bss_desc->bcn_rsn_ie)).ieee_hdr.element_id != WLAN_EID_RSN)) &&
            priv->sec_info.encryption_mode && bss_desc->privacy) {
-               dev_dbg(priv->adapter->dev, "info: %s: dynamic "
-                       "WEP: wpa_ie=%#x wpa2_ie=%#x "
-                       "EncMode=%#x privacy=%#x\n",
-                       __func__,
-                       (bss_desc->bcn_wpa_ie) ?
-                       (*(bss_desc->bcn_wpa_ie)).
-                       vend_hdr.element_id : 0,
-                       (bss_desc->bcn_rsn_ie) ?
-                       (*(bss_desc->bcn_rsn_ie)).
-                       ieee_hdr.element_id : 0,
-                       priv->sec_info.encryption_mode,
-                       bss_desc->privacy);
+               mwifiex_dbg(priv->adapter, INFO,
+                           "info: %s: dynamic\t"
+                           "WEP: wpa_ie=%#x wpa2_ie=%#x\t"
+                           "EncMode=%#x privacy=%#x\n",
+                           __func__,
+                           (bss_desc->bcn_wpa_ie) ?
+                           (*bss_desc->bcn_wpa_ie).
+                           vend_hdr.element_id : 0,
+                           (bss_desc->bcn_rsn_ie) ?
+                           (*bss_desc->bcn_rsn_ie).
+                           ieee_hdr.element_id : 0,
+                           priv->sec_info.encryption_mode,
+                           bss_desc->privacy);
                return true;
        }
        return false;
@@ -383,19 +386,20 @@ mwifiex_is_network_compatible(struct mwifiex_private *priv,
                return 0;
 
        if (priv->wps.session_enable) {
-               dev_dbg(adapter->dev,
-                       "info: return success directly in WPS period\n");
+               mwifiex_dbg(adapter, IOCTL,
+                           "info: return success directly in WPS period\n");
                return 0;
        }
 
        if (bss_desc->chan_sw_ie_present) {
-               dev_err(adapter->dev,
-                       "Don't connect to AP with WLAN_EID_CHANNEL_SWITCH\n");
+               mwifiex_dbg(adapter, INFO,
+                           "Don't connect to AP with WLAN_EID_CHANNEL_SWITCH\n");
                return -1;
        }
 
        if (mwifiex_is_bss_wapi(priv, bss_desc)) {
-               dev_dbg(adapter->dev, "info: return success for WAPI AP\n");
+               mwifiex_dbg(adapter, INFO,
+                           "info: return success for WAPI AP\n");
                return 0;
        }
 
@@ -405,7 +409,8 @@ mwifiex_is_network_compatible(struct mwifiex_private *priv,
                        return 0;
                } else if (mwifiex_is_bss_static_wep(priv, bss_desc)) {
                        /* Static WEP enabled */
-                       dev_dbg(adapter->dev, "info: Disable 11n in WEP mode.\n");
+                       mwifiex_dbg(adapter, INFO,
+                                   "info: Disable 11n in WEP mode.\n");
                        bss_desc->disable_11n = true;
                        return 0;
                } else if (mwifiex_is_bss_wpa(priv, bss_desc)) {
@@ -418,9 +423,9 @@ mwifiex_is_network_compatible(struct mwifiex_private *priv,
 
                                if (mwifiex_is_wpa_oui_present
                                                (bss_desc, CIPHER_SUITE_TKIP)) {
-                                       dev_dbg(adapter->dev,
-                                               "info: Disable 11n if AES "
-                                               "is not supported by AP\n");
+                                       mwifiex_dbg(adapter, INFO,
+                                                   "info: Disable 11n if AES\t"
+                                                   "is not supported by AP\n");
                                        bss_desc->disable_11n = true;
                                } else {
                                        return -1;
@@ -437,9 +442,9 @@ mwifiex_is_network_compatible(struct mwifiex_private *priv,
 
                                if (mwifiex_is_rsn_oui_present
                                                (bss_desc, CIPHER_SUITE_TKIP)) {
-                                       dev_dbg(adapter->dev,
-                                               "info: Disable 11n if AES "
-                                               "is not supported by AP\n");
+                                       mwifiex_dbg(adapter, INFO,
+                                                   "info: Disable 11n if AES\t"
+                                                   "is not supported by AP\n");
                                        bss_desc->disable_11n = true;
                                } else {
                                        return -1;
@@ -455,17 +460,18 @@ mwifiex_is_network_compatible(struct mwifiex_private *priv,
                }
 
                /* Security doesn't match */
-               dev_dbg(adapter->dev,
-                       "info: %s: failed: wpa_ie=%#x wpa2_ie=%#x WEP=%s "
-                       "WPA=%s WPA2=%s EncMode=%#x privacy=%#x\n", __func__,
-                       (bss_desc->bcn_wpa_ie) ?
-                       (*(bss_desc->bcn_wpa_ie)).vend_hdr.element_id : 0,
-                       (bss_desc->bcn_rsn_ie) ?
-                       (*(bss_desc->bcn_rsn_ie)).ieee_hdr.element_id : 0,
-                       (priv->sec_info.wep_enabled) ? "e" : "d",
-                       (priv->sec_info.wpa_enabled) ? "e" : "d",
-                       (priv->sec_info.wpa2_enabled) ? "e" : "d",
-                       priv->sec_info.encryption_mode, bss_desc->privacy);
+               mwifiex_dbg(adapter, ERROR,
+                           "info: %s: failed: wpa_ie=%#x wpa2_ie=%#x WEP=%s\t"
+                           "WPA=%s WPA2=%s EncMode=%#x privacy=%#x\n",
+                           __func__,
+                           (bss_desc->bcn_wpa_ie) ?
+                           (*bss_desc->bcn_wpa_ie).vend_hdr.element_id : 0,
+                           (bss_desc->bcn_rsn_ie) ?
+                           (*bss_desc->bcn_rsn_ie).ieee_hdr.element_id : 0,
+                           (priv->sec_info.wep_enabled) ? "e" : "d",
+                           (priv->sec_info.wpa_enabled) ? "e" : "d",
+                           (priv->sec_info.wpa2_enabled) ? "e" : "d",
+                           priv->sec_info.encryption_mode, bss_desc->privacy);
                return -1;
        }
 
@@ -521,7 +527,8 @@ mwifiex_scan_create_channel_list(struct mwifiex_private *priv,
 
                        if (ch->flags & IEEE80211_CHAN_NO_IR)
                                scan_chan_list[chan_idx].chan_scan_mode_bitmap
-                                       |= MWIFIEX_PASSIVE_SCAN;
+                                       |= (MWIFIEX_PASSIVE_SCAN |
+                                           MWIFIEX_HIDDEN_SSID_REPORT);
                        else
                                scan_chan_list[chan_idx].chan_scan_mode_bitmap
                                        &= ~MWIFIEX_PASSIVE_SCAN;
@@ -560,7 +567,8 @@ mwifiex_append_rate_tlv(struct mwifiex_private *priv,
        else
                rates_size = mwifiex_get_supported_rates(priv, rates);
 
-       dev_dbg(priv->adapter->dev, "info: SCAN_CMD: Rates size = %d\n",
+       mwifiex_dbg(priv->adapter, CMD,
+                   "info: SCAN_CMD: Rates size = %d\n",
                rates_size);
        rates_tlv = (struct mwifiex_ie_types_rates_param_set *)tlv_pos;
        rates_tlv->header.type = cpu_to_le16(WLAN_EID_SUPP_RATES);
@@ -600,9 +608,9 @@ mwifiex_scan_channel_list(struct mwifiex_private *priv,
        u8 radio_type;
 
        if (!scan_cfg_out || !chan_tlv_out || !scan_chan_list) {
-               dev_dbg(priv->adapter->dev,
-                       "info: Scan: Null detect: %p, %p, %p\n",
-                      scan_cfg_out, chan_tlv_out, scan_chan_list);
+               mwifiex_dbg(priv->adapter, ERROR,
+                           "info: Scan: Null detect: %p, %p, %p\n",
+                           scan_cfg_out, chan_tlv_out, scan_chan_list);
                return -1;
        }
 
@@ -645,16 +653,16 @@ mwifiex_scan_channel_list(struct mwifiex_private *priv,
                        }
 
                        radio_type = tmp_chan_list->radio_type;
-                       dev_dbg(priv->adapter->dev,
-                               "info: Scan: Chan(%3d), Radio(%d),"
-                               Mode(%d, %d), Dur(%d)\n",
-                               tmp_chan_list->chan_number,
-                               tmp_chan_list->radio_type,
-                               tmp_chan_list->chan_scan_mode_bitmap
-                               & MWIFIEX_PASSIVE_SCAN,
-                               (tmp_chan_list->chan_scan_mode_bitmap
-                                & MWIFIEX_DISABLE_CHAN_FILT) >> 1,
-                               le16_to_cpu(tmp_chan_list->max_scan_time));
+                       mwifiex_dbg(priv->adapter, INFO,
+                                   "info: Scan: Chan(%3d), Radio(%d),\t"
+                                   "Mode(%d, %d), Dur(%d)\n",
+                                   tmp_chan_list->chan_number,
+                                   tmp_chan_list->radio_type,
+                                   tmp_chan_list->chan_scan_mode_bitmap
+                                   & MWIFIEX_PASSIVE_SCAN,
+                                   (tmp_chan_list->chan_scan_mode_bitmap
+                                   & MWIFIEX_DISABLE_CHAN_FILT) >> 1,
+                                   le16_to_cpu(tmp_chan_list->max_scan_time));
 
                        /* Copy the current channel TLV to the command being
                           prepared */
@@ -718,9 +726,11 @@ mwifiex_scan_channel_list(struct mwifiex_private *priv,
                /* The total scan time should be less than scan command timeout
                   value */
                if (total_scan_time > MWIFIEX_MAX_TOTAL_SCAN_TIME) {
-                       dev_err(priv->adapter->dev, "total scan time %dms"
-                               " is over limit (%dms), scan skipped\n",
-                               total_scan_time, MWIFIEX_MAX_TOTAL_SCAN_TIME);
+                       mwifiex_dbg(priv->adapter, ERROR,
+                                   "total scan time %dms\t"
+                                   "is over limit (%dms), scan skipped\n",
+                                   total_scan_time,
+                                   MWIFIEX_MAX_TOTAL_SCAN_TIME);
                        ret = -1;
                        break;
                }
@@ -814,6 +824,7 @@ mwifiex_config_scan(struct mwifiex_private *priv,
        int i;
        u8 ssid_filter;
        struct mwifiex_ie_types_htcap *ht_cap;
+       struct mwifiex_ie_types_bss_mode *bss_mode;
 
        /* The tlv_buf_len is calculated for each scan command.  The TLVs added
           in this routine will be preserved since the routine that sends the
@@ -899,15 +910,20 @@ mwifiex_config_scan(struct mwifiex_private *priv,
                                wildcard_ssid_tlv->max_ssid_length =
                                                        IEEE80211_MAX_SSID_LEN;
 
+                       if (!memcmp(user_scan_in->ssid_list[i].ssid,
+                                   "DIRECT-", 7))
+                               wildcard_ssid_tlv->max_ssid_length = 0xfe;
+
                        memcpy(wildcard_ssid_tlv->ssid,
                               user_scan_in->ssid_list[i].ssid, ssid_len);
 
                        tlv_pos += (sizeof(wildcard_ssid_tlv->header)
                                + le16_to_cpu(wildcard_ssid_tlv->header.len));
 
-                       dev_dbg(adapter->dev, "info: scan: ssid[%d]: %s, %d\n",
-                               i, wildcard_ssid_tlv->ssid,
-                               wildcard_ssid_tlv->max_ssid_length);
+                       mwifiex_dbg(adapter, INFO,
+                                   "info: scan: ssid[%d]: %s, %d\n",
+                                   i, wildcard_ssid_tlv->ssid,
+                                   wildcard_ssid_tlv->max_ssid_length);
 
                        /* Empty wildcard ssid with a maxlen will match many or
                           potentially all SSIDs (maxlen == 32), therefore do
@@ -928,8 +944,9 @@ mwifiex_config_scan(struct mwifiex_private *priv,
                        *filtered_scan = true;
 
                if (user_scan_in->scan_chan_gap) {
-                       dev_dbg(adapter->dev, "info: scan: channel gap = %d\n",
-                               user_scan_in->scan_chan_gap);
+                       mwifiex_dbg(adapter, INFO,
+                                   "info: scan: channel gap = %d\n",
+                                   user_scan_in->scan_chan_gap);
                        *max_chan_per_scan =
                                        MWIFIEX_MAX_CHANNELS_PER_SPECIFIC_SCAN;
 
@@ -957,12 +974,22 @@ mwifiex_config_scan(struct mwifiex_private *priv,
        else
                *max_chan_per_scan = MWIFIEX_DEF_CHANNELS_PER_SCAN_CMD;
 
+       if (adapter->ext_scan) {
+               bss_mode = (struct mwifiex_ie_types_bss_mode *)tlv_pos;
+               bss_mode->header.type = cpu_to_le16(TLV_TYPE_BSS_MODE);
+               bss_mode->header.len = cpu_to_le16(sizeof(bss_mode->bss_mode));
+               bss_mode->bss_mode = scan_cfg_out->bss_mode;
+               tlv_pos += sizeof(bss_mode->header) +
+                          le16_to_cpu(bss_mode->header.len);
+       }
+
        /* If the input config or adapter has the number of Probes set,
           add tlv */
        if (num_probes) {
 
-               dev_dbg(adapter->dev, "info: scan: num_probes = %d\n",
-                       num_probes);
+               mwifiex_dbg(adapter, INFO,
+                           "info: scan: num_probes = %d\n",
+                           num_probes);
 
                num_probes_tlv = (struct mwifiex_ie_types_num_probes *) tlv_pos;
                num_probes_tlv->header.type = cpu_to_le16(TLV_TYPE_NUMPROBES);
@@ -1003,7 +1030,8 @@ mwifiex_config_scan(struct mwifiex_private *priv,
 
        if (user_scan_in && user_scan_in->chan_list[0].chan_number) {
 
-               dev_dbg(adapter->dev, "info: Scan: Using supplied channel list\n");
+               mwifiex_dbg(adapter, INFO,
+                           "info: Scan: Using supplied channel list\n");
 
                for (chan_idx = 0;
                     chan_idx < MWIFIEX_USER_SCAN_CHAN_MAX &&
@@ -1022,7 +1050,8 @@ mwifiex_config_scan(struct mwifiex_private *priv,
                        if (scan_type == MWIFIEX_SCAN_TYPE_PASSIVE)
                                (scan_chan_list +
                                 chan_idx)->chan_scan_mode_bitmap
-                                       |= MWIFIEX_PASSIVE_SCAN;
+                                       |= (MWIFIEX_PASSIVE_SCAN |
+                                           MWIFIEX_HIDDEN_SSID_REPORT);
                        else
                                (scan_chan_list +
                                 chan_idx)->chan_scan_mode_bitmap
@@ -1056,13 +1085,13 @@ mwifiex_config_scan(struct mwifiex_private *priv,
                    (user_scan_in->chan_list[0].chan_number ==
                     priv->curr_bss_params.bss_descriptor.channel)) {
                        *scan_current_only = true;
-                       dev_dbg(adapter->dev,
-                               "info: Scan: Scanning current channel only\n");
+                       mwifiex_dbg(adapter, INFO,
+                                   "info: Scan: Scanning current channel only\n");
                }
                chan_num = chan_idx;
        } else {
-               dev_dbg(adapter->dev,
-                       "info: Scan: Creating full region channel list\n");
+               mwifiex_dbg(adapter, INFO,
+                           "info: Scan: Creating full region channel list\n");
                chan_num = mwifiex_scan_create_channel_list(priv, user_scan_in,
                                                            scan_chan_list,
                                                            *filtered_scan);
@@ -1094,8 +1123,9 @@ mwifiex_ret_802_11_scan_get_tlv_ptrs(struct mwifiex_adapter *adapter,
        tlv_buf_left = tlv_buf_size;
        *tlv_data = NULL;
 
-       dev_dbg(adapter->dev, "info: SCAN_RESP: tlv_buf_size = %d\n",
-               tlv_buf_size);
+       mwifiex_dbg(adapter, INFO,
+                   "info: SCAN_RESP: tlv_buf_size = %d\n",
+                   tlv_buf_size);
 
        while (tlv_buf_left >= sizeof(struct mwifiex_ie_types_header)) {
 
@@ -1103,26 +1133,31 @@ mwifiex_ret_802_11_scan_get_tlv_ptrs(struct mwifiex_adapter *adapter,
                tlv_len = le16_to_cpu(current_tlv->header.len);
 
                if (sizeof(tlv->header) + tlv_len > tlv_buf_left) {
-                       dev_err(adapter->dev, "SCAN_RESP: TLV buffer corrupt\n");
+                       mwifiex_dbg(adapter, ERROR,
+                                   "SCAN_RESP: TLV buffer corrupt\n");
                        break;
                }
 
                if (req_tlv_type == tlv_type) {
                        switch (tlv_type) {
                        case TLV_TYPE_TSFTIMESTAMP:
-                               dev_dbg(adapter->dev, "info: SCAN_RESP: TSF "
-                                       "timestamp TLV, len = %d\n", tlv_len);
+                               mwifiex_dbg(adapter, INFO,
+                                           "info: SCAN_RESP: TSF\t"
+                                           "timestamp TLV, len = %d\n",
+                                           tlv_len);
                                *tlv_data = current_tlv;
                                break;
                        case TLV_TYPE_CHANNELBANDLIST:
-                               dev_dbg(adapter->dev, "info: SCAN_RESP: channel"
-                                       " band list TLV, len = %d\n", tlv_len);
+                               mwifiex_dbg(adapter, INFO,
+                                           "info: SCAN_RESP: channel\t"
+                                           "band list TLV, len = %d\n",
+                                           tlv_len);
                                *tlv_data = current_tlv;
                                break;
                        default:
-                               dev_err(adapter->dev,
-                                       "SCAN_RESP: unhandled TLV = %d\n",
-                                      tlv_type);
+                               mwifiex_dbg(adapter, ERROR,
+                                           "SCAN_RESP: unhandled TLV = %d\n",
+                                           tlv_type);
                                /* Give up, this seems corrupted */
                                return;
                        }
@@ -1177,8 +1212,9 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
                total_ie_len = element_len + sizeof(struct ieee_types_header);
 
                if (bytes_left < total_ie_len) {
-                       dev_err(adapter->dev, "err: InterpretIE: in processing"
-                               " IE, bytes left < IE length\n");
+                       mwifiex_dbg(adapter, ERROR,
+                                   "err: InterpretIE: in processing\t"
+                                   "IE, bytes left < IE length\n");
                        return -1;
                }
                switch (element_id) {
@@ -1186,9 +1222,9 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
                        bss_entry->ssid.ssid_len = element_len;
                        memcpy(bss_entry->ssid.ssid, (current_ptr + 2),
                               element_len);
-                       dev_dbg(adapter->dev,
-                               "info: InterpretIE: ssid: %-32s\n",
-                               bss_entry->ssid.ssid);
+                       mwifiex_dbg(adapter, INFO,
+                                   "info: InterpretIE: ssid: %-32s\n",
+                                   bss_entry->ssid.ssid);
                        break;
 
                case WLAN_EID_SUPP_RATES:
@@ -1419,19 +1455,20 @@ int mwifiex_scan_networks(struct mwifiex_private *priv,
        unsigned long flags;
 
        if (adapter->scan_processing) {
-               dev_err(adapter->dev, "cmd: Scan already in process...\n");
+               mwifiex_dbg(adapter, WARN,
+                           "cmd: Scan already in process...\n");
                return -EBUSY;
        }
 
        if (priv->scan_block) {
-               dev_err(adapter->dev,
-                       "cmd: Scan is blocked during association...\n");
+               mwifiex_dbg(adapter, WARN,
+                           "cmd: Scan is blocked during association...\n");
                return -EBUSY;
        }
 
        if (adapter->surprise_removed || adapter->is_cmd_timedout) {
-               dev_err(adapter->dev,
-                       "Ignore scan. Card removed or firmware in bad state\n");
+               mwifiex_dbg(adapter, ERROR,
+                           "Ignore scan. Card removed or firmware in bad state\n");
                return -EFAULT;
        }
 
@@ -1478,7 +1515,8 @@ int mwifiex_scan_networks(struct mwifiex_private *priv,
 
                        /* Perform internal scan synchronously */
                        if (!priv->scan_request) {
-                               dev_dbg(adapter->dev, "wait internal scan\n");
+                               mwifiex_dbg(adapter, INFO,
+                                           "wait internal scan\n");
                                mwifiex_wait_queue_complete(adapter, cmd_node);
                        }
                } else {
@@ -1553,8 +1591,8 @@ int mwifiex_check_network_compatibility(struct mwifiex_private *priv,
                        ret = mwifiex_is_network_compatible(priv, bss_desc,
                                                            priv->bss_mode);
                        if (ret)
-                               dev_err(priv->adapter->dev,
-                                       "Incompatible network settings\n");
+                               mwifiex_dbg(priv->adapter, ERROR,
+                                           "Incompatible network settings\n");
                        break;
                default:
                        ret = 0;
@@ -1564,6 +1602,62 @@ int mwifiex_check_network_compatibility(struct mwifiex_private *priv,
        return ret;
 }
 
+/* This function checks if SSID string contains all zeroes or length is zero */
+static bool mwifiex_is_hidden_ssid(struct cfg80211_ssid *ssid)
+{
+       int idx;
+
+       for (idx = 0; idx < ssid->ssid_len; idx++) {
+               if (ssid->ssid[idx])
+                       return false;
+       }
+
+       return true;
+}
+
+/* This function checks if any hidden SSID found in passive scan channels
+ * and save those channels for specific SSID active scan
+ */
+static int mwifiex_save_hidden_ssid_channels(struct mwifiex_private *priv,
+                                            struct cfg80211_bss *bss)
+{
+       struct mwifiex_bssdescriptor *bss_desc;
+       int ret;
+       int chid;
+
+       /* Allocate and fill new bss descriptor */
+       bss_desc = kzalloc(sizeof(*bss_desc), GFP_KERNEL);
+       if (!bss_desc)
+               return -ENOMEM;
+
+       ret = mwifiex_fill_new_bss_desc(priv, bss, bss_desc);
+       if (ret)
+               goto done;
+
+       if (mwifiex_is_hidden_ssid(&bss_desc->ssid)) {
+               mwifiex_dbg(priv->adapter, INFO, "found hidden SSID\n");
+               for (chid = 0 ; chid < MWIFIEX_USER_SCAN_CHAN_MAX; chid++) {
+                       if (priv->hidden_chan[chid].chan_number ==
+                           bss->channel->hw_value)
+                               break;
+
+                       if (!priv->hidden_chan[chid].chan_number) {
+                               priv->hidden_chan[chid].chan_number =
+                                       bss->channel->hw_value;
+                               priv->hidden_chan[chid].radio_type =
+                                       bss->channel->band;
+                               priv->hidden_chan[chid].scan_type =
+                                       MWIFIEX_SCAN_TYPE_ACTIVE;
+                               break;
+                       }
+               }
+       }
+
+done:
+       kfree(bss_desc);
+       return 0;
+}
+
 static int mwifiex_update_curr_bss_params(struct mwifiex_private *priv,
                                          struct cfg80211_bss *bss)
 {
@@ -1656,7 +1750,8 @@ mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info,
         */
        if (curr_bcn_bytes < ETH_ALEN + sizeof(u8) +
            sizeof(struct mwifiex_fixed_bcn_param)) {
-               dev_err(adapter->dev, "InterpretIE: not enough bytes left\n");
+               mwifiex_dbg(adapter, ERROR,
+                           "InterpretIE: not enough bytes left\n");
                return -EFAULT;
        }
 
@@ -1669,7 +1764,8 @@ mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info,
                rssi = (-rssi) * 100;           /* Convert dBm to mBm */
                current_ptr += sizeof(u8);
                curr_bcn_bytes -= sizeof(u8);
-               dev_dbg(adapter->dev, "info: InterpretIE: RSSI=%d\n", rssi);
+               mwifiex_dbg(adapter, INFO,
+                           "info: InterpretIE: RSSI=%d\n", rssi);
        } else {
                rssi = rssi_val;
        }
@@ -1682,14 +1778,16 @@ mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info,
        beacon_period = le16_to_cpu(bcn_param->beacon_period);
 
        cap_info_bitmap = le16_to_cpu(bcn_param->cap_info_bitmap);
-       dev_dbg(adapter->dev, "info: InterpretIE: capabilities=0x%X\n",
-               cap_info_bitmap);
+       mwifiex_dbg(adapter, INFO,
+                   "info: InterpretIE: capabilities=0x%X\n",
+                   cap_info_bitmap);
 
        /* Rest of the current buffer are IE's */
        ie_buf = current_ptr;
        ie_len = curr_bcn_bytes;
-       dev_dbg(adapter->dev, "info: InterpretIE: IELength for this AP = %d\n",
-               curr_bcn_bytes);
+       mwifiex_dbg(adapter, INFO,
+                   "info: InterpretIE: IELength for this AP = %d\n",
+                   curr_bcn_bytes);
 
        while (curr_bcn_bytes >= sizeof(struct ieee_types_header)) {
                u8 element_id, element_len;
@@ -1698,8 +1796,8 @@ mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info,
                element_len = *(current_ptr + 1);
                if (curr_bcn_bytes < element_len +
                                sizeof(struct ieee_types_header)) {
-                       dev_err(adapter->dev,
-                               "%s: bytes left < IE length\n", __func__);
+                       mwifiex_dbg(adapter, ERROR,
+                                   "%s: bytes left < IE length\n", __func__);
                        return -EFAULT;
                }
                if (element_id == WLAN_EID_DS_PARAMS) {
@@ -1719,8 +1817,8 @@ mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info,
 
                /* Skip entry if on csa closed channel */
                if (channel == priv->csa_chan) {
-                       dev_dbg(adapter->dev,
-                               "Dropping entry on csa closed channel\n");
+                       mwifiex_dbg(adapter, WARN,
+                                   "Dropping entry on csa closed channel\n");
                        return 0;
                }
 
@@ -1741,17 +1839,29 @@ mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info,
                                            bssid, timestamp,
                                            cap_info_bitmap, beacon_period,
                                            ie_buf, ie_len, rssi, GFP_KERNEL);
-                       bss_priv = (struct mwifiex_bss_priv *)bss->priv;
-                       bss_priv->band = band;
-                       bss_priv->fw_tsf = fw_tsf;
-                       if (priv->media_connected &&
-                           !memcmp(bssid, priv->curr_bss_params.bss_descriptor
-                                   .mac_address, ETH_ALEN))
-                               mwifiex_update_curr_bss_params(priv, bss);
-                       cfg80211_put_bss(priv->wdev.wiphy, bss);
+                       if (bss) {
+                               bss_priv = (struct mwifiex_bss_priv *)bss->priv;
+                               bss_priv->band = band;
+                               bss_priv->fw_tsf = fw_tsf;
+                               if (priv->media_connected &&
+                                   !memcmp(bssid, priv->curr_bss_params.
+                                           bss_descriptor.mac_address,
+                                           ETH_ALEN))
+                                       mwifiex_update_curr_bss_params(priv,
+                                                                      bss);
+                               cfg80211_put_bss(priv->wdev.wiphy, bss);
+                       }
+
+                       if ((chan->flags & IEEE80211_CHAN_RADAR) ||
+                           (chan->flags & IEEE80211_CHAN_NO_IR)) {
+                               mwifiex_dbg(adapter, INFO,
+                                           "radar or passive channel %d\n",
+                                           channel);
+                               mwifiex_save_hidden_ssid_channels(priv, bss);
+                       }
                }
        } else {
-               dev_dbg(adapter->dev, "missing BSS channel IE\n");
+               mwifiex_dbg(adapter, WARN, "missing BSS channel IE\n");
        }
 
        return 0;
@@ -1765,12 +1875,64 @@ static void mwifiex_complete_scan(struct mwifiex_private *priv)
        if (adapter->curr_cmd->wait_q_enabled) {
                adapter->cmd_wait_q.status = 0;
                if (!priv->scan_request) {
-                       dev_dbg(adapter->dev, "complete internal scan\n");
+                       mwifiex_dbg(adapter, INFO,
+                                   "complete internal scan\n");
                        mwifiex_complete_cmd(adapter, adapter->curr_cmd);
                }
        }
 }
 
+/* This function checks if any hidden SSID found in passive scan channels
+ * and do specific SSID active scan for those channels
+ */
+static int
+mwifiex_active_scan_req_for_passive_chan(struct mwifiex_private *priv)
+{
+       int ret;
+       struct mwifiex_adapter *adapter = priv->adapter;
+       u8 id = 0;
+       struct mwifiex_user_scan_cfg  *user_scan_cfg;
+
+       if (adapter->active_scan_triggered || !priv->scan_request) {
+               adapter->active_scan_triggered = false;
+               return 0;
+       }
+
+       if (!priv->hidden_chan[0].chan_number) {
+               mwifiex_dbg(adapter, INFO, "No BSS with hidden SSID found on DFS channels\n");
+               return 0;
+       }
+       user_scan_cfg = kzalloc(sizeof(*user_scan_cfg), GFP_KERNEL);
+
+       if (!user_scan_cfg)
+               return -ENOMEM;
+
+       memset(user_scan_cfg, 0, sizeof(*user_scan_cfg));
+
+       for (id = 0; id < MWIFIEX_USER_SCAN_CHAN_MAX; id++) {
+               if (!priv->hidden_chan[id].chan_number)
+                       break;
+               memcpy(&user_scan_cfg->chan_list[id],
+                      &priv->hidden_chan[id],
+                      sizeof(struct mwifiex_user_scan_chan));
+       }
+
+       adapter->active_scan_triggered = true;
+       user_scan_cfg->num_ssids = priv->scan_request->n_ssids;
+       user_scan_cfg->ssid_list = priv->scan_request->ssids;
+
+       ret = mwifiex_scan_networks(priv, user_scan_cfg);
+       kfree(user_scan_cfg);
+
+       memset(&priv->hidden_chan, 0, sizeof(priv->hidden_chan));
+
+       if (ret) {
+               dev_err(priv->adapter->dev, "scan failed: %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
 static void mwifiex_check_next_scan_command(struct mwifiex_private *priv)
 {
        struct mwifiex_adapter *adapter = priv->adapter;
@@ -1784,16 +1946,20 @@ static void mwifiex_check_next_scan_command(struct mwifiex_private *priv)
                adapter->scan_processing = false;
                spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
 
+               mwifiex_active_scan_req_for_passive_chan(priv);
+
                if (!adapter->ext_scan)
                        mwifiex_complete_scan(priv);
 
                if (priv->scan_request) {
-                       dev_dbg(adapter->dev, "info: notifying scan done\n");
+                       mwifiex_dbg(adapter, INFO,
+                                   "info: notifying scan done\n");
                        cfg80211_scan_done(priv->scan_request, 0);
                        priv->scan_request = NULL;
                } else {
                        priv->scan_aborting = false;
-                       dev_dbg(adapter->dev, "info: scan already aborted\n");
+                       mwifiex_dbg(adapter, INFO,
+                                   "info: scan already aborted\n");
                }
        } else if ((priv->scan_aborting && !priv->scan_request) ||
                   priv->scan_block) {
@@ -1808,13 +1974,17 @@ static void mwifiex_check_next_scan_command(struct mwifiex_private *priv)
                adapter->scan_processing = false;
                spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
 
-               if (priv->scan_request) {
-                       dev_dbg(adapter->dev, "info: aborting scan\n");
-                       cfg80211_scan_done(priv->scan_request, 1);
-                       priv->scan_request = NULL;
-               } else {
-                       priv->scan_aborting = false;
-                       dev_dbg(adapter->dev, "info: scan already aborted\n");
+               if (!adapter->active_scan_triggered) {
+                       if (priv->scan_request) {
+                               mwifiex_dbg(adapter, INFO,
+                                           "info: aborting scan\n");
+                               cfg80211_scan_done(priv->scan_request, 1);
+                               priv->scan_request = NULL;
+                       } else {
+                               priv->scan_aborting = false;
+                               mwifiex_dbg(adapter, INFO,
+                                           "info: scan already aborted\n");
+                       }
                }
        } else {
                /* Get scan command from scan_pending_q and put to
@@ -1877,8 +2047,9 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
 
 
        if (scan_rsp->number_of_sets > MWIFIEX_MAX_AP) {
-               dev_err(adapter->dev, "SCAN_RESP: too many AP returned (%d)\n",
-                       scan_rsp->number_of_sets);
+               mwifiex_dbg(adapter, ERROR,
+                           "SCAN_RESP: too many AP returned (%d)\n",
+                           scan_rsp->number_of_sets);
                ret = -1;
                goto check_next_scan;
        }
@@ -1887,14 +2058,15 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
        mwifiex_11h_get_csa_closed_channel(priv);
 
        bytes_left = le16_to_cpu(scan_rsp->bss_descript_size);
-       dev_dbg(adapter->dev, "info: SCAN_RESP: bss_descript_size %d\n",
-               bytes_left);
+       mwifiex_dbg(adapter, INFO,
+                   "info: SCAN_RESP: bss_descript_size %d\n",
+                   bytes_left);
 
        scan_resp_size = le16_to_cpu(resp->size);
 
-       dev_dbg(adapter->dev,
-               "info: SCAN_RESP: returned %d APs before parsing\n",
-               scan_rsp->number_of_sets);
+       mwifiex_dbg(adapter, INFO,
+                   "info: SCAN_RESP: returned %d APs before parsing\n",
+                   scan_rsp->number_of_sets);
 
        bss_info = scan_rsp->bss_desc_and_tlv_buffer;
 
@@ -2007,13 +2179,13 @@ mwifiex_update_chan_statistics(struct mwifiex_private *priv,
                                       le16_to_cpu(fw_chan_stats->cca_scan_dur);
                chan_stats.cca_busy_dur =
                                       le16_to_cpu(fw_chan_stats->cca_busy_dur);
-               dev_dbg(adapter->dev,
-                       "chan=%d, noise=%d, total_network=%d scan_duration=%d, busy_duration=%d\n",
-                       chan_stats.chan_num,
-                       chan_stats.noise,
-                       chan_stats.total_bss,
-                       chan_stats.cca_scan_dur,
-                       chan_stats.cca_busy_dur);
+               mwifiex_dbg(adapter, INFO,
+                           "chan=%d, noise=%d, total_network=%d scan_duration=%d, busy_duration=%d\n",
+                           chan_stats.chan_num,
+                           chan_stats.noise,
+                           chan_stats.total_bss,
+                           chan_stats.cca_scan_dur,
+                           chan_stats.cca_busy_dur);
                memcpy(&adapter->chan_stats[adapter->survey_idx++], &chan_stats,
                       sizeof(struct mwifiex_chan_stats));
                fw_chan_stats++;
@@ -2035,7 +2207,7 @@ int mwifiex_ret_802_11_scan_ext(struct mwifiex_private *priv,
        unsigned long cmd_flags, scan_flags;
        bool complete_scan = false;
 
-       dev_dbg(priv->adapter->dev, "info: EXT scan returns successfully\n");
+       mwifiex_dbg(adapter, INFO, "info: EXT scan returns successfully\n");
 
        ext_scan_resp = &resp->params.ext_scan;
 
@@ -2048,8 +2220,8 @@ int mwifiex_ret_802_11_scan_ext(struct mwifiex_private *priv,
                len = le16_to_cpu(tlv->len);
 
                if (buf_left < (sizeof(struct mwifiex_ie_types_header) + len)) {
-                       dev_err(adapter->dev,
-                               "error processing scan response TLVs");
+                       mwifiex_dbg(adapter, ERROR,
+                                   "error processing scan response TLVs");
                        break;
                }
 
@@ -2075,8 +2247,8 @@ int mwifiex_ret_802_11_scan_ext(struct mwifiex_private *priv,
                        cmd_ptr = (void *)cmd_node->cmd_skb->data;
                        if (le16_to_cpu(cmd_ptr->command) ==
                            HostCmd_CMD_802_11_SCAN_EXT) {
-                               dev_dbg(priv->adapter->dev,
-                                       "Scan pending in command pending list");
+                               mwifiex_dbg(adapter, INFO,
+                                           "Scan pending in command pending list");
                                complete_scan = false;
                                break;
                        }
@@ -2114,17 +2286,20 @@ int mwifiex_handle_event_ext_scan_report(struct mwifiex_private *priv,
        u16 scan_resp_size = le16_to_cpu(event_scan->buf_size);
 
        if (num_of_set > MWIFIEX_MAX_AP) {
-               dev_err(adapter->dev,
-                       "EXT_SCAN: Invalid number of AP returned (%d)!!\n",
-                       num_of_set);
+               mwifiex_dbg(adapter, ERROR,
+                           "EXT_SCAN: Invalid number of AP returned (%d)!!\n",
+                           num_of_set);
                ret = -1;
                goto check_next_scan;
        }
 
        bytes_left = scan_resp_size;
-       dev_dbg(adapter->dev,
-               "EXT_SCAN: size %d, returned %d APs...",
-               scan_resp_size, num_of_set);
+       mwifiex_dbg(adapter, INFO,
+                   "EXT_SCAN: size %d, returned %d APs...",
+                   scan_resp_size, num_of_set);
+       mwifiex_dbg_dump(adapter, CMD_D, "EXT_SCAN buffer:", buf,
+                        scan_resp_size +
+                        sizeof(struct mwifiex_event_scan_result));
 
        tlv = (struct mwifiex_ie_types_data *)scan_resp;
 
@@ -2132,7 +2307,8 @@ int mwifiex_handle_event_ext_scan_report(struct mwifiex_private *priv,
                type = le16_to_cpu(tlv->header.type);
                len = le16_to_cpu(tlv->header.len);
                if (bytes_left < sizeof(struct mwifiex_ie_types_header) + len) {
-                       dev_err(adapter->dev, "EXT_SCAN: Error bytes left < TLV length\n");
+                       mwifiex_dbg(adapter, ERROR,
+                                   "EXT_SCAN: Error bytes left < TLV length\n");
                        break;
                }
                scan_rsp_tlv = NULL;
@@ -2158,8 +2334,9 @@ int mwifiex_handle_event_ext_scan_report(struct mwifiex_private *priv,
                        len = le16_to_cpu(tlv->header.len);
                        if (bytes_left_for_tlv <
                            sizeof(struct mwifiex_ie_types_header) + len) {
-                               dev_err(adapter->dev,
-                                       "EXT_SCAN: Error in processing TLV, bytes left < TLV length\n");
+                               mwifiex_dbg(adapter, ERROR,
+                                           "EXT_SCAN: Error in processing TLV,\t"
+                                           "bytes left < TLV length\n");
                                scan_rsp_tlv = NULL;
                                bytes_left_for_tlv = 0;
                                continue;
@@ -2199,8 +2376,8 @@ int mwifiex_handle_event_ext_scan_report(struct mwifiex_private *priv,
                if (scan_info_tlv) {
                        rssi = (s32)(s16)(le16_to_cpu(scan_info_tlv->rssi));
                        rssi *= 100;           /* Convert dBm to mBm */
-                       dev_dbg(adapter->dev,
-                               "info: InterpretIE: RSSI=%d\n", rssi);
+                       mwifiex_dbg(adapter, INFO,
+                                   "info: InterpretIE: RSSI=%d\n", rssi);
                        fw_tsf = le64_to_cpu(scan_info_tlv->tsf);
                        radio_type = &scan_info_tlv->radio_type;
                } else {
@@ -2271,13 +2448,14 @@ static int mwifiex_scan_specific_ssid(struct mwifiex_private *priv,
        struct mwifiex_user_scan_cfg *scan_cfg;
 
        if (adapter->scan_processing) {
-               dev_err(adapter->dev, "cmd: Scan already in process...\n");
+               mwifiex_dbg(adapter, WARN,
+                           "cmd: Scan already in process...\n");
                return -EBUSY;
        }
 
        if (priv->scan_block) {
-               dev_err(adapter->dev,
-                       "cmd: Scan is blocked during association...\n");
+               mwifiex_dbg(adapter, WARN,
+                           "cmd: Scan is blocked during association...\n");
                return -EBUSY;
        }
 
@@ -2309,8 +2487,9 @@ int mwifiex_request_scan(struct mwifiex_private *priv,
        int ret;
 
        if (down_interruptible(&priv->async_sem)) {
-               dev_err(priv->adapter->dev, "%s: acquire semaphore\n",
-                       __func__);
+               mwifiex_dbg(priv->adapter, ERROR,
+                           "%s: acquire semaphore fail\n",
+                           __func__);
                return -1;
        }
 
@@ -2400,8 +2579,9 @@ mwifiex_save_curr_bcn(struct mwifiex_private *priv)
 
        memcpy(priv->curr_bcn_buf, curr_bss->beacon_buf,
               curr_bss->beacon_buf_size);
-       dev_dbg(priv->adapter->dev, "info: current beacon saved %d\n",
-               priv->curr_bcn_size);
+       mwifiex_dbg(priv->adapter, INFO,
+                   "info: current beacon saved %d\n",
+                   priv->curr_bcn_size);
 
        curr_bss->beacon_buf = priv->curr_bcn_buf;