aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2014-05-12 04:47:39 -0400
committerJohn W. Linville <linville@tuxdriver.com>2014-05-13 15:56:52 -0400
commit600a897d811d0a0033212a0cefcbc9d06d1bc57d (patch)
tree3bb2726e406684298898e60288048fc2d4b92ea7
parentee942ecc42af9af0f0398861f636019f9726755b (diff)
brcmfmac: determine chanspec from struct cfg80211_chan_def info
The struct cfg80211_chan_def contains additional info to derive the bandwidth and side-band information of the chanspec. This patch adds chandef_to_chanspec() function used in IBSS join and starting AP operation. Reviewed-by: Franky Lin <frankyl@broadcom.com> Reviewed-by: Hante Meuleman <meuleman@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c60
1 files changed, 57 insertions, 3 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index 7aeb52b7260b..70bc2542061a 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -341,6 +341,60 @@ static u8 brcmf_mw_to_qdbm(u16 mw)
341 return qdbm; 341 return qdbm;
342} 342}
343 343
344u16 chandef_to_chanspec(struct brcmu_d11inf *d11inf,
345 struct cfg80211_chan_def *ch)
346{
347 struct brcmu_chan ch_inf;
348 s32 primary_offset;
349
350 brcmf_dbg(TRACE, "chandef: control %d center %d width %d\n",
351 ch->chan->center_freq, ch->center_freq1, ch->width);
352 ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq1);
353 primary_offset = ch->center_freq1 - ch->chan->center_freq;
354 switch (ch->width) {
355 case NL80211_CHAN_WIDTH_20:
356 ch_inf.bw = BRCMU_CHAN_BW_20;
357 WARN_ON(primary_offset != 0);
358 break;
359 case NL80211_CHAN_WIDTH_40:
360 ch_inf.bw = BRCMU_CHAN_BW_40;
361 if (primary_offset < 0)
362 ch_inf.sb = BRCMU_CHAN_SB_U;
363 else
364 ch_inf.sb = BRCMU_CHAN_SB_L;
365 break;
366 case NL80211_CHAN_WIDTH_80:
367 ch_inf.bw = BRCMU_CHAN_BW_80;
368 if (primary_offset < 0) {
369 if (primary_offset < -CH_10MHZ_APART)
370 ch_inf.sb = BRCMU_CHAN_SB_UU;
371 else
372 ch_inf.sb = BRCMU_CHAN_SB_UL;
373 } else {
374 if (primary_offset > CH_10MHZ_APART)
375 ch_inf.sb = BRCMU_CHAN_SB_LL;
376 else
377 ch_inf.sb = BRCMU_CHAN_SB_LU;
378 }
379 break;
380 default:
381 WARN_ON_ONCE(1);
382 }
383 switch (ch->chan->band) {
384 case IEEE80211_BAND_2GHZ:
385 ch_inf.band = BRCMU_CHAN_BAND_2G;
386 break;
387 case IEEE80211_BAND_5GHZ:
388 ch_inf.band = BRCMU_CHAN_BAND_5G;
389 break;
390 default:
391 WARN_ON_ONCE(1);
392 }
393 d11inf->encchspec(&ch_inf);
394
395 return ch_inf.chspec;
396}
397
344u16 channel_to_chanspec(struct brcmu_d11inf *d11inf, 398u16 channel_to_chanspec(struct brcmu_d11inf *d11inf,
345 struct ieee80211_channel *ch) 399 struct ieee80211_channel *ch)
346{ 400{
@@ -1236,8 +1290,8 @@ brcmf_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
1236 params->chandef.chan->center_freq); 1290 params->chandef.chan->center_freq);
1237 if (params->channel_fixed) { 1291 if (params->channel_fixed) {
1238 /* adding chanspec */ 1292 /* adding chanspec */
1239 chanspec = channel_to_chanspec(&cfg->d11inf, 1293 chanspec = chandef_to_chanspec(&cfg->d11inf,
1240 params->chandef.chan); 1294 &params->chandef);
1241 join_params.params_le.chanspec_list[0] = 1295 join_params.params_le.chanspec_list[0] =
1242 cpu_to_le16(chanspec); 1296 cpu_to_le16(chanspec);
1243 join_params.params_le.chanspec_num = cpu_to_le32(1); 1297 join_params.params_le.chanspec_num = cpu_to_le32(1);
@@ -3810,7 +3864,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
3810 3864
3811 brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon); 3865 brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon);
3812 3866
3813 chanspec = channel_to_chanspec(&cfg->d11inf, settings->chandef.chan); 3867 chanspec = chandef_to_chanspec(&cfg->d11inf, &settings->chandef);
3814 err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec); 3868 err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec);
3815 if (err < 0) { 3869 if (err < 0) {
3816 brcmf_err("Set Channel failed: chspec=%d, %d\n", chanspec, err); 3870 brcmf_err("Set Channel failed: chspec=%d, %d\n", chanspec, err);