345 } |
345 } |
346 if (fmmu->logical_domain_offset >= candidate_start) { |
346 if (fmmu->logical_domain_offset >= candidate_start) { |
347 // As FMMU offsets increase monotonically, and candidate start |
347 // As FMMU offsets increase monotonically, and candidate start |
348 // offset has never been contradicted, it can now never be |
348 // offset has never been contradicted, it can now never be |
349 // contradicted, as no future FMMU can cross it. |
349 // contradicted, as no future FMMU can cross it. |
350 if (candidate_start - datagram_offset > EC_MAX_DATA_SIZE) { |
350 // All FMMUs prior to this point approved for next datagram |
|
351 valid_fmmu = fmmu; |
|
352 valid_start = candidate_start; |
|
353 if (fmmu->logical_domain_offset + fmmu->data_size - datagram_offset |
|
354 > EC_MAX_DATA_SIZE) { |
351 // yet the new candidate exceeds the datagram size, so we |
355 // yet the new candidate exceeds the datagram size, so we |
352 // use the last known valid candidate to create the datagram |
356 // use the last known valid candidate to create the datagram |
353 ret = emplace_datagram(domain, datagram_offset, valid_start, |
357 ret = emplace_datagram(domain, datagram_offset, valid_start, |
354 datagram_first_fmmu, valid_fmmu); |
358 datagram_first_fmmu, valid_fmmu); |
355 if (ret < 0) |
359 if (ret < 0) |
357 |
361 |
358 datagram_offset = valid_start; |
362 datagram_offset = valid_start; |
359 datagram_count++; |
363 datagram_count++; |
360 datagram_first_fmmu = fmmu; |
364 datagram_first_fmmu = fmmu; |
361 } |
365 } |
362 // All FMMUs prior to this point approved for next datagram |
|
363 valid_fmmu = fmmu; |
|
364 valid_start = candidate_start; |
|
365 } |
366 } |
366 if (fmmu->logical_domain_offset + fmmu->data_size > candidate_start) { |
367 if (fmmu->logical_domain_offset + fmmu->data_size > candidate_start) { |
367 candidate_start = fmmu->logical_domain_offset + fmmu->data_size; |
368 candidate_start = fmmu->logical_domain_offset + fmmu->data_size; |
368 } |
369 } |
369 } |
370 } |
385 |
386 |
386 list_for_each_entry(datagram_pair, &domain->datagram_pairs, list) { |
387 list_for_each_entry(datagram_pair, &domain->datagram_pairs, list) { |
387 const ec_datagram_t *datagram = |
388 const ec_datagram_t *datagram = |
388 &datagram_pair->datagrams[EC_DEVICE_MAIN]; |
389 &datagram_pair->datagrams[EC_DEVICE_MAIN]; |
389 EC_MASTER_INFO(domain->master, " Datagram %s: Logical offset 0x%08x," |
390 EC_MASTER_INFO(domain->master, " Datagram %s: Logical offset 0x%08x," |
390 " %zu byte, type %s.\n", datagram->name, |
391 " %zu byte, type %s at %p.\n", datagram->name, |
391 EC_READ_U32(datagram->address), datagram->data_size, |
392 EC_READ_U32(datagram->address), datagram->data_size, |
392 ec_datagram_type_string(datagram)); |
393 ec_datagram_type_string(datagram), datagram); |
393 } |
394 } |
394 |
395 |
395 return 0; |
396 return 0; |
396 } |
397 } |
397 |
398 |