IBM T42 freezes when going to sleep under X11
George Hartzell
hartzell at kestrel.alerce.com
Sat Dec 3 20:09:33 GMT 2005
Gleb Smirnoff writes:
> 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
> 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
I'll post details as a reply to earlier in the thread, but I have
started seeing crashes. I don't suspect the em driver, I *do* suspect
synaptics support. But I have more digging to do....
With respect to this patch, it causes me a problem.
I have
ifconfig_em0="DHCP NOAUTO"
in my /etc/rc.conf, so that the interface doesn't come up unless I ask
it too (usually via /etc/rc.d/netif start em0)
With this patch applied, even if I've never started it, the interface
gets started. If I have a cable plugged in, it grabs a dhcp address
and takes off.
My devd.conf is stock.
g.
More information about the freebsd-mobile
mailing list