Date: Fri, 23 Apr 2010 01:45:38 +0000 (UTC) From: Juli Mallett <jmallett@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r207090 - in user/jmallett/octeon/sys/mips/cavium: . octe Message-ID: <201004230145.o3N1jcmb054571@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jmallett Date: Fri Apr 23 01:45:38 2010 New Revision: 207090 URL: http://svn.freebsd.org/changeset/base/207090 Log: Use a pseudo-bus to manage the octe interfaces and punt, for now, on giving them each their own device_t. Added: user/jmallett/octeon/sys/mips/cavium/octe/octebus.c Modified: user/jmallett/octeon/sys/mips/cavium/files.octeon1 user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c Modified: user/jmallett/octeon/sys/mips/cavium/files.octeon1 ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/files.octeon1 Fri Apr 23 01:34:01 2010 (r207089) +++ user/jmallett/octeon/sys/mips/cavium/files.octeon1 Fri Apr 23 01:45:38 2010 (r207090) @@ -27,6 +27,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/octebus.c optional octe contrib/octeon-sdk/cvmx-bootmem.c optional octe contrib/octeon-sdk/cvmx-cmd-queue.c optional octe Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h Fri Apr 23 01:34:01 2010 (r207089) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h Fri Apr 23 01:45:38 2010 (r207090) @@ -30,6 +30,9 @@ 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); +void cvm_oct_cleanup_module(void); + /* * XXX/juli * These belong elsewhere but we can't stomach the nested extern. Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c Fri Apr 23 01:34:01 2010 (r207089) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c Fri Apr 23 01:45:38 2010 (r207090) @@ -327,16 +327,14 @@ int cvm_oct_free_work(void *work_queue_e * * @return Zero on success */ -static int cvm_oct_init_module(void) +int cvm_oct_init_module(void) { - device_t dev; + int ifnum; int num_interfaces; int interface; int fau = FAU_NUM_PACKET_BUFFERS_TO_FREE; int qos; - dev = NULL; - printf("cavium-ethernet: %s\n", OCTEON_SDK_VERSION_STRING); #if 0 @@ -365,6 +363,8 @@ static int cvm_oct_init_module(void) memset(cvm_oct_device, 0, sizeof(cvm_oct_device)); + ifnum = 0; + /* Initialize the FAU used for counting packet buffers that need to be freed */ cvmx_fau_atomic_write32(FAU_NUM_PACKET_BUFFERS_TO_FREE, 0); @@ -382,7 +382,9 @@ static int cvm_oct_init_module(void) priv->imode = CVMX_HELPER_INTERFACE_MODE_DISABLED; priv->port = CVMX_PIP_NUM_INPUT_PORTS; priv->queue = -1; - device_set_desc(dev, "Cavium Octeon POW Ethernet"); + + if_initname(ifp, "octe", ifnum++); + if_printf(ifp, "Cavium Octeon POW Ethernet\n"); #if 0 for (qos = 0; qos < 16; qos++) m_queue_head_init(&priv->tx_free_list[qos]); @@ -438,6 +440,8 @@ static 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 */ @@ -449,43 +453,43 @@ static int cvm_oct_init_module(void) case CVMX_HELPER_INTERFACE_MODE_NPI: priv->init = cvm_oct_common_init; priv->uninit = cvm_oct_common_uninit; - device_set_desc(dev, "Cavium Octeon NPI Ethernet"); + if_printf(ifp, "Cavium Octeon NPI Ethernet\n"); break; case CVMX_HELPER_INTERFACE_MODE_XAUI: priv->init = cvm_oct_xaui_init; priv->uninit = cvm_oct_xaui_uninit; - device_set_desc(dev, "Cavium Octeon XAUI Ethernet"); + if_printf(ifp, "Cavium Octeon XAUI Ethernet\n"); break; case CVMX_HELPER_INTERFACE_MODE_LOOP: priv->init = cvm_oct_common_init; priv->uninit = cvm_oct_common_uninit; - device_set_desc(dev, "Cavium Octeon LOOP Ethernet"); + if_printf(ifp, "Cavium Octeon LOOP Ethernet\n"); break; case CVMX_HELPER_INTERFACE_MODE_SGMII: priv->init = cvm_oct_sgmii_init; priv->uninit = cvm_oct_sgmii_uninit; - device_set_desc(dev, "Cavium Octeon SGMII Ethernet"); + if_printf(ifp, "Cavium Octeon SGMII Ethernet\n"); break; case CVMX_HELPER_INTERFACE_MODE_SPI: priv->init = cvm_oct_spi_init; priv->uninit = cvm_oct_spi_uninit; - device_set_desc(dev, "Cavium Octeon SPI Ethernet"); + if_printf(ifp, "Cavium Octeon SPI Ethernet\n"); break; case CVMX_HELPER_INTERFACE_MODE_RGMII: priv->init = cvm_oct_rgmii_init; priv->uninit = cvm_oct_rgmii_uninit; - device_set_desc(dev, "Cavium Octeon RGMII Ethernet"); + if_printf(ifp, "Cavium Octeon RGMII Ethernet\n"); break; case CVMX_HELPER_INTERFACE_MODE_GMII: priv->init = cvm_oct_rgmii_init; priv->uninit = cvm_oct_rgmii_uninit; - device_set_desc(dev, "Cavium Octeon GMII Ethernet"); + if_printf(ifp, "Cavium Octeon GMII Ethernet\n"); break; } @@ -533,7 +537,7 @@ static int cvm_oct_init_module(void) * * @return Zero on success */ -static void cvm_oct_cleanup_module(void) +void cvm_oct_cleanup_module(void) { int port; @@ -580,22 +584,3 @@ static void cvm_oct_cleanup_module(void) if (CVMX_FPA_OUTPUT_BUFFER_POOL != CVMX_FPA_PACKET_POOL) cvm_oct_mem_empty_fpa(CVMX_FPA_OUTPUT_BUFFER_POOL, CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE, 128); } - -static int -cvm_oct_modevent(module_t mod __unused, int type, void *data __unused) -{ - switch(type) { - case MOD_LOAD: - cvm_oct_init_module(); - break; - case MOD_UNLOAD: - case MOD_SHUTDOWN: - cvm_oct_cleanup_module(); - break; - default: - return (EOPNOTSUPP); - } - return (0); -} -DEV_MODULE(octe, cvm_oct_modevent, NULL); -MODULE_VERSION(octe, 1); Added: user/jmallett/octeon/sys/mips/cavium/octe/octebus.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/jmallett/octeon/sys/mips/cavium/octe/octebus.c Fri Apr 23 01:45:38 2010 (r207090) @@ -0,0 +1,115 @@ +/*- + * 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 pseudo-bus attachment. + * + * XXX Would be nice to have a device for each iface. + */ + +#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 "ethernet-common.h" + +static void octebus_identify(driver_t *drv, device_t parent); +static int octebus_probe(device_t dev); +static int octebus_attach(device_t dev); +static int octebus_detach(device_t dev); +static int octebus_shutdown(device_t dev); + +static device_method_t octebus_methods[] = { + /* Device interface */ + DEVMETHOD(device_identify, octebus_identify), + DEVMETHOD(device_probe, octebus_probe), + DEVMETHOD(device_attach, octebus_attach), + DEVMETHOD(device_detach, octebus_detach), + DEVMETHOD(device_shutdown, octebus_shutdown), + + { 0, 0 } +}; + +static driver_t octebus_driver = { + "octebus", + octebus_methods, + 1, +}; + +static devclass_t octebus_devclass; + +DRIVER_MODULE(octebus, nexus, octebus_driver, octebus_devclass, 0, 0); + +static void +octebus_identify(driver_t *drv, device_t parent) +{ + BUS_ADD_CHILD(parent, 0, "octebus", 0); +} + +static int +octebus_probe(device_t dev) +{ + if (device_get_unit(dev) != 0) + return (ENXIO); + device_set_desc(dev, "Cavium Octeon Ethernet pseudo-bus"); + return (0); +} + +static int +octebus_attach(device_t dev) +{ + int rv; + + rv = cvm_oct_init_module(); + if (rv != 0) + return (ENXIO); + return (0); +} + +static int +octebus_detach(device_t dev) +{ + cvm_oct_cleanup_module(); + return (0); +} + +static int +octebus_shutdown(device_t dev) +{ + return (octebus_detach(dev)); +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004230145.o3N1jcmb054571>