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 ...]