@@ -433,9 +433,17 @@ impl EthernetPTP {
433433 }
434434 #[ cfg( feature = "stm32h7xx-hal" ) ]
435435 {
436- // SAFETY: we only modify the ethernet ptp status register.
436+ // SAFETY: we only read the ethernet ptp status register.
437+
437438 let mac = unsafe { Self :: mac ( ) } ;
438- mac. mactssr . read ( ) . tstargt0 ( ) . bit_is_set ( )
439+
440+ // Reading the register clears all of the bits in
441+ // that register.
442+ let tssr = mac. mactssr . read ( ) ;
443+ let tstargt0 = tssr. tstargt0 ( ) . bit_is_set ( ) ;
444+ let tstrgterr0 = tssr. tstrgterr0 ( ) . bit_is_set ( ) ;
445+
446+ tstargt0 || tstrgterr0
439447 }
440448 }
441449
@@ -459,18 +467,18 @@ impl EthernetPTP {
459467
460468 #[ cfg( feature = "stm32h7xx-hal" ) ]
461469 let is_tsint = {
462- // SAFETY: we only write to `mactssr` (Timestamp Status register)
463- let mactssr = unsafe { & Self :: mac ( ) . mactssr } ;
464-
465- // Reading the bit clears it, and deasserts the interrupt.
466- mactssr. read ( ) . tstargt0 ( ) . bit_is_set ( )
470+ // SAFETY: we only read from `macisr` (Interrupt status register)
471+ let macisr = unsafe { & Self :: mac ( ) . macisr } ;
472+ macisr. read ( ) . tsis ( ) . bit_is_set ( )
467473 } ;
468474
469475 #[ cfg( feature = "async-await" ) ]
470- if let Some ( waker) = EthernetPTP :: waker ( ) . take ( ) {
471- waker. wake ( ) ;
472- } else {
473- EthernetPTP :: read_and_clear_interrupt_flag ( ) ;
476+ if is_tsint {
477+ if let Some ( waker) = EthernetPTP :: waker ( ) . take ( ) {
478+ waker. wake ( ) ;
479+ } else {
480+ EthernetPTP :: read_and_clear_interrupt_flag ( ) ;
481+ }
474482 }
475483
476484 #[ cfg( not( feature = "async-await" ) ) ]
0 commit comments