/* NB: setup here so ath_rate_update is happy */
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);
#endif
#ifdef ATH_SUPERG_XR
ic->ic_ath_cap |= (ath_hal_xrsupported(ah) ? IEEE80211_ATHC_XR : 0);
#endif
-@@ -4466,17 +4482,17 @@ ath_mode_init(struct net_device *dev)
+@@ -4469,17 +4485,17 @@ ath_mode_init(struct net_device *dev)
* Set the slot time based on the current setting.
*/
static void
sc->sc_updateslot = OK;
}
-@@ -4498,7 +4514,7 @@ ath_updateslot(struct net_device *dev)
+@@ -4501,7 +4517,7 @@ ath_updateslot(struct net_device *dev)
if (ic->ic_opmode == IEEE80211_M_HOSTAP)
sc->sc_updateslot = UPDATE;
else if (dev->flags & IFF_RUNNING)
}
#ifdef ATH_SUPERG_DYNTURBO
-@@ -5342,7 +5358,7 @@ ath_beacon_send(struct ath_softc *sc, in
+@@ -5345,7 +5361,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))
if (bfaddr != 0) {
/*
-@@ -7796,12 +7812,14 @@ ath_get_ivlen(struct ieee80211_key *k)
+@@ -7798,12 +7814,14 @@ ath_get_ivlen(struct ieee80211_key *k)
* Get transmit rate index using rate in Kbps
*/
static __inline int
ndx = i;
break;
}
-@@ -8094,7 +8112,7 @@ ath_tx_start(struct net_device *dev, str
+@@ -8096,7 +8114,7 @@ ath_tx_start(struct net_device *dev, str
atype = HAL_PKT_TYPE_NORMAL; /* default */
if (ismcast) {
txrate = rt->info[rix].rateCode;
if (shortPreamble)
txrate |= rt->info[rix].shortPreamble;
-@@ -9061,7 +9079,7 @@ ath_chan_change(struct ath_softc *sc, st
+@@ -9063,7 +9081,7 @@ ath_chan_change(struct ath_softc *sc, st
struct net_device *dev = sc->sc_dev;
enum ieee80211_phymode mode;
ath_rate_setup(dev, mode);
ath_setcurmode(sc, mode);
-@@ -10110,8 +10128,7 @@ ath_newassoc(struct ieee80211_node *ni,
+@@ -10120,8 +10138,7 @@ ath_newassoc(struct ieee80211_node *ni,
}
static int
{
struct ath_softc *sc = dev->priv;
struct ieee80211com *ic = &sc->sc_ic;
-@@ -10125,17 +10142,31 @@ ath_getchannels(struct net_device *dev,
+@@ -10135,17 +10152,31 @@ ath_getchannels(struct net_device *dev,
EPRINTF(sc, "Insufficient memory for channel table!\n");
return -ENOMEM;
}
/*
* Convert HAL channels to ieee80211 ones.
*/
-@@ -10379,7 +10410,7 @@ ath_xr_rate_setup(struct net_device *dev
+@@ -10389,7 +10420,7 @@ ath_xr_rate_setup(struct net_device *dev
struct ieee80211com *ic = &sc->sc_ic;
const HAL_RATE_TABLE *rt;
struct ieee80211_rateset *rs;
sc->sc_xr_rates = ath_hal_getratetable(ah, HAL_MODE_XR);
rt = sc->sc_xr_rates;
if (rt == NULL)
-@@ -10392,57 +10423,16 @@ ath_xr_rate_setup(struct net_device *dev
+@@ -10402,57 +10433,16 @@ ath_xr_rate_setup(struct net_device *dev
} else
maxrates = rt->rateCount;
rs = &ic->ic_sup_xr_rates;
static int
ath_rate_setup(struct net_device *dev, u_int mode)
{
-@@ -10451,7 +10441,7 @@ ath_rate_setup(struct net_device *dev, u
+@@ -10461,7 +10451,7 @@ ath_rate_setup(struct net_device *dev, u
struct ieee80211com *ic = &sc->sc_ic;
const HAL_RATE_TABLE *rt;
struct ieee80211_rateset *rs;
switch (mode) {
case IEEE80211_MODE_11A:
-@@ -10469,6 +10459,12 @@ ath_rate_setup(struct net_device *dev, u
+@@ -10479,6 +10469,12 @@ ath_rate_setup(struct net_device *dev, u
case IEEE80211_MODE_TURBO_G:
sc->sc_rates[mode] = ath_hal_getratetable(ah, HAL_MODE_108G);
break;
default:
DPRINTF(sc, ATH_DEBUG_ANY, "Invalid mode %u\n", mode);
return 0;
-@@ -10483,10 +10479,16 @@ ath_rate_setup(struct net_device *dev, u
+@@ -10493,10 +10489,16 @@ ath_rate_setup(struct net_device *dev, u
maxrates = IEEE80211_RATE_MAXSIZE;
} else
maxrates = rt->rateCount;
return 1;
}
-@@ -10515,13 +10517,18 @@ ath_setcurmode(struct ath_softc *sc, enu
+@@ -10525,13 +10527,18 @@ ath_setcurmode(struct ath_softc *sc, enu
{ 0, 500, 130 },
};
const HAL_RATE_TABLE *rt;
memset(sc->sc_hwmap, 0, sizeof(sc->sc_hwmap));
for (i = 0; i < 32; i++) {
u_int8_t ix = rt->rateCodeToIndex[i];
-@@ -10531,7 +10538,7 @@ ath_setcurmode(struct ath_softc *sc, enu
+@@ -10541,7 +10548,7 @@ ath_setcurmode(struct ath_softc *sc, enu
continue;
}
sc->sc_hwmap[i].ieeerate =
if (rt->info[ix].shortPreamble ||
rt->info[ix].phy == IEEE80211_T_OFDM)
sc->sc_hwmap[i].flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
-@@ -10932,9 +10939,106 @@ enum {
+@@ -10942,9 +10949,106 @@ enum {
ATH_MAXVAPS = 26,
ATH_INTMIT = 27,
ATH_NOISE_IMMUNITY = 28,
static int
ath_sysctl_set_intmit(struct ath_softc *sc, long ctl, u_int val)
{
-@@ -11013,6 +11117,7 @@ static int
+@@ -11023,6 +11127,7 @@ static int
ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl, write, filp, buffer, lenp, ppos)
{
struct ath_softc *sc = ctl->extra1;
struct ath_hal *ah = sc->sc_ah;
u_int val;
u_int tab_3_val[3];
-@@ -11036,25 +11141,33 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
+@@ -11046,25 +11151,34 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
lenp, ppos);
if (ret == 0) {
switch ((long)ctl->extra2) {
+ case ATH_REGDOMAIN:
+ ath_hal_setregdomain(ah, val);
+ break;
++ case ATH_OUTDOOR:
+ case ATH_COUNTRYCODE:
+ case ATH_CHANBW:
+ ret = ath_sysctl_setchanparam(sc, (long) ctl->extra2, val);
break;
case ATH_SOFTLED:
if (val != sc->sc_softled) {
-@@ -11207,6 +11320,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
+@@ -11217,6 +11331,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
}
} else {
switch ((long)ctl->extra2) {
case ATH_SLOTTIME:
val = ath_hal_getslottime(ah);
break;
-@@ -11225,6 +11341,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
+@@ -11235,6 +11352,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
case ATH_COUNTRYCODE:
ath_hal_getcountrycode(ah, &val);
break;
case ATH_MAXVAPS:
val = ath_maxvaps;
break;
-@@ -11338,11 +11457,17 @@ static const ctl_table ath_sysctl_templa
+@@ -11348,11 +11468,17 @@ static const ctl_table ath_sysctl_templa
},
{ .ctl_name = CTL_AUTO,
.procname = "countrycode",
.procname = "maxvaps",
.mode = 0444,
.proc_handler = ath_sysctl_halparam,
-@@ -11350,7 +11475,7 @@ static const ctl_table ath_sysctl_templa
+@@ -11360,7 +11486,7 @@ static const ctl_table ath_sysctl_templa
},
{ .ctl_name = CTL_AUTO,
.procname = "regdomain",
.proc_handler = ath_sysctl_halparam,
.extra2 = (void *)ATH_REGDOMAIN,
},
-@@ -11413,6 +11538,12 @@ static const ctl_table ath_sysctl_templa
+@@ -11423,6 +11549,12 @@ static const ctl_table ath_sysctl_templa
.extra2 = (void *)ATH_ACKRATE,
},
{ .ctl_name = CTL_AUTO,
.procname = "rp",
.mode = 0200,
.proc_handler = ath_sysctl_halparam,
-@@ -11653,13 +11784,6 @@ static ctl_table ath_static_sysctls[] =
+@@ -11663,13 +11795,6 @@ static ctl_table ath_static_sysctls[] =
},
#endif
{ .ctl_name = CTL_AUTO,
.procname = "maxvaps",
.mode = 0444,
.data = &ath_maxvaps,
-@@ -11667,13 +11791,6 @@ static ctl_table ath_static_sysctls[] =
+@@ -11677,13 +11802,6 @@ static ctl_table ath_static_sysctls[] =
.proc_handler = proc_dointvec
},
{ .ctl_name = CTL_AUTO,
.data = &ath_xchanmode,
--- a/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 */
/* rate tables */
u_int8_t sc_curbssid[IEEE80211_ADDR_LEN];
u_int8_t sc_rixmap[256]; /* IEEE to h/w rate table ix */
struct {
-@@ -809,6 +810,8 @@ struct ath_softc {
+@@ -808,6 +809,8 @@ struct ath_softc {
u_int32_t sc_dturbo_bw_turbo; /* bandwidth threshold */
#endif
u_int sc_slottimeconf; /* manual override for slottime */
struct timer_list sc_dfs_excl_timer; /* mark expiration timer task */
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_min;
HAL_BOOL (*sc_rp_analyse)(struct ath_softc *sc);
struct ATH_TQ_STRUCT sc_rp_tq;
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))
void ath_radar_detected(struct ath_softc *sc, const char* message);
for (i = 0; i < nrates; i++)
if (IEEERATE(ic, mode, i) == rate)
return i;
-@@ -1881,11 +1915,6 @@ ieee80211_build_countryie(struct ieee802
+@@ -1877,11 +1911,6 @@ ieee80211_build_countryie(struct ieee802
if (ieee80211_chan2mode(c) != curmode_noturbo)
continue;
if (*cur_runlen == 0) {
(*cur_runlen)++;
*cur_pow = c->ic_maxregpower;
-@@ -1919,7 +1948,7 @@ void
+@@ -1915,7 +1944,7 @@ void
ieee80211_build_sc_ie(struct ieee80211com *ic)
{
struct ieee80211_ie_sc *ie = &ic->ic_sc_ie;
--- a/net80211/ieee80211_scan_ap.c
+++ b/net80211/ieee80211_scan_ap.c
-@@ -518,12 +518,13 @@ pick_channel(struct ieee80211_scan_state
+@@ -512,12 +512,13 @@ pick_channel(struct ieee80211_scan_state
int ss_last = ss->ss_last;
struct ieee80211_channel *best;
struct ap_state *as = ss->ss_priv;
for (i = 0; i < ss_last; i++) {
chans[i].chan = ss->ss_chans[i];
chans[i].orig = i;
-@@ -612,6 +613,7 @@ pick_channel(struct ieee80211_scan_state
+@@ -571,6 +572,7 @@ pick_channel(struct ieee80211_scan_state
"%s: best: channel %u rssi %d\n",
__func__, i, as->as_maxrssi[i]);
}
return best;
}
-@@ -647,6 +649,7 @@ ap_end(struct ieee80211_scan_state *ss,
+@@ -609,6 +611,7 @@ ap_end(struct ieee80211_scan_state *ss,
res = 1; /* Do NOT restart scan */
} else {
struct ieee80211_scan_entry se;
/* XXX: notify all VAPs? */
/* if this is a dynamic turbo frequency , start with normal
* mode first */
-@@ -661,6 +664,11 @@ ap_end(struct ieee80211_scan_state *ss,
+@@ -623,6 +626,11 @@ ap_end(struct ieee80211_scan_state *ss,
return 0;
}
}