svn commit: r207107 - in user/jmallett/octeon/sys/mips/cavium: .
octe
Juli Mallett
jmallett at FreeBSD.org
Fri Apr 23 09:29:32 UTC 2010
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 at 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);
}
More information about the svn-src-user
mailing list