master/fsm_coe.c
changeset 1792 3eb466e9bad5
parent 1791 27030c6b2de3
child 1793 651f6ba216c5
equal deleted inserted replaced
1791:27030c6b2de3 1792:3eb466e9bad5
    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;