@@ -3980,17 +3980,11 @@ brcmf_alloc_internal_escan_request(struct wiphy *wiphy, u32 n_netinfo) {
39803980}
39813981
39823982static int brcmf_internal_escan_add_info (struct cfg80211_scan_request * req ,
3983- u8 * ssid , u8 ssid_len , u8 channel )
3983+ u8 * ssid , u8 ssid_len , u8 channel , enum nl80211_band band )
39843984{
39853985 struct ieee80211_channel * chan ;
3986- enum nl80211_band band ;
39873986 int freq , i ;
39883987
3989- if (channel <= CH_MAX_2G_CHANNEL )
3990- band = NL80211_BAND_2GHZ ;
3991- else
3992- band = NL80211_BAND_5GHZ ;
3993-
39943988 freq = ieee80211_channel_to_frequency (channel , band );
39953989 if (!freq )
39963990 return - EINVAL ;
@@ -4046,53 +4040,30 @@ static int brcmf_start_internal_escan(struct brcmf_if *ifp, u32 fwmap,
40464040 return 0 ;
40474041}
40484042
4049- static struct brcmf_pno_net_info_le *
4050- brcmf_get_netinfo_array (struct brcmf_pno_scanresults_le * pfn_v1 )
4051- {
4052- struct brcmf_pno_scanresults_v2_le * pfn_v2 ;
4053- struct brcmf_pno_net_info_le * netinfo ;
4054-
4055- switch (pfn_v1 -> version ) {
4056- default :
4057- WARN_ON (1 );
4058- fallthrough ;
4059- case cpu_to_le32 (1 ):
4060- netinfo = (struct brcmf_pno_net_info_le * )(pfn_v1 + 1 );
4061- break ;
4062- case cpu_to_le32 (2 ):
4063- pfn_v2 = (struct brcmf_pno_scanresults_v2_le * )pfn_v1 ;
4064- netinfo = (struct brcmf_pno_net_info_le * )(pfn_v2 + 1 );
4065- break ;
4066- }
4067-
4068- return netinfo ;
4069- }
4070-
40714043/* PFN result doesn't have all the info which are required by the supplicant
40724044 * (For e.g IEs) Do a target Escan so that sched scan results are reported
40734045 * via wl_inform_single_bss in the required format. Escan does require the
40744046 * scan request in the form of cfg80211_scan_request. For timebeing, create
40754047 * cfg80211_scan_request one out of the received PNO event.
40764048 */
4077- static s32
4078- brcmf_notify_sched_scan_results ( struct brcmf_if * ifp ,
4079- const struct brcmf_event_msg * e , void * data )
4049+ static s32 brcmf_notify_sched_scan_results ( struct brcmf_if * ifp ,
4050+ const struct brcmf_event_msg * e ,
4051+ void * data )
40804052{
40814053 struct brcmf_pub * drvr = ifp -> drvr ;
40824054 struct brcmf_cfg80211_info * cfg = drvr -> config ;
4083- struct brcmf_pno_net_info_le * netinfo , * netinfo_start ;
40844055 struct cfg80211_scan_request * request = NULL ;
40854056 struct wiphy * wiphy = cfg_to_wiphy (cfg );
40864057 int i , err = 0 ;
4087- struct brcmf_pno_scanresults_le * pfn_result ;
40884058 u32 bucket_map ;
40894059 u32 result_count ;
40904060 u32 status ;
4091- u32 datalen ;
4061+ u32 min_data_len ;
40924062
40934063 brcmf_dbg (SCAN , "Enter\n" );
4064+ min_data_len = drvr -> pno_handler .get_min_data_len ();
40944065
4095- if (e -> datalen < ( sizeof ( * pfn_result ) + sizeof ( * netinfo )) ) {
4066+ if (e -> datalen < min_data_len ) {
40964067 brcmf_dbg (SCAN , "Event data to small. Ignore\n" );
40974068 return 0 ;
40984069 }
@@ -4102,9 +4073,8 @@ brcmf_notify_sched_scan_results(struct brcmf_if *ifp,
41024073 return 0 ;
41034074 }
41044075
4105- pfn_result = (struct brcmf_pno_scanresults_le * )data ;
4106- result_count = le32_to_cpu (pfn_result -> count );
4107- status = le32_to_cpu (pfn_result -> status );
4076+ result_count = drvr -> pno_handler .get_result_count (data );
4077+ status = drvr -> pno_handler .get_result_status (data );
41084078
41094079 /* PFN event is limited to fit 512 bytes so we may get
41104080 * multiple NET_FOUND events. For now place a warning here.
@@ -4115,38 +4085,33 @@ brcmf_notify_sched_scan_results(struct brcmf_if *ifp,
41154085 bphy_err (drvr , "FALSE PNO Event. (pfn_count == 0)\n" );
41164086 goto out_err ;
41174087 }
4118-
4119- netinfo_start = brcmf_get_netinfo_array (pfn_result );
4120- datalen = e -> datalen - ((void * )netinfo_start - (void * )pfn_result );
4121- if (datalen < result_count * sizeof (* netinfo )) {
4122- bphy_err (drvr , "insufficient event data\n" );
4088+ err = drvr -> pno_handler .validate_pfn_results (data , e -> datalen );
4089+ if (err ) {
4090+ bphy_err (drvr , "Invalid escan results (%d)" , err );
41234091 goto out_err ;
41244092 }
4125-
4126- request = brcmf_alloc_internal_escan_request (wiphy ,
4127- result_count );
4093+ request = brcmf_alloc_internal_escan_request (wiphy , result_count );
41284094 if (!request ) {
41294095 err = - ENOMEM ;
41304096 goto out_err ;
41314097 }
4132-
41334098 bucket_map = 0 ;
41344099 for (i = 0 ; i < result_count ; i ++ ) {
4135- netinfo = & netinfo_start [i ];
4136-
4137- if (netinfo -> SSID_len > IEEE80211_MAX_SSID_LEN )
4138- netinfo -> SSID_len = IEEE80211_MAX_SSID_LEN ;
4139- brcmf_dbg (SCAN , "SSID:%.32s Channel:%d\n" ,
4140- netinfo -> SSID , netinfo -> channel );
4141- bucket_map |= brcmf_pno_get_bucket_map (cfg -> pno , netinfo );
4142- err = brcmf_internal_escan_add_info (request ,
4143- netinfo -> SSID ,
4144- netinfo -> SSID_len ,
4145- netinfo -> channel );
4100+ u8 channel ;
4101+ enum nl80211_band band ;
4102+ u8 ssid [IEEE80211_MAX_SSID_LEN ];
4103+ u8 ssid_len ;
4104+
4105+ drvr -> pno_handler .get_result_info (data , i , & ssid , & ssid_len ,
4106+ & channel , & band );
4107+ brcmf_dbg (SCAN , "SSID:%.32s Channel:%d Band:%d\n" , ssid ,
4108+ channel , band );
4109+ bucket_map |= drvr -> pno_handler .get_bucket_map (data , i , cfg -> pno );
4110+ err = brcmf_internal_escan_add_info (request , ssid , ssid_len ,
4111+ channel , band );
41464112 if (err )
41474113 goto out_err ;
41484114 }
4149-
41504115 if (!bucket_map )
41514116 goto free_req ;
41524117
@@ -4249,48 +4214,50 @@ static s32 brcmf_config_wowl_pattern(struct brcmf_if *ifp, u8 cmd[4],
42494214 return ret ;
42504215}
42514216
4252- static s32
4253- brcmf_wowl_nd_results (struct brcmf_if * ifp , const struct brcmf_event_msg * e ,
4254- void * data )
4217+ static s32 brcmf_wowl_nd_results (struct brcmf_if * ifp ,
4218+ const struct brcmf_event_msg * e , void * data )
42554219{
42564220 struct brcmf_pub * drvr = ifp -> drvr ;
42574221 struct brcmf_cfg80211_info * cfg = drvr -> config ;
4258- struct brcmf_pno_scanresults_le * pfn_result ;
4259- struct brcmf_pno_net_info_le * netinfo ;
4222+ u32 min_data_len ;
4223+ u8 channel ;
4224+ enum nl80211_band band ;
4225+ u8 ssid [IEEE80211_MAX_SSID_LEN ];
4226+ u8 ssid_len ;
4227+ u32 result_count ;
42604228
42614229 brcmf_dbg (SCAN , "Enter\n" );
42624230
4263- if (e -> datalen < (sizeof (* pfn_result ) + sizeof (* netinfo ))) {
4231+ min_data_len = drvr -> pno_handler .get_min_data_len ();
4232+
4233+ if (e -> datalen < min_data_len ) {
42644234 brcmf_dbg (SCAN , "Event data to small. Ignore\n" );
42654235 return 0 ;
42664236 }
42674237
4268- pfn_result = (struct brcmf_pno_scanresults_le * )data ;
42694238
42704239 if (e -> event_code == BRCMF_E_PFN_NET_LOST ) {
42714240 brcmf_dbg (SCAN , "PFN NET LOST event. Ignore\n" );
42724241 return 0 ;
42734242 }
42744243
4275- if (le32_to_cpu (pfn_result -> count ) < 1 ) {
4244+ result_count = drvr -> pno_handler .get_result_count (data );
4245+ if (result_count < 1 ) {
42764246 bphy_err (drvr , "Invalid result count, expected 1 (%d)\n" ,
4277- le32_to_cpu ( pfn_result -> count ) );
4247+ result_count );
42784248 return - EINVAL ;
42794249 }
42804250
4281- netinfo = brcmf_get_netinfo_array (pfn_result );
4282- if (netinfo -> SSID_len > IEEE80211_MAX_SSID_LEN )
4283- netinfo -> SSID_len = IEEE80211_MAX_SSID_LEN ;
4284- memcpy (cfg -> wowl .nd -> ssid .ssid , netinfo -> SSID , netinfo -> SSID_len );
4285- cfg -> wowl .nd -> ssid .ssid_len = netinfo -> SSID_len ;
4251+ drvr -> pno_handler .get_result_info (data , 0 , & ssid , & ssid_len , & channel ,
4252+ & band );
4253+ memcpy (cfg -> wowl .nd -> ssid .ssid , ssid , ssid_len );
4254+ cfg -> wowl .nd -> ssid .ssid_len = ssid_len ;
42864255 cfg -> wowl .nd -> n_channels = 1 ;
42874256 cfg -> wowl .nd -> channels [0 ] =
4288- ieee80211_channel_to_frequency (netinfo -> channel ,
4289- netinfo -> channel <= CH_MAX_2G_CHANNEL ?
4290- NL80211_BAND_2GHZ : NL80211_BAND_5GHZ );
4257+ ieee80211_channel_to_frequency (channel , band );
4258+
42914259 cfg -> wowl .nd_info -> n_matches = 1 ;
42924260 cfg -> wowl .nd_info -> matches [0 ] = cfg -> wowl .nd ;
4293-
42944261 /* Inform (the resume task) that the net detect information was recvd */
42954262 cfg -> wowl .nd_data_completed = true;
42964263 wake_up (& cfg -> wowl .nd_data_wait );
0 commit comments