int ukbd_detach(device_t self, int flags) { struct ukbd_softc *sc = device_private(self); int rv = 0; DPRINTF(("ukbd_detach: sc=%p flags=%d\n", sc, flags)); pmf_device_deregister(self); if (sc->sc_console_keyboard) { #if 0 /* * XXX Should probably disconnect our consops, * XXX and either notify some other keyboard that * XXX it can now be the console, or if there aren't * XXX any more USB keyboards, set ukbd_is_console * XXX back to 1 so that the next USB keyboard attached * XXX to the system will get it. */ panic("ukbd_detach: console keyboard"); #else /* * Disconnect our consops and set ukbd_is_console * back to 1 so that the next USB keyboard attached * to the system will get it. * XXX Should notify some other keyboard that it can be * XXX console, if there are any other keyboards. */ printf("%s: was console keyboard\n", USBDEVNAME(sc->sc_hdev.sc_dev)); wskbd_cndetach(); ukbd_is_console = 1; #endif } /* No need to do reference counting of ukbd, wskbd has all the goo. */ if (sc->sc_wskbddev != NULL) rv = config_detach(sc->sc_wskbddev, flags); /* The console keyboard does not get a disable call, so check pipe. */ if (sc->sc_hdev.sc_state & UHIDEV_OPEN) uhidev_close(&sc->sc_hdev); return (rv); }
void wscn_input_init(int pass) { if (pass != 0) { #if NWSKBD > 0 wskbd_cndetach(); #endif } #if (NPCKBC > 0) if (pass == 0 && pckbc_cnattach(X86_BUS_SPACE_IO, IO_KBD, KBCMDP, 0) == 0) return; #endif #if (NUKBD > 0) if (ukbd_cnattach() == 0) return; #endif }