[haiku-commits] r42312 - haiku/vendor/freebsd/current/dev/mii

  • From: korli@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 25 Jun 2011 12:49:29 +0200 (CEST)

Author: korli
Date: 2011-06-25 12:49:28 +0200 (Sat, 25 Jun 2011)
New Revision: 42312
Changeset: https://dev.haiku-os.org/changeset/42312

Added:
   haiku/vendor/freebsd/current/dev/mii/mii.c
   haiku/vendor/freebsd/current/dev/mii/mii.h
   haiku/vendor/freebsd/current/dev/mii/miivar.h
Modified:
   haiku/vendor/freebsd/current/dev/mii/miidevs
Log:
updating to FreeBSD 8.2 release


Added: haiku/vendor/freebsd/current/dev/mii/mii.c
===================================================================
--- haiku/vendor/freebsd/current/dev/mii/mii.c                          (rev 0)
+++ haiku/vendor/freebsd/current/dev/mii/mii.c  2011-06-25 10:49:28 UTC (rev 
42312)
@@ -0,0 +1,574 @@
+/*     $NetBSD: mii.c,v 1.12 1999/08/03 19:41:49 drochner Exp $        */
+
+/*-
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * MII bus layer, glues MII-capable network interface drivers to sharable
+ * PHY drivers.  This exports an interface compatible with BSD/OS 3.0's,
+ * plus some NetBSD extensions.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/socket.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+#include <sys/bus.h> 
+
+#include <net/if.h>
+#include <net/if_media.h>
+#include <net/route.h>
+
+#include <dev/mii/mii.h>
+#include <dev/mii/miivar.h>
+
+MODULE_VERSION(miibus, 1);
+
+#include "miibus_if.h"
+
+static int miibus_print_child(device_t dev, device_t child);
+static int miibus_read_ivar(device_t dev, device_t child, int which,
+    uintptr_t *result);
+static int miibus_child_location_str(device_t bus, device_t child, char *buf,
+    size_t buflen);
+static int miibus_child_pnpinfo_str(device_t bus, device_t child, char *buf,
+    size_t buflen);
+static int miibus_readreg(device_t, int, int);
+static int miibus_writereg(device_t, int, int, int);
+static void miibus_statchg(device_t);
+static void miibus_linkchg(device_t);
+static void miibus_mediainit(device_t);
+
+static device_method_t miibus_methods[] = {
+       /* device interface */
+       DEVMETHOD(device_probe,         miibus_probe),
+       DEVMETHOD(device_attach,        miibus_attach),
+       DEVMETHOD(device_detach,        miibus_detach),
+       DEVMETHOD(device_shutdown,      bus_generic_shutdown),
+
+       /* bus interface */
+       DEVMETHOD(bus_print_child,      miibus_print_child),
+       DEVMETHOD(bus_read_ivar,        miibus_read_ivar),
+       DEVMETHOD(bus_driver_added,     bus_generic_driver_added),
+       DEVMETHOD(bus_child_pnpinfo_str, miibus_child_pnpinfo_str),
+       DEVMETHOD(bus_child_location_str, miibus_child_location_str),
+
+       /* MII interface */
+       DEVMETHOD(miibus_readreg,       miibus_readreg),
+       DEVMETHOD(miibus_writereg,      miibus_writereg),
+       DEVMETHOD(miibus_statchg,       miibus_statchg),    
+       DEVMETHOD(miibus_linkchg,       miibus_linkchg),    
+       DEVMETHOD(miibus_mediainit,     miibus_mediainit),    
+
+       { 0, 0 }
+};
+
+devclass_t miibus_devclass;
+
+driver_t miibus_driver = {
+       "miibus",
+       miibus_methods,
+       sizeof(struct mii_data)
+};
+
+struct miibus_ivars {
+       struct ifnet    *ifp;
+       ifm_change_cb_t ifmedia_upd;
+       ifm_stat_cb_t   ifmedia_sts;
+       int             mii_flags;
+};
+
+int
+miibus_probe(device_t dev)
+{
+
+       device_set_desc(dev, "MII bus");
+
+       return (BUS_PROBE_SPECIFIC);
+}
+
+int
+miibus_attach(device_t dev)
+{
+       struct miibus_ivars     *ivars;
+       struct mii_attach_args  *ma;
+       struct mii_data         *mii;
+       device_t                *children;
+       int                     i, nchildren;
+
+       mii = device_get_softc(dev);
+       nchildren = 0;
+       if (device_get_children(dev, &children, &nchildren) == 0) {
+               for (i = 0; i < nchildren; i++) {
+                       ma = device_get_ivars(children[i]);
+                       ma->mii_data = mii;
+               }
+               free(children, M_TEMP);
+       }
+       if (nchildren == 0) {
+               device_printf(dev, "cannot get children\n");
+               return (ENXIO);
+       }
+       ivars = device_get_ivars(dev);
+       ifmedia_init(&mii->mii_media, IFM_IMASK, ivars->ifmedia_upd,
+           ivars->ifmedia_sts);
+       mii->mii_ifp = ivars->ifp;
+       mii->mii_ifp->if_capabilities |= IFCAP_LINKSTATE;
+       mii->mii_ifp->if_capenable |= IFCAP_LINKSTATE;
+       LIST_INIT(&mii->mii_phys);
+
+       return (bus_generic_attach(dev));
+}
+
+int
+miibus_detach(device_t dev)
+{
+       struct mii_data         *mii;
+
+       bus_generic_detach(dev);
+       mii = device_get_softc(dev);
+       ifmedia_removeall(&mii->mii_media);
+       mii->mii_ifp = NULL;
+
+       return (0);
+}
+
+static int
+miibus_print_child(device_t dev, device_t child)
+{
+       struct mii_attach_args *ma;
+       int retval;
+
+       ma = device_get_ivars(child);
+       retval = bus_print_child_header(dev, child);
+       retval += printf(" PHY %d", ma->mii_phyno);
+       retval += bus_print_child_footer(dev, child);
+
+       return (retval);
+}
+
+static int
+miibus_read_ivar(device_t dev, device_t child __unused, int which,
+    uintptr_t *result)
+{
+       struct miibus_ivars *ivars;
+
+       /*
+        * NB: this uses the instance variables of the miibus rather than
+        * its PHY children.
+        */
+       ivars = device_get_ivars(dev);
+       switch (which) {
+       case MIIBUS_IVAR_FLAGS:
+               *result = ivars->mii_flags;
+               break;
+       default:
+               return (ENOENT);
+       }
+       return (0);
+}
+
+static int
+miibus_child_pnpinfo_str(device_t bus __unused, device_t child, char *buf,
+    size_t buflen)
+{
+       struct mii_attach_args *ma;
+
+       ma = device_get_ivars(child);
+       snprintf(buf, buflen, "oui=0x%x model=0x%x rev=0x%x",
+           MII_OUI(ma->mii_id1, ma->mii_id2),
+           MII_MODEL(ma->mii_id2), MII_REV(ma->mii_id2));
+       return (0);
+}
+
+static int
+miibus_child_location_str(device_t bus __unused, device_t child, char *buf,
+    size_t buflen)
+{
+       struct mii_attach_args *ma;
+
+       ma = device_get_ivars(child);
+       snprintf(buf, buflen, "phyno=%d", ma->mii_phyno);
+       return (0);
+}
+
+static int
+miibus_readreg(device_t dev, int phy, int reg)
+{
+       device_t                parent;
+
+       parent = device_get_parent(dev);
+       return (MIIBUS_READREG(parent, phy, reg));
+}
+
+static int
+miibus_writereg(device_t dev, int phy, int reg, int data)
+{
+       device_t                parent;
+
+       parent = device_get_parent(dev);
+       return (MIIBUS_WRITEREG(parent, phy, reg, data));
+}
+
+static void
+miibus_statchg(device_t dev)
+{
+       device_t                parent;
+       struct mii_data         *mii;
+       struct ifnet            *ifp;
+
+       parent = device_get_parent(dev);
+       MIIBUS_STATCHG(parent);
+
+       mii = device_get_softc(dev);
+
+       /*
+        * Note that each NIC's softc must start with an ifnet pointer.
+        * XXX: EVIL HACK!
+        */
+       ifp = *(struct ifnet **)device_get_softc(parent);
+       ifp->if_baudrate = ifmedia_baudrate(mii->mii_media_active);
+}
+
+static void
+miibus_linkchg(device_t dev)
+{
+       struct mii_data         *mii;
+       device_t                parent;
+       int                     link_state;
+
+       parent = device_get_parent(dev);
+       MIIBUS_LINKCHG(parent);
+
+       mii = device_get_softc(dev);
+       
+       if (mii->mii_media_status & IFM_AVALID) {
+               if (mii->mii_media_status & IFM_ACTIVE)
+                       link_state = LINK_STATE_UP;
+               else
+                       link_state = LINK_STATE_DOWN;
+       } else
+               link_state = LINK_STATE_UNKNOWN;
+       /*
+        * Note that each NIC's softc must start with an ifnet pointer.
+        * XXX: EVIL HACK!
+        */
+       if_link_state_change(*(struct ifnet**)device_get_softc(parent), 
link_state);
+}
+
+static void
+miibus_mediainit(device_t dev)
+{
+       struct mii_data         *mii;
+       struct ifmedia_entry    *m;
+       int                     media = 0;
+
+       /* Poke the parent in case it has any media of its own to add. */
+       MIIBUS_MEDIAINIT(device_get_parent(dev));
+
+       mii = device_get_softc(dev);
+       LIST_FOREACH(m, &mii->mii_media.ifm_list, ifm_list) {
+               media = m->ifm_media;
+               if (media == (IFM_ETHER | IFM_AUTO))
+                       break;
+       }
+
+       ifmedia_set(&mii->mii_media, media);
+}
+
+/*
+ * Helper function used by network interface drivers, attaches the miibus and
+ * the PHYs to the network interface driver parent.
+ */
+int
+mii_attach(device_t dev, device_t *miibus, struct ifnet *ifp,
+    ifm_change_cb_t ifmedia_upd, ifm_stat_cb_t ifmedia_sts, int capmask,
+    int phyloc, int offloc, int flags)
+{
+       struct miibus_ivars *ivars;
+       struct mii_attach_args ma, *args;
+       device_t *children, phy;
+       int bmsr, first, i, nchildren, offset, phymax, phymin, rv;
+
+       if (phyloc != MII_PHY_ANY && offloc != MII_OFFSET_ANY) {
+               printf("%s: phyloc and offloc specified\n", __func__);
+               return (EINVAL);
+       }
+
+       if (offloc != MII_OFFSET_ANY && (offloc < 0 || offloc >= MII_NPHY)) {
+               printf("%s: ivalid offloc %d\n", __func__, offloc);
+               return (EINVAL);
+       }
+
+       if (phyloc == MII_PHY_ANY) {
+               phymin = 0;
+               phymax = MII_NPHY - 1;
+       } else {
+               if (phyloc < 0 || phyloc >= MII_NPHY) {
+                       printf("%s: ivalid phyloc %d\n", __func__, phyloc);
+                       return (EINVAL);
+               }
+               phymin = phymax = phyloc;
+       }
+
+       first = 0;
+       if (*miibus == NULL) {
+               first = 1;
+               ivars = malloc(sizeof(*ivars), M_DEVBUF, M_NOWAIT);
+               if (ivars == NULL)
+                       return (ENOMEM);
+               ivars->ifp = ifp;
+               ivars->ifmedia_upd = ifmedia_upd;
+               ivars->ifmedia_sts = ifmedia_sts;
+               ivars->mii_flags = flags;
+               *miibus = device_add_child(dev, "miibus", -1);
+               if (*miibus == NULL) {
+                       rv = ENXIO;
+                       goto fail;
+               }
+               device_set_ivars(*miibus, ivars);
+       } else {
+               ivars = device_get_ivars(*miibus);
+               if (ivars->ifp != ifp || ivars->ifmedia_upd != ifmedia_upd ||
+                   ivars->ifmedia_sts != ifmedia_sts ||
+                   ivars->mii_flags != flags) {
+                       printf("%s: non-matching invariant\n", __func__);
+                       return (EINVAL);
+               }
+               /*
+                * Assignment of the attach arguments mii_data for the first
+                * pass is done in miibus_attach(), i.e. once the miibus softc
+                * has been allocated.
+                */
+               ma.mii_data = device_get_softc(*miibus);
+       } 
+
+       ma.mii_capmask = capmask;
+
+       phy = NULL;
+       offset = 0;
+       for (ma.mii_phyno = phymin; ma.mii_phyno <= phymax; ma.mii_phyno++) {
+               /*
+                * Make sure we haven't already configured a PHY at this
+                * address.  This allows mii_attach() to be called
+                * multiple times.
+                */
+               if (device_get_children(*miibus, &children, &nchildren) == 0) {
+                       for (i = 0; i < nchildren; i++) {
+                               args = device_get_ivars(children[i]);
+                               if (args->mii_phyno == ma.mii_phyno) {
+                                       /*
+                                        * Yes, there is already something
+                                        * configured at this address.
+                                        */
+                                       free(children, M_TEMP);
+                                       goto skip;
+                               }
+                       }
+                       free(children, M_TEMP);
+               }
+
+               /*
+                * Check to see if there is a PHY at this address.  Note,
+                * many braindead PHYs report 0/0 in their ID registers,
+                * so we test for media in the BMSR.
+                */
+               bmsr = MIIBUS_READREG(dev, ma.mii_phyno, MII_BMSR);
+               if (bmsr == 0 || bmsr == 0xffff ||
+                   (bmsr & (BMSR_EXTSTAT | BMSR_MEDIAMASK)) == 0) {
+                       /* Assume no PHY at this address. */
+                       continue;
+               }
+
+               /*
+                * There is a PHY at this address.  If we were given an
+                * `offset' locator, skip this PHY if it doesn't match.
+                */
+               if (offloc != MII_OFFSET_ANY && offloc != offset)
+                       goto skip;
+
+               /*
+                * Extract the IDs. Braindead PHYs will be handled by
+                * the `ukphy' driver, as we have no ID information to
+                * match on.
+                */
+               ma.mii_id1 = MIIBUS_READREG(dev, ma.mii_phyno, MII_PHYIDR1);
+               ma.mii_id2 = MIIBUS_READREG(dev, ma.mii_phyno, MII_PHYIDR2);
+
+               args = malloc(sizeof(struct mii_attach_args), M_DEVBUF,
+                   M_NOWAIT);
+               if (args == NULL)
+                       goto skip;
+               bcopy((char *)&ma, (char *)args, sizeof(ma));
+               phy = device_add_child(*miibus, NULL, -1);
+               if (phy == NULL) {
+                       free(args, M_DEVBUF);
+                       goto skip;
+               }
+               device_set_ivars(phy, args);
+ skip:
+               offset++;
+       }
+
+       if (first != 0) {
+               if (phy == NULL) {
+                       rv = ENXIO;
+                       goto fail;
+               }
+               rv = bus_generic_attach(dev);
+               if (rv != 0)
+                       goto fail;
+
+               /* Attaching of the PHY drivers is done in miibus_attach(). */
+               return (0);
+       }
+       rv = bus_generic_attach(*miibus);
+       if (rv != 0)
+               goto fail;
+
+       return (0);
+
+ fail:
+       if (*miibus != NULL)
+               device_delete_child(dev, *miibus);
+       free(ivars, M_DEVBUF);
+       if (first != 0)
+               *miibus = NULL;
+       return (rv);
+}
+
+int
+mii_phy_probe(device_t dev, device_t *child, ifm_change_cb_t ifmedia_upd,
+    ifm_stat_cb_t ifmedia_sts)
+{
+       struct ifnet *ifp;
+
+       /*
+        * Note that each NIC's softc must start with an ifnet pointer.
+        * XXX: EVIL HACK!
+        */
+       ifp = *(struct ifnet **)device_get_softc(dev);
+       return (mii_attach(dev, child, ifp, ifmedia_upd, ifmedia_sts,
+           BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY, 0));
+}
+
+/*
+ * Media changed; notify all PHYs.
+ */
+int
+mii_mediachg(struct mii_data *mii)
+{
+       struct mii_softc *child;
+       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       int rv;
+
+       mii->mii_media_status = 0;
+       mii->mii_media_active = IFM_NONE;
+
+       LIST_FOREACH(child, &mii->mii_phys, mii_list) {
+               /*
+                * If the media indicates a different PHY instance,
+                * isolate this one.
+                */
+               if (IFM_INST(ife->ifm_media) != child->mii_inst) {
+                       if ((child->mii_flags & MIIF_NOISOLATE) != 0) {
+                               device_printf(child->mii_dev, "%s: "
+                                   "can't handle non-zero PHY instance %d\n",
+                                   __func__, child->mii_inst);
+                               continue;
+                       }
+                       PHY_WRITE(child, MII_BMCR, PHY_READ(child, MII_BMCR) |
+                           BMCR_ISO);
+                       continue;
+               }
+               rv = (*child->mii_service)(child, mii, MII_MEDIACHG);
+               if (rv)
+                       return (rv);
+       }
+       return (0);
+}
+
+/*
+ * Call the PHY tick routines, used during autonegotiation.
+ */
+void
+mii_tick(struct mii_data *mii)
+{
+       struct mii_softc *child;
+       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+
+       LIST_FOREACH(child, &mii->mii_phys, mii_list) {
+               /*
+                * If this PHY instance isn't currently selected, just skip
+                * it.
+                */
+               if (IFM_INST(ife->ifm_media) != child->mii_inst)
+                       continue;
+               (void)(*child->mii_service)(child, mii, MII_TICK);
+       }
+}
+
+/*
+ * Get media status from PHYs.
+ */
+void
+mii_pollstat(struct mii_data *mii)
+{
+       struct mii_softc *child;
+       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+
+       mii->mii_media_status = 0;
+       mii->mii_media_active = IFM_NONE;
+
+       LIST_FOREACH(child, &mii->mii_phys, mii_list) {
+               /*
+                * If we're not polling this PHY instance, just skip it.
+                */
+               if (IFM_INST(ife->ifm_media) != child->mii_inst)
+                       continue;
+               (void)(*child->mii_service)(child, mii, MII_POLLSTAT);
+       }
+}
+
+/*
+ * Inform the PHYs that the interface is down.
+ */
+void
+mii_down(struct mii_data *mii)
+{
+       struct mii_softc *child;
+
+       LIST_FOREACH(child, &mii->mii_phys, mii_list)
+               mii_phy_down(child);
+}

