xref: /haiku/src/add-ons/kernel/drivers/network/ether/broadcom570x/glue.c (revision 12f69070c6e46f8adf05063a6c9156a7551c394f)
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