1/*
2 * Copyright 2009, 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#include <net80211/ieee80211_amrr.h>
19#include <net80211/ieee80211_ratectl.h>
20
21#include <dev/ral/rt2560reg.h>
22#include <dev/ral/rt2560var.h>
23#include <dev/ral/rt2661var.h>
24#include <dev/ral/rt2860reg.h>
25#include <dev/ral/rt2860var.h>
26
27
28HAIKU_FBSD_WLAN_DRIVERS_GLUE(ralinkwifi)
29HAIKU_DRIVER_REQUIREMENTS(FBSD_WLAN);
30HAIKU_FIRMWARE_VERSION(0);
31HAIKU_FIRMWARE_NAME_MAP({
32	{"rt2561fw", "rt2561.ucode"},
33	{"rt2561sfw", "rt2561s.ucode"},
34	{"rt2661fw", "rt2661.ucode"},
35	{"rt2860fw", "rt2860.ucode"},
36	{"runfw", "rt2870.ucode"},
37});
38
39NO_HAIKU_FBSD_MII_DRIVER();
40NO_HAIKU_REENABLE_INTERRUPTS();
41
42extern driver_t* DRIVER_MODULE_NAME(ral, pci);
43extern driver_t* DRIVER_MODULE_NAME(ural, uhub);
44extern driver_t* DRIVER_MODULE_NAME(run, uhub);
45extern driver_t* DRIVER_MODULE_NAME(rum, uhub);
46
47
48status_t
49__haiku_handle_fbsd_drivers_list(status_t (*handler)(driver_t *[], driver_t *[]))
50{
51	driver_t *pci_drivers[] = {
52		DRIVER_MODULE_NAME(ral, pci),
53		NULL
54	};
55	driver_t *usb_drivers[] = {
56		DRIVER_MODULE_NAME(ural, uhub),
57		DRIVER_MODULE_NAME(run, uhub),
58		DRIVER_MODULE_NAME(rum, uhub),
59		NULL
60	};
61	return (*handler)(pci_drivers, usb_drivers);
62}
63
64
65#define RT2661_INT_MASK_CSR			0x346c
66#define RT2661_MCU_INT_MASK_CSR		0x0018
67
68
69int
70HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev)
71{
72	struct rt2560_softc* sc = (struct rt2560_softc*)device_get_softc(dev);
73		// sc_ifp is common between context data structures
74
75	switch (pci_get_device(dev)) {
76		case 0x0201:
77			// disable interrupts
78			RAL_WRITE(sc, RT2560_CSR8, 0xffffffff);
79
80			if (!(sc->sc_flags & RT2560_F_RUNNING)) {
81				// don't re-enable interrupts if we're shutting down
82				return 0;
83			}
84			break;
85		case 0x0301:
86		case 0x0302:
87		case 0x0401:
88			// disable MAC and MCU interrupts
89			RAL_WRITE(sc, RT2661_INT_MASK_CSR, 0xffffff7f);
90			RAL_WRITE(sc, RT2661_MCU_INT_MASK_CSR, 0xffffffff);
91
92			if (!(sc->sc_flags & RAL_RUNNING)) {
93				// don't re-enable interrupts if we're shutting down
94				return 0;
95			}
96			break;
97		default:
98		{
99			uint32 r;
100			struct rt2860_softc* sc =
101				(struct rt2860_softc*)device_get_softc(dev);
102			r = RAL_READ(sc, RT2860_INT_STATUS);
103			if (r == 0 || r == 0xffffffff)
104				return 0;
105
106			atomic_set((int32*)&sc->sc_intr_status, r);
107			break;
108		}
109	}
110
111	return 1;
112}
113