mac80211: brcmfmac: backport important changes from the 4.12
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / 319-v4.12-0009-brcmfmac-only-add-channels-and-ssids-once-in-scan-re.patch
1 From 6ea51fc708aedcf411f355de65a704ecda501bc4 Mon Sep 17 00:00:00 2001
2 From: Arend Van Spriel <arend.vanspriel@broadcom.com>
3 Date: Thu, 6 Apr 2017 13:14:42 +0100
4 Subject: [PATCH] brcmfmac: only add channels and ssids once in scan request
5
6 When receiving pno results there may be duplicate channels and/or
7 ssids. Assure each is added only once when preparing the internal
8 escan request.
9
10 Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
11 Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
12 Reviewed-by: Franky Lin <franky.lin@broadcom.com>
13 Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
14 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
15 ---
16 .../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 20 ++++++++++++++++----
17 1 file changed, 16 insertions(+), 4 deletions(-)
18
19 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
20 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
21 @@ -3216,7 +3216,7 @@ static int brcmf_internal_escan_add_info
22 {
23 struct ieee80211_channel *chan;
24 enum nl80211_band band;
25 - int freq;
26 + int freq, i;
27
28 if (channel <= CH_MAX_2G_CHANNEL)
29 band = NL80211_BAND_2GHZ;
30 @@ -3231,10 +3231,22 @@ static int brcmf_internal_escan_add_info
31 if (!chan)
32 return -EINVAL;
33
34 - req->channels[req->n_channels++] = chan;
35 - memcpy(req->ssids[req->n_ssids].ssid, ssid, ssid_len);
36 - req->ssids[req->n_ssids++].ssid_len = ssid_len;
37 -
38 + for (i = 0; i < req->n_channels; i++) {
39 + if (req->channels[i] == chan)
40 + break;
41 + }
42 + if (i == req->n_channels)
43 + req->channels[req->n_channels++] = chan;
44 +
45 + for (i = 0; i < req->n_ssids; i++) {
46 + if (req->ssids[i].ssid_len == ssid_len &&
47 + !memcmp(req->ssids[i].ssid, ssid, ssid_len))
48 + break;
49 + }
50 + if (i == req->n_ssids) {
51 + memcpy(req->ssids[req->n_ssids].ssid, ssid, ssid_len);
52 + req->ssids[req->n_ssids++].ssid_len = ssid_len;
53 + }
54 return 0;
55 }
56