@@ -7233,7 +7233,7 @@ static void brcmf_get_bwcap(struct brcmf_if *ifp, u32 bw_cap[])
72337233}
72347234
72357235static void brcmf_update_ht_cap (struct ieee80211_supported_band * band ,
7236- u32 bw_cap [2 ], u32 nchain )
7236+ u32 bw_cap [2 ], u32 nrxchain )
72377237{
72387238 band -> ht_cap .ht_supported = true;
72397239 if (bw_cap [band -> band ] & WLC_BW_40MHZ_BIT ) {
@@ -7244,7 +7244,7 @@ static void brcmf_update_ht_cap(struct ieee80211_supported_band *band,
72447244 band -> ht_cap .cap |= IEEE80211_HT_CAP_DSSSCCK40 ;
72457245 band -> ht_cap .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K ;
72467246 band -> ht_cap .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16 ;
7247- memset (band -> ht_cap .mcs .rx_mask , 0xff , nchain );
7247+ memset (band -> ht_cap .mcs .rx_mask , 0xff , nrxchain );
72487248 band -> ht_cap .mcs .tx_params = IEEE80211_HT_MCS_TX_DEFINED ;
72497249}
72507250
@@ -7333,7 +7333,9 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73337333 u32 vhtmode = 0 ;
73347334 u32 bw_cap [2 ] = { WLC_BW_20MHZ_BIT , WLC_BW_20MHZ_BIT };
73357335 u32 rxchain ;
7336- u32 nchain ;
7336+ u32 txchain ;
7337+ u32 nrxchain ;
7338+ u32 ntxchain ;
73377339 int err ;
73387340 s32 i ;
73397341 struct ieee80211_supported_band * band ;
@@ -7367,12 +7369,31 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73677369 else
73687370 bphy_err (drvr , "rxchain error (%d)\n" , err );
73697371
7370- nchain = 1 ;
7372+ nrxchain = 1 ;
7373+ rxchain = 1 ;
73717374 } else {
7372- for (nchain = 0 ; rxchain ; nchain ++ )
7375+ for (nrxchain = 0 ; rxchain ; nrxchain ++ )
73737376 rxchain = rxchain & (rxchain - 1 );
73747377 }
7375- brcmf_dbg (INFO , "nchain=%d\n" , nchain );
7378+ brcmf_dbg (INFO , "nrxchain=%d\n" , nrxchain );
7379+ err = brcmf_fil_iovar_int_get (ifp , "txchain" , & txchain );
7380+ if (err ) {
7381+ /* rxchain unsupported by firmware of older chips */
7382+ if (err == - EBADE )
7383+ bphy_info_once (drvr , "rxchain unsupported\n" );
7384+ else
7385+ bphy_err (drvr , "rxchain error (%d)\n" , err );
7386+
7387+ ntxchain = 1 ;
7388+ txchain = 1 ;
7389+ } else {
7390+ for (ntxchain = 0 ; txchain ; ntxchain ++ )
7391+ txchain = txchain & (txchain - 1 );
7392+ }
7393+ brcmf_dbg (INFO , "ntxchain=%d\n" , ntxchain );
7394+
7395+ wiphy -> available_antennas_rx = nrxchain ;
7396+ wiphy -> available_antennas_tx = ntxchain ;
73767397
73777398 err = brcmf_construct_chaninfo (cfg , bw_cap );
73787399 if (err ) {
@@ -7395,7 +7416,7 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73957416 continue ;
73967417
73977418 if (nmode )
7398- brcmf_update_ht_cap (band , bw_cap , nchain );
7419+ brcmf_update_ht_cap (band , bw_cap , nrxchain );
73997420 if (vhtmode )
74007421 brcmf_update_vht_cap (band , bw_cap , txstreams , rxstreams ,
74017422 txbf_bfe_cap , txbf_bfr_cap ,
0 commit comments