[haiku-commits] r42393 - in haiku/trunk: build/jam src/add-ons/kernel/drivers/network src/add-ons/kernel/drivers/network/3com src/add-ons/kernel/drivers/network/3com/dev src/add-ons/kernel/drivers/network/3com/dev/mii ...

  • From: zharik@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 9 Jul 2011 01:00:39 +0200 (CEST)

Author: siarzhuk
Date: 2011-07-09 01:00:38 +0200 (Sat, 09 Jul 2011)
New Revision: 42393
Changeset: https://dev.haiku-os.org/changeset/42393

Added:
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/xl/
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/Jamfile
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/Jamfile
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/dc/
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/dc/Jamfile
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/dc/glue.c
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/dc/if_dc.c
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/dc/if_dcreg.h
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/mii/
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/mii/Jamfile
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/mii/acphy.c
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/mii/acphyreg.h
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/mii/amphy.c
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/mii/amphyreg.h
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/mii/dcphy.c
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/mii/pnphy.c
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/mii/ukphy.c
   haiku/trunk/src/add-ons/kernel/drivers/network/dec21xxx/dev/mii/ukphy_subr.c
Removed:
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/pci/
Modified:
   haiku/trunk/build/jam/HaikuImage
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/Jamfile
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/Jamfile
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphy.c
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphyreg.h
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/exphy.c
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy.c
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy_subr.c
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/xl/Jamfile
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/xl/if_xl.c
   haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/xl/if_xlreg.h
   haiku/trunk/src/add-ons/kernel/drivers/network/Jamfile
   haiku/trunk/src/add-ons/kernel/drivers/network/ipro100/dev/fxp/if_fxp.c
   haiku/trunk/src/add-ons/kernel/drivers/network/ipro100/dev/fxp/if_fxpreg.h
   haiku/trunk/src/add-ons/kernel/drivers/network/ipro100/dev/fxp/if_fxpvar.h
   haiku/trunk/src/add-ons/kernel/drivers/network/ipro100/dev/fxp/rcvbundl.h
   haiku/trunk/src/add-ons/kernel/drivers/network/ipro100/dev/mii/inphy.c
   haiku/trunk/src/add-ons/kernel/drivers/network/ipro100/dev/mii/inphyreg.h
   haiku/trunk/src/add-ons/kernel/drivers/network/rtl8139/dev/mii/rlphy.c
   haiku/trunk/src/add-ons/kernel/drivers/network/rtl8139/pci/if_rl.c
   haiku/trunk/src/add-ons/kernel/drivers/network/rtl8139/pci/if_rlreg.h
   haiku/trunk/src/libs/compat/freebsd_network/bus.c
   haiku/trunk/src/libs/compat/freebsd_network/compat/dev/mii/miidevs
   haiku/trunk/src/libs/compat/freebsd_network/compat/dev/pci/pcivar.h
   haiku/trunk/src/libs/compat/freebsd_network/compat/net/if_media.h
   haiku/trunk/src/libs/compat/freebsd_network/compat/sys/kernel.h
   haiku/trunk/src/libs/compat/freebsd_network/compat/sys/types.h
   haiku/trunk/src/libs/compat/freebsd_network/fbsd_mii_physubr.c
Log:
* Network driver for DEC/21143 and K?\194?\176 ("dc") ported from FreeBSD 8.2;
* Network drivers for 3com, ipro100, rtl8139 are updated from FreeBSD 8.2 
Release branch;
* Some functions, defines and typedef required by updated and fresh ported 
FreeBSD
  drivers were added into freebsd_compat layer.



Modified: haiku/trunk/build/jam/HaikuImage
===================================================================
--- haiku/trunk/build/jam/HaikuImage    2011-07-08 21:12:11 UTC (rev 42392)
+++ haiku/trunk/build/jam/HaikuImage    2011-07-08 23:00:38 UTC (rev 42393)
@@ -169,7 +169,7 @@
 SYSTEM_ADD_ONS_DRIVERS_MIDI = emuxki usb_midi ;
 SYSTEM_ADD_ONS_DRIVERS_NET = $(X86_ONLY)3com $(X86_ONLY)atheros813x
        $(X86_ONLY)ar81xx $(X86_ONLY)attansic_l1 $(X86_ONLY)attansic_l2
-       $(X86_ONLY)broadcom440x $(X86_ONLY)broadcom570x etherpci
+       $(X86_ONLY)broadcom440x $(X86_ONLY)broadcom570x $(X86_ONLY)dec21xxx 
etherpci
        $(X86_ONLY)ipro100 $(X86_ONLY)ipro1000 $(X86_ONLY)jmicron2x0
        $(X86_ONLY)marvell_yukon $(X86_ONLY)nforce $(X86_ONLY)pcnet pegasus
        $(X86_ONLY)rtl8139 $(X86_ONLY)rtl81xx sis900