Added: haiku/vendor/freebsd/current/dev/mii/mii.h
===================================================================
--- haiku/vendor/freebsd/current/dev/mii/mii.h                          (rev 0)
+++ haiku/vendor/freebsd/current/dev/mii/mii.h  2011-06-25 10:49:28 UTC (rev 
42312)
@@ -0,0 +1,212 @@
+/*     $NetBSD: mii.h,v 1.9 2001/05/31 03:07:14 thorpej Exp $  */
+
+/*-
+ * Copyright (c) 1997 Manuel Bouyer.  All rights reserved.
+ *
+ * Modification to match BSD/OS 3.0 MII interface by Jason R. Thorpe,
+ * Numerical Aerospace Simulation Facility, NASA Ames Research Center.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _DEV_MII_MII_H_
+#define        _DEV_MII_MII_H_
+
+/*
+ * Registers common to all PHYs.
+ */
+
+#define        MII_NPHY        32      /* max # of PHYs per MII */
+
+/*
+ * MII commands, used if a device must drive the MII lines
+ * manually.
+ */
+#define        MII_COMMAND_START       0x01
+#define        MII_COMMAND_READ        0x02
+#define        MII_COMMAND_WRITE       0x01
+#define        MII_COMMAND_ACK         0x02
+
+#define        MII_BMCR        0x00    /* Basic mode control register (rw) */
+#define        BMCR_RESET      0x8000  /* reset */
+#define        BMCR_LOOP       0x4000  /* loopback */
+#define        BMCR_SPEED0     0x2000  /* speed selection (LSB) */
+#define        BMCR_AUTOEN     0x1000  /* autonegotiation enable */
+#define        BMCR_PDOWN      0x0800  /* power down */
+#define        BMCR_ISO        0x0400  /* isolate */
+#define        BMCR_STARTNEG   0x0200  /* restart autonegotiation */
+#define        BMCR_FDX        0x0100  /* Set duplex mode */
+#define        BMCR_CTEST      0x0080  /* collision test */
+#define        BMCR_SPEED1     0x0040  /* speed selection (MSB) */
+
+#define        BMCR_S10        0x0000          /* 10 Mb/s */
+#define        BMCR_S100       BMCR_SPEED0     /* 100 Mb/s */
+#define        BMCR_S1000      BMCR_SPEED1     /* 1000 Mb/s */
+
+#define        BMCR_SPEED(x)   ((x) & (BMCR_SPEED0|BMCR_SPEED1))
+
+#define        MII_BMSR        0x01    /* Basic mode status register (ro) */
+#define        BMSR_100T4      0x8000  /* 100 base T4 capable */
+#define        BMSR_100TXFDX   0x4000  /* 100 base Tx full duplex capable */
+#define        BMSR_100TXHDX   0x2000  /* 100 base Tx half duplex capable */
+#define        BMSR_10TFDX     0x1000  /* 10 base T full duplex capable */
+#define        BMSR_10THDX     0x0800  /* 10 base T half duplex capable */
+#define        BMSR_100T2FDX   0x0400  /* 100 base T2 full duplex capable */
+#define        BMSR_100T2HDX   0x0200  /* 100 base T2 half duplex capable */
+#define        BMSR_EXTSTAT    0x0100  /* Extended status in register 15 */
+#define        BMSR_MFPS       0x0040  /* MII Frame Preamble Suppression */
+#define        BMSR_ACOMP      0x0020  /* Autonegotiation complete */
+#define        BMSR_RFAULT     0x0010  /* Link partner fault */
+#define        BMSR_ANEG       0x0008  /* Autonegotiation capable */
+#define        BMSR_LINK       0x0004  /* Link status */
+#define        BMSR_JABBER     0x0002  /* Jabber detected */
+#define        BMSR_EXTCAP     0x0001  /* Extended capability */
+
+#define        BMSR_DEFCAPMASK 0xffffffff
+
+/*
+ * Note that the EXTSTAT bit indicates that there is extended status
+ * info available in register 15, but 802.3 section 22.2.4.3 also
+ * states that that all 1000 Mb/s capable PHYs will set this bit to 1.
+ */
+#if 0
+#define        BMSR_MEDIAMASK  
(BMSR_100T4|BMSR_100TXFDX|BMSR_100TXHDX|BMSR_10TFDX| \
+                        BMSR_10THDX|BMSR_ANEG)
+
+#else
+/* NetBSD uses: */
+#define        BMSR_MEDIAMASK  (BMSR_100T4|BMSR_100TXFDX|BMSR_100TXHDX| \
+                        BMSR_10TFDX|BMSR_10THDX|BMSR_100T2FDX|BMSR_100T2HDX)
+#endif
+
+/*
+ * Convert BMSR media capabilities to ANAR bits for autonegotiation.
+ * Note the shift chopps off the BMSR_ANEG bit.
+ */
+#define        BMSR_MEDIA_TO_ANAR(x)   (((x) & BMSR_MEDIAMASK) >> 6)
+
+#define        MII_PHYIDR1     0x02    /* ID register 1 (ro) */
+
+#define        MII_PHYIDR2     0x03    /* ID register 2 (ro) */
+#define        IDR2_OUILSB     0xfc00  /* OUI LSB */
+#define        IDR2_MODEL      0x03f0  /* vendor model */
+#define        IDR2_REV        0x000f  /* vendor revision */
+
+#define        MII_OUI(id1, id2)       (((id1) << 6) | ((id2) >> 10))
+#define        MII_MODEL(id2)          (((id2) & IDR2_MODEL) >> 4)
+#define        MII_REV(id2)            ((id2) & IDR2_REV)
+
+#define        MII_ANAR        0x04    /* Autonegotiation advertisement (rw) */
+               /* section 28.2.4.1 and 37.2.6.1 */
+#define ANAR_NP                0x8000  /* Next page (ro) */
+#define        ANAR_ACK        0x4000  /* link partner abilities acknowledged 
(ro) */
+#define ANAR_RF                0x2000  /* remote fault (ro) */
+#define        ANAR_FC         0x0400  /* local device supports PAUSE */
+#define ANAR_T4                0x0200  /* local device supports 100bT4 */
+#define ANAR_TX_FD     0x0100  /* local device supports 100bTx FD */
+#define ANAR_TX                0x0080  /* local device supports 100bTx */
+#define ANAR_10_FD     0x0040  /* local device supports 10bT FD */
+#define ANAR_10                0x0020  /* local device supports 10bT */
+#define        ANAR_CSMA       0x0001  /* protocol selector CSMA/CD */
+#define        ANAR_PAUSE_NONE         (0 << 10)
+#define        ANAR_PAUSE_SYM          (1 << 10)
+#define        ANAR_PAUSE_ASYM         (2 << 10)
+#define        ANAR_PAUSE_TOWARDS      (3 << 10)
+
+#define        ANAR_X_FD       0x0020  /* local device supports 1000BASE-X FD 
*/
+#define        ANAR_X_HD       0x0040  /* local device supports 1000BASE-X HD 
*/
+#define        ANAR_X_PAUSE_NONE       (0 << 7)
+#define        ANAR_X_PAUSE_SYM        (1 << 7)
+#define        ANAR_X_PAUSE_ASYM       (2 << 7)
+#define        ANAR_X_PAUSE_TOWARDS    (3 << 7)
+
+#define        MII_ANLPAR      0x05    /* Autonegotiation lnk partner 
abilities (rw) */
+               /* section 28.2.4.1 and 37.2.6.1 */
+#define ANLPAR_NP      0x8000  /* Next page (ro) */
+#define        ANLPAR_ACK      0x4000  /* link partner accepted ACK (ro) */
+#define ANLPAR_RF      0x2000  /* remote fault (ro) */
+#define        ANLPAR_FC       0x0400  /* link partner supports PAUSE */
+#define ANLPAR_T4      0x0200  /* link partner supports 100bT4 */
+#define ANLPAR_TX_FD   0x0100  /* link partner supports 100bTx FD */
+#define ANLPAR_TX      0x0080  /* link partner supports 100bTx */
+#define ANLPAR_10_FD   0x0040  /* link partner supports 10bT FD */
+#define ANLPAR_10      0x0020  /* link partner supports 10bT */
+#define        ANLPAR_CSMA     0x0001  /* protocol selector CSMA/CD */
+#define        ANLPAR_PAUSE_MASK       (3 << 10)
+#define        ANLPAR_PAUSE_NONE       (0 << 10)
+#define        ANLPAR_PAUSE_SYM        (1 << 10)
+#define        ANLPAR_PAUSE_ASYM       (2 << 10)
+#define        ANLPAR_PAUSE_TOWARDS    (3 << 10)
+
+#define        ANLPAR_X_FD     0x0020  /* local device supports 1000BASE-X FD 
*/
+#define        ANLPAR_X_HD     0x0040  /* local device supports 1000BASE-X HD 
*/
+#define        ANLPAR_X_PAUSE_MASK     (3 << 7)
+#define        ANLPAR_X_PAUSE_NONE     (0 << 7)
+#define        ANLPAR_X_PAUSE_SYM      (1 << 7)
+#define        ANLPAR_X_PAUSE_ASYM     (2 << 7)
+#define        ANLPAR_X_PAUSE_TOWARDS  (3 << 7)
+
+#define        MII_ANER        0x06    /* Autonegotiation expansion (ro) */
+               /* section 28.2.4.1 and 37.2.6.1 */
+#define ANER_MLF       0x0010  /* multiple link detection fault */
+#define ANER_LPNP      0x0008  /* link parter next page-able */
+#define ANER_NP                0x0004  /* next page-able */
+#define ANER_PAGE_RX   0x0002  /* Page received */
+#define ANER_LPAN      0x0001  /* link parter autoneg-able */
+
+#define        MII_ANNP        0x07    /* Autonegotiation next page */
+               /* section 28.2.4.1 and 37.2.6.1 */
+
+#define        MII_ANLPRNP     0x08    /* Autonegotiation link partner rx next 
page */
+               /* section 32.5.1 and 37.2.6.1 */
+
+                       /* This is also the 1000baseT control register */
+#define        MII_100T2CR     0x09    /* 100base-T2 control register */
+#define        GTCR_TEST_MASK  0xe000  /* see 802.3ab ss. 40.6.1.1.2 */
+#define        GTCR_MAN_MS     0x1000  /* enable manual master/slave control */
+#define        GTCR_ADV_MS     0x0800  /* 1 = adv. master, 0 = adv. slave */
+#define        GTCR_PORT_TYPE  0x0400  /* 1 = DCE, 0 = DTE (NIC) */
+#define        GTCR_ADV_1000TFDX 0x0200 /* adv. 1000baseT FDX */
+#define        GTCR_ADV_1000THDX 0x0100 /* adv. 1000baseT HDX */
+
+                       /* This is also the 1000baseT status register */
+#define        MII_100T2SR     0x0a    /* 100base-T2 status register */
+#define        GTSR_MAN_MS_FLT 0x8000  /* master/slave config fault */
+#define        GTSR_MS_RES     0x4000  /* result: 1 = master, 0 = slave */
+#define        GTSR_LRS        0x2000  /* local rx status, 1 = ok */
+#define        GTSR_RRS        0x1000  /* remove rx status, 1 = ok */
+#define        GTSR_LP_1000TFDX 0x0800 /* link partner 1000baseT FDX capable */
+#define        GTSR_LP_1000THDX 0x0400 /* link partner 1000baseT HDX capable */
+#define        GTSR_LP_ASM_DIR 0x0200  /* link partner asym. pause dir. 
capable */
+#define        GTSR_IDLE_ERR   0x00ff  /* IDLE error count */
+
+#define        MII_EXTSR       0x0f    /* Extended status register */
+#define        EXTSR_1000XFDX  0x8000  /* 1000X full-duplex capable */
+#define        EXTSR_1000XHDX  0x4000  /* 1000X half-duplex capable */
+#define        EXTSR_1000TFDX  0x2000  /* 1000T full-duplex capable */
+#define        EXTSR_1000THDX  0x1000  /* 1000T half-duplex capable */
+
+#define        EXTSR_MEDIAMASK (EXTSR_1000XFDX|EXTSR_1000XHDX| \
+                        EXTSR_1000TFDX|EXTSR_1000THDX)
+
+#endif /* _DEV_MII_MII_H_ */

