Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 23 Sep 2000 03:39:51 +1100 (EST)
From:      Bruce Evans <bde@zeta.org.au>
To:        sanpei@FreeBSD.ORG
Cc:        imp@village.org, current@FreeBSD.ORG
Subject:   Re: Please review: small change in sys/i386/isa/clock.c andsys/alpha/alpha/clock.c for PC-Card melody beep code. 
Message-ID:  <Pine.BSF.4.21.0009230324470.7140-100000@besplex.bde.org>
In-Reply-To: <200009221500.e8MF0Me01325@lavender.sanpei.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 23 Sep 2000 sanpei@FreeBSD.ORG wrote:

> Bruce Evans <bde@zeta.org.au> wrote:
> >It needs locking changes to be exportable:
> >
> >1) splhigh()/splx(), at least in RELENG_4 where there is no giant lock
> >   and spl*() has a non-null effect, so that callers don't need to know
> >   that it must be called at splsoftclock() or higher.
> >2) Honor the current locking protocol acquire_timer2()/release_timer2()
> >   -- don't do anything if (!beeping).
> 
>   Hum, is below code which was from PAO3 good for FreeBSD tree?
> 
> # But I think it has still has 1) problem....... Do you have any
> # idea about this melody patch...

Yes, it has (1) (sysbeep_cancel() must be called at splsoftlock() or maybe
at splclock(), while sysbeep() can be called at any ipl).  sysbeep_cancel()
is a little cleaner -- sysbeepstop() is the timeout routine and calling it
directly is a hack.

sysbeep_ch could probably be avoided by letting the timeout expire and
doing nothing if !beeping.

Bruce

> --- sys/i386/isa/clock.c.org	Mon Jan  3 10:46:36 2000
> +++ sys/i386/isa/clock.c	Mon Jan  3 10:47:52 2000
> @@ -188,6 +188,9 @@
>  SYSCTL_OPAQUE(_debug, OID_AUTO, tsc_timecounter, CTLFLAG_RD, 
>  	&tsc_timecounter, sizeof(tsc_timecounter), "S,timecounter", "");
>  
> +static struct callout_handle sysbeep_ch
> +	= CALLOUT_HANDLE_INITIALIZER(&sysbeep_ch);
> +
>  static struct timecounter i8254_timecounter = {
>  	i8254_get_timecount,	/* get_timecount */
>  	0,			/* no poll_pps */
> @@ -536,10 +539,21 @@
>  		/* enable counter2 output to speaker */
>  		outb(IO_PPI, inb(IO_PPI) | 3);
>  		beeping = period;
> -		timeout(sysbeepstop, (void *)NULL, period);
> +		sysbeep_ch = timeout(sysbeepstop, (void *)NULL, period);
>  	}
>  	splx(x);
>  	return (0);
> +}    
> +
> +int
> +sysbeep_cancel(void)
> +{
> +	if (beeping) {
> +		untimeout(sysbeepstop, (void *)NULL, sysbeep_ch);
> +		sysbeepstop((void *)NULL);
> +		return 0;
> +	}
> +	return -1;
>  }
>  
>  /*
> --- sys/i386/include/clock.h.org	Mon Jan  3 10:58:30 2000
> +++ sys/i386/include/clock.h	Mon Jan  3 10:59:13 2000
> @@ -44,6 +44,7 @@
>  int	release_timer1 __P((void));
>  #endif
>  int	sysbeep __P((int pitch, int period));
> +int	sysbeep_cancel __P((void));
>  void	i8254_restore __P((void));
>  
>  #endif /* _KERNEL */
> 



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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0009230324470.7140-100000>