DEC Tulip and L80225 MII: Some improvements.

This commit is contained in:
OBattler
2025-11-21 03:16:12 +01:00
parent de4aa4aaf4
commit c4f97f453a
2 changed files with 36 additions and 14 deletions

View File

@@ -34,8 +34,17 @@ l80225_mii_readw(uint16_t *regs, uint16_t addr)
return 0;
}
/* Readonly mask for MDI (PHY) registers */
static const uint16_t tulip_mdi_mask[] = {
0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0fff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
void
l80225_mii_writew(uint16_t *regs, uint16_t addr, uint16_t val)
{
regs[addr] = val;
regs[addr] = val & tulip_mdi_mask[addr];
}

View File

@@ -346,10 +346,10 @@ static void
tulip_desc_read(TULIPState *s, uint32_t p,
struct tulip_descriptor *desc)
{
desc->status = mem_readl_phys(p);
desc->control = mem_readl_phys(p + 4);
desc->buf_addr1 = mem_readl_phys(p + 8);
desc->buf_addr2 = mem_readl_phys(p + 12);
dma_bm_read(p , (uint8_t *) &(desc->status) , 4, 4);
dma_bm_read(p + 4, (uint8_t *) &(desc->control) , 4, 4);
dma_bm_read(p + 8, (uint8_t *) &(desc->buf_addr1), 4, 4);
dma_bm_read(p + 12, (uint8_t *) &(desc->buf_addr2), 4, 4);
if (s->csr[0] & CSR0_DBO) {
bswap32s(&desc->status);
@@ -364,15 +364,20 @@ tulip_desc_write(TULIPState *s, uint32_t p,
struct tulip_descriptor *desc)
{
if (s->csr[0] & CSR0_DBO) {
mem_writel_phys(p, bswap32(desc->status));
mem_writel_phys(p + 4, bswap32(desc->control));
mem_writel_phys(p + 8, bswap32(desc->buf_addr1));
mem_writel_phys(p + 12, bswap32(desc->buf_addr2));
uint32_t status = bswap32(desc->status);
uint32_t control = bswap32(desc->control);
uint32_t buf_addr1 = bswap32(desc->buf_addr1);
uint32_t buf_addr2 = bswap32(desc->buf_addr2);
dma_bm_write(p , (uint8_t *) &status , 4, 4);
dma_bm_write(p + 4, (uint8_t *) &control , 4, 4);
dma_bm_write(p + 8, (uint8_t *) &buf_addr1, 4, 4);
dma_bm_write(p + 12, (uint8_t *) &buf_addr2, 4, 4);
} else {
mem_writel_phys(p, desc->status);
mem_writel_phys(p + 4, desc->control);
mem_writel_phys(p + 8, desc->buf_addr1);
mem_writel_phys(p + 12, desc->buf_addr2);
dma_bm_write(p , (uint8_t *) &(desc->status) , 4, 4);
dma_bm_write(p + 4, (uint8_t *) &(desc->control) , 4, 4);
dma_bm_write(p + 8, (uint8_t *) &(desc->buf_addr1), 4, 4);
dma_bm_write(p + 12, (uint8_t *) &(desc->buf_addr2), 4, 4);
}
}
@@ -433,6 +438,10 @@ tulip_copy_rx_bytes(TULIPState *s, struct tulip_descriptor *desc)
len = s->rx_frame_len;
}
if (s->rx_frame_len + len > sizeof(s->rx_frame)) {
return;
}
dma_bm_write(desc->buf_addr1, s->rx_frame + (s->rx_frame_size - s->rx_frame_len), len, 4);
s->rx_frame_len -= len;
}
@@ -444,6 +453,10 @@ tulip_copy_rx_bytes(TULIPState *s, struct tulip_descriptor *desc)
len = s->rx_frame_len;
}
if (s->rx_frame_len + len > sizeof(s->rx_frame)) {
return;
}
dma_bm_write(desc->buf_addr2, s->rx_frame + (s->rx_frame_size - s->rx_frame_len), len, 4);
s->rx_frame_len -= len;
}
@@ -568,7 +581,7 @@ static const uint16_t tulip_mdi_default[] = {
0x0600,
0x0001,
0x0000,
0x0000,
0x3b40,
0x0000,
0x0000,
0x0000,