Modified: haiku/vendor/freebsd/current/dev/mii/miidevs
===================================================================
--- haiku/vendor/freebsd/current/dev/mii/miidevs        2011-06-25 04:24:54 UTC 
(rev 42311)
+++ haiku/vendor/freebsd/current/dev/mii/miidevs        2011-06-25 10:49:28 UTC 
(rev 42312)
@@ -17,13 +17,6 @@
  * 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 the NetBSD
- *     Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -88,6 +81,7 @@
 oui xxALTIMA                   0x000895        Altima Communications
 oui xxBROADCOM                 0x000818        Broadcom Corporation
 oui xxBROADCOM_ALT1            0x0050ef        Broadcom Corporation
+oui xxBROADCOM_ALT2            0x00d897        Broadcom Corporation
 oui xxICS                      0x00057d        Integrated Circuit Systems
 oui xxSEEQ                     0x0005be        Seeq
 oui xxSIS                      0x000760        Silicon Integrated Systems
@@ -109,6 +103,7 @@
  */
 
 /* Agere Systems PHYs */
+model AGERE ET1011             0x0001 ET1011 10/100/1000baseT PHY
 model AGERE ET1011C            0x0004 ET1011C 10/100/1000baseT PHY
 
 /* Altima Communications PHYs */
@@ -127,12 +122,15 @@
 /* Atheros Communications/Attansic PHYs. */
 model ATHEROS F1               0x0001 Atheros F1 10/100/1000 PHY
 model ATHEROS F2               0x0002 Atheros F2 10/100 PHY
