From owner-svn-src-user@FreeBSD.ORG Fri Apr 23 09:29:32 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 372F8106564A; Fri, 23 Apr 2010 09:29:32 +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 249A08FC25; Fri, 23 Apr 2010 09:29:32 +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 o3N9TV4i057773; Fri, 23 Apr 2010 09:29:32 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o3N9TVg3057769; Fri, 23 Apr 2010 09:29:31 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201004230929.o3N9TVg3057769@svn.freebsd.org> From: Juli Mallett Date: Fri, 23 Apr 2010 09:29:31 +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: r207107 - in 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: Fri, 23 Apr 2010 09:29:32 -0000 Author: jmallett Date: Fri Apr 23 09:29:30 2010 New Revision: 207107 URL: http://svn.freebsd.org/changeset/base/207107 Log: o) Add device attachments for octe and pow devices. XXX It would be nice if bus_add_child had a default that returned NULL instead of, seemingly, a nonzero errno. Added: user/jmallett/octeon/sys/mips/cavium/octe/octe.c Modified: user/jmallett/octeon/sys/mips/cavium/files.octeon1 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/ethernet-common.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c user/jmallett/octeon/sys/mips/cavium/octe/octebus.c Modified: user/jmallett/octeon/sys/mips/cavium/files.octeon1 ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/files.octeon1 Fri Apr 23 09:09:39 2010 (r207106) +++ user/jmallett/octeon/sys/mips/cavium/files.octeon1 Fri Apr 23 09:29:30 2010 (r207107) @@ -28,6 +28,7 @@ mips/cavium/octe/ethernet-sgmii.c optio mips/cavium/octe/ethernet-spi.c optional octe mips/cavium/octe/ethernet-tx.c optional octe mips/cavium/octe/ethernet-xaui.c optional octe +mips/cavium/octe/octe.c optional octe mips/cavium/octe/octebus.c optional octe contrib/octeon-sdk/cvmx-bootmem.c optional octe Modified: user/jmallett/octeon/sys/mips/cavium/octe/cavium-ethernet.h ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/cavium-ethernet.h Fri Apr 23 09:09:39 2010 (r207106) +++ user/jmallett/octeon/sys/mips/cavium/octe/cavium-ethernet.h Fri Apr 23 09:29:30 2010 (r207107) @@ -98,9 +98,11 @@ typedef struct { void (*poll)(struct ifnet *ifp); /* Called periodically to check link status */ /* - * XXX/juli - * I think we'll need to wrap these with the normal ifnet glue. + * FreeBSD additions. */ + device_t dev; + struct ifnet *ifp; + int (*open)(struct ifnet *ifp); int (*stop)(struct ifnet *ifp); Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c Fri Apr 23 09:09:39 2010 (r207106) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c Fri Apr 23 09:29:30 2010 (r207107) @@ -242,6 +242,7 @@ int cvm_oct_common_init(struct ifnet *if octeon_bootinfo->mac_addr_base[5] + count}; cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; + device_attach(priv->dev); /* Force the interface to use the POW send if always_use_pow was specified or it is in the pow send list */ @@ -284,6 +285,7 @@ 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/ethernet-common.h ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h Fri Apr 23 09:09:39 2010 (r207106) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h Fri Apr 23 09:29:30 2010 (r207107) @@ -30,7 +30,7 @@ AND WITH ALL FAULTS AND CAVIUM NETWORKS int cvm_oct_common_init(struct ifnet *ifp); void cvm_oct_common_uninit(struct ifnet *ifp); -int cvm_oct_init_module(void); +int cvm_oct_init_module(device_t); void cvm_oct_cleanup_module(void); /* Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c Fri Apr 23 09:09:39 2010 (r207106) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c Fri Apr 23 09:29:30 2010 (r207107) @@ -315,8 +315,9 @@ int cvm_oct_free_work(void *work_queue_e * * @return Zero on success */ -int cvm_oct_init_module(void) +int cvm_oct_init_module(device_t bus) { + device_t dev; int ifnum; int num_interfaces; int interface; @@ -358,19 +359,24 @@ int cvm_oct_init_module(void) struct ifnet *ifp; printf("\tConfiguring device for POW only access\n"); - ifp = if_alloc(IFT_ETHER); - if (ifp) { + dev = BUS_ADD_CHILD(bus, 0, "pow", 0); + if (dev != NULL) + ifp = if_alloc(IFT_ETHER); + if (dev != NULL && ifp != NULL) { /* Initialize the device private structure. */ cvm_oct_private_t *priv; - - priv = malloc(sizeof(cvm_oct_private_t), M_TEMP, M_WAITOK | M_ZERO); + + device_probe(dev); + priv = device_get_softc(dev); + priv->dev = dev; + priv->ifp = ifp; priv->init = cvm_oct_common_init; priv->imode = CVMX_HELPER_INTERFACE_MODE_DISABLED; priv->port = CVMX_PIP_NUM_INPUT_PORTS; priv->queue = -1; if_initname(ifp, "pow", 0); - if_printf(ifp, "Cavium Octeon POW Ethernet\n"); + device_set_desc(dev, "Cavium Octeon POW Ethernet\n"); #if 0 for (qos = 0; qos < 16; qos++) m_queue_head_init(&priv->tx_free_list[qos]); @@ -402,8 +408,10 @@ int cvm_oct_init_module(void) cvm_oct_private_t *priv; struct ifnet *ifp; - ifp = if_alloc(IFT_ETHER); - if (!ifp) { + dev = BUS_ADD_CHILD(bus, 0, "octe", ifnum++); + if (dev != NULL) + ifp = if_alloc(IFT_ETHER); + if (dev == NULL || ifp == NULL) { printf("\t\tFailed to allocate ethernet device for port %d\n", port); continue; } @@ -414,7 +422,10 @@ int cvm_oct_init_module(void) #endif /* Initialize the device private structure. */ - priv = malloc(sizeof(cvm_oct_private_t), M_TEMP, M_WAITOK | M_ZERO); + device_probe(dev); + priv = device_get_softc(dev); + priv->dev = dev; + priv->ifp = ifp; priv->imode = imode; priv->port = port; priv->queue = cvmx_pko_get_base_queue(priv->port); @@ -427,8 +438,6 @@ int cvm_oct_init_module(void) for (qos = 0; qos < cvmx_pko_get_num_queues(port); qos++) cvmx_fau_atomic_write32(priv->fau+qos*4, 0); - if_initname(ifp, "octe", ifnum++); - switch (priv->imode) { /* These types don't support ports to IPD/PKO */ @@ -440,43 +449,43 @@ int cvm_oct_init_module(void) case CVMX_HELPER_INTERFACE_MODE_NPI: priv->init = cvm_oct_common_init; priv->uninit = cvm_oct_common_uninit; - if_printf(ifp, "Cavium Octeon NPI Ethernet\n"); + device_set_desc(dev, "Cavium Octeon NPI Ethernet"); break; case CVMX_HELPER_INTERFACE_MODE_XAUI: priv->init = cvm_oct_xaui_init; priv->uninit = cvm_oct_xaui_uninit; - if_printf(ifp, "Cavium Octeon XAUI Ethernet\n"); + device_set_desc(dev, "Cavium Octeon XAUI Ethernet"); break; case CVMX_HELPER_INTERFACE_MODE_LOOP: priv->init = cvm_oct_common_init; priv->uninit = cvm_oct_common_uninit; - if_printf(ifp, "Cavium Octeon LOOP Ethernet\n"); + device_set_desc(dev, "Cavium Octeon LOOP Ethernet"); break; case CVMX_HELPER_INTERFACE_MODE_SGMII: priv->init = cvm_oct_sgmii_init; priv->uninit = cvm_oct_sgmii_uninit; - if_printf(ifp, "Cavium Octeon SGMII Ethernet\n"); + device_set_desc(dev, "Cavium Octeon SGMII Ethernet"); break; case CVMX_HELPER_INTERFACE_MODE_SPI: priv->init = cvm_oct_spi_init; priv->uninit = cvm_oct_spi_uninit; - if_printf(ifp, "Cavium Octeon SPI Ethernet\n"); + device_set_desc(dev, "Cavium Octeon SPI Ethernet"); break; case CVMX_HELPER_INTERFACE_MODE_RGMII: priv->init = cvm_oct_rgmii_init; priv->uninit = cvm_oct_rgmii_uninit; - if_printf(ifp, "Cavium Octeon RGMII Ethernet\n"); + device_set_desc(dev, "Cavium Octeon RGMII Ethernet"); break; case CVMX_HELPER_INTERFACE_MODE_GMII: priv->init = cvm_oct_rgmii_init; priv->uninit = cvm_oct_rgmii_uninit; - if_printf(ifp, "Cavium Octeon GMII Ethernet\n"); + device_set_desc(dev, "Cavium Octeon GMII Ethernet"); break; } Added: user/jmallett/octeon/sys/mips/cavium/octe/octe.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/jmallett/octeon/sys/mips/cavium/octe/octe.c Fri Apr 23 09:29:30 2010 (r207107) @@ -0,0 +1,107 @@ +/*- + * Copyright (c) 2010 Juli Mallett + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * Cavium Octeon Ethernet devices. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wrapper-cvmx-includes.h" +#include "cavium-ethernet.h" + +static int octe_probe(device_t dev); +static int octe_attach(device_t dev); +static int octe_detach(device_t dev); +static int octe_shutdown(device_t dev); + +static device_method_t octe_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, octe_probe), + DEVMETHOD(device_attach, octe_attach), + DEVMETHOD(device_detach, octe_detach), + DEVMETHOD(device_shutdown, octe_shutdown), + + { 0, 0 } +}; + +static driver_t octe_driver = { + "octe", + octe_methods, + sizeof (cvm_oct_private_t), +}; + +static devclass_t octe_devclass; + +DRIVER_MODULE(octe, octebus, octe_driver, octe_devclass, 0, 0); + +static driver_t pow_driver = { + "pow", + octe_methods, + sizeof (cvm_oct_private_t), +}; + +static devclass_t pow_devclass; + +DRIVER_MODULE(pow, octebus, pow_driver, pow_devclass, 0, 0); + +static int +octe_probe(device_t dev) +{ + return (0); +} + +static int +octe_attach(device_t dev) +{ + return (0); +} + +static int +octe_detach(device_t dev) +{ + return (0); +} + +static int +octe_shutdown(device_t dev) +{ + return (octe_detach(dev)); +} Modified: user/jmallett/octeon/sys/mips/cavium/octe/octebus.c ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/octebus.c Fri Apr 23 09:09:39 2010 (r207106) +++ user/jmallett/octeon/sys/mips/cavium/octe/octebus.c Fri Apr 23 09:29:30 2010 (r207107) @@ -28,8 +28,6 @@ /* * Cavium Octeon Ethernet pseudo-bus attachment. - * - * XXX Would be nice to have a device for each iface. */ #include @@ -62,6 +60,9 @@ static device_method_t octebus_methods[] DEVMETHOD(device_detach, octebus_detach), DEVMETHOD(device_shutdown, octebus_shutdown), + /* Bus interface. */ + DEVMETHOD(bus_add_child, bus_generic_add_child), + { 0, 0 } }; @@ -95,9 +96,10 @@ octebus_attach(device_t dev) { int rv; - rv = cvm_oct_init_module(); + rv = cvm_oct_init_module(dev); if (rv != 0) return (ENXIO); + return (0); }