Modified: haiku/trunk/src/add-ons/kernel/drivers/network/3com/Jamfile
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/network/3com/Jamfile 2011-07-08 
21:12:11 UTC (rev 42392)
+++ haiku/trunk/src/add-ons/kernel/drivers/network/3com/Jamfile 2011-07-08 
23:00:38 UTC (rev 42393)
@@ -1,4 +1,3 @@
 SubDir HAIKU_TOP src add-ons kernel drivers network 3com ;
 
 SubInclude HAIKU_TOP src add-ons kernel drivers network 3com dev ;
-SubInclude HAIKU_TOP src add-ons kernel drivers network 3com pci ;

Modified: haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/Jamfile
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/Jamfile     
2011-07-08 21:12:11 UTC (rev 42392)
+++ haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/Jamfile     
2011-07-08 23:00:38 UTC (rev 42393)
@@ -1,3 +1,4 @@
 SubDir HAIKU_TOP src add-ons kernel drivers network 3com dev ;
 
 SubInclude HAIKU_TOP src add-ons kernel drivers network 3com dev mii ;
+SubInclude HAIKU_TOP src add-ons kernel drivers network 3com dev xl ;

Modified: haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphy.c
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphy.c        
2011-07-08 21:12:11 UTC (rev 42392)
+++ haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphy.c        
2011-07-08 23:00:38 UTC (rev 42393)
@@ -14,13 +14,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
@@ -46,11 +39,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 Manuel Bouyer.
- * 4. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
@@ -68,7 +56,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mii/bmtphy.c,v 1.9.2.1 2006/08/08 04:37:18 
yongari Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mii/bmtphy.c,v 1.12.10.8.2.1 2010/12/21 
17:09:25 kensmith Exp $");
 
 /*
  * Driver for the Broadcom BCM5201/BCM5202 "Mini-Theta" PHYs.  This also
@@ -97,6 +85,11 @@
 static int     bmtphy_probe(device_t);
 static int     bmtphy_attach(device_t);
 
+struct bmtphy_softc {
+       struct mii_softc mii_sc;
+       int mii_model;
+};
+
 static device_method_t bmtphy_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe,         bmtphy_probe),
@@ -112,81 +105,73 @@
 static driver_t        bmtphy_driver = {
        "bmtphy",
        bmtphy_methods,
-       sizeof(struct mii_softc)
+       sizeof(struct bmtphy_softc)
 };
 
 DRIVER_MODULE(bmtphy, miibus, bmtphy_driver, bmtphy_devclass, 0, 0);
 
 static int     bmtphy_service(struct mii_softc *, struct mii_data *, int);
 static void    bmtphy_status(struct mii_softc *);
+static void    bmtphy_reset(struct mii_softc *);
 
+static const struct mii_phydesc bmtphys_dp[] = {
+       MII_PHY_DESC(BROADCOM, BCM4401),
+       MII_PHY_DESC(BROADCOM, BCM5201),
+       MII_PHY_DESC(BROADCOM, BCM5214),
+       MII_PHY_DESC(BROADCOM, BCM5221),
+       MII_PHY_DESC(BROADCOM, BCM5222),
+       MII_PHY_END
+};
+
+static const struct mii_phydesc bmtphys_lp[] = {
+       MII_PHY_DESC(BROADCOM, 3C905B),
+       MII_PHY_DESC(BROADCOM, 3C905C),
+       MII_PHY_END
+};
+
 static int
 bmtphy_probe(device_t dev)
 {
-       struct  mii_attach_args *ma;
        int     rval;
 
-       ma = device_get_ivars(dev);
-       rval = BUS_PROBE_DEFAULT;
+       /* Let exphy(4) take precedence for these. */
+       rval = mii_phy_dev_probe(dev, bmtphys_lp, BUS_PROBE_LOW_PRIORITY);
+       if (rval <= 0)
+               return (rval);
 
-       if (MII_OUI(ma->mii_id1, ma->mii_id2) != MII_OUI_BROADCOM)
-               return (ENXIO);
-
-       switch (MII_MODEL(ma->mii_id2)) {
-       case MII_MODEL_BROADCOM_3C905B:
-               device_set_desc(dev, MII_STR_BROADCOM_3C905B);
-               rval = BUS_PROBE_LOW_PRIORITY;  /* Let exphy take precedence. */
-               break;
-       case MII_MODEL_BROADCOM_3C905C:
-               device_set_desc(dev, MII_STR_BROADCOM_3C905C);
-               rval = BUS_PROBE_LOW_PRIORITY;  /* Let exphy take precedence. */
-               break;
-       case MII_MODEL_BROADCOM_BCM5201:
-               device_set_desc(dev, MII_STR_BROADCOM_BCM5201);
-               break;
-       case MII_MODEL_BROADCOM_BCM5221:
-               device_set_desc(dev, MII_STR_BROADCOM_BCM5221);
-               break;
-       case MII_MODEL_BROADCOM_BCM4401:
-               device_set_desc(dev, MII_STR_BROADCOM_BCM4401);
-               break;
-       default:
-               return (ENXIO);
-       }
-
-       return (rval);
+       return (mii_phy_dev_probe(dev, bmtphys_dp, BUS_PROBE_DEFAULT));
 }
 
 static int
 bmtphy_attach(device_t dev)
 {
-       struct  mii_softc *sc;
-       struct  mii_attach_args *ma;
-       struct  mii_data *mii;
+       struct bmtphy_softc *bsc;
+       struct mii_softc *sc;
+       struct mii_attach_args *ma;
+       struct mii_data *mii;
 
-       sc = device_get_softc(dev);
+       bsc = device_get_softc(dev);
+       sc = &bsc->mii_sc;
        ma = device_get_ivars(dev);
        sc->mii_dev = device_get_parent(dev);
-       mii = device_get_softc(sc->mii_dev);
+       mii = ma->mii_data;
        LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list);
 
