449 |
449 |
450 /*****************************************************************************/ |
450 /*****************************************************************************/ |
451 |
451 |
452 void ecrt_domain_process(ec_domain_t *domain) |
452 void ecrt_domain_process(ec_domain_t *domain) |
453 { |
453 { |
454 uint16_t wc_sum[EC_MAX_NUM_DEVICES] = {}, redundant_wc, wc_total; |
454 uint16_t wc_sum[EC_MAX_NUM_DEVICES] = {}, wc_total; |
|
455 ec_datagram_pair_t *pair; |
|
456 #if EC_MAX_NUM_DEVICES > 1 |
|
457 uint16_t datagram_pair_wc, redundant_wc; |
|
458 unsigned int datagram_offset; |
|
459 ec_fmmu_config_t *fmmu = list_first_entry(&domain->fmmu_configs, |
|
460 ec_fmmu_config_t, list); |
|
461 unsigned int redundancy; |
|
462 #endif |
455 unsigned int dev_idx, wc_change; |
463 unsigned int dev_idx, wc_change; |
456 unsigned int redundancy; |
|
457 |
464 |
458 #if DEBUG_REDUNDANCY |
465 #if DEBUG_REDUNDANCY |
459 EC_MASTER_DBG(domain->master, 1, "domain %u process\n", domain->index); |
466 EC_MASTER_DBG(domain->master, 1, "domain %u process\n", domain->index); |
460 #endif |
467 #endif |
461 |
468 |
|
469 list_for_each_entry(pair, &domain->datagram_pairs, list) { |
462 #if EC_MAX_NUM_DEVICES > 1 |
470 #if EC_MAX_NUM_DEVICES > 1 |
463 if (ec_master_num_devices(domain->master) > 1) { |
471 datagram_pair_wc = ec_datagram_pair_process(pair, wc_sum); |
464 ec_datagram_pair_t *pair; |
472 #else |
465 ec_fmmu_config_t *fmmu = |
473 ec_datagram_pair_process(pair, wc_sum); |
466 list_first_entry(&domain->fmmu_configs, ec_fmmu_config_t, list); |
474 #endif |
467 |
475 |
468 list_for_each_entry(pair, &domain->datagram_pairs, list) { |
476 #if EC_MAX_NUM_DEVICES > 1 |
|
477 if (ec_master_num_devices(domain->master) > 1) { |
469 ec_datagram_t *main_datagram = &pair->datagrams[EC_DEVICE_MAIN]; |
478 ec_datagram_t *main_datagram = &pair->datagrams[EC_DEVICE_MAIN]; |
470 uint32_t logical_datagram_address = |
479 uint32_t logical_datagram_address = |
471 EC_READ_U32(main_datagram->address); |
480 EC_READ_U32(main_datagram->address); |
472 size_t datagram_size = main_datagram->data_size; |
481 size_t datagram_size = main_datagram->data_size; |
473 uint16_t datagram_pair_wc; |
|
474 |
482 |
475 #if DEBUG_REDUNDANCY |
483 #if DEBUG_REDUNDANCY |
476 EC_MASTER_DBG(domain->master, 1, "dgram %s log=%u\n", |
484 EC_MASTER_DBG(domain->master, 1, "dgram %s log=%u\n", |
477 main_datagram->name, logical_datagram_address); |
485 main_datagram->name, logical_datagram_address); |
478 #endif |
486 #endif |
479 |
487 |
480 /* Redundancy: Go through FMMU configs to detect data changes. */ |
488 /* Redundancy: Go through FMMU configs to detect data changes. */ |
481 list_for_each_entry_from(fmmu, &domain->fmmu_configs, list) { |
489 list_for_each_entry_from(fmmu, &domain->fmmu_configs, list) { |
482 unsigned int datagram_offset; |
|
483 ec_datagram_t *backup_datagram = |
490 ec_datagram_t *backup_datagram = |
484 &pair->datagrams[EC_DEVICE_BACKUP]; |
491 &pair->datagrams[EC_DEVICE_BACKUP]; |
485 |
492 |
486 if (fmmu->dir != EC_DIR_INPUT) { |
493 if (fmmu->dir != EC_DIR_INPUT) { |
487 continue; |
494 continue; |
594 EC_MASTER_INFO(domain->master, "Domain %u: %u working counter" |
604 EC_MASTER_INFO(domain->master, "Domain %u: %u working counter" |
595 " changes - now %u/%u", domain->index, |
605 " changes - now %u/%u", domain->index, |
596 domain->working_counter_changes, |
606 domain->working_counter_changes, |
597 wc_total, domain->expected_working_counter); |
607 wc_total, domain->expected_working_counter); |
598 } |
608 } |
|
609 #if EC_MAX_NUM_DEVICES > 1 |
599 if (ec_master_num_devices(domain->master) > 1) { |
610 if (ec_master_num_devices(domain->master) > 1) { |
600 printk(" ("); |
611 printk(" ("); |
601 for (dev_idx = EC_DEVICE_MAIN; |
612 for (dev_idx = EC_DEVICE_MAIN; |
602 dev_idx < ec_master_num_devices(domain->master); |
613 dev_idx < ec_master_num_devices(domain->master); |
603 dev_idx++) { |
614 dev_idx++) { |