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