mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			765 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			765 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/ath/if_ath.c
 | |
| +++ b/ath/if_ath.c
 | |
| @@ -382,6 +382,7 @@ static u_int32_t ath_set_clamped_maxtxpo
 | |
|  static void ath_poll_disable(struct net_device *dev);
 | |
|  static void ath_poll_enable(struct net_device *dev);
 | |
|  static void ath_fetch_idle_time(struct ath_softc *sc);
 | |
| +static void ath_set_timing(struct ath_softc *sc);
 | |
|  
 | |
|  /* calibrate every 30 secs in steady state but check every second at first. */
 | |
|  static int ath_calinterval = ATH_SHORT_CALINTERVAL;
 | |
| @@ -1185,6 +1186,7 @@ ath_attach(u_int16_t devid, struct net_d
 | |
|  	sc->sc_intmit = -1;
 | |
|  	sc->sc_noise_immunity = -1;
 | |
|  	sc->sc_ofdm_weak_det = -1;
 | |
| +	sc->sc_coverage = 7; /* 2100 meters */
 | |
|  
 | |
|  	return 0;
 | |
|  bad3:
 | |
| @@ -2673,6 +2675,7 @@ ath_init(struct net_device *dev)
 | |
|  	 */
 | |
|  	ath_chan_change(sc, ic->ic_curchan);
 | |
|  	ath_set_ack_bitrate(sc, sc->sc_ackrate);
 | |
| +	ath_set_timing(sc);
 | |
|  	dev->flags |= IFF_RUNNING;		/* we are ready to go */
 | |
|  	ieee80211_start_running(ic);		/* start all VAPs */
 | |
|  #ifdef ATH_TX99_DIAG
 | |
| @@ -4484,17 +4487,52 @@ ath_mode_init(struct net_device *dev)
 | |
|   * Set the slot time based on the current setting.
 | |
|   */
 | |
|  static void
 | |
| -ath_settiming(struct ath_softc *sc)
 | |
| +ath_set_timing(struct ath_softc *sc)
 | |
|  {
 | |
| +	struct ieee80211com *ic = &sc->sc_ic;
 | |
|  	struct ath_hal *ah = sc->sc_ah;
 | |
| -	u_int offset = getTimingOffset(sc);
 | |
| +	struct ath_timings *t = &sc->sc_timings;
 | |
| +	u_int offset = 9;
 | |
| +
 | |
| +	t->sifs = 16;
 | |
| +	if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) {
 | |
| +		offset = 20;
 | |
| +		if (ic->ic_flags & IEEE80211_F_SHSLOT)
 | |
| +			offset = 9;
 | |
| +	} else if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) {
 | |
| +		offset = 9;
 | |
| +	}
 | |
| +
 | |
| +	if (IEEE80211_IS_CHAN_TURBO(ic->ic_curchan)) {
 | |
| +		offset = 6;
 | |
| +		t->sifs = 8;
 | |
| +	} else if (IEEE80211_IS_CHAN_HALF(ic->ic_curchan)) {
 | |
| +		offset = 13;
 | |
| +		t->sifs = 32;
 | |
| +	} else if (IEEE80211_IS_CHAN_QUARTER(ic->ic_curchan)) {
 | |
| +		offset = 21;
 | |
| +		t->sifs = 64;
 | |
| +	}
 | |
| +
 | |
| +	t->slot = offset + sc->sc_coverage;
 | |
| +	t->ack = t->slot * 2 + 3;
 | |
| +	t->cts = t->slot * 2 + 3;
 | |
|  
 | |
|  	if (sc->sc_slottimeconf > 0)
 | |
| -		ath_hal_setslottime(ah, offset + sc->sc_slottimeconf);
 | |
| +		t->slot = sc->sc_slottimeconf;
 | |
|  	if (sc->sc_acktimeconf > 0)
 | |
| -		ath_hal_setacktimeout(ah, 2 * offset + sc->sc_acktimeconf);
 | |
| +		t->ack = sc->sc_acktimeconf;
 | |
|  	if (sc->sc_ctstimeconf > 0)
 | |
| -		ath_hal_setctstimeout(ah, 2 * offset + sc->sc_ctstimeconf);
 | |
| +		t->cts = sc->sc_ctstimeconf;
 | |
| +
 | |
| +	t->difs = 2 * t->sifs + t->slot;
 | |
| +	t->eifs = t->sifs + t->difs + 3;
 | |
| +
 | |
| +	ath_hal_setslottime(ah, t->slot);
 | |
| +	ath_hal_setacktimeout(ah, t->ack);
 | |
| +	ath_hal_setctstimeout(ah, t->cts);
 | |
| +	ath_hal_seteifstime(ah, t->eifs);
 | |
| +
 | |
|  	sc->sc_updateslot = OK;
 | |
|  }
 | |
|  
 | |
