@@ -7228,7 +7228,7 @@ static void brcmf_get_bwcap(struct brcmf_if *ifp, u32 bw_cap[])
72287228}
72297229
72307230static void brcmf_update_ht_cap (struct ieee80211_supported_band * band ,
7231- u32 bw_cap [2 ], u32 nchain )
7231+ u32 bw_cap [2 ], u32 nrxchain )
72327232{
72337233 band -> ht_cap .ht_supported = true;
72347234 if (bw_cap [band -> band ] & WLC_BW_40MHZ_BIT ) {
@@ -7239,7 +7239,7 @@ static void brcmf_update_ht_cap(struct ieee80211_supported_band *band,
72397239 band -> ht_cap .cap |= IEEE80211_HT_CAP_DSSSCCK40 ;
72407240 band -> ht_cap .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K ;
72417241 band -> ht_cap .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16 ;
7242- memset (band -> ht_cap .mcs .rx_mask , 0xff , nchain );
7242+ memset (band -> ht_cap .mcs .rx_mask , 0xff , nrxchain );
72437243 band -> ht_cap .mcs .tx_params = IEEE80211_HT_MCS_TX_DEFINED ;
72447244}
72457245
@@ -7328,7 +7328,9 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73287328 u32 vhtmode = 0 ;
73297329 u32 bw_cap [2 ] = { WLC_BW_20MHZ_BIT , WLC_BW_20MHZ_BIT };
73307330 u32 rxchain ;
7331- u32 nchain ;
7331+ u32 txchain ;
7332+ u32 nrxchain ;
7333+ u32 ntxchain ;
73327334 int err ;
73337335 s32 i ;
73347336 struct ieee80211_supported_band * band ;
@@ -7362,12 +7364,31 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73627364 else
73637365 bphy_err (drvr , "rxchain error (%d)\n" , err );
73647366
7365- nchain = 1 ;
7367+ nrxchain = 1 ;
7368+ rxchain = 1 ;
73667369 } else {
7367- for (nchain = 0 ; rxchain ; nchain ++ )
7370+ for (nrxchain = 0 ; rxchain ; nrxchain ++ )
73687371 rxchain = rxchain & (rxchain - 1 );
73697372 }
7370- brcmf_dbg (INFO , "nchain=%d\n" , nchain );
7373+ brcmf_dbg (INFO , "nrxchain=%d\n" , nrxchain );
7374+ err = brcmf_fil_iovar_int_get (ifp , "txchain" , & txchain );
7375+ if (err ) {
7376+ /* rxchain unsupported by firmware of older chips */
7377+ if (err == - EBADE )
7378+ bphy_info_once (drvr , "rxchain unsupported\n" );
7379+ else
7380+ bphy_err (drvr , "rxchain error (%d)\n" , err );
7381+
7382+ ntxchain = 1 ;
7383+ txchain = 1 ;
7384+ } else {
7385+ for (ntxchain = 0 ; txchain ; ntxchain ++ )
7386+ txchain = txchain & (txchain - 1 );
7387+ }
7388+ brcmf_dbg (INFO , "ntxchain=%d\n" , ntxchain );
7389+
7390+ wiphy -> available_antennas_rx = nrxchain ;
7391+ wiphy -> available_antennas_tx = ntxchain ;
73717392
73727393 err = brcmf_construct_chaninfo (cfg , bw_cap );
73737394 if (err ) {
@@ -7390,7 +7411,7 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73907411 continue ;
73917412
73927413 if (nmode )
7393- brcmf_update_ht_cap (band , bw_cap , nchain );
7414+ brcmf_update_ht_cap (band , bw_cap , nrxchain );
73947415 if (vhtmode )
73957416 brcmf_update_vht_cap (band , bw_cap , txstreams , rxstreams ,
73967417 txbf_bfe_cap , txbf_bfr_cap ,
0 commit comments