From 7dc9ddc25f62c14ae86d1805ce4e6bf2b14970e8 Mon Sep 17 00:00:00 2001 From: Ashwin <ashwin.bhat@broadcom.com> Date: Tue, 6 Oct 2015 19:07:06 -0700 Subject: [PATCH] net: wireless: bcmdhd: Ensure chbuckets dont overwrite Gscan: If total number of channels from all chbuckets > 64 there is a chance that we may overshoot when filling in channel bucket information for FW because of differing chbucket counts between what dhd has and what can be programmed to FW. BUG=24469238 Signed-off-by: Ashwin <ashwin.bhat@broadcom.com> --- drivers/net/wireless/bcmdhd/dhd_pno.c | 35 +++++++++++++-------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/drivers/net/wireless/bcmdhd/dhd_pno.c b/drivers/net/wireless/bcmdhd/dhd_pno.c index adca6843b415..33c570045167 100644 --- a/drivers/net/wireless/bcmdhd/dhd_pno.c +++ b/drivers/net/wireless/bcmdhd/dhd_pno.c @@ -2088,7 +2088,7 @@ static int dhd_pno_set_for_gscan(dhd_pub_t *dhd, struct dhd_pno_gscan_params *gscan_params) { int err = BCME_OK; - int mode, i = 0, k; + int mode, i = 0; uint16 _chan_list[WL_NUMCHANNELS]; int tot_nchan = 0; int num_buckets_to_fw, tot_num_buckets, gscan_param_size; @@ -2202,20 +2202,17 @@ dhd_pno_set_for_gscan(dhd_pub_t *dhd, struct dhd_pno_gscan_params *gscan_params) pfn_gscan_cfg_t->count_of_channel_buckets = num_buckets_to_fw; pfn_gscan_cfg_t->retry_threshold = GSCAN_RETRY_THRESHOLD; - for (i = 0, k = 0; i < tot_num_buckets; i++) { - if (ch_bucket[i].bucket_end_index != CHANNEL_BUCKET_EMPTY_INDEX) { - pfn_gscan_cfg_t->channel_bucket[k].bucket_end_index = - ch_bucket[i].bucket_end_index; - pfn_gscan_cfg_t->channel_bucket[k].bucket_freq_multiple = - ch_bucket[i].bucket_freq_multiple; - pfn_gscan_cfg_t->channel_bucket[k].max_freq_multiple = - ch_bucket[i].max_freq_multiple; - pfn_gscan_cfg_t->channel_bucket[k].repeat = - ch_bucket[i].repeat; - pfn_gscan_cfg_t->channel_bucket[k].flag = - ch_bucket[i].flag; - k++; - } + for (i = 0; i < num_buckets_to_fw; i++) { + pfn_gscan_cfg_t->channel_bucket[i].bucket_end_index = + ch_bucket[i].bucket_end_index; + pfn_gscan_cfg_t->channel_bucket[i].bucket_freq_multiple = + ch_bucket[i].bucket_freq_multiple; + pfn_gscan_cfg_t->channel_bucket[i].max_freq_multiple = + ch_bucket[i].max_freq_multiple; + pfn_gscan_cfg_t->channel_bucket[i].repeat = + ch_bucket[i].repeat; + pfn_gscan_cfg_t->channel_bucket[i].flag = + ch_bucket[i].flag; } tot_nchan = pfn_gscan_cfg_t->channel_bucket[num_buckets_to_fw - 1].bucket_end_index + 1; @@ -2736,7 +2733,7 @@ static int _dhd_pno_get_gscan_batch_from_fw(dhd_pub_t *dhd) /* Unlikely to happen, but just in case the results from * FW doesnt make sense..... Assume its part of one single scan */ - if (num_scans_in_cur_iter > gscan_params->mscan) { + if (num_scans_in_cur_iter >= gscan_params->mscan) { num_scans_in_cur_iter = 0; count = plbestnet->count; break; @@ -2748,8 +2745,10 @@ static int _dhd_pno_get_gscan_batch_from_fw(dhd_pub_t *dhd) } timestamp = plnetinfo->timestamp; } - nAPs_per_scan[num_scans_in_cur_iter] = count; - num_scans_in_cur_iter++; + if (num_scans_in_cur_iter < gscan_params->mscan) { + nAPs_per_scan[num_scans_in_cur_iter] = count; + num_scans_in_cur_iter++; + } DHD_PNO(("num_scans_in_cur_iter %d\n", num_scans_in_cur_iter)); plnetinfo = &plbestnet->netinfo[0]; -- GitLab