-       sc->mii_inst = mii->mii_instance;
+       sc->mii_flags = miibus_get_flags(dev);
+       sc->mii_inst = mii->mii_instance++;
        sc->mii_phy = ma->mii_phyno;
        sc->mii_service = bmtphy_service;
        sc->mii_pdata = mii;
 
-       mii_phy_reset(sc);
+       sc->mii_flags |= MIIF_NOMANPAUSE;
 
-       mii->mii_instance++;
+       bsc->mii_model = MII_MODEL(ma->mii_id2);
 
-       sc->mii_capabilities =
-           PHY_READ(sc, MII_BMSR) & ma->mii_capmask;
-       device_printf(dev, " ");
-       if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0)
-               printf("no media present");
-       else
-               mii_phy_add_media(sc);
+       bmtphy_reset(sc);
 
+       sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask;
+       device_printf(dev, " ");
+       mii_phy_add_media(sc);
        printf("\n");
 
        MIIBUS_MEDIAINIT(sc->mii_dev);
@@ -197,32 +182,13 @@
 static int
 bmtphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct  ifmedia_entry *ife;
-       int     reg;
 
-       ife = mii->mii_media.ifm_cur;
-
        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 the media indicates a different PHY instance,
-                * isolate ourselves.
-                */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
-                       reg = PHY_READ(sc, MII_BMCR);
-                       PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
-                       return (0);
-               }
-
-               /*
                 * If the interface is not up, don't do anything.
                 */
                if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
@@ -232,11 +198,6 @@
                break;
 
        case MII_TICK:
-               /*
-                * If we're not currently selected, just return.
-                */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
-                       return (0);
                if (mii_phy_tick(sc) == EJUSTRETURN)
                        return (0);
                break;
@@ -247,16 +208,15 @@
 
        /* Callback if something changed. */
        mii_phy_update(sc, cmd);
-
        return (0);
 }
 
 static void
 bmtphy_status(struct mii_softc *sc)
 {
-       struct  mii_data *mii;
-       struct  ifmedia_entry *ife;
-       int     bmsr, bmcr, aux_csr;
+       struct mii_data *mii;
+       struct ifmedia_entry *ife;
+       int bmsr, bmcr, aux_csr;
 
        mii = sc->mii_pdata;
        ife = mii->mii_media.ifm_cur;
@@ -265,7 +225,6 @@
        mii->mii_media_active = IFM_ETHER;
 
        bmsr = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR);
-       aux_csr = PHY_READ(sc, MII_BMTPHY_AUX_CSR);
 
        if (bmsr & BMSR_LINK)
                mii->mii_media_status |= IFM_ACTIVE;
@@ -291,12 +250,45 @@
                        return;
                }
 
+               aux_csr = PHY_READ(sc, MII_BMTPHY_AUX_CSR);
                if (aux_csr & AUX_CSR_SPEED)
                        mii->mii_media_active |= IFM_100_TX;
                else
                        mii->mii_media_active |= IFM_10_T;
                if (aux_csr & AUX_CSR_FDX)
-                       mii->mii_media_active |= IFM_FDX;
+                       mii->mii_media_active |=
+                           IFM_FDX | mii_phy_flowstatus(sc);
+               else
+                       mii->mii_media_active |= IFM_HDX;
        } else
                mii->mii_media_active = ife->ifm_media;
 }
