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