diff --git a/html/main.js b/html/main.js index 9c48581..6c05550 100644 --- a/html/main.js +++ b/html/main.js @@ -2,7 +2,7 @@ var txG = new BigInt64Array(10); var txB = new BigInt64Array(10); var rxG = new BigInt64Array(10); var rxB = new BigInt64Array(10); -const linkS = ["Disabled", "No Link", "100M", "1000M", "500M", "10G", "2.5G", "5G"]; +const linkS = ["Disabled", "Down", "10M", "100M", "1000M", "500M", "10G", "2.5G", "5G"]; var pState = new Int8Array(10); var pIsSFP = new Int8Array(10); var pAdvertised = new Int8Array(10); diff --git a/httpd/page_impl.c b/httpd/page_impl.c index f8d810b..d89b26b 100644 --- a/httpd/page_impl.c +++ b/httpd/page_impl.c @@ -626,13 +626,25 @@ void send_status(void) } slen += strtox(outbuf + slen, ",\"link\":"); - - if (i < 8) - reg_read_m(RTL837X_REG_LINKS); + + uint8_t b = 0; + // Determine link state + reg_read_m(RTL837X_REG_LINKS_STS); + if(!((sfr_data[(i / 8) + 1] >> (i % 8 ) & 1))) + { + b = 0; //link down + } else - reg_read_m(RTL837X_REG_LINKS_89); - uint8_t b = sfr_data[3 - ((i & 7) >> 1)]; - b = (i & 1) ? b >> 4 : b & 0xf; + { + //Determine link speed + if (i < 8) + reg_read_m(RTL837X_REG_LINKS); + else + reg_read_m(RTL837X_REG_LINKS_89); + + b = sfr_data[3 - ((i & 7) >> 1)]; + b = ((i & 1) ? b >> 4 : b & 0xf) + 1; + } char_to_html('0' + b); STAT_GET(STAT_COUNTER_TX_PKTS, i); diff --git a/rtl837x_port.c b/rtl837x_port.c index 322e60d..4e12a6d 100644 --- a/rtl837x_port.c +++ b/rtl837x_port.c @@ -369,15 +369,28 @@ void port_stats_print(void) __banked } } - if (i < 8) - reg_read_m(RTL837X_REG_LINKS); + uint8_t b = 0; + + // Determine link state + reg_read_m(RTL837X_REG_LINKS_STS); + if(!((sfr_data[(i / 8) + 1] >> ( i % 8 ) & 1))) + { + b = 99; + } else - reg_read_m(RTL837X_REG_LINKS_89); - uint8_t b = sfr_data[3 - ((i & 7) >> 1)]; - b = (i & 1) ? b >> 4 : b & 0xf; + { + if (i < 8) + reg_read_m(RTL837X_REG_LINKS); + else + reg_read_m(RTL837X_REG_LINKS_89); + + b = sfr_data[3 - ((i & 7) >> 1)]; + b = (i & 1) ? b >> 4 : b & 0xf; + } + switch (b) { case 0: - print_string("Down\t"); + print_string("10M\t"); break; case 1: print_string("100M\t"); @@ -391,6 +404,9 @@ void port_stats_print(void) __banked case 5: print_string("2.5G\t"); break; + case 99: + print_string("Down\t"); + break; default: print_string("Up\t"); break; diff --git a/rtl837x_regs.h b/rtl837x_regs.h index 32e7a98..41f5510 100644 --- a/rtl837x_regs.h +++ b/rtl837x_regs.h @@ -80,6 +80,8 @@ #define RTL837X_REG_LINKS 0x63f0 #define RTL837X_REG_LINKS_89 0x63f4 +#define RTL837X_REG_LINKS_STS 0x63E8 + /* Each nibble encodes the link state of a port. Port 0 appears to be the CPU port The RTL8372 serves ports 4-7, port 3 is the RTL8221