From eb13d4ab04d9cef1c0b6f351f50fe7f3e39dbdb2 Mon Sep 17 00:00:00 2001 From: logicog Date: Mon, 2 Mar 2026 07:38:00 +0100 Subject: [PATCH] Add iniital implementation of bandwidth control --- rtl837x_bandwidth.c | 108 ++++++++++++++++++++++++++++++++++++++++++++ rtl837x_bandwidth.h | 14 ++++++ 2 files changed, 122 insertions(+) create mode 100644 rtl837x_bandwidth.c create mode 100644 rtl837x_bandwidth.h diff --git a/rtl837x_bandwidth.c b/rtl837x_bandwidth.c new file mode 100644 index 0000000..9ab047b --- /dev/null +++ b/rtl837x_bandwidth.c @@ -0,0 +1,108 @@ +// #define REGDBG +// #define DEBUG + +#include "rtl837x_common.h" +#include "rtl837x_sfr.h" +#include "rtl837x_regs.h" +#include "rtl837x_bandwidth.h" +#include "machine.h" + +#pragma codeseg BANK2 +#pragma constseg BANK2 + +extern __xdata uint8_t sfr_data[4]; + +void bandwidth_setup(void) __banked +{ + print_string("bandwidth_setup called\n"); + // Exclude all packets possibly for the CPU port, but do not include bypassed packets or Inter-Frame-Gap into bandwidth + REG_SET(RTL837X_IGBW_CTRL, IGBW_ADM_DHCP | IGBW_ADM_ARPREQ | IGBW_ADM_RMA | IGBW_ADM_BPDU | IGBW_ADM_RTKPKT | IGBW_ADM_IGMP); + + // We do not count IFG for Egress and allways allow CPU-traffic + REG_SET(RTL837X_EGBW_CTRL, EGBW_CPUMODE); + + print_string("RTL837X_IGBW_CTRL: "); print_reg(RTL837X_IGBW_CTRL); write_char('\n'); + print_string("RTL837X_EGBW_CTRL: "); print_reg(RTL837X_EGBW_CTRL); write_char('\n'); + print_string("bandwidth_setup done\n"); +} + + +/* + * Set the ingress bandwidth + * bw: Bandwidth in kb + */ +void bandwidth_ingress_set(uint8_t port, __xdata uint32_t bw) __banked +{ + __xdata uint8_t * __xdata bwptr = &bw; + + print_string("bandwidth_ingress_set called, port "); print_byte(port); write_char('\n'); + sfr_data[0] = 0; + sfr_data[1] = 0x10 | (*(bwptr + 2) >> 4); // Set bit 20 to enable ingress bandwidth control + sfr_data[2] = (*(bwptr + 2) << 4) | (*(bwptr + 1) >> 4); + sfr_data[3] = (*(bwptr) >> 4) | (*(bwptr + 1) << 4); + reg_write_m(RTL837X_IGBW_PORT_CTRL + port * 4); + + // We enable Flow Control instead of just dropping packets + reg_bit_set(RTL837X_IGBW_PORT_FC_CTRL, port); + print_string("RTL837X_IGBW_PORT_FC_CTRL:"); print_reg(RTL837X_IGBW_PORT_FC_CTRL); write_char('\n'); +} + + +void bandwidth_ingress_drop(uint8_t port) __banked +{ + reg_bit_clear(RTL837X_IGBW_PORT_FC_CTRL, port); + print_string("RTL837X_IGBW_PORT_FC_CTRL:"); print_reg(RTL837X_IGBW_PORT_FC_CTRL); write_char('\n'); +} + + +void bandwidth_ingress_disable(uint8_t port) __banked +{ + print_string("Ingress bandwidth limit disabled, port "); print_byte(port); write_char('\n'); + REG_SET(RTL837X_IGBW_PORT_CTRL + port * 4, 0x0fffff); +} + + +void bandwidth_egress_set(uint8_t port, __xdata uint32_t bw) __banked +{ + __xdata uint8_t * __xdata bwptr = &bw; + + print_string("bandwidth_egress_set called, port "); print_byte(port); write_char('\n'); + sfr_data[0] = 0; + sfr_data[1] = 0x10 | (*(bwptr + 2) >> 4); // Set bit 20 to enable egress bandwidth control + sfr_data[2] = (*(bwptr + 2) << 4) | (*(bwptr + 1) >> 4); + sfr_data[3] = (*(bwptr) >> 4) | (*(bwptr + 1) << 4); + reg_write_m(RTL837X_EGBW_PORT_CTRL + port * 1024); +} + + +void bandwidth_egress_disable(uint8_t port) __banked +{ + print_string("Egress bandwidth limit disabled, port "); print_byte(port); write_char('\n'); + REG_SET(RTL837X_EGBW_PORT_CTRL + port * 1024, 0x0fffff); +} + + +void bandwidth_status(uint8_t port) __banked +{ + print_string("ingress: "); + reg_read_m(RTL837X_IGBW_PORT_CTRL + port * 4); + if (sfr_data[1] & 0x10) { + print_string("enabled: "); + sfr_data[1] &= 0xef; + print_sfr_data(); + write_char('\n'); + } else { + print_string("disabled\n"); + } + + print_string("egress: "); + reg_read_m(RTL837X_EGBW_PORT_CTRL + port * 1024); + if (sfr_data[1] & 0x10) { + print_string("enabled: "); + sfr_data[1] &= 0xef; + print_sfr_data(); + write_char('\n'); + } else { + print_string("disabled\n"); + } +} diff --git a/rtl837x_bandwidth.h b/rtl837x_bandwidth.h new file mode 100644 index 0000000..d704dc2 --- /dev/null +++ b/rtl837x_bandwidth.h @@ -0,0 +1,14 @@ +#ifndef _RTL837X_BANDWIDTH_H_ +#define _RTL837X_BANDWIDTH_H_ + +#include + +void bandwidth_setup(void) __banked; +void bandwidth_ingress_set(uint8_t port, __xdata uint32_t bw) __banked; +void bandwidth_ingress_disable(uint8_t port) __banked; +void bandwidth_ingress_drop(uint8_t port) __banked; +void bandwidth_egress_set(uint8_t port, __xdata uint32_t bw) __banked; +void bandwidth_egress_disable(uint8_t port) __banked; +void bandwidth_status(uint8_t port) __banked; + +#endif