summaryrefslogtreecommitdiff
path: root/drivers/firewire/core-device.c
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2025-10-18 12:55:31 +0900
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>2025-10-18 12:58:56 +0900
commitd52bb3daad3f28403676dff31fa0577bdaf8e7c6 (patch)
tree320da8eb0eaf025d3581caf0a62822b56020e2c7 /drivers/firewire/core-device.c
parent55b4e903a156bc81e15fbe3af9be0664f7a3b3ca (diff)
firewire: core: handle device quirk of TASCAM FW-1884/FW-1804/FW-1082
TASCAM FW-1884/FW-1804/FW-1082 is too lazy to repspond to asynchronous request at S400. The asynchronous transaction often results in timeout. This is a problematic quirk. This commit adds support for the quirk. When identifying the new quirk flag, then the transaction speed is configured at S200. Link: https://lore.kernel.org/r/20251018035532.287124-4-o-takashi@sakamocchi.jp Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Diffstat (limited to 'drivers/firewire/core-device.c')
-rw-r--r--drivers/firewire/core-device.c18
1 files changed, 17 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,