diff --git a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/Jamfile b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/Jamfile index 43c689cd9c..b35841b74f 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/Jamfile +++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/Jamfile @@ -18,6 +18,7 @@ KernelAddon ralinkwifi : if_ral_pci.c rt2560.c rt2661.c + glue.c : libfreebsd_wlan.a libfreebsd_network.a diff --git a/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/glue.c b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/glue.c new file mode 100644 index 0000000000..c91a6040fd --- /dev/null +++ b/src/add-ons/kernel/drivers/network/wlan/ralinkwifi/glue.c @@ -0,0 +1,56 @@ +/* + * Copyright 2009, Colin Günther, coling@gmx.de. + * All Rights Reserved. Distributed under the terms of the MIT License. + */ + + +#include +#include + +#include + +#include + +#include +#include + +#include +#include + +#include +#include + + +HAIKU_FBSD_WLAN_DRIVER_GLUE(ralinkwifi, ral, pci) +NO_HAIKU_FBSD_MII_DRIVER(); +NO_HAIKU_REENABLE_INTERRUPTS(); +HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_SWI_TASKQUEUE | FBSD_WLAN); +HAIKU_FIRMWARE_VERSION(0); + + +#define RT2661_INT_MASK_CSR 0x346c +#define RT2661_MCU_INT_MASK_CSR 0x0018 + + +int +HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) +{ + struct rt2560_softc* sc = (struct rt2560_softc*)device_get_softc(dev); + // assuming that rt2560 and rt2661 share a common context data structure + struct ifnet* ifp = sc->sc_ifp; + + if (pci_get_device(dev) == 0x0201) { + // disable interrupts + RAL_WRITE(sc, RT2560_CSR8, 0xffffffff); + } else { + // disable MAC and MCU interrupts + RAL_WRITE(sc, RT2661_INT_MASK_CSR, 0xffffff7f); + RAL_WRITE(sc, RT2661_MCU_INT_MASK_CSR, 0xffffffff); + } + + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) + // don't re-enable interrupts if we're shutting down + return 0; + + return 1; +}