2009-05-08 22:25:31 +03:00
|
|
|
--- 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:
|
2009-05-31 05:25:32 +03:00
|
|
|
@@ -2673,6 +2675,7 @@ ath_init(struct net_device *dev)
|
2009-05-08 22:25:31 +03:00
|
|
|
*/
|
|
|
|
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
|
2009-05-31 05:25:32 +03:00
|
|
|
@@ -4484,17 +4487,52 @@ ath_mode_init(struct net_device *dev)
|
2009-05-08 22:25:31 +03:00
|
|
|
* 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;
|
|
|
|
}
|
|
|
|
|
2009-05-31 05:25:32 +03:00
|
|
|
@@ -4516,7 +4554,7 @@ ath_updateslot(struct net_device *dev)
|
2009-05-08 22:25:31 +03:00
|
|
|
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
|
2009-05-31 05:25:32 +03:00
|
|
|
@@ -5360,7 +5398,7 @@ ath_beacon_send(struct ath_softc *sc, in
|
2009-05-08 22:25:31 +03:00
|
|
|
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) {
|
|
|
|
/*
|
2009-09-09 03:17:13 +03:00
|
|
|
@@ -9433,7 +9471,8 @@ ath_set_coverageclass(struct ieee80211co
|
2009-05-08 22:25:31 +03:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
2009-09-09 03:17:13 +03:00
|
|
|
@@ -10956,6 +10995,7 @@ enum {
|
2009-05-08 22:25:31 +03:00
|
|
|
ATH_OFDM_WEAK_DET = 29,
|
|
|
|
ATH_CHANBW = 30,
|
|
|
|
ATH_OUTDOOR = 31,
|
|
|
|
+ ATH_DISTANCE = 32,
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
2009-09-09 03:17:13 +03:00
|
|
|
@@ -11168,21 +11208,31 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
|
2009-05-08 22:25:31 +03:00
|
|
|
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) {
|
2009-09-09 03:17:13 +03:00
|
|
|
@@ -11338,6 +11388,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
|
2009-05-08 22:25:31 +03:00
|
|
|
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;
|
2009-09-09 03:17:13 +03:00
|
|
|
@@ -11459,6 +11512,12 @@ static const ctl_table ath_sysctl_templa
|
2009-05-08 22:25:31 +03:00
|
|
|
.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)
|
|
|
|
{
|
2010-11-12 17:14:27 +02:00
|
|
|
@@ -839,6 +850,17 @@ static inline HAL_BOOL ath_hal_setslotti
|
|
|
|
ath_hal_set_function(NULL);
|
|
|
|
ATH_HAL_UNLOCK_IRQ(ah->ah_sc);
|
2009-05-08 22:25:31 +03:00
|
|
|
return ret;
|
2010-11-12 17:14:27 +02:00
|
|
|
+}
|
|
|
|
+
|
2009-05-08 22:25:31 +03:00
|
|
|
+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;
|
2010-11-12 17:14:27 +02:00
|
|
|
}
|
|
|
|
|
2009-05-08 22:25:31 +03:00
|
|
|
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;
|
2009-05-31 05:25:32 +03:00
|
|
|
@@ -839,6 +848,8 @@ struct ath_softc {
|
2009-05-08 22:25:31 +03:00
|
|
|
* 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 *);
|
2009-05-31 05:25:32 +03:00
|
|
|
@@ -946,49 +957,76 @@ int ar_device(int devid);
|
2009-05-08 22:25:31 +03:00
|
|
|
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
|
2010-11-12 17:14:27 +02:00
|
|
|
@@ -137,92 +137,6 @@ rate_to_ndx(struct sample_node *sn, int
|
2009-05-08 22:25:31 +03:00
|
|
|
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
|
2009-09-23 16:32:22 +03:00
|
|
|
@@ -2745,6 +2745,7 @@ ieee80211_ioctl_setparam(struct net_devi
|
2009-05-08 22:25:31 +03:00
|
|
|
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 \
|
2009-10-21 03:20:42 +03:00
|
|
|
$(if $(DEBUG),athdebug 80211debug) wlanconfig ath_info
|
2009-05-08 22:25:31 +03:00
|
|
|
|
|
|
|
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[]);
|
2009-05-10 23:13:13 +03:00
|
|
|
--- 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
|