| @@ -4516,7 +4554,7 @@ ath_updateslot(struct net_device *dev)
 | |
|  	if (ic->ic_opmode == IEEE80211_M_HOSTAP)
 | |
|  		sc->sc_updateslot = UPDATE;
 | |
|  	else if (dev->flags & IFF_RUNNING)
 | |
| -		ath_settiming(sc);
 | |
| +		ath_set_timing(sc);
 | |
|  }
 | |
|  
 | |
|  #ifdef ATH_SUPERG_DYNTURBO
 | |
| @@ -5360,7 +5398,7 @@ ath_beacon_send(struct ath_softc *sc, in
 | |
|  		sc->sc_updateslot = COMMIT;	/* commit next beacon */
 | |
|  		sc->sc_slotupdate = slot;
 | |
|  	} else if ((sc->sc_updateslot == COMMIT) && (sc->sc_slotupdate == slot))
 | |
| -		ath_settiming(sc);		/* commit change to hardware */
 | |
| +		ath_set_timing(sc);		/* commit change to hardware */
 | |
|  
 | |
|  	if (bfaddr != 0) {
 | |
|  		/*
 | |
| @@ -9433,7 +9471,8 @@ ath_set_coverageclass(struct ieee80211co
 | |
|  {
 | |
|  	struct ath_softc *sc = ic->ic_dev->priv;
 | |
|  
 | |
| -	ath_hal_setcoverageclass(sc->sc_ah, ic->ic_coverageclass, 0);
 | |
| +	sc->sc_coverage = ic->ic_coverageclass * 3;
 | |
| +	ath_set_timing(sc);
 | |
|  
 | |
|  	return;
 | |
|  }
 | |
| @@ -10956,6 +10995,7 @@ enum {
 | |
|  	ATH_OFDM_WEAK_DET	= 29,
 | |
|  	ATH_CHANBW		= 30,
 | |
|  	ATH_OUTDOOR		= 31,
 | |
| +	ATH_DISTANCE	= 32,
 | |
|  };
 | |
|  
 | |
|  /*
 | |
| @@ -11168,21 +11208,31 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
 | |
|  					sc->sc_slottimeconf = val;
 | |
|  				else
 | |
|  					sc->sc_slottimeconf = 0;
 | |
| -				ath_settiming(sc);
 | |
| +				ath_set_timing(sc);
 | |
|  				break;
 | |
|  			case ATH_ACKTIMEOUT:
 | |
|  				if (val > 0)
 | |
|  					sc->sc_acktimeconf = val;
 | |
|  				else
 | |
|  					sc->sc_acktimeconf = 0;
 | |
| -				ath_settiming(sc);
 | |
| +				ath_set_timing(sc);
 | |
|  				break;
 | |
|  			case ATH_CTSTIMEOUT:
 | |
|  				if (val > 0)
 | |
|  					sc->sc_ctstimeconf = val;
 | |
|  				else
 | |
|  					sc->sc_ctstimeconf = 0;
 | |
| -				ath_settiming(sc);
 | |
| +				ath_set_timing(sc);
 | |
| +				break;
 | |
| +			case ATH_DISTANCE:
 | |
| +				if (val > 0) {
 | |
| +					sc->sc_coverage = ((val - 1) / 300) + 1;
 | |
| +					ic->ic_coverageclass = ((sc->sc_coverage - 1) / 3) + 1;
 | |
| +				} else {
 | |
| +					sc->sc_coverage = 0;
 | |
| +					ic->ic_coverageclass = 0;
 | |
| +				}
 | |
| +				ath_set_timing(sc);
 | |
|  				break;
 | |
|  			case ATH_SOFTLED:
 | |
|  				if (val != sc->sc_softled) {
 | |
| @@ -11338,6 +11388,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
 | |
|  		case ATH_CHANBW:
 | |
|  			val = sc->sc_chanbw ?: 20;
 | |
|  			break;
 | |
| +		case ATH_DISTANCE:
 | |
| +			val = sc->sc_coverage * 300;
 | |
| +			break;
 | |
|  		case ATH_SLOTTIME:
 | |
|  			val = ath_hal_getslottime(ah);
 | |
|  			break;
 | |
| @@ -11459,6 +11512,12 @@ static const ctl_table ath_sysctl_templa
 | |
|  	  .extra2	= (void *)ATH_CTSTIMEOUT,
 | |
|  	},
 | |
|  	{ .ctl_name	= CTL_AUTO,
 | |
| +	  .procname	= "distance",
 | |
| +	  .mode		= 0644,
 | |
| +	  .proc_handler	= ath_sysctl_halparam,
 | |
| +	  .extra2	= (void *)ATH_DISTANCE,
 | |
| +	},
 | |
| +	{ .ctl_name	= CTL_AUTO,
 | |
|  	  .procname	= "softled",
 | |
|  	  .mode		= 0644,
 | |
|  	  .proc_handler	= ath_sysctl_halparam,
 | |
| --- a/ath/if_ath_hal.h
 | |
| +++ b/ath/if_ath_hal.h
 | |
| @@ -284,6 +284,17 @@ static inline u_int ath_hal_getslottime(
 | |
|  	return ret;
 | |
|  }
 | |
|  
 | |
| +static inline u_int ath_hal_geteifstime(struct ath_hal *ah)
 | |
| +{
 | |
| +	u_int ret;
 | |
| +	ATH_HAL_LOCK_IRQ(ah->ah_sc);
 | |
| +	ath_hal_set_function(__func__);
 | |
| +	ret = ah->ah_getEifsTime(ah);
 | |
| +	ath_hal_set_function(NULL);
 | |
| +	ATH_HAL_UNLOCK_IRQ(ah->ah_sc);
 | |
| +	return ret;
 | |
| +}
 | |
| +
 | |
|  static inline void ath_hal_beaconinit(struct ath_hal *ah, u_int32_t nexttbtt,
 | |
|  				      u_int32_t intval)
 | |
|  {
 | |
| @@ -839,6 +850,17 @@ static inline HAL_BOOL ath_hal_setslotti
 | |
|  	ath_hal_set_function(NULL);
 | |
|  	ATH_HAL_UNLOCK_IRQ(ah->ah_sc);
 | |
|  	return ret;
 | |
| +}
 | |
| +
 | |
| +static inline HAL_BOOL ath_hal_seteifstime(struct ath_hal *ah, u_int a1)
 | |
| +{
 | |
| +	HAL_BOOL ret;
 | |
| +	ATH_HAL_LOCK_IRQ(ah->ah_sc);
 | |
| +	ath_hal_set_function(__func__);
 | |
| +	ret = ah->ah_setEifsTime(ah, a1);
 | |
| +	ath_hal_set_function(NULL);
 | |
| +	ATH_HAL_UNLOCK_IRQ(ah->ah_sc);
 | |
| +	return ret;
 | |
|  }
 | |
|  
 | |
|  static inline void ath_hal_setledstate(struct ath_hal *ah, HAL_LED_STATE a1)
 | |
| --- a/ath/if_athvar.h
 | |
| +++ b/ath/if_athvar.h
 | |
| @@ -613,6 +613,15 @@ struct ath_rp {
 | |
|  	int       rp_analyzed;
 | |
|  };
 | |
|  
 | |
| +struct ath_timings {
 | |
| +	u_int	slot;
 | |
| +	u_int	ack;
 | |
| +	u_int	cts;
 | |
| +	u_int	sifs;
 | |
| +	u_int	difs;
 | |
| +	u_int	eifs;
 | |
| +};
 | |
| +
 | |
|  struct ath_softc {
 | |
|  	struct ieee80211com sc_ic;		/* NB: must be first */
 | |
|  	struct net_device *sc_dev;
 | |
| @@ -839,6 +848,8 @@ struct ath_softc {
 | |
|  						 * detected radars */
 | |
|  	u_int32_t sc_nexttbtt;
 | |
|  	u_int64_t sc_last_tsf;
 | |
| +	u_int sc_coverage;
 | |
| +	struct ath_timings sc_timings;
 | |
|  };
 | |
|  
 | |
|  typedef void (*ath_callback) (struct ath_softc *);
 | |
| @@ -946,49 +957,76 @@ int ar_device(int devid);
 | |
|  	  DEV_NAME(_v->iv_ic->ic_dev))
 | |
