diff options
| -rw-r--r-- | drivers/firewire/core-device.c | 18 | ||||
| -rw-r--r-- | include/linux/firewire.h | 3 |
2 files changed, 20 insertions, 1 deletions
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c index 6a5740ed4934..1674de477852 100644 --- a/drivers/firewire/core-device.c +++ b/drivers/firewire/core-device.c @@ -571,6 +571,14 @@ static const struct entry_match motu_audio_express_matches[] = { { 8, 0x17104800 }, }; +static const struct entry_match tascam_fw_series_matches[] = { + { 1, 0x0300022e }, + { 3, 0x8d000006 }, + { 4, 0xd1000001 }, + { 6, 0x1200022e }, + { 8, 0xd4000004 }, +}; + static int detect_quirks_by_root_directory(const u32 *root_directory, unsigned int length) { static const struct { @@ -583,6 +591,11 @@ static int detect_quirks_by_root_directory(const u32 *root_directory, unsigned i .matches = motu_audio_express_matches, .match_count = ARRAY_SIZE(motu_audio_express_matches), }, + { + .quirk = FW_DEVICE_QUIRK_UNSTABLE_AT_S400, + .matches = tascam_fw_series_matches, + .match_count = ARRAY_SIZE(tascam_fw_series_matches), + }, }; int quirks = 0; int i; @@ -761,7 +774,10 @@ static int read_config_rom(struct fw_device *device, int generation) // Just prevent from torn writing/reading. WRITE_ONCE(device->quirks, quirks); - speed = device->node->max_speed; + if (unlikely(quirks & FW_DEVICE_QUIRK_UNSTABLE_AT_S400)) + speed = SCODE_200; + else + speed = device->node->max_speed; // Determine the speed of // - devices with link speed less than PHY speed, diff --git a/include/linux/firewire.h b/include/linux/firewire.h index f1d8734c0ec6..6143b7d28eac 100644 --- a/include/linux/firewire.h +++ b/include/linux/firewire.h @@ -179,6 +179,9 @@ enum fw_device_quirk { // MOTU Audio Express transfers acknowledge packet with 0x10 for pending state. FW_DEVICE_QUIRK_ACK_PACKET_WITH_INVALID_PENDING_CODE = BIT(2), + + // TASCAM FW-1082/FW-1804/FW-1884 often freezes when receiving S400 packets. + FW_DEVICE_QUIRK_UNSTABLE_AT_S400 = BIT(3), }; enum fw_device_state { |
