master/fsm_coe.c
changeset 1948 fa1c4fb0a8da
parent 1931 831f2d34664c
child 2041 f5b31f46c38f
child 2196 6b481c7b3b34
equal deleted inserted replaced
1947:024a3c6aa3f7 1948:fa1c4fb0a8da
  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;
  1157         }
  1160         }
  1158 
  1161 
  1159         data = ec_slave_mbox_prepare_send(slave, datagram, 0x03,
  1162         data = ec_slave_mbox_prepare_send(slave, datagram, 0x03,
  1160                 data_size);
  1163                 data_size);
  1161         if (IS_ERR(data)) {
  1164         if (IS_ERR(data)) {
       
  1165             request->errno = PTR_ERR(data);
  1162             fsm->state = ec_fsm_coe_error;
  1166             fsm->state = ec_fsm_coe_error;
  1163             return;
  1167             return;
  1164         }
  1168         }
  1165 
  1169 
  1166         fsm->offset = 0;
  1170         fsm->offset = 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;
  1341     }
  1350     }
  1342 
  1351 
  1343     data = ec_slave_mbox_prepare_send(slave, datagram, 0x03,
  1352     data = ec_slave_mbox_prepare_send(slave, datagram, 0x03,
  1344             data_size);
  1353             data_size);
  1345     if (IS_ERR(data)) {
  1354     if (IS_ERR(data)) {
       
  1355         request->errno = PTR_ERR(data);
  1346         fsm->state = ec_fsm_coe_error;
  1356         fsm->state = ec_fsm_coe_error;
  1347         return;
  1357         return;
  1348     }
  1358     }
  1349 
  1359 
  1350     EC_WRITE_U16(data, 0x2 << 12); // SDO request
  1360     EC_WRITE_U16(data, 0x2 << 12); // SDO request
  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;
  1816         )
  1849         )
  1817 {
  1850 {
  1818     uint8_t *data =
  1851     uint8_t *data =
  1819         ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram, 0x03, 10);
  1852         ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram, 0x03, 10);
  1820     if (IS_ERR(data)) {
  1853     if (IS_ERR(data)) {
       
  1854         fsm->request->errno = PTR_ERR(data);
  1821         fsm->state = ec_fsm_coe_error;
  1855         fsm->state = ec_fsm_coe_error;
  1822         return;
  1856         return;
  1823     }
  1857     }
  1824 
  1858 
  1825     EC_WRITE_U16(data, 0x2 << 12); // SDO request
  1859     EC_WRITE_U16(data, 0x2 << 12); // SDO request
  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) {
  2152     }
  2211     }
  2153 
  2212 
  2154     if (mbox_prot != 0x03) { // CoE
  2213     if (mbox_prot != 0x03) { // CoE
  2155         EC_SLAVE_ERR(slave, "Received mailbox protocol 0x%02X as response.\n",
  2214         EC_SLAVE_ERR(slave, "Received mailbox protocol 0x%02X as response.\n",
  2156                 mbox_prot);
  2215                 mbox_prot);
       
  2216         request->errno = EIO;
  2157         fsm->state = ec_fsm_coe_error;
  2217         fsm->state = ec_fsm_coe_error;
  2158         return;
  2218         return;
  2159     }
  2219     }
  2160 
  2220 
  2161     if (ec_fsm_coe_check_emergency(fsm, data, rec_size)) {
  2221     if (ec_fsm_coe_check_emergency(fsm, data, rec_size)) {
  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);