1/*
2 * Copyright 2009, Colin G��nther, coling@gmx.de.
3 * Copyright 2018, Haiku, Inc.
4 * All rights reserved. Distributed under the terms of the MIT license.
5 */
6
7
8#include <sys/bus.h>
9#include <sys/kernel.h>
10
11#include <machine/bus.h>
12
13#include <net/if.h>
14#include <net/if_media.h>
15
16#include <net80211/ieee80211_var.h>
17#include <net80211/ieee80211_ratectl.h>
18
19#include <dev/wpi/if_wpireg.h>
20#include <dev/wpi/if_wpivar.h>
21
22
23HAIKU_FBSD_WLAN_DRIVER_GLUE(iprowifi3945, wpi, pci)
24NO_HAIKU_FBSD_MII_DRIVER();
25NO_HAIKU_REENABLE_INTERRUPTS();
26HAIKU_DRIVER_REQUIREMENTS(FBSD_WLAN);
27HAIKU_FIRMWARE_VERSION(2144);
28HAIKU_FIRMWARE_NAME_MAP({
29	{"wpifw", "iwlwifi-3945-15.ucode"}
30});
31
32
33int
34HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev)
35{
36	struct wpi_softc* sc = (struct wpi_softc*)device_get_softc(dev);
37	uint32 r1, r2;
38
39	r1 = WPI_READ(sc, WPI_INT);
40
41	if (__predict_false(r1 == 0xffffffff ||
42			(r1 & 0xfffffff0) == 0xa5a5a5a0))
43		return 0;	/* Hardware gone! */
44
45	r2 = WPI_READ(sc, WPI_FH_INT);
46
47	if (r1 == 0 && r2 == 0)
48		return 0;	/* Interrupt not for us. */
49
50	/* Disable interrupts. */
51	WPI_WRITE(sc, WPI_INT_MASK, 0);
52
53	atomic_set((int32*)&sc->sc_intr_status_1, r1);
54	atomic_set((int32*)&sc->sc_intr_status_2, r2);
55
56	return 1;
57}
58