@@ -7213,7 +7213,7 @@ static void brcmf_get_bwcap(struct brcmf_if *ifp, u32 bw_cap[])
72137213}
72147214
72157215static void brcmf_update_ht_cap (struct ieee80211_supported_band * band ,
7216- u32 bw_cap [2 ], u32 nchain )
7216+ u32 bw_cap [2 ], u32 nrxchain )
72177217{
72187218 band -> ht_cap .ht_supported = true;
72197219 if (bw_cap [band -> band ] & WLC_BW_40MHZ_BIT ) {
@@ -7224,7 +7224,7 @@ static void brcmf_update_ht_cap(struct ieee80211_supported_band *band,
72247224 band -> ht_cap .cap |= IEEE80211_HT_CAP_DSSSCCK40 ;
72257225 band -> ht_cap .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K ;
72267226 band -> ht_cap .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16 ;
7227- memset (band -> ht_cap .mcs .rx_mask , 0xff , nchain );
7227+ memset (band -> ht_cap .mcs .rx_mask , 0xff , nrxchain );
72287228 band -> ht_cap .mcs .tx_params = IEEE80211_HT_MCS_TX_DEFINED ;
72297229}
72307230
@@ -7313,7 +7313,9 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73137313 u32 vhtmode = 0 ;
73147314 u32 bw_cap [2 ] = { WLC_BW_20MHZ_BIT , WLC_BW_20MHZ_BIT };
73157315 u32 rxchain = 0 ;
7316- u32 nchain ;
7316+ u32 txchain ;
7317+ u32 nrxchain ;
7318+ u32 ntxchain ;
73177319 int err ;
73187320 s32 i ;
73197321 struct ieee80211_supported_band * band ;
@@ -7347,12 +7349,31 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73477349 else
73487350 bphy_err (drvr , "rxchain error (%d)\n" , err );
73497351
7350- nchain = 1 ;
7352+ nrxchain = 1 ;
7353+ rxchain = 1 ;
73517354 } else {
7352- for (nchain = 0 ; rxchain ; nchain ++ )
7355+ for (nrxchain = 0 ; rxchain ; nrxchain ++ )
73537356 rxchain = rxchain & (rxchain - 1 );
73547357 }
7355- brcmf_dbg (INFO , "nchain=%d\n" , nchain );
7358+ brcmf_dbg (INFO , "nrxchain=%d\n" , nrxchain );
7359+ err = brcmf_fil_iovar_int_get (ifp , "txchain" , & txchain );
7360+ if (err ) {
7361+ /* rxchain unsupported by firmware of older chips */
7362+ if (err == - EBADE )
7363+ bphy_info_once (drvr , "rxchain unsupported\n" );
7364+ else
7365+ bphy_err (drvr , "rxchain error (%d)\n" , err );
7366+
7367+ ntxchain = 1 ;
7368+ txchain = 1 ;
7369+ } else {
7370+ for (ntxchain = 0 ; txchain ; ntxchain ++ )
7371+ txchain = txchain & (txchain - 1 );
7372+ }
7373+ brcmf_dbg (INFO , "ntxchain=%d\n" , ntxchain );
7374+
7375+ wiphy -> available_antennas_rx = nrxchain ;
7376+ wiphy -> available_antennas_tx = ntxchain ;
73567377
73577378 err = brcmf_construct_chaninfo (cfg , bw_cap );
73587379 if (err ) {
@@ -7375,7 +7396,7 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73757396 continue ;
73767397
73777398 if (nmode )
7378- brcmf_update_ht_cap (band , bw_cap , nchain );
7399+ brcmf_update_ht_cap (band , bw_cap , nrxchain );
73797400 if (vhtmode )
73807401 brcmf_update_vht_cap (band , bw_cap , txstreams , rxstreams ,
73817402 txbf_bfe_cap , txbf_bfr_cap ,
0 commit comments