Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/usb/wlan/if_urtwn.c
Show First 20 Lines • Show All 216 Lines • ▼ Show 20 Lines | |||||
static void urtwn_efuse_read(struct urtwn_softc *); | static void urtwn_efuse_read(struct urtwn_softc *); | ||||
static void urtwn_efuse_switch_power(struct urtwn_softc *); | static void urtwn_efuse_switch_power(struct urtwn_softc *); | ||||
static int urtwn_read_chipid(struct urtwn_softc *); | static int urtwn_read_chipid(struct urtwn_softc *); | ||||
static void urtwn_read_rom(struct urtwn_softc *); | static void urtwn_read_rom(struct urtwn_softc *); | ||||
static void urtwn_r88e_read_rom(struct urtwn_softc *); | static void urtwn_r88e_read_rom(struct urtwn_softc *); | ||||
static int urtwn_ra_init(struct urtwn_softc *); | static int urtwn_ra_init(struct urtwn_softc *); | ||||
static void urtwn_tsf_sync_enable(struct urtwn_softc *); | static void urtwn_tsf_sync_enable(struct urtwn_softc *); | ||||
static void urtwn_set_led(struct urtwn_softc *, int, int); | static void urtwn_set_led(struct urtwn_softc *, int, int); | ||||
static void urtwn_set_mode(struct urtwn_softc *, uint8_t); | |||||
static int urtwn_newstate(struct ieee80211vap *, | static int urtwn_newstate(struct ieee80211vap *, | ||||
enum ieee80211_state, int); | enum ieee80211_state, int); | ||||
static void urtwn_watchdog(void *); | static void urtwn_watchdog(void *); | ||||
static void urtwn_update_avgrssi(struct urtwn_softc *, int, int8_t); | static void urtwn_update_avgrssi(struct urtwn_softc *, int, int8_t); | ||||
static int8_t urtwn_get_rssi(struct urtwn_softc *, int, void *); | static int8_t urtwn_get_rssi(struct urtwn_softc *, int, void *); | ||||
static int8_t urtwn_r88e_get_rssi(struct urtwn_softc *, int, void *); | static int8_t urtwn_r88e_get_rssi(struct urtwn_softc *, int, void *); | ||||
static int urtwn_tx_start(struct urtwn_softc *, | static int urtwn_tx_start(struct urtwn_softc *, | ||||
struct ieee80211_node *, struct mbuf *, | struct ieee80211_node *, struct mbuf *, | ||||
▲ Show 20 Lines • Show All 1,284 Lines • ▼ Show 20 Lines | if (sc->chip & URTWN_CHIP_88E) { | ||||
if (!on) | if (!on) | ||||
reg |= R92C_LEDCFG0_DIS; | reg |= R92C_LEDCFG0_DIS; | ||||
urtwn_write_1(sc, R92C_LEDCFG0, reg); | urtwn_write_1(sc, R92C_LEDCFG0, reg); | ||||
} | } | ||||
sc->ledlink = on; /* Save LED state. */ | sc->ledlink = on; /* Save LED state. */ | ||||
} | } | ||||
} | } | ||||
static void | |||||
urtwn_set_mode(struct urtwn_softc *sc, uint8_t mode) | |||||
{ | |||||
uint8_t reg; | |||||
reg = urtwn_read_1(sc, R92C_MSR); | |||||
reg = (reg & ~R92C_MSR_MASK) | mode; | |||||
urtwn_write_1(sc, R92C_MSR, reg); | |||||
} | |||||
static int | static int | ||||
urtwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) | urtwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) | ||||
{ | { | ||||
struct urtwn_vap *uvp = URTWN_VAP(vap); | struct urtwn_vap *uvp = URTWN_VAP(vap); | ||||
struct ieee80211com *ic = vap->iv_ic; | struct ieee80211com *ic = vap->iv_ic; | ||||
struct urtwn_softc *sc = ic->ic_softc; | struct urtwn_softc *sc = ic->ic_softc; | ||||
struct ieee80211_node *ni; | struct ieee80211_node *ni; | ||||
enum ieee80211_state ostate; | enum ieee80211_state ostate; | ||||
uint32_t reg; | |||||
ostate = vap->iv_state; | ostate = vap->iv_state; | ||||
DPRINTF("%s -> %s\n", ieee80211_state_name[ostate], | DPRINTF("%s -> %s\n", ieee80211_state_name[ostate], | ||||
ieee80211_state_name[nstate]); | ieee80211_state_name[nstate]); | ||||
IEEE80211_UNLOCK(ic); | IEEE80211_UNLOCK(ic); | ||||
URTWN_LOCK(sc); | URTWN_LOCK(sc); | ||||
callout_stop(&sc->sc_watchdog_ch); | callout_stop(&sc->sc_watchdog_ch); | ||||
if (ostate == IEEE80211_S_RUN) { | if (ostate == IEEE80211_S_RUN) { | ||||
/* Turn link LED off. */ | /* Turn link LED off. */ | ||||
urtwn_set_led(sc, URTWN_LED_LINK, 0); | urtwn_set_led(sc, URTWN_LED_LINK, 0); | ||||
/* Set media status to 'No Link'. */ | /* Set media status to 'No Link'. */ | ||||
reg = urtwn_read_4(sc, R92C_CR); | urtwn_set_mode(sc, R92C_MSR_NOLINK); | ||||
reg = RW(reg, R92C_CR_NETTYPE, R92C_CR_NETTYPE_NOLINK); | |||||
urtwn_write_4(sc, R92C_CR, reg); | |||||
/* Stop Rx of data frames. */ | /* Stop Rx of data frames. */ | ||||
urtwn_write_2(sc, R92C_RXFLTMAP2, 0); | urtwn_write_2(sc, R92C_RXFLTMAP2, 0); | ||||
/* Rest TSF. */ | /* Rest TSF. */ | ||||
urtwn_write_1(sc, R92C_DUAL_TSF_RST, 0x03); | urtwn_write_1(sc, R92C_DUAL_TSF_RST, 0x03); | ||||
/* Disable TSF synchronization. */ | /* Disable TSF synchronization. */ | ||||
▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | if (vap->iv_opmode == IEEE80211_M_MONITOR) { | ||||
/* Turn link LED on. */ | /* Turn link LED on. */ | ||||
urtwn_set_led(sc, URTWN_LED_LINK, 1); | urtwn_set_led(sc, URTWN_LED_LINK, 1); | ||||
break; | break; | ||||
} | } | ||||
ni = ieee80211_ref_node(vap->iv_bss); | ni = ieee80211_ref_node(vap->iv_bss); | ||||
/* Set media status to 'Associated'. */ | /* Set media status to 'Associated'. */ | ||||
reg = urtwn_read_4(sc, R92C_CR); | urtwn_set_mode(sc, R92C_MSR_INFRA); | ||||
reg = RW(reg, R92C_CR_NETTYPE, R92C_CR_NETTYPE_INFRA); | |||||
urtwn_write_4(sc, R92C_CR, reg); | |||||
/* Set BSSID. */ | /* Set BSSID. */ | ||||
urtwn_write_4(sc, R92C_BSSID + 0, LE_READ_4(&ni->ni_bssid[0])); | urtwn_write_4(sc, R92C_BSSID + 0, LE_READ_4(&ni->ni_bssid[0])); | ||||
urtwn_write_4(sc, R92C_BSSID + 4, LE_READ_2(&ni->ni_bssid[4])); | urtwn_write_4(sc, R92C_BSSID + 4, LE_READ_2(&ni->ni_bssid[4])); | ||||
if (ic->ic_curmode == IEEE80211_MODE_11B) | if (ic->ic_curmode == IEEE80211_MODE_11B) | ||||
urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 0); | urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 0); | ||||
else /* 802.11b/g */ | else /* 802.11b/g */ | ||||
▲ Show 20 Lines • Show All 1,643 Lines • ▼ Show 20 Lines | if (sc->chip & URTWN_CHIP_88E) { | ||||
urtwn_write_4(sc, R92C_HIMR, 0xffffffff); | urtwn_write_4(sc, R92C_HIMR, 0xffffffff); | ||||
} | } | ||||
/* Set MAC address. */ | /* Set MAC address. */ | ||||
IEEE80211_ADDR_COPY(macaddr, vap ? vap->iv_myaddr : ic->ic_macaddr); | IEEE80211_ADDR_COPY(macaddr, vap ? vap->iv_myaddr : ic->ic_macaddr); | ||||
urtwn_write_region_1(sc, R92C_MACID, macaddr, IEEE80211_ADDR_LEN); | urtwn_write_region_1(sc, R92C_MACID, macaddr, IEEE80211_ADDR_LEN); | ||||
/* Set initial network type. */ | /* Set initial network type. */ | ||||
reg = urtwn_read_4(sc, R92C_CR); | urtwn_set_mode(sc, R92C_MSR_INFRA); | ||||
reg = RW(reg, R92C_CR_NETTYPE, R92C_CR_NETTYPE_INFRA); | |||||
urtwn_write_4(sc, R92C_CR, reg); | |||||
urtwn_rxfilter_init(sc); | urtwn_rxfilter_init(sc); | ||||
/* Set response rate. */ | /* Set response rate. */ | ||||
reg = urtwn_read_4(sc, R92C_RRSR); | reg = urtwn_read_4(sc, R92C_RRSR); | ||||
reg = RW(reg, R92C_RRSR_RATE_BITMAP, R92C_RRSR_RATE_CCK_ONLY_1M); | reg = RW(reg, R92C_RRSR_RATE_BITMAP, R92C_RRSR_RATE_CCK_ONLY_1M); | ||||
urtwn_write_4(sc, R92C_RRSR, reg); | urtwn_write_4(sc, R92C_RRSR, reg); | ||||
▲ Show 20 Lines • Show All 202 Lines • Show Last 20 Lines |