Using FireAdapter with Linux firewire-ohci driver

The FireAdapter series makes use of standard Texas Instruments silicon for its IEEE1394 PHY and Link implementation. Based on this it should be supported out of the box by operating systems like Linux. However, it turns out that the firewire-ohci kernel driver included in the mainstream Linux kernel is not correctly detecting the use of a TSB41BA3D on the FireAdapter and therefore does not enable the workaround needed for what they call quirk SLLZ059. As a consequence, a Linux pc with FireAdapter installed may not boot properly without any of the proposed solutions in this document.

For more information please refer to the following:

 

Since the workaround already resides in the kernel source code, the solution would be to ensure it is actually enabled for FireAdapter cards. This can be done by either starting the firewire-ohci driver with non-default parameter values. Or by patching the driver source code and recompiling the kernel. Both solutions are shown below.

Start firewire-ohci with SLLZ059 quirk enabled using parameters

On the topic of the module parameter workaround: this can be formalized by dropping a file 'firewire.conf' into /etc/modprobe.d with these contents:

 

# Enable SLLZ059 quirk (0x20) for cards with XIO2213 link layer.
# All TI chips have the reset packet quirk (0x02) set as well.
options firewire_ohci quirks=0x22

 

The 1394 modules are loaded from the initrd/initramfs so this needs to be rebuilt to reflect these changes.

In Debian (and Ubuntu) you need to (as root):

 

# update-initramfs -k all -u

 

Now the system will load the Linux OHCI module without crashing the system. On RedHat it's something different, and SuSE something else again.

Patching the Linux kernel firewire-ohci driver

Apply the following patch in order to support the FireAdapter series without having to provide firewire-ohci parameter values:

--- ohci.c.orig  2020-10-17 10:12:58.000000000 +0200
+++ ohci.c  2020-11-03 11:10:43.649982043 +0100
@@ -280,6 +280,7 @@
 #define PCI_DEVICE_ID_TI_TSB12LV22  0x8009
 #define PCI_DEVICE_ID_TI_TSB12LV26  0x8020
 #define PCI_DEVICE_ID_TI_TSB82AA2  0x8025
+#define PCI_DEVICE_ID_TI_XIO2213  0x823f
 #define PCI_DEVICE_ID_VIA_VT630X  0x3044
 #define PCI_REV_ID_VIA_VT6306    0x46
 #define PCI_DEVICE_ID_VIA_VT6315  0x3403
@@ -329,6 +330,9 @@
   {PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_TSB82AA2, PCI_ANY_ID,
     QUIRK_RESET_PACKET | QUIRK_TI_SLLZ059},

+  {PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XIO2213, PCI_ANY_ID,
+    QUIRK_RESET_PACKET | QUIRK_TI_SLLZ059},
+
   {PCI_VENDOR_ID_TI, PCI_ANY_ID, PCI_ANY_ID,
     QUIRK_RESET_PACKET},