1/* 2 * Copyright 2010, Colin Günther, coling@gmx.de. 3 * All Rights Reserved. Distributed under the terms of the MIT License. 4 */ 5 6 7#include <sys/bus.h> 8#include <sys/kernel.h> 9 10#include <dev/pci/pcivar.h> 11 12#include <machine/bus.h> 13 14#include <net/if.h> 15#include <net/if_media.h> 16 17#include <net80211/ieee80211_var.h> 18 19#include "dev/rt2860/rt2860_io.h" 20#include "dev/rt2860/rt2860_reg.h" 21#include "dev/rt2860/rt2860_softc.h" 22 23 24HAIKU_FBSD_WLAN_DRIVER_GLUE(ralink2860, rt2860, pci) 25HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_WLAN); 26 27HAIKU_FIRMWARE_VERSION(0); 28NO_HAIKU_FIRMWARE_NAME_MAP(); 29 30NO_HAIKU_FBSD_MII_DRIVER(); 31 32 33static void rt2860_intr_enable(struct rt2860_softc* sc, uint32_t intr_mask) 34{ 35 uint32_t tmp; 36 37 sc->intr_disable_mask &= ~intr_mask; 38 39 tmp = sc->intr_enable_mask & ~sc->intr_disable_mask; 40 41 rt2860_io_mac_write(sc, RT2860_REG_SCHDMA_INT_MASK, tmp); 42} 43 44 45int 46HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) 47{ 48 struct rt2860_softc* sc = (struct rt2860_softc*)device_get_softc(dev); 49 struct ifnet* ifp = sc->ifp; 50 51 // acknowledge interrupts 52 uint32_t status = rt2860_io_mac_read(sc, RT2860_REG_SCHDMA_INT_STATUS); 53 rt2860_io_mac_write(sc, RT2860_REG_SCHDMA_INT_STATUS, status); 54 55 if (status == 0xffffffff || status == 0) 56 // device likely went away || not for us 57 return 0; 58 59 sc->interrupts++; 60 61 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) 62 return 0; 63 64 rt2860_io_mac_write(sc, RT2860_REG_SCHDMA_INT_MASK, 0); 65 // Disable interrupts 66 67 sc->interrupt_status = status; 68 69 return 1; 70} 71 72 73void 74HAIKU_REENABLE_INTERRUPTS(device_t dev) 75{ 76 struct rt2860_softc* sc = (struct rt2860_softc*)device_get_softc(dev); 77 78 rt2860_intr_enable(sc, 0); 79} 80