Skip site navigation (1)Skip section navigation (2)
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>