1cbe0a0c4SAugustin Cavalier /*
2cbe0a0c4SAugustin Cavalier * Copyright 2007-2008, Axel Dörfler, axeld@pinc-software.de.
3cbe0a0c4SAugustin Cavalier * Distributed under the terms of the MIT License.
4cbe0a0c4SAugustin Cavalier */
5cbe0a0c4SAugustin Cavalier
6cbe0a0c4SAugustin Cavalier #include <dev/pci/pcivar.h>
7cbe0a0c4SAugustin Cavalier #include <sys/bus.h>
8cbe0a0c4SAugustin Cavalier #include <sys/malloc.h>
9cbe0a0c4SAugustin Cavalier #include <sys/rman.h>
10cbe0a0c4SAugustin Cavalier #include <sys/systm.h>
11cbe0a0c4SAugustin Cavalier
12cbe0a0c4SAugustin Cavalier #include <machine/bus.h>
13cbe0a0c4SAugustin Cavalier
14cbe0a0c4SAugustin Cavalier #include <net/if.h>
15cbe0a0c4SAugustin Cavalier #include <net/if_media.h>
16cbe0a0c4SAugustin Cavalier
17cbe0a0c4SAugustin Cavalier #include "if_bgereg.h"
18cbe0a0c4SAugustin Cavalier
19cbe0a0c4SAugustin Cavalier
20cbe0a0c4SAugustin Cavalier HAIKU_FBSD_DRIVER_GLUE(broadcom570x, bge, pci);
21b0719130SAugustin Cavalier HAIKU_DRIVER_REQUIREMENTS(0);
22cbe0a0c4SAugustin Cavalier
23cbe0a0c4SAugustin Cavalier
24cbe0a0c4SAugustin Cavalier extern driver_t *DRIVER_MODULE_NAME(brgphy, miibus);
25cbe0a0c4SAugustin Cavalier extern driver_t *DRIVER_MODULE_NAME(ukphy, miibus);
26cbe0a0c4SAugustin Cavalier
27cbe0a0c4SAugustin Cavalier
28cbe0a0c4SAugustin Cavalier driver_t *
__haiku_select_miibus_driver(device_t dev)29cbe0a0c4SAugustin Cavalier __haiku_select_miibus_driver(device_t dev)
30cbe0a0c4SAugustin Cavalier {
31cbe0a0c4SAugustin Cavalier driver_t *drivers[] = {
32cbe0a0c4SAugustin Cavalier DRIVER_MODULE_NAME(brgphy, miibus),
33cbe0a0c4SAugustin Cavalier DRIVER_MODULE_NAME(ukphy, miibus),
34cbe0a0c4SAugustin Cavalier NULL
35cbe0a0c4SAugustin Cavalier };
36cbe0a0c4SAugustin Cavalier
37cbe0a0c4SAugustin Cavalier return __haiku_probe_miibus(dev, drivers);
38cbe0a0c4SAugustin Cavalier }
39cbe0a0c4SAugustin Cavalier
40cbe0a0c4SAugustin Cavalier
41cbe0a0c4SAugustin Cavalier int
__haiku_disable_interrupts(device_t dev)42cbe0a0c4SAugustin Cavalier __haiku_disable_interrupts(device_t dev)
43cbe0a0c4SAugustin Cavalier {
44cbe0a0c4SAugustin Cavalier struct bge_softc *sc = device_get_softc(dev);
45*12f69070SAugustin Cavalier if (sc->bge_flags & BGE_FLAG_MSI)
46*12f69070SAugustin Cavalier return 1;
47cbe0a0c4SAugustin Cavalier
48cbe0a0c4SAugustin Cavalier uint32 notInterrupted = pci_read_config(sc->bge_dev, BGE_PCI_PCISTATE, 4)
49cbe0a0c4SAugustin Cavalier & BGE_PCISTATE_INTR_STATE;
50cbe0a0c4SAugustin Cavalier // bit of a strange register name. a nonzero actually means
51cbe0a0c4SAugustin Cavalier // it is _not_ interrupted by the network chip
52cbe0a0c4SAugustin Cavalier
53cbe0a0c4SAugustin Cavalier if (notInterrupted)
54cbe0a0c4SAugustin Cavalier return 0;
55cbe0a0c4SAugustin Cavalier
56cbe0a0c4SAugustin Cavalier BGE_SETBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_MASK_PCI_INTR);
57cbe0a0c4SAugustin Cavalier bge_writembx(sc, BGE_MBX_IRQ0_LO, 1);
58cbe0a0c4SAugustin Cavalier
59cbe0a0c4SAugustin Cavalier return 1;
60cbe0a0c4SAugustin Cavalier }
61cbe0a0c4SAugustin Cavalier
62cbe0a0c4SAugustin Cavalier
63cbe0a0c4SAugustin Cavalier void
__haiku_reenable_interrupts(device_t dev)64cbe0a0c4SAugustin Cavalier __haiku_reenable_interrupts(device_t dev)
65cbe0a0c4SAugustin Cavalier {
66cbe0a0c4SAugustin Cavalier struct bge_softc *sc = device_get_softc(dev);
67*12f69070SAugustin Cavalier if (sc->bge_flags & BGE_FLAG_MSI)
68*12f69070SAugustin Cavalier return;
69*12f69070SAugustin Cavalier
70cbe0a0c4SAugustin Cavalier BGE_SETBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_CLEAR_INTA);
71cbe0a0c4SAugustin Cavalier BGE_CLRBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_MASK_PCI_INTR);
72cbe0a0c4SAugustin Cavalier bge_writembx(sc, BGE_MBX_IRQ0_LO, 0);
73cbe0a0c4SAugustin Cavalier }
74