|  
 | |
|  void ath_radar_detected(struct ath_softc *sc, const char* message);
 | |
| -static inline u_int getTimingOffset(struct ath_softc *sc)
 | |
| -{
 | |
| -	struct ieee80211com *ic = &sc->sc_ic;
 | |
| -	u_int usec = 9;
 | |
| -	if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) {
 | |
| -		usec = 20;
 | |
| -		if (ic->ic_flags & IEEE80211_F_SHSLOT)
 | |
| -			usec = 9;
 | |
| -	} else if (IEEE80211_IS_CHAN_A(ic->ic_curchan))
 | |
| -		usec = 9;
 | |
| -
 | |
| -	if (IEEE80211_IS_CHAN_TURBO(ic->ic_curchan))
 | |
| -		usec = 6;
 | |
| -
 | |
| -	if (IEEE80211_IS_CHAN_HALF(ic->ic_curchan))
 | |
| -		usec = 13;
 | |
| -	else if (IEEE80211_IS_CHAN_QUARTER(ic->ic_curchan))
 | |
| -		usec = 21;
 | |
| -	return usec;
 | |
| -}
 | |
|  
 | |
| -static inline void ath_get_timings(struct ath_softc *sc, u_int *t_slot, u_int *t_sifs, u_int *t_difs)
 | |
