source: trunk/package/mac80211/patches/583-ath9k_antenna_control.patch @ 28151

Last change on this file since 28151 was 28151, checked in by nbd, 5 years ago

ath9k: fix some hw reset issues

File size: 5.1 KB
  • drivers/net/wireless/ath/ath9k/init.c

    a b static void ath9k_init_txpower_limits(st 
    652652        ah->curchan = curchan; 
    653653} 
    654654 
     655void ath9k_reload_chainmask_settings(struct ath_softc *sc) 
     656{ 
     657        if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT)) 
     658                return; 
     659 
     660        if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) 
     661                setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_2GHZ].ht_cap); 
     662        if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) 
     663                setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_5GHZ].ht_cap); 
     664} 
     665 
     666 
    655667void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) 
    656668{ 
    657         struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     669        struct ath_hw *ah = sc->sc_ah; 
     670        struct ath_common *common = ath9k_hw_common(ah); 
    658671 
    659672        hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | 
    660673                IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | 
    void ath9k_set_hw_capab(struct ath_softc 
    692705        hw->sta_data_size = sizeof(struct ath_node); 
    693706        hw->vif_data_size = sizeof(struct ath_vif); 
    694707 
     708        hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1; 
     709        hw->wiphy->available_antennas_tx = BIT(ah->caps.max_txchains) - 1; 
     710 
     711        /* single chain devices with rx diversity */ 
     712        if (ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) 
     713                hw->wiphy->available_antennas_rx = BIT(0) | BIT(1); 
     714 
     715        sc->ant_rx = hw->wiphy->available_antennas_rx; 
     716        sc->ant_tx = hw->wiphy->available_antennas_tx; 
     717 
    695718#ifdef CONFIG_ATH9K_RATE_CONTROL 
    696719        hw->rate_control_algorithm = "ath9k_rate_control"; 
    697720#endif 
    void ath9k_set_hw_capab(struct ath_softc 
    703726                hw->wiphy->bands[IEEE80211_BAND_5GHZ] = 
    704727                        &sc->sbands[IEEE80211_BAND_5GHZ]; 
    705728 
    706         if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) { 
    707                 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) 
    708                         setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_2GHZ].ht_cap); 
    709                 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) 
    710                         setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_5GHZ].ht_cap); 
    711         } 
     729        ath9k_reload_chainmask_settings(sc); 
    712730 
    713731        SET_IEEE80211_PERM_ADDR(hw, common->macaddr); 
    714732} 
  • drivers/net/wireless/ath/ath9k/ath9k.h

    a b struct ath_softc { 
    654654        struct ath_descdma txsdma; 
    655655 
    656656        struct ath_ant_comb ant_comb; 
     657        u8 ant_tx, ant_rx; 
    657658}; 
    658659 
    659660void ath9k_tasklet(unsigned long data); 
    int ath9k_init_device(u16 devid, struct  
    674675                    const struct ath_bus_ops *bus_ops); 
    675676void ath9k_deinit_device(struct ath_softc *sc); 
    676677void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw); 
     678void ath9k_reload_chainmask_settings(struct ath_softc *sc); 
    677679 
    678680void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw); 
    679681bool ath9k_uses_beacons(int type); 
  • drivers/net/wireless/ath/ath9k/main.c

    a b static bool ath_complete_reset(struct at 
    280280                        ath_start_ani(common); 
    281281        } 
    282282 
     283        if (ath9k_hw_ops(ah)->antdiv_comb_conf_get && sc->ant_rx != 3) { 
     284                struct ath_hw_antcomb_conf div_ant_conf; 
     285                u8 lna_conf; 
     286 
     287                ath9k_hw_antdiv_comb_conf_get(ah, &div_ant_conf); 
     288 
     289                if (sc->ant_rx == 1) 
     290                        lna_conf = ATH_ANT_DIV_COMB_LNA1; 
     291                else 
     292                        lna_conf = ATH_ANT_DIV_COMB_LNA2; 
     293                div_ant_conf.main_lna_conf = lna_conf; 
     294                div_ant_conf.alt_lna_conf = lna_conf; 
     295 
     296                ath9k_hw_antdiv_comb_conf_set(ah, &div_ant_conf); 
     297        } 
     298 
    283299        ieee80211_wake_queues(sc->hw); 
    284300 
    285301        return true; 
    static int ath9k_get_stats(struct ieee80 
    23832399        return 0; 
    23842400} 
    23852401 
     2402static u32 fill_chainmask(u32 cap, u32 new) 
     2403{ 
     2404        u32 filled = 0; 
     2405        int i; 
     2406 
     2407        for (i = 0; cap && new; i++, cap >>= 1) { 
     2408                if (!(cap & BIT(0))) 
     2409                        continue; 
     2410 
     2411                if (new & BIT(0)) 
     2412                        filled |= BIT(i); 
     2413 
     2414                new >>= 1; 
     2415        } 
     2416 
     2417        return filled; 
     2418} 
     2419 
     2420static int ath9k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) 
     2421{ 
     2422        struct ath_softc *sc = hw->priv; 
     2423        struct ath_hw *ah = sc->sc_ah; 
     2424 
     2425        if (!rx_ant || !tx_ant) 
     2426                return -EINVAL; 
     2427 
     2428        sc->ant_rx = rx_ant; 
     2429        sc->ant_tx = tx_ant; 
     2430 
     2431        if (ah->caps.rx_chainmask == 1) 
     2432                return 0; 
     2433 
     2434        /* AR9100 runs into calibration issues if not all rx chains are enabled */ 
     2435        if (AR_SREV_9100(ah)) 
     2436                ah->rxchainmask = 0x7; 
     2437        else 
     2438                ah->rxchainmask = fill_chainmask(ah->caps.rx_chainmask, rx_ant); 
     2439 
     2440        ah->txchainmask = fill_chainmask(ah->caps.tx_chainmask, tx_ant); 
     2441        ath9k_reload_chainmask_settings(sc); 
     2442 
     2443        return 0; 
     2444} 
     2445 
     2446static int ath9k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) 
     2447{ 
     2448        struct ath_softc *sc = hw->priv; 
     2449 
     2450        *tx_ant = sc->ant_tx; 
     2451        *rx_ant = sc->ant_rx; 
     2452        return 0; 
     2453} 
     2454 
    23862455struct ieee80211_ops ath9k_ops = { 
    23872456        .tx                 = ath9k_tx, 
    23882457        .start              = ath9k_start, 
    struct ieee80211_ops ath9k_ops = { 
    24092478        .tx_frames_pending  = ath9k_tx_frames_pending, 
    24102479        .tx_last_beacon     = ath9k_tx_last_beacon, 
    24112480        .get_stats          = ath9k_get_stats, 
     2481        .set_antenna        = ath9k_set_antenna, 
     2482        .get_antenna        = ath9k_get_antenna, 
    24122483}; 
  • drivers/net/wireless/ath/ath9k/recv.c

    a b int ath_rx_tasklet(struct ath_softc *sc, 
    19561956                        ath_rx_ps(sc, skb); 
    19571957                spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 
    19581958 
    1959                 if (ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) 
     1959                if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx == 3) 
    19601960                        ath_ant_comb_scan(sc, &rs); 
    19611961 
    19621962                ieee80211_rx(hw, skb); 
Note: See TracBrowser for help on using the repository browser.