@@ -1092,6 +1092,28 @@ static void brcmf_scan_params_v2_to_v1(struct brcmf_scan_params_v2_le *params_v2
10921092 & params_v2_le -> channel_list [0 ], params_size );
10931093}
10941094
1095+ static u32 brcmf_nl80211_scan_flags_to_scan_flags (u32 nl80211_flags )
1096+ {
1097+ u32 scan_flags = 0 ;
1098+ if (nl80211_flags & NL80211_SCAN_FLAG_LOW_SPAN ) {
1099+ scan_flags |= BRCMF_SCANFLAGS_LOW_SPAN ;
1100+ brcmf_dbg (SCAN , "requested low span scan\n" );
1101+ }
1102+ if (nl80211_flags & NL80211_SCAN_FLAG_HIGH_ACCURACY ) {
1103+ scan_flags |= BRCMF_SCANFLAGS_HIGH_ACCURACY ;
1104+ brcmf_dbg (SCAN , "requested high accuracy scan\n" );
1105+ }
1106+ if (nl80211_flags & NL80211_SCAN_FLAG_LOW_POWER ) {
1107+ scan_flags |= BRCMF_SCANFLAGS_LOW_POWER ;
1108+ brcmf_dbg (SCAN , "requested low power scan\n" );
1109+ }
1110+ if (nl80211_flags & NL80211_SCAN_FLAG_LOW_PRIORITY ) {
1111+ scan_flags |= BRCMF_SCANFLAGS_LOW_PRIO ;
1112+ brcmf_dbg (SCAN , "requested low priority scan\n" );
1113+ }
1114+ return scan_flags ;
1115+ }
1116+
10951117static void brcmf_escan_prep (struct brcmf_cfg80211_info * cfg ,
10961118 struct brcmf_if * ifp ,
10971119 struct brcmf_scan_params_v2_le * params_le ,
@@ -1105,6 +1127,7 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
11051127 char * ptr ;
11061128 int length ;
11071129 struct brcmf_ssid_le ssid_le ;
1130+ u32 scan_type = BRCMF_SCANTYPE_ACTIVE ;
11081131
11091132 eth_broadcast_addr (params_le -> bssid );
11101133
@@ -1117,7 +1140,6 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
11171140
11181141 params_le -> bss_type = DOT11_BSSTYPE_ANY ;
11191142 params_le -> ssid_type = 0 ;
1120- params_le -> scan_type = cpu_to_le32 (BRCMF_SCANTYPE_ACTIVE );
11211143 params_le -> channel_num = 0 ;
11221144 params_le -> nprobes = cpu_to_le32 (-1 );
11231145 params_le -> active_time = cpu_to_le32 (-1 );
@@ -1177,9 +1199,17 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
11771199 }
11781200 } else {
11791201 brcmf_dbg (SCAN , "Performing passive scan\n" );
1180- params_le -> scan_type = cpu_to_le32 ( BRCMF_SCANTYPE_PASSIVE ) ;
1202+ scan_type = BRCMF_SCANTYPE_PASSIVE ;
11811203 }
1204+ scan_type |= brcmf_nl80211_scan_flags_to_scan_flags (request -> flags );
1205+ params_le -> scan_type = cpu_to_le32 (scan_type );
11821206 params_le -> length = cpu_to_le16 (length );
1207+
1208+ /* Include RNR results if requested */
1209+ if (request -> flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ ) {
1210+ params_le -> ssid_type |= BRCMF_SCANSSID_INC_RNR ;
1211+ }
1212+
11831213 /* Adding mask to channel numbers */
11841214 params_le -> channel_num =
11851215 cpu_to_le32 ((n_ssids << BRCMF_SCAN_PARAMS_NSSID_SHIFT ) |
@@ -7865,6 +7895,13 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
78657895 }
78667896 if (brcmf_feat_is_enabled (ifp , BRCMF_FEAT_SAE_EXT ))
78677897 wiphy -> features |= NL80211_FEATURE_SAE ;
7898+
7899+ /* High accuracy and low power scans are always supported. */
7900+ wiphy_ext_feature_set (wiphy , NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN );
7901+ wiphy_ext_feature_set (wiphy , NL80211_EXT_FEATURE_LOW_POWER_SCAN );
7902+ wiphy_ext_feature_set (wiphy , NL80211_EXT_FEATURE_LOW_SPAN_SCAN );
7903+ wiphy -> features |= NL80211_FEATURE_LOW_PRIORITY_SCAN ;
7904+
78687905 wiphy -> mgmt_stypes = brcmf_txrx_stypes ;
78697906 wiphy -> max_remain_on_channel_duration = 5000 ;
78707907 if (brcmf_feat_is_enabled (ifp , BRCMF_FEAT_PNO )) {
0 commit comments