+model ATHEROS F1_7             0x0007 Atheros F1 10/100/1000 PHY
 
 /* Broadcom Corp. PHYs. */
 model BROADCOM 3C905B          0x0012 3c905B 10/100 internal PHY
 model BROADCOM 3C905C          0x0017 3c905C 10/100 internal PHY
 model BROADCOM BCM5201         0x0021 BCM5201 10/100baseTX PHY
+model BROADCOM BCM5214         0x0028 BCM5214 Quad 10/100 PHY
 model BROADCOM BCM5221         0x001e BCM5221 10/100baseTX PHY
+model BROADCOM BCM5222         0x0032 BCM5222 Dual 10/100 PHY
 model BROADCOM BCM4401         0x0036 BCM4401 10/100baseTX PHY
 model xxBROADCOM BCM5400       0x0004 Broadcom 1000baseTX PHY
 model xxBROADCOM BCM5401       0x0005 BCM5401 10/100/1000baseTX PHY
@@ -145,6 +143,7 @@
 model xxBROADCOM BCM5704       0x0019 BCM5704 10/100/1000baseTX PHY
 model xxBROADCOM BCM5705       0x001a BCM5705 10/100/1000baseTX PHY
 model xxBROADCOM BCM5750       0x0018 BCM5750 10/100/1000baseTX PHY
