From 9db4bb193ad12b0cf47125543bf7f3f36c0fb0ca Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sun, 15 Jun 2025 18:57:35 -0400 Subject: kernel: rtl: Implement packet TX Signed-off-by: Ian Moffett --- sys/dev/phy/rtl.c | 44 +++++++++++++++++++++++++++++++++++++++++--- sys/include/dev/phy/rtl.h | 3 +++ 2 files changed, 44 insertions(+), 3 deletions(-) (limited to 'sys') diff --git a/sys/dev/phy/rtl.c b/sys/dev/phy/rtl.c index e94e3a1..c2a16ce 100644 --- a/sys/dev/phy/rtl.c +++ b/sys/dev/phy/rtl.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -71,6 +72,16 @@ static struct etherdev wire; static uint16_t ioport; static paddr_t rxbuf, txbuf; +/* TXAD regs */ +static uint16_t tsads[] = { + RT_TXAD_N(0), RT_TXAD_N(4), + RT_TXAD_N(8), RT_TXAD_N(12) +}; +static uint16_t tsds[] = { + RT_TXSTATUS_N(0), RT_TXSTATUS_N(4), + RT_TXSTATUS_N(8), RT_TXSTATUS_N(8) +}; + /* * Write to an RTL8139 register * @@ -159,6 +170,28 @@ rt_poll(uint8_t reg, uint8_t size, uint32_t bits, bool pollset) return val; } +__used static int +rt_tx(void *packet, size_t len) +{ + static uint32_t tx_ptr = 0; + void *tx_data; + paddr_t tx_pa; + + tx_data = dynalloc(len); + if (tx_data == NULL) { + return -ENOMEM; + } + + memcpy(tx_data, packet, len); + tx_pa = VIRT_TO_PHYS(tx_data); + rt_write(tsads[tx_ptr], 4, tx_pa); + rt_write(tsds[tx_ptr++], 4, len); + if (tx_ptr) { + tx_ptr = 0; + } + return 0; +} + static int rt81xx_intr(void *sp) { @@ -172,8 +205,13 @@ rt81xx_intr(void *sp) len = *(p + 1); /* Length after header */ p += 2; /* Points to data now */ - if (status & RT_TOK) { - return -EIO; + if (!ISSET(status, RT_TOK | RT_ROK)) { + return 0; + } + + if (ISSET(status, RT_TOK)) { + pr_trace("sent packet\n"); + return 1; } /* Update rxbuf offset in CAPR */ @@ -310,7 +348,7 @@ rt_init_mac(void) rt_write(RT_RXBUF, 4, rxbuf); rt_write(RT_RXCONFIG, 4, RT_AB | RT_AM | RT_APM | RT_AAP); rt_write(RT_INTRMASK, 2, RT_ROK | RT_TOK); - rt_write(RT_CHIPCMD, 1, RT_RE); + rt_write(RT_CHIPCMD, 1, RT_RE | RT_TE); return 0; } diff --git a/sys/include/dev/phy/rtl.h b/sys/include/dev/phy/rtl.h index 21c7d54..f3178d0 100644 --- a/sys/include/dev/phy/rtl.h +++ b/sys/include/dev/phy/rtl.h @@ -71,6 +71,9 @@ #define RT_AS_LPAR 0x68 /* Auto-negotiation link partner reg (16 bits) */ #define RT_AS_EXPANSION 0x6A /* Auto-negotiation expansion reg (16 bits) */ +#define RT_TXAD_N(N) (RT_TXADDR0 + (N)) +#define RT_TXSTATUS_N(N) (RT_TXSTATUS0 + ((N))) + /* Command register bits */ #define RT_BUFEN BIT(0) /* Buffer empty */ #define RT_TE BIT(2) /* Transmitter enable */ -- cgit v1.2.3