madwifi: improve antenna diversity handling

SVN-Revision: 15658
This commit is contained in:
Felix Fietkau 2009-05-07 10:10:06 +00:00
parent 35bfac4623
commit f6d28016fe
2 changed files with 87 additions and 31 deletions

View File

@ -1,6 +1,32 @@
--- a/ath/if_ath.c --- a/ath/if_ath.c
+++ b/ath/if_ath.c +++ b/ath/if_ath.c
@@ -5344,27 +5344,6 @@ ath_beacon_send(struct ath_softc *sc, in @@ -797,7 +797,6 @@ ath_attach(u_int16_t devid, struct net_d
break;
}
- sc->sc_setdefantenna = ath_setdefantenna;
sc->sc_rc = ieee80211_rate_attach(sc, ratectl);
if (sc->sc_rc == NULL) {
error = EIO;
@@ -2623,9 +2622,6 @@ ath_init(struct net_device *dev)
ath_radar_update(sc);
ath_rp_flush(sc);
- /* Set the default RX antenna; it may get lost on reset. */
- ath_setdefantenna(sc, sc->sc_defant);
-
/*
* Setup the hardware after reset: the key cache
* is filled as needed and the receive engine is
@@ -3010,7 +3006,6 @@ ath_reset(struct net_device *dev)
ath_setintmit(sc);
ath_update_txpow(sc); /* update tx power state */
ath_radar_update(sc);
- ath_setdefantenna(sc, sc->sc_defant);
if (ath_startrecv(sc) != 0) /* restart recv */
EPRINTF(sc, "Unable to start receive logic.\n");
if (sc->sc_softled)
@@ -5344,27 +5339,6 @@ ath_beacon_send(struct ath_softc *sc, in
} else if ((sc->sc_updateslot == COMMIT) && (sc->sc_slotupdate == slot)) } else if ((sc->sc_updateslot == COMMIT) && (sc->sc_slotupdate == slot))
ath_setslottime(sc); /* commit change to hardware */ ath_setslottime(sc); /* commit change to hardware */
@ -28,3 +54,33 @@
if (bfaddr != 0) { if (bfaddr != 0) {
/* /*
* Stop any current DMA and put the new frame(s) on the queue. * Stop any current DMA and put the new frame(s) on the queue.
@@ -6725,9 +6699,8 @@ ath_setdefantenna(struct ath_softc *sc,
{
struct ath_hal *ah = sc->sc_ah;
- /* XXX block beacon interrupts */
- ath_hal_setdiversity(ah, (sc->sc_diversity != 0));
ath_hal_setdefantenna(ah, antenna);
+ ath_hal_setantennaswitch(ah, sc->sc_diversity ? 0 : sc->sc_defant);
if (sc->sc_defant != antenna)
sc->sc_stats.ast_ant_defswitch++;
sc->sc_defant = antenna;
@@ -11138,7 +11111,7 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
break;
}
sc->sc_diversity = val;
- ath_hal_setdiversity(ah, val);
+ ath_setdefantenna(sc, sc->sc_defant);
break;
case ATH_TXINTRPERIOD:
/* XXX: validate? */
--- a/ath/if_athvar.h
+++ b/ath/if_athvar.h
@@ -640,7 +640,6 @@ struct ath_softc {
spinlock_t sc_hal_lock; /* hardware access lock */
struct ath_ratectrl *sc_rc; /* tx rate control support */
struct ath_tx99 *sc_tx99; /* tx99 support */
- void (*sc_setdefantenna)(struct ath_softc *, u_int);
const struct ath_hw_detect *sc_hwinfo;
unsigned int sc_invalid:1; /* being detached */

View File

@ -173,7 +173,7 @@
/* NB: setup here so ath_rate_update is happy */ /* NB: setup here so ath_rate_update is happy */
ath_setcurmode(sc, IEEE80211_MODE_11A); ath_setcurmode(sc, IEEE80211_MODE_11A);
@@ -909,10 +929,6 @@ ath_attach(u_int16_t devid, struct net_d @@ -908,10 +928,6 @@ ath_attach(u_int16_t devid, struct net_d
IEEE80211_ATHC_COMP : 0); IEEE80211_ATHC_COMP : 0);
#endif #endif
@ -184,7 +184,7 @@
#ifdef ATH_SUPERG_XR #ifdef ATH_SUPERG_XR
ic->ic_ath_cap |= (ath_hal_xrsupported(ah) ? IEEE80211_ATHC_XR : 0); ic->ic_ath_cap |= (ath_hal_xrsupported(ah) ? IEEE80211_ATHC_XR : 0);
#endif #endif
@@ -4466,17 +4482,17 @@ ath_mode_init(struct net_device *dev) @@ -4461,17 +4477,17 @@ ath_mode_init(struct net_device *dev)
* Set the slot time based on the current setting. * Set the slot time based on the current setting.
*/ */
static void static void
@ -210,7 +210,7 @@
sc->sc_updateslot = OK; sc->sc_updateslot = OK;
} }
@@ -4498,7 +4514,7 @@ ath_updateslot(struct net_device *dev) @@ -4493,7 +4509,7 @@ ath_updateslot(struct net_device *dev)
if (ic->ic_opmode == IEEE80211_M_HOSTAP) if (ic->ic_opmode == IEEE80211_M_HOSTAP)
sc->sc_updateslot = UPDATE; sc->sc_updateslot = UPDATE;
else if (dev->flags & IFF_RUNNING) else if (dev->flags & IFF_RUNNING)
@ -219,7 +219,7 @@
} }
#ifdef ATH_SUPERG_DYNTURBO #ifdef ATH_SUPERG_DYNTURBO
@@ -5342,7 +5358,7 @@ ath_beacon_send(struct ath_softc *sc, in @@ -5337,7 +5353,7 @@ ath_beacon_send(struct ath_softc *sc, in
sc->sc_updateslot = COMMIT; /* commit next beacon */ sc->sc_updateslot = COMMIT; /* commit next beacon */
sc->sc_slotupdate = slot; sc->sc_slotupdate = slot;
} else if ((sc->sc_updateslot == COMMIT) && (sc->sc_slotupdate == slot)) } else if ((sc->sc_updateslot == COMMIT) && (sc->sc_slotupdate == slot))
@ -228,7 +228,7 @@
if (bfaddr != 0) { if (bfaddr != 0) {
/* /*
@@ -7796,12 +7812,14 @@ ath_get_ivlen(struct ieee80211_key *k) @@ -7790,12 +7806,14 @@ ath_get_ivlen(struct ieee80211_key *k)
* Get transmit rate index using rate in Kbps * Get transmit rate index using rate in Kbps
*/ */
static __inline int static __inline int
@ -245,7 +245,7 @@
ndx = i; ndx = i;
break; break;
} }
@@ -8094,7 +8112,7 @@ ath_tx_start(struct net_device *dev, str @@ -8088,7 +8106,7 @@ ath_tx_start(struct net_device *dev, str
atype = HAL_PKT_TYPE_NORMAL; /* default */ atype = HAL_PKT_TYPE_NORMAL; /* default */
if (ismcast) { if (ismcast) {
@ -254,7 +254,7 @@
txrate = rt->info[rix].rateCode; txrate = rt->info[rix].rateCode;
if (shortPreamble) if (shortPreamble)
txrate |= rt->info[rix].shortPreamble; txrate |= rt->info[rix].shortPreamble;
@@ -9061,7 +9079,7 @@ ath_chan_change(struct ath_softc *sc, st @@ -9055,7 +9073,7 @@ ath_chan_change(struct ath_softc *sc, st
struct net_device *dev = sc->sc_dev; struct net_device *dev = sc->sc_dev;
enum ieee80211_phymode mode; enum ieee80211_phymode mode;
@ -263,7 +263,7 @@
ath_rate_setup(dev, mode); ath_rate_setup(dev, mode);
ath_setcurmode(sc, mode); ath_setcurmode(sc, mode);
@@ -10110,8 +10128,7 @@ ath_newassoc(struct ieee80211_node *ni, @@ -10104,8 +10122,7 @@ ath_newassoc(struct ieee80211_node *ni,
} }
static int static int
@ -273,7 +273,7 @@
{ {
struct ath_softc *sc = dev->priv; struct ath_softc *sc = dev->priv;
struct ieee80211com *ic = &sc->sc_ic; struct ieee80211com *ic = &sc->sc_ic;
@@ -10125,17 +10142,31 @@ ath_getchannels(struct net_device *dev, @@ -10119,17 +10136,31 @@ ath_getchannels(struct net_device *dev,
EPRINTF(sc, "Insufficient memory for channel table!\n"); EPRINTF(sc, "Insufficient memory for channel table!\n");
return -ENOMEM; return -ENOMEM;
} }
@ -307,7 +307,7 @@
/* /*
* Convert HAL channels to ieee80211 ones. * Convert HAL channels to ieee80211 ones.
*/ */
@@ -10379,7 +10410,7 @@ ath_xr_rate_setup(struct net_device *dev @@ -10373,7 +10404,7 @@ ath_xr_rate_setup(struct net_device *dev
struct ieee80211com *ic = &sc->sc_ic; struct ieee80211com *ic = &sc->sc_ic;
const HAL_RATE_TABLE *rt; const HAL_RATE_TABLE *rt;
struct ieee80211_rateset *rs; struct ieee80211_rateset *rs;
@ -316,7 +316,7 @@
sc->sc_xr_rates = ath_hal_getratetable(ah, HAL_MODE_XR); sc->sc_xr_rates = ath_hal_getratetable(ah, HAL_MODE_XR);
rt = sc->sc_xr_rates; rt = sc->sc_xr_rates;
if (rt == NULL) if (rt == NULL)
@@ -10392,57 +10423,16 @@ ath_xr_rate_setup(struct net_device *dev @@ -10386,57 +10417,16 @@ ath_xr_rate_setup(struct net_device *dev
} else } else
maxrates = rt->rateCount; maxrates = rt->rateCount;
rs = &ic->ic_sup_xr_rates; rs = &ic->ic_sup_xr_rates;
@ -380,7 +380,7 @@
static int static int
ath_rate_setup(struct net_device *dev, u_int mode) ath_rate_setup(struct net_device *dev, u_int mode)
{ {
@@ -10451,7 +10441,7 @@ ath_rate_setup(struct net_device *dev, u @@ -10445,7 +10435,7 @@ ath_rate_setup(struct net_device *dev, u
struct ieee80211com *ic = &sc->sc_ic; struct ieee80211com *ic = &sc->sc_ic;
const HAL_RATE_TABLE *rt; const HAL_RATE_TABLE *rt;
struct ieee80211_rateset *rs; struct ieee80211_rateset *rs;
@ -389,7 +389,7 @@
switch (mode) { switch (mode) {
case IEEE80211_MODE_11A: case IEEE80211_MODE_11A:
@@ -10469,6 +10459,12 @@ ath_rate_setup(struct net_device *dev, u @@ -10463,6 +10453,12 @@ ath_rate_setup(struct net_device *dev, u
case IEEE80211_MODE_TURBO_G: case IEEE80211_MODE_TURBO_G:
sc->sc_rates[mode] = ath_hal_getratetable(ah, HAL_MODE_108G); sc->sc_rates[mode] = ath_hal_getratetable(ah, HAL_MODE_108G);
break; break;
@ -402,7 +402,7 @@
default: default:
DPRINTF(sc, ATH_DEBUG_ANY, "Invalid mode %u\n", mode); DPRINTF(sc, ATH_DEBUG_ANY, "Invalid mode %u\n", mode);
return 0; return 0;
@@ -10483,10 +10479,16 @@ ath_rate_setup(struct net_device *dev, u @@ -10477,10 +10473,16 @@ ath_rate_setup(struct net_device *dev, u
maxrates = IEEE80211_RATE_MAXSIZE; maxrates = IEEE80211_RATE_MAXSIZE;
} else } else
maxrates = rt->rateCount; maxrates = rt->rateCount;
@ -419,7 +419,7 @@
return 1; return 1;
} }
@@ -10515,13 +10517,18 @@ ath_setcurmode(struct ath_softc *sc, enu @@ -10509,13 +10511,18 @@ ath_setcurmode(struct ath_softc *sc, enu
{ 0, 500, 130 }, { 0, 500, 130 },
}; };
const HAL_RATE_TABLE *rt; const HAL_RATE_TABLE *rt;
@ -440,7 +440,7 @@
memset(sc->sc_hwmap, 0, sizeof(sc->sc_hwmap)); memset(sc->sc_hwmap, 0, sizeof(sc->sc_hwmap));
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
u_int8_t ix = rt->rateCodeToIndex[i]; u_int8_t ix = rt->rateCodeToIndex[i];
@@ -10531,7 +10538,7 @@ ath_setcurmode(struct ath_softc *sc, enu @@ -10525,7 +10532,7 @@ ath_setcurmode(struct ath_softc *sc, enu
continue; continue;
} }
sc->sc_hwmap[i].ieeerate = sc->sc_hwmap[i].ieeerate =
@ -449,7 +449,7 @@
if (rt->info[ix].shortPreamble || if (rt->info[ix].shortPreamble ||
rt->info[ix].phy == IEEE80211_T_OFDM) rt->info[ix].phy == IEEE80211_T_OFDM)
sc->sc_hwmap[i].flags |= IEEE80211_RADIOTAP_F_SHORTPRE; sc->sc_hwmap[i].flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
@@ -10932,9 +10939,106 @@ enum { @@ -10926,9 +10933,106 @@ enum {
ATH_MAXVAPS = 26, ATH_MAXVAPS = 26,
ATH_INTMIT = 27, ATH_INTMIT = 27,
ATH_NOISE_IMMUNITY = 28, ATH_NOISE_IMMUNITY = 28,
@ -557,7 +557,7 @@
static int static int
ath_sysctl_set_intmit(struct ath_softc *sc, long ctl, u_int val) ath_sysctl_set_intmit(struct ath_softc *sc, long ctl, u_int val)
{ {
@@ -11013,6 +11117,7 @@ static int @@ -11007,6 +11111,7 @@ static int
ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl, write, filp, buffer, lenp, ppos) ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl, write, filp, buffer, lenp, ppos)
{ {
struct ath_softc *sc = ctl->extra1; struct ath_softc *sc = ctl->extra1;
@ -565,7 +565,7 @@
struct ath_hal *ah = sc->sc_ah; struct ath_hal *ah = sc->sc_ah;
u_int val; u_int val;
u_int tab_3_val[3]; u_int tab_3_val[3];
@@ -11036,25 +11141,33 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl @@ -11030,25 +11135,33 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
lenp, ppos); lenp, ppos);
if (ret == 0) { if (ret == 0) {
switch ((long)ctl->extra2) { switch ((long)ctl->extra2) {
@ -612,7 +612,7 @@
break; break;
case ATH_SOFTLED: case ATH_SOFTLED:
if (val != sc->sc_softled) { if (val != sc->sc_softled) {
@@ -11207,6 +11320,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl @@ -11201,6 +11314,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
} }
} else { } else {
switch ((long)ctl->extra2) { switch ((long)ctl->extra2) {
@ -622,7 +622,7 @@
case ATH_SLOTTIME: case ATH_SLOTTIME:
val = ath_hal_getslottime(ah); val = ath_hal_getslottime(ah);
break; break;
@@ -11225,6 +11341,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl @@ -11219,6 +11335,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
case ATH_COUNTRYCODE: case ATH_COUNTRYCODE:
ath_hal_getcountrycode(ah, &val); ath_hal_getcountrycode(ah, &val);
break; break;
@ -632,7 +632,7 @@
case ATH_MAXVAPS: case ATH_MAXVAPS:
val = ath_maxvaps; val = ath_maxvaps;
break; break;
@@ -11338,11 +11457,17 @@ static const ctl_table ath_sysctl_templa @@ -11332,11 +11451,17 @@ static const ctl_table ath_sysctl_templa
}, },
{ .ctl_name = CTL_AUTO, { .ctl_name = CTL_AUTO,
.procname = "countrycode", .procname = "countrycode",
@ -651,7 +651,7 @@
.procname = "maxvaps", .procname = "maxvaps",
.mode = 0444, .mode = 0444,
.proc_handler = ath_sysctl_halparam, .proc_handler = ath_sysctl_halparam,
@@ -11350,7 +11475,7 @@ static const ctl_table ath_sysctl_templa @@ -11344,7 +11469,7 @@ static const ctl_table ath_sysctl_templa
}, },
{ .ctl_name = CTL_AUTO, { .ctl_name = CTL_AUTO,
.procname = "regdomain", .procname = "regdomain",
@ -660,7 +660,7 @@
.proc_handler = ath_sysctl_halparam, .proc_handler = ath_sysctl_halparam,
.extra2 = (void *)ATH_REGDOMAIN, .extra2 = (void *)ATH_REGDOMAIN,
}, },
@@ -11413,6 +11538,12 @@ static const ctl_table ath_sysctl_templa @@ -11407,6 +11532,12 @@ static const ctl_table ath_sysctl_templa
.extra2 = (void *)ATH_ACKRATE, .extra2 = (void *)ATH_ACKRATE,
}, },
{ .ctl_name = CTL_AUTO, { .ctl_name = CTL_AUTO,
@ -673,7 +673,7 @@
.procname = "rp", .procname = "rp",
.mode = 0200, .mode = 0200,
.proc_handler = ath_sysctl_halparam, .proc_handler = ath_sysctl_halparam,
@@ -11653,13 +11784,6 @@ static ctl_table ath_static_sysctls[] = @@ -11647,13 +11778,6 @@ static ctl_table ath_static_sysctls[] =
}, },
#endif #endif
{ .ctl_name = CTL_AUTO, { .ctl_name = CTL_AUTO,
@ -687,7 +687,7 @@
.procname = "maxvaps", .procname = "maxvaps",
.mode = 0444, .mode = 0444,
.data = &ath_maxvaps, .data = &ath_maxvaps,
@@ -11667,13 +11791,6 @@ static ctl_table ath_static_sysctls[] = @@ -11661,13 +11785,6 @@ static ctl_table ath_static_sysctls[] =
.proc_handler = proc_dointvec .proc_handler = proc_dointvec
}, },
{ .ctl_name = CTL_AUTO, { .ctl_name = CTL_AUTO,
@ -703,7 +703,7 @@
.data = &ath_xchanmode, .data = &ath_xchanmode,
--- a/ath/if_athvar.h --- a/ath/if_athvar.h
+++ b/ath/if_athvar.h +++ b/ath/if_athvar.h
@@ -689,16 +689,17 @@ struct ath_softc { @@ -688,16 +688,17 @@ struct ath_softc {
int8_t sc_ofdm_weak_det; /* OFDM weak frames detection, -1 == auto */ int8_t sc_ofdm_weak_det; /* OFDM weak frames detection, -1 == auto */
/* rate tables */ /* rate tables */
@ -724,7 +724,7 @@
u_int8_t sc_curbssid[IEEE80211_ADDR_LEN]; u_int8_t sc_curbssid[IEEE80211_ADDR_LEN];
u_int8_t sc_rixmap[256]; /* IEEE to h/w rate table ix */ u_int8_t sc_rixmap[256]; /* IEEE to h/w rate table ix */
struct { struct {
@@ -809,6 +810,8 @@ struct ath_softc { @@ -808,6 +809,8 @@ struct ath_softc {
u_int32_t sc_dturbo_bw_turbo; /* bandwidth threshold */ u_int32_t sc_dturbo_bw_turbo; /* bandwidth threshold */
#endif #endif
u_int sc_slottimeconf; /* manual override for slottime */ u_int sc_slottimeconf; /* manual override for slottime */
@ -733,7 +733,7 @@
struct timer_list sc_dfs_excl_timer; /* mark expiration timer task */ struct timer_list sc_dfs_excl_timer; /* mark expiration timer task */
struct timer_list sc_dfs_cac_timer; /* dfs wait timer */ struct timer_list sc_dfs_cac_timer; /* dfs wait timer */
@@ -827,6 +830,7 @@ struct ath_softc { @@ -826,6 +829,7 @@ struct ath_softc {
int sc_rp_num; int sc_rp_num;
int sc_rp_min; int sc_rp_min;
HAL_BOOL (*sc_rp_analyse)(struct ath_softc *sc); HAL_BOOL (*sc_rp_analyse)(struct ath_softc *sc);
@ -741,7 +741,7 @@
struct ATH_TQ_STRUCT sc_rp_tq; struct ATH_TQ_STRUCT sc_rp_tq;
int sc_rp_ignored; /* if set, we ignored all int sc_rp_ignored; /* if set, we ignored all
@@ -942,6 +946,48 @@ int ar_device(int devid); @@ -941,6 +945,48 @@ int ar_device(int devid);
DEV_NAME(_v->iv_ic->ic_dev)) DEV_NAME(_v->iv_ic->ic_dev))
void ath_radar_detected(struct ath_softc *sc, const char* message); void ath_radar_detected(struct ath_softc *sc, const char* message);