summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/mii/files.mii6
-rw-r--r--sys/dev/mii/urlphy.c269
-rw-r--r--sys/dev/mii/urlphyreg.h43
3 files changed, 317 insertions, 1 deletions
diff --git a/sys/dev/mii/files.mii b/sys/dev/mii/files.mii
index 662b266b993..5eba00ad32f 100644
--- a/sys/dev/mii/files.mii
+++ b/sys/dev/mii/files.mii
@@ -1,4 +1,4 @@
-# $OpenBSD: files.mii,v 1.18 2002/03/08 05:50:55 jason Exp $
+# $OpenBSD: files.mii,v 1.19 2002/05/07 19:31:16 nate Exp $
# $NetBSD: files.mii,v 1.13 1998/11/05 00:36:48 thorpej Exp $
file dev/mii/mii.c mii
@@ -96,3 +96,7 @@ file dev/mii/amphy.c amphy
device nsgphy: mii_phy
attach nsgphy at mii
file dev/mii/nsgphy.c nsgphy
+
+device urlphy: mii_phy
+attach urlphy at mii
+file dev/mii/urlphy.c urlphy
diff --git a/sys/dev/mii/urlphy.c b/sys/dev/mii/urlphy.c
new file mode 100644
index 00000000000..9f7670f8d43
--- /dev/null
+++ b/sys/dev/mii/urlphy.c
@@ -0,0 +1,269 @@
+/* $OpenBSD: urlphy.c,v 1.1 2002/05/07 19:31:16 nate Exp $ */
+/* $NetBSD: urlphy.c,v 1.1 2002/03/28 21:07:53 ichiro Exp $ */
+/*
+ * Copyright (c) 2001, 2002
+ * Shingo WATANABE <nabe@nabechan.org>. 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 Shingo WATANABE.
+ * 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 THE AUTHOR 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 THE AUTHOR OR CONTRIBUTORS 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.
+ *
+ */
+
+/*
+ * driver for Realtek RL8150L internal phy
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/device.h>
+#include <sys/malloc.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+#include <net/if_media.h>
+
+#include <dev/mii/mii.h>
+#include <dev/mii/miivar.h>
+#include <dev/mii/miidevs.h>
+#include <dev/mii/urlphyreg.h>
+
+#define URLPHY_DEBUG 0
+#ifdef URLPHY_DEBUG
+#define DPRINTF(x) if (urlphydebug) printf x
+#define DPRINTFN(n,x) if (urlphydebug>(n)) printf x
+int urlphydebug = URLPHY_DEBUG;
+#else
+#define DPRINTF(x)
+#define DPRINTFN(n,x)
+#endif
+
+int urlphy_match(struct device *, void *, void *);
+void urlphy_attach(struct device *, struct device *, void *);
+
+struct cfattach urlphy_ca = {
+ sizeof(struct mii_softc), urlphy_match, urlphy_attach, mii_phy_detach,
+ mii_phy_activate
+};
+
+struct cfdriver urlphy_cd = {
+ NULL, "urlphy", DV_DULL
+};
+
+int urlphy_service(struct mii_softc *, struct mii_data *, int);
+void urlphy_status(struct mii_softc *);
+
+int
+urlphy_match(struct device *parent, void *match, void *aux)
+{
+ struct mii_attach_args *ma = aux;
+
+ /*
+ * RTL8150 reports OUT == 0, MODEL == 0
+ */
+ if (MII_OUI(ma->mii_id1, ma->mii_id2) != 0 &&
+ MII_MODEL(ma->mii_id2) != 0)
+ return (0);
+
+ /*
+ * Make sure the parent is an 'url' device.
+ */
+ if (strcmp(parent->dv_cfdata->cf_driver->cd_name, "url") != 0)
+ return(0);
+
+ return (10);
+}
+
+void
+urlphy_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct mii_softc *sc = (struct mii_softc *)self;
+ struct mii_attach_args *ma = aux;
+ struct mii_data *mii = ma->mii_data;
+
+ printf(": Realtek RTL8150L internal media interface\n");
+
+ DPRINTF(("%s: %s: enter\n", sc->mii_dev.dv_xname, __FUNCTION__));
+
+ sc->mii_inst = mii->mii_instance;
+ sc->mii_phy = ma->mii_phyno;
+ sc->mii_service = urlphy_service;
+ sc->mii_status = urlphy_status;
+ sc->mii_pdata = mii;
+ sc->mii_flags = mii->mii_flags;
+ sc->mii_anegticks = 10;
+
+ /* Don't do loopback on this PHY. */
+ sc->mii_flags |= MIIF_NOLOOP;
+ /* Don't do isolate on this PHY. */
+ sc->mii_flags |= MIIF_NOISOLATE;
+
+ if (mii->mii_instance != 0) {
+ printf("%s: ignoring this PHY, non-zero instance\n",
+ sc->mii_dev.dv_xname);
+ return;
+ }
+ mii_phy_reset(sc);
+
+ sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask;
+ printf("%s: ", sc->mii_dev.dv_xname);
+ if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0)
+ printf("no media present");
+ else
+ mii_phy_add_media(sc);
+ printf("\n");
+}
+
+int
+urlphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
+{
+ struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+ int reg;
+
+ DPRINTF(("%s: %s: enter\n", sc->mii_dev.dv_xname, __FUNCTION__));
+
+ if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
+ return (ENXIO);
+
+ switch (cmd) {
+ case MII_POLLSTAT:
+ /*
+ * If we're not polling our PHY instance, just return.
+ */
+ if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+ return (0);
+ break;
+
+ case MII_MEDIACHG:
+ /*
+ * If we're not currently selected, just return.
+ */
+ if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+ return (0);
+
+ /* If the interface is not up, don't do anything. */
+ if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
+ break;
+
+ mii_phy_setmedia(sc);
+ break;
+
+ case MII_TICK:
+ /*
+ * If we're not currently selected, just return.
+ */
+ if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+ return (0);
+
+ /* Just bail now if the interface is down. */
+ if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
+ return (0);
+
+ /*
+ * If we're not doing autonegotiation, we don't need to do
+ * any extra work here. However, we need to check the link
+ * status so we can generate an announcement if the status
+ * changes.
+ */
+ if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+ return (0);
+
+ /* Read the status register twice; MSR_LINK is latch-low. */
+ reg = PHY_READ(sc, URLPHY_MSR) | PHY_READ(sc, URLPHY_MSR);
+ if (reg & URLPHY_MSR_LINK)
+ return (0);
+
+ /*
+ * Only retry autonegotiation every N seconds.
+ */
+ KASSERT(sc->mii_anegticks != 0);
+ if (++sc->mii_ticks != sc->mii_anegticks)
+ return (0);
+
+ sc->mii_ticks = 0;
+ mii_phy_reset(sc);
+
+ if (mii_phy_auto(sc, 0) == EJUSTRETURN)
+ return (0);
+
+ break;
+
+ case MII_DOWN:
+ mii_phy_down(sc);
+ return (0);
+ }
+
+ /* Update the media status. */
+ mii_phy_status(sc);
+
+ /* Callback if something changed. */
+ mii_phy_update(sc, cmd);
+
+ return (0);
+}
+
+void
+urlphy_status(struct mii_softc *sc)
+{
+ struct mii_data *mii = sc->mii_pdata;
+ struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+ int msr, bmsr, bmcr;
+
+ DPRINTF(("%s: %s: enter\n", sc->mii_dev.dv_xname, __FUNCTION__));
+
+ mii->mii_media_status = IFM_AVALID;
+ mii->mii_media_active = IFM_ETHER;
+
+ /*
+ * The link status bit is not exist in the BMSR register,
+ * so we need to read the MSR register to get link status.
+ */
+ msr = PHY_READ(sc, URLPHY_MSR) | PHY_READ(sc, URLPHY_MSR);
+ if (msr & URLPHY_MSR_LINK)
+ mii->mii_media_status |= IFM_ACTIVE;
+
+ DPRINTF(("%s: %s: link %s\n", sc->mii_dev.dv_xname, __FUNCTION__,
+ mii->mii_media_status & IFM_ACTIVE ? "up" : "down"));
+
+ bmcr = PHY_READ(sc, MII_BMCR);
+ if (bmcr & BMCR_AUTOEN) {
+ bmsr = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR);
+ if ((bmsr & BMSR_ACOMP) == 0) {
+ /* Erg, still trying, I guess... */
+ mii->mii_media_active |= IFM_NONE;
+ return;
+ }
+
+ if (msr & URLPHY_MSR_SPEED_100)
+ mii->mii_media_active |= IFM_100_TX;
+ else
+ mii->mii_media_active |= IFM_10_T;
+ if (msr & URLPHY_MSR_DUPLEX)
+ mii->mii_media_active |= IFM_FDX;
+ } else
+ mii->mii_media_active = ife->ifm_media;
+}
diff --git a/sys/dev/mii/urlphyreg.h b/sys/dev/mii/urlphyreg.h
new file mode 100644
index 00000000000..60131939044
--- /dev/null
+++ b/sys/dev/mii/urlphyreg.h
@@ -0,0 +1,43 @@
+/* $NetBSD: urlphyreg.h,v 1.1 2002/03/28 21:07:54 ichiro Exp $ */
+/*
+ * Copyright (c) 2001, 2002
+ * Shingo WATANABE <nabe@nabechan.org>. 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 Shingo WATANABE.
+ * 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 THE AUTHOR 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 THE AUTHOR OR CONTRIBUTORS 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.
+ *
+ */
+
+/* Media Status Register */
+#define URLPHY_MSR 0x137
+#define URLPHY_MSR_TXFCE (1<<7)
+#define URLPHY_MSR_RXFCE (1<<6)
+#define URLPHY_MSR_DUPLEX (1<<4)
+#define URLPHY_MSR_SPEED_100 (1<<3)
+#define URLPHY_MSR_LINK (1<<2)
+#define URLPHY_MSR_TXPF (1<<1)
+#define URLPHY_MSR_RXPF (1<<0)