Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Jan 2010 19:06:47 +0000 (UTC)
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r202409 - in stable/7/sys/boot: common sparc64/loader
Message-ID:  <201001151906.o0FJ6lJB062783@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marius
Date: Fri Jan 15 19:06:47 2010
New Revision: 202409
URL: http://svn.freebsd.org/changeset/base/202409

Log:
  MFC:  r201932
  
  - Add code allowing a network device to only be open and closed once
    by keeping it opened after the first open and closing it via the
    cleanup handler when NETIF_OPEN_CLOSE_ONCE is defined. Note that
    due to the fact that the part of r177108 which reverts r60506 and
    causes the open-close-dance on every file access as the remaining
    problems with powerpc should be sorted out first, in stable/7 the
    only difference in behavior between when NETIF_OPEN_CLOSE_ONCE is
    defined and not currently is that with that macro defined the
    network device is eventually closed before entering the kernel and
    before rebooting.
  - Define NETIF_OPEN_CLOSE_ONCE on sparc64 in order to not keep the
    network device opened forever, as at least with some firmware
    versions received packets are DMA'ed to stale memory otherwise.

Modified:
  stable/7/sys/boot/common/dev_net.c
  stable/7/sys/boot/sparc64/loader/Makefile
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/boot/common/dev_net.c
==============================================================================
--- stable/7/sys/boot/common/dev_net.c	Fri Jan 15 19:06:33 2010	(r202408)
+++ stable/7/sys/boot/common/dev_net.c	Fri Jan 15 19:06:47 2010	(r202409)
@@ -71,12 +71,14 @@ __FBSDID("$FreeBSD$");
 int debug = 0;
 #endif
 
+static char *netdev_name;
 static int netdev_sock = -1;
 static int netdev_opens;
 
 static int	net_init(void);
 static int	net_open(struct open_file *, ...);
 static int	net_close(struct open_file *);
+static void	net_cleanup(void);
 static int	net_strategy();
 static void	net_print(int);
 
@@ -90,7 +92,8 @@ struct devsw netdev = {
 	net_open,
 	net_close,
 	noioctl,
-	net_print
+	net_print,
+	net_cleanup
 };
 
 static int
@@ -116,6 +119,12 @@ net_open(struct open_file *f, ...)
 	devname = va_arg(args, char*);
 	va_end(args);
 
+#ifdef	NETIF_OPEN_CLOSE_ONCE
+	/* Before opening another interface, close the previous one first. */
+	if (netdev_sock >= 0 && strcmp(devname, netdev_name) != 0)
+		net_cleanup();
+#endif
+
 	/* On first open, do netif open, mount, etc. */
 	if (netdev_opens == 0) {
 		/* Find network interface. */
@@ -125,6 +134,7 @@ net_open(struct open_file *f, ...)
 				printf("net_open: netif_open() failed\n");
 				return (ENXIO);
 			}
+			netdev_name = strdup(devname);
 #ifdef	NETIF_DEBUG
 			if (debug)
 				printf("net_open: netif_open() succeeded\n");
@@ -135,6 +145,7 @@ net_open(struct open_file *f, ...)
 			error = net_getparams(netdev_sock);
 			if (error) {
 				/* getparams makes its own noise */
+				free(netdev_name);
 				netif_close(netdev_sock);
 				netdev_sock = -1;
 				return (error);
@@ -150,30 +161,46 @@ net_open(struct open_file *f, ...)
 static int
 net_close(struct open_file *f)
 {
+
 #ifdef	NETIF_DEBUG
 	if (debug)
 		printf("net_close: opens=%d\n", netdev_opens);
 #endif
 
-	/* On last close, do netif close, etc. */
 	f->f_devdata = NULL;
+
+#ifndef	NETIF_OPEN_CLOSE_ONCE
 	/* Extra close call? */
 	if (netdev_opens <= 0)
 		return (0);
 	netdev_opens--;
 	/* Not last close? */
 	if (netdev_opens > 0)
-		return(0);
-	rootip.s_addr = 0;
+		return (0);
+	/* On last close, do netif close, etc. */
+#ifdef	NETIF_DEBUG
+	if (debug)
+		printf("net_close: calling net_cleanup()\n");
+#endif
+	net_cleanup();
+#endif
+	return (0);
+}
+
+static void
+net_cleanup(void)
+{
+
 	if (netdev_sock >= 0) {
 #ifdef	NETIF_DEBUG
 		if (debug)
-			printf("net_close: calling netif_close()\n");
+			printf("net_cleanup: calling netif_close()\n");
 #endif
+		rootip.s_addr = 0;
+		free(netdev_name);
 		netif_close(netdev_sock);
 		netdev_sock = -1;
 	}
-	return (0);
 }
 
 static int

Modified: stable/7/sys/boot/sparc64/loader/Makefile
==============================================================================
--- stable/7/sys/boot/sparc64/loader/Makefile	Fri Jan 15 19:06:33 2010	(r202408)
+++ stable/7/sys/boot/sparc64/loader/Makefile	Fri Jan 15 19:06:47 2010	(r202409)
@@ -50,11 +50,15 @@ CFLAGS+=	-DBOOT_FORTH -I${.CURDIR}/../..
 LIBFICL=	${.OBJDIR}/../../ficl/libficl.a
 .endif
 
-# Always add MI sources 
+# Always add MI sources
 .PATH:		${.CURDIR}/../../common
 .include	"${.CURDIR}/../../common/Makefile.inc"
 CFLAGS+=	-I${.CURDIR}/../../common
 CFLAGS+=	-I.
+# Avoid the open-close-dance for every file access as some firmwares perform
+# an auto-negotiation on every open of the network interface and thus causes
+# netbooting to take horribly long.
+CFLAGS+=	-DNETIF_OPEN_CLOSE_ONCE
 
 CLEANFILES+=	vers.c loader.help
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001151906.o0FJ6lJB062783>