1 /******************************************************************************
3 * Copyright(c) 2009-2010 Realtek Corporation.
5 *****************************************************************************/
10 #include <rtw_wifi_regd.h>
13 * REG_RULE(freq start, freq end, bandwidth, max gain, eirp, reg_flags)
17 * Only these channels all allow active
18 * scan on all world regulatory domains
21 /* 2G chan 01 - chan 11 */
22 #define RTW_2GHZ_CH01_11 \
23 REG_RULE(2412 - 10, 2462 + 10, 40, 0, 20, 0)
26 * We enable active scan on these a case
27 * by case basis by regulatory domain
30 /* 2G chan 12 - chan 13, PASSIV SCAN */
31 #define RTW_2GHZ_CH12_13 \
32 REG_RULE(2467 - 10, 2472 + 10, 40, 0, 20, \
33 NL80211_RRF_PASSIVE_SCAN)
35 /* 2G chan 14, PASSIVS SCAN, NO OFDM (B only) */
36 #define RTW_2GHZ_CH14 \
37 REG_RULE(2484 - 10, 2484 + 10, 40, 0, 20, \
38 NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)
40 static const struct ieee80211_regdomain rtw_regdom_rd
= {
49 static int rtw_ieee80211_channel_to_frequency(int chan
, int band
)
51 /* see 802.11 17.3.8.3.2 and Annex J
52 * there are overlapping channel numbers in 5GHz and 2GHz bands
55 /* NL80211_BAND_2GHZ */
59 return 2407 + chan
* 5;
61 return 0; /* not supported */
64 static void _rtw_reg_apply_flags(struct wiphy
*wiphy
)
66 struct adapter
*padapter
= wiphy_to_adapter(wiphy
);
67 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
68 RT_CHANNEL_INFO
*channel_set
= pmlmeext
->channel_set
;
69 u8 max_chan_nums
= pmlmeext
->max_chan_nums
;
71 struct ieee80211_supported_band
*sband
;
72 struct ieee80211_channel
*ch
;
77 /* all channels disable */
78 for (i
= 0; i
< NUM_NL80211_BANDS
; i
++) {
79 sband
= wiphy
->bands
[i
];
82 for (j
= 0; j
< sband
->n_channels
; j
++) {
83 ch
= &sband
->channels
[j
];
86 ch
->flags
= IEEE80211_CHAN_DISABLED
;
91 /* channels apply by channel plans. */
92 for (i
= 0; i
< max_chan_nums
; i
++) {
93 channel
= channel_set
[i
].ChannelNum
;
95 rtw_ieee80211_channel_to_frequency(channel
,
98 ch
= ieee80211_get_channel(wiphy
, freq
);
100 if (channel_set
[i
].ScanType
== SCAN_PASSIVE
)
101 ch
->flags
= IEEE80211_CHAN_NO_IR
;
108 static int _rtw_reg_notifier_apply(struct wiphy
*wiphy
,
109 struct regulatory_request
*request
,
110 struct rtw_regulatory
*reg
)
112 /* Hard code flags */
113 _rtw_reg_apply_flags(wiphy
);
117 static const struct ieee80211_regdomain
*_rtw_regdomain_select(struct
121 return &rtw_regdom_rd
;
124 static void _rtw_regd_init_wiphy(struct rtw_regulatory
*reg
,
126 void (*reg_notifier
)(struct wiphy
*wiphy
,
131 const struct ieee80211_regdomain
*regd
;
133 wiphy
->reg_notifier
= reg_notifier
;
135 wiphy
->regulatory_flags
|= REGULATORY_CUSTOM_REG
;
136 wiphy
->regulatory_flags
&= ~REGULATORY_STRICT_REG
;
137 wiphy
->regulatory_flags
&= ~REGULATORY_DISABLE_BEACON_HINTS
;
139 regd
= _rtw_regdomain_select(reg
);
140 wiphy_apply_custom_regulatory(wiphy
, regd
);
142 /* Hard code flags */
143 _rtw_reg_apply_flags(wiphy
);
146 int rtw_regd_init(struct adapter
*padapter
,
147 void (*reg_notifier
)(struct wiphy
*wiphy
,
148 struct regulatory_request
*request
))
150 struct wiphy
*wiphy
= padapter
->rtw_wdev
->wiphy
;
152 _rtw_regd_init_wiphy(NULL
, wiphy
, reg_notifier
);
157 void rtw_reg_notifier(struct wiphy
*wiphy
, struct regulatory_request
*request
)
159 struct rtw_regulatory
*reg
= NULL
;
161 DBG_8192C("%s\n", __func__
);
163 _rtw_reg_notifier_apply(wiphy
, request
, reg
);