| -{
 | |
| -	struct ieee80211_channel *c = sc->sc_ic.ic_curchan;
 | |
| +#ifndef MIN
 | |
| +#define MIN(a,b)        ((a) < (b) ? (a) : (b))
 | |
| +#endif
 | |
| +#ifndef MAX
 | |
| +#define MAX(a,b)        ((a) > (b) ? (a) : (b))
 | |
| +#endif
 | |
|  
 | |
| -	*t_slot = getTimingOffset(sc) + sc->sc_slottimeconf;
 | |
|  
 | |
| -	if (IEEE80211_IS_CHAN_HALF(c)) {
 | |
| -		*t_sifs = 32;
 | |
| -		*t_difs = 56;
 | |
| -	} else if (IEEE80211_IS_CHAN_QUARTER(c)) {
 | |
| -		*t_sifs = 64;
 | |
| -		*t_difs = 112;
 | |
| -	} else if (IEEE80211_IS_CHAN_TURBO(c)) {
 | |
| -		*t_sifs = 8;
 | |
| -		*t_difs = 28;
 | |
| -	} else {
 | |
| -		*t_sifs = 16;
 | |
| -		*t_difs = 28;
 | |
| -	}
 | |
| +/* Calculate the transmit duration of a frame. */
 | |
| +static inline unsigned
 | |
| +calc_usecs_unicast_packet(struct ath_softc *sc, int length,
 | |
| +		int rix, int short_retries, int long_retries)
 | |
| +{
 | |
| +		const HAL_RATE_TABLE *rt = sc->sc_currates;
 | |
| +		struct ieee80211com *ic = &sc->sc_ic;
 | |
| +		struct ath_timings *t = &sc->sc_timings;
 | |
| +		unsigned int x = 0, tt = 0;
 | |
| +		unsigned int cix = rt->info[rix].controlRate;
 | |
| +		int rts = 0, cts = 0;
 | |
| +		int cw = ATH_DEFAULT_CWMIN;
 | |
| +
 | |
| +		KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode));
 | |
| +
 | |
| +		if (!rt->info[rix].rateKbps) {
 | |
| +			printk(KERN_WARNING "rix %d (%d) bad ratekbps %d mode %u\n",
 | |
| +			       rix, rt->info[rix].dot11Rate,
 | |
| +			       rt->info[rix].rateKbps,
 | |
| +			       sc->sc_curmode);
 | |
| +			return 0;
 | |
| +		}
 | |
| +
 | |
| +		if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
 | |
| +			(rt->info[rix].phy == IEEE80211_T_OFDM)) {
 | |
| +
 | |
| +			if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
 | |
| +				rts = 1;
 | |
| +			else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
 | |
| +				cts = 1;
 | |
| +
 | |
| +			cix = rt->info[sc->sc_protrix].controlRate;
 | |
| +		}
 | |
| +
 | |
| +		if ((rts || cts) && rt->info[cix].rateKbps) {
 | |
| +			int ctsrate = rt->info[cix].rateCode;
 | |
| +			int ctsduration = 0;
 | |
| +
 | |
| +			ctsrate |= rt->info[cix].shortPreamble;
 | |
| +			if (rts)	/* SIFS + CTS */
 | |
| +				ctsduration += rt->info[cix].spAckDuration;
 | |
| +
 | |
| +			ctsduration += ath_hal_computetxtime(sc->sc_ah,
 | |
| +							     rt, length, rix, AH_TRUE);
 | |
| +
 | |
| +			if (cts)	/* SIFS + ACK */
 | |
| +				ctsduration += rt->info[cix].spAckDuration;
 | |
| +
 | |
| +			tt += (short_retries + 1) * ctsduration;
 | |
| +		}
 | |
| +		tt += t->difs;
 | |
| +		tt += (long_retries + 1) * (t->sifs + rt->info[rix].spAckDuration);
 | |
| +		tt += (long_retries + 1) * ath_hal_computetxtime(sc->sc_ah, rt, length,
 | |
| +							rix, AH_TRUE);
 | |
| +		for (x = 0; x <= short_retries + long_retries; x++) {
 | |
| +			cw = MIN(ATH_DEFAULT_CWMAX, (cw + 1) * 2);
 | |
| +			tt += (t->slot * cw / 2);
 | |
| +		}
 | |
| +		return tt;
 | |
|  }
 | |
|  
 | |
| -
 | |
