Commit a471fcde8c2c4b65f110bb4210af3513ee4deeb8
1 parent
ed7e48264c
Exists in
master
and in
16 other branches
ALSA: dice: fix detection of Weiss devices
While most DICE devices keep TCAT's default category ID of 0x04, Weiss devices identify themselves with 0x00. Reported-by: Rolf Anderegg <rolf.anderegg@weiss.ch> Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Showing 1 changed file with 12 additions and 5 deletions Side-by-side Diff
sound/firewire/dice.c
... | ... | @@ -1109,8 +1109,11 @@ |
1109 | 1109 | mutex_destroy(&dice->mutex); |
1110 | 1110 | } |
1111 | 1111 | |
1112 | -#define DICE_CATEGORY_ID 0x04 | |
1112 | +#define OUI_WEISS 0x001c6a | |
1113 | 1113 | |
1114 | +#define DICE_CATEGORY_ID 0x04 | |
1115 | +#define WEISS_CATEGORY_ID 0x00 | |
1116 | + | |
1114 | 1117 | static int dice_interface_check(struct fw_unit *unit) |
1115 | 1118 | { |
1116 | 1119 | static const int min_values[10] = { |
1117 | 1120 | |
... | ... | @@ -1123,15 +1126,15 @@ |
1123 | 1126 | struct fw_device *device = fw_parent_device(unit); |
1124 | 1127 | struct fw_csr_iterator it; |
1125 | 1128 | int key, value, vendor = -1, model = -1, err; |
1126 | - unsigned int i; | |
1129 | + unsigned int category, i; | |
1127 | 1130 | __be32 pointers[ARRAY_SIZE(min_values)]; |
1128 | 1131 | __be32 version; |
1129 | 1132 | |
1130 | 1133 | /* |
1131 | 1134 | * Check that GUID and unit directory are constructed according to DICE |
1132 | 1135 | * rules, i.e., that the specifier ID is the GUID's OUI, and that the |
1133 | - * GUID chip ID consists of the 8-bit DICE category ID, the 10-bit | |
1134 | - * product ID, and a 22-bit serial number. | |
1136 | + * GUID chip ID consists of the 8-bit category ID, the 10-bit product | |
1137 | + * ID, and a 22-bit serial number. | |
1135 | 1138 | */ |
1136 | 1139 | fw_csr_iterator_init(&it, unit->directory); |
1137 | 1140 | while (fw_csr_iterator_next(&it, &key, &value)) { |
... | ... | @@ -1144,7 +1147,11 @@ |
1144 | 1147 | break; |
1145 | 1148 | } |
1146 | 1149 | } |
1147 | - if (device->config_rom[3] != ((vendor << 8) | DICE_CATEGORY_ID) || | |
1150 | + if (vendor == OUI_WEISS) | |
1151 | + category = WEISS_CATEGORY_ID; | |
1152 | + else | |
1153 | + category = DICE_CATEGORY_ID; | |
1154 | + if (device->config_rom[3] != ((vendor << 8) | category) || | |
1148 | 1155 | device->config_rom[4] >> 22 != model) |
1149 | 1156 | return -ENODEV; |
1150 | 1157 |