source: branches/backfire/package/mac80211/patches/545-ath9k_timing_settings.patch @ 27574

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

mac80211, ath9k: update to latest trunk as of r27572

File size: 2.8 KB
  • drivers/net/wireless/ath/ath9k/hw.c

    a b static void ath9k_hw_init_interrupt_mask 
    914914        } 
    915915} 
    916916 
     917static void ath9k_hw_set_sifs_time(struct ath_hw *ah, u32 us) 
     918{ 
     919        u32 val = ath9k_hw_mac_to_clks(ah, us - 2); 
     920        val = min(val, (u32) 0xFFFF); 
     921        REG_WRITE(ah, AR_D_GBL_IFS_SIFS, val); 
     922} 
     923 
    917924static void ath9k_hw_setslottime(struct ath_hw *ah, u32 us) 
    918925{ 
    919926        u32 val = ath9k_hw_mac_to_clks(ah, us); 
    static bool ath9k_hw_set_global_txtimeou 
    951958 
    952959void ath9k_hw_init_global_settings(struct ath_hw *ah) 
    953960{ 
    954         struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; 
     961        struct ath_common *common = ath9k_hw_common(ah); 
     962        struct ieee80211_conf *conf = &common->hw->conf; 
     963        const struct ath9k_channel *chan = ah->curchan; 
    955964        int acktimeout; 
    956965        int slottime; 
    957966        int sifstime; 
     967        int rx_lat = 0, tx_lat = 0, eifs = 0; 
     968        u32 reg; 
    958969 
    959970        ath_dbg(ath9k_hw_common(ah), ATH_DBG_RESET, "ah->misc_mode 0x%x\n", 
    960971                ah->misc_mode); 
    961972 
     973        if (!chan) 
     974                return; 
     975 
    962976        if (ah->misc_mode != 0) 
    963977                REG_SET_BIT(ah, AR_PCU_MISC, ah->misc_mode); 
    964978 
    965         if (conf->channel && conf->channel->band == IEEE80211_BAND_5GHZ) 
    966                 sifstime = 16; 
    967         else 
    968                 sifstime = 10; 
     979        rx_lat = 37; 
     980        tx_lat = 54; 
     981 
     982        if (IS_CHAN_HALF_RATE(chan)) { 
     983                eifs = 175; 
     984                rx_lat *= 2; 
     985                tx_lat *= 2; 
     986                if (IS_CHAN_A_FAST_CLOCK(ah, chan)) 
     987                    tx_lat += 11; 
     988 
     989                slottime = 13; 
     990                sifstime = 32; 
     991        } else if (IS_CHAN_QUARTER_RATE(chan)) { 
     992                eifs = 340; 
     993                rx_lat *= 4; 
     994                tx_lat *= 4; 
     995                if (IS_CHAN_A_FAST_CLOCK(ah, chan)) 
     996                    tx_lat += 22; 
     997 
     998                slottime = 21; 
     999                sifstime = 64; 
     1000        } else { 
     1001                eifs = REG_READ(ah, AR_D_GBL_IFS_EIFS); 
     1002                reg = REG_READ(ah, AR_USEC); 
     1003                rx_lat = MS(reg, AR_USEC_RX_LAT); 
     1004                tx_lat = MS(reg, AR_USEC_TX_LAT); 
     1005 
     1006                slottime = ah->slottime; 
     1007                if (IS_CHAN_5GHZ(chan)) 
     1008                        sifstime = 16; 
     1009                else 
     1010                        sifstime = 10; 
     1011        } 
    9691012 
    9701013        /* As defined by IEEE 802.11-2007 17.3.8.6 */ 
    971         slottime = ah->slottime + 3 * ah->coverage_class; 
    972         acktimeout = slottime + sifstime; 
     1014        acktimeout = slottime + sifstime + 3 * ah->coverage_class; 
    9731015 
    9741016        /* 
    9751017         * Workaround for early ACK timeouts, add an offset to match the 
    void ath9k_hw_init_global_settings(struc 
    9811023        if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ) 
    9821024                acktimeout += 64 - sifstime - ah->slottime; 
    9831025 
    984         ath9k_hw_setslottime(ah, ah->slottime); 
     1026        ath9k_hw_set_sifs_time(ah, sifstime); 
     1027        ath9k_hw_setslottime(ah, slottime); 
    9851028        ath9k_hw_set_ack_timeout(ah, acktimeout); 
    9861029        ath9k_hw_set_cts_timeout(ah, acktimeout); 
    9871030        if (ah->globaltxtimeout != (u32) -1) 
    9881031                ath9k_hw_set_global_txtimeout(ah, ah->globaltxtimeout); 
     1032 
     1033        REG_WRITE(ah, AR_D_GBL_IFS_EIFS, ath9k_hw_mac_to_clks(ah, eifs)); 
     1034        REG_RMW(ah, AR_USEC, 
     1035                (common->clockrate - 1) | 
     1036                SM(rx_lat, AR_USEC_RX_LAT) | 
     1037                SM(tx_lat, AR_USEC_TX_LAT), 
     1038                AR_USEC_TX_LAT | AR_USEC_RX_LAT | AR_USEC_USEC); 
     1039 
    9891040} 
    9901041EXPORT_SYMBOL(ath9k_hw_init_global_settings); 
    9911042 
Note: See TracBrowser for help on using the repository browser.