@@ -4002,17 +4002,11 @@ brcmf_alloc_internal_escan_request(struct wiphy *wiphy, u32 n_netinfo) {
40024002}
40034003
40044004static int brcmf_internal_escan_add_info (struct cfg80211_scan_request * req ,
4005- u8 * ssid , u8 ssid_len , u8 channel )
4005+ u8 * ssid , u8 ssid_len , u8 channel , enum nl80211_band band )
40064006{
40074007 struct ieee80211_channel * chan ;
4008- enum nl80211_band band ;
40094008 int freq , i ;
40104009
4011- if (channel <= CH_MAX_2G_CHANNEL )
4012- band = NL80211_BAND_2GHZ ;
4013- else
4014- band = NL80211_BAND_5GHZ ;
4015-
40164010 freq = ieee80211_channel_to_frequency (channel , band );
40174011 if (!freq )
40184012 return - EINVAL ;
@@ -4068,53 +4062,30 @@ static int brcmf_start_internal_escan(struct brcmf_if *ifp, u32 fwmap,
40684062 return 0 ;
40694063}
40704064
4071- static struct brcmf_pno_net_info_le *
4072- brcmf_get_netinfo_array (struct brcmf_pno_scanresults_le * pfn_v1 )
4073- {
4074- struct brcmf_pno_scanresults_v2_le * pfn_v2 ;
4075- struct brcmf_pno_net_info_le * netinfo ;
4076-
4077- switch (pfn_v1 -> version ) {
4078- default :
4079- WARN_ON (1 );
4080- fallthrough ;
4081- case cpu_to_le32 (1 ):
4082- netinfo = (struct brcmf_pno_net_info_le * )(pfn_v1 + 1 );
4083- break ;
4084- case cpu_to_le32 (2 ):
4085- pfn_v2 = (struct brcmf_pno_scanresults_v2_le * )pfn_v1 ;
4086- netinfo = (struct brcmf_pno_net_info_le * )(pfn_v2 + 1 );
4087- break ;
4088- }
4089-
4090- return netinfo ;
4091- }
4092-
40934065/* PFN result doesn't have all the info which are required by the supplicant
40944066 * (For e.g IEs) Do a target Escan so that sched scan results are reported
40954067 * via wl_inform_single_bss in the required format. Escan does require the
40964068 * scan request in the form of cfg80211_scan_request. For timebeing, create
40974069 * cfg80211_scan_request one out of the received PNO event.
40984070 */
4099- static s32
4100- brcmf_notify_sched_scan_results ( struct brcmf_if * ifp ,
4101- const struct brcmf_event_msg * e , void * data )
4071+ static s32 brcmf_notify_sched_scan_results ( struct brcmf_if * ifp ,
4072+ const struct brcmf_event_msg * e ,
4073+ void * data )
41024074{
41034075 struct brcmf_pub * drvr = ifp -> drvr ;
41044076 struct brcmf_cfg80211_info * cfg = drvr -> config ;
4105- struct brcmf_pno_net_info_le * netinfo , * netinfo_start ;
41064077 struct cfg80211_scan_request * request = NULL ;
41074078 struct wiphy * wiphy = cfg_to_wiphy (cfg );
41084079 int i , err = 0 ;
4109- struct brcmf_pno_scanresults_le * pfn_result ;
41104080 u32 bucket_map ;
41114081 u32 result_count ;
41124082 u32 status ;
4113- u32 datalen ;
4083+ u32 min_data_len ;
41144084
41154085 brcmf_dbg (SCAN , "Enter\n" );
4086+ min_data_len = drvr -> pno_handler .get_min_data_len ();
41164087
4117- if (e -> datalen < ( sizeof ( * pfn_result ) + sizeof ( * netinfo )) ) {
4088+ if (e -> datalen < min_data_len ) {
41184089 brcmf_dbg (SCAN , "Event data too small. Ignore\n" );
41194090 return 0 ;
41204091 }
@@ -4124,9 +4095,8 @@ brcmf_notify_sched_scan_results(struct brcmf_if *ifp,
41244095 return 0 ;
41254096 }
41264097
4127- pfn_result = (struct brcmf_pno_scanresults_le * )data ;
4128- result_count = le32_to_cpu (pfn_result -> count );
4129- status = le32_to_cpu (pfn_result -> status );
4098+ result_count = drvr -> pno_handler .get_result_count (data );
4099+ status = drvr -> pno_handler .get_result_status (data );
41304100
41314101 /* PFN event is limited to fit 512 bytes so we may get
41324102 * multiple NET_FOUND events. For now place a warning here.
@@ -4137,38 +4107,33 @@ brcmf_notify_sched_scan_results(struct brcmf_if *ifp,
41374107 bphy_err (drvr , "FALSE PNO Event. (pfn_count == 0)\n" );
41384108 goto out_err ;
41394109 }
4140-
4141- netinfo_start = brcmf_get_netinfo_array (pfn_result );
4142- datalen = e -> datalen - ((void * )netinfo_start - (void * )pfn_result );
4143- if (datalen < result_count * sizeof (* netinfo )) {
4144- bphy_err (drvr , "insufficient event data\n" );
4110+ err = drvr -> pno_handler .validate_pfn_results (data , e -> datalen );
4111+ if (err ) {
4112+ bphy_err (drvr , "Invalid escan results (%d)" , err );
41454113 goto out_err ;
41464114 }
4147-
4148- request = brcmf_alloc_internal_escan_request (wiphy ,
4149- result_count );
4115+ request = brcmf_alloc_internal_escan_request (wiphy , result_count );
41504116 if (!request ) {
41514117 err = - ENOMEM ;
41524118 goto out_err ;
41534119 }
4154-
41554120 bucket_map = 0 ;
41564121 for (i = 0 ; i < result_count ; i ++ ) {
4157- netinfo = & netinfo_start [i ];
4158-
4159- if (netinfo -> SSID_len > IEEE80211_MAX_SSID_LEN )
4160- netinfo -> SSID_len = IEEE80211_MAX_SSID_LEN ;
4161- brcmf_dbg (SCAN , "SSID:%.32s Channel:%d\n" ,
4162- netinfo -> SSID , netinfo -> channel );
4163- bucket_map |= brcmf_pno_get_bucket_map (cfg -> pno , netinfo );
4164- err = brcmf_internal_escan_add_info (request ,
4165- netinfo -> SSID ,
4166- netinfo -> SSID_len ,
4167- netinfo -> channel );
4122+ u8 channel ;
4123+ enum nl80211_band band ;
4124+ u8 ssid [IEEE80211_MAX_SSID_LEN ];
4125+ u8 ssid_len ;
4126+
4127+ drvr -> pno_handler .get_result_info (data , i , & ssid , & ssid_len ,
4128+ & channel , & band );
4129+ brcmf_dbg (SCAN , "SSID:%.32s Channel:%d Band:%d\n" , ssid ,
4130+ channel , band );
4131+ bucket_map |= drvr -> pno_handler .get_bucket_map (data , i , cfg -> pno );
4132+ err = brcmf_internal_escan_add_info (request , ssid , ssid_len ,
4133+ channel , band );
41684134 if (err )
41694135 goto out_err ;
41704136 }
4171-
41724137 if (!bucket_map )
41734138 goto free_req ;
41744139
@@ -4271,48 +4236,50 @@ static s32 brcmf_config_wowl_pattern(struct brcmf_if *ifp, u8 cmd[4],
42714236 return ret ;
42724237}
42734238
4274- static s32
4275- brcmf_wowl_nd_results (struct brcmf_if * ifp , const struct brcmf_event_msg * e ,
4276- void * data )
4239+ static s32 brcmf_wowl_nd_results (struct brcmf_if * ifp ,
4240+ const struct brcmf_event_msg * e , void * data )
42774241{
42784242 struct brcmf_pub * drvr = ifp -> drvr ;
42794243 struct brcmf_cfg80211_info * cfg = drvr -> config ;
4280- struct brcmf_pno_scanresults_le * pfn_result ;
4281- struct brcmf_pno_net_info_le * netinfo ;
4244+ u32 min_data_len ;
4245+ u8 channel ;
4246+ enum nl80211_band band ;
4247+ u8 ssid [IEEE80211_MAX_SSID_LEN ];
4248+ u8 ssid_len ;
4249+ u32 result_count ;
42824250
42834251 brcmf_dbg (SCAN , "Enter\n" );
42844252
4285- if (e -> datalen < (sizeof (* pfn_result ) + sizeof (* netinfo ))) {
4253+ min_data_len = drvr -> pno_handler .get_min_data_len ();
4254+
4255+ if (e -> datalen < min_data_len ) {
42864256 brcmf_dbg (SCAN , "Event data too small. Ignore\n" );
42874257 return 0 ;
42884258 }
42894259
4290- pfn_result = (struct brcmf_pno_scanresults_le * )data ;
42914260
42924261 if (e -> event_code == BRCMF_E_PFN_NET_LOST ) {
42934262 brcmf_dbg (SCAN , "PFN NET LOST event. Ignore\n" );
42944263 return 0 ;
42954264 }
42964265
4297- if (le32_to_cpu (pfn_result -> count ) < 1 ) {
4266+ result_count = drvr -> pno_handler .get_result_count (data );
4267+ if (result_count < 1 ) {
42984268 bphy_err (drvr , "Invalid result count, expected 1 (%d)\n" ,
4299- le32_to_cpu ( pfn_result -> count ) );
4269+ result_count );
43004270 return - EINVAL ;
43014271 }
43024272
4303- netinfo = brcmf_get_netinfo_array (pfn_result );
4304- if (netinfo -> SSID_len > IEEE80211_MAX_SSID_LEN )
4305- netinfo -> SSID_len = IEEE80211_MAX_SSID_LEN ;
4306- memcpy (cfg -> wowl .nd -> ssid .ssid , netinfo -> SSID , netinfo -> SSID_len );
4307- cfg -> wowl .nd -> ssid .ssid_len = netinfo -> SSID_len ;
4273+ drvr -> pno_handler .get_result_info (data , 0 , & ssid , & ssid_len , & channel ,
4274+ & band );
4275+ memcpy (cfg -> wowl .nd -> ssid .ssid , ssid , ssid_len );
4276+ cfg -> wowl .nd -> ssid .ssid_len = ssid_len ;
43084277 cfg -> wowl .nd -> n_channels = 1 ;
43094278 cfg -> wowl .nd -> channels [0 ] =
4310- ieee80211_channel_to_frequency (netinfo -> channel ,
4311- netinfo -> channel <= CH_MAX_2G_CHANNEL ?
4312- NL80211_BAND_2GHZ : NL80211_BAND_5GHZ );
4279+ ieee80211_channel_to_frequency (channel , band );
4280+
43134281 cfg -> wowl .nd_info -> n_matches = 1 ;
43144282 cfg -> wowl .nd_info -> matches [0 ] = cfg -> wowl .nd ;
4315-
43164283 /* Inform (the resume task) that the net detect information was recvd */
43174284 cfg -> wowl .nd_data_completed = true;
43184285 wake_up (& cfg -> wowl .nd_data_wait );
0 commit comments