Date: Sat, 24 Apr 2010 09:43:10 +0000 (UTC) From: Juli Mallett <jmallett@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r207148 - user/jmallett/octeon/sys/mips/cavium/octe Message-ID: <201004240943.o3O9hADg090402@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jmallett Date: Sat Apr 24 09:43:10 2010 New Revision: 207148 URL: http://svn.freebsd.org/changeset/base/207148 Log: Add rather meaningless ifmedia interface; need to do an ioctl interface next. Modified: user/jmallett/octeon/sys/mips/cavium/octe/cavium-ethernet.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c user/jmallett/octeon/sys/mips/cavium/octe/octe.c Modified: user/jmallett/octeon/sys/mips/cavium/octe/cavium-ethernet.h ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/cavium-ethernet.h Sat Apr 24 09:41:53 2010 (r207147) +++ user/jmallett/octeon/sys/mips/cavium/octe/cavium-ethernet.h Sat Apr 24 09:43:10 2010 (r207148) @@ -37,6 +37,8 @@ AND WITH ALL FAULTS AND CAVIUM NETWORKS #ifndef CAVIUM_ETHERNET_H #define CAVIUM_ETHERNET_H +#include <net/if_media.h> + /** * These enumerations are the return codes for the Ethernet * driver intercept callback. Depending on the return code, @@ -108,6 +110,8 @@ typedef struct { int (*init)(struct ifnet *ifp); void (*uninit)(struct ifnet *ifp); + + struct ifmedia media; } cvm_oct_private_t; Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c Sat Apr 24 09:41:53 2010 (r207147) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c Sat Apr 24 09:43:10 2010 (r207148) @@ -294,7 +294,6 @@ int cvm_oct_common_init(struct ifnet *if memset(ifp->get_stats(ifp), 0, sizeof(struct ifnet_stats)); #endif - if_initname(ifp, device_get_name(priv->dev), device_get_unit(priv->dev)); ether_ifattach(ifp, mac); return 0; Modified: user/jmallett/octeon/sys/mips/cavium/octe/octe.c ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/octe.c Sat Apr 24 09:41:53 2010 (r207147) +++ user/jmallett/octeon/sys/mips/cavium/octe/octe.c Sat Apr 24 09:43:10 2010 (r207148) @@ -28,6 +28,8 @@ /* * Cavium Octeon Ethernet devices. + * + * XXX This file should be moved to if_octe.c */ #include <sys/param.h> @@ -44,6 +46,9 @@ #include <sys/sockio.h> #include <sys/sysctl.h> +#include <net/if.h> +#include <net/if_types.h> + #include "wrapper-cvmx-includes.h" #include "cavium-ethernet.h" @@ -52,6 +57,9 @@ static int octe_attach(device_t dev); static int octe_detach(device_t dev); static int octe_shutdown(device_t dev); +static int octe_medchange(struct ifnet *ifp); +static void octe_medstat(struct ifnet *ifp, struct ifmediareq *ifm); + static device_method_t octe_methods[] = { /* Device interface */ DEVMETHOD(device_probe, octe_probe), @@ -91,6 +99,18 @@ octe_probe(device_t dev) static int octe_attach(device_t dev) { + struct ifnet *ifp; + cvm_oct_private_t *priv; + + priv = device_get_softc(dev); + ifp = priv->ifp; + + if_initname(ifp, device_get_name(dev), device_get_unit(dev)); + + ifmedia_init(&priv->media, 0, octe_medchange, octe_medstat); + ifmedia_add(&priv->media, IFM_ETHER | IFM_AUTO, 0, NULL); + ifmedia_set(&priv->media, IFM_ETHER | IFM_AUTO); + return (0); } @@ -105,3 +125,49 @@ octe_shutdown(device_t dev) { return (octe_detach(dev)); } + +static int +octe_medchange(struct ifnet *ifp) +{ + return (ENOTSUP); +} + +static void +octe_medstat(struct ifnet *ifp, struct ifmediareq *ifm) +{ + cvm_oct_private_t *priv; + cvmx_helper_link_info_t link_info; + + ifm->ifm_status = IFM_AVALID; + ifm->ifm_active = IFT_ETHER; + + priv = ifp->if_softc; + priv->poll(ifp); + + link_info.u64 = priv->link_info; + + if (!link_info.s.link_up) + return; + + ifm->ifm_status |= IFM_ACTIVE; + + switch (link_info.s.speed) { + case 10: + ifm->ifm_active |= IFM_10_T; + break; + case 100: + ifm->ifm_active |= IFM_100_TX; + break; + case 1000: + ifm->ifm_active |= IFM_1000_T; + break; + case 10000: + ifm->ifm_active |= IFM_10G_T; + break; + } + + if (link_info.s.full_duplex) + ifm->ifm_active |= IFM_FDX; + else + ifm->ifm_active |= IFM_HDX; +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004240943.o3O9hADg090402>