ubuntu, eth0在高速发送接收一段时间(一般5分钟之内)后会挂掉,ip及route都在,就是不能发送接收,ping也不通,必须down、up一下。
有时出现 NETDEV WATCHDOG timeout,有时什么错误也不提示。
不知道有解决方案了吗?
ubuntu, eth0在高速发送接收一段时间(一般5分钟之内)后会挂掉,ip及route都在,就是不能发送接收,ping也不通,必须down、up一下。
有时出现 NETDEV WATCHDOG timeout,有时什么错误也不提示。
不知道有解决方案了吗?
下面两位也发现了这个问题:
bbs.t-firefly.com/forum.php?mod=viewthread&tid=1975
github.com/rockchip-linux/kernel/issues/27
测试程序 Server
/* net-test-server.c
#define TEST_TCP_PORT 5495
#define DATA_SIZE_MAX (1024*1024)
#ifndef _WIN32
typedef int SOCKET;
#endif
#ifdef _MSC_VER
#pragma comment (lib, “Ws2_32.lib”)
#ifndef int64_t
typedef __int64 int64_t;
#endif
#ifndef int32_t
typedef int int32_t;
#endif
#ifndef uint8_t
typedef unsigned char uint8_t;
#endif
#endif //_MSC_VER
static SOCKET g_listen_sock, g_sock;
static void *g_pBuf = NULL;
static void set_keepalive(SOCKET sock)
{
const int one = 1;
#ifdef _WIN32
struct tcp_keepalive alive_in, alive_out;
unsigned long unused = 0;
alive_in.keepalivetime = 1000; // 1s
alive_in.keepaliveinterval = 1000; //1s
alive_in.onoff = TRUE;
WSAIoctl(sock, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in),
&alive_out, sizeof(alive_out), &unused, NULL, NULL);
#else
int keepalive = 1, keepidle = 2, keepinterval = 1, keepcount = 3;
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive));
setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle));
setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval));
setsockopt(sock, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount));
#endif
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&one, sizeof(one));
}
static int read_sock(SOCKET sock, char *buff, int bufflen, int flags)
{
int n;
while (bufflen > 0)
{
n = recv(sock, buff, bufflen, flags);
if (n > 0)
{
buff += n;
bufflen -= n;
}
else if (n == 0) return(0);
#ifdef _WIN32
else if (errno != WSAEWOULDBLOCK)
#else
else if (errno != EAGAIN && errno != EWOULDBLOCK)
#endif
{
return(0);
}
}
return(1);
}
int init_application()
{
int one = 1;
struct sockaddr_in addr;
#ifdef _WIN32
WORD wVersionRequested = MAKEWORD(2, 0);
WSADATA wsaData;
if (WSAStartup(wVersionRequested, &wsaData) != 0) return(0);
srand(GetTickCount());
#else
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
srand(ts.tv_nsec / 1000);
#endif
g_pBuf = malloc(DATA_SIZE_MAX);
if(!g_pBuf) return(0);
memset(g_pBuf, 0, DATA_SIZE_MAX);
g_listen_sock = socket(AF_INET, SOCK_STREAM, 0);
if (g_listen_sock == -1) return(0);
/* re-use */
setsockopt(g_listen_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one));
addr.sin_family = AF_INET;
addr.sin_port = htons(TEST_TCP_PORT);
addr.sin_addr.s_addr = INADDR_ANY;
if(bind(g_listen_sock, (struct sockaddr *)&addr, sizeof(addr))) return(0);
if(listen(g_listen_sock, 5)) return(0);
return(1);
}
int main()
{
unsigned char msg;
const int one = 1;
if(!init_application())
{
printf("init app error\n");
return(1);
}
printf("listen ...\n");
g_sock = accept(g_listen_sock, NULL, NULL);
if(g_sock == -1)
{
printf("accept fail\n");
return(1);
}
/* no delay */
setsockopt(g_sock, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one));
/* keep alive */
set_keepalive(g_sock);
printf("transceiving data ...\n");
while(1)
{
int32_t size;
size = (int32_t)((int64_t)rand() * DATA_SIZE_MAX / RAND_MAX);
if(size > DATA_SIZE_MAX) continue;
/* receive msg */
if(!read_sock(g_sock, (char*)&msg, sizeof(msg), 0)) break;
/* send data size */
if(send(g_sock, (char*)&size, sizeof(size), 0) != sizeof(size)) break;
/* send data */
if(send(g_sock, (char*)g_pBuf, size, 0) != size) break;
}
printf("connection lost\n");
return(1);
}
测试程序 Client
/* net-test-client.c
#define TEST_TCP_PORT 5495
#define DATA_SIZE_MAX (1024*1024)
#ifndef _WIN32
typedef int SOCKET;
#endif
#ifdef _MSC_VER
#pragma comment (lib, “Ws2_32.lib”)
#ifndef int32_t
typedef int int32_t;
#endif
#ifndef uint8_t
typedef unsigned char uint8_t;
#endif
#endif
static SOCKET g_sock;
static void *g_pBuf = NULL;
static void set_keepalive(SOCKET sock)
{
const int one = 1;
#ifdef _WIN32
struct tcp_keepalive alive_in, alive_out;
unsigned long unused = 0;
alive_in.keepalivetime = 1000; // 1s
alive_in.keepaliveinterval = 1000; //1s
alive_in.onoff = TRUE;
WSAIoctl(sock, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in),
&alive_out, sizeof(alive_out), &unused, NULL, NULL);
#else
int keepalive = 1, keepidle = 2, keepinterval = 1, keepcount = 3;
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive));
setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle));
setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval));
setsockopt(sock, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount));
#endif
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&one, sizeof(one));
}
static int read_sock(SOCKET sock, char *buff, int bufflen, int flags)
{
int n;
while (bufflen > 0)
{
n = recv(sock, buff, bufflen, flags);
if (n > 0)
{
buff += n;
bufflen -= n;
}
else if (n == 0) return(0);
#ifdef _WIN32
else if (errno != WSAEWOULDBLOCK)
#else
else if (errno != EAGAIN && errno != EWOULDBLOCK)
#endif
{
return(0);
}
}
return(1);
}
static int init_application()
{
const int one = 1;
#ifdef _WIN32
WORD wVersionRequested = MAKEWORD(2, 0);
WSADATA wsaData;
if (WSAStartup(wVersionRequested, &wsaData) != 0) return(0);
#endif
g_pBuf = malloc(DATA_SIZE_MAX);
if(!g_pBuf) return(0);
g_sock = socket(AF_INET, SOCK_STREAM, 0);
if (g_sock == -1) return(0);
/* no delay */
setsockopt(g_sock, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one));
/* keepalive */
set_keepalive(g_sock);
return(1);
}
int main(int argc, char *argv)
{
struct sockaddr_in addr;
if(argc != 2)
{
printf("usage: %s <server>\n", argv[0]);
return(1);
}
if(!init_application())
{
printf("init app error\n");
return(1);
}
printf("connecting ...");
addr.sin_family = AF_INET;
addr.sin_port = htons(TEST_TCP_PORT);
addr.sin_addr.s_addr = inet_addr(argv[1]);
// Connecting
if(connect(g_sock, (struct sockaddr *)&addr, sizeof(addr)) != 0)
{
printf("fail\n");
return(1);
}
else printf("OK\n");
printf("transceiving data ...\n");
while(1)
{
uint8_t msg = 1;
int32_t size;
/* send msg */
if(send(g_sock, (char*)&msg, sizeof(msg), 0) != sizeof(msg)) break;
/* receive data size */
if(!read_sock(g_sock, (char*)&size, sizeof(size), 0)) break;
if(size > DATA_SIZE_MAX)
{
printf("buffer overflow\n");
return(1);
}
/* receive data */
if(!read_sock(g_sock, (char*)g_pBuf, size, 0)) break;
}
printf("connection lost\n");
return(1);
}
rk3399 运行Server 或者Client都会让网络挂掉,1分钟之内就会挂。
github.com/rockchip-linux/kernel/issues/27
这个人说VDD_LOG电压偏低,把电压调上去就好了。今天测了一下VDD_LOG电压,还真是偏低,手册上推荐0.9V,实测只有0.78V。
果然是电压问题,把电压调上去后OK了。为这破问题,折腾了3个星期。。。
你好!我也遇到相同相同的问题,请问怎么把电压调上去?
bobo123 发表于 2018-1-30 10:14
你好!我也遇到相同相同的问题,请问怎么把电压调上去?
rk3399-firefly-linux.dts中找到“vdd_log”,修改“rockchip,pwm_voltage”值。由于外围的PWM相关电路的原因,这个值和实际电压不符合,把它设置为1000000就可以了。
luxinchun 发表于 2018-3-1 22:50
rk3399-firefly-linux.dts中找到“vdd_log”,修改“rockchip,pwm_voltage”值。由于外围的PWM相关电路的 …
这个文件是在哪个文件夹下面呀,谢谢啦
luxinchun 发表于 2018-3-1 22:50
rk3399-firefly-linux.dts中找到“vdd_log”,修改“rockchip,pwm_voltage”值。由于外围的PWM相关电路的 …
这个值它本来就是1000000呀,那现在怎么办呀
luxinchun 发表于 2017-12-28 15:25
github.com/rockchip-linux/kernel/issues/27
这个人说VDD_LOG电压偏低,把电压调上去就好了。今天测了一 …
这个vdd_log电压是怎么测得,在3399上我怎么没有找到这么一个口
tswsblack 发表于 2018-3-19 08:44
这个vdd_log电压是怎么测得,在3399上我怎么没有找到这么一个口
打开 Firefly-RK3399_V10_POS.pdf 这个文件,搜索 L8,L8的下面的那个焊点就是VDD_LOG。
tswsblack 发表于 2018-3-19 08:24
这个文件是在哪个文件夹下面呀,谢谢啦
在 arch/arm64/boot/dts/rockchip/下面
您好,请问这个问题解决了吗?我重新编译了内核将电压修改为1.0,同时调低了最低电压为0.7。但还是出现了大流量下网卡断流问题。请问我应该怎样排除错误呢?为了这个问题折腾快半个月了,希望能够得到大家的帮助。万分感谢。
luxinchun 发表于 2017-12-28 22:07
果然是电压问题,把电压调上去后OK了。为这破问题,折腾了3个星期。。。
电压1.1V了,问题还是没有解决,好像是gmac rx_delay和tx_delay的问题,需要找rk官方拿补丁
mexbochen 发表于 2021-3-20 14:37
电压1.1V了,问题还是没有解决,好像是gmac rx_delay和tx_delay的问题,需要找rk官方拿补丁
但是昨天找rk拿了补丁,测出来rx_delay和tx_delay都是0x00,这问题真的是。。。。
我现在也遇到这个问题,使用3399PRO网口稳定,使用3399千兆时,上行网速底,连续测试会崩溃,测量REG_OUT为1V,谁能帮助一下,没搞过系统