|
54 | 54 | #include "hm2_eth_net_evl.h" |
55 | 55 | #endif |
56 | 56 |
|
| 57 | +#define RECV_TIMEOUT_NON_RT_NS (200 * 1000 * 1000) //200ms for initialisation / non-realtime part |
| 58 | + |
57 | 59 | struct kvlist { |
58 | 60 | struct rtapi_list_head list; |
59 | 61 | char key[16+1]; |
@@ -462,12 +464,10 @@ static const char *hm2_8cSS_pin_names[] = { |
462 | 464 |
|
463 | 465 | }; |
464 | 466 |
|
465 | | -#define READ_PCK_DELAY_NS 10000 |
466 | | - |
467 | 467 | static hm2_eth_t boards[MAX_ETH_BOARDS]; |
468 | 468 |
|
469 | | -static int eth_socket_send(hm2_eth_t *board, const void *buffer, int len, int flags); |
470 | | -static int eth_socket_recv(hm2_eth_t *board, void *buffer, int len, int flags); |
| 469 | +static int eth_socket_send(hm2_eth_t *board, const void *buffer, int len); |
| 470 | +static int eth_socket_recv(hm2_eth_t *board, void *buffer, int len, int recv_timeout_ns); |
471 | 471 |
|
472 | 472 | /// firewall functions |
473 | 473 |
|
@@ -799,13 +799,11 @@ int fetch_hwaddr(hm2_eth_t *board, unsigned char buf[6]) { |
799 | 799 | lbp16_cmd_addr packet; |
800 | 800 | unsigned char response[6]; |
801 | 801 | LBP16_INIT_PACKET4(packet, 0x4983, 0x0002); |
802 | | - int res = eth_socket_send(board, &packet, sizeof(packet), 0); |
| 802 | + int res = eth_socket_send(board, &packet, sizeof(packet)); |
803 | 803 | if(res < 0) return -errno; |
804 | 804 |
|
805 | 805 | int i=0; |
806 | | - do { |
807 | | - res = eth_socket_recv(board, &response, sizeof(response), 0); |
808 | | - } while(++i < 10 && res < 0 && errno == EAGAIN); |
| 806 | + res = eth_socket_recv(board, &response, sizeof(response), RECV_TIMEOUT_NON_RT_NS); |
809 | 807 | if(res < 0) return -errno; |
810 | 808 |
|
811 | 809 | // eeprom order is backwards from arp AF_LOCAL order |
@@ -857,21 +855,12 @@ static inline int close_board(hm2_eth_t *board){ |
857 | 855 | return board->close_board(board); |
858 | 856 | } |
859 | 857 |
|
860 | | -static inline int eth_socket_send(hm2_eth_t *board, const void *buffer, int len, int flags){ |
861 | | - return board->eth_socket_send(board, buffer, len, flags); |
862 | | -} |
863 | | - |
864 | | -static inline int eth_socket_recv(hm2_eth_t *board, void *buffer, int len, int flags){ |
865 | | - return board->eth_socket_recv(board, buffer, len, flags); |
| 858 | +static inline int eth_socket_send(hm2_eth_t *board, const void *buffer, int len){ |
| 859 | + return board->eth_socket_send(board, buffer, len); |
866 | 860 | } |
867 | 861 |
|
868 | | -int eth_socket_recv_loop(hm2_eth_t *board, void *buffer, int len, int flags, long timeout) { |
869 | | - long long end = rtapi_get_time() + timeout; |
870 | | - int result; |
871 | | - do { |
872 | | - result = eth_socket_recv(board, buffer, len, flags); |
873 | | - } while(result < 0 && rtapi_get_time() < end); |
874 | | - return result; |
| 862 | +static inline int eth_socket_recv(hm2_eth_t *board, void *buffer, int len, int recv_timeout_ns){ |
| 863 | + return board->eth_socket_recv(board, buffer, len, recv_timeout_ns); |
875 | 864 | } |
876 | 865 |
|
877 | 866 | /// hm2_eth io functions |
@@ -899,19 +888,15 @@ static int hm2_eth_read(hm2_lowlevel_io_t *this, rtapi_u32 addr, void *buffer, i |
899 | 888 |
|
900 | 889 | LBP16_INIT_PACKET4(read_packet, CMD_READ_HOSTMOT2_ADDR32_INCR(size/4), addr & 0xFFFF); |
901 | 890 |
|
902 | | - send = eth_socket_send(board, (void*) &read_packet, sizeof(read_packet), 0); |
| 891 | + send = eth_socket_send(board, (void*) &read_packet, sizeof(read_packet)); |
903 | 892 | if(send < 0) |
904 | 893 | LL_PRINT("ERROR: sending packet: %s\n", strerror(errno)); |
905 | 894 | LL_PRINT_IF(debug, "read(%d) : PACKET SENT [CMD:%02X%02X | ADDR: %02X%02X | SIZE: %d]\n", board->read_cnt, read_packet.cmd_hi, read_packet.cmd_lo, |
906 | 895 | read_packet.addr_lo, read_packet.addr_hi, size); |
| 896 | + |
907 | 897 | t1 = rtapi_get_time(); |
908 | | - do { |
909 | | - errno = 0; |
910 | | - recv = eth_socket_recv(board, (void*) &tmp_buffer, size, 0); |
911 | | - if(recv < 0) rtapi_delay(READ_PCK_DELAY_NS); |
912 | | - t2 = rtapi_get_time(); |
913 | | - i++; |
914 | | - } while ((recv < 0) && ((t2 - t1) < 200*1000*1000)); |
| 898 | + recv = eth_socket_recv(board, (void*) &tmp_buffer, size, RECV_TIMEOUT_NON_RT_NS); |
| 899 | + t2 = rtapi_get_time(); |
915 | 900 |
|
916 | 901 | if (recv == 4) { |
917 | 902 | LL_PRINT_IF(debug, "read(%d) : PACKET RECV [DATA: %08X | SIZE: %d | TRIES: %d | TIME: %llu]\n", board->read_cnt, *tmp_buffer, recv, i, t2 - t1); |
@@ -976,7 +961,7 @@ static int hm2_eth_send_queued_reads(hm2_lowlevel_io_t *this) { |
976 | 961 | board->queue_reads_count++; |
977 | 962 | board->queue_buff_size += sizeof(board->confirm_rw_cnt); |
978 | 963 |
|
979 | | - send = eth_socket_send(board, (void*) &board->read_packet, board->read_packet_ptr - board->read_packet, 0); |
| 964 | + send = eth_socket_send(board, (void*) &board->read_packet, board->read_packet_ptr - board->read_packet); |
980 | 965 | if(send < 0) { |
981 | 966 | LL_PRINT("ERROR: sending packet: %s\n", strerror(errno)); |
982 | 967 | return 0; |
@@ -1037,21 +1022,19 @@ static int hm2_eth_receive_queued_reads(hm2_lowlevel_io_t *this) { |
1037 | 1022 |
|
1038 | 1023 | if(!board->hal) this->read_time = t1; |
1039 | 1024 | unsigned long long read_deadline = this->read_time + read_timeout; |
1040 | | - do { |
| 1025 | + |
1041 | 1026 | do_recv_packet: |
1042 | | - errno = 0; |
1043 | | - recv = eth_socket_recv(board, (void*) &tmp_buffer, board->queue_buff_size, MSG_DONTWAIT); |
1044 | | - if(recv < 0) rtapi_delay(READ_PCK_DELAY_NS); |
1045 | | - t2 = rtapi_get_time(); |
1046 | | - i++; |
1047 | | - } while (recv != board->queue_buff_size && t2 < read_deadline); |
| 1027 | + recv = eth_socket_recv(board, (void*) &tmp_buffer, board->queue_buff_size, read_timeout); |
| 1028 | + t2 = rtapi_get_time(); |
| 1029 | + |
1048 | 1030 | if(recv != board->queue_buff_size) { |
| 1031 | + LL_PRINT("receive_queued_reads: error (%m) after %llins timeout=%lins\n", t2 - t1, read_timeout); |
1049 | 1032 | hm2_eth_reset_queued_reads(board); |
1050 | 1033 | if(!record_soft_error(board)) return 0; |
1051 | 1034 | return -EAGAIN; |
1052 | 1035 | } |
1053 | 1036 |
|
1054 | | - LL_PRINT_IF(debug, "enqueue_read(%d) : PACKET RECV [SIZE: %d | TRIES: %d | TIME: %llu]\n", board->read_cnt, recv, i, t2 - t1); |
| 1037 | + LL_PRINT_IF(debug, "receive_queued_reads(%d) : PACKET RECV [SIZE: %d | TIME: %llu]\n", board->read_cnt, recv, t2 - t1); |
1055 | 1038 |
|
1056 | 1039 | for (i = 0; i < board->queue_reads_count; i++) { |
1057 | 1040 | memcpy(board->queue_reads[i].buffer, &tmp_buffer[board->queue_reads[i].from], board->queue_reads[i].size); |
@@ -1082,7 +1065,7 @@ static int hm2_eth_reset(hm2_lowlevel_io_t *this) { |
1082 | 1065 | // Make the watchdog timer bite in 1ns from now |
1083 | 1066 | lbp16_cmd_addr_data32 bite_packet; |
1084 | 1067 | LBP16_INIT_PACKET8(bite_packet, CMD_WRITE_HOSTMOT2_ADDR32_INCR(1), HM2_ADDR_WATCHDOG, 0x0001); |
1085 | | - int ret = eth_socket_send(board, (void*) &bite_packet, sizeof(bite_packet), 0); |
| 1068 | + int ret = eth_socket_send(board, (void*) &bite_packet, sizeof(bite_packet)); |
1086 | 1069 | if(ret < 0) perror("eth_socket_send(bite_packet)"); |
1087 | 1070 | return ret < 0 ? -errno : 0; |
1088 | 1071 | } |
@@ -1133,7 +1116,7 @@ static int hm2_eth_write(hm2_lowlevel_io_t *this, rtapi_u32 addr, const void *bu |
1133 | 1116 | memcpy(packet.tmp_buffer, buffer, size); |
1134 | 1117 | LBP16_INIT_PACKET4(packet.wr_packet, CMD_WRITE_HOSTMOT2_ADDR32_INCR(size/4), addr & 0xFFFF); |
1135 | 1118 |
|
1136 | | - send = eth_socket_send(board, (void*) &packet, sizeof(lbp16_cmd_addr) + size, 0); |
| 1119 | + send = eth_socket_send(board, (void*) &packet, sizeof(lbp16_cmd_addr) + size); |
1137 | 1120 | if(send < 0) |
1138 | 1121 | LL_PRINT("ERROR: sending packet: %s\n", strerror(errno)); |
1139 | 1122 | LL_PRINT_IF(debug, "write(%d): PACKET SENT [CMD:%02X%02X | ADDR: %02X%02X | SIZE: %d]\n", board->write_cnt, packet.wr_packet.cmd_hi, packet.wr_packet.cmd_lo, |
@@ -1165,7 +1148,7 @@ static int hm2_eth_send_queued_writes(hm2_lowlevel_io_t *this) { |
1165 | 1148 | board->has_written_cnt = 1; |
1166 | 1149 |
|
1167 | 1150 | t0 = rtapi_get_time(); |
1168 | | - send = eth_socket_send(board, (void*) &board->write_packet, board->write_packet_ptr - board->write_packet, 0); |
| 1151 | + send = eth_socket_send(board, (void*) &board->write_packet, board->write_packet_ptr - board->write_packet); |
1169 | 1152 | if(send < 0) { |
1170 | 1153 | LL_PRINT("ERROR: sending packet: %s\n", strerror(errno)); |
1171 | 1154 | } |
@@ -1220,13 +1203,12 @@ static int hm2_eth_probe(hm2_eth_t *board) { |
1220 | 1203 | char llio_name[16] = {}; |
1221 | 1204 |
|
1222 | 1205 | LBP16_INIT_PACKET4(read_packet, CMD_READ_BOARD_INFO_ADDR16_INCR(16/2), 0); |
1223 | | - send = eth_socket_send(board, (void*) &read_packet, sizeof(read_packet), 0); |
| 1206 | + send = eth_socket_send(board, (void*) &read_packet, sizeof(read_packet)); |
1224 | 1207 | if(send < 0) { |
1225 | 1208 | LL_PRINT("ERROR: sending packet: %s\n", strerror(errno)); |
1226 | 1209 | return -errno; |
1227 | 1210 | } |
1228 | | - recv = eth_socket_recv_loop(board, (void*) &board_name, 16, 0, |
1229 | | - 200 * 1000 * 1000); |
| 1211 | + recv = eth_socket_recv(board, (void*) &board_name, 16, RECV_TIMEOUT_NON_RT_NS); |
1230 | 1212 | if(recv < 0) { |
1231 | 1213 | LL_PRINT("ERROR: receiving packet: %s\n", strerror(errno)); |
1232 | 1214 | return -errno; |
|
0 commit comments