+
+static void
+bmtphy_reset(struct mii_softc *sc)
+{
+       struct bmtphy_softc *bsc;
+       u_int16_t data;
+
+       bsc = (struct bmtphy_softc *)sc;
+
+       mii_phy_reset(sc);
+
+       if (bsc->mii_model == MII_MODEL_BROADCOM_BCM5221) {
+               /* Enable shadow register mode. */
+               data = PHY_READ(sc, 0x1f);
+               PHY_WRITE(sc, 0x1f, data | 0x0080);
+
+               /* Enable APD (Auto PowerDetect). */
+               data = PHY_READ(sc, MII_BMTPHY_AUX2);
+               PHY_WRITE(sc, MII_BMTPHY_AUX2, data | 0x0020);
+
+               /* Enable clocks across APD for Auto-MDIX functionality. */
+               data = PHY_READ(sc, MII_BMTPHY_INTR);
+               PHY_WRITE(sc, MII_BMTPHY_INTR, data | 0x0004);
+
+               /* Disable shadow register mode. */
+               data = PHY_READ(sc, 0x1f);
+               PHY_WRITE(sc, 0x1f, data & ~0x0080);
+       }
+}


Property changes on: 
haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphy.c
___________________________________________________________________
Added: svn:mergeinfo
   + 
/haiku/branches/developer/bonefish/signals/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphy.c:40148-40195,40198-42104
/haiku/branches/developer/bonefish/signals-merge/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphy.c:42105-42115
/haiku/branches/developer/bonefish/weak-symbols/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphy.c:39365-39568
/haiku/vendor/freebsd/RELEASE_8_2_0/dev/mii/bmtphy.c:42313-42392
/haiku/vendor/freebsd/current/dev/mii/bmtphy.c:23042-42391

Modified: 
haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphyreg.h
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphyreg.h     
2011-07-08 21:12:11 UTC (rev 42392)
+++ haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphyreg.h     
2011-07-08 23:00:38 UTC (rev 42393)
@@ -13,13 +13,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
@@ -35,7 +28,7 @@
  *
  *     from NetBSD: bmtphyreg.h,v 1.1 2001/06/02 21:42:10 thorpej Exp
  *
- * $FreeBSD: src/sys/dev/mii/bmtphyreg.h,v 1.2 2005/01/06 01:42:55 imp Exp $
+ * $FreeBSD: src/sys/dev/mii/bmtphyreg.h,v 1.2.22.2.2.1 2010/12/21 17:09:25 
kensmith Exp $
  */
 
 #ifndef _DEV_MII_BMTPHYREG_H_


Property changes on: 
haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphyreg.h
___________________________________________________________________
Added: svn:mergeinfo
   + 
/haiku/branches/developer/bonefish/signals/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphyreg.h:40148-40195,40198-42104
/haiku/branches/developer/bonefish/signals-merge/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphyreg.h:42105-42115
/haiku/branches/developer/bonefish/weak-symbols/src/add-ons/kernel/drivers/network/3com/dev/mii/bmtphyreg.h:39365-39568
/haiku/vendor/freebsd/RELEASE_8_2_0/dev/mii/bmtphyreg.h:42313-42392
/haiku/vendor/freebsd/current/dev/mii/bmtphyreg.h:23042-42391

Modified: haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/exphy.c
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/exphy.c 
2011-07-08 21:12:11 UTC (rev 42392)
+++ haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/exphy.c 
2011-07-08 23:00:38 UTC (rev 42393)
@@ -16,13 +16,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
@@ -48,11 +41,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 Manuel Bouyer.
- * 4. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
@@ -67,7 +55,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mii/exphy.c,v 1.19.2.1 2006/08/08 04:37:18 
yongari Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mii/exphy.c,v 1.23.10.5.2.1 2010/12/21 
17:09:25 kensmith Exp $");
 
 /*
  * driver for 3Com internal PHYs
@@ -114,42 +102,31 @@
 static int     exphy_service(struct mii_softc *, struct mii_data *, int);
 static void    exphy_reset(struct mii_softc *);
 
+/*
+ * Some 3Com internal PHYs report zero for OUI and model, others use
+ * actual values.
+ * Note that the 3Com internal PHYs having OUI 0x105a and model 0 are
+ * handled fine by ukphy(4); they can be isolated and don't require
+ * special treatment after reset.
+ */
+static const struct mii_phydesc exphys[] = {
+       { 0, 0, "3Com internal media interface" },
+       MII_PHY_DESC(BROADCOM, 3C905C),
+       MII_PHY_END
+};
+       
 static int
-exphy_probe(dev)
-       device_t                dev;
+exphy_probe(device_t dev)
 {
-       struct mii_attach_args *ma;
-       device_t                parent;
 
-       ma = device_get_ivars(dev);
-       parent = device_get_parent(device_get_parent(dev));
-
-       /*
-        * Argh, 3Com PHY reports oui == 0 model == 0!
-        */
-       if ((MII_OUI(ma->mii_id1, ma->mii_id2) != 0 ||
-           MII_MODEL(ma->mii_id2) != 0) &&
-           (MII_OUI(ma->mii_id1, ma->mii_id2) != MII_OUI_BROADCOM ||
-           MII_MODEL(ma->mii_id2) != MII_MODEL_BROADCOM_3C905C))
-               return (ENXIO);
-
-       /*
-        * Make sure the parent is an `ex'.
-        */
-       if (strcmp(device_get_name(parent), "xl") != 0)
-               return (ENXIO);
-
-       if (MII_OUI(ma->mii_id1, ma->mii_id2) == 0)
-               device_set_desc(dev, "3Com internal media interface");
-       else
-               device_set_desc(dev, MII_STR_BROADCOM_3C905C);
-
-       return (BUS_PROBE_DEFAULT);
+       if (strcmp(device_get_name(device_get_parent(device_get_parent(dev))),
+           "xl") == 0)
+               return (mii_phy_dev_probe(dev, exphys, BUS_PROBE_DEFAULT));
+       return (ENXIO);
 }
 
 static int