+model xxBROADCOM BCM54K2       0x002e BCM54K2 10/100/1000baseTX PHY
 model xxBROADCOM BCM5714       0x0034 BCM5714 10/100/1000baseTX PHY
 model xxBROADCOM BCM5780       0x0035 BCM5780 10/100/1000baseTX PHY
 model xxBROADCOM BCM5708C      0x0036 BCM5708C 10/100/1000baseTX PHY
@@ -153,7 +152,11 @@
 model xxBROADCOM_ALT1 BCM5708S 0x0015 BCM5708S 1000/2500BaseSX PHY
 model xxBROADCOM_ALT1 BCM5709CAX       0x002c BCM5709C(AX) 10/100/1000baseTX 
PHY
 model xxBROADCOM_ALT1 BCM5722  0x002d BCM5722 10/100/1000baseTX PHY
+model xxBROADCOM_ALT1 BCM5784  0x003a BCM5784 10/100/1000baseTX PHY
 model xxBROADCOM_ALT1 BCM5709C 0x003c BCM5709C 10/100/1000baseTX PHY
+model xxBROADCOM_ALT1 BCM5761  0x003d BCM5761 10/100/1000baseTX PHY
+model xxBROADCOM_ALT1 BCM5709S 0x003f BCM5709S 1000/2500baseSX PHY
+model xxBROADCOM_ALT2 BCM5717C 0x0020 BCM5717C 10/100/1000baseTX PHY
 model BROADCOM2 BCM5906                0x0004 BCM5906 10/100baseTX PHY
 
 /* Cicada Semiconductor PHYs (now owned by Vitesse?) */
