From owner-svn-src-user@FreeBSD.ORG Sat Apr 24 09:43:11 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 14C1C1065670; Sat, 24 Apr 2010 09:43:11 +0000 (UTC) (envelope-from jmallett@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 048C68FC1A; Sat, 24 Apr 2010 09:43:11 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o3O9hAtw090406; Sat, 24 Apr 2010 09:43:10 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o3O9hADg090402; Sat, 24 Apr 2010 09:43:10 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201004240943.o3O9hADg090402@svn.freebsd.org> From: Juli Mallett Date: Sat, 24 Apr 2010 09:43:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r207148 - user/jmallett/octeon/sys/mips/cavium/octe X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 24 Apr 2010 09:43:11 -0000 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 + /** * 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 @@ -44,6 +46,9 @@ #include #include +#include +#include + #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; +}