void ohci_arbus_attach(device_t parent, device_t self, void *aux) { ohci_softc_t * const sc = device_private(self); struct arbus_attach_args * const aa = aux; void *ih = NULL; usbd_status status; sc->sc_dev = self; sc->iot = aa->aa_bst; sc->sc_size = aa->aa_size; sc->sc_bus.dmatag = aa->aa_dmat; sc->sc_bus.hci_private = sc; if (bus_space_map(sc->iot, aa->aa_addr, sc->sc_size, 0, &sc->ioh)) { aprint_error_dev(self, "unable to map registers\n"); return; } /* Disable OHCI interrupts */ bus_space_write_4(sc->iot, sc->ioh, OHCI_INTERRUPT_DISABLE, OHCI_ALL_INTRS); /* establish interrupt */ ih = arbus_intr_establish(aa->aa_cirq, aa->aa_mirq, ohci_intr, sc); if (ih == NULL) panic("%s: couldn't establish interrupt", device_xname(self)); /* we don't handle endianess in bus space */ sc->sc_endian = OHCI_LITTLE_ENDIAN; status = ohci_init(sc); if (status != USBD_NORMAL_COMPLETION) { aprint_error_dev(self, "init failed, error=%d\n", status); if (ih != NULL) arbus_intr_disestablish(ih); return; } #if 0 if (psc->sc_ohci_devs[0] == NULL) { psc->sc_ohci_devs[0] = self; } else if (psc->sc_ohci_devs[1] == NULL) { psc->sc_ohci_devs[1] = self; } else { panic("%s: too many ohci devices", __func__); } #endif /* Attach USB device */ sc->sc_child = config_found(self, &sc->sc_bus, usbctlprint); }
void ehci_arbus_attach(device_t parent, device_t self, void *aux) { ehci_softc_t *sc = device_private(self); struct arbus_attach_args * const aa = aux; void *ih = NULL; int error; sc->iot = aa->aa_bst_le; sc->sc_size = aa->aa_size; //sc->sc_bus.ub_hcpriv = sc; sc->sc_bus.ub_dmatag = aa->aa_dmat; sc->sc_bus.ub_revision = USBREV_1_0; sc->sc_flags |= EHCIF_ETTF; sc->sc_vendor_init = ehci_arbus_init; error = bus_space_map(aa->aa_bst, aa->aa_addr, aa->aa_size, 0, &sc->ioh); if (error) { aprint_error(": failed to map registers: %d\n", error); return; } /* The recommended value is 0x20 for both ports and the host */ REGVAL(AR9344_USB_CONFIG_BASE) = 0x20c00; /* magic */ DELAY(1000); /* get offset to operational regs */ uint32_t r = bus_space_read_4(aa->aa_bst, sc->ioh, 0); if (r != 0x40) { aprint_error(": error: CAPLENGTH (%#x) != 0x40\n", sc->sc_offs); return; } sc->sc_offs = EREAD1(sc, EHCI_CAPLENGTH); aprint_normal("\n"); /* Disable EHCI interrupts */ EOWRITE4(sc, EHCI_USBINTR, 0); /* establish interrupt */ ih = arbus_intr_establish(aa->aa_cirq, aa->aa_mirq, ehci_intr, sc); if (ih == NULL) panic("%s: couldn't establish interrupt", device_xname(self)); /* * There are no companion controllers */ sc->sc_ncomp = 0; error = ehci_init(sc); if (error) { aprint_error("%s: init failed, error=%d\n", device_xname(self), error); if (ih != NULL) arbus_intr_disestablish(ih); return; } /* Attach USB device */ sc->sc_child = config_found(self, &sc->sc_bus, usbctlprint); }