source: trunk/package/mac80211/patches/582-ath9k_antenna_control.patch @ 28115

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

ath9k: fix disabling ani on reset

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 { 
    652652        struct ath_descdma txsdma; 
    653653 
    654654        struct ath_ant_comb ant_comb; 
     655        u8 ant_tx, ant_rx; 
    655656}; 
    656657 
    657658void ath9k_tasklet(unsigned long data); 
    int ath9k_init_device(u16 devid, struct  
    673674                    const struct ath_bus_ops *bus_ops); 
    674675void ath9k_deinit_device(struct ath_softc *sc); 
    675676void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw); 
     677void ath9k_reload_chainmask_settings(struct ath_softc *sc); 
    676678 
    677679void ath_radio_disable(struct ath_softc *sc, struct ieee80211_hw *hw); 
    678680bool ath9k_uses_beacons(int type); 
  • drivers/net/wireless/ath/ath9k/main.c

    a b static bool ath_complete_reset(struct at 
    269269                        ath_start_ani(common); 
    270270        } 
    271271 
     272        if (ath9k_hw_ops(ah)->antdiv_comb_conf_get && sc->ant_rx != 3) { 
     273                struct ath_hw_antcomb_conf div_ant_conf; 
     274                u8 lna_conf; 
     275 
     276                ath9k_hw_antdiv_comb_conf_get(ah, &div_ant_conf); 
     277 
     278                if (sc->ant_rx == 1) 
     279                        lna_conf = ATH_ANT_DIV_COMB_LNA1; 
     280                else 
     281                        lna_conf = ATH_ANT_DIV_COMB_LNA2; 
     282                div_ant_conf.main_lna_conf = lna_conf; 
     283                div_ant_conf.alt_lna_conf = lna_conf; 
     284 
     285                ath9k_hw_antdiv_comb_conf_set(ah, &div_ant_conf); 
     286        } 
     287 
    272288        ieee80211_wake_queues(sc->hw); 
    273289 
    274290        return true; 
    static int ath9k_get_stats(struct ieee80 
    23652381        return 0; 
    23662382} 
    23672383 
     2384static u32 fill_chainmask(u32 cap, u32 new) 
     2385{ 
     2386        u32 filled = 0; 
     2387        int i; 
     2388 
     2389        for (i = 0; cap && new; i++, cap >>= 1) { 
     2390                if (!(cap & BIT(0))) 
     2391                        continue; 
     2392 
     2393                if (new & BIT(0)) 
     2394                        filled |= BIT(i); 
     2395 
     2396                new >>= 1; 
     2397        } 
     2398 
     2399        return filled; 
     2400} 
     2401 
     2402static int ath9k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) 
     2403{ 
     2404        struct ath_softc *sc = hw->priv; 
     2405        struct ath_hw *ah = sc->sc_ah; 
     2406 
     2407        if (!rx_ant || !tx_ant) 
     2408                return -EINVAL; 
     2409 
     2410        sc->ant_rx = rx_ant; 
     2411        sc->ant_tx = tx_ant; 
     2412 
     2413        if (ah->caps.rx_chainmask == 1) 
     2414                return 0; 
     2415 
     2416        /* AR9100 runs into calibration issues if not all rx chains are enabled */ 
     2417        if (AR_SREV_9100(ah)) 
     2418                ah->rxchainmask = 0x7; 
     2419        else 
     2420                ah->rxchainmask = fill_chainmask(ah->caps.rx_chainmask, rx_ant); 
     2421 
     2422        ah->txchainmask = fill_chainmask(ah->caps.tx_chainmask, tx_ant); 
     2423        ath9k_reload_chainmask_settings(sc); 
     2424 
     2425        return 0; 
     2426} 
     2427 
     2428static int ath9k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) 
     2429{ 
     2430        struct ath_softc *sc = hw->priv; 
     2431 
     2432        *tx_ant = sc->ant_tx; 
     2433        *rx_ant = sc->ant_rx; 
     2434        return 0; 
     2435} 
     2436 
    23682437struct ieee80211_ops ath9k_ops = { 
    23692438        .tx                 = ath9k_tx, 
    23702439        .start              = ath9k_start, 
    struct ieee80211_ops ath9k_ops = { 
    23912460        .tx_frames_pending  = ath9k_tx_frames_pending, 
    23922461        .tx_last_beacon     = ath9k_tx_last_beacon, 
    23932462        .get_stats          = ath9k_get_stats, 
     2463        .set_antenna        = ath9k_set_antenna, 
     2464        .get_antenna        = ath9k_get_antenna, 
    23942465}; 
  • 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.