From 1df19383d395cac19296cf7be025e1c5929e0bed Mon Sep 17 00:00:00 2001 From: cold-brewed Date: Tue, 6 Jun 2023 12:33:58 -0400 Subject: [PATCH] network: Implement memory wrapping in dp8390 based on the total memory size. Fixes malformed / blank packets on netware. --- src/include/86box/net_dp8390.h | 5 ++++- src/network/net_dp8390.c | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/include/86box/net_dp8390.h b/src/include/86box/net_dp8390.h index 4a172d4fe..bc3220c69 100644 --- a/src/include/86box/net_dp8390.h +++ b/src/include/86box/net_dp8390.h @@ -178,7 +178,10 @@ typedef struct { 0xFF. */ id1; /* 0x70 for the RTL8019AS, 0x43 for the RTL8029AS, otherwise 0xFF. */ - int mem_size, mem_start, mem_end; + uint32_t mem_size; + uint32_t mem_start; + uint32_t mem_end; + uint32_t mem_wrap; int tx_timer_index; int tx_timer_active; diff --git a/src/network/net_dp8390.c b/src/network/net_dp8390.c index 754f0449a..a1fa4b336 100644 --- a/src/network/net_dp8390.c +++ b/src/network/net_dp8390.c @@ -195,7 +195,7 @@ dp8390_write_cr(dp8390_t *dev, uint32_t val) /* Check for start-tx */ if ((val & 0x04) && dev->TCR.loop_cntl) { if (dev->TCR.loop_cntl) { - dp8390_rx_common(dev, &dev->mem[(dev->tx_page_start * 256) - dev->mem_start], + dp8390_rx_common(dev, &dev->mem[((dev->tx_page_start * 256) - dev->mem_start) & dev->mem_wrap], dev->tx_bytes); } } else if (val & 0x04) { @@ -217,7 +217,7 @@ dp8390_write_cr(dp8390_t *dev, uint32_t val) /* TODO: report TX error to the driver ? */ if (!(dev->card->link_state & NET_LINK_DOWN)) - network_tx(dev->card, &dev->mem[(dev->tx_page_start * 256) - dev->mem_start], dev->tx_bytes); + network_tx(dev->card, &dev->mem[((dev->tx_page_start * 256) - dev->mem_start) & dev->mem_wrap], dev->tx_bytes); /* some more debug */ #ifdef ENABLE_DP8390_LOG @@ -390,7 +390,7 @@ dp8390_rx_common(void *priv, uint8_t *buf, int io_len) } else { endbytes = (dev->page_stop - dev->curr_page) * 256; memcpy(startptr + sizeof(pkthdr), buf, endbytes - sizeof(pkthdr)); - startptr = &dev->mem[(dev->page_start * 256) - dev->mem_start]; + startptr = &dev->mem[((dev->tx_page_start * 256) - dev->mem_start) & dev->mem_wrap]; memcpy(startptr, buf + endbytes - sizeof(pkthdr), io_len - endbytes + 8); } dev->curr_page = nextpage; @@ -917,6 +917,7 @@ dp8390_mem_alloc(dp8390_t *dev, uint32_t start, uint32_t size) dev->mem_start = start; dev->mem_end = start + size; dev->mem_size = size; + dev->mem_wrap = size - 1; dp8390_log("DP8390: Mapped %i bytes of memory at address %04X in the address space\n", size, start); }