Du hast gesagt, das es mal geht und mal nicht ... nicht wahr?
Ich sehe im Kernel-Code eine etwas ... uhm ... waran man drehen könnte:
Der Treiber schießt einige Instruktionen auf die Karte und wartet dann eine gewisse Zeitspanne, das die Karte was anstädniges zurückschreibt.
Danach schießt der Treiber wieder etwas hinterher und wartet nun eine ganz, ganz kurze Zeitspanne, das die Karte gut reagiert.
Ist das nicht der Falle, gibt es denn Fehler.
IMHO: wenn es manchmal geht, und manchmal nicht, ist vlt. die Zeitspanne, welche der Treiber auf das "OK"-Signal der Karte wartet zu kurz.
FRAGE: lust auf ein Experiment?
Zeile 3051++ in /usr/src/linux/sound/pci/cs46xx/cs46xx_lib.c:
Wenn ja, dann ändere mal die Zeilen
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#ifdef CONFIG_SND_CS46XX_NEW_DSP
{
int count;
for (count = 0; count < 150; count++) {
/* First, we want to wait for a short time. */
udelay(25);
if (snd_cs46xx_peekBA0(chip, BA0_ACSTS2) & ACSTS_CRDY)
break;
}
/*
* Make sure CODEC is READY.
*/
if (!(snd_cs46xx_peekBA0(chip, BA0_ACSTS2) & ACSTS_CRDY))
snd_printdd("cs46xx: never read card ready from secondary AC'97\n");
}
#endif
|
in
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#ifdef CONFIG_SND_CS46XX_NEW_DSP
{
int count;
for (count = 0; count < 150; count++) {
/* First, we want to wait for a short time. */
mdelay(25);
if (snd_cs46xx_peekBA0(chip, BA0_ACSTS2) & ACSTS_CRDY)
break;
}
/*
* Make sure CODEC is READY.
*/
if (!(snd_cs46xx_peekBA0(chip, BA0_ACSTS2) & ACSTS_CRDY))
snd_printdd("cs46xx: never read card ready from secondary AC'97\n");
}
#endif
|
Anm.: mach aus dem usleep einfach ein msleep. Bis zu dieser Stelle scheint der Treiber deine Karte bis dahin korrekt zu initialisieren ...
=> Neu kompilieren, testen, berichten ...