master/master.c
changeset 719 03d5b96632fb
parent 715 f12ff7c08623
child 720 9664a19978dd
equal deleted inserted replaced
718:80df6930e7e6 719:03d5b96632fb
   141     INIT_LIST_HEAD(&master->domains);
   141     INIT_LIST_HEAD(&master->domains);
   142     master->debug_level = 0;
   142     master->debug_level = 0;
   143 
   143 
   144     master->stats.timeouts = 0;
   144     master->stats.timeouts = 0;
   145     master->stats.corrupted = 0;
   145     master->stats.corrupted = 0;
   146     master->stats.skipped = 0;
       
   147     master->stats.unmatched = 0;
   146     master->stats.unmatched = 0;
   148     master->stats.output_jiffies = 0;
   147     master->stats.output_jiffies = 0;
   149 
   148 
   150     for (i = 0; i < HZ; i++) {
   149     for (i = 0; i < HZ; i++) {
   151         master->idle_cycle_times[i] = 0;
   150         master->idle_cycle_times[i] = 0;
   184     if (ec_device_init(&master->backup_device, master))
   183     if (ec_device_init(&master->backup_device, master))
   185         goto out_clear_main;
   184         goto out_clear_main;
   186 
   185 
   187     // init state machine datagram
   186     // init state machine datagram
   188     ec_datagram_init(&master->fsm_datagram);
   187     ec_datagram_init(&master->fsm_datagram);
       
   188     snprintf(master->fsm_datagram.name, EC_DATAGRAM_NAME_SIZE, "master-fsm");
   189     if (ec_datagram_prealloc(&master->fsm_datagram, EC_MAX_DATA_SIZE)) {
   189     if (ec_datagram_prealloc(&master->fsm_datagram, EC_MAX_DATA_SIZE)) {
   190         EC_ERR("Failed to allocate FSM datagram.\n");
   190         EC_ERR("Failed to allocate FSM datagram.\n");
   191         goto out_clear_backup;
   191         goto out_clear_backup;
   192     }
   192     }
   193 
   193 
   546     ec_datagram_t *queued_datagram;
   546     ec_datagram_t *queued_datagram;
   547 
   547 
   548     // check, if the datagram is already queued
   548     // check, if the datagram is already queued
   549     list_for_each_entry(queued_datagram, &master->datagram_queue, queue) {
   549     list_for_each_entry(queued_datagram, &master->datagram_queue, queue) {
   550         if (queued_datagram == datagram) {
   550         if (queued_datagram == datagram) {
   551             master->stats.skipped++;
   551             datagram->skip_count++;
   552             if (master->debug_level)
   552             if (master->debug_level)
   553                 EC_DBG("skipping datagram %x.\n", (unsigned int) datagram);
   553                 EC_DBG("skipping datagram %x.\n", (unsigned int) datagram);
   554             ec_master_output_stats(master);
       
   555             datagram->state = EC_DATAGRAM_QUEUED;
   554             datagram->state = EC_DATAGRAM_QUEUED;
   556             return;
   555             return;
   557         }
   556         }
   558     }
   557     }
   559 
   558 
   796         if (master->stats.corrupted) {
   795         if (master->stats.corrupted) {
   797             EC_WARN("%i frame%s CORRUPTED!\n", master->stats.corrupted,
   796             EC_WARN("%i frame%s CORRUPTED!\n", master->stats.corrupted,
   798                     master->stats.corrupted == 1 ? "" : "s");
   797                     master->stats.corrupted == 1 ? "" : "s");
   799             master->stats.corrupted = 0;
   798             master->stats.corrupted = 0;
   800         }
   799         }
   801         if (master->stats.skipped) {
       
   802             EC_WARN("%i datagram%s SKIPPED!\n", master->stats.skipped,
       
   803                     master->stats.skipped == 1 ? "" : "s");
       
   804             master->stats.skipped = 0;
       
   805         }
       
   806         if (master->stats.unmatched) {
   800         if (master->stats.unmatched) {
   807             EC_WARN("%i datagram%s UNMATCHED!\n", master->stats.unmatched,
   801             EC_WARN("%i datagram%s UNMATCHED!\n", master->stats.unmatched,
   808                     master->stats.unmatched == 1 ? "" : "s");
   802                     master->stats.unmatched == 1 ? "" : "s");
   809             master->stats.unmatched = 0;
   803             master->stats.unmatched = 0;
   810         }
   804         }
   824     daemonize("EtherCAT-IDLE");
   818     daemonize("EtherCAT-IDLE");
   825     allow_signal(SIGTERM);
   819     allow_signal(SIGTERM);
   826 
   820 
   827     while (!signal_pending(current)) {
   821     while (!signal_pending(current)) {
   828         cycles_start = get_cycles();
   822         cycles_start = get_cycles();
       
   823         ec_datagram_output_stats(&master->fsm_datagram);
   829 
   824 
   830         if (ec_fsm_master_running(&master->fsm)) { // datagram on the way
   825         if (ec_fsm_master_running(&master->fsm)) { // datagram on the way
   831             // receive
   826             // receive
   832             spin_lock_bh(&master->internal_lock);
   827             spin_lock_bh(&master->internal_lock);
   833             ecrt_master_receive(master);
   828             ecrt_master_receive(master);
   880 
   875 
   881     daemonize("EtherCAT-OP");
   876     daemonize("EtherCAT-OP");
   882     allow_signal(SIGTERM);
   877     allow_signal(SIGTERM);
   883 
   878 
   884     while (!signal_pending(current)) {
   879     while (!signal_pending(current)) {
       
   880         ec_datagram_output_stats(&master->fsm_datagram);
   885         if (master->injection_seq_rt != master->injection_seq_fsm ||
   881         if (master->injection_seq_rt != master->injection_seq_fsm ||
   886                 master->fsm_datagram.state == EC_DATAGRAM_SENT ||
   882                 master->fsm_datagram.state == EC_DATAGRAM_SENT ||
   887                 master->fsm_datagram.state == EC_DATAGRAM_QUEUED)
   883                 master->fsm_datagram.state == EC_DATAGRAM_QUEUED)
   888             goto schedule;
   884             goto schedule;
   889 
   885