@@ -204,6 +207,7 @@
 model NATSEMI DP83847          0x0003 DP83847 10/100 media interface
 model NATSEMI DP83891          0x0005 DP83891 10/100/1000 media interface
 model NATSEMI DP83861          0x0006 DP83861 10/100/1000 media interface
+model NATSEMI DP83865          0x0007 DP83865 10/100/1000 media interface
 
 /* Quality Semiconductor PHYs */
 model QUALSEMI QS6612          0x0000 QS6612 10/100 media interface
@@ -239,7 +243,7 @@
 model MARVELL E1000_3          0x0003 Marvell 88E1000 Gigabit PHY
 model MARVELL E1000S           0x0004 Marvell 88E1000S Gigabit PHY
 model MARVELL E1000_5          0x0005 Marvell 88E1000 Gigabit PHY
-model MARVELL E1000_6          0x0006 Marvell 88E1000 Gigabit PHY
+model MARVELL E1101            0x0006 Marvell 88E1101 Gigabit PHY
 model MARVELL E3082            0x0008 Marvell 88E3082 10/100 Fast Ethernet PHY
 model MARVELL E1112            0x0009 Marvell 88E1112 Gigabit PHY
 model MARVELL E1149            0x000b Marvell 88E1149 Gigabit PHY
@@ -248,6 +252,7 @@
 model MARVELL E1116R           0x0024 Marvell 88E1116R Gigabit PHY
 model MARVELL E1118            0x0022 Marvell 88E1118 Gigabit PHY
 model MARVELL E3016            0x0026 Marvell 88E3016 10/100 Fast Ethernet PHY
