master/fsm_coe.c
changeset 1313 ed15eef57d5c
parent 1310 bd4631c70392
child 1326 ef907b0b5125
equal deleted inserted replaced
1312:74853e018898 1313:ed15eef57d5c
   286                 slave->ring_position);
   286                 slave->ring_position);
   287         fsm->state = ec_fsm_coe_error;
   287         fsm->state = ec_fsm_coe_error;
   288         return;
   288         return;
   289     }
   289     }
   290 
   290 
   291     if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 8))) {
   291     data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 8);
       
   292     if (IS_ERR(data)) {
   292         fsm->state = ec_fsm_coe_error;
   293         fsm->state = ec_fsm_coe_error;
   293         return;
   294         return;
   294     }
   295     }
   295 
   296 
   296     EC_WRITE_U16(data, 0x8 << 12); // Sdo information
   297     EC_WRITE_U16(data, 0x8 << 12); // Sdo information
   426                 slave->ring_position);
   427                 slave->ring_position);
   427         ec_datagram_print_wc_error(datagram);
   428         ec_datagram_print_wc_error(datagram);
   428         return;
   429         return;
   429     }
   430     }
   430 
   431 
   431     if (!(data = ec_slave_mbox_fetch(slave, datagram,
   432     data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size);
   432 				     &mbox_prot, &rec_size))) {
   433     if (IS_ERR(data)) {
   433         fsm->state = ec_fsm_coe_error;
   434         fsm->state = ec_fsm_coe_error;
   434         return;
   435         return;
   435     }
   436     }
   436 
   437 
   437     if (mbox_prot != 0x03) { // CoE
   438     if (mbox_prot != 0x03) { // CoE
   530     }
   531     }
   531 
   532 
   532     // fetch Sdo descriptions
   533     // fetch Sdo descriptions
   533     fsm->sdo = list_entry(slave->sdo_dictionary.next, ec_sdo_t, list);
   534     fsm->sdo = list_entry(slave->sdo_dictionary.next, ec_sdo_t, list);
   534 
   535 
   535     if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 8))) {
   536     data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 8);
       
   537     if (IS_ERR(data)) {
   536         fsm->state = ec_fsm_coe_error;
   538         fsm->state = ec_fsm_coe_error;
   537         return;
   539         return;
   538     }
   540     }
   539 
   541 
   540     EC_WRITE_U16(data, 0x8 << 12); // Sdo information
   542     EC_WRITE_U16(data, 0x8 << 12); // Sdo information
   669                 " response failed on slave %u: ", slave->ring_position);
   671                 " response failed on slave %u: ", slave->ring_position);
   670         ec_datagram_print_wc_error(datagram);
   672         ec_datagram_print_wc_error(datagram);
   671         return;
   673         return;
   672     }
   674     }
   673 
   675 
   674     if (!(data = ec_slave_mbox_fetch(slave, datagram,
   676     data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size);
   675 				     &mbox_prot, &rec_size))) {
   677     if (IS_ERR(data)) {
   676         fsm->state = ec_fsm_coe_error;
   678         fsm->state = ec_fsm_coe_error;
   677         return;
   679         return;
   678     }
   680     }
   679 
   681 
   680     if (mbox_prot != 0x03) { // CoE
   682     if (mbox_prot != 0x03) { // CoE
   761 
   763 
   762     // start fetching entries
   764     // start fetching entries
   763 
   765 
   764     fsm->subindex = 0;
   766     fsm->subindex = 0;
   765 
   767 
   766     if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10))) {
   768     data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10);
       
   769     if (IS_ERR(data)) {
   767         fsm->state = ec_fsm_coe_error;
   770         fsm->state = ec_fsm_coe_error;
   768         return;
   771         return;
   769     }
   772     }
   770 
   773 
   771     EC_WRITE_U16(data, 0x8 << 12); // Sdo information
   774     EC_WRITE_U16(data, 0x8 << 12); // Sdo information
   905                 " response failed on slave %u: ", slave->ring_position);
   908                 " response failed on slave %u: ", slave->ring_position);
   906         ec_datagram_print_wc_error(datagram);
   909         ec_datagram_print_wc_error(datagram);
   907         return;
   910         return;
   908     }
   911     }
   909 
   912 
   910     if (!(data = ec_slave_mbox_fetch(slave, datagram,
   913     data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size);
   911 				     &mbox_prot, &rec_size))) {
   914     if (IS_ERR(data)) {
   912         fsm->state = ec_fsm_coe_error;
   915         fsm->state = ec_fsm_coe_error;
   913         return;
   916         return;
   914     }
   917     }
   915 
   918 
   916     if (mbox_prot != 0x03) { // CoE
   919     if (mbox_prot != 0x03) { // CoE
  1003     list_add_tail(&entry->list, &sdo->entries);
  1006     list_add_tail(&entry->list, &sdo->entries);
  1004 
  1007 
  1005     if (fsm->subindex < sdo->max_subindex) {
  1008     if (fsm->subindex < sdo->max_subindex) {
  1006         fsm->subindex++;
  1009         fsm->subindex++;
  1007 
  1010 
  1008         if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10))) {
  1011         data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10);
       
  1012         if (IS_ERR(data)) {
  1009             fsm->state = ec_fsm_coe_error;
  1013             fsm->state = ec_fsm_coe_error;
  1010             return;
  1014             return;
  1011         }
  1015         }
  1012 
  1016 
  1013         EC_WRITE_U16(data, 0x8 << 12); // Sdo information
  1017         EC_WRITE_U16(data, 0x8 << 12); // Sdo information
  1025 
  1029 
  1026     // another Sdo description to fetch?
  1030     // another Sdo description to fetch?
  1027     if (fsm->sdo->list.next != &slave->sdo_dictionary) {
  1031     if (fsm->sdo->list.next != &slave->sdo_dictionary) {
  1028         fsm->sdo = list_entry(fsm->sdo->list.next, ec_sdo_t, list);
  1032         fsm->sdo = list_entry(fsm->sdo->list.next, ec_sdo_t, list);
  1029 
  1033 
  1030         if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 8))) {
  1034         data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 8);
       
  1035         if (IS_ERR(data)) {
  1031             fsm->state = ec_fsm_coe_error;
  1036             fsm->state = ec_fsm_coe_error;
  1032             return;
  1037             return;
  1033         }
  1038         }
  1034 
  1039 
  1035         EC_WRITE_U16(data, 0x8 << 12); // Sdo information
  1040         EC_WRITE_U16(data, 0x8 << 12); // Sdo information
  1073         fsm->state = ec_fsm_coe_error;
  1078         fsm->state = ec_fsm_coe_error;
  1074         return;
  1079         return;
  1075     }
  1080     }
  1076 	
  1081 	
  1077 	if (request->data_size <= 4) { // use expedited transfer type
  1082 	if (request->data_size <= 4) { // use expedited transfer type
  1078 	    if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10))) {
  1083 	    data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10);
       
  1084         if (IS_ERR(data)) {
  1079 	        fsm->state = ec_fsm_coe_error;
  1085 	        fsm->state = ec_fsm_coe_error;
  1080 	        return;
  1086 	        return;
  1081 	    }
  1087 	    }
  1082 
  1088 
  1083 	    size = 4 - request->data_size;
  1089 	    size = 4 - request->data_size;
  1100 	        EC_ERR("Sdo fragmenting not supported yet!\n");
  1106 	        EC_ERR("Sdo fragmenting not supported yet!\n");
  1101 	        fsm->state = ec_fsm_coe_error;
  1107 	        fsm->state = ec_fsm_coe_error;
  1102 	        return;
  1108 	        return;
  1103 	    }
  1109 	    }
  1104 
  1110 
  1105 	    if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03,
  1111 	    data = ec_slave_mbox_prepare_send(slave, datagram, 0x03,
  1106 	                                            request->data_size + 10))) {
  1112                 request->data_size + 10);
       
  1113         if (IS_ERR(data)) {
  1107 	        fsm->state = ec_fsm_coe_error;
  1114 	        fsm->state = ec_fsm_coe_error;
  1108 	        return;
  1115 	        return;
  1109 	    }
  1116 	    }
  1110 
  1117 
  1111 	    EC_WRITE_U16(data, 0x2 << 12); // Sdo request
  1118 	    EC_WRITE_U16(data, 0x2 << 12); // Sdo request
  1261                 slave->ring_position);
  1268                 slave->ring_position);
  1262         ec_datagram_print_wc_error(datagram);
  1269         ec_datagram_print_wc_error(datagram);
  1263         return;
  1270         return;
  1264     }
  1271     }
  1265 
  1272 
  1266     if (!(data = ec_slave_mbox_fetch(slave, datagram,
  1273     data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size);
  1267 				     &mbox_prot, &rec_size))) {
  1274     if (IS_ERR(data)) {
  1268         fsm->state = ec_fsm_coe_error;
  1275         fsm->state = ec_fsm_coe_error;
  1269         return;
  1276         return;
  1270     }
  1277     }
  1271 
  1278 
  1272     if (mbox_prot != 0x03) { // CoE
  1279     if (mbox_prot != 0x03) { // CoE
  1352         EC_ERR("Slave %u does not support CoE!\n", slave->ring_position);
  1359         EC_ERR("Slave %u does not support CoE!\n", slave->ring_position);
  1353         fsm->state = ec_fsm_coe_error;
  1360         fsm->state = ec_fsm_coe_error;
  1354         return;
  1361         return;
  1355     }
  1362     }
  1356 
  1363 
  1357     if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10))) {
  1364     data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10);
       
  1365     if (IS_ERR(data)) {
  1358         fsm->state = ec_fsm_coe_error;
  1366         fsm->state = ec_fsm_coe_error;
  1359         return;
  1367         return;
  1360     }
  1368     }
  1361 
  1369 
  1362     EC_WRITE_U16(data, 0x2 << 12); // Sdo request
  1370     EC_WRITE_U16(data, 0x2 << 12); // Sdo request
  1512                 slave->ring_position);
  1520                 slave->ring_position);
  1513         ec_datagram_print_wc_error(datagram);
  1521         ec_datagram_print_wc_error(datagram);
  1514         return;
  1522         return;
  1515     }
  1523     }
  1516 
  1524 
  1517     if (!(data = ec_slave_mbox_fetch(slave, datagram,
  1525     data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size);
  1518 				     &mbox_prot, &rec_size))) {
  1526     if (IS_ERR(data)) {
  1519         fsm->state = ec_fsm_coe_error;
  1527         fsm->state = ec_fsm_coe_error;
  1520         return;
  1528         return;
  1521     }
  1529     }
  1522 
  1530 
  1523     if (master->debug_level) {
  1531     if (master->debug_level) {
  1656 
  1664 
  1657         if (data_size < complete_size) {
  1665         if (data_size < complete_size) {
  1658             EC_WARN("Sdo data incomplete (%u / %u).\n",
  1666             EC_WARN("Sdo data incomplete (%u / %u).\n",
  1659                     data_size, complete_size);
  1667                     data_size, complete_size);
  1660 
  1668 
  1661             if (!(data = ec_slave_mbox_prepare_send(slave, datagram,
  1669             data = ec_slave_mbox_prepare_send(slave, datagram,
  1662                                                     0x03, 3))) {
  1670                     0x03, 3);
       
  1671             if (IS_ERR(data)) {
  1663                 fsm->state = ec_fsm_coe_error;
  1672                 fsm->state = ec_fsm_coe_error;
  1664                 return;
  1673                 return;
  1665             }
  1674             }
  1666 
  1675 
  1667             EC_WRITE_U16(data, 0x2 << 12); // Sdo request
  1676             EC_WRITE_U16(data, 0x2 << 12); // Sdo request
  1812                 " response failed on slave %u: ", slave->ring_position);
  1821                 " response failed on slave %u: ", slave->ring_position);
  1813         ec_datagram_print_wc_error(datagram);
  1822         ec_datagram_print_wc_error(datagram);
  1814         return;
  1823         return;
  1815     }
  1824     }
  1816 
  1825 
  1817     if (!(data = ec_slave_mbox_fetch(slave, datagram,
  1826     data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size);
  1818 				     &mbox_prot, &rec_size))) {
  1827     if (IS_ERR(data)) {
  1819         fsm->state = ec_fsm_coe_error;
  1828         fsm->state = ec_fsm_coe_error;
  1820         return;
  1829         return;
  1821     }
  1830     }
  1822 
  1831 
  1823     if (master->debug_level) {
  1832     if (master->debug_level) {
  1884     request->data_size += data_size;
  1893     request->data_size += data_size;
  1885 
  1894 
  1886     if (!last_segment) {
  1895     if (!last_segment) {
  1887         fsm->toggle = !fsm->toggle;
  1896         fsm->toggle = !fsm->toggle;
  1888 
  1897 
  1889         if (!(data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 3))) {
  1898         data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 3);
       
  1899         if (IS_ERR(data)) {
  1890             fsm->state = ec_fsm_coe_error;
  1900             fsm->state = ec_fsm_coe_error;
  1891             return;
  1901             return;
  1892         }
  1902         }
  1893 
  1903 
  1894         EC_WRITE_U16(data, 0x2 << 12); // Sdo request
  1904         EC_WRITE_U16(data, 0x2 << 12); // Sdo request