-exphy_attach(dev)
-       device_t                dev;
+exphy_attach(device_t dev)
 {
        struct mii_softc *sc;
        struct mii_attach_args *ma;
@@ -158,63 +135,40 @@
        sc = device_get_softc(dev);
        ma = device_get_ivars(dev);
        sc->mii_dev = device_get_parent(dev);
-       mii = device_get_softc(sc->mii_dev);
-
-       /*
-        * The 3Com PHY can never be isolated, so never allow non-zero
-        * instances!
-        */
-       if (mii->mii_instance != 0) {
-               device_printf(dev, "ignoring this PHY, non-zero instance\n");
-               return(ENXIO);
-       }
-
+       mii = ma->mii_data;
        LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list);
 
-       sc->mii_inst = mii->mii_instance;
+       sc->mii_flags = miibus_get_flags(dev);
+       sc->mii_inst = mii->mii_instance++;
        sc->mii_phy = ma->mii_phyno;
        sc->mii_service = exphy_service;
        sc->mii_pdata = mii;
-       mii->mii_instance++;
 
+       /*
+        * The 3Com PHY can never be isolated.
+        */
        sc->mii_flags |= MIIF_NOISOLATE;
 
 #define        ADD(m, c)       ifmedia_add(&mii->mii_media, (m), (c), NULL)
 
-#if 0 /* See above. */
-       ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst),
-           BMCR_ISO);
-#endif
-
        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_LOOP, sc->mii_inst),
-           BMCR_LOOP|BMCR_S100);
+           MII_MEDIA_100_TX);
 
        exphy_reset(sc);
 
-       sc->mii_capabilities =
-           PHY_READ(sc, MII_BMSR) & ma->mii_capmask;
+       sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask;
        device_printf(dev, " ");
        mii_phy_add_media(sc);
        printf("\n");
 #undef ADD
        MIIBUS_MEDIAINIT(sc->mii_dev);
-       return(0);
+       return (0);
 }
 
 static int
-exphy_service(sc, mii, cmd)
-       struct mii_softc *sc;
-       struct mii_data *mii;
-       int cmd;
+exphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
 
-       /*
-        * We can't isolate the 3Com PHY, so it has to be the only one!
-        */
-       if (IFM_INST(ife->ifm_media) != sc->mii_inst)
-               panic("exphy_service: can't isolate 3Com PHY");
-
        switch (cmd) {
        case MII_POLLSTAT:
                break;
@@ -237,12 +191,6 @@
                        return (0);
 
                /*
-                * Only used for autonegotiation.
-                */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
-                       break;
-
-               /*
                 * The 3Com PHY's autonegotiation doesn't need to be
                 * kicked; it continues in the background.
                 */


Property changes on: 
haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/exphy.c
___________________________________________________________________
Added: svn:mergeinfo
   + 
/haiku/branches/developer/bonefish/signals/src/add-ons/kernel/drivers/network/3com/dev/mii/exphy.c:40148-40195,40198-42104
/haiku/branches/developer/bonefish/signals-merge/src/add-ons/kernel/drivers/network/3com/dev/mii/exphy.c:42105-42115
/haiku/branches/developer/bonefish/weak-symbols/src/add-ons/kernel/drivers/network/3com/dev/mii/exphy.c:39365-39568
/haiku/vendor/freebsd/RELEASE_8_2_0/dev/mii/exphy.c:42313-42392
/haiku/vendor/freebsd/current/dev/mii/exphy.c:23042-42391

Modified: haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy.c
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy.c 
2011-07-08 21:12:11 UTC (rev 42392)
+++ haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy.c 
2011-07-08 23:00:38 UTC (rev 42393)
@@ -16,13 +16,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
@@ -48,11 +41,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 Manuel Bouyer.
- * 4. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
@@ -67,7 +55,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mii/ukphy.c,v 1.20 2007/01/20 00:52:29 marius 
Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mii/ukphy.c,v 1.20.10.6.2.1 2010/12/21 
17:09:25 kensmith Exp $");
 
 /*
  * driver for generic unknown PHYs
@@ -134,7 +122,7 @@
        sc = device_get_softc(dev);
        ma = device_get_ivars(dev);
        sc->mii_dev = device_get_parent(dev);
-       mii = device_get_softc(sc->mii_dev);
+       mii = ma->mii_data;
        LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list);
 
        if (bootverbose)
@@ -142,17 +130,17 @@
                    MII_OUI(ma->mii_id1, ma->mii_id2),
                    MII_MODEL(ma->mii_id2), MII_REV(ma->mii_id2));
 
-       sc->mii_inst = mii->mii_instance;
+       sc->mii_flags = miibus_get_flags(dev);
+       sc->mii_inst = mii->mii_instance++;
        sc->mii_phy = ma->mii_phyno;
        sc->mii_service = ukphy_service;
        sc->mii_pdata = mii;
 
-       mii->mii_instance++;
+       sc->mii_flags |= MIIF_NOMANPAUSE;
 
        mii_phy_reset(sc);
 
-       sc->mii_capabilities =
-           PHY_READ(sc, MII_BMSR) & ma->mii_capmask;
+       sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask;
        if (sc->mii_capabilities & BMSR_EXTSTAT)
                sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR);
        device_printf(dev, " ");
@@ -168,30 +156,13 @@
 static int
 ukphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
-       int reg;
 
        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 the media indicates a different PHY instance,
-                * isolate ourselves.
-                */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
-                       reg = PHY_READ(sc, MII_BMCR);
-                       PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
-                       return (0);
-               }
-
-               /*
                 * If the interface is not up, don't do anything.
                 */
                if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
