All three FireWire ports on a Power Mac G4 MDD (FireWire 800) now run at their proper speeds at the same time, under Mac OS 9. One patched extension. Nothing else is modified.
On a stock machine the two FW400 ports will not enumerate a FireWire 800 device at all. Plug one in and nothing appears: no icon, no error, no sign anything is connected. The FW800 port itself has always worked at S800, so this release is not a speed fix for that port. It is a fix for the two ports that do not work, without giving up the speed of the one that does.
| FW400 ports | FW800 port | |
|---|---|---|
| stock | do not enumerate a 1394b device at all | S800 |
| the earlier one-byte fix released here | work | S400 |
| this release | work | S800 |
What was wrong
Mac OS 9 builds the IEEE 1394 speed map from the sp field of each node's self-ID packet. sp is two bits, and the value 3 is reserved in 1394a. 1394b uses it to mean "S400 or better, ask the PHY". It does not mean S800.
Apple's own driver source says so. IOFireWireController::buildTopology maps that value to kFWSpeedReserved with the comment "we don't know how fast it is", then verifies by transfer and steps the speed down on failure. Mac OS 9 has no step-down. It takes the value literally, so two 1394b devices joined by a legacy cable both claim S800 across a hop that physically carries S400, the transmit is never received, and the device never appears.
What this does about it
Mac OS 9 cannot try-and-see without a rewrite, but the FWIM owns the PHY, and the PHY knows. FireWire Enabler is hooked immediately before it hands the self-IDs up to the family. For each of its own ports it reads what actually got negotiated, maps each node to the port it arrives on, and clamps that node to what its own hop can carry. The family's existing logic does the rest.
The local node's own speed is deliberately left alone. That is what allows one speed map to give S800 to a device on the beta port and S400 to a device on a legacy port at the same time.
Downloads
| file | md5 | purpose |
|---|---|---|
FireWire S800 Enabler.bin |
c16fbe3146aad4d914ca28275520349b |
the fix. MacBinary, expands to a file already named FireWire Enabler |
FWFixCheck.bin |
66a1ad78d80316e78c31c6d9451a71e2 |
read-only diagnostic, writes a log of what the patch decided on your machine |
Install
Put the expanded FireWire Enabler in the System Folder's Extensions folder, replacing the existing one. Keep the original. The patched build reads 2.8.8 in Extensions Manager against a stock 2.8.7, so you can tell at a glance which one is in.
Derived from FireWire 2.8.7. If your system carries a different version, do not install this: the patcher in tools/ will build one against your own file and refuses anything that is not 2.8.7.
How it was verified
Six configurations on real hardware, re-verified afterwards on a clean Mac OS 9 install. A LaCie FireWire 800 drive on the beta port keeps S800 unclamped. The same drive on either FW400 port, and on the beta port through a 9-to-6 cable, is clamped to S400 and mounts. Then the case that matters: the LaCie on the beta port and a Power Mac G5 in target disk mode on a FW400 port, two 1394b devices both claiming S800, one keeping it and the other clamped, both mounting. Swap the stock extension back in and the G5 disappears entirely while the LaCie stays, with the PHY still reporting the legacy segment, so the link is up and only the speed map is wrong.
Every run, what it asked, what would have falsified it, and the three bugs found along the way are in docs/S800-RUNBOOK.md. Throughput measurements are in docs/QUICKBENCH-S800-vs-S400.md.
Known limits
Behind a hub or a daisy chain everything is capped at S400. That is correct rather than lazy: the PHY can only measure hops it terminates, a legacy hop deeper in the tree is invisible in the self-IDs, and assuming otherwise would bring the original defect back.
Credit
The reverse engineering, the patch and the documentation were produced with substantial help from Claude (Anthropic), working from Apple's published IOFireWireFamily source, the TI TSB81BA3 datasheet and disassembly of the shipping Mac OS 9 binaries. All hardware testing was done on a real Power Mac G4 MDD FireWire 800.