47#include <sys/stdint.h>
48#include <sys/stddef.h>
53#include <sys/kernel.h>
55#include <sys/module.h>
58#include <sys/condvar.h>
59#include <sys/sysctl.h>
61#include <sys/unistd.h>
62#include <sys/callout.h>
63#include <sys/malloc.h>
81#define PCI_OHCI_VENDORID_ACERLABS 0x10b9
82#define PCI_OHCI_VENDORID_AMD 0x1022
83#define PCI_OHCI_VENDORID_APPLE 0x106b
84#define PCI_OHCI_VENDORID_ATI 0x1002
85#define PCI_OHCI_VENDORID_CMDTECH 0x1095
86#define PCI_OHCI_VENDORID_HYGON 0x1d94
87#define PCI_OHCI_VENDORID_NEC 0x1033
88#define PCI_OHCI_VENDORID_NVIDIA 0x12D2
89#define PCI_OHCI_VENDORID_NVIDIA2 0x10DE
90#define PCI_OHCI_VENDORID_OPTI 0x1045
91#define PCI_OHCI_VENDORID_SIS 0x1039
93#define PCI_OHCI_BASE_REG 0x10
106 if (pci_get_powerstate(self) != PCI_POWERSTATE_D0) {
107 device_printf(self,
"chip is in D%d mode "
108 "-- setting to D0\n", pci_get_powerstate(self));
111 pci_set_powerstate(self, PCI_POWERSTATE_D0);
121 uint32_t device_id = pci_get_devid(self);
125 return (
"AcerLabs M5237 (Aladdin-V) USB controller");
128 return (
"AMD-756 USB Controller");
130 return (
"AMD-766 USB Controller");
132 return (
"AMD FCH USB Controller");
135 return "ATI SB400 USB Controller";
137 return "ATI SB400 USB Controller";
139 return (
"AMD SB7x0/SB8x0/SB9x0 USB controller");
141 return (
"AMD SB7x0/SB8x0/SB9x0 USB controller");
143 return (
"AMD SB7x0/SB8x0/SB9x0 USB controller");
146 return (
"CMD Tech 670 (USB0670) USB controller");
149 return (
"CMD Tech 673 (USB0673) USB controller");
152 return (
"OPTi 82C861 (FireLink) USB controller");
155 return (
"NEC uPD 9210 USB controller");
158 return (
"nVidia nForce3 USB Controller");
161 return (
"nVidia nForce CK804 USB Controller");
163 return (
"nVidia nForce MCP55 USB Controller");
165 return (
"nVidia nForce MCP61 USB Controller");
167 return (
"nVidia nForce MCP79 USB Controller");
169 return (
"nVidia nForce MCP79 USB Controller");
171 return (
"nVidia nForce MCP79 USB Controller");
174 return (
"SiS 5571 USB controller");
177 return (
"Apple KeyLargo USB controller");
179 return (
"Apple KeyLargo/Intrepid USB controller");
187 return (
"OHCI (generic) USB controller");
198 device_set_desc(self,
desc);
225 pci_enable_busmaster(self);
228 sc->
sc_io_res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &
rid,
231 device_printf(self,
"Could not map memory\n");
239 sc->
sc_irq_res = bus_alloc_resource_any(self, SYS_RES_IRQ, &
rid,
240 RF_SHAREABLE | RF_ACTIVE);
242 device_printf(self,
"Could not allocate irq\n");
245 sc->
sc_bus.
bdev = device_add_child(self,
"usbus", -1);
247 device_printf(self,
"Could not add USB device\n");
257 switch (pci_get_vendor(self)) {
291 device_printf(self,
"(New OHCI DeviceId=0x%08x)\n",
292 pci_get_devid(self));
294 sprintf(sc->
sc_vendor,
"(0x%04x)", pci_get_vendor(self));
299#if (__FreeBSD_version >= 700031)
300 err = bus_setup_intr(self, sc->
sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
303 err = bus_setup_intr(self, sc->
sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
307 device_printf(self,
"Could not setup irq, %d\n", err);
313 err = device_probe_and_attach(sc->
sc_bus.
bdev);
316 device_printf(self,
"USB init failed\n");
332 device_delete_children(self);
334 pci_disable_busmaster(self);
346 device_printf(self,
"Could not tear down irq, %d\n",
352 bus_release_resource(self, SYS_RES_IRQ, 0, sc->
sc_irq_res);
356 bus_release_resource(self, SYS_RES_MEMORY,
PCI_CBMEM,
370 DEVMETHOD(device_suspend, bus_generic_suspend),
371 DEVMETHOD(device_resume, bus_generic_resume),
372 DEVMETHOD(device_shutdown, bus_generic_shutdown),
void ohci_interrupt(ohci_softc_t *sc)
void ohci_detach(struct ohci_softc *sc)
usb_error_t ohci_init(ohci_softc_t *sc)
usb_bus_mem_cb_t ohci_iterate_hw_softc
#define PCI_OHCI_VENDORID_APPLE
static driver_t ohci_driver
#define PCI_OHCI_VENDORID_AMD
#define PCI_OHCI_VENDORID_NVIDIA
static device_detach_t ohci_pci_detach
#define PCI_OHCI_VENDORID_HYGON
DRIVER_MODULE(ohci, pci, ohci_driver, ohci_devclass, 0, 0)
static usb_take_controller_t ohci_pci_take_controller
MODULE_DEPEND(ohci, usb, 1, 1, 1)
#define PCI_OHCI_VENDORID_NVIDIA2
static device_method_t ohci_pci_methods[]
#define PCI_OHCI_VENDORID_SIS
#define PCI_OHCI_VENDORID_ATI
#define PCI_OHCI_VENDORID_OPTI
static device_probe_t ohci_pci_probe
static const char * ohci_pci_match(device_t self)
#define PCI_OHCI_VENDORID_ACERLABS
static devclass_t ohci_devclass
#define PCI_OHCI_VENDORID_NEC
#define PCI_OHCI_VENDORID_CMDTECH
static device_attach_t ohci_pci_attach
#define PCI_INTERFACE_OHCI
#define PCIS_SERIALBUS_USB
bus_space_tag_t sc_io_tag
struct usb_device * sc_devices[OHCI_MAX_DEVICES]
struct resource * sc_irq_res
struct resource * sc_io_res
bus_space_handle_t sc_io_hdl
struct usb_device ** devices
#define USB_GET_DMA_TAG(dev)
void usb_bus_mem_free_all(struct usb_bus *bus, usb_bus_mem_cb_t *cb)
uint8_t usb_bus_mem_alloc_all(struct usb_bus *bus, bus_dma_tag_t dmat, usb_bus_mem_cb_t *cb)
struct usb_endpoint_descriptor desc