Commit 16fbc85d authored by Adam Wujek's avatar Adam Wujek 💬

proto-ext-whiterabbit: fixes 0-oing deltas thanks to JCB

PPSI still can crash with SIGFPE in ts_hardwarize
Signed-off-by: Adam Wujek's avatarAdam Wujek <adam.wujek@cern.ch>
parent 0db43bb8
......@@ -111,11 +111,20 @@ void msg_unpack_announce_wr_tlv(void *buf, MsgAnnounce *ann)
ann->ext_specific = 0;
}
static inline int32_t delta_to_ps(struct FixedDelta d)
{
UInteger64 *sps = &d.scaledPicoseconds; /* ieee type :( */
return (sps->lsb >> 16) | (sps->msb << 16);
}
/* White Rabbit: packing WR Signaling messages*/
int msg_pack_wrsig(struct pp_instance *ppi, Enumeration16 wr_msg_id)
{
void *buf;
UInteger16 len = 0;
struct wr_dsport *wrp = WR_DSPOR(ppi);
struct wr_servo_state *s =&((struct wr_data *)ppi->ext_data)->servo_state;
if ((WR_DSPOR(ppi)->wrMode == NON_WR) || (wr_msg_id == ANN_SUFIX)) {
pp_diag(ppi, frames, 1,
......@@ -173,6 +182,12 @@ int msg_pack_wrsig(struct pp_instance *ppi, Enumeration16 wr_msg_id)
put_be32(buf+68, WR_DSPOR(ppi)->deltaRx.scaledPicoseconds.lsb);
len = 24;
/*JCB: Hack. servo_init() called too early. PTP state machine must be modify. */
/* We should stay in UNCALIBRATED state during WR protocol */
s->delta_tx_m = delta_to_ps(wrp->otherNodeDeltaTx);
s->delta_rx_m = delta_to_ps(wrp->otherNodeDeltaRx);
s->delta_tx_s = delta_to_ps(wrp->deltaTx);
s->delta_rx_s = delta_to_ps(wrp->deltaRx);
break;
default:
......@@ -198,6 +213,8 @@ void msg_unpack_wrsig(struct pp_instance *ppi, void *buf,
UInteger16 tlv_magicNumber;
UInteger16 tlv_versionNumber;
Enumeration16 wr_msg_id;
struct wr_dsport *wrp = WR_DSPOR(ppi);
struct wr_servo_state *s =&((struct wr_data *)ppi->ext_data)->servo_state;
memcpy(&wrsig_msg->targetPortIdentity.clockIdentity, (buf + 34),
PP_CLOCK_IDENTITY_LENGTH);
......@@ -268,6 +285,10 @@ void msg_unpack_wrsig(struct pp_instance *ppi, void *buf,
get_be32(buf+64);
WR_DSPOR(ppi)->otherNodeDeltaRx.scaledPicoseconds.lsb =
get_be32(buf+68);
/*JCB: Hack. serrvo_init() called too early. PTP state machine must be modify. */
/* We should stay in UNCALIBRATED state during WR protocol */
s->delta_tx_m = delta_to_ps(wrp->otherNodeDeltaTx);
s->delta_rx_m = delta_to_ps(wrp->otherNodeDeltaRx);
break;
default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment