@@ -7258,7 +7258,7 @@ static void brcmf_get_bwcap(struct brcmf_if *ifp, u32 bw_cap[])
72587258}
72597259
72607260static void brcmf_update_ht_cap (struct ieee80211_supported_band * band ,
7261- u32 bw_cap [2 ], u32 nchain )
7261+ u32 bw_cap [2 ], u32 nrxchain )
72627262{
72637263 band -> ht_cap .ht_supported = true;
72647264 if (bw_cap [band -> band ] & WLC_BW_40MHZ_BIT ) {
@@ -7269,7 +7269,7 @@ static void brcmf_update_ht_cap(struct ieee80211_supported_band *band,
72697269 band -> ht_cap .cap |= IEEE80211_HT_CAP_DSSSCCK40 ;
72707270 band -> ht_cap .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K ;
72717271 band -> ht_cap .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16 ;
7272- memset (band -> ht_cap .mcs .rx_mask , 0xff , nchain );
7272+ memset (band -> ht_cap .mcs .rx_mask , 0xff , nrxchain );
72737273 band -> ht_cap .mcs .tx_params = IEEE80211_HT_MCS_TX_DEFINED ;
72747274}
72757275
@@ -7358,7 +7358,9 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73587358 u32 vhtmode = 0 ;
73597359 u32 bw_cap [2 ] = { WLC_BW_20MHZ_BIT , WLC_BW_20MHZ_BIT };
73607360 u32 rxchain ;
7361- u32 nchain ;
7361+ u32 txchain ;
7362+ u32 nrxchain ;
7363+ u32 ntxchain ;
73627364 int err ;
73637365 s32 i ;
73647366 struct ieee80211_supported_band * band ;
@@ -7392,12 +7394,31 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73927394 else
73937395 bphy_err (drvr , "rxchain error (%d)\n" , err );
73947396
7395- nchain = 1 ;
7397+ nrxchain = 1 ;
7398+ rxchain = 1 ;
73967399 } else {
7397- for (nchain = 0 ; rxchain ; nchain ++ )
7400+ for (nrxchain = 0 ; rxchain ; nrxchain ++ )
73987401 rxchain = rxchain & (rxchain - 1 );
73997402 }
7400- brcmf_dbg (INFO , "nchain=%d\n" , nchain );
7403+ brcmf_dbg (INFO , "nrxchain=%d\n" , nrxchain );
7404+ err = brcmf_fil_iovar_int_get (ifp , "txchain" , & txchain );
7405+ if (err ) {
7406+ /* rxchain unsupported by firmware of older chips */
7407+ if (err == - EBADE )
7408+ bphy_info_once (drvr , "rxchain unsupported\n" );
7409+ else
7410+ bphy_err (drvr , "rxchain error (%d)\n" , err );
7411+
7412+ ntxchain = 1 ;
7413+ txchain = 1 ;
7414+ } else {
7415+ for (ntxchain = 0 ; txchain ; ntxchain ++ )
7416+ txchain = txchain & (txchain - 1 );
7417+ }
7418+ brcmf_dbg (INFO , "ntxchain=%d\n" , ntxchain );
7419+
7420+ wiphy -> available_antennas_rx = nrxchain ;
7421+ wiphy -> available_antennas_tx = ntxchain ;
74017422
74027423 err = brcmf_construct_chaninfo (cfg , bw_cap );
74037424 if (err ) {
@@ -7420,7 +7441,7 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
74207441 continue ;
74217442
74227443 if (nmode )
7423- brcmf_update_ht_cap (band , bw_cap , nchain );
7444+ brcmf_update_ht_cap (band , bw_cap , nrxchain );
74247445 if (vhtmode )
74257446 brcmf_update_vht_cap (band , bw_cap , txstreams , rxstreams ,
74267447 txbf_bfe_cap , txbf_bfr_cap ,
0 commit comments