diff --git a/ASFWDriver/Controller/ControllerCoreInterrupts.cpp b/ASFWDriver/Controller/ControllerCoreInterrupts.cpp index 7f654a66..433b8f8a 100644 --- a/ASFWDriver/Controller/ControllerCoreInterrupts.cpp +++ b/ASFWDriver/Controller/ControllerCoreInterrupts.cpp @@ -62,7 +62,11 @@ IsochContextEvents ControllerCore::HandleInterrupt(const InterruptSnapshot& snap if ((events & IntEventBits::kBusReset) != 0U) { auto access = hw.TryBeginAccess(); if (!access) return {}; - const uint32_t generation = access.Read(Register32::kSelfIDGeneration); + // SelfIDCount.selfIDGeneration already holds the new generation at the + // busReset edge (OHCI 1.2 Table 11-2); 0x06C is reserved. + const uint32_t generation = + (access.Read(Register32::kSelfIDCount) & SelfIDCountBits::kGenerationMask) >> + SelfIDCountBits::kGenerationShift; // A reset edge is a hard liveness boundary: no higher layer may retain // the old (generation,node) address while Self-ID and ROM discovery are // in flight. This matches the legacy IOFireWireFamily policy of diff --git a/ASFWDriver/Hardware/RegisterMap.hpp b/ASFWDriver/Hardware/RegisterMap.hpp index c2bf7052..bc7beeac 100644 --- a/ASFWDriver/Hardware/RegisterMap.hpp +++ b/ASFWDriver/Hardware/RegisterMap.hpp @@ -28,7 +28,6 @@ enum class Register32 : uint32_t { kHCControl = 0x050, // Read view: both 0x050/0x054 return latched value kSelfIDBuffer = 0x064, kSelfIDCount = 0x068, - kSelfIDGeneration = 0x06C, kIRMultiChanMaskHiSet = 0x070, kIRMultiChanMaskHiClear = 0x074, kIRMultiChanMaskLoSet = 0x078,