svn commit: r202409 - in stable/7/sys/boot: common sparc64/loader
Marius Strobl
marius at FreeBSD.org
Fri Jan 15 19:06:47 UTC 2010
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
More information about the svn-src-stable-7
mailing list