diff --git a/src/add-ons/kernel/drivers/network/3com/pci/glue.c b/src/add-ons/kernel/drivers/network/3com/pci/glue.c index 05a45fb604..dd9a1cbcb6 100644 --- a/src/add-ons/kernel/drivers/network/3com/pci/glue.c +++ b/src/add-ons/kernel/drivers/network/3com/pci/glue.c @@ -1,11 +1,23 @@ +/* + * Copyright 2007, Hugo Santos. All Rights Reserved. + * Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All Rights Reserved. + * Distributed under the terms of the MIT License. + */ + + #include +#include "if_xlreg.h" + + HAIKU_FBSD_DRIVER_GLUE(3com, xl, pci); extern driver_t *DRIVER_MODULE_NAME(bmtphy, miibus); extern driver_t *DRIVER_MODULE_NAME(xlphy, miibus); -driver_t *__haiku_select_miibus_driver(device_t dev) + +driver_t * +__haiku_select_miibus_driver(device_t dev) { driver_t *drivers[] = { DRIVER_MODULE_NAME(bmtphy, miibus), @@ -15,8 +27,26 @@ driver_t *__haiku_select_miibus_driver(device_t dev) return __haiku_probe_miibus(dev, drivers, 2); } -/* TODO interrupt handling */ -NO_HAIKU_CHECK_DISABLE_INTERRUPTS(); -NO_HAIKU_REENABLE_INTERRUPTS(); + +int +__haiku_disable_interrupts(device_t dev) +{ + struct xl_softc *sc = device_get_softc(dev); + u_int16_t status = CSR_READ_2(sc, XL_STATUS); + + if (status == 0xffff || (status & XL_INTRS) == 0) + return 0; + + atomic_or(&sc->xl_intr_status, status); + CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ACK | (status & XL_INTRS)); + return 1; +} + + +void +__haiku_reenable_interrupts(device_t dev) +{ +} + HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_SWI_TASKQUEUE); diff --git a/src/add-ons/kernel/drivers/network/3com/pci/if_xl.c b/src/add-ons/kernel/drivers/network/3com/pci/if_xl.c index 65d6e3b1cf..9e9f6b61bc 100644 --- a/src/add-ons/kernel/drivers/network/3com/pci/if_xl.c +++ b/src/add-ons/kernel/drivers/network/3com/pci/if_xl.c @@ -2286,11 +2286,16 @@ xl_intr(void *arg) } #endif +#ifndef __HAIKU__ while ((status = CSR_READ_2(sc, XL_STATUS)) & XL_INTRS && status != 0xFFFF) { CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ACK|(status & XL_INTRS)); - +#else + status = atomic_and(&sc->xl_intr_status, 0); + dprintf("GOT %x\n", status & XL_INTRS); + if ((status & XL_INTRS) != 0 && status != 0xFFFF) { +#endif if (status & XL_STAT_UP_COMPLETE) { int curpkts; diff --git a/src/add-ons/kernel/drivers/network/3com/pci/if_xlreg.h b/src/add-ons/kernel/drivers/network/3com/pci/if_xlreg.h index 7dab376a42..31d4d1a206 100644 --- a/src/add-ons/kernel/drivers/network/3com/pci/if_xlreg.h +++ b/src/add-ons/kernel/drivers/network/3com/pci/if_xlreg.h @@ -611,6 +611,9 @@ struct xl_softc { #ifdef DEVICE_POLLING int rxcycles; #endif +#ifdef __HAIKU__ + u_int32_t xl_intr_status; +#endif }; #define XL_LOCK(_sc) mtx_lock(&(_sc)->xl_mtx)