Thanks!  This confirms my theory that the bug is in the kernel.  I think
that the dmasound module which you are using as your sound driver contains
uninitialised static variables, which are supposed to contain 0 initially
but in fact contain rubbish - in your case it happens to be -1, which is
an invalid value and causes malfunction of the driver (-1 = -EPERM).

I'm reassigning this bug to kernel-image-2.6.10-powerpc until proven
wrong.  Below is my analysis and a suggestion how to fix it.  I just don't
have a powerpc machine to test it myself.  You may also find that using
ALSA rather than OSS driver will probably not exhibit this problem.

On Friday, 11 Mar, Vincent Lefevre wrote:
> 
> Here's what I got when I hadn't changed the microphone value:
> 
> open("/dev/mixer", O_RDWR)              = 9
> ...
> ioctl(9, 0x40044d07, 0x7ffff03c)        = -1 EPERM (Operation not permitted)

First time it barfed on reading the value of mixer element 7 - microphone
(SOUND_MIXER_READ_MIC ioctl).

> And after using gnome-volume-control:
> 
> open("/dev/mixer", O_RDWR)              = 9
> ...
> ioctl(9, 0x40044d07, 0x7ffff03c)        = 0
> ioctl(9, 0xc0044d07, 0x7fffef00)        = 0
> ...
> ioctl(9, 0x40044d0c, 0x7ffff03c)        = 0
> ioctl(9, 0xc0044d0c, 0x7fffef00)        = -1 EPERM (Operation not permitted)

After microphone volume had been changed with gnome-volume-control,
SOUND_MIXER_READ_MIC went fine, but we got EPERM at element 12 - input
gain.

Looking at sound/oss/dmasound/dmasound_awacs.c, lines 1989 and 1982, we
can see that the variables responsible are mic_lev and ip_gain.  In lines
178-182, mic_lev and ip_gain can be seen as two of the uninitialised
static variables.

When IOCTL_OUT is passed a negative value, it treats it as error code and
returns it intact instead of storing it in the user-provided location.
Thus, when mic_lev and ip_gain contain the invalid value -1 due to their
non-initialisation, it is returned as error code EPERM from the ioctl.
Once mic_lev has been assigned a valid value by gnome-volume-control, it
no longer causes this error condition.

I suggest that identifying all uninitialised static variables in the
dmasound directory and explicitly initialising them with 0 should fix this
problem.

Note that I was surprised to learn that bss is not zeroed out when a
module is loaded, thus breaking the convention that all non-initialised
statics automatically initialise to 0.  But it appears to be so.

Nikita


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to