Date: Fri, 23 Apr 2010 09:29:31 +0000 (UTC) From: Juli Mallett <jmallett@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r207107 - in user/jmallett/octeon/sys/mips/cavium: . octe Message-ID: <201004230929.o3N9TVg3057769@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 <jmallett@FreeBSD.org> + * 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 <sys/param.h> +#include <sys/systm.h> +#include <sys/bus.h> +#include <sys/endian.h> +#include <sys/kernel.h> +#include <sys/mbuf.h> +#include <sys/lock.h> +#include <sys/module.h> +#include <sys/mutex.h> +#include <sys/rman.h> +#include <sys/socket.h> +#include <sys/sockio.h> +#include <sys/sysctl.h> + +#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 <sys/param.h> @@ -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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004230929.o3N9TVg3057769>