openvortex-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Openvortex-dev] vortex_write_codec


From: Ryan Underwood
Subject: [Openvortex-dev] vortex_write_codec
Date: Sun, 29 Jun 2003 04:51:02 -0500
User-agent: Mutt/1.5.4i

Hi Jeff, Manuel,

In the patch I submitted, I noted that two vortex_codec_read() are
needed at the end of vortex_codec_write() in order to ensure that the
next read is of the correct value.  However, in CVS, I notice there is
only one.  This causes tests for AC97 features to randomly fail on my
card.

ac97_try_bit simply does (pseudo):

origval = read()
testval = make_test_value(origval)
write(testval)
newval = read()
write(origval)
if (newval == testval) ENABLE_FEATURE else DISABLE_FEATURE

Here is a sample session of the ALSA ac97 driver testing for ac97
features. The first read after every write is the codec_write readback,
otherwise it is the ac97_try_bit reading the status.

Jun 29 04:18:56 dbz kernel: Read: @ 110: 8    get value
Jun 29 04:18:56 dbz kernel: Write: @ 110: 12  write
Jun 29 04:18:56 dbz kernel: Read: @ 110: 8    readback
Jun 29 04:18:56 dbz kernel: Read: @ 110: 12   check - ok!
Jun 29 04:18:56 dbz kernel: Write: @ 110: 8   write
Jun 29 04:18:56 dbz kernel: Read: @ 110: 12   readback

Jun 29 04:18:56 dbz kernel: Read: @ 110: 12   get value <--- WRONG VALUE
Jun 29 04:18:56 dbz kernel: Write: @ 110: 4   write
Jun 29 04:18:56 dbz kernel: Read: @ 110: 8    readback  <--- NOW it is
                                                        the value it should 
have been previously
Jun 29 04:18:56 dbz kernel: Read: @ 110: 4    check - ok!
Jun 29 04:18:56 dbz kernel: Write: @ 110: 12  write WRONG VALUE back
Jun 29 04:18:56 dbz kernel: Read: @ 110: 4    readback

This time, the codec features got successfully enabled by chance, but
the codec was in a wrong state upon initialization.  Sometimes the check
reads get the wrong value back and the codec features get disabled.

Now, I put two codec_reaD() at the end of the codec_write, so here is a
transcript of a successful ac97 init session:

Jun 29 04:31:16 dbz kernel: Read: @ 110: 8   get value
Jun 29 04:31:16 dbz kernel: Write: @ 110: 12 write
Jun 29 04:31:16 dbz kernel: Read: @ 110: 8   readback
Jun 29 04:31:16 dbz kernel: Read: @ 110: 12  readback
Jun 29 04:31:16 dbz kernel: Read: @ 110: 12  check - ok!
Jun 29 04:31:16 dbz kernel: Write: @ 110: 8  write
Jun 29 04:31:16 dbz kernel: Read: @ 110: 12  readback
Jun 29 04:31:16 dbz kernel: Read: @ 110: 8   readback

Jun 29 04:31:16 dbz kernel: Read: @ 110: 8   get value
Jun 29 04:31:16 dbz kernel: Write: @ 110: 0  write
Jun 29 04:31:16 dbz kernel: Read: @ 110: 8   readback
Jun 29 04:31:16 dbz kernel: Read: @ 110: 0   readback
Jun 29 04:31:16 dbz kernel: Read: @ 110: 0   check - ok!
Jun 29 04:31:16 dbz kernel: Write: @ 110: 8  write
Jun 29 04:31:16 dbz kernel: Read: @ 110: 0   readback
Jun 29 04:31:16 dbz kernel: Read: @ 110: 8   readback

This time nothing took more than 2 tries to get the correct value back.
But sometimes, as above, it would take three tries to read the correct
value back, so we need two reads at the end of the write function, and
leave the third for whatever reads it next.

Understand it?

-- 
Ryan Underwood, <nemesis at icequake.net>, icq=10317253




reply via email to

[Prev in Thread] Current Thread [Next in Thread]