@@ -189,9 +189,9 @@ static const struct ieee80211_regdomain brcmf_regdom = {
189189 */
190190 REG_RULE (2484 - 10 , 2484 + 10 , 20 , 6 , 20 , 0 ),
191191 /* IEEE 802.11a, channel 36..64 */
192- REG_RULE (5150 - 10 , 5350 + 10 , 80 , 6 , 20 , 0 ),
192+ REG_RULE (5150 - 10 , 5350 + 10 , 160 , 6 , 20 , 0 ),
193193 /* IEEE 802.11a, channel 100..165 */
194- REG_RULE (5470 - 10 , 5850 + 10 , 80 , 6 , 20 , 0 ), }
194+ REG_RULE (5470 - 10 , 5850 + 10 , 160 , 6 , 20 , 0 ), }
195195};
196196
197197/* Note: brcmf_cipher_suites is an array of int defining which cipher suites
@@ -276,8 +276,26 @@ static u16 chandef_to_chanspec(struct brcmu_d11inf *d11inf,
276276 else
277277 ch_inf .sb = BRCMU_CHAN_SB_UU ;
278278 break ;
279- case NL80211_CHAN_WIDTH_80P80 :
280279 case NL80211_CHAN_WIDTH_160 :
280+ ch_inf .bw = BRCMU_CHAN_BW_160 ;
281+ if (primary_offset == -70 )
282+ ch_inf .sb = BRCMU_CHAN_SB_LLL ;
283+ else if (primary_offset == -50 )
284+ ch_inf .sb = BRCMU_CHAN_SB_LLU ;
285+ else if (primary_offset == -30 )
286+ ch_inf .sb = BRCMU_CHAN_SB_LUL ;
287+ else if (primary_offset == -10 )
288+ ch_inf .sb = BRCMU_CHAN_SB_LUU ;
289+ else if (primary_offset == 10 )
290+ ch_inf .sb = BRCMU_CHAN_SB_ULL ;
291+ else if (primary_offset == 30 )
292+ ch_inf .sb = BRCMU_CHAN_SB_ULU ;
293+ else if (primary_offset == 50 )
294+ ch_inf .sb = BRCMU_CHAN_SB_UUL ;
295+ else
296+ ch_inf .sb = BRCMU_CHAN_SB_UUU ;
297+ break ;
298+ case NL80211_CHAN_WIDTH_80P80 :
281299 case NL80211_CHAN_WIDTH_5 :
282300 case NL80211_CHAN_WIDTH_10 :
283301 default :
@@ -296,6 +314,7 @@ static u16 chandef_to_chanspec(struct brcmu_d11inf *d11inf,
296314 }
297315 d11inf -> encchspec (& ch_inf );
298316
317+ brcmf_dbg (TRACE , "chanspec: 0x%x\n" , ch_inf .chspec );
299318 return ch_inf .chspec ;
300319}
301320
@@ -1267,17 +1286,21 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
12671286{
12681287 struct brcmf_cfg80211_info * cfg = wiphy_to_cfg (vif -> wdev .wiphy );
12691288 struct brcmf_pub * drvr = cfg -> pub ;
1289+ bool bus_up = drvr -> bus_if -> state == BRCMF_BUS_UP ;
12701290 s32 err = 0 ;
12711291
12721292 brcmf_dbg (TRACE , "Enter\n" );
12731293
12741294 if (test_and_clear_bit (BRCMF_VIF_STATUS_CONNECTED , & vif -> sme_state )) {
1275- brcmf_dbg (INFO , "Call WLC_DISASSOC to stop excess roaming\n" );
1276- err = brcmf_fil_cmd_data_set (vif -> ifp ,
1277- BRCMF_C_DISASSOC , NULL , 0 );
1278- if (err ) {
1279- bphy_err (drvr , "WLC_DISASSOC failed (%d)\n" , err );
1295+ if (bus_up ) {
1296+ brcmf_dbg (INFO , "Call WLC_DISASSOC to stop excess roaming\n" );
1297+ err = brcmf_fil_cmd_data_set (vif -> ifp ,
1298+ BRCMF_C_DISASSOC , NULL , 0 );
1299+ if (err )
1300+ bphy_err (drvr , "WLC_DISASSOC failed (%d)\n" ,
1301+ err );
12801302 }
1303+
12811304 if ((vif -> wdev .iftype == NL80211_IFTYPE_STATION ) ||
12821305 (vif -> wdev .iftype == NL80211_IFTYPE_P2P_CLIENT ))
12831306 cfg80211_disconnected (vif -> wdev .netdev , reason , NULL , 0 ,
@@ -1287,7 +1310,8 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
12871310 clear_bit (BRCMF_SCAN_STATUS_SUPPRESS , & cfg -> scan_status );
12881311 brcmf_btcoex_set_mode (vif , BRCMF_BTCOEX_ENABLED , 0 );
12891312 if (vif -> profile .use_fwsup != BRCMF_PROFILE_FWSUP_NONE ) {
1290- brcmf_set_pmk (vif -> ifp , NULL , 0 );
1313+ if (bus_up )
1314+ brcmf_set_pmk (vif -> ifp , NULL , 0 );
12911315 vif -> profile .use_fwsup = BRCMF_PROFILE_FWSUP_NONE ;
12921316 }
12931317 brcmf_dbg (TRACE , "Exit\n" );
@@ -2958,8 +2982,6 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
29582982 struct brcmf_pub * drvr = cfg -> pub ;
29592983 struct brcmf_bss_info_le * bi ;
29602984 const struct brcmf_tlv * tim ;
2961- u16 beacon_interval ;
2962- u8 dtim_period ;
29632985 size_t ie_len ;
29642986 u8 * ie ;
29652987 s32 err = 0 ;
@@ -2983,12 +3005,9 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
29833005
29843006 ie = ((u8 * )bi ) + le16_to_cpu (bi -> ie_offset );
29853007 ie_len = le32_to_cpu (bi -> ie_length );
2986- beacon_interval = le16_to_cpu (bi -> beacon_period );
29873008
29883009 tim = brcmf_parse_tlvs (ie , ie_len , WLAN_EID_TIM );
2989- if (tim )
2990- dtim_period = tim -> data [1 ];
2991- else {
3010+ if (!tim ) {
29923011 /*
29933012 * active scan was done so we could not get dtim
29943013 * information out of probe response.
@@ -3000,7 +3019,6 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
30003019 bphy_err (drvr , "wl dtim_assoc failed (%d)\n" , err );
30013020 goto update_bss_info_out ;
30023021 }
3003- dtim_period = (u8 )var ;
30043022 }
30053023
30063024update_bss_info_out :
@@ -4985,18 +5003,16 @@ static int brcmf_cfg80211_get_channel(struct wiphy *wiphy,
49855003 struct brcmf_cfg80211_info * cfg = wiphy_to_cfg (wiphy );
49865004 struct net_device * ndev = wdev -> netdev ;
49875005 struct brcmf_pub * drvr = cfg -> pub ;
4988- struct brcmf_if * ifp ;
49895006 struct brcmu_chan ch ;
49905007 enum nl80211_band band = 0 ;
49915008 enum nl80211_chan_width width = 0 ;
49925009 u32 chanspec ;
49935010 int freq , err ;
49945011
4995- if (!ndev )
5012+ if (!ndev || drvr -> bus_if -> state != BRCMF_BUS_UP )
49965013 return - ENODEV ;
4997- ifp = netdev_priv (ndev );
49985014
4999- err = brcmf_fil_iovar_int_get (ifp , "chanspec" , & chanspec );
5015+ err = brcmf_fil_iovar_int_get (netdev_priv ( ndev ) , "chanspec" , & chanspec );
50005016 if (err ) {
50015017 bphy_err (drvr , "chanspec failed (%d)\n" , err );
50025018 return err ;
@@ -6714,6 +6730,11 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
67146730 }
67156731 }
67166732
6733+ if (wiphy -> bands [NL80211_BAND_5GHZ ] &&
6734+ brcmf_feat_is_enabled (ifp , BRCMF_FEAT_DOT11H ))
6735+ wiphy_ext_feature_set (wiphy ,
6736+ NL80211_EXT_FEATURE_DFS_OFFLOAD );
6737+
67176738 wiphy_read_of_freq_limits (wiphy );
67186739
67196740 return 0 ;
0 commit comments