bcm4xxx: fix iwinfo behaviour
[openwrt/staging/jow.git] / package / kernel / mac80211 / patches / brcm / 998-survey.patch
1 Index: backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
2 ===================================================================
3 --- backports-5.4-rc8-1.orig/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
4 +++ backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
5 @@ -2747,6 +2747,63 @@ done:
6 }
7
8 static int
9 +brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev,
10 + int idx, struct survey_info *survey)
11 +{
12 + struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
13 + struct brcmf_if *ifp = netdev_priv(ndev);
14 + struct brcmu_chan ch;
15 + enum nl80211_band band = 0;
16 + s32 err = 0;
17 + int noise;
18 + u32 freq;
19 + u32 chanspec;
20 +
21 + memset(survey, 0, sizeof(struct survey_info));
22 + if (idx != 0) {
23 + if (idx >= cfg->pub->num_chan_stats || cfg->pub->chan_stats == NULL)
24 + return -ENOENT;
25 + if (cfg->pub->chan_stats[idx].freq == 0)
26 + return -ENOENT;
27 + survey->filled = SURVEY_INFO_NOISE_DBM;
28 + survey->channel = ieee80211_get_channel(wiphy, cfg->pub->chan_stats[idx].freq);
29 + survey->noise = cfg->pub->chan_stats[idx].noise;
30 + return 0;
31 + }
32 +
33 + err = brcmf_fil_iovar_int_get(ifp, "chanspec", &chanspec);
34 + if (err) {
35 + brcmf_err("chanspec failed (%d)\n", err);
36 + return err;
37 + }
38 +
39 + ch.chspec = chanspec;
40 + cfg->d11inf.decchspec(&ch);
41 +
42 + switch (ch.band) {
43 + case BRCMU_CHAN_BAND_2G:
44 + band = NL80211_BAND_2GHZ;
45 + break;
46 + case BRCMU_CHAN_BAND_5G:
47 + band = NL80211_BAND_5GHZ;
48 + break;
49 + }
50 +
51 + freq = ieee80211_channel_to_frequency(ch.control_ch_num, band);
52 + survey->channel = ieee80211_get_channel(wiphy, freq);
53 +
54 + err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PHY_NOISE, &noise);
55 + if (err) {
56 + brcmf_err("Could not get noise (%d)\n", err);
57 + return err;
58 + }
59 +
60 + survey->filled = SURVEY_INFO_NOISE_DBM | SURVEY_INFO_IN_USE;
61 + survey->noise = le32_to_cpu(noise);
62 + return 0;
63 +}
64 +
65 +static int
66 brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
67 int idx, u8 *mac, struct station_info *sinfo)
68 {
69 @@ -2836,6 +2893,7 @@ static s32 brcmf_inform_single_bss(struc
70 struct brcmu_chan ch;
71 u16 channel;
72 u32 freq;
73 + int i;
74 u16 notify_capability;
75 u16 notify_interval;
76 u8 *notify_ie;
77 @@ -2860,6 +2918,17 @@ static s32 brcmf_inform_single_bss(struc
78 band = NL80211_BAND_5GHZ;
79
80 freq = ieee80211_channel_to_frequency(channel, band);
81 + for (i = 0;i < cfg->pub->num_chan_stats;i++) {
82 + if (freq == cfg->pub->chan_stats[i].freq)
83 + break;
84 + if (cfg->pub->chan_stats[i].freq == 0)
85 + break;
86 + }
87 + if (i < cfg->pub->num_chan_stats) {
88 + cfg->pub->chan_stats[i].freq = freq;
89 + cfg->pub->chan_stats[i].noise = bi->phy_noise;
90 + }
91 +
92 bss_data.chan = ieee80211_get_channel(wiphy, freq);
93 bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
94 bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
95 @@ -5277,6 +5346,7 @@ static struct cfg80211_ops brcmf_cfg8021
96 .leave_ibss = brcmf_cfg80211_leave_ibss,
97 .get_station = brcmf_cfg80211_get_station,
98 .dump_station = brcmf_cfg80211_dump_station,
99 + .dump_survey = brcmf_cfg80211_dump_survey,
100 .set_tx_power = brcmf_cfg80211_set_tx_power,
101 .get_tx_power = brcmf_cfg80211_get_tx_power,
102 .add_key = brcmf_cfg80211_add_key,
103 Index: backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
104 ===================================================================
105 --- backports-5.4-rc8-1.orig/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
106 +++ backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
107 @@ -1277,6 +1277,8 @@ int brcmf_attach(struct device *dev)
108
109 /* Link to bus module */
110 drvr->hdrlen = 0;
111 + drvr->chan_stats = vzalloc(256 * sizeof(struct brcmf_chan_stats));
112 + drvr->num_chan_stats = 256;
113
114 /* Attach and link in the protocol */
115 ret = brcmf_proto_attach(drvr);
116 @@ -1359,6 +1361,12 @@ void brcmf_detach(struct device *dev)
117 if (drvr == NULL)
118 return;
119
120 + drvr->num_chan_stats = 0;
121 + if (drvr->chan_stats) {
122 + vfree(drvr->chan_stats);
123 + drvr->chan_stats = NULL;
124 + }
125 +
126 #ifdef CONFIG_INET
127 unregister_inetaddr_notifier(&drvr->inetaddr_notifier);
128 #endif
129 Index: backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
130 ===================================================================
131 --- backports-5.4-rc8-1.orig/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
132 +++ backports-5.4-rc8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
133 @@ -91,6 +91,11 @@ struct brcmf_rev_info {
134 u32 nvramrev;
135 };
136
137 +struct brcmf_chan_stats {
138 + u32 freq;
139 + int noise;
140 +};
141 +
142 /* Common structure for module and instance linkage */
143 struct brcmf_pub {
144 /* Linkage ponters */
145 @@ -100,6 +105,9 @@ struct brcmf_pub {
146 struct cfg80211_ops *ops;
147 struct brcmf_cfg80211_info *config;
148
149 + int num_chan_stats;
150 + struct brcmf_chan_stats *chan_stats;
151 +
152 /* Internal brcmf items */
153 uint hdrlen; /* Total BRCMF header length (proto + bus) */
154