@@ -201,11 +172,6 @@
                break;
 
        case MII_TICK:
-               /*
-                * If we're not currently selected, just return.
-                */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
-                       return (0);
                if (mii_phy_tick(sc) == EJUSTRETURN)
                        return (0);
                break;


Property changes on: 
haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy.c
___________________________________________________________________
Added: svn:mergeinfo
   + 
/haiku/branches/developer/bonefish/signals/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy.c:40148-40195,40198-42104
/haiku/branches/developer/bonefish/signals-merge/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy.c:42105-42115
/haiku/branches/developer/bonefish/weak-symbols/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy.c:39365-39568
/haiku/vendor/freebsd/RELEASE_8_2_0/dev/mii/ukphy.c:42313-42392
/haiku/vendor/freebsd/current/dev/mii/ukphy.c:23042-42391

Modified: 
haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy_subr.c
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy_subr.c    
2011-07-08 21:12:11 UTC (rev 42392)
+++ haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy_subr.c    
2011-07-08 23:00:38 UTC (rev 42393)
@@ -16,13 +16,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
@@ -38,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mii/ukphy_subr.c,v 1.8.8.1 2006/07/19 04:40:26 
yongari Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mii/ukphy_subr.c,v 1.10.2.4.2.1 2010/12/21 
17:09:25 kensmith Exp $");
 
 /*
  * Subroutines shared by the ukphy driver and other PHY drivers.
@@ -111,19 +104,26 @@
                        mii->mii_media_active |= IFM_1000_T|IFM_FDX;
                else if ((gtcr & GTCR_ADV_1000THDX) &&
                    (gtsr & GTSR_LP_1000THDX))
-                       mii->mii_media_active |= IFM_1000_T;
-               else if (anlpar & ANLPAR_T4)
-                       mii->mii_media_active |= IFM_100_T4;
+                       mii->mii_media_active |= IFM_1000_T|IFM_HDX;
                else 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;
+                       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;
+                       mii->mii_media_active |= IFM_10_T|IFM_HDX;
                else
                        mii->mii_media_active |= IFM_NONE;
+
+               if ((mii->mii_media_active & IFM_1000_T) != 0 &&
+                   (gtsr & GTSR_MS_RES) != 0)
+                       mii->mii_media_active |= IFM_ETH_MASTER;
+
+               if ((mii->mii_media_active & IFM_FDX) != 0)
+                       mii->mii_media_active |= mii_phy_flowstatus(phy);
        } else
                mii->mii_media_active = ife->ifm_media;
 }


Property changes on: 
haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy_subr.c
___________________________________________________________________
Added: svn:mergeinfo
   + 
/haiku/branches/developer/bonefish/signals/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy_subr.c:40148-40195,40198-42104
/haiku/branches/developer/bonefish/signals-merge/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy_subr.c:42105-42115
/haiku/branches/developer/bonefish/weak-symbols/src/add-ons/kernel/drivers/network/3com/dev/mii/ukphy_subr.c:39365-39568
/haiku/vendor/freebsd/RELEASE_8_2_0/dev/mii/ukphy_subr.c:42313-42392
/haiku/vendor/freebsd/current/dev/mii/ukphy_subr.c:23042-42391


Property changes on: haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/xl
___________________________________________________________________
Added: svn:ignore
   + pci.pro

Added: svn:mergeinfo
   + /haiku/vendor/freebsd/RELEASE_8_2_0/dev/xl:42392

Modified: haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/xl/Jamfile
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/network/3com/pci/Jamfile     
2011-07-08 21:12:11 UTC (rev 42392)
+++ haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/xl/Jamfile  
2011-07-08 23:00:38 UTC (rev 42393)
@@ -1,6 +1,6 @@
-SubDir HAIKU_TOP src add-ons kernel drivers network 3com pci ;
+SubDir HAIKU_TOP src add-ons kernel drivers network 3com dev xl ;
 
-UseHeaders [ FDirName $(SUBDIR) .. ] : true ;
+UseHeaders [ FDirName $(SUBDIR) .. .. ] : true ;
 UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ] : 
true ;
 
 UsePrivateHeaders net system ;

Modified: haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/xl/if_xl.c
===================================================================
--- haiku/trunk/src/add-ons/kernel/drivers/network/3com/pci/if_xl.c     
2011-07-08 21:12:11 UTC (rev 42392)
+++ haiku/trunk/src/add-ons/kernel/drivers/network/3com/dev/xl/if_xl.c  
2011-07-08 23:00:38 UTC (rev 42393)
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/pci/if_xl.c,v 1.210 2007/08/06 14:26:03 rwatson 
Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/xl/if_xl.c,v 1.8.2.7.2.1 2010/12/21 17:09:25 
kensmith Exp $");
 
 /*
  * 3Com 3c90x Etherlink XL PCI NIC driver
@@ -96,9 +96,6 @@
  * Since using bus master DMA is a big win, we use this driver to
  * support the PCI "boomerang" chips even though they work with the
  * "vortex" driver in order to obtain better performance.
- *
- * This driver is in the /sys/pci directory because it only supports
- * PCI-based NICs.
  */
 
 #ifdef HAVE_KERNEL_OPTION_HEADERS
