Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 3 Dec 2005 11:52:51 +0300
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        hartzell@alerce.com
Cc:        Jacques Garrigue <garrigue@math.nagoya-u.ac.jp>, freebsd-stable@FreeBSD.org, freebsd-mobile@FreeBSD.org
Subject:   Re: IBM T42 freezes when going to sleep under X11
Message-ID:  <20051203085251.GY22816@cell.sick.ru>
In-Reply-To: <17296.46122.671120.884060@satchel.alerce.com>
References:  <20051114.175031.93019232.garrigue@math.nagoya-u.ac.jp> <20051202.110448.25479607.garrigue@math.nagoya-u.ac.jp> <17296.46122.671120.884060@satchel.alerce.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--+KJYzRxRHjYqLGl5
Content-Type: text/plain; charset=koi8-r
Content-Disposition: inline

On Fri, Dec 02, 2005 at 12:52:58PM -0800, George Hartzell wrote:
G>  > I finally found the cause of my problems: there has been changes in
G>  > the em driver (Gb ethernet), such that the machine freezes when trying
G>  > to switch automatically from the X11 VT to the system console, before
G>  > going to sleep. The interaction is surprising, but clearly the problem
G>  > disappears when I remove "device em" from the kernel configuration,
G>  > and it reappears when I do "kldload if_em". Since I'm using only ath
G>  > (wireless) anyway, this is fine with me...
G>  > 
G>  > A previous partial solution suggested to me was to add
G>  >   hw.syscons.sc_no_suspend_vtswitch=1
G>  > to sysctl.conf, but this means the screen gets garbled and I have to
G>  > do the switch by hand anyway, which is a real pain.
G>  > Worse still: the machine would still freeze when going to sleep while
G>  > the disk is active.
G>  > 
G>  > The last step is to track down the bug in em, as it still seems to
G>  > be there in yesterday's STABLE.
G> 
G> I don't seem to have any problem with my T42p using a kernel compiled
G> on 11/29 11:21
G> 
G> My copy of if_em.c is:
G> 
G> /*$FreeBSD: src/sys/dev/em/if_em.c,v 1.65.2.8 2005/11/25 14:11:59 glebius Exp $*/

George, Jacques,

what em(4) cards exactly do you have?

pciconf -lv | grep -A4 ^em

Can you please try the attached patch?

-- 
Totus tuus, Glebius.
GLEBIUS-RIPN GLEB-RIPE

--+KJYzRxRHjYqLGl5
Content-Type: text/plain; charset=koi8-r
Content-Disposition: attachment; filename="em.suspend"

Index: if_em.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/em/if_em.c,v
retrieving revision 1.85
diff -u -r1.85 if_em.c
--- if_em.c	10 Nov 2005 11:44:37 -0000	1.85
+++ if_em.c	11 Nov 2005 12:13:48 -0000
@@ -129,8 +129,11 @@
 static int  em_attach(device_t);
 static int  em_detach(device_t);
 static int  em_shutdown(device_t);
+static int  em_suspend(device_t);
+static int  em_resume(device_t);
 static void em_intr(void *);
 static void em_start(struct ifnet *);
+static void em_start_locked(struct ifnet *ifp);
 static int  em_ioctl(struct ifnet *, u_long, caddr_t);
 static void em_watchdog(struct ifnet *);
 static void em_init(void *);
@@ -208,6 +211,8 @@
 	DEVMETHOD(device_attach, em_attach),
 	DEVMETHOD(device_detach, em_detach),
 	DEVMETHOD(device_shutdown, em_shutdown),
+	DEVMETHOD(device_suspend, em_suspend),
+	DEVMETHOD(device_resume, em_resume),
 	{0, 0}
 };
 
@@ -580,6 +585,41 @@
 	return(0);
 }
 
+/*
+ * Suspend/resume device methods.
+ */
+static int
+em_suspend(device_t dev)
+{
+	struct adapter *adapter = device_get_softc(dev);
+
+	EM_LOCK(adapter);
+	em_stop(adapter);
+	EM_UNLOCK(adapter);
+
+	return bus_generic_suspend(dev);
+}
+
+static int
+em_resume(device_t dev)
+{
+	struct adapter *adapter = device_get_softc(dev);
+	struct ifnet *ifp;
+
+	EM_LOCK(adapter);
+	ifp = adapter->ifp;
+	if (ifp->if_flags & IFF_UP) {
+		em_init_locked(adapter);
+		if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+			em_start_locked(ifp);
+	}
+
+	em_init_locked(adapter);
+	EM_UNLOCK(adapter);
+
+	return bus_generic_resume(dev);
+}
+
 
 /*********************************************************************
  *  Transmit entry point

--+KJYzRxRHjYqLGl5--



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