[alsa-devel] [PATCH 2/2] ALSA: hdspm - Provide unique driver id based on card serial
Adrian Knoth
adi at drcomp.erfurt.thur.de
Tue Jan 10 20:53:23 CET 2012
On 01/08/2012 04:15 PM, Takashi Iwai wrote:
Hi!
>> Before, /proc/asound looked like this:
>>
>> 2 [Default ]: HDSPM - RME RayDAT_f1cd85
>> RME RayDAT S/N 0xf1cd85 at 0xf7300000, irq 18
>>
>>
>> 2 [HDSPM_f1cd85 ]: HDSPM - RME RayDAT_f1cd85
>> RME RayDAT S/N 0xf1cd85 at 0xf7300000, irq 18
> This can't be applied as is, unfortunately.
> This would break when user passes the card id string via option.
Thanks for spotting, I wasn't even aware of this option. :-/
> Also, if multiple boards have the same serial number (who can trust
> the hardware? :), it gets -EBUSY at registration.
Is that true? I don't have two RME cards here, but I've simply
duplicated a string from my mainboard chip. snd_card_register() was just
fine:
$ cat /proc/asound/cards
0 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xf7420000 irq 55
1 [NVidia ]: HDA-Intel - HDA NVidia
HDA NVidia at 0xf7080000 irq 17
2 [PCH ]: HDSPM - RME RayDAT_f1cd85
RME RayDAT S/N 0xf1cd85 at 0xf7300000, irq 18
Note that snd_card_create() is still called without any serial number
magic, so card->id will first be set to "Default", "Default_1" and so on
and only later modified before calling snd_card_register().
Since I don't see anything in snd_card_register() that could possibly
fail, it would at least still work. Anyway, I'm now using
snd_card_set_id(), and this function claims to check for duplicates. ;)
> And, MADIface will have no serial number, so it'll look strange.
The code in question is limited to "if (!MADIface)", so no problem.
> (Also the string with "%s_%04x" would be better, IMO.)
I chose %06x, since the serial is masked with 0xFFFFFF.
> For these, I'd suggest the following changes:
> - check whether serial is non-zero
That's actually 0xFFFFFF in case there is no serial. All PCI revisions
behave like that.
> - modify sound core registration part to re-generate the id string
> with suffix whenever conflicted, only not when the automated id
> string generation via card->id = NULL.
I did not address this. Firstly, because snd_card_register() worked well
even in case of colliding card->ids, and secondly, because
snd_card_set_id would take care now to make it unique.
I'll repost the patch in a second.
More information about the Alsa-devel
mailing list