Hi Clemens,
Recently I get Alesis Multimix 12 FireWire and work for ALSA dice driver to support it. This unit uses ASIC of 'WaveFront DICE II STD' and TCAT extended application protocol is not supported.
Unfortunately, the driver in v4.17-rc1 can't handle this unit, due to validation of address sections for global space.
$ dmesg snd_dice fw1.0: Sound card registration failed: -19
(sound/firewire/dice/dice-transaction.c) 265 static int get_subaddrs(struct snd_dice *dice) 266 { 267 static const int min_values[10] = { 268 10, 0x64 / 4, 269 10, 0x18 / 4, 270 10, 0x18 / 4, 271 0, 0, 272 0, 0, 273 }; ... 290 err = snd_fw_transaction(dice->unit, TCODE_READ_BLOCK_REQUEST, 291 DICE_PRIVATE_SPACE, pointers, 292 sizeof(__be32) * ARRAY_SIZE(min_values), 0); 293 if (err < 0) 294 goto end; 295 296 for (i = 0; i < ARRAY_SIZE(min_values); ++i) { 297 data = be32_to_cpu(pointers[i]); 298 if (data < min_values[i] || data >= 0x40000) { 299 err = -ENODEV; 300 goto end; 301 } 302 }
The condition 'data < min_values[i]' is evaluated as true at a second iteration (i = 1). A quadlet of 0xffffe0000004-7 has 0x000018 and this is less than 0x19 (= 0x64 / 4) in fact.
$ ./firewire-request /dev/fw1 read 0xffffe0000000 28 result: 000: 00 00 00 0a 00 00 00 18 00 00 00 22 00 00 00 8a result: 010: 00 00 00 ac 00 00 01 12 00 00 00 00 00 00 00 00 result: 020: 00 00 00 00 00 00 00 00
In line 183 of 'sound/firewire/dice/dice-interface.h', I can see below comments:
(sound/firewire/dice/dice-interface.h) 175 #define GLOBAL_SAMPLE_RATE 0x05c ... 181 #define GLOBAL_VERSION 0x060 182 183 /* Some old firmware versions do not have the following global registers: */ ... 188 #define GLOBAL_CLOCK_CAPABILITIES 0x064
But this is not proper in my case because the maximum offset on global sub-address space is 0x05c in quadlet unit.
Well, this unit supports 44.1/48.0 kHz and use internal/Rx1 as its sampling clock source according to user manual. This is what in 'check_clock_caps()'.
(sound/firewire/dice/dice.c) 96 static int check_clock_caps(struct snd_dice *dice) 97 { 101 /* some very old firmwares don't tell about their clock support */ 102 if (dice->clock_caps > 0) { ... 109 } else { 110 /* this should be supported by any device */ 111 dice->clock_caps = CLOCK_CAP_RATE_44100 | 112 CLOCK_CAP_RATE_48000 | 113 CLOCK_CAP_SOURCE_ARX1 | 114 CLOCK_CAP_SOURCE_INTERNAL; 115 }
In my opinion, GLOBAL_VERSION offset belongs to global address space for newer firmware version. Would I request any comment to you for this idea?
Regards
Takashi Sakamoto