Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 149882
b: refs/heads/master
c: e3bb249
h: refs/heads/master
v: v3
  • Loading branch information
Bob Copeland authored and John W. Linville committed Apr 22, 2009
1 parent 64b0a1c commit c633d44
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 57 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3a702e49c03ba959e3f5bb2b74ec9921a81c8c98
refs/heads/master: e3bb249be89dd387e78ca382d08fad31745edac9
55 changes: 42 additions & 13 deletions trunk/drivers/net/wireless/ath/regd.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,14 +126,13 @@ bool ath_is_world_regd(struct ath_regulatory *reg)
}
EXPORT_SYMBOL(ath_is_world_regd);

const struct ieee80211_regdomain *ath_default_world_regdomain(void)
static const struct ieee80211_regdomain *ath_default_world_regdomain(void)
{
/* this is the most restrictive */
return &ath_world_regdom_64;
}
EXPORT_SYMBOL(ath_default_world_regdomain);

const struct
static const struct
ieee80211_regdomain *ath_world_regdomain(struct ath_regulatory *reg)
{
switch (reg->regpair->regDmnEnum) {
Expand All @@ -158,7 +157,6 @@ ieee80211_regdomain *ath_world_regdomain(struct ath_regulatory *reg)
return ath_default_world_regdomain();
}
}
EXPORT_SYMBOL(ath_world_regdomain);

/* Frequency is one where radar detection is required */
static bool ath_is_radar_freq(u16 center_freq)
Expand Down Expand Up @@ -285,7 +283,7 @@ static void ath_reg_apply_active_scan_flags(
}

/* Always apply Radar/DFS rules on freq range 5260 MHz - 5700 MHz */
void ath_reg_apply_radar_flags(struct wiphy *wiphy)
static void ath_reg_apply_radar_flags(struct wiphy *wiphy)
{
struct ieee80211_supported_band *sband;
struct ieee80211_channel *ch;
Expand Down Expand Up @@ -316,11 +314,10 @@ void ath_reg_apply_radar_flags(struct wiphy *wiphy)
IEEE80211_CHAN_PASSIVE_SCAN;
}
}
EXPORT_SYMBOL(ath_reg_apply_radar_flags);

void ath_reg_apply_world_flags(struct wiphy *wiphy,
enum nl80211_reg_initiator initiator,
struct ath_regulatory *reg)
static void ath_reg_apply_world_flags(struct wiphy *wiphy,
enum nl80211_reg_initiator initiator,
struct ath_regulatory *reg)
{
switch (reg->regpair->regDmnEnum) {
case 0x60:
Expand All @@ -336,7 +333,6 @@ void ath_reg_apply_world_flags(struct wiphy *wiphy,
}
return;
}
EXPORT_SYMBOL(ath_reg_apply_world_flags);

int ath_reg_notifier_apply(struct wiphy *wiphy,
struct regulatory_request *request, struct ath_regulatory *reg)
Expand All @@ -360,7 +356,7 @@ int ath_reg_notifier_apply(struct wiphy *wiphy,
}
EXPORT_SYMBOL(ath_reg_notifier_apply);

bool ath_regd_is_eeprom_valid(struct ath_regulatory *reg)
static bool ath_regd_is_eeprom_valid(struct ath_regulatory *reg)
{
u16 rd = ath_regd_get_eepromRD(reg);
int i;
Expand All @@ -381,7 +377,6 @@ bool ath_regd_is_eeprom_valid(struct ath_regulatory *reg)
"ath: invalid regulatory domain/country code 0x%x\n", rd);
return false;
}
EXPORT_SYMBOL(ath_regd_is_eeprom_valid);

/* EEPROM country code to regpair mapping */
static struct country_code_to_enum_rd*
Expand Down Expand Up @@ -438,7 +433,40 @@ ath_get_regpair(int regdmn)
return NULL;
}

int ath_regd_init(struct ath_regulatory *reg)
static int ath_regd_init_wiphy(struct ath_regulatory *reg, struct wiphy *wiphy,
int (*reg_notifier)(struct wiphy *wiphy,
struct regulatory_request *request))
{
const struct ieee80211_regdomain *regd;

wiphy->reg_notifier = reg_notifier;
wiphy->strict_regulatory = true;

if (ath_is_world_regd(reg)) {
/*
* Anything applied here (prior to wiphy registration) gets
* saved on the wiphy orig_* parameters
*/
regd = ath_world_regdomain(reg);
wiphy->custom_regulatory = true;
wiphy->strict_regulatory = false;
} else {
/*
* This gets applied in the case of the absense of CRDA,
* it's our own custom world regulatory domain, similar to
* cfg80211's but we enable passive scanning.
*/
regd = ath_default_world_regdomain();
}
wiphy_apply_custom_regulatory(wiphy, regd);
ath_reg_apply_radar_flags(wiphy);
ath_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER, reg);
return 0;
}

