From f8903fddbc2a42d68bfe42a0fb6cf93ed3a14277 Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Thu, 4 Dec 2008 18:21:15 -0500 Subject: [PATCH] who knows if this will work --- aseg-paging/pagingstub.c | 22 ++++++++++++---------- net/3c90x.c | 27 ++++++++++++++------------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/aseg-paging/pagingstub.c b/aseg-paging/pagingstub.c index 678f2ea..782bf0f 100644 --- a/aseg-paging/pagingstub.c +++ b/aseg-paging/pagingstub.c @@ -61,17 +61,19 @@ unsigned long v2p(void *virt) if (!paging_enb) return _virt; - if (_virt >= 0xA0000 && _virt < 0xC0000) - return _virt; - if (_virt >= 0x200000 && _virt < 0x300000) - return _virt - 0x200000 + /* XXX */ 0x1FF82000; - if (_virt >= 0x1F0000 && _virt < 0x1F2000) - return _virt - 0x1F0000 + 0x1FF80000; - if ((_virt & ~0xFFF) == 0x4000) - return _virt - 0x4000 + curmapped; + unsigned long pde = ((unsigned long *)p2v((unsigned long)pd))[PDE_FOR(_virt)]; + unsigned long pte; + + if (!(pde & PTE_PRESENT)) + return 0xFFFFFFFF; + + if (pde & PDE_PAGE_SIZE) + return ADDR_12_MASK(pde) + (_virt & 0x3FFFFF); - outputf("WARNING: v2p(%08x)", _virt); - return 0xFFFFFFFF; + pte = ((unsigned long *)p2v(ADDR_12_MASK(pde)))[PTE_FOR(_virt)]; + if (!(pte & PTE_PRESENT)) + return 0xFFFFFFFF; + return (pte & ~0xFFF) + (_virt & 0xFFF); } void *p2v(unsigned long phys) diff --git a/net/3c90x.c b/net/3c90x.c index ea7914c..30283a2 100644 --- a/net/3c90x.c +++ b/net/3c90x.c @@ -480,6 +480,20 @@ a3c90x_transmit(struct pbuf *p) unsigned char status; static unsigned int stillwaiting = 0; unsigned int n, len; + + if (stillwaiting) + { + while (!(inw(INF_3C90X.IOAddr + regCommandIntStatus_w) & INT_TXCOMPLETE) && oneshot_running()) + ; + if (!(inw(INF_3C90X.IOAddr + regCommandIntStatus_w) & INT_TXCOMPLETE)) + { + outputf("3c90x: tx timeout? txstat %02x", inb(INF_3C90X.IOAddr + regTxStatus_b)); + outputf("3c90x: Gen sts %04x", inw(INF_3C90X.IOAddr + regCommandIntStatus_w)); + } + status = inb(INF_3C90X.IOAddr + regTxStatus_b); + outb(INF_3C90X.IOAddr + regTxStatus_b, 0x00); + stillwaiting = 0; + } _issue_command(INF_3C90X.IOAddr, cmdStallCtl, 2 /* Stall download */); @@ -514,19 +528,6 @@ a3c90x_transmit(struct pbuf *p) oneshot_start_ms(10); stillwaiting = 1; - if (stillwaiting) - { - while (!(inw(INF_3C90X.IOAddr + regCommandIntStatus_w) & INT_TXCOMPLETE) && oneshot_running()) - ; - if (!(inw(INF_3C90X.IOAddr + regCommandIntStatus_w) & INT_TXCOMPLETE)) - { - outputf("3c90x: tx timeout? txstat %02x", inb(INF_3C90X.IOAddr + regTxStatus_b)); - outputf("3c90x: Gen sts %04x", inw(INF_3C90X.IOAddr + regCommandIntStatus_w)); - } - status = inb(INF_3C90X.IOAddr + regTxStatus_b); - outb(INF_3C90X.IOAddr + regTxStatus_b, 0x00); - stillwaiting = 0; - } #if 0 /** successful completion (sans "interrupt Requested" bit) **/ -- 2.39.2