diff options
Diffstat (limited to 'sys/dev/ic/ath.c')
-rw-r--r-- | sys/dev/ic/ath.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/sys/dev/ic/ath.c b/sys/dev/ic/ath.c index d953cd3f036..2ef9b736699 100644 --- a/sys/dev/ic/ath.c +++ b/sys/dev/ic/ath.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ath.c,v 1.41 2005/09/22 10:17:04 reyk Exp $ */ +/* $OpenBSD: ath.c,v 1.42 2005/09/23 20:06:50 reyk Exp $ */ /* $NetBSD: ath.c,v 1.37 2004/08/18 21:59:39 dyoung Exp $ */ /*- @@ -131,7 +131,7 @@ void ath_ledstate(struct ath_softc *, enum ieee80211_state); int ath_newstate(struct ieee80211com *, enum ieee80211_state, int); void ath_newassoc(struct ieee80211com *, struct ieee80211_node *, int); -int ath_getchannels(struct ath_softc *, u_int cc, HAL_BOOL outdoor, +int ath_getchannels(struct ath_softc *, HAL_BOOL outdoor, HAL_BOOL xchanmode); int ath_rate_setup(struct ath_softc *sc, u_int mode); void ath_setcurmode(struct ath_softc *, enum ieee80211_phymode); @@ -157,8 +157,6 @@ int ath_dwelltime = 200; /* 5 channels/second */ int ath_calinterval = 30; /* calibrate every 30 secs */ int ath_outdoor = AH_TRUE; /* outdoor operation */ int ath_xchanmode = AH_TRUE; /* enable extended channels */ -int ath_countrycode = CTRY_DEFAULT; /* country code */ -int ath_regdomain = DMN_DEFAULT; /* regulatory domain */ struct cfdriver ath_cd = { NULL, "ath", DV_IFNET @@ -222,6 +220,7 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) DPRINTF(ATH_DEBUG_ANY, ("%s: devid 0x%x\n", __func__, devid)); bcopy(sc->sc_dev.dv_xname, ifp->if_xname, IFNAMSIZ); + sc->sc_flags &= ~ATH_ATTACHED; /* make sure that it's not attached */ ah = ath_hal_attach(devid, sc, sc->sc_st, sc->sc_sh, &status); if (ah == NULL) { @@ -263,21 +262,18 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) sc->sc_invalid = 0; /* ready to go, enable interrupt handling */ /* - * Collect the channel list using the default country - * code and including outdoor channels. The 802.11 layer - * is resposible for filtering this list based on settings - * like the phy mode. + * Get regulation domain either stored in the EEPROM or defined + * as the default value. Some devices are known to have broken + * regulation domain values in their EEPROM. */ - error = ath_getchannels(sc, ath_countrycode, ath_outdoor, - ath_xchanmode); - if (error != 0) - goto bad; + ath_hal_get_regdomain(ah, &ah->ah_regdomain); + /* - * Copy these back; they are set as a side effect - * of constructing the channel list. + * Construct channel list based on the current regulation domain. */ - ath_hal_get_regdomain(ah, &ath_regdomain); - ath_hal_getcountrycode(ah, &ath_countrycode); + error = ath_getchannels(sc, ath_outdoor, ath_xchanmode); + if (error != 0) + goto bad; /* * Setup rate tables for all potential media types. @@ -414,7 +410,13 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) if (sc->sc_powerhook == NULL) printf(": WARNING: unable to establish power hook\n"); - printf(", %s, address %s\n", ieee80211_regdomain2name(ath_regdomain), + /* + * Print regulation domain and the mac address. The regulation domain + * will be marked with a * if the EEPROM value has been overwritten. + */ + printf(", %s%s, address %s\n", + ieee80211_regdomain2name(ah->ah_regdomain), + ah->ah_regdomain != ah->ah_regdomain_hw ? "*" : "", ether_sprintf(ic->ic_myaddr)); if (ath_gpio_attach(sc, devid) == 0) @@ -3008,8 +3010,7 @@ ath_newassoc(struct ieee80211com *ic, struct ieee80211_node *ni, int isnew) } int -ath_getchannels(struct ath_softc *sc, u_int cc, HAL_BOOL outdoor, - HAL_BOOL xchanmode) +ath_getchannels(struct ath_softc *sc, HAL_BOOL outdoor, HAL_BOOL xchanmode) { struct ieee80211com *ic = &sc->sc_ic; struct ifnet *ifp = &ic->ic_if; @@ -3025,7 +3026,7 @@ ath_getchannels(struct ath_softc *sc, u_int cc, HAL_BOOL outdoor, return ENOMEM; } if (!ath_hal_init_channels(ah, chans, IEEE80211_CHAN_MAX, &nchan, - cc, HAL_MODE_ALL, outdoor, xchanmode)) { + HAL_MODE_ALL, outdoor, xchanmode)) { printf("%s: unable to collect channel list from hal\n", ifp->if_xname); free(chans, M_TEMP); @@ -3063,8 +3064,8 @@ ath_getchannels(struct ath_softc *sc, u_int cc, HAL_BOOL outdoor, if (sc->sc_nchan < 1) { printf("%s: no valid channels for regdomain %s(%u)\n", - ifp->if_xname, ieee80211_regdomain2name(ath_regdomain), - sc->sc_ah->ah_capabilities.cap_eeprom.ee_regdomain); + ifp->if_xname, ieee80211_regdomain2name(ah->ah_regdomain), + ah->ah_regdomain); return ENOENT; } |