equal
deleted
inserted
replaced
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; |