@@ -7278,7 +7278,7 @@ static void brcmf_get_bwcap(struct brcmf_if *ifp, u32 bw_cap[])
72787278}
72797279
72807280static void brcmf_update_ht_cap (struct ieee80211_supported_band * band ,
7281- u32 bw_cap [2 ], u32 nchain )
7281+ u32 bw_cap [2 ], u32 nrxchain )
72827282{
72837283 band -> ht_cap .ht_supported = true;
72847284 if (bw_cap [band -> band ] & WLC_BW_40MHZ_BIT ) {
@@ -7289,7 +7289,7 @@ static void brcmf_update_ht_cap(struct ieee80211_supported_band *band,
72897289 band -> ht_cap .cap |= IEEE80211_HT_CAP_DSSSCCK40 ;
72907290 band -> ht_cap .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K ;
72917291 band -> ht_cap .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16 ;
7292- memset (band -> ht_cap .mcs .rx_mask , 0xff , nchain );
7292+ memset (band -> ht_cap .mcs .rx_mask , 0xff , nrxchain );
72937293 band -> ht_cap .mcs .tx_params = IEEE80211_HT_MCS_TX_DEFINED ;
72947294}
72957295
@@ -7378,7 +7378,9 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73787378 u32 vhtmode = 0 ;
73797379 u32 bw_cap [2 ] = { WLC_BW_20MHZ_BIT , WLC_BW_20MHZ_BIT };
73807380 u32 rxchain ;
7381- u32 nchain ;
7381+ u32 txchain ;
7382+ u32 nrxchain ;
7383+ u32 ntxchain ;
73827384 int err ;
73837385 s32 i ;
73847386 struct ieee80211_supported_band * band ;
@@ -7412,12 +7414,31 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
74127414 else
74137415 bphy_err (drvr , "rxchain error (%d)\n" , err );
74147416
7415- nchain = 1 ;
7417+ nrxchain = 1 ;
7418+ rxchain = 1 ;
74167419 } else {
7417- for (nchain = 0 ; rxchain ; nchain ++ )
7420+ for (nrxchain = 0 ; rxchain ; nrxchain ++ )
74187421 rxchain = rxchain & (rxchain - 1 );
74197422 }
7420- brcmf_dbg (INFO , "nchain=%d\n" , nchain );
7423+ brcmf_dbg (INFO , "nrxchain=%d\n" , nrxchain );
7424+ err = brcmf_fil_iovar_int_get (ifp , "txchain" , & txchain );
7425+ if (err ) {
7426+ /* rxchain unsupported by firmware of older chips */
7427+ if (err == - EBADE )
7428+ bphy_info_once (drvr , "rxchain unsupported\n" );
7429+ else
7430+ bphy_err (drvr , "rxchain error (%d)\n" , err );
7431+
7432+ ntxchain = 1 ;
7433+ txchain = 1 ;
7434+ } else {
7435+ for (ntxchain = 0 ; txchain ; ntxchain ++ )
7436+ txchain = txchain & (txchain - 1 );
7437+ }
7438+ brcmf_dbg (INFO , "ntxchain=%d\n" , ntxchain );
7439+
7440+ wiphy -> available_antennas_rx = nrxchain ;
7441+ wiphy -> available_antennas_tx = ntxchain ;
74217442
74227443 err = brcmf_construct_chaninfo (cfg , bw_cap );
74237444 if (err ) {
@@ -7440,7 +7461,7 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
74407461 continue ;
74417462
74427463 if (nmode )
7443- brcmf_update_ht_cap (band , bw_cap , nchain );
7464+ brcmf_update_ht_cap (band , bw_cap , nrxchain );
74447465 if (vhtmode )
74457466 brcmf_update_vht_cap (band , bw_cap , txstreams , rxstreams ,
74467467 txbf_bfe_cap , txbf_bfr_cap ,
0 commit comments