@@ -142,7 +139,7 @@
 /* "device miibus" required.  See GENERIC if you get errors here. */
 #include "miibus_if.h"
 
-#include <pci/if_xlreg.h>
+#include <dev/xl/if_xlreg.h>
 
 /*
  * TX Checksumming is disabled by default for two reasons:
@@ -163,7 +160,7 @@
 /*
  * Various supported device vendors/types and their names.
  */
-static struct xl_type xl_devs[] = {
+static const struct xl_type xl_devs[] = {
        { TC_VENDORID, TC_DEVICEID_BOOMERANG_10BT,
                "3Com 3c900-TPO Etherlink XL" },
        { TC_VENDORID, TC_DEVICEID_BOOMERANG_10BT_COMBO,
@@ -230,8 +227,8 @@
 static int xl_newbuf(struct xl_softc *, struct xl_chain_onefrag *);
 static void xl_stats_update(void *);
 static void xl_stats_update_locked(struct xl_softc *);
-static int xl_encap(struct xl_softc *, struct xl_chain *, struct mbuf *);
-static void xl_rxeof(struct xl_softc *);
+static int xl_encap(struct xl_softc *, struct xl_chain *, struct mbuf **);
+static int xl_rxeof(struct xl_softc *);
 static void xl_rxeof_task(void *, int);
 static int xl_rx_resync(struct xl_softc *);
 static void xl_txeof(struct xl_softc *);
@@ -246,13 +243,14 @@
 static void xl_init_locked(struct xl_softc *);
 static void xl_stop(struct xl_softc *);
 static int xl_watchdog(struct xl_softc *);
-static void xl_shutdown(device_t);
+static int xl_shutdown(device_t);
 static int xl_suspend(device_t);
 static int xl_resume(device_t);
+static void xl_setwol(struct xl_softc *);
 
 #ifdef DEVICE_POLLING
-static void xl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count);
-static void xl_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count);
+static int xl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count);
+static int xl_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count);
 #endif
 
 static int xl_ifmedia_upd(struct ifnet *);
@@ -278,8 +276,6 @@
 static void xl_choose_media(struct xl_softc *sc, int *media);
 static void xl_choose_xcvr(struct xl_softc *, int);
 static void xl_dma_map_addr(void *, bus_dma_segment_t *, int, int);
-static void xl_dma_map_rxbuf(void *, bus_dma_segment_t *, int, bus_size_t, 
int);
-static void xl_dma_map_txbuf(void *, bus_dma_segment_t *, int, bus_size_t, 
int);
 #ifdef notdef
 static void xl_testpacket(struct xl_softc *);
 #endif
@@ -319,7 +315,6 @@
 
 static devclass_t xl_devclass;
 
-DRIVER_MODULE(xl, cardbus, xl_driver, xl_devclass, 0, 0);
 DRIVER_MODULE(xl, pci, xl_driver, xl_devclass, 0, 0);
 DRIVER_MODULE(miibus, xl, miibus_driver, miibus_devclass, 0, 0);
 
@@ -332,46 +327,6 @@
        *paddr = segs->ds_addr;
 }
 
