From 80df11254fc518eac0c19463220d75381490b5e8 Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Mon, 7 May 2007 05:28:38 +0000 Subject: [PATCH] freebsd compat. layer: now both receiving and sending work with PCNET. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21048 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/drivers/network/pcnet/dev/le/am79900.c | 12 ++++++++++-- .../kernel/drivers/network/pcnet/dev/le/glue.c | 1 + .../kernel/drivers/network/pcnet/dev/le/lancevar.h | 2 ++ src/libs/compat/freebsd_network/device.c | 2 ++ src/libs/compat/freebsd_network/if.c | 2 +- 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/add-ons/kernel/drivers/network/pcnet/dev/le/am79900.c b/src/add-ons/kernel/drivers/network/pcnet/dev/le/am79900.c index f87de8a404..6b9109e21d 100644 --- a/src/add-ons/kernel/drivers/network/pcnet/dev/le/am79900.c +++ b/src/add-ons/kernel/drivers/network/pcnet/dev/le/am79900.c @@ -447,17 +447,25 @@ am79900_intr(void *arg) return; } +#if 0 isr = (*sc->sc_rdcsr)(sc, LE_CSR0); +#endif + { + cpu_status status; + HAIKU_INTR_REGISTER_ENTER(status); + isr = sc->sc_lastisr; + sc->sc_lastisr = 0; + HAIKU_INTR_REGISTER_LEAVE(status); + } + #if defined(LEDEBUG) && LEDEBUG > 1 if (sc->sc_flags & LE_DEBUG) if_printf(ifp, "%s: entering with isr=%04x\n", __func__, isr); #endif -#if 0 if ((isr & LE_C0_INTR) == 0) { LE_UNLOCK(sc); return; } -#endif /* * Clear interrupt source flags and turn off interrupts. If we diff --git a/src/add-ons/kernel/drivers/network/pcnet/dev/le/glue.c b/src/add-ons/kernel/drivers/network/pcnet/dev/le/glue.c index 21c1bbe9f8..302fc160c4 100644 --- a/src/add-ons/kernel/drivers/network/pcnet/dev/le/glue.c +++ b/src/add-ons/kernel/drivers/network/pcnet/dev/le/glue.c @@ -50,6 +50,7 @@ int HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) { BUS_SPACE_BARRIER_WRITE); bus_space_write_2(lesc->sc_regt, lesc->sc_regh, PCNET_PCI_RDP, value & ~LE_C0_INEA); + lesc->sc_am79900.lsc.sc_lastisr |= value; } HAIKU_INTR_REGISTER_LEAVE(status); diff --git a/src/add-ons/kernel/drivers/network/pcnet/dev/le/lancevar.h b/src/add-ons/kernel/drivers/network/pcnet/dev/le/lancevar.h index 76da35fd65..c7fb69976e 100644 --- a/src/add-ons/kernel/drivers/network/pcnet/dev/le/lancevar.h +++ b/src/add-ons/kernel/drivers/network/pcnet/dev/le/lancevar.h @@ -119,6 +119,8 @@ struct lance_softc { #define LE_CARRIER (1 << 2) #define LE_DEBUG (1 << 3) #define LE_PROMISC (1 << 4) + + uint16_t sc_lastisr; }; #define LE_LOCK_INIT(_sc, _name) \ diff --git a/src/libs/compat/freebsd_network/device.c b/src/libs/compat/freebsd_network/device.c index d782d72e48..1f2e0e4383 100644 --- a/src/libs/compat/freebsd_network/device.c +++ b/src/libs/compat/freebsd_network/device.c @@ -198,11 +198,13 @@ compat_read(void *cookie, off_t position, void *buf, size_t *numBytes) len = min_c(max_c((size_t)mb->m_len, 0), *numBytes); +#if 0 mb = m_defrag(mb, 0); if (mb == NULL) { *numBytes = 0; return B_NO_MEMORY; } +#endif memcpy(buf, mtod(mb, const void *), len); *numBytes = len; diff --git a/src/libs/compat/freebsd_network/if.c b/src/libs/compat/freebsd_network/if.c index 00fa56c872..f44daa0678 100644 --- a/src/libs/compat/freebsd_network/if.c +++ b/src/libs/compat/freebsd_network/if.c @@ -161,7 +161,7 @@ ether_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, static void ether_input(struct ifnet *ifp, struct mbuf *m) { - device_t dev = NULL; /* XXX */ + device_t dev = ifp->if_dev; IF_ENQUEUE(&dev->receive_queue, m); release_sem_etc(dev->receive_sem, 1, B_DO_NOT_RESCHEDULE);