diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/Jamfile b/src/add-ons/kernel/drivers/network/rtl81xx/Jamfile index 22af38e7fd..a76ce49072 100644 --- a/src/add-ons/kernel/drivers/network/rtl81xx/Jamfile +++ b/src/add-ons/kernel/drivers/network/rtl81xx/Jamfile @@ -1,3 +1,26 @@ SubDir HAIKU_TOP src add-ons kernel drivers network rtl81xx ; -HaikuSubInclude dev ; +UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ] + : true ; +UsePrivateHeaders net system ; +UsePrivateKernelHeaders ; + +SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] ; + +UseHeaders [ FDirName $(SUBDIR) ] : true ; + +SEARCH_SOURCE += [ FDirName $(SUBDIR) dev mii ] ; +SEARCH_SOURCE += [ FDirName $(SUBDIR) dev re ] ; + +KernelAddon rtl81xx : + glue.c + rgephy.c + rlphy.c + if_re.c + : libfreebsd_network.a + ; + +ObjectHdrs [ FGristFiles rgephy$(SUFOBJ) rlphy$(SUFOBJ) ] + : [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCH)) libs + compat freebsd_network ] ; +Includes [ FGristFiles rgephy.c rlphy.c ] : miidevs.h ; diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/dev/Jamfile b/src/add-ons/kernel/drivers/network/rtl81xx/dev/Jamfile deleted file mode 100644 index 895b84dbaa..0000000000 --- a/src/add-ons/kernel/drivers/network/rtl81xx/dev/Jamfile +++ /dev/null @@ -1,4 +0,0 @@ -SubDir HAIKU_TOP src add-ons kernel drivers network rtl81xx dev ; - -HaikuSubInclude mii ; -HaikuSubInclude re ; diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/Jamfile b/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/Jamfile deleted file mode 100644 index 831c716c76..0000000000 --- a/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/Jamfile +++ /dev/null @@ -1,24 +0,0 @@ -SubDir HAIKU_TOP src add-ons kernel drivers network rtl81xx dev mii ; - -UseHeaders [ FDirName $(SUBDIR) $(DOTDOT) $(DOTDOT) ] : true ; -UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ] - : true ; - -UsePrivateHeaders net system ; -UsePrivateKernelHeaders ; - -SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] ; - -KernelStaticLibrary rtl81xx_mii.a : - rgephy.c - rlphy.c -; - -SEARCH on [ FGristFiles rlphy.c ] = [ FDirName $(HAIKU_TOP) src add-ons kernel - drivers network rtl8139 dev mii ] ; - -ObjectHdrs [ FGristFiles rgephy$(SUFOBJ) rlphy$(SUFOBJ) ] - : [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCH)) libs - compat freebsd_network ] ; -Includes [ FGristFiles rgephy.c rlphy.c ] - : miidevs.h ; diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/rlphy.c b/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/rlphy.c new file mode 100644 index 0000000000..2afd3e0ecc --- /dev/null +++ b/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/rlphy.c @@ -0,0 +1,264 @@ +/*- + * Copyright (c) 1997, 1998, 1999 + * Bill Paul . All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Bill Paul. + * 4. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * driver for RealTek 8139 internal PHYs + */ + +#include +#include +#include +#include +#include +#include +#include /* XXXGL: if_rlreg.h contamination */ + +#include +#include +#include + +#include +#include +#include "miidevs.h" + +#include +#include + +#include "miibus_if.h" + +static int rlphy_probe(device_t); +static int rlphy_attach(device_t); + +static device_method_t rlphy_methods[] = { + /* device interface */ + DEVMETHOD(device_probe, rlphy_probe), + DEVMETHOD(device_attach, rlphy_attach), + DEVMETHOD(device_detach, mii_phy_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + DEVMETHOD_END +}; + +static devclass_t rlphy_devclass; + +static driver_t rlphy_driver = { + "rlphy", + rlphy_methods, + sizeof(struct mii_softc) +}; + +DRIVER_MODULE(rlphy, miibus, rlphy_driver, rlphy_devclass, 0, 0); + +static int rlphy_service(struct mii_softc *, struct mii_data *, int); +static void rlphy_status(struct mii_softc *); + +/* + * RealTek internal PHYs don't have vendor/device ID registers; + * re(4) and rl(4) fake up a return value of all zeros. + */ +static const struct mii_phydesc rlintphys[] = { + { 0, 0, "RealTek internal media interface" }, + MII_PHY_END +}; + +static const struct mii_phydesc rlphys[] = { + MII_PHY_DESC(yyREALTEK, RTL8201L), + MII_PHY_DESC(REALTEK, RTL8201E), + MII_PHY_DESC(xxICPLUS, IP101), + MII_PHY_END +}; + +static const struct mii_phy_funcs rlphy_funcs = { + rlphy_service, + rlphy_status, + mii_phy_reset +}; + +static int +rlphy_probe(device_t dev) +{ + int rv; + + rv = mii_phy_dev_probe(dev, rlphys, BUS_PROBE_DEFAULT); +#ifdef __HAIKU__ + if (rv == BUS_PROBE_DEFAULT) + return (rv); +#else + if (rv <= 0) + return (rv); +#endif + + if (mii_dev_mac_match(dev, "rl") || mii_dev_mac_match(dev, "re")) + return (mii_phy_dev_probe(dev, rlintphys, BUS_PROBE_DEFAULT)); + return (ENXIO); +} + +static int +rlphy_attach(device_t dev) +{ + + /* + * The RealTek PHY can never be isolated. + */ + mii_phy_dev_attach(dev, MIIF_NOISOLATE | MIIF_NOMANPAUSE, + &rlphy_funcs, 1); + return (0); +} + +static int +rlphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) +{ + + switch (cmd) { + case MII_POLLSTAT: + break; + + case MII_MEDIACHG: + mii_phy_setmedia(sc); + break; + + case MII_TICK: + /* + * The RealTek PHY's autonegotiation doesn't need to be + * kicked; it continues in the background. + */ + break; + } + + /* Update the media status. */ + PHY_STATUS(sc); + + /* Callback if something changed. */ + mii_phy_update(sc, cmd); + return (0); +} + +static void +rlphy_status(struct mii_softc *phy) +{ + struct mii_data *mii = phy->mii_pdata; + struct ifmedia_entry *ife = mii->mii_media.ifm_cur; + int bmsr, bmcr, anlpar; + + mii->mii_media_status = IFM_AVALID; + mii->mii_media_active = IFM_ETHER; + + bmsr = PHY_READ(phy, MII_BMSR) | PHY_READ(phy, MII_BMSR); + if (bmsr & BMSR_LINK) + mii->mii_media_status |= IFM_ACTIVE; + + bmcr = PHY_READ(phy, MII_BMCR); + if (bmcr & BMCR_ISO) { + mii->mii_media_active |= IFM_NONE; + mii->mii_media_status = 0; + return; + } + + if (bmcr & BMCR_LOOP) + mii->mii_media_active |= IFM_LOOP; + + if (bmcr & BMCR_AUTOEN) { + /* + * NWay autonegotiation takes the highest-order common + * bit of the ANAR and ANLPAR (i.e. best media advertised + * both by us and our link partner). + */ + if ((bmsr & BMSR_ACOMP) == 0) { + /* Erg, still trying, I guess... */ + mii->mii_media_active |= IFM_NONE; + return; + } + + if ((anlpar = PHY_READ(phy, MII_ANAR) & + PHY_READ(phy, MII_ANLPAR))) { + if (anlpar & ANLPAR_TX_FD) + mii->mii_media_active |= IFM_100_TX|IFM_FDX; + else if (anlpar & ANLPAR_T4) + mii->mii_media_active |= IFM_100_T4|IFM_HDX; + else if (anlpar & ANLPAR_TX) + mii->mii_media_active |= IFM_100_TX|IFM_HDX; + else if (anlpar & ANLPAR_10_FD) + mii->mii_media_active |= IFM_10_T|IFM_FDX; + else if (anlpar & ANLPAR_10) + mii->mii_media_active |= IFM_10_T|IFM_HDX; + else + mii->mii_media_active |= IFM_NONE; + if ((mii->mii_media_active & IFM_FDX) != 0) + mii->mii_media_active |= + mii_phy_flowstatus(phy); + return; + } + /* + * If the other side doesn't support NWAY, then the + * best we can do is determine if we have a 10Mbps or + * 100Mbps link. There's no way to know if the link + * is full or half duplex, so we default to half duplex + * and hope that the user is clever enough to manually + * change the media settings if we're wrong. + */ + + /* + * The RealTek PHY supports non-NWAY link speed + * detection, however it does not report the link + * detection results via the ANLPAR or BMSR registers. + * (What? RealTek doesn't do things the way everyone + * else does? I'm just shocked, shocked I tell you.) + * To determine the link speed, we have to do one + * of two things: + * + * - If this is a standalone RealTek RTL8201(L) or + * workalike PHY, we can determine the link speed by + * testing bit 0 in the magic, vendor-specific register + * at offset 0x19. + * + * - If this is a RealTek MAC with integrated PHY, we + * can test the 'SPEED10' bit of the MAC's media status + * register. + */ + if (!(phy->mii_mpd_model == 0 && phy->mii_mpd_rev == 0)) { + if (PHY_READ(phy, 0x0019) & 0x01) + mii->mii_media_active |= IFM_100_TX; + else + mii->mii_media_active |= IFM_10_T; + } else { + if (PHY_READ(phy, RL_MEDIASTAT) & + RL_MEDIASTAT_SPEED10) + mii->mii_media_active |= IFM_10_T; + else + mii->mii_media_active |= IFM_100_TX; + } + mii->mii_media_active |= IFM_HDX; + } else + mii->mii_media_active = ife->ifm_media; +} diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/Jamfile b/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/Jamfile deleted file mode 100644 index 9e7cc8a853..0000000000 --- a/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/Jamfile +++ /dev/null @@ -1,15 +0,0 @@ -SubDir HAIKU_TOP src add-ons kernel drivers network rtl81xx dev re ; - -UseHeaders [ FDirName $(SUBDIR) $(DOTDOT) $(DOTDOT) ] : true ; -UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ] : true ; - -UsePrivateHeaders net system ; -UsePrivateKernelHeaders ; - -SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] ; - -KernelAddon rtl81xx : - if_re.c - glue.c - : rtl81xx_mii.a libfreebsd_network.a -; diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/glue.c b/src/add-ons/kernel/drivers/network/rtl81xx/glue.c similarity index 100% rename from src/add-ons/kernel/drivers/network/rtl81xx/dev/re/glue.c rename to src/add-ons/kernel/drivers/network/rtl81xx/glue.c