|  struct ath_hw_detect {
 | |
|  	const char *vendor_name;
 | |
|  	const char *card_name;
 | |
| --- a/ath_rate/minstrel/minstrel.c
 | |
| +++ b/ath_rate/minstrel/minstrel.c
 | |
| @@ -170,85 +170,6 @@ rate_to_ndx(struct minstrel_node *sn, in
 | |
|  		return -1;
 | |
|  }
 | |
|  
 | |
| -/* Calculate the transmit duration of a frame. */
 | |
| -static unsigned
 | |
| -calc_usecs_unicast_packet(struct ath_softc *sc, int length,
 | |
| -		int rix, int short_retries, int long_retries)
 | |
| -{
 | |
| -		const HAL_RATE_TABLE *rt = sc->sc_currates;
 | |
| -		struct ieee80211com *ic = &sc->sc_ic;
 | |
| -		unsigned t_slot = 20;
 | |
| -		unsigned t_difs = 50;
 | |
| -		unsigned t_sifs = 10;
 | |
| -		unsigned int x = 0, tt = 0;
 | |
| -		unsigned int cix = rt->info[rix].controlRate;
 | |
| -		int rts = 0, cts = 0;
 | |
| -		int cw = ATH_DEFAULT_CWMIN;
 | |
| -
 | |
| -		KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode));
 | |
| -
 | |
| -		if (!rt->info[rix].rateKbps) {
 | |
| -			printk(KERN_WARNING "rix %d (%d) bad ratekbps %d mode %u\n",
 | |
| -			       rix, rt->info[rix].dot11Rate,
 | |
| -			       rt->info[rix].rateKbps,
 | |
| -			       sc->sc_curmode);
 | |
| -			return 0;
 | |
| -		}
 | |
| -
 | |
| -		ath_get_timings(sc, &t_slot, &t_sifs, &t_difs);
 | |
| -		if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
 | |
| -		(rt->info[rix].phy == IEEE80211_T_OFDM)) {
 | |
| -			if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
 | |
| -				rts = 1;
 | |
| -			else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
 | |
| -				cts = 1;
 | |
| -
 | |
| -			cix = rt->info[sc->sc_protrix].controlRate;
 | |
| -		}
 | |
| -
 | |
| -#if 0
 | |
| -		if (length > ic->ic_rtsthreshold)
 | |
| -			rts = 1;
 | |
| -#endif
 | |
| -
 | |
| -		if (rts || cts) {
 | |
| -			int ctsrate = rt->info[cix].rateCode;
 | |
| -			int ctsduration = 0;
 | |
| -
 | |
| -			if (!rt->info[cix].rateKbps) {
 | |
| -#if 0
 | |
| -				printk(KERN_WARNING "cix %d (%d) bad ratekbps %d mode %u\n",
 | |
| -				       cix, rt->info[cix].dot11Rate,
 | |
| -				       rt->info[cix].rateKbps,
 | |
| -				       sc->sc_curmode);
 | |
| -#endif
 | |
| -				return 0;
 | |
| -			}
 | |
| -
 | |
| -
 | |
| -			ctsrate |= rt->info[cix].shortPreamble;
 | |
| -			if (rts)	/* SIFS + CTS */
 | |
| -				ctsduration += rt->info[cix].spAckDuration;
 | |
| -
 | |
| -			ctsduration += ath_hal_computetxtime(sc->sc_ah,
 | |
| -							     rt, length, rix, AH_TRUE);
 | |
| -
 | |
| -			if (cts)	/* SIFS + ACK */
 | |
| -				ctsduration += rt->info[cix].spAckDuration;
 | |
| -
 | |
| -			tt += (short_retries + 1) * ctsduration;
 | |
| -		}
 | |
| -		tt += t_difs;
 | |
| -		tt += (long_retries + 1) * (t_sifs + rt->info[rix].spAckDuration);
 | |
| -		tt += (long_retries + 1) * ath_hal_computetxtime(sc->sc_ah, rt, length,
 | |
| -							rix, AH_TRUE);
 | |
| -		for (x = 0; x <= short_retries + long_retries; x++) {
 | |
| -			cw = MIN(ATH_DEFAULT_CWMAX, (cw + 1) * 2);
 | |
| -			tt += (t_slot * cw / 2);
 | |
| -		}
 | |
| -		return tt;
 | |
| -}
 | |
| -
 | |
|  static void
 | |
|  ath_rate_node_init(struct ath_softc *sc, struct ath_node *an)
 | |
|  {
 | |
| --- a/ath_rate/sample/sample.c
 | |
| +++ b/ath_rate/sample/sample.c
 | |
| @@ -137,92 +137,6 @@ rate_to_ndx(struct sample_node *sn, int
 | |
|  	return -1;
 | |
|  }
 | |
|  
 | |
| -/*
 | |
| - * Calculate the transmit duration of a frame.
 | |
| - */
 | |
| -static unsigned
 | |
| -calc_usecs_unicast_packet(struct ath_softc *sc, int length,
 | |
| -	int rix, int short_retries, int long_retries)
 | |
| -{
 | |
| -	const HAL_RATE_TABLE *rt = sc->sc_currates;
 | |
| -	int rts, cts;
 | |
| -
 | |
| -	unsigned t_slot;
 | |
| -	unsigned t_difs;
 | |
| -	unsigned t_sifs;
 | |
| -	struct ieee80211com *ic = &sc->sc_ic;
 | |
| -	unsigned int tt = 0;
 | |
| -	unsigned int x;
 | |
| -	unsigned int cw = ATH_DEFAULT_CWMIN;
 | |
| -	unsigned int cix = rt->info[rix].controlRate;
 | |
| -	KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode));
 | |
