Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/bwn/if_bwn_phy_common.c
Show First 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | |||||
#include <net/if_arp.h> | #include <net/if_arp.h> | ||||
#include <net/if_dl.h> | #include <net/if_dl.h> | ||||
#include <net/if_llc.h> | #include <net/if_llc.h> | ||||
#include <net/if_media.h> | #include <net/if_media.h> | ||||
#include <net/if_types.h> | #include <net/if_types.h> | ||||
#include <dev/pci/pcivar.h> | #include <dev/pci/pcivar.h> | ||||
#include <dev/pci/pcireg.h> | #include <dev/pci/pcireg.h> | ||||
#include <dev/siba/siba_ids.h> | |||||
#include <dev/siba/sibareg.h> | |||||
#include <dev/siba/sibavar.h> | |||||
#include <net80211/ieee80211_var.h> | #include <net80211/ieee80211_var.h> | ||||
#include <net80211/ieee80211_radiotap.h> | #include <net80211/ieee80211_radiotap.h> | ||||
#include <net80211/ieee80211_regdomain.h> | #include <net80211/ieee80211_regdomain.h> | ||||
#include <net80211/ieee80211_phy.h> | #include <net80211/ieee80211_phy.h> | ||||
#include <net80211/ieee80211_ratectl.h> | #include <net80211/ieee80211_ratectl.h> | ||||
#include <dev/bwn/if_bwn_siba.h> | |||||
#include <dev/bwn/if_bwnreg.h> | #include <dev/bwn/if_bwnreg.h> | ||||
#include <dev/bwn/if_bwnvar.h> | #include <dev/bwn/if_bwnvar.h> | ||||
#include <dev/bwn/if_bwn_chipid.h> | #include <dev/bwn/if_bwn_chipid.h> | ||||
#include <dev/bwn/if_bwn_debug.h> | #include <dev/bwn/if_bwn_debug.h> | ||||
#include <dev/bwn/if_bwn_misc.h> | #include <dev/bwn/if_bwn_misc.h> | ||||
#include <dev/bwn/if_bwn_phy_common.h> | #include <dev/bwn/if_bwn_phy_common.h> | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
void | void | ||||
bwn_phy_force_clock(struct bwn_mac *mac, int force) | bwn_phy_force_clock(struct bwn_mac *mac, int force) | ||||
{ | { | ||||
struct bwn_softc *sc = mac->mac_sc; | struct bwn_softc *sc = mac->mac_sc; | ||||
uint32_t tmp; | uint32_t tmp; | ||||
/* XXX Only for N, HT and AC PHYs */ | /* XXX Only for N, HT and AC PHYs */ | ||||
/* XXX bhnd bus */ | |||||
if (bwn_is_bus_siba(mac)) { | |||||
tmp = siba_read_4(sc->sc_dev, SIBA_TGSLOW); | tmp = siba_read_4(sc->sc_dev, SIBA_TGSLOW); | ||||
if (force) | if (force) | ||||
tmp |= SIBA_TGSLOW_FGC; | tmp |= SIBA_TGSLOW_FGC; | ||||
else | else | ||||
tmp &= ~SIBA_TGSLOW_FGC; | tmp &= ~SIBA_TGSLOW_FGC; | ||||
siba_write_4(sc->sc_dev, SIBA_TGSLOW, tmp); | siba_write_4(sc->sc_dev, SIBA_TGSLOW, tmp); | ||||
} else { | |||||
BWN_ERRPRINTF(sc, "%s: unknown bus!\n", __func__); | |||||
} | } | ||||
} | |||||
int | int | ||||
bwn_radio_wait_value(struct bwn_mac *mac, uint16_t offset, uint16_t mask, | bwn_radio_wait_value(struct bwn_mac *mac, uint16_t offset, uint16_t mask, | ||||
uint16_t value, int delay, int timeout) | uint16_t value, int delay, int timeout) | ||||
{ | { | ||||
uint16_t val; | uint16_t val; | ||||
int i; | int i; | ||||
for (i = 0; i < timeout; i += delay) { | for (i = 0; i < timeout; i += delay) { | ||||
val = BWN_RF_READ(mac, offset); | val = BWN_RF_READ(mac, offset); | ||||
if ((val & mask) == value) | if ((val & mask) == value) | ||||
return (1); | return (1); | ||||
DELAY(delay); | DELAY(delay); | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
void | void | ||||
bwn_mac_phy_clock_set(struct bwn_mac *mac, int enabled) | bwn_mac_phy_clock_set(struct bwn_mac *mac, int enabled) | ||||
{ | { | ||||
struct bwn_softc *sc = mac->mac_sc; | struct bwn_softc *sc = mac->mac_sc; | ||||
uint32_t val; | uint32_t val; | ||||
/* XXX bhnd bus */ | |||||
if (bwn_is_bus_siba(mac)) { | |||||
val = siba_read_4(sc->sc_dev, SIBA_TGSLOW); | val = siba_read_4(sc->sc_dev, SIBA_TGSLOW); | ||||
if (enabled) | if (enabled) | ||||
val |= BWN_TGSLOW_MACPHYCLKEN; | val |= BWN_TGSLOW_MACPHYCLKEN; | ||||
else | else | ||||
val &= ~BWN_TGSLOW_MACPHYCLKEN; | val &= ~BWN_TGSLOW_MACPHYCLKEN; | ||||
siba_write_4(sc->sc_dev, SIBA_TGSLOW, val); | siba_write_4(sc->sc_dev, SIBA_TGSLOW, val); | ||||
} else { | |||||
BWN_ERRPRINTF(sc, "%s: unknown bus!\n", __func__); | |||||
} | } | ||||
} | |||||
/* http://bcm-v4.sipsolutions.net/802.11/PHY/BmacCorePllReset */ | /* http://bcm-v4.sipsolutions.net/802.11/PHY/BmacCorePllReset */ | ||||
void | void | ||||
bwn_wireless_core_phy_pll_reset(struct bwn_mac *mac) | bwn_wireless_core_phy_pll_reset(struct bwn_mac *mac) | ||||
{ | { | ||||
struct bwn_softc *sc = mac->mac_sc; | struct bwn_softc *sc = mac->mac_sc; | ||||
/* XXX bhnd bus */ | |||||
if (bwn_is_bus_siba(mac)) { | |||||
siba_cc_write32(sc->sc_dev, SIBA_CC_CHIPCTL_ADDR, 0); | siba_cc_write32(sc->sc_dev, SIBA_CC_CHIPCTL_ADDR, 0); | ||||
siba_cc_mask32(sc->sc_dev, SIBA_CC_CHIPCTL_DATA, ~0x4); | siba_cc_mask32(sc->sc_dev, SIBA_CC_CHIPCTL_DATA, ~0x4); | ||||
siba_cc_set32(sc->sc_dev, SIBA_CC_CHIPCTL_DATA, 0x4); | siba_cc_set32(sc->sc_dev, SIBA_CC_CHIPCTL_DATA, 0x4); | ||||
siba_cc_mask32(sc->sc_dev, SIBA_CC_CHIPCTL_DATA, ~0x4); | siba_cc_mask32(sc->sc_dev, SIBA_CC_CHIPCTL_DATA, ~0x4); | ||||
} else { | |||||
BWN_ERRPRINTF(sc, "%s: unknown bus!\n", __func__); | |||||
} | |||||
} | } |