/* * Centralized txant update function. call it whenever wlc->stf->txant and/or wlc->stf->txchain * change * * Antennas are controlled by ucode indirectly, which drives PHY or GPIO to * achieve various tx/rx antenna selection schemes * * legacy phy, bit 6 and bit 7 means antenna 0 and 1 respectively, bit6+bit7 means auto(last rx) * for NREV<3, bit 6 and bit 7 means antenna 0 and 1 respectively, bit6+bit7 means last rx and * do tx-antenna selection for SISO transmissions * for NREV=3, bit 6 and bit _8_ means antenna 0 and 1 respectively, bit6+bit7 means last rx and * do tx-antenna selection for SISO transmissions * for NREV>=7, bit 6 and bit 7 mean antenna 0 and 1 respectively, nit6+bit7 means both cores active */ static void _wlc_stf_phy_txant_upd(struct wlc_info *wlc) { s8 txant; txant = (s8) wlc->stf->txant; ASSERT(txant == ANT_TX_FORCE_0 || txant == ANT_TX_FORCE_1 || txant == ANT_TX_LAST_RX); if (WLC_PHY_11N_CAP(wlc->band)) { if (txant == ANT_TX_FORCE_0) { wlc->stf->phytxant = PHY_TXC_ANT_0; } else if (txant == ANT_TX_FORCE_1) { wlc->stf->phytxant = PHY_TXC_ANT_1; if (WLCISNPHY(wlc->band) && NREV_GE(wlc->band->phyrev, 3) && NREV_LT(wlc->band->phyrev, 7)) { wlc->stf->phytxant = PHY_TXC_ANT_2; } } else { if (WLCISLCNPHY(wlc->band) || WLCISSSLPNPHY(wlc->band)) wlc->stf->phytxant = PHY_TXC_LCNPHY_ANT_LAST; else { /* keep this assert to catch out of sync wlc->stf->txcore */ ASSERT(wlc->stf->txchain > 0); wlc->stf->phytxant = wlc->stf->txchain << PHY_TXC_ANT_SHIFT; } } } else { if (txant == ANT_TX_FORCE_0) wlc->stf->phytxant = PHY_TXC_OLD_ANT_0; else if (txant == ANT_TX_FORCE_1) wlc->stf->phytxant = PHY_TXC_OLD_ANT_1; else wlc->stf->phytxant = PHY_TXC_OLD_ANT_LAST; } wlc_bmac_txant_set(wlc->hw, wlc->stf->phytxant); }
/* * Centralized txant update function. call it whenever wlc->stf->txant and/or * wlc->stf->txchain change. * * Antennas are controlled by ucode indirectly, which drives PHY or GPIO to * achieve various tx/rx antenna selection schemes * * legacy phy, bit 6 and bit 7 means antenna 0 and 1 respectively, bit6+bit7 * means auto(last rx). * for NREV<3, bit 6 and bit 7 means antenna 0 and 1 respectively, bit6+bit7 * means last rx and do tx-antenna selection for SISO transmissions * for NREV=3, bit 6 and bit _8_ means antenna 0 and 1 respectively, bit6+bit7 * means last rx and do tx-antenna selection for SISO transmissions * for NREV>=7, bit 6 and bit 7 mean antenna 0 and 1 respectively, nit6+bit7 * means both cores active */ static void _brcms_c_stf_phy_txant_upd(struct brcms_c_info *wlc) { s8 txant; txant = (s8) wlc->stf->txant; if (BRCMS_PHY_11N_CAP(wlc->band)) { if (txant == ANT_TX_FORCE_0) { wlc->stf->phytxant = PHY_TXC_ANT_0; } else if (txant == ANT_TX_FORCE_1) { wlc->stf->phytxant = PHY_TXC_ANT_1; if (BRCMS_ISNPHY(wlc->band) && NREV_GE(wlc->band->phyrev, 3) && NREV_LT(wlc->band->phyrev, 7)) wlc->stf->phytxant = PHY_TXC_ANT_2; } else { if (BRCMS_ISLCNPHY(wlc->band) || BRCMS_ISSSLPNPHY(wlc->band)) wlc->stf->phytxant = PHY_TXC_LCNPHY_ANT_LAST; else { /* catch out of sync wlc->stf->txcore */ WARN_ON(wlc->stf->txchain <= 0); wlc->stf->phytxant = wlc->stf->txchain << PHY_TXC_ANT_SHIFT; } } } else { if (txant == ANT_TX_FORCE_0) wlc->stf->phytxant = PHY_TXC_OLD_ANT_0; else if (txant == ANT_TX_FORCE_1) wlc->stf->phytxant = PHY_TXC_OLD_ANT_1; else wlc->stf->phytxant = PHY_TXC_OLD_ANT_LAST; } brcms_b_txant_set(wlc->hw, wlc->stf->phytxant); }