Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 11 Jun 2001 03:30:48 +0100 (BST)
From:      spadger@best.com
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/28026: Rage 128 Suspend issues
Message-ID:  <20010611023048.5B8A03E96@CRWdog.demon.co.uk>

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

>Number:         28026
>Category:       bin
>Synopsis:       Graphics mode suspend causes weird hang on laptop with Rage card
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sun Jun 10 19:40:01 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     Andy Sparrow
>Release:        FreeBSD 4.3-RELEASE i386
>Organization:
>Environment:
System: FreeBSD omni.geek4food.org 4.3-RELEASE FreeBSD 4.3-RELEASE #52: Sat Jun 9 23:31:24 BST 2001 root@omni.geek4food.org:/usr/src/sys/compile/o6k i386

	Omnibook 6000, Compaq Armada, multiple machines with Rage
	Mobility chipset (maybe others), believed most (all?)
	versions of FreeBSD 4.x with XFree86 3.3.x (at least
	4.[23]-STABLE, 4.3-RELEASE with 3.3.6)

>Description:

	On machines that support suspend-to-ram or suspend-to-disk
	(not as extensively tested), it has been observed that
	suspending (via either the 'apm' binary or closing the lid,
	pressing suspend button etc.) whilst in graphics mode (e.g.
	running an X server, either XF86_SVGA or XF86_Mach64) will
	put the machine in a strange state, where the display is
	very dim (but still barely visible), but machine will not
	respond to keyboard, power button or network, and the
	machine is still using mucho power (e.g. gets v.hot in
	bag).

	The only recourse then is to reset, with the attendant loss
	of uptime and filesystem checks. Sometimes, it can be harder
	to find a paperclip than you think...

	Switching to a text mode VT first avoids this problem, the
	machine will suspend and resume as expected.

>How-To-Repeat:

	On such a machine as described (laptop with APM enabled
	and Rage Mobility chipset), suspend the machine, either
	via hardware or via 'apm', whilst running X.

>Fix:

	It is possible to hack around the problem by calling a
	binary (e.g. from 'rc.suspend') that switches to text mode
	first, before issuing the suspend call.

	This obviously leaves two files that need to be maintained,
	particularly when cvsup'ing regularly it is inevitable that
	this extra step will be overlooked sooner or later.

	Also, a better way to address this issue (if not in the X
	server itself), seems to be in the 'apm' binary, which
	should DTRT.

	I attach for your consideration some example patches to
	'apm' and its Makefile, and some (commented-out) options
	with descriptive commands for 'etc/defaults/make.conf'
	(intended to be activated in '/etc/make.conf', naturally).

	In this way, it is as unobtrusive as possible on machine/systems
	that don't need this, yet fixes the problems for machines
	that do.

	Thanks.


*** usr.sbin/apm/apm.c.orig	Tue Apr 17 23:53:48 2001
--- usr.sbin/apm/apm.c	Mon Apr 30 23:55:31 2001
***************
*** 36,41 ****
--- 36,47 ----
  
  #define APMDEV	"/dev/apm"
  
+ #ifdef WANT_TEXTMODE_SUSPEND
+ #define	VGADEV	"/dev/vga"
+ #include <sys/wait.h>
+ #include <machine/console.h>
+ #endif
+ 
  #define xh(a)	(((a) & 0xff00) >> 8)
  #define xl(a)	((a) & 0xff)
  #define APMERR(a) xh(a)
***************
*** 126,131 ****
--- 132,168 ----
  		err(1, "ioctl(APMIO_STANDBY)");
  }
  
+ #ifdef WANT_TEXTMODE_SUSPEND
+ void
+ apm_wrapper(int fd, void (*fptr)(int))
+ {
+ 	int myfd, vt, status;
+ 
+ 	myfd = open(VGADEV, O_RDONLY);
+ 	if(myfd < 0)
+ 		err(1, "open %s", VGADEV);
+ 	if(ioctl(myfd, VT_GETACTIVE, &vt) < 0)
+ 		err(1, "ioctl VT_GETACTIVE");
+ 	if(ioctl(myfd, VT_ACTIVATE, 1) < 0)
+ 		err(1, "ioctl VT_ACTIVATE");
+ 
+ 	switch(fork()) {
+ 	case -1:
+ 		err(1, "fork");
+ 	case 0:
+ 		fptr (fd);
+ 		break;
+ 	default:
+ 		wait(&status);
+ 		if(!WIFEXITED(status) || WEXITSTATUS(status))
+ 			errx(1, "apm -z failed");
+ 	}
+ 	sleep(2);
+ 	if(ioctl(myfd, VT_ACTIVATE, vt) < 0)
+ 		err(1, "ioctl VT_ACTIVATE");
+ }
+ #endif
+ 
  void 
  apm_getinfo(int fd, apm_info_t aip)
  {
***************
*** 483,492 ****
--- 520,535 ----
  		apm_haltcpu(fd, haltcpu);
  	if (delta)
  		apm_set_timer(fd, delta);
+ #ifdef WANT_TEXTMODE_SUSPEND
+ 	if (sleep || standby) {
+ 		apm_wrapper( fd, (sleep?apm_suspend:apm_standby) );
+ 	}
+ #else
  	if (sleep)
  		apm_suspend(fd);
  	else if (standby)
  		apm_standby(fd);
+ #endif
  	else if (delta == 0) {
  		struct apm_info info;
  

*** usr.sbin/apm/Makefile.orig	Wed Apr 18 00:45:22 2001
--- usr.sbin/apm/Makefile	Wed Apr 18 01:05:41 2001
***************
*** 5,8 ****
--- 5,20 ----
  MAN8=		apm.8
  MLINKS=		apm.8 apmconf.8 apm.8 zzz.8
  
+ 
+ .if defined(WANT_TEXTMODE_SUSPEND)
+ CFLAGS+= -DWANT_TEXTMODE_SUSPEND
+ .endif
+ 
+ .if defined(NOSUID) || !defined(ALLOW_USER_SUSPEND)
+ BINMODE=555
+ .else
+ BINMODE=4555
+ BINOWN= root
+ .endif
+ 
  .include <bsd.prog.mk>



*** etc/defaults/make.conf.orig	Thu Apr 19 15:16:43 2001
--- etc/defaults/make.conf	Thu Apr 19 15:24:49 2001
***************
*** 140,145 ****
--- 140,159 ----
  #NOMANCOMPRESS=	true
  #
  #
+ # Some machines (e.g. laptops) with certain graphics devices (notably
+ # ATI Rage Mobility) react badly to being suspended when in graphics
+ # mode (e.g. in X) and lock the machine entirely. If you suffer from
+ # this, try uncommenting the following:
+ #
+ #WANT_TEXTMODE_SUSPEND= true
+ #
+ #
+ # If you uncomment the above, you might want/need to uncomment the
+ # following to permit suspends by users. (Makes apm(8) SUID root).
+ #
+ #ALLOW_USER_SUSPEND= true
+ #
+ #
  # If you want the "compat" shared libraries installed as part of your normal
  # builds, uncomment these:
  #
>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




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