1101 ec_print_data(request->data, request->data_size); |
1101 ec_print_data(request->data, request->data_size); |
1102 } |
1102 } |
1103 |
1103 |
1104 if (!(slave->sii.mailbox_protocols & EC_MBOX_COE)) { |
1104 if (!(slave->sii.mailbox_protocols & EC_MBOX_COE)) { |
1105 EC_SLAVE_ERR(slave, "Slave does not support CoE!\n"); |
1105 EC_SLAVE_ERR(slave, "Slave does not support CoE!\n"); |
|
1106 request->errno = EPROTONOSUPPORT; |
1106 fsm->state = ec_fsm_coe_error; |
1107 fsm->state = ec_fsm_coe_error; |
1107 return; |
1108 return; |
1108 } |
1109 } |
1109 |
1110 |
1110 if (slave->configured_rx_mailbox_size < |
1111 if (slave->configured_rx_mailbox_size < |
1111 EC_MBOX_HEADER_SIZE + EC_COE_DOWN_REQ_HEADER_SIZE) { |
1112 EC_MBOX_HEADER_SIZE + EC_COE_DOWN_REQ_HEADER_SIZE) { |
1112 EC_SLAVE_ERR(slave, "Mailbox too small!\n"); |
1113 EC_SLAVE_ERR(slave, "Mailbox too small!\n"); |
|
1114 request->errno = EOVERFLOW; |
1113 fsm->state = ec_fsm_coe_error; |
1115 fsm->state = ec_fsm_coe_error; |
1114 return; |
1116 return; |
1115 } |
1117 } |
1116 |
1118 |
1117 if (request->data_size <= 4) { // use expedited transfer type |
1119 if (request->data_size <= 4) { // use expedited transfer type |
1118 data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, |
1120 data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, |
1119 EC_COE_DOWN_REQ_HEADER_SIZE); |
1121 EC_COE_DOWN_REQ_HEADER_SIZE); |
1120 if (IS_ERR(data)) { |
1122 if (IS_ERR(data)) { |
|
1123 request->errno = PTR_ERR(data); |
1121 fsm->state = ec_fsm_coe_error; |
1124 fsm->state = ec_fsm_coe_error; |
1122 return; |
1125 return; |
1123 } |
1126 } |
1124 |
1127 |
1125 fsm->remaining = 0; |
1128 fsm->remaining = 0; |
1210 |
1214 |
1211 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1215 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1212 return; // FIXME: check for response first? |
1216 return; // FIXME: check for response first? |
1213 |
1217 |
1214 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1218 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
1219 fsm->request->errno = EIO; |
1215 fsm->state = ec_fsm_coe_error; |
1220 fsm->state = ec_fsm_coe_error; |
1216 EC_SLAVE_ERR(slave, "Failed to receive CoE download" |
1221 EC_SLAVE_ERR(slave, "Failed to receive CoE download" |
1217 " request datagram: "); |
1222 " request datagram: "); |
1218 ec_datagram_print_state(datagram); |
1223 ec_datagram_print_state(datagram); |
1219 return; |
1224 return; |
1231 #endif |
1236 #endif |
1232 // no response; send request datagram again |
1237 // no response; send request datagram again |
1233 return; |
1238 return; |
1234 } |
1239 } |
1235 } |
1240 } |
|
1241 fsm->request->errno = EIO; |
1236 fsm->state = ec_fsm_coe_error; |
1242 fsm->state = ec_fsm_coe_error; |
1237 EC_SLAVE_ERR(slave, "Reception of CoE download request" |
1243 EC_SLAVE_ERR(slave, "Reception of CoE download request" |
1238 " for SDO 0x%04x:%x failed with timeout after %lu ms: ", |
1244 " for SDO 0x%04x:%x failed with timeout after %lu ms: ", |
1239 fsm->request->index, fsm->request->subindex, diff_ms); |
1245 fsm->request->index, fsm->request->subindex, diff_ms); |
1240 ec_datagram_print_wc_error(datagram); |
1246 ec_datagram_print_wc_error(datagram); |
1266 |
1272 |
1267 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1273 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1268 return; |
1274 return; |
1269 |
1275 |
1270 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1276 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
1277 fsm->request->errno = EIO; |
1271 fsm->state = ec_fsm_coe_error; |
1278 fsm->state = ec_fsm_coe_error; |
1272 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check" |
1279 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check" |
1273 " datagram: "); |
1280 " datagram: "); |
1274 ec_datagram_print_state(datagram); |
1281 ec_datagram_print_state(datagram); |
1275 return; |
1282 return; |
1276 } |
1283 } |
1277 |
1284 |
1278 if (datagram->working_counter != 1) { |
1285 if (datagram->working_counter != 1) { |
|
1286 fsm->request->errno = EIO; |
1279 fsm->state = ec_fsm_coe_error; |
1287 fsm->state = ec_fsm_coe_error; |
1280 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
1288 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
1281 " datagram failed: "); |
1289 " datagram failed: "); |
1282 ec_datagram_print_wc_error(datagram); |
1290 ec_datagram_print_wc_error(datagram); |
1283 return; |
1291 return; |
1285 |
1293 |
1286 if (!ec_slave_mbox_check(datagram)) { |
1294 if (!ec_slave_mbox_check(datagram)) { |
1287 unsigned long diff_ms = |
1295 unsigned long diff_ms = |
1288 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
1296 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
1289 if (diff_ms >= fsm->request->response_timeout) { |
1297 if (diff_ms >= fsm->request->response_timeout) { |
|
1298 fsm->request->errno = EIO; |
1290 fsm->state = ec_fsm_coe_error; |
1299 fsm->state = ec_fsm_coe_error; |
1291 EC_SLAVE_ERR(slave, "Timeout after %lu ms while waiting" |
1300 EC_SLAVE_ERR(slave, "Timeout after %lu ms while waiting" |
1292 " for SDO 0x%04x:%x download response.\n", diff_ms, |
1301 " for SDO 0x%04x:%x download response.\n", diff_ms, |
1293 fsm->request->index, fsm->request->subindex); |
1302 fsm->request->index, fsm->request->subindex); |
1294 return; |
1303 return; |
1387 |
1397 |
1388 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1398 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1389 return; // FIXME: request again? |
1399 return; // FIXME: request again? |
1390 |
1400 |
1391 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1401 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
1402 request->errno = EIO; |
1392 fsm->state = ec_fsm_coe_error; |
1403 fsm->state = ec_fsm_coe_error; |
1393 EC_SLAVE_ERR(slave, "Failed to receive CoE download" |
1404 EC_SLAVE_ERR(slave, "Failed to receive CoE download" |
1394 " response datagram: "); |
1405 " response datagram: "); |
1395 ec_datagram_print_state(datagram); |
1406 ec_datagram_print_state(datagram); |
1396 return; |
1407 return; |
1397 } |
1408 } |
1398 |
1409 |
1399 if (datagram->working_counter != 1) { |
1410 if (datagram->working_counter != 1) { |
|
1411 request->errno = EIO; |
1400 fsm->state = ec_fsm_coe_error; |
1412 fsm->state = ec_fsm_coe_error; |
1401 EC_SLAVE_ERR(slave, "Reception of CoE download response failed: "); |
1413 EC_SLAVE_ERR(slave, "Reception of CoE download response failed: "); |
1402 ec_datagram_print_wc_error(datagram); |
1414 ec_datagram_print_wc_error(datagram); |
1403 return; |
1415 return; |
1404 } |
1416 } |
1405 |
1417 |
1406 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
1418 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
1407 if (IS_ERR(data)) { |
1419 if (IS_ERR(data)) { |
|
1420 request->errno = PTR_ERR(data); |
1408 fsm->state = ec_fsm_coe_error; |
1421 fsm->state = ec_fsm_coe_error; |
1409 return; |
1422 return; |
1410 } |
1423 } |
1411 |
1424 |
1412 if (mbox_prot != 0x03) { // CoE |
1425 if (mbox_prot != 0x03) { // CoE |
|
1426 request->errno = EIO; |
1413 fsm->state = ec_fsm_coe_error; |
1427 fsm->state = ec_fsm_coe_error; |
1414 EC_SLAVE_ERR(slave, "Received mailbox protocol 0x%02X as response.\n", |
1428 EC_SLAVE_ERR(slave, "Received mailbox protocol 0x%02X as response.\n", |
1415 mbox_prot); |
1429 mbox_prot); |
1416 return; |
1430 return; |
1417 } |
1431 } |
1428 EC_SLAVE_DBG(slave, 1, "Download response:\n"); |
1442 EC_SLAVE_DBG(slave, 1, "Download response:\n"); |
1429 ec_print_data(data, rec_size); |
1443 ec_print_data(data, rec_size); |
1430 } |
1444 } |
1431 |
1445 |
1432 if (rec_size < 6) { |
1446 if (rec_size < 6) { |
|
1447 request->errno = EIO; |
1433 fsm->state = ec_fsm_coe_error; |
1448 fsm->state = ec_fsm_coe_error; |
1434 EC_SLAVE_ERR(slave, "Received data are too small (%zu bytes):\n", |
1449 EC_SLAVE_ERR(slave, "Received data are too small (%zu bytes):\n", |
1435 rec_size); |
1450 rec_size); |
1436 ec_print_data(data, rec_size); |
1451 ec_print_data(data, rec_size); |
1437 return; |
1452 return; |
1438 } |
1453 } |
1439 |
1454 |
1440 if (EC_READ_U16(data) >> 12 == 0x2 && // SDO request |
1455 if (EC_READ_U16(data) >> 12 == 0x2 && // SDO request |
1441 EC_READ_U8 (data + 2) >> 5 == 0x4) { // abort SDO transfer request |
1456 EC_READ_U8 (data + 2) >> 5 == 0x4) { // abort SDO transfer request |
1442 char subidxstr[10]; |
1457 char subidxstr[10]; |
|
1458 request->errno = EIO; |
1443 fsm->state = ec_fsm_coe_error; |
1459 fsm->state = ec_fsm_coe_error; |
1444 if (request->complete_access) { |
1460 if (request->complete_access) { |
1445 subidxstr[0] = 0x00; |
1461 subidxstr[0] = 0x00; |
1446 } else { |
1462 } else { |
1447 sprintf(subidxstr, ":%02X", request->subindex); |
1463 sprintf(subidxstr, ":%02X", request->subindex); |
1495 |
1511 |
1496 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1512 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1497 return; |
1513 return; |
1498 |
1514 |
1499 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1515 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
1516 fsm->request->errno = EIO; |
1500 fsm->state = ec_fsm_coe_error; |
1517 fsm->state = ec_fsm_coe_error; |
1501 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
1518 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
1502 ec_datagram_print_state(datagram); |
1519 ec_datagram_print_state(datagram); |
1503 return; |
1520 return; |
1504 } |
1521 } |
1505 |
1522 |
1506 if (datagram->working_counter != 1) { |
1523 if (datagram->working_counter != 1) { |
|
1524 fsm->request->errno = EIO; |
1507 fsm->state = ec_fsm_coe_error; |
1525 fsm->state = ec_fsm_coe_error; |
1508 EC_SLAVE_ERR(slave, "Reception of CoE mailbox segment check" |
1526 EC_SLAVE_ERR(slave, "Reception of CoE mailbox segment check" |
1509 " datagram failed: "); |
1527 " datagram failed: "); |
1510 ec_datagram_print_wc_error(datagram); |
1528 ec_datagram_print_wc_error(datagram); |
1511 return; |
1529 return; |
1513 |
1531 |
1514 if (!ec_slave_mbox_check(datagram)) { |
1532 if (!ec_slave_mbox_check(datagram)) { |
1515 unsigned long diff_ms = |
1533 unsigned long diff_ms = |
1516 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
1534 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
1517 if (diff_ms >= fsm->request->response_timeout) { |
1535 if (diff_ms >= fsm->request->response_timeout) { |
|
1536 fsm->request->errno = EIO; |
1518 fsm->state = ec_fsm_coe_error; |
1537 fsm->state = ec_fsm_coe_error; |
1519 EC_SLAVE_ERR(slave, "Timeout while waiting for SDO download" |
1538 EC_SLAVE_ERR(slave, "Timeout while waiting for SDO download" |
1520 " segment response.\n"); |
1539 " segment response.\n"); |
1521 return; |
1540 return; |
1522 } |
1541 } |
1551 |
1570 |
1552 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1571 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1553 return; // FIXME: request again? |
1572 return; // FIXME: request again? |
1554 |
1573 |
1555 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1574 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
1575 request->errno = EIO; |
1556 fsm->state = ec_fsm_coe_error; |
1576 fsm->state = ec_fsm_coe_error; |
1557 EC_SLAVE_ERR(slave, "Failed to receive CoE download response" |
1577 EC_SLAVE_ERR(slave, "Failed to receive CoE download response" |
1558 " datagram: "); |
1578 " datagram: "); |
1559 ec_datagram_print_state(datagram); |
1579 ec_datagram_print_state(datagram); |
1560 return; |
1580 return; |
1561 } |
1581 } |
1562 |
1582 |
1563 if (datagram->working_counter != 1) { |
1583 if (datagram->working_counter != 1) { |
|
1584 request->errno = EIO; |
1564 fsm->state = ec_fsm_coe_error; |
1585 fsm->state = ec_fsm_coe_error; |
1565 EC_SLAVE_ERR(slave, "Reception of CoE download response failed: "); |
1586 EC_SLAVE_ERR(slave, "Reception of CoE download response failed: "); |
1566 ec_datagram_print_wc_error(datagram); |
1587 ec_datagram_print_wc_error(datagram); |
1567 return; |
1588 return; |
1568 } |
1589 } |
1569 |
1590 |
1570 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
1591 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
1571 if (IS_ERR(data)) { |
1592 if (IS_ERR(data)) { |
|
1593 request->errno = PTR_ERR(data); |
1572 fsm->state = ec_fsm_coe_error; |
1594 fsm->state = ec_fsm_coe_error; |
1573 return; |
1595 return; |
1574 } |
1596 } |
1575 |
1597 |
1576 if (mbox_prot != 0x03) { // CoE |
1598 if (mbox_prot != 0x03) { // CoE |
|
1599 request->errno = EIO; |
1577 fsm->state = ec_fsm_coe_error; |
1600 fsm->state = ec_fsm_coe_error; |
1578 EC_SLAVE_ERR(slave, "Received mailbox protocol 0x%02X as response.\n", |
1601 EC_SLAVE_ERR(slave, "Received mailbox protocol 0x%02X as response.\n", |
1579 mbox_prot); |
1602 mbox_prot); |
1580 return; |
1603 return; |
1581 } |
1604 } |
1592 EC_SLAVE_DBG(slave, 1, "Download response:\n"); |
1615 EC_SLAVE_DBG(slave, 1, "Download response:\n"); |
1593 ec_print_data(data, rec_size); |
1616 ec_print_data(data, rec_size); |
1594 } |
1617 } |
1595 |
1618 |
1596 if (rec_size < 6) { |
1619 if (rec_size < 6) { |
|
1620 request->errno = EIO; |
1597 fsm->state = ec_fsm_coe_error; |
1621 fsm->state = ec_fsm_coe_error; |
1598 EC_SLAVE_ERR(slave, "Received data are too small (%zu bytes):\n", |
1622 EC_SLAVE_ERR(slave, "Received data are too small (%zu bytes):\n", |
1599 rec_size); |
1623 rec_size); |
1600 ec_print_data(data, rec_size); |
1624 ec_print_data(data, rec_size); |
1601 return; |
1625 return; |
1602 } |
1626 } |
1603 |
1627 |
1604 if (EC_READ_U16(data) >> 12 == 0x2 && // SDO request |
1628 if (EC_READ_U16(data) >> 12 == 0x2 && // SDO request |
1605 EC_READ_U8 (data + 2) >> 5 == 0x4) { // abort SDO transfer request |
1629 EC_READ_U8 (data + 2) >> 5 == 0x4) { // abort SDO transfer request |
1606 char subidxstr[10]; |
1630 char subidxstr[10]; |
|
1631 request->errno = EIO; |
1607 fsm->state = ec_fsm_coe_error; |
1632 fsm->state = ec_fsm_coe_error; |
1608 if (request->complete_access) { |
1633 if (request->complete_access) { |
1609 subidxstr[0] = 0x00; |
1634 subidxstr[0] = 0x00; |
1610 } else { |
1635 } else { |
1611 sprintf(subidxstr, ":%02X", request->subindex); |
1636 sprintf(subidxstr, ":%02X", request->subindex); |
1638 |
1663 |
1639 if (((EC_READ_U8(data + 2) >> 4) & 0x01) != fsm->toggle) { |
1664 if (((EC_READ_U8(data + 2) >> 4) & 0x01) != fsm->toggle) { |
1640 EC_SLAVE_ERR(slave, "Invalid toggle received during" |
1665 EC_SLAVE_ERR(slave, "Invalid toggle received during" |
1641 " segmented download:\n"); |
1666 " segmented download:\n"); |
1642 ec_print_data(data, rec_size); |
1667 ec_print_data(data, rec_size); |
|
1668 request->errno = EIO; |
1643 fsm->state = ec_fsm_coe_error; |
1669 fsm->state = ec_fsm_coe_error; |
1644 return; |
1670 return; |
1645 } |
1671 } |
1646 |
1672 |
1647 if (fsm->remaining) { // more segments to download |
1673 if (fsm->remaining) { // more segments to download |
1669 EC_SLAVE_DBG(slave, 1, "Uploading SDO 0x%04X:%02X.\n", |
1695 EC_SLAVE_DBG(slave, 1, "Uploading SDO 0x%04X:%02X.\n", |
1670 request->index, request->subindex); |
1696 request->index, request->subindex); |
1671 |
1697 |
1672 if (!(slave->sii.mailbox_protocols & EC_MBOX_COE)) { |
1698 if (!(slave->sii.mailbox_protocols & EC_MBOX_COE)) { |
1673 EC_SLAVE_ERR(slave, "Slave does not support CoE!\n"); |
1699 EC_SLAVE_ERR(slave, "Slave does not support CoE!\n"); |
|
1700 request->errno = EPROTONOSUPPORT; |
1674 fsm->state = ec_fsm_coe_error; |
1701 fsm->state = ec_fsm_coe_error; |
1675 return; |
1702 return; |
1676 } |
1703 } |
1677 |
1704 |
1678 data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10); |
1705 data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10); |
1679 if (IS_ERR(data)) { |
1706 if (IS_ERR(data)) { |
|
1707 request->errno = PTR_ERR(data); |
1680 fsm->state = ec_fsm_coe_error; |
1708 fsm->state = ec_fsm_coe_error; |
1681 return; |
1709 return; |
1682 } |
1710 } |
1683 |
1711 |
1684 EC_WRITE_U16(data, 0x2 << 12); // SDO request |
1712 EC_WRITE_U16(data, 0x2 << 12); // SDO request |
1712 |
1740 |
1713 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1741 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1714 return; // FIXME: check for response first? |
1742 return; // FIXME: check for response first? |
1715 |
1743 |
1716 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1744 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
1745 fsm->request->errno = EIO; |
1717 fsm->state = ec_fsm_coe_error; |
1746 fsm->state = ec_fsm_coe_error; |
1718 EC_SLAVE_ERR(slave, "Failed to receive CoE upload request: "); |
1747 EC_SLAVE_ERR(slave, "Failed to receive CoE upload request: "); |
1719 ec_datagram_print_state(datagram); |
1748 ec_datagram_print_state(datagram); |
1720 return; |
1749 return; |
1721 } |
1750 } |
1732 #endif |
1761 #endif |
1733 // no response; send request datagram again |
1762 // no response; send request datagram again |
1734 return; |
1763 return; |
1735 } |
1764 } |
1736 } |
1765 } |
|
1766 fsm->request->errno = EIO; |
1737 fsm->state = ec_fsm_coe_error; |
1767 fsm->state = ec_fsm_coe_error; |
1738 EC_SLAVE_ERR(slave, "Reception of CoE upload request for" |
1768 EC_SLAVE_ERR(slave, "Reception of CoE upload request for" |
1739 " SDO 0x%04x:%x failed with timeout after %lu ms: ", |
1769 " SDO 0x%04x:%x failed with timeout after %lu ms: ", |
1740 fsm->request->index, fsm->request->subindex, diff_ms); |
1770 fsm->request->index, fsm->request->subindex, diff_ms); |
1741 ec_datagram_print_wc_error(datagram); |
1771 ec_datagram_print_wc_error(datagram); |
1769 |
1799 |
1770 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1800 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1771 return; |
1801 return; |
1772 |
1802 |
1773 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1803 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
1804 fsm->request->errno = EIO; |
1774 fsm->state = ec_fsm_coe_error; |
1805 fsm->state = ec_fsm_coe_error; |
1775 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
1806 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
1776 ec_datagram_print_state(datagram); |
1807 ec_datagram_print_state(datagram); |
1777 return; |
1808 return; |
1778 } |
1809 } |
1779 |
1810 |
1780 if (datagram->working_counter != 1) { |
1811 if (datagram->working_counter != 1) { |
|
1812 fsm->request->errno = EIO; |
1781 fsm->state = ec_fsm_coe_error; |
1813 fsm->state = ec_fsm_coe_error; |
1782 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
1814 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
1783 " datagram failed: "); |
1815 " datagram failed: "); |
1784 ec_datagram_print_wc_error(datagram); |
1816 ec_datagram_print_wc_error(datagram); |
1785 return; |
1817 return; |
1787 |
1819 |
1788 if (!ec_slave_mbox_check(datagram)) { |
1820 if (!ec_slave_mbox_check(datagram)) { |
1789 unsigned long diff_ms = |
1821 unsigned long diff_ms = |
1790 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
1822 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
1791 if (diff_ms >= fsm->request->response_timeout) { |
1823 if (diff_ms >= fsm->request->response_timeout) { |
|
1824 fsm->request->errno = EIO; |
1792 fsm->state = ec_fsm_coe_error; |
1825 fsm->state = ec_fsm_coe_error; |
1793 EC_SLAVE_ERR(slave, "Timeout after %lu ms while waiting for" |
1826 EC_SLAVE_ERR(slave, "Timeout after %lu ms while waiting for" |
1794 " SDO 0x%04x:%x upload response.\n", diff_ms, |
1827 " SDO 0x%04x:%x upload response.\n", diff_ms, |
1795 fsm->request->index, fsm->request->subindex); |
1828 fsm->request->index, fsm->request->subindex); |
1796 return; |
1829 return; |
1848 uint16_t rec_index; |
1882 uint16_t rec_index; |
1849 uint8_t *data, mbox_prot, rec_subindex; |
1883 uint8_t *data, mbox_prot, rec_subindex; |
1850 size_t rec_size, data_size; |
1884 size_t rec_size, data_size; |
1851 ec_sdo_request_t *request = fsm->request; |
1885 ec_sdo_request_t *request = fsm->request; |
1852 unsigned int expedited, size_specified; |
1886 unsigned int expedited, size_specified; |
|
1887 int ret; |
1853 |
1888 |
1854 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1889 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1855 return; // FIXME: request again? |
1890 return; // FIXME: request again? |
1856 |
1891 |
1857 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1892 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
1893 request->errno = EIO; |
1858 fsm->state = ec_fsm_coe_error; |
1894 fsm->state = ec_fsm_coe_error; |
1859 EC_SLAVE_ERR(slave, "Failed to receive CoE upload response" |
1895 EC_SLAVE_ERR(slave, "Failed to receive CoE upload response" |
1860 " datagram: "); |
1896 " datagram: "); |
1861 ec_datagram_print_state(datagram); |
1897 ec_datagram_print_state(datagram); |
1862 return; |
1898 return; |
1863 } |
1899 } |
1864 |
1900 |
1865 if (datagram->working_counter != 1) { |
1901 if (datagram->working_counter != 1) { |
|
1902 request->errno = EIO; |
1866 fsm->state = ec_fsm_coe_error; |
1903 fsm->state = ec_fsm_coe_error; |
1867 EC_SLAVE_ERR(slave, "Reception of CoE upload response failed: "); |
1904 EC_SLAVE_ERR(slave, "Reception of CoE upload response failed: "); |
1868 ec_datagram_print_wc_error(datagram); |
1905 ec_datagram_print_wc_error(datagram); |
1869 return; |
1906 return; |
1870 } |
1907 } |
1871 |
1908 |
1872 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
1909 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
1873 if (IS_ERR(data)) { |
1910 if (IS_ERR(data)) { |
|
1911 request->errno = PTR_ERR(data); |
1874 fsm->state = ec_fsm_coe_error; |
1912 fsm->state = ec_fsm_coe_error; |
1875 return; |
1913 return; |
1876 } |
1914 } |
1877 |
1915 |
1878 if (master->debug_level) { |
1916 if (master->debug_level) { |
1879 EC_SLAVE_DBG(slave, 1, "Upload response:\n"); |
1917 EC_SLAVE_DBG(slave, 1, "Upload response:\n"); |
1880 ec_print_data(data, rec_size); |
1918 ec_print_data(data, rec_size); |
1881 } |
1919 } |
1882 |
1920 |
1883 if (mbox_prot != 0x03) { // CoE |
1921 if (mbox_prot != 0x03) { // CoE |
|
1922 request->errno = EIO; |
1884 fsm->state = ec_fsm_coe_error; |
1923 fsm->state = ec_fsm_coe_error; |
1885 EC_SLAVE_WARN(slave, "Received mailbox protocol 0x%02X" |
1924 EC_SLAVE_WARN(slave, "Received mailbox protocol 0x%02X" |
1886 " as response.\n", mbox_prot); |
1925 " as response.\n", mbox_prot); |
1887 return; |
1926 return; |
1888 } |
1927 } |
1894 fsm->state = ec_fsm_coe_up_check; |
1933 fsm->state = ec_fsm_coe_up_check; |
1895 return; |
1934 return; |
1896 } |
1935 } |
1897 |
1936 |
1898 if (rec_size < 6) { |
1937 if (rec_size < 6) { |
|
1938 request->errno = EIO; |
1899 fsm->state = ec_fsm_coe_error; |
1939 fsm->state = ec_fsm_coe_error; |
1900 EC_SLAVE_ERR(slave, "Received currupted SDO upload response" |
1940 EC_SLAVE_ERR(slave, "Received currupted SDO upload response" |
1901 " (%zu bytes)!\n", rec_size); |
1941 " (%zu bytes)!\n", rec_size); |
1902 ec_print_data(data, rec_size); |
1942 ec_print_data(data, rec_size); |
1903 return; |
1943 return; |
1911 request->abort_code = EC_READ_U32(data + 6); |
1951 request->abort_code = EC_READ_U32(data + 6); |
1912 ec_canopen_abort_msg(slave, request->abort_code); |
1952 ec_canopen_abort_msg(slave, request->abort_code); |
1913 } else { |
1953 } else { |
1914 EC_SLAVE_ERR(slave, "No abort message.\n"); |
1954 EC_SLAVE_ERR(slave, "No abort message.\n"); |
1915 } |
1955 } |
|
1956 request->errno = EIO; |
1916 fsm->state = ec_fsm_coe_error; |
1957 fsm->state = ec_fsm_coe_error; |
1917 return; |
1958 return; |
1918 } |
1959 } |
1919 |
1960 |
1920 if (EC_READ_U16(data) >> 12 != 0x3 || // SDO response |
1961 if (EC_READ_U16(data) >> 12 != 0x3 || // SDO response |
1921 EC_READ_U8(data + 2) >> 5 != 0x2) { // upload response |
1962 EC_READ_U8(data + 2) >> 5 != 0x2) { // upload response |
1922 EC_SLAVE_ERR(slave, "Received unknown response while" |
1963 EC_SLAVE_ERR(slave, "Received unknown response while" |
1923 " uploading SDO 0x%04X:%02X.\n", |
1964 " uploading SDO 0x%04X:%02X.\n", |
1924 request->index, request->subindex); |
1965 request->index, request->subindex); |
1925 ec_print_data(data, rec_size); |
1966 ec_print_data(data, rec_size); |
|
1967 request->errno = EIO; |
1926 fsm->state = ec_fsm_coe_error; |
1968 fsm->state = ec_fsm_coe_error; |
1927 return; |
1969 return; |
1928 } |
1970 } |
1929 |
1971 |
1930 rec_index = EC_READ_U16(data + 3); |
1972 rec_index = EC_READ_U16(data + 3); |
1953 } else { |
1995 } else { |
1954 fsm->complete_size = 4; |
1996 fsm->complete_size = 4; |
1955 } |
1997 } |
1956 |
1998 |
1957 if (rec_size < 6 + fsm->complete_size) { |
1999 if (rec_size < 6 + fsm->complete_size) { |
|
2000 request->errno = EIO; |
1958 fsm->state = ec_fsm_coe_error; |
2001 fsm->state = ec_fsm_coe_error; |
1959 EC_SLAVE_ERR(slave, "Received corrupted SDO expedited upload" |
2002 EC_SLAVE_ERR(slave, "Received corrupted SDO expedited upload" |
1960 " response (only %zu bytes)!\n", rec_size); |
2003 " response (only %zu bytes)!\n", rec_size); |
1961 ec_print_data(data, rec_size); |
2004 ec_print_data(data, rec_size); |
1962 return; |
2005 return; |
1963 } |
2006 } |
1964 |
2007 |
1965 if (ec_sdo_request_copy_data(request, data + 6, fsm->complete_size)) { |
2008 ret = ec_sdo_request_copy_data(request, data + 6, fsm->complete_size); |
|
2009 if (ret) { |
|
2010 request->errno = -ret; |
1966 fsm->state = ec_fsm_coe_error; |
2011 fsm->state = ec_fsm_coe_error; |
1967 return; |
2012 return; |
1968 } |
2013 } |
1969 } else { // normal |
2014 } else { // normal |
1970 if (rec_size < 10) { |
2015 if (rec_size < 10) { |
|
2016 request->errno = EIO; |
1971 fsm->state = ec_fsm_coe_error; |
2017 fsm->state = ec_fsm_coe_error; |
1972 EC_SLAVE_ERR(slave, "Received currupted SDO normal upload" |
2018 EC_SLAVE_ERR(slave, "Received currupted SDO normal upload" |
1973 " response (only %zu bytes)!\n", rec_size); |
2019 " response (only %zu bytes)!\n", rec_size); |
1974 ec_print_data(data, rec_size); |
2020 ec_print_data(data, rec_size); |
1975 return; |
2021 return; |
1977 |
2023 |
1978 data_size = rec_size - 10; |
2024 data_size = rec_size - 10; |
1979 fsm->complete_size = EC_READ_U32(data + 6); |
2025 fsm->complete_size = EC_READ_U32(data + 6); |
1980 |
2026 |
1981 if (!fsm->complete_size) { |
2027 if (!fsm->complete_size) { |
|
2028 request->errno = EIO; |
1982 fsm->state = ec_fsm_coe_error; |
2029 fsm->state = ec_fsm_coe_error; |
1983 EC_SLAVE_ERR(slave, "No complete size supplied!\n"); |
2030 EC_SLAVE_ERR(slave, "No complete size supplied!\n"); |
1984 ec_print_data(data, rec_size); |
2031 ec_print_data(data, rec_size); |
1985 return; |
2032 return; |
1986 } |
2033 } |
1987 |
2034 |
1988 if (ec_sdo_request_alloc(request, fsm->complete_size)) { |
2035 ret = ec_sdo_request_alloc(request, fsm->complete_size); |
|
2036 if (ret) { |
|
2037 request->errno = -ret; |
1989 fsm->state = ec_fsm_coe_error; |
2038 fsm->state = ec_fsm_coe_error; |
1990 return; |
2039 return; |
1991 } |
2040 } |
1992 |
2041 |
1993 if (ec_sdo_request_copy_data(request, data + 10, data_size)) { |
2042 ret = ec_sdo_request_copy_data(request, data + 10, data_size); |
|
2043 if (ret) { |
|
2044 request->errno = -ret; |
1994 fsm->state = ec_fsm_coe_error; |
2045 fsm->state = ec_fsm_coe_error; |
1995 return; |
2046 return; |
1996 } |
2047 } |
1997 |
2048 |
1998 fsm->toggle = 0; |
2049 fsm->toggle = 0; |
2029 |
2080 |
2030 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
2081 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
2031 return; // FIXME: check for response first? |
2082 return; // FIXME: check for response first? |
2032 |
2083 |
2033 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
2084 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
2085 fsm->request->errno = EIO; |
2034 fsm->state = ec_fsm_coe_error; |
2086 fsm->state = ec_fsm_coe_error; |
2035 EC_SLAVE_ERR(slave, "Failed to receive CoE upload segment" |
2087 EC_SLAVE_ERR(slave, "Failed to receive CoE upload segment" |
2036 " request datagram: "); |
2088 " request datagram: "); |
2037 ec_datagram_print_state(datagram); |
2089 ec_datagram_print_state(datagram); |
2038 return; |
2090 return; |
2039 } |
2091 } |
2040 |
2092 |
2041 if (datagram->working_counter != 1) { |
2093 if (datagram->working_counter != 1) { |
|
2094 fsm->request->errno = EIO; |
2042 fsm->state = ec_fsm_coe_error; |
2095 fsm->state = ec_fsm_coe_error; |
2043 EC_SLAVE_ERR(slave, "Reception of CoE upload segment" |
2096 EC_SLAVE_ERR(slave, "Reception of CoE upload segment" |
2044 " request failed: "); |
2097 " request failed: "); |
2045 ec_datagram_print_wc_error(datagram); |
2098 ec_datagram_print_wc_error(datagram); |
2046 return; |
2099 return; |
2066 |
2119 |
2067 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
2120 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
2068 return; |
2121 return; |
2069 |
2122 |
2070 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
2123 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
2124 fsm->request->errno = EIO; |
2071 fsm->state = ec_fsm_coe_error; |
2125 fsm->state = ec_fsm_coe_error; |
2072 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check" |
2126 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check" |
2073 " datagram: "); |
2127 " datagram: "); |
2074 ec_datagram_print_state(datagram); |
2128 ec_datagram_print_state(datagram); |
2075 return; |
2129 return; |
2076 } |
2130 } |
2077 |
2131 |
2078 if (datagram->working_counter != 1) { |
2132 if (datagram->working_counter != 1) { |
|
2133 fsm->request->errno = EIO; |
2079 fsm->state = ec_fsm_coe_error; |
2134 fsm->state = ec_fsm_coe_error; |
2080 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check datagram" |
2135 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check datagram" |
2081 " failed: "); |
2136 " failed: "); |
2082 ec_datagram_print_wc_error(datagram); |
2137 ec_datagram_print_wc_error(datagram); |
2083 return; |
2138 return; |
2085 |
2140 |
2086 if (!ec_slave_mbox_check(datagram)) { |
2141 if (!ec_slave_mbox_check(datagram)) { |
2087 unsigned long diff_ms = |
2142 unsigned long diff_ms = |
2088 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
2143 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
2089 if (diff_ms >= fsm->request->response_timeout) { |
2144 if (diff_ms >= fsm->request->response_timeout) { |
|
2145 fsm->request->errno = EIO; |
2090 fsm->state = ec_fsm_coe_error; |
2146 fsm->state = ec_fsm_coe_error; |
2091 EC_SLAVE_ERR(slave, "Timeout while waiting for SDO upload" |
2147 EC_SLAVE_ERR(slave, "Timeout while waiting for SDO upload" |
2092 " segment response.\n"); |
2148 " segment response.\n"); |
2093 return; |
2149 return; |
2094 } |
2150 } |
2123 |
2179 |
2124 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
2180 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
2125 return; // FIXME: request again? |
2181 return; // FIXME: request again? |
2126 |
2182 |
2127 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
2183 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
2184 request->errno = EIO; |
2128 fsm->state = ec_fsm_coe_error; |
2185 fsm->state = ec_fsm_coe_error; |
2129 EC_SLAVE_ERR(slave, "Failed to receive CoE upload segment" |
2186 EC_SLAVE_ERR(slave, "Failed to receive CoE upload segment" |
2130 " response datagram: "); |
2187 " response datagram: "); |
2131 ec_datagram_print_state(datagram); |
2188 ec_datagram_print_state(datagram); |
2132 return; |
2189 return; |
2133 } |
2190 } |
2134 |
2191 |
2135 if (datagram->working_counter != 1) { |
2192 if (datagram->working_counter != 1) { |
|
2193 request->errno = EIO; |
2136 fsm->state = ec_fsm_coe_error; |
2194 fsm->state = ec_fsm_coe_error; |
2137 EC_SLAVE_ERR(slave, "Reception of CoE upload segment" |
2195 EC_SLAVE_ERR(slave, "Reception of CoE upload segment" |
2138 " response failed: "); |
2196 " response failed: "); |
2139 ec_datagram_print_wc_error(datagram); |
2197 ec_datagram_print_wc_error(datagram); |
2140 return; |
2198 return; |
2141 } |
2199 } |
2142 |
2200 |
2143 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
2201 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
2144 if (IS_ERR(data)) { |
2202 if (IS_ERR(data)) { |
|
2203 request->errno = PTR_ERR(data); |
2145 fsm->state = ec_fsm_coe_error; |
2204 fsm->state = ec_fsm_coe_error; |
2146 return; |
2205 return; |
2147 } |
2206 } |
2148 |
2207 |
2149 if (master->debug_level) { |
2208 if (master->debug_level) { |
2168 |
2228 |
2169 if (rec_size < 10) { |
2229 if (rec_size < 10) { |
2170 EC_SLAVE_ERR(slave, "Received currupted SDO upload" |
2230 EC_SLAVE_ERR(slave, "Received currupted SDO upload" |
2171 " segment response!\n"); |
2231 " segment response!\n"); |
2172 ec_print_data(data, rec_size); |
2232 ec_print_data(data, rec_size); |
|
2233 request->errno = EIO; |
2173 fsm->state = ec_fsm_coe_error; |
2234 fsm->state = ec_fsm_coe_error; |
2174 return; |
2235 return; |
2175 } |
2236 } |
2176 |
2237 |
2177 if (EC_READ_U16(data) >> 12 == 0x2 && // SDO request |
2238 if (EC_READ_U16(data) >> 12 == 0x2 && // SDO request |
2178 EC_READ_U8 (data + 2) >> 5 == 0x4) { // abort SDO transfer request |
2239 EC_READ_U8 (data + 2) >> 5 == 0x4) { // abort SDO transfer request |
2179 EC_SLAVE_ERR(slave, "SDO upload 0x%04X:%02X aborted.\n", |
2240 EC_SLAVE_ERR(slave, "SDO upload 0x%04X:%02X aborted.\n", |
2180 request->index, request->subindex); |
2241 request->index, request->subindex); |
2181 request->abort_code = EC_READ_U32(data + 6); |
2242 request->abort_code = EC_READ_U32(data + 6); |
2182 ec_canopen_abort_msg(slave, request->abort_code); |
2243 ec_canopen_abort_msg(slave, request->abort_code); |
|
2244 request->errno = EIO; |
2183 fsm->state = ec_fsm_coe_error; |
2245 fsm->state = ec_fsm_coe_error; |
2184 return; |
2246 return; |
2185 } |
2247 } |
2186 |
2248 |
2187 if (EC_READ_U16(data) >> 12 != 0x3 || // SDO response |
2249 if (EC_READ_U16(data) >> 12 != 0x3 || // SDO response |
2206 |
2268 |
2207 if (request->data_size + data_size > fsm->complete_size) { |
2269 if (request->data_size + data_size > fsm->complete_size) { |
2208 EC_SLAVE_ERR(slave, "SDO upload 0x%04X:%02X failed: Fragment" |
2270 EC_SLAVE_ERR(slave, "SDO upload 0x%04X:%02X failed: Fragment" |
2209 " exceeding complete size!\n", |
2271 " exceeding complete size!\n", |
2210 request->index, request->subindex); |
2272 request->index, request->subindex); |
|
2273 request->errno = EOVERFLOW; |
2211 fsm->state = ec_fsm_coe_error; |
2274 fsm->state = ec_fsm_coe_error; |
2212 return; |
2275 return; |
2213 } |
2276 } |
2214 |
2277 |
2215 memcpy(request->data + request->data_size, data + 3, data_size); |
2278 memcpy(request->data + request->data_size, data + 3, data_size); |