Date: Mon, 15 Mar 2010 22:43:31 GMT From: Rafal Jaworowski <raj@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 175719 for review Message-ID: <201003152243.o2FMhViE011834@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/chv.cgi?CH=175719 Change 175719 by raj@raj_fdt on 2010/03/15 22:42:38 Extend mge(4) to retrieve PHY address from the device tree (instead of hard coded assumptions). Get rid of MII_ADDR_BASE option. Update DTS files for DB-88F6281 and SHEEVAPLUG accordingly. Affected files ... .. //depot/projects/fdt/sys/arm/mv/kirkwood/std.sheevaplug#2 edit .. //depot/projects/fdt/sys/boot/fdt/dts/db88f6281.dts#5 edit .. //depot/projects/fdt/sys/boot/fdt/dts/sheevaplug.dts#3 edit .. //depot/projects/fdt/sys/conf/options.arm#4 edit .. //depot/projects/fdt/sys/dev/mge/if_mge.c#6 edit .. //depot/projects/fdt/sys/dev/mge/if_mgevar.h#2 edit Differences ... ==== //depot/projects/fdt/sys/arm/mv/kirkwood/std.sheevaplug#2 (text+ko) ==== @@ -5,4 +5,3 @@ files "../mv/kirkwood/files.sheevaplug" options PHYSMEM_SIZE=0x20000000 -options MII_ADDR_BASE=0 ==== //depot/projects/fdt/sys/boot/fdt/dts/db88f6281.dts#5 (text+ko) ==== @@ -200,6 +200,17 @@ local-mac-address = [ 00 00 00 00 00 00 ]; interrupts = <12 13 14 11 46>; interrupt-parent = <&PIC>; + phy-handle = <&phy0>; + + mdio@004 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "mrvl,mdio"; + + phy0: ethernet-phy@0 { + reg = <0x8>; + }; + }; }; serial0: serial@12000 { ==== //depot/projects/fdt/sys/boot/fdt/dts/sheevaplug.dts#3 (text+ko) ==== @@ -198,6 +198,17 @@ local-mac-address = [ 00 00 00 00 00 00 ]; interrupts = <12 13 14 11 46>; interrupt-parent = <&PIC>; + phy-handle = <&phy0>; + + mdio@004 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "mrvl,mdio"; + + phy0: ethernet-phy@0 { + reg = <0x0>; + }; + }; }; serial0: serial@12000 { ==== //depot/projects/fdt/sys/conf/options.arm#4 (text+ko) ==== @@ -25,7 +25,6 @@ LOADERRAMADDR opt_global.h PHYSADDR opt_global.h PHYSMEM_SIZE opt_global.h -MII_ADDR_BASE opt_global.h SKYEYE_WORKAROUNDS opt_global.h SOC_MV_DISCOVERY opt_global.h SOC_MV_KIRKWOOD opt_global.h ==== //depot/projects/fdt/sys/dev/mge/if_mge.c#6 (text+ko) ==== @@ -68,13 +68,11 @@ #include <dev/mii/mii.h> #include <dev/mii/miivar.h> + +#include <dev/fdt/fdt_common.h> #include <dev/ofw/ofw_bus.h> #include <dev/ofw/ofw_bus_subr.h> -#ifndef MII_ADDR_BASE -#define MII_ADDR_BASE 8 -#endif - #include <dev/mge/if_mgevar.h> #include <arm/mv/mvreg.h> #include <arm/mv/mvvar.h> @@ -192,14 +190,53 @@ { mge_intr_err, "GbE error interrupt" }, }; +static __inline int +mge_phyaddr_from_dt(struct mge_softc *sc) +{ + ihandle_t phy_ihandle; + pcell_t phy_handle; + pcell_t phy_reg; + + if (OF_getprop(sc->node, "phy-handle", (void *)&phy_handle, + sizeof(phy_handle)) <= 0) { + device_printf(sc->dev, "Could not get phy-handle\n"); + return (ENXIO); + } + + phy_ihandle = (ihandle_t)phy_handle; + phy_ihandle = fdt32_to_cpu(phy_ihandle); + sc->phy_node = OF_instance_to_package(phy_ihandle); + + if (OF_getprop(sc->phy_node, "reg", (void *)&phy_reg, + sizeof(phy_reg)) <= 0) { + device_printf(sc->dev, "Could not get 'reg' property " + "from phy node\n"); + return (ENXIO); + } + sc->phy_addr = phy_reg; + + return (0); +} + static void mge_get_mac_address(struct mge_softc *sc, uint8_t *addr) { uint32_t mac_l, mac_h; + uint8_t lmac[6]; + int i; - /* XXX use currently programmed MAC address; eventually this info will - * be provided by the loader */ + /* + * Retrieve hw address from the device tree. + */ + i = OF_getprop(sc->node, "local-mac-address", (void *)lmac, 6); + if (i == 6) { + bcopy(lmac, addr, 6); + return; + } + /* + * Fall back -- use the currently programmed address. + */ mac_l = MGE_READ(sc, MGE_MAC_ADDR_L); mac_h = MGE_READ(sc, MGE_MAC_ADDR_H); @@ -615,6 +652,7 @@ sc = device_get_softc(dev); sc->dev = dev; + sc->node = ofw_bus_get_node(dev); if (device_get_unit(dev) == 0) sc_mge0 = sc; @@ -622,6 +660,10 @@ /* Set chip version-dependent parameters */ mge_ver_params(sc); + /* Get phy address from fdt*/ + if (mge_phyaddr_from_dt(sc) != 0) + return (ENXIO); + /* Initialize mutexes */ mtx_init(&sc->transmit_lock, device_get_nameunit(dev), "mge TX lock", MTX_DEF); mtx_init(&sc->receive_lock, device_get_nameunit(dev), "mge RX lock", MTX_DEF); @@ -1265,19 +1307,12 @@ static int mge_miibus_readreg(device_t dev, int phy, int reg) { + struct mge_softc *sc; uint32_t retries; - /* - * We assume static PHY address <=> device unit mapping: - * PHY Address = MII_ADDR_BASE + devce unit. - * This is true for most Marvell boards. - * - * Code below grants proper PHY detection on each device - * unit. - */ + sc = device_get_softc(dev); - - if ((MII_ADDR_BASE + device_get_unit(dev)) != phy) + if (sc->phy_addr != phy) return (0); MGE_WRITE(sc_mge0, MGE_REG_SMI, 0x1fffffff & @@ -1296,9 +1331,12 @@ static int mge_miibus_writereg(device_t dev, int phy, int reg, int value) { + struct mge_softc *sc; uint32_t retries; - if ((MII_ADDR_BASE + device_get_unit(dev)) != phy) + sc = device_get_softc(dev); + + if (sc->phy_addr != phy) return (0); MGE_WRITE(sc_mge0, MGE_REG_SMI, 0x1fffffff & ==== //depot/projects/fdt/sys/dev/mge/if_mgevar.h#2 (text+ko) ==== @@ -64,8 +64,13 @@ struct mge_softc { struct ifnet *ifp; /* per-interface network data */ + + phandle_t node; + phandle_t phy_node; + device_t dev; device_t miibus; + struct mii_data *mii; struct resource *res[1 + MGE_INTR_COUNT]; /* resources */ void *ih_cookie[MGE_INTR_COUNT]; /* interrupt handlers cookies */ @@ -99,6 +104,8 @@ uint32_t mge_tx_tok_cnt; uint16_t mge_mtu; int mge_ver; + + int phy_addr; };
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003152243.o2FMhViE011834>