From d8ff7084f25c6b93d14ec73758d733de8ba676e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 30 Oct 2007 16:53:16 +0000 Subject: [PATCH] Implemented interrupt handling for the 3com driver; unfortunately, it does not work unchanged: turning off interrupts on the device doesn't seem to work, and when one only acknowledges the interrupts, they are also removed from XL_STATUS register. The driver now starts to work: it can send and receive packets, though it currently only seem to receive broadcast packets. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22771 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/drivers/network/3com/pci/glue.c | 38 +++++++++++++++++-- .../kernel/drivers/network/3com/pci/if_xl.c | 7 +++- .../drivers/network/3com/pci/if_xlreg.h | 3 ++ 3 files changed, 43 insertions(+), 5 deletions(-) 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)