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