@@ -7220,7 +7220,7 @@ static void brcmf_get_bwcap(struct brcmf_if *ifp, u32 bw_cap[])
72207220}
72217221
72227222static void brcmf_update_ht_cap (struct ieee80211_supported_band * band ,
7223- u32 bw_cap [2 ], u32 nchain )
7223+ u32 bw_cap [2 ], u32 nrxchain )
72247224{
72257225 band -> ht_cap .ht_supported = true;
72267226 if (bw_cap [band -> band ] & WLC_BW_40MHZ_BIT ) {
@@ -7231,7 +7231,7 @@ static void brcmf_update_ht_cap(struct ieee80211_supported_band *band,
72317231 band -> ht_cap .cap |= IEEE80211_HT_CAP_DSSSCCK40 ;
72327232 band -> ht_cap .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K ;
72337233 band -> ht_cap .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16 ;
7234- memset (band -> ht_cap .mcs .rx_mask , 0xff , nchain );
7234+ memset (band -> ht_cap .mcs .rx_mask , 0xff , nrxchain );
72357235 band -> ht_cap .mcs .tx_params = IEEE80211_HT_MCS_TX_DEFINED ;
72367236}
72377237
@@ -7320,7 +7320,9 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73207320 u32 vhtmode = 0 ;
73217321 u32 bw_cap [2 ] = { WLC_BW_20MHZ_BIT , WLC_BW_20MHZ_BIT };
73227322 u32 rxchain ;
7323- u32 nchain ;
7323+ u32 txchain ;
7324+ u32 nrxchain ;
7325+ u32 ntxchain ;
73247326 int err ;
73257327 s32 i ;
73267328 struct ieee80211_supported_band * band ;
@@ -7354,12 +7356,31 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73547356 else
73557357 bphy_err (drvr , "rxchain error (%d)\n" , err );
73567358
7357- nchain = 1 ;
7359+ nrxchain = 1 ;
7360+ rxchain = 1 ;
73587361 } else {
7359- for (nchain = 0 ; rxchain ; nchain ++ )
7362+ for (nrxchain = 0 ; rxchain ; nrxchain ++ )
73607363 rxchain = rxchain & (rxchain - 1 );
73617364 }
7362- brcmf_dbg (INFO , "nchain=%d\n" , nchain );
7365+ brcmf_dbg (INFO , "nrxchain=%d\n" , nrxchain );
7366+ err = brcmf_fil_iovar_int_get (ifp , "txchain" , & txchain );
7367+ if (err ) {
7368+ /* rxchain unsupported by firmware of older chips */
7369+ if (err == - EBADE )
7370+ bphy_info_once (drvr , "rxchain unsupported\n" );
7371+ else
7372+ bphy_err (drvr , "rxchain error (%d)\n" , err );
7373+
7374+ ntxchain = 1 ;
7375+ txchain = 1 ;
7376+ } else {
7377+ for (ntxchain = 0 ; txchain ; ntxchain ++ )
7378+ txchain = txchain & (txchain - 1 );
7379+ }
7380+ brcmf_dbg (INFO , "ntxchain=%d\n" , ntxchain );
7381+
7382+ wiphy -> available_antennas_rx = nrxchain ;
7383+ wiphy -> available_antennas_tx = ntxchain ;
73637384
73647385 err = brcmf_construct_chaninfo (cfg , bw_cap );
73657386 if (err ) {
@@ -7382,7 +7403,7 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
73827403 continue ;
73837404
73847405 if (nmode )
7385- brcmf_update_ht_cap (band , bw_cap , nchain );
7406+ brcmf_update_ht_cap (band , bw_cap , nrxchain );
73867407 if (vhtmode )
73877408 brcmf_update_vht_cap (band , bw_cap , txstreams , rxstreams ,
73887409 txbf_bfe_cap , txbf_bfr_cap ,
0 commit comments