-static void
-xl_dma_map_rxbuf(void *arg, bus_dma_segment_t *segs, int nseg,
-    bus_size_t mapsize, int error)
-{
-       u_int32_t *paddr;
-
-       if (error)
-               return;
-
-       KASSERT(nseg == 1, ("xl_dma_map_rxbuf: too many DMA segments"));
-       paddr = arg;
-       *paddr = segs->ds_addr;
-}
-
-static void
-xl_dma_map_txbuf(void *arg, bus_dma_segment_t *segs, int nseg,
-    bus_size_t mapsize, int error)
-{
-       struct xl_list *l;
-       int i, total_len;
-
-       if (error)
-               return;
-
-       KASSERT(nseg <= XL_MAXFRAGS, ("too many DMA segments"));
-
-       total_len = 0;
-       l = arg;
-       for (i = 0; i < nseg; i++) {
-               KASSERT(segs[i].ds_len <= MCLBYTES, ("segment size too large"));
-               l->xl_frag[i].xl_addr = htole32(segs[i].ds_addr);
-               l->xl_frag[i].xl_len = htole32(segs[i].ds_len);
-               total_len += segs[i].ds_len;
-       }
-       l->xl_frag[nseg - 1].xl_len = htole32(segs[nseg - 1].ds_len |
-           XL_LAST_FRAG);
-       l->xl_status = htole32(total_len);
-       l->xl_next = 0;
-}
-
 /*
  * Murphy's law says that it's possible the chip can wedge and
  * the 'command in progress' bit may never clear. Hence, we wait
@@ -568,16 +523,6 @@
 
        sc = device_get_softc(dev);
 
-       /*
-        * Pretend that PHYs are only available at MII address 24.
-        * This is to guard against problems with certain 3Com ASIC
-        * revisions that incorrectly map the internal transceiver
-        * control registers at all MII addresses. This can cause
-        * the miibus code to attach the same PHY several times over.
-        */
-       if ((sc->xl_flags & XL_FLAG_PHYOK) == 0 && phy != 24)
-               return (0);
-
        bzero((char *)&frame, sizeof(frame));
        frame.mii_phyaddr = phy;
        frame.mii_regaddr = reg;
@@ -595,9 +540,6 @@
 
        sc = device_get_softc(dev);
 
-       if ((sc->xl_flags & XL_FLAG_PHYOK) == 0 && phy != 24)
-               return (0);
-
        bzero((char *)&frame, sizeof(frame));
        frame.mii_phyaddr = phy;
        frame.mii_regaddr = reg;
@@ -613,6 +555,7 @@
 {
        struct xl_softc         *sc;
        struct mii_data         *mii;
+       uint8_t                 macctl;
 
        sc = device_get_softc(dev);
        mii = device_get_softc(sc->xl_miibus);
@@ -621,11 +564,22 @@
 
        /* Set ASIC's duplex mode to match the PHY. */
        XL_SEL_WIN(3);
-       if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX)
-               CSR_WRITE_1(sc, XL_W3_MAC_CTRL, XL_MACCTRL_DUPLEX);
-       else
-               CSR_WRITE_1(sc, XL_W3_MAC_CTRL,
-                   (CSR_READ_1(sc, XL_W3_MAC_CTRL) & ~XL_MACCTRL_DUPLEX));
+       macctl = CSR_READ_1(sc, XL_W3_MAC_CTRL);
+       if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) {
+               macctl |= XL_MACCTRL_DUPLEX;
+               if (sc->xl_type == XL_TYPE_905B) {
+                       if ((IFM_OPTIONS(mii->mii_media_active) &
+                           IFM_ETH_RXPAUSE) != 0)
+                               macctl |= XL_MACCTRL_FLOW_CONTROL_ENB;
+                       else
+                               macctl &= ~XL_MACCTRL_FLOW_CONTROL_ENB;
+               }
+       } else {
+               macctl &= ~XL_MACCTRL_DUPLEX;
+               if (sc->xl_type == XL_TYPE_905B)
+                       macctl &= ~XL_MACCTRL_FLOW_CONTROL_ENB;
+       }
+       CSR_WRITE_1(sc, XL_W3_MAC_CTRL, macctl);
 }
 
 /*
@@ -770,10 +724,10 @@
                return;
        }
 
-       IF_ADDR_LOCK(ifp);
+       if_maddr_rlock(ifp);
        TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
                mcnt++;
-       IF_ADDR_UNLOCK(ifp);
+       if_maddr_runlock(ifp);
 
        if (mcnt)
                rxfilt |= XL_RXFILTER_ALLMULTI;
@@ -812,7 +766,7 @@

[... truncated: 14337 lines follow ...]

Other related posts:

  • » [haiku-commits] r42393 - in haiku/trunk: build/jam src/add-ons/kernel/drivers/network src/add-ons/kernel/drivers/network/3com src/add-ons/kernel/drivers/network/3com/dev src/add-ons/kernel/drivers/network/3com/dev/mii ... - zharik