master/fsm_coe.c
changeset 1495 88f242b722ce
parent 1494 6c632c8f45cc
child 1498 58532f81a456
equal deleted inserted replaced
1494:6c632c8f45cc 1495:88f242b722ce
  1103 	    memcpy(data + 6, request->data, request->data_size);
  1103 	    memcpy(data + 6, request->data, request->data_size);
  1104         memset(data + 6 + request->data_size, 0x00, 4 - request->data_size);
  1104         memset(data + 6 + request->data_size, 0x00, 4 - request->data_size);
  1105 
  1105 
  1106         if (slave->master->debug_level) {
  1106         if (slave->master->debug_level) {
  1107             EC_DBG("Expedited download request:\n");
  1107             EC_DBG("Expedited download request:\n");
  1108 			ec_print_data(data, 10 + request->data_size);
  1108             ec_print_data(data, 10);
  1109         }
  1109         }
  1110 	}
  1110 	}
  1111     else { // request->data_size > 4, use normal transfer type
  1111     else { // request->data_size > 4, use normal transfer type
  1112 	    if (slave->configured_rx_mailbox_size < 6 + 10 + request->data_size) {
  1112 	    if (slave->configured_rx_mailbox_size < 6 + 10 + request->data_size) {
  1113 	        EC_ERR("SDO fragmenting not supported yet!\n");
  1113 	        EC_ERR("SDO fragmenting not supported yet!\n");
  1660             if (master->debug_level)
  1660             if (master->debug_level)
  1661                 EC_DBG("SDO data incomplete (%u / %u). Segmenting...\n",
  1661                 EC_DBG("SDO data incomplete (%u / %u). Segmenting...\n",
  1662                         data_size, fsm->complete_size);
  1662                         data_size, fsm->complete_size);
  1663 
  1663 
  1664             data = ec_slave_mbox_prepare_send(slave, datagram,
  1664             data = ec_slave_mbox_prepare_send(slave, datagram,
  1665 					0x03, 10);
  1665                     0x03, 3);
  1666             if (IS_ERR(data)) {
  1666             if (IS_ERR(data)) {
  1667                 fsm->state = ec_fsm_coe_error;
  1667                 fsm->state = ec_fsm_coe_error;
  1668                 return;
  1668                 return;
  1669             }
  1669             }
  1670 
  1670 
  1672             EC_WRITE_U8 (data + 2, (fsm->toggle << 4 // toggle
  1672             EC_WRITE_U8 (data + 2, (fsm->toggle << 4 // toggle
  1673                                     | 0x3 << 5)); // upload segment request
  1673                                     | 0x3 << 5)); // upload segment request
  1674 
  1674 
  1675             if (master->debug_level) {
  1675             if (master->debug_level) {
  1676                 EC_DBG("Upload segment request:\n");
  1676                 EC_DBG("Upload segment request:\n");
  1677 				ec_print_data(data, 10);
  1677                 ec_print_data(data, 3);
  1678             }
  1678             }
  1679 
  1679 
  1680             fsm->retries = EC_FSM_RETRIES;
  1680             fsm->retries = EC_FSM_RETRIES;
  1681             fsm->state = ec_fsm_coe_up_seg_request;
  1681             fsm->state = ec_fsm_coe_up_seg_request;
  1682             return;
  1682             return;
  1874     }
  1874     }
  1875 
  1875 
  1876     last_segment = EC_READ_U8(data + 2) & 0x01;
  1876     last_segment = EC_READ_U8(data + 2) & 0x01;
  1877     seg_size = (EC_READ_U8(data + 2) & 0xE) >> 1;
  1877     seg_size = (EC_READ_U8(data + 2) & 0xE) >> 1;
  1878     if (rec_size > 10) {
  1878     if (rec_size > 10) {
  1879 		data_size = rec_size - 3;	// Header of segment upload is smaller then normal upload
  1879         data_size = rec_size - 10;
  1880     } else { // == 10
  1880     } else { // == 10
  1881         /* seg_size contains the number of trailing bytes to ignore. */
  1881         /* seg_size contains the number of trailing bytes to ignore. */
  1882         data_size = rec_size - seg_size;
  1882         data_size = rec_size - seg_size;
  1883     }
  1883     }
  1884 
  1884 
  1888                request->index, request->subindex, slave->ring_position);
  1888                request->index, request->subindex, slave->ring_position);
  1889         fsm->state = ec_fsm_coe_error;
  1889         fsm->state = ec_fsm_coe_error;
  1890         return;
  1890         return;
  1891     }
  1891     }
  1892 
  1892 
  1893 	memcpy(request->data + request->data_size, data + 3, data_size);
  1893     memcpy(request->data + request->data_size, data + 10, data_size);
  1894     request->data_size += data_size;
  1894     request->data_size += data_size;
  1895 
  1895 
  1896     if (!last_segment) {
  1896     if (!last_segment) {
  1897         fsm->toggle = !fsm->toggle;
  1897         fsm->toggle = !fsm->toggle;
  1898 
  1898 
  1899 		data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 10);
  1899         data = ec_slave_mbox_prepare_send(slave, datagram, 0x03, 3);
  1900         if (IS_ERR(data)) {
  1900         if (IS_ERR(data)) {
  1901             fsm->state = ec_fsm_coe_error;
  1901             fsm->state = ec_fsm_coe_error;
  1902             return;
  1902             return;
  1903         }
  1903         }
  1904 
  1904 
  1906         EC_WRITE_U8 (data + 2, (fsm->toggle << 4 // toggle
  1906         EC_WRITE_U8 (data + 2, (fsm->toggle << 4 // toggle
  1907                                 | 0x3 << 5)); // upload segment request
  1907                                 | 0x3 << 5)); // upload segment request
  1908 
  1908 
  1909         if (master->debug_level) {
  1909         if (master->debug_level) {
  1910             EC_DBG("Upload segment request:\n");
  1910             EC_DBG("Upload segment request:\n");
  1911 			ec_print_data(data, 10);
  1911             ec_print_data(data, 3);
  1912         }
  1912         }
  1913 
  1913 
  1914         fsm->retries = EC_FSM_RETRIES;
  1914         fsm->retries = EC_FSM_RETRIES;
  1915         fsm->state = ec_fsm_coe_up_seg_request;
  1915         fsm->state = ec_fsm_coe_up_seg_request;
  1916         return;
  1916         return;