int ath_regd_init(struct ath_regulatory *reg, struct wiphy *wiphy,
int (*reg_notifier)(struct wiphy *wiphy,
struct regulatory_request *request))
{
struct country_code_to_enum_rd *country = NULL;
u16 regdmn;
Expand Down Expand Up @@ -492,6 +520,7 @@ int ath_regd_init(struct ath_regulatory *reg)
printk(KERN_DEBUG "ath: Regpair detected: 0x%0x\n",
reg->regpair->regDmnEnum);

ath_regd_init_wiphy(reg, wiphy, reg_notifier);
return 0;
}
EXPORT_SYMBOL(ath_regd_init);
Expand Down
12 changes: 3 additions & 9 deletions trunk/drivers/net/wireless/ath/regd.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,15 +254,9 @@ enum CountryCode {
};

bool ath_is_world_regd(struct ath_regulatory *reg);
const
struct ieee80211_regdomain *ath_world_regdomain(struct ath_regulatory *reg);
const struct ieee80211_regdomain *ath_default_world_regdomain(void);
void ath_reg_apply_world_flags(struct wiphy *wiphy,
enum nl80211_reg_initiator,
struct ath_regulatory *reg);
void ath_reg_apply_radar_flags(struct wiphy *wiphy);
int ath_regd_init(struct ath_regulatory *reg);
bool ath_regd_is_eeprom_valid(struct ath_regulatory *reg);
int ath_regd_init(struct ath_regulatory *reg, struct wiphy *wiphy,
int (*reg_notifier)(struct wiphy *wiphy,
struct regulatory_request *request));
u32 ath_regd_get_band_ctl(struct ath_regulatory *reg,
enum ieee80211_band band);
int ath_reg_notifier_apply(struct wiphy *wiphy,
Expand Down
47 changes: 13 additions & 34 deletions trunk/drivers/net/wireless/ath9k/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1352,6 +1352,17 @@ void ath_detach(struct ath_softc *sc)
ath9k_ps_restore(sc);
}

static int ath9k_reg_notifier(struct wiphy *wiphy,
struct regulatory_request *request)
{
struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
struct ath_wiphy *aphy = hw->priv;
struct ath_softc *sc = aphy->sc;
struct ath_regulatory *reg = &sc->sc_ah->regulatory;

return ath_reg_notifier_apply(wiphy, request, reg);
}

static int ath_init(u16 devid, struct ath_softc *sc)
{
struct ath_hw *ah = NULL;
Expand Down Expand Up @@ -1406,7 +1417,8 @@ static int ath_init(u16 devid, struct ath_softc *sc)
for (i = 0; i < sc->keymax; i++)
ath9k_hw_keyreset(ah, (u16) i);

if (ath_regd_init(&sc->sc_ah->regulatory))
if (ath_regd_init(&sc->sc_ah->regulatory, sc->hw->wiphy,
ath9k_reg_notifier))
goto bad;

/* default to MONITOR mode */
Expand Down Expand Up @@ -1570,17 +1582,6 @@ static int ath_init(u16 devid, struct ath_softc *sc)
return error;
}

static int ath9k_reg_notifier(struct wiphy *wiphy,
struct regulatory_request *request)
{
struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
struct ath_wiphy *aphy = hw->priv;
struct ath_softc *sc = aphy->sc;
struct ath_regulatory *reg = &sc->sc_ah->regulatory;

return ath_reg_notifier_apply(wiphy, request, reg);
}

void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
{
hw->flags = IEEE80211_HW_RX_INCLUDES_FCS |
Expand All @@ -1600,9 +1601,6 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
BIT(NL80211_IFTYPE_ADHOC) |
BIT(NL80211_IFTYPE_MESH_POINT);

hw->wiphy->reg_notifier = ath9k_reg_notifier;
hw->wiphy->strict_regulatory = true;

hw->queues = 4;
hw->max_rates = 4;
hw->channel_change_time = 5000;
Expand All @@ -1623,7 +1621,6 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
int ath_attach(u16 devid, struct ath_softc *sc)
{
struct ieee80211_hw *hw = sc->hw;
const struct ieee80211_regdomain *regd;
int error = 0, i;
struct ath_regulatory *reg;

Expand Down Expand Up @@ -1667,24 +1664,6 @@ int ath_attach(u16 devid, struct ath_softc *sc)
goto error_attach;
#endif

if (ath_is_world_regd(reg)) {
/* Anything applied here (prior to wiphy registration) gets
* saved on the wiphy orig_* parameters */
regd = ath_world_regdomain(reg);
hw->wiphy->custom_regulatory = true;
hw->wiphy->strict_regulatory = false;
} else {
/* This gets applied in the case of the absense of CRDA,
* it's our own custom world regulatory domain, similar to
* cfg80211's but we enable passive scanning */
regd = ath_default_world_regdomain();
}
wiphy_apply_custom_regulatory(hw->wiphy, regd);
ath_reg_apply_radar_flags(hw->wiphy);
ath_reg_apply_world_flags(hw->wiphy,
NL80211_REGDOM_SET_BY_DRIVER,
reg);

INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work);
INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work);
sc->wiphy_scheduler_int = msecs_to_jiffies(500);
Expand Down

0 comments on commit c633d44

Please sign in to comment.