Re: IBM T42 freezes when going to sleep under X11

Gleb Smirnoff <[email protected]>
Newsgroups gmane.os.freebsd.stable,gmane.os.freebsd.devel.mobile
Message-ID <[email protected]>
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

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[email protected]"
em.suspend (text/plain, 1.7 KB)
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.