master/master.c
changeset 2020 47db5df5c7b3
parent 2019 63177d870116
child 2021 ee30e7f90c2e
equal deleted inserted replaced
2019:63177d870116 2020:47db5df5c7b3
    87 void ec_master_clear_slave_configs(ec_master_t *);
    87 void ec_master_clear_slave_configs(ec_master_t *);
    88 void ec_master_clear_domains(ec_master_t *);
    88 void ec_master_clear_domains(ec_master_t *);
    89 static int ec_master_idle_thread(void *);
    89 static int ec_master_idle_thread(void *);
    90 static int ec_master_operation_thread(void *);
    90 static int ec_master_operation_thread(void *);
    91 #ifdef EC_EOE
    91 #ifdef EC_EOE
    92 static int ec_master_eoe_thread(void *);
    92 static int ec_master_eoe_processing(ec_master_t *);
    93 #endif
    93 #endif
    94 void ec_master_find_dc_ref_clock(ec_master_t *);
    94 void ec_master_find_dc_ref_clock(ec_master_t *);
    95 
    95 
    96 /*****************************************************************************/
    96 /*****************************************************************************/
    97 
    97 
   571 {
   571 {
   572     EC_MASTER_DBG(master, 1, "IDLE -> ORPHANED.\n");
   572     EC_MASTER_DBG(master, 1, "IDLE -> ORPHANED.\n");
   573 
   573 
   574     master->phase = EC_ORPHANED;
   574     master->phase = EC_ORPHANED;
   575     
   575     
   576 #ifdef EC_EOE
       
   577     ec_master_eoe_stop(master);
       
   578 #endif
       
   579     ec_master_thread_stop(master);
   576     ec_master_thread_stop(master);
   580 
   577 
   581     down(&master->master_sem);
   578     down(&master->master_sem);
   582     ec_master_clear_slaves(master);
   579     ec_master_clear_slaves(master);
   583     up(&master->master_sem);
   580     up(&master->master_sem);
  1299         for (slave = master->slaves;
  1296         for (slave = master->slaves;
  1300                 slave < master->slaves + master->slave_count;
  1297                 slave < master->slaves + master->slave_count;
  1301                 slave++) {
  1298                 slave++) {
  1302             ec_fsm_slave_exec(&slave->fsm); // may queue datagram in external queue
  1299             ec_fsm_slave_exec(&slave->fsm); // may queue datagram in external queue
  1303         }
  1300         }
       
  1301 #if defined(EC_EOE)
       
  1302         if (!ec_master_eoe_processing(master))
       
  1303             master->fsm.idle = 0;  // pump the bus as fast as possible
       
  1304 #endif
  1304         up(&master->master_sem);
  1305         up(&master->master_sem);
  1305 
  1306 
  1306         // queue and send
  1307         // queue and send
  1307         down(&master->io_sem);
  1308         down(&master->io_sem);
  1308         ecrt_master_send(master);
  1309         ecrt_master_send(master);
  1358         for (slave = master->slaves;
  1359         for (slave = master->slaves;
  1359                 slave < master->slaves + master->slave_count;
  1360                 slave < master->slaves + master->slave_count;
  1360                 slave++) {
  1361                 slave++) {
  1361             ec_fsm_slave_exec(&slave->fsm); // may queue datagram in external queue
  1362             ec_fsm_slave_exec(&slave->fsm); // may queue datagram in external queue
  1362         }
  1363         }
       
  1364 #if defined(EC_EOE)
       
  1365         ec_master_eoe_processing(master);
       
  1366 #endif
  1363         up(&master->master_sem);
  1367         up(&master->master_sem);
  1364 
  1368 
  1365 #ifdef EC_USE_HRTIMER
  1369 #ifdef EC_USE_HRTIMER
  1366         // the op thread should not work faster than the sending RT thread
  1370         // the op thread should not work faster than the sending RT thread
  1367         ec_master_nanosleep(master->send_interval * 1000);
  1371         ec_master_nanosleep(master->send_interval * 1000);
  1381 }
  1385 }
  1382 
  1386 
  1383 /*****************************************************************************/
  1387 /*****************************************************************************/
  1384 
  1388 
  1385 #ifdef EC_EOE
  1389 #ifdef EC_EOE
  1386 /** Starts Ethernet over EtherCAT processing on demand.
       
  1387  */
       
  1388 void ec_master_eoe_start(ec_master_t *master /**< EtherCAT master */)
       
  1389 {
       
  1390     struct sched_param param = { .sched_priority = 0 };
       
  1391 
       
  1392     if (master->eoe_thread) {
       
  1393         EC_MASTER_WARN(master, "EoE already running!\n");
       
  1394         return;
       
  1395     }
       
  1396 
       
  1397     if (list_empty(&master->eoe_handlers))
       
  1398         return;
       
  1399 
       
  1400     if (!master->send_cb || !master->receive_cb) {
       
  1401         EC_MASTER_WARN(master, "No EoE processing"
       
  1402                 " because of missing callbacks!\n");
       
  1403         return;
       
  1404     }
       
  1405 
       
  1406     EC_MASTER_INFO(master, "Starting EoE thread.\n");
       
  1407     master->eoe_thread = kthread_run(ec_master_eoe_thread, master,
       
  1408             "EtherCAT-EoE");
       
  1409     if (IS_ERR(master->eoe_thread)) {
       
  1410         int err = (int) PTR_ERR(master->eoe_thread);
       
  1411         EC_MASTER_ERR(master, "Failed to start EoE thread (error %i)!\n",
       
  1412                 err);
       
  1413         master->eoe_thread = NULL;
       
  1414         return;
       
  1415     }
       
  1416 
       
  1417     sched_setscheduler(master->eoe_thread, SCHED_NORMAL, &param);
       
  1418     set_user_nice(master->eoe_thread, 0);
       
  1419 }
       
  1420 
       
  1421 /*****************************************************************************/
       
  1422 
       
  1423 /** Stops the Ethernet over EtherCAT processing.
       
  1424  */
       
  1425 void ec_master_eoe_stop(ec_master_t *master /**< EtherCAT master */)
       
  1426 {
       
  1427     if (master->eoe_thread) {
       
  1428         EC_MASTER_INFO(master, "Stopping EoE thread.\n");
       
  1429 
       
  1430         kthread_stop(master->eoe_thread);
       
  1431         master->eoe_thread = NULL;
       
  1432         EC_MASTER_INFO(master, "EoE thread exited.\n");
       
  1433     }
       
  1434 }
       
  1435 
  1390 
  1436 /*****************************************************************************/
  1391 /*****************************************************************************/
  1437 
  1392 
  1438 /** Does the Ethernet over EtherCAT processing.
  1393 /** Does the Ethernet over EtherCAT processing.
  1439  */
  1394  */
  1440 static int ec_master_eoe_thread(void *priv_data)
  1395 static int ec_master_eoe_processing(ec_master_t *master)
  1441 {
  1396 {
  1442     ec_master_t *master = (ec_master_t *) priv_data;
       
  1443     ec_eoe_t *eoe;
  1397     ec_eoe_t *eoe;
  1444     unsigned int none_open, sth_to_send, all_idle;
  1398     unsigned int none_open, sth_to_send, all_idle;
  1445 
  1399     none_open = 1;
  1446     EC_MASTER_DBG(master, 1, "EoE thread running.\n");
  1400     all_idle = 1;
  1447 
  1401 
  1448     while (!kthread_should_stop()) {
  1402     list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1449         none_open = 1;
  1403         if (ec_eoe_is_open(eoe)) {
  1450         all_idle = 1;
  1404             none_open = 0;
  1451 
  1405             break;
       
  1406         }
       
  1407     }
       
  1408     if (none_open)
       
  1409         return all_idle;
       
  1410 
       
  1411     // actual EoE processing
       
  1412     sth_to_send = 0;
       
  1413     list_for_each_entry(eoe, &master->eoe_handlers, list) {
       
  1414         ec_eoe_run(eoe);
       
  1415         if (eoe->queue_datagram) {
       
  1416             sth_to_send = 1;
       
  1417         }
       
  1418         if (!ec_eoe_is_idle(eoe)) {
       
  1419             all_idle = 0;
       
  1420         }
       
  1421     }
       
  1422 
       
  1423     if (sth_to_send) {
  1452         list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1424         list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1453             if (ec_eoe_is_open(eoe)) {
  1425             ec_eoe_queue(eoe);
  1454                 none_open = 0;
  1426         }
  1455                 break;
  1427     }
  1456             }
  1428     return all_idle;
  1457         }
  1429 }
  1458         if (none_open)
  1430 
  1459             goto schedule;
  1431 #endif // EC_EOE
  1460 
       
  1461         // receive datagrams
       
  1462         master->receive_cb(master->cb_data);
       
  1463 
       
  1464         // actual EoE processing
       
  1465         sth_to_send = 0;
       
  1466         list_for_each_entry(eoe, &master->eoe_handlers, list) {
       
  1467             ec_eoe_run(eoe);
       
  1468             if (eoe->queue_datagram) {
       
  1469                 sth_to_send = 1;
       
  1470             }
       
  1471             if (!ec_eoe_is_idle(eoe)) {
       
  1472                 all_idle = 0;
       
  1473             }
       
  1474         }
       
  1475 
       
  1476         if (sth_to_send) {
       
  1477             list_for_each_entry(eoe, &master->eoe_handlers, list) {
       
  1478                 ec_eoe_queue(eoe);
       
  1479             }
       
  1480             // (try to) send datagrams
       
  1481             down(&master->ext_queue_sem);
       
  1482             master->send_cb(master->cb_data);
       
  1483             up(&master->ext_queue_sem);
       
  1484         }
       
  1485 
       
  1486 schedule:
       
  1487         if (all_idle) {
       
  1488             set_current_state(TASK_INTERRUPTIBLE);
       
  1489             schedule_timeout(1);
       
  1490         } else {
       
  1491             schedule();
       
  1492         }
       
  1493     }
       
  1494     
       
  1495     EC_MASTER_DBG(master, 1, "EoE thread exiting...\n");
       
  1496     return 0;
       
  1497 }
       
  1498 #endif
       
  1499 
  1432 
  1500 /*****************************************************************************/
  1433 /*****************************************************************************/
  1501 
  1434 
  1502 /** Detaches the slave configurations from the slaves.
  1435 /** Detaches the slave configurations from the slaves.
  1503  */
  1436  */
  1990 int ecrt_master_activate(ec_master_t *master)
  1923 int ecrt_master_activate(ec_master_t *master)
  1991 {
  1924 {
  1992     uint32_t domain_offset;
  1925     uint32_t domain_offset;
  1993     ec_domain_t *domain;
  1926     ec_domain_t *domain;
  1994     int ret;
  1927     int ret;
  1995 #ifdef EC_EOE
       
  1996     int eoe_was_running;
       
  1997 #endif
       
  1998 
  1928 
  1999     EC_MASTER_DBG(master, 1, "ecrt_master_activate(master = 0x%p)\n", master);
  1929     EC_MASTER_DBG(master, 1, "ecrt_master_activate(master = 0x%p)\n", master);
  2000 
  1930 
  2001     if (master->active) {
  1931     if (master->active) {
  2002         EC_MASTER_WARN(master, "%s: Master already active!\n", __func__);
  1932         EC_MASTER_WARN(master, "%s: Master already active!\n", __func__);
  2020     up(&master->master_sem);
  1950     up(&master->master_sem);
  2021 
  1951 
  2022     // restart EoE process and master thread with new locking
  1952     // restart EoE process and master thread with new locking
  2023 
  1953 
  2024     ec_master_thread_stop(master);
  1954     ec_master_thread_stop(master);
  2025 #ifdef EC_EOE
       
  2026     eoe_was_running = master->eoe_thread != NULL;
       
  2027     ec_master_eoe_stop(master);
       
  2028 #endif
       
  2029 
  1955 
  2030     EC_MASTER_DBG(master, 1, "FSM datagram is %p.\n", &master->fsm_datagram);
  1956     EC_MASTER_DBG(master, 1, "FSM datagram is %p.\n", &master->fsm_datagram);
  2031 
  1957 
  2032     master->injection_seq_fsm = 0;
  1958     master->injection_seq_fsm = 0;
  2033     master->injection_seq_rt = 0;
  1959     master->injection_seq_rt = 0;
  2034 
  1960 
  2035     master->send_cb = master->app_send_cb;
  1961     master->send_cb = master->app_send_cb;
  2036     master->receive_cb = master->app_receive_cb;
  1962     master->receive_cb = master->app_receive_cb;
  2037     master->cb_data = master->app_cb_data;
  1963     master->cb_data = master->app_cb_data;
  2038     
  1964     
  2039 #ifdef EC_EOE
       
  2040     if (eoe_was_running) {
       
  2041         ec_master_eoe_start(master);
       
  2042     }
       
  2043 #endif
       
  2044     ret = ec_master_thread_start(master, ec_master_operation_thread,
  1965     ret = ec_master_thread_start(master, ec_master_operation_thread,
  2045                 "EtherCAT-OP");
  1966                 "EtherCAT-OP");
  2046     if (ret < 0) {
  1967     if (ret < 0) {
  2047         EC_MASTER_ERR(master, "Failed to start master thread!\n");
  1968         EC_MASTER_ERR(master, "Failed to start master thread!\n");
  2048         return ret;
  1969         return ret;
  2063 void ecrt_master_deactivate(ec_master_t *master)
  1984 void ecrt_master_deactivate(ec_master_t *master)
  2064 {
  1985 {
  2065     ec_slave_t *slave;
  1986     ec_slave_t *slave;
  2066 #ifdef EC_EOE
  1987 #ifdef EC_EOE
  2067     ec_eoe_t *eoe;
  1988     ec_eoe_t *eoe;
  2068     int eoe_was_running;
       
  2069 #endif
  1989 #endif
  2070 
  1990 
  2071     EC_MASTER_DBG(master, 1, "%s(master = 0x%p)\n", __func__, master);
  1991     EC_MASTER_DBG(master, 1, "%s(master = 0x%p)\n", __func__, master);
  2072 
  1992 
  2073     if (!master->active) {
  1993     if (!master->active) {
  2074         EC_MASTER_WARN(master, "%s: Master not active.\n", __func__);
  1994         EC_MASTER_WARN(master, "%s: Master not active.\n", __func__);
  2075         return;
  1995         return;
  2076     }
  1996     }
  2077 
  1997 
  2078     ec_master_thread_stop(master);
  1998     ec_master_thread_stop(master);
  2079 #ifdef EC_EOE
       
  2080     eoe_was_running = master->eoe_thread != NULL;
       
  2081     ec_master_eoe_stop(master);
       
  2082 #endif
       
  2083     
  1999     
  2084     master->send_cb = ec_master_internal_send_cb;
  2000     master->send_cb = ec_master_internal_send_cb;
  2085     master->receive_cb = ec_master_internal_receive_cb;
  2001     master->receive_cb = ec_master_internal_receive_cb;
  2086     master->cb_data = master;
  2002     master->cb_data = master;
  2087     
  2003     
  2089 
  2005 
  2090     for (slave = master->slaves;
  2006     for (slave = master->slaves;
  2091             slave < master->slaves + master->slave_count;
  2007             slave < master->slaves + master->slave_count;
  2092             slave++) {
  2008             slave++) {
  2093 
  2009 
  2094         // set states for all slaves
  2010         // set state to PREOP for all but eoe slaves
       
  2011 #ifdef EC_EOE
       
  2012         // ... but leave EoE slaves in OP
       
  2013         list_for_each_entry(eoe, &master->eoe_handlers, list) {
       
  2014             if (slave != eoe->slave || !ec_eoe_is_open(eoe)) {
       
  2015                 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
       
  2016                 // mark for reconfiguration, because the master could have no
       
  2017                 // possibility for a reconfiguration between two sequential operation
       
  2018                 // phases.
       
  2019                 slave->force_config = 1;
       
  2020             }
       
  2021         }
       
  2022 #else
  2095         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
  2023         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
  2096 
       
  2097         // mark for reconfiguration, because the master could have no
  2024         // mark for reconfiguration, because the master could have no
  2098         // possibility for a reconfiguration between two sequential operation
  2025         // possibility for a reconfiguration between two sequential operation
  2099         // phases.
  2026         // phases.
  2100         slave->force_config = 1;
  2027         slave->force_config = 1;
  2101     }
  2028 #endif
  2102 
  2029 
  2103 #ifdef EC_EOE
  2030     }
  2104     // ... but leave EoE slaves in OP
       
  2105     list_for_each_entry(eoe, &master->eoe_handlers, list) {
       
  2106         if (ec_eoe_is_open(eoe))
       
  2107             ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_OP);
       
  2108     }
       
  2109 #endif
       
  2110 
  2031 
  2111     master->app_time = 0ULL;
  2032     master->app_time = 0ULL;
  2112     master->app_start_time = 0ULL;
  2033     master->app_start_time = 0ULL;
  2113     master->has_app_time = 0;
  2034     master->has_app_time = 0;
  2114 
  2035 
  2115 #ifdef EC_EOE
       
  2116     if (eoe_was_running) {
       
  2117         ec_master_eoe_start(master);
       
  2118     }
       
  2119 #endif
       
  2120     if (ec_master_thread_start(master, ec_master_idle_thread,
  2036     if (ec_master_thread_start(master, ec_master_idle_thread,
  2121                 "EtherCAT-IDLE"))
  2037                 "EtherCAT-IDLE"))
  2122         EC_MASTER_WARN(master, "Failed to restart master thread!\n");
  2038         EC_MASTER_WARN(master, "Failed to restart master thread!\n");
  2123 
  2039 
  2124     master->allow_scan = 1;
  2040     master->allow_scan = 1;