Please note: This project is no longer active. The website is kept online for historic purposes only.
If you´re looking for a Linux driver for your Atheros WLAN device, you should continue here .

Changeset 3872

Show
Ignore:
Timestamp:
11/03/08 23:06:16 (6 years ago)
Author:
benoit
Message:

Merge trunk@3870
Improved slottime and acktimeout/ctstimeout computations

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • madwifi/branches/madwifi-hal-testing/ath/if_ath.c

    r3865 r3872  
    42594259} 
    42604260 
     4261/* returns aSIFSTime based on current channel settings */ 
     4262 
     4263static int 
     4264ath_default_sifs(struct ath_softc *sc) 
     4265{ 
     4266        /* Turbo mode. FIXME : what is the correct value? */ 
     4267        if (sc->sc_dturbo || (sc->sc_curchan.privFlags & CHANNEL_ST)) 
     4268                return 8; 
     4269         
     4270        if (sc->sc_curchan.channelFlags & CHANNEL_2GHZ) { 
     4271 
     4272                /* default : 802.11b or 802.11g with short/long slot time */ 
     4273                return 10; 
     4274        } else if (sc->sc_curchan.channelFlags & CHANNEL_5GHZ) { 
     4275 
     4276                /* 802.11a/10MHz (half rates) */ 
     4277                if (sc->sc_curchan.channelFlags & CHANNEL_HALF) 
     4278                        return 64; 
     4279 
     4280                /* 802.11a/5MHz (quarter rates) */ 
     4281                if (sc->sc_curchan.channelFlags & CHANNEL_QUARTER) 
     4282                        return 32; 
     4283 
     4284                /* default : 802.11a/20MHz */ 
     4285                return 16; 
     4286        } 
     4287 
     4288        /* incorrect value for channelFlags, returns a default value */ 
     4289        return 10; 
     4290} 
     4291 
    42614292static inline int  
    4262 ath_slottime2timeout(struct ath_softc *sc, int slottime) 
    4263 { 
    4264         /* IEEE 802.11 2007 9.2.8 says the ACK timeout shall be SIFSTime + 
    4265          * slot time (+ PHY RX start delay). HAL seems to use a constant of 8 
     4293ath_slottime2timeout(struct ath_softc *sc, int aSlotTime) 
     4294{ 
     4295        /* IEEE 802.11-2007 9.2.8 says the ACK timeout shall be aSIFSTime + 
     4296         * aSlotTime (+ aPHY-RX-START-Delay). HAL seems to use a constant of 8 
    42664297         * for OFDM overhead and 18 for CCK overhead. 
    4267          * 
    4268          * XXX: Update based on emperical evidence (potentially save 15us per 
    4269          * timeout). */ 
    4270         if (((sc->sc_curchan.channelFlags & IEEE80211_CHAN_A) == 
    4271                                 IEEE80211_CHAN_A) || 
    4272             (((sc->sc_curchan.channelFlags & IEEE80211_CHAN_108G) == 
    4273                                 IEEE80211_CHAN_108G) &&  
    4274              (sc->sc_ic.ic_flags & IEEE80211_F_SHSLOT))) 
    4275                 /* Short slot time: 802.11a, and 802.11g turbo in turbo mode 
    4276                  * with short slot time. */ 
    4277                 return slottime + 8; 
    4278         else 
    4279                 /* Constant for CCK MIB processing time. */ 
    4280                 return slottime + 18; 
     4298         */ 
     4299 
     4300        int aSIFSTime; 
     4301 
     4302        aSIFSTime = ath_default_sifs(sc); 
     4303        /* FIXME : we neglect aPHY-RX-START-Delay */ 
     4304        return aSIFSTime + aSlotTime; 
     4305
     4306 
     4307/* returns aSlotTime in us based on the current channel settings. This value 
     4308 * does not take into account air propagation time */ 
     4309 
     4310static int 
     4311ath_default_slottime(struct ath_softc *sc) 
     4312
     4313        struct ieee80211com *ic = &sc->sc_ic; 
     4314 
     4315        /* Turbo mode */ 
     4316        if (sc->sc_dturbo || (sc->sc_curchan.privFlags & CHANNEL_ST)) 
     4317                return 6; 
     4318         
     4319        if (sc->sc_curchan.channelFlags & CHANNEL_2GHZ) { 
     4320 
     4321                /* 802.11g with short slot time */ 
     4322                if (ic->ic_flags & IEEE80211_F_SHSLOT) 
     4323                        return 9; 
     4324                 
     4325                /* default : 802.11b or 802.11g with long slot time */ 
     4326                return 20; 
     4327        } else if (sc->sc_curchan.channelFlags & CHANNEL_5GHZ) { 
     4328 
     4329                /* 802.11a/10MHz (half rates) */ 
     4330                if (sc->sc_curchan.channelFlags & CHANNEL_HALF) 
     4331                        return 13; 
     4332 
     4333                /* 802.11a/5MHz (quarter rates) */ 
     4334                if (sc->sc_curchan.channelFlags & CHANNEL_QUARTER) 
     4335                        return 21; 
     4336 
     4337                /* default : 802.11a/20MHz */ 
     4338                return 9; 
     4339        } 
     4340 
     4341        /* incorrect value for channelFlags, returns a default value */ 
     4342        return 20; 
    42814343} 
    42824344 
     
    43124374 
    43134375/* 
    4314  * Set the slot time based on the current setting. 
     4376 * Set the slot time, ACK timeout, CTS timeout HW registers based on the 
     4377 * current setting. 
    43154378 */ 
    43164379static inline void 
    43174380ath_setslottime(struct ath_softc *sc) 
    43184381{ 
    4319         struct ieee80211com *ic = &sc->sc_ic; 
    43204382        struct ath_hal *ah = sc->sc_ah; 
    43214383 
    43224384        if (sc->sc_slottimeconf > 0) /* manual override */ 
    43234385                ath_hal_setslottime(ah, sc->sc_slottimeconf); 
    4324         else if (sc->sc_dturbo || (sc->sc_curchan.privFlags & CHANNEL_ST)) 
    4325                 ath_hal_setslottime(ah, HAL_SLOT_TIME_6); 
    4326         else if (ic->ic_flags & IEEE80211_F_SHSLOT) 
    4327                 ath_hal_setslottime(ah, HAL_SLOT_TIME_9); 
    43284386        else 
    4329                 ath_hal_setslottime(ah, HAL_SLOT_TIME_20); 
     4387                ath_hal_setslottime(ah, ath_default_slottime(sc)); 
     4388 
    43304389        sc->sc_updateslot = OK; 
    43314390        ath_setacktimeout(sc); 
     
    1048410543ath_distance2slottime(struct ath_softc *sc, int distance) 
    1048510544{ 
    10486         /* Allowance for air propagation (roundtrip time) should be at least  
    10487          * 5us per the standards. 
    10488          *  
    10489          * So let's set a minimum distance to accomodate this:  
    10490          * roundtrip time = ((distance / speed_of_light) * 2) 
    10491          * distance = ((time * 300 ) / 2) or ((5 * 300) / 2) = 750 m */ 
    10492         int rtdist = distance * 2; 
     10545        /* IEEE 802.11-2007 10.4.3.2 defines aAirPropagationTime as being 
     10546         * twice the propagation time for a signal to cross the maximum 
     10547         * distance */ 
     10548 
    1049310549        int c = 299;    /* Speed of light in vacuum in m/us. */  
    10494         /* IEEE 802.11 2007 10l.4.3.2. In us. */ 
    10495         int aAirPropagation = MAX(5, howmany(rtdist, c)); 
    10496         /* XXX: RX/TX turnaround & MAC delay. */ 
    10497         return ath_ccatime(sc) + aAirPropagation; 
     10550        /* IEEE 802.11 2007 10.4.3.2. In us. */ 
     10551        int aAirPropagationTime = (distance * 2) / c; 
     10552        return ath_default_slottime(sc) + aAirPropagationTime; 
    1049810553} 
    1049910554