Loading
igc: fix race condition in TX timestamp read for register 0
The current HW bug workaround checks the TXTT_0 ready bit first, then reads TXSTMPL_0 twice (before and after reading TXSTMPH_0) to detect whether a new timestamp was captured by timestamp register 0 during the workaround. This sequence has a race: if a new timestamp is captured after checking the TXTT_0 bit but before the first TXSTMPL_0 read, the detection fails because both the "old" and "new" values come from the same timestamp. Fix by reading TXSTMPL_0 first to establish a baseline, then checking the TXTT_0 bit. This ensures any timestamp captured during the race window will be detected. Old sequence: 1. Check TXTT_0 ready bit 2. Read TXSTMPL_0 (baseline) 3. Read TXSTMPH_0 (interrupt workaround) 4. Read TXSTMPL_0 (detect changes vs baseline) New sequence: 1. Read TXSTMPL_0 (baseline) 2. Check TXTT_0 ready bit 3. Read TXSTMPH_0 (interrupt workaround) 4. Read TXSTMPL_0 (detect changes vs baseline) Fixes: c789ad7c ("igc: Work around HW bug causing missing timestamps") Suggested-by:Avi Shalev <avi.shalev@intel.com> Reviewed-by:
Aleksandr Loktionov <aleksandr.loktionov@intel.com> Co-developed-by:
Song Yoong Siang <yoong.siang.song@intel.com> Signed-off-by:
Song Yoong Siang <yoong.siang.song@intel.com> Signed-off-by:
Chwee-Lin Choong <chwee.lin.choong@intel.com> Tested-by:
Avigail Dahan <avigailx.dahan@intel.com> Signed-off-by:
Tony Nguyen <anthony.l.nguyen@intel.com>