diff --git a/rtl837x_port.c b/rtl837x_port.c index 4dfbbbc..9388cc6 100644 --- a/rtl837x_port.c +++ b/rtl837x_port.c @@ -757,11 +757,14 @@ void port_lag_members_set(__xdata uint8_t lag, __xdata uint16_t members) __banke { print_string("port_lag_members_set, lag: "); print_byte(lag); print_string(", members: "); print_short(members); write_char('\n'); - if (lag > 3) + if (lag > 3) { print_string("Link aggregation group must be 0-3!\n"); + return; + } reg_read_m(RTL837X_TRK_HASH_CTRL_BASE + (lag << 2)); - if (!(sfr_data[0] | sfr_data [1] | sfr_data [2] | sfr_data [3])) - REG_SET(RTL837X_TRK_HASH_CTRL_BASE, LAG_HASH_DEFAULT); + if (!(sfr_data[0] | sfr_data[1] | sfr_data[2]) + && (sfr_data[3] == LAG_HASH_RESET || sfr_data[3] == 0)) + REG_SET(RTL837X_TRK_HASH_CTRL_BASE + (lag << 2), LAG_HASH_DEFAULT); REG_WRITE(RTL837X_TRK_MBR_CTRL_BASE + (lag << 2), 0, 0, members >> 8, members & 0xff); } diff --git a/rtl837x_regs.h b/rtl837x_regs.h index c9185a6..37a7e99 100644 --- a/rtl837x_regs.h +++ b/rtl837x_regs.h @@ -232,6 +232,8 @@ #define LAG_HASH_L4_SPORT 0x20 #define LAG_HASH_L4_DPORT 0x40 #define LAG_HASH_DEFAULT (LAG_HASH_L2_SMAC | LAG_HASH_L2_DMAC | LAG_HASH_L3_SIP | LAG_HASH_L3_DIP | LAG_HASH_L4_SPORT | LAG_HASH_L4_DPORT) +#define LAG_HASH_RESET (LAG_HASH_SOURCE_PORT_NUMBER | LAG_HASH_L2_SMAC | LAG_HASH_L2_DMAC \ + | LAG_HASH_L3_SIP | LAG_HASH_L3_DIP | LAG_HASH_L4_SPORT) /* * Port isolation