mirror of
https://github.com/86Box/86Box.git
synced 2026-02-22 09:35:32 -07:00
DEC Tulip and L80225 MII: Some improvements.
This commit is contained in:
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user