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 |
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, ¶m); |
|
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; |