equal
deleted
inserted
replaced
48 #define EC_COE_DOWN_REQ_HEADER_SIZE 10 |
48 #define EC_COE_DOWN_REQ_HEADER_SIZE 10 |
49 #define EC_COE_DOWN_SEG_REQ_HEADER_SIZE 3 |
49 #define EC_COE_DOWN_SEG_REQ_HEADER_SIZE 3 |
50 #define EC_COE_DOWN_SEG_MIN_DATA_SIZE 7 |
50 #define EC_COE_DOWN_SEG_MIN_DATA_SIZE 7 |
51 |
51 |
52 #define DEBUG_RETRIES 0 |
52 #define DEBUG_RETRIES 0 |
|
53 #define DEBUG_LONG 0 |
53 |
54 |
54 /*****************************************************************************/ |
55 /*****************************************************************************/ |
55 |
56 |
56 void ec_fsm_coe_dict_start(ec_fsm_coe_t *); |
57 void ec_fsm_coe_dict_start(ec_fsm_coe_t *); |
57 void ec_fsm_coe_dict_request(ec_fsm_coe_t *); |
58 void ec_fsm_coe_dict_request(ec_fsm_coe_t *); |
1196 |
1197 |
1197 void ec_fsm_coe_down_request(ec_fsm_coe_t *fsm /**< finite state machine */) |
1198 void ec_fsm_coe_down_request(ec_fsm_coe_t *fsm /**< finite state machine */) |
1198 { |
1199 { |
1199 ec_datagram_t *datagram = fsm->datagram; |
1200 ec_datagram_t *datagram = fsm->datagram; |
1200 ec_slave_t *slave = fsm->slave; |
1201 ec_slave_t *slave = fsm->slave; |
|
1202 unsigned long diff_ms; |
1201 |
1203 |
1202 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1204 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1203 return; // FIXME: check for response first? |
1205 return; // FIXME: check for response first? |
1204 |
1206 |
1205 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1207 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1208 " slave %u (datagram state %u).\n", |
1210 " slave %u (datagram state %u).\n", |
1209 slave->ring_position, datagram->state); |
1211 slave->ring_position, datagram->state); |
1210 return; |
1212 return; |
1211 } |
1213 } |
1212 |
1214 |
|
1215 diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
|
1216 |
1213 if (datagram->working_counter != 1) { |
1217 if (datagram->working_counter != 1) { |
1214 if (!datagram->working_counter) { |
1218 if (!datagram->working_counter) { |
1215 unsigned long diff_ms = |
|
1216 (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
|
1217 if (diff_ms < fsm->request->response_timeout) { |
1219 if (diff_ms < fsm->request->response_timeout) { |
1218 #if DEBUG_RETRIES |
1220 #if DEBUG_RETRIES |
1219 if (fsm->slave->master->debug_level) { |
1221 if (fsm->slave->master->debug_level) { |
1220 EC_DBG("Slave %u did not respond to SDO download request. " |
1222 EC_DBG("Slave %u did not respond to SDO download request. " |
1221 "Retrying after %u ms...\n", |
1223 "Retrying after %u ms...\n", |
1225 // no response; send request datagram again |
1227 // no response; send request datagram again |
1226 return; |
1228 return; |
1227 } |
1229 } |
1228 } |
1230 } |
1229 fsm->state = ec_fsm_coe_error; |
1231 fsm->state = ec_fsm_coe_error; |
1230 EC_ERR("Reception of CoE download request failed on slave %u: ", |
1232 EC_ERR("Reception of CoE download request for SDO 0x%04x:%x failed" |
1231 slave->ring_position); |
1233 " with timeout after %u ms on slave %u: ", |
|
1234 fsm->request->index, fsm->request->subindex, (u32) diff_ms, |
|
1235 fsm->slave->ring_position); |
1232 ec_datagram_print_wc_error(datagram); |
1236 ec_datagram_print_wc_error(datagram); |
1233 return; |
1237 return; |
1234 } |
1238 } |
|
1239 |
|
1240 #if DEBUG_LONG |
|
1241 if (diff_ms > 200) { |
|
1242 EC_WARN("SDO 0x%04x:%x download took %u ms on slave %u.\n", |
|
1243 fsm->request->index, fsm->request->subindex, (u32) diff_ms, |
|
1244 fsm->slave->ring_position); |
|
1245 } |
|
1246 #endif |
1235 |
1247 |
1236 fsm->jiffies_start = datagram->jiffies_sent; |
1248 fsm->jiffies_start = datagram->jiffies_sent; |
1237 |
1249 |
1238 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
1250 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
1239 fsm->retries = EC_FSM_RETRIES; |
1251 fsm->retries = EC_FSM_RETRIES; |
1273 if (!ec_slave_mbox_check(datagram)) { |
1285 if (!ec_slave_mbox_check(datagram)) { |
1274 unsigned long diff_ms = |
1286 unsigned long diff_ms = |
1275 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
1287 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
1276 if (diff_ms >= fsm->request->response_timeout) { |
1288 if (diff_ms >= fsm->request->response_timeout) { |
1277 fsm->state = ec_fsm_coe_error; |
1289 fsm->state = ec_fsm_coe_error; |
1278 EC_ERR("Timeout while waiting for SDO download response on " |
1290 EC_ERR("Timeout after %u ms while waiting for SDO 0x%04x:%x" |
1279 "slave %u.\n", slave->ring_position); |
1291 " download response on slave %u.\n", (u32) diff_ms, |
|
1292 fsm->request->index, fsm->request->subindex, |
|
1293 slave->ring_position); |
1280 return; |
1294 return; |
1281 } |
1295 } |
1282 |
1296 |
1283 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
1297 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
1284 fsm->retries = EC_FSM_RETRIES; |
1298 fsm->retries = EC_FSM_RETRIES; |
1691 |
1705 |
1692 void ec_fsm_coe_up_request(ec_fsm_coe_t *fsm /**< finite state machine */) |
1706 void ec_fsm_coe_up_request(ec_fsm_coe_t *fsm /**< finite state machine */) |
1693 { |
1707 { |
1694 ec_datagram_t *datagram = fsm->datagram; |
1708 ec_datagram_t *datagram = fsm->datagram; |
1695 ec_slave_t *slave = fsm->slave; |
1709 ec_slave_t *slave = fsm->slave; |
|
1710 unsigned long diff_ms; |
1696 |
1711 |
1697 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1712 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1698 return; // FIXME: check for response first? |
1713 return; // FIXME: check for response first? |
1699 |
1714 |
1700 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1715 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1703 " (datagram state %u).\n", |
1718 " (datagram state %u).\n", |
1704 slave->ring_position, datagram->state); |
1719 slave->ring_position, datagram->state); |
1705 return; |
1720 return; |
1706 } |
1721 } |
1707 |
1722 |
|
1723 diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
|
1724 |
1708 if (datagram->working_counter != 1) { |
1725 if (datagram->working_counter != 1) { |
1709 if (!datagram->working_counter) { |
1726 if (!datagram->working_counter) { |
1710 unsigned long diff_ms = |
|
1711 (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
|
1712 if (diff_ms < fsm->request->response_timeout) { |
1727 if (diff_ms < fsm->request->response_timeout) { |
1713 #if DEBUG_RETRIES |
1728 #if DEBUG_RETRIES |
1714 if (fsm->slave->master->debug_level) { |
1729 if (fsm->slave->master->debug_level) { |
1715 EC_DBG("Slave %u did not respond to SDO upload request. " |
1730 EC_DBG("Slave %u did not respond to SDO upload request. " |
1716 "Retrying after %u ms...\n", |
1731 "Retrying after %u ms...\n", |
1720 // no response; send request datagram again |
1735 // no response; send request datagram again |
1721 return; |
1736 return; |
1722 } |
1737 } |
1723 } |
1738 } |
1724 fsm->state = ec_fsm_coe_error; |
1739 fsm->state = ec_fsm_coe_error; |
1725 EC_ERR("Reception of CoE upload request failed on slave %u: ", |
1740 EC_ERR("Reception of CoE upload request for SDO 0x%04x:%x failed" |
1726 slave->ring_position); |
1741 " with timeout after %u ms on slave %u: ", |
|
1742 fsm->request->index, fsm->request->subindex, (u32) diff_ms, |
|
1743 fsm->slave->ring_position); |
1727 ec_datagram_print_wc_error(datagram); |
1744 ec_datagram_print_wc_error(datagram); |
1728 return; |
1745 return; |
1729 } |
1746 } |
|
1747 |
|
1748 #if DEBUG_LONG |
|
1749 if (diff_ms > 200) { |
|
1750 EC_WARN("SDO 0x%04x:%x upload took %u ms on slave %u.\n", |
|
1751 fsm->request->index, fsm->request->subindex, (u32) diff_ms, |
|
1752 fsm->slave->ring_position); |
|
1753 } |
|
1754 #endif |
1730 |
1755 |
1731 fsm->jiffies_start = datagram->jiffies_sent; |
1756 fsm->jiffies_start = datagram->jiffies_sent; |
1732 |
1757 |
1733 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
1758 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
1734 fsm->retries = EC_FSM_RETRIES; |
1759 fsm->retries = EC_FSM_RETRIES; |
1768 if (!ec_slave_mbox_check(datagram)) { |
1793 if (!ec_slave_mbox_check(datagram)) { |
1769 unsigned long diff_ms = |
1794 unsigned long diff_ms = |
1770 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
1795 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
1771 if (diff_ms >= fsm->request->response_timeout) { |
1796 if (diff_ms >= fsm->request->response_timeout) { |
1772 fsm->state = ec_fsm_coe_error; |
1797 fsm->state = ec_fsm_coe_error; |
1773 EC_ERR("Timeout while waiting for SDO upload response on " |
1798 EC_ERR("Timeout after %u ms while waiting for SDO 0x%04x:%x" |
1774 "slave %u.\n", slave->ring_position); |
1799 " upload response on slave %u.\n", (u32) diff_ms, |
|
1800 fsm->request->index, fsm->request->subindex, |
|
1801 slave->ring_position); |
1775 return; |
1802 return; |
1776 } |
1803 } |
1777 |
1804 |
1778 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
1805 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
1779 fsm->retries = EC_FSM_RETRIES; |
1806 fsm->retries = EC_FSM_RETRIES; |