| -
 | |
| -	if (!rt->info[rix].rateKbps) {
 | |
| -		printk(KERN_WARNING "rix %u (%u) bad ratekbps %u mode %u\n",
 | |
| -		       rix, rt->info[rix].dot11Rate,
 | |
| -		       rt->info[rix].rateKbps,
 | |
| -		       sc->sc_curmode);
 | |
| -
 | |
| -		return 0;
 | |
| -	}
 | |
| -
 | |
| -	cix = rt->info[rix].controlRate;
 | |
| -	/* 
 | |
| -	 * XXX getting mac/phy level timings should be fixed for turbo
 | |
| -	 * rates, and there is probably a way to get this from the
 | |
| -	 * hal...
 | |
| -	 */
 | |
| -	ath_get_timings(sc, &t_slot, &t_sifs, &t_difs);
 | |
| -	rts = cts = 0;
 | |
| -
 | |
| -	if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
 | |
| -	    rt->info[rix].phy == IEEE80211_T_OFDM) {
 | |
| -		if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
 | |
| -			rts = 1;
 | |
| -		else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
 | |
| -			cts = 1;
 | |
| -
 | |
| -		cix = rt->info[sc->sc_protrix].controlRate;
 | |
| -	}
 | |
| -
 | |
| -	if (0 /*length > ic->ic_rtsthreshold */)
 | |
| -		rts = 1;
 | |
| -
 | |
| -	if (rts || cts) {
 | |
| -		int ctsrate;
 | |
| -		int ctsduration = 0;
 | |
| -
 | |
| -		if (!rt->info[cix].rateKbps) {
 | |
| -			printk(KERN_WARNING "cix %u (%u) bad ratekbps %u mode %u\n",
 | |
| -			       cix, rt->info[cix].dot11Rate,
 | |
| -			       rt->info[cix].rateKbps,
 | |
| -			       sc->sc_curmode);
 | |
| -			return 0;
 | |
| -		}
 | |
| -
 | |
| -
 | |
| -		ctsrate = rt->info[cix].rateCode | rt->info[cix].shortPreamble;
 | |
| -		if (rts)		/* SIFS + CTS */
 | |
| -			ctsduration += rt->info[cix].spAckDuration;
 | |
| -
 | |
| -		ctsduration += ath_hal_computetxtime(sc->sc_ah,
 | |
| -						     rt, length, rix, AH_TRUE);
 | |
| -
 | |
| -		if (cts)	/* SIFS + ACK */
 | |
| -			ctsduration += rt->info[cix].spAckDuration;
 | |
| -
 | |
| -		tt += (short_retries + 1) * ctsduration;
 | |
| -	}
 | |
| -	tt += t_difs;
 | |
| -	tt += (long_retries+1)*(t_sifs + rt->info[rix].spAckDuration);
 | |
| -	tt += (long_retries+1)*ath_hal_computetxtime(sc->sc_ah, rt, length,
 | |
| -						rix, AH_TRUE);
 | |
| -	for (x = 0; x <= short_retries + long_retries; x++) {
 | |
| -		cw = MIN(ATH_DEFAULT_CWMAX, (cw + 1) * 2);
 | |
| -		tt += (t_slot * cw / 2);
 | |
| -	}
 | |
| -	return tt;
 | |
| -}
 | |
|  
 | |
|  static void
 | |
|  ath_rate_node_init(struct ath_softc *sc, struct ath_node *an)
 | |
| --- a/net80211/ieee80211_wireless.c
 | |
| +++ b/net80211/ieee80211_wireless.c
 | |