+model MARVELL PHYG65G          0x0027 Marvell PHYG65G Gigabit PHY
 model xxMARVELL E1000          0x0005 Marvell 88E1000 Gigabit PHY
 model xxMARVELL E1011          0x0002 Marvell 88E1011 Gigabit PHY
 model xxMARVELL E1000_3                0x0003 Marvell 88E1000 Gigabit PHY

Added: haiku/vendor/freebsd/current/dev/mii/miivar.h
===================================================================
--- haiku/vendor/freebsd/current/dev/mii/miivar.h                               
(rev 0)
+++ haiku/vendor/freebsd/current/dev/mii/miivar.h       2011-06-25 10:49:28 UTC 
(rev 42312)
@@ -0,0 +1,260 @@
+/*     $NetBSD: miivar.h,v 1.8 1999/04/23 04:24:32 thorpej Exp $       */
+
+/*-
+ * Copyright (c) 1998, 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _DEV_MII_MIIVAR_H_
+#define        _DEV_MII_MIIVAR_H_
+
+#include <sys/queue.h>
+
+/*
+ * Media Independent Interface configuration defintions.
+ */
+
+struct mii_softc;
+
+/*
+ * Callbacks from MII layer into network interface device driver.
+ */
+typedef        int (*mii_readreg_t)(struct device *, int, int);
+typedef        void (*mii_writereg_t)(struct device *, int, int, int);
+typedef        void (*mii_statchg_t)(struct device *);
+
+/*
+ * A network interface driver has one of these structures in its softc.
+ * It is the interface from the network interface driver to the MII
+ * layer.
+ */
+struct mii_data {
+       struct ifmedia mii_media;       /* media information */
+       struct ifnet *mii_ifp;          /* pointer back to network interface */
+
+       /*
+        * For network interfaces with multiple PHYs, a list of all
+        * PHYs is required so they can all be notified when a media
+        * request is made.
+        */
+       LIST_HEAD(mii_listhead, mii_softc) mii_phys;
+       int mii_instance;
+
+       /*
+        * PHY driver fills this in with active media status.
+        */
+       int mii_media_status;
+       int mii_media_active;
+
+       /*
+        * Calls from MII layer into network interface driver.
+        */
+       mii_readreg_t mii_readreg;
+       mii_writereg_t mii_writereg;
+       mii_statchg_t mii_statchg;
+};
+typedef struct mii_data mii_data_t;
+
+/*
+ * This call is used by the MII layer to call into the PHY driver
+ * to perform a `service request'.
+ */
+typedef        int (*mii_downcall_t)(struct mii_softc *, struct mii_data *, 
int);
+
+/*
+ * Requests that can be made to the downcall.
+ */
+#define        MII_TICK        1       /* once-per-second tick */
+#define        MII_MEDIACHG    2       /* user changed media; perform the 
switch */
+#define        MII_POLLSTAT    3       /* user requested media status; fill it 
in */
+
+/*
+ * Each PHY driver's softc has one of these as the first member.
+ * XXX This would be better named "phy_softc", but this is the name
+ * XXX BSDI used, and we would like to have the same interface.

[... truncated: 160 lines follow ...]

Other related posts:

  • » [haiku-commits] r42312 - haiku/vendor/freebsd/current/dev/mii - korli