| @@ -2745,6 +2745,7 @@ ieee80211_ioctl_setparam(struct net_devi
 | |
|  	case IEEE80211_PARAM_COVERAGE_CLASS:
 | |
|  		if (value <= IEEE80211_COVERAGE_CLASS_MAX) {
 | |
|  			ic->ic_coverageclass = value;
 | |
| +			ic->ic_set_coverageclass(ic);
 | |
|  			if (IS_UP_AUTO(vap))
 | |
|  				ieee80211_new_state(vap, IEEE80211_S_SCAN, 0);
 | |
|  			retv = 0;
 | |
| --- a/net80211/ieee80211_var.h
 | |
| +++ b/net80211/ieee80211_var.h
 | |
| @@ -94,7 +94,7 @@
 | |
|  
 | |
|  #define IEEE80211_BGSCAN_TRIGGER_INTVL 20 /* min trigger interval for thresh based bgscan (secs) */
 | |
|  
 | |
| -#define IEEE80211_COVERAGE_CLASS_MAX	31	/* max coverage class */
 | |
| +#define IEEE80211_COVERAGE_CLASS_MAX	255	/* max coverage class */
 | |
|  #define IEEE80211_REGCLASSIDS_MAX	10	/* max regclass id list */
 | |
|  
 | |
|  #define	IEEE80211_PS_SLEEP	0x1		/* STA is in power saving mode */
 | |
| --- a/tools/Makefile
 | |
| +++ b/tools/Makefile
 | |
| @@ -50,7 +50,7 @@ all: compile
 | |
|  
 | |
|  DEBUG = -DAR_DEBUG
 | |
|  
 | |
| -ALLPROGS=	athstats 80211stats athkey athchans athctrl \
 | |
| +ALLPROGS=	athstats 80211stats athkey athchans \
 | |
|  	$(if $(DEBUG),athdebug 80211debug) wlanconfig ath_info
 | |
|  
 | |
|  OBJS=	$(patsubst %,%.o,$(ALLPROGS))
 | |
| --- a/tools/athctrl.c
 | |
| +++ /dev/null
 | |
| @@ -1,133 +0,0 @@
 | |
| -/*-
 | |
| - * Copyright (c) 2002-2004 Gunter Burchardt, Local-Web AG
 | |
| - * All rights reserved.
 | |
| - *
 | |
| - * Redistribution and use in source and binary forms, with or without
 | |
| - * modification, are permitted provided that the following conditions
 | |
| - * are met:
 | |
| - * 1. Redistributions of source code must retain the above copyright
 | |
| - *    notice, this list of conditions and the following disclaimer,
 | |
| - *    without modification.
 | |
| - * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 | |
| - *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
 | |
| - *    redistribution must be conditioned upon including a substantially
 | |
| - *    similar Disclaimer requirement for further binary redistribution.
 | |
| - * 3. Neither the names of the above-listed copyright holders nor the names
 | |
| - *    of any contributors may be used to endorse or promote products derived
 | |
| - *    from this software without specific prior written permission.
 | |
| - *
 | |
| - * Alternatively, this software may be distributed under the terms of the
 | |
| - * GNU General Public License ("GPL") version 2 as published by the Free
 | |
| - * Software Foundation.
 | |
| - *
 | |
| - * NO WARRANTY
 | |
| - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | |
| - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | |
| - * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
 | |
| - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 | |
| - * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
 | |
| - * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | |
| - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | |
| - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 | |
| - * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | |
| - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 | |
| - * THE POSSIBILITY OF SUCH DAMAGES.
 | |
| - *
 | |
| - * $Id: athctrl.c 2394 2007-05-30 01:41:18Z mtaylor $
 | |
| - */
 | |
| -
 | |
| -/*
 | |
| - * Simple Atheros-specific tool to inspect and set atheros specific values
 | |
| - * athctrl [-i interface] [-d distance]
 | |
| - * (default interface is wifi0).  
 | |
| - */
 | |
| -#include <sys/types.h>
 | |
| -#include <sys/file.h>
 | |
| -
 | |
| -#include <getopt.h>
 | |
| -
 | |
| -#include <stdio.h>
 | |
| -#include <string.h>
 | |
| -#include <stdlib.h>
 | |
| -#include <err.h>
 | |
| -
 | |
| -#include <net/if.h>
 | |
| -#include "do_multi.h"
 | |
| -
 | |
| -static int
 | |
| -setsysctrl(const char *dev, const char *control , u_long value)
 | |
| -{
 | |
| -	char buffer[256];
 | |
| -	FILE * fd;
 | |
| -
 | |
| -	snprintf(buffer, sizeof(buffer), "/proc/sys/dev/%s/%s", dev, control);
 | |
| -	fd = fopen(buffer, "w");
 | |
| -	if (fd != NULL) {
 | |
| -		fprintf(fd, "%li", value);
 | |
| -		fclose(fd);
 | |
| -	} else
 | |
| -		fprintf(stderr, "Could not open %s for writing!\n", buffer);
 | |
| -
 | |
| -	return 0;
 | |
| -}
 | |
| -
 | |
| -static void usage(void)
 | |
| -{
 | |
| -	fprintf(stderr,
 | |
| -	    "Atheros driver control\n"
 | |
| -	    "Copyright (c) 2002-2004 Gunter Burchardt, Local-Web AG\n"
 | |
| -	    "\n"
 | |
| -	    "usage: athctrl [-i interface] [-d distance]\n"
 | |
| -	    "\n"
 | |
| -	    "options:\n"
 | |
| -	    "   -h   show this usage\n"
 | |
| -	"   -i   interface (default interface is wifi0)\n"
 | |
| -	    "   -d   specify the maximum distance of a sta or the distance\n"
 | |
| -	"        of the master\n");
 | |
| -
 | |
| -	exit(1);
 | |
| -}
 | |
| -
 | |
| -int
 | |
| -CMD(athctrl)(int argc, char *argv[])
 | |
| -{
 | |
| -	char device[IFNAMSIZ + 1];
 | |
| -	int distance = -1;
 | |
| -	int c;
 | |
| -
 | |
| -	strncpy(device, "wifi0", sizeof (device));
 | |
| -
 | |
| -	for (;;) {
 | |
| -	    	c = getopt(argc, argv, "d:i:h");
 | |
| -	    	if (c < 0)
 | |
| -			break;
 | |
| -	    	switch (c) {
 | |
| -	    	case 'h':
 | |
| -			usage();
 | |
| -			break;
 | |
| -	    	case 'd':
 | |
| -			distance = atoi(optarg);
 | |
| -			break;
 | |
| -	    	case 'i':
 | |
| -			strncpy(device, optarg, sizeof (device));
 | |
| -			break;
 | |
| -	    	default:
 | |
| -			usage();
 | |
| -			break;
 | |
| -	    	}
 | |
| -	}
 | |
| -
 | |
| -	if (distance >= 0) {
 | |
| -		int slottime = (distance / 300) + ((distance % 300) ? 1 : 0);
 | |
| -		int acktimeout = slottime * 2 + 3;
 | |
| -		int ctstimeout = slottime * 2 + 3;
 | |
| -
 | |
| -		printf("Setting distance on interface %s to %i meters\n",
 | |
| -			device, distance);
 | |
| -		setsysctrl(device, "slottime", slottime);
 | |
| -		setsysctrl(device, "acktimeout", acktimeout);
 | |
| -		setsysctrl(device, "ctstimeout", ctstimeout);
 | |
| -	} else
 | |
| -		usage();
 | |
| -	return 0;
 | |
| -}
 | |
| --- a/tools/do_multi.c
 | |
| +++ b/tools/do_multi.c
 | |
| @@ -18,8 +18,6 @@ main(int argc, char *argv[])
 | |
|  	ret = a80211stats_init(argc, argv);
 | |
|      if(strcmp(progname, "athchans") == 0)
 | |
|  	ret = athchans_init(argc, argv);
 | |
| -    if(strcmp(progname, "athctrl") == 0)
 | |
| -	ret =  athctrl_init(argc, argv);
 | |
|  #ifdef AR_DEBUG
 | |
|      if(strcmp(progname, "athdebug") == 0)
 | |
|  	ret =  athdebug_init(argc, argv);
 | |
| --- a/tools/do_multi.h
 | |
| +++ b/tools/do_multi.h
 | |
| @@ -2,7 +2,6 @@
 | |
|  int a80211debug_init(int argc, char *argv[]);
 | |
|  int a80211stats_init(int argc, char *argv[]);
 | |
|  int athchans_init(int argc, char *argv[]);
 | |
| -int athctrl_init(int argc, char *argv[]);
 | |
|  int athdebug_init(int argc, char *argv[]);
 | |
|  int athkey_init(int argc, char *argv[]);
 | |
|  int athstats_init(int argc, char *argv[]);
 | |
| --- a/ath_rate/minstrel/minstrel.h
 | |
| +++ b/ath_rate/minstrel/minstrel.h
 | |
| @@ -172,14 +172,6 @@ struct minstrel_node {
 | |
|  
 | |
|  #define	ATH_NODE_MINSTREL(an)	((struct minstrel_node *)&an[1])
 | |
|  
 | |
| -
 | |
| -#ifndef MIN
 | |
| -#define MIN(a,b)        ((a) < (b) ? (a) : (b))
 | |
| -#endif
 | |
| -#ifndef MAX
 | |
| -#define MAX(a,b)        ((a) > (b) ? (a) : (b))
 | |
| -#endif
 | |
| -
 | |
|  /*
 | |
|   * Definitions for pulling the rate and trie counts from
 | |
|   * a 5212 h/w descriptor. These Don't belong here; the
 | |
| --- a/ath_rate/sample/sample.h
 | |
| +++ b/ath_rate/sample/sample.h
 | |
| @@ -98,14 +98,6 @@ struct sample_node {
 | |
|  };
 | |
|  #define	ATH_NODE_SAMPLE(an)	((struct sample_node *)&an[1])
 | |
|  
 | |
| -
 | |
| -#ifndef MIN
 | |
| -#define MIN(a,b)        ((a) < (b) ? (a) : (b))
 | |
| -#endif
 | |
| -#ifndef MAX
 | |
| -#define MAX(a,b)        ((a) > (b) ? (a) : (b))
 | |
| -#endif
 | |
| -
 | |
|  /*
 | |
|   * Definitions for pulling the rate and trie counts from
 | |
|   * a 5212 h/w descriptor. These Don't belong here; the
 |