Author: kevans Date: Thu Dec 26 17:25:51 2019 New Revision: 356092 URL: https://svnweb.freebsd.org/changeset/base/356092
Log: kbdmux: simplify modevent handler In the event of a MOD_LOAD failure, MOD_UNLOAD will be invoked to unwind module load. Most of the reversion in MOD_LOAD can just be deferred to normal MOD_UNLOAD cleanup, rather than duplicating the effort. A NULL return of kbd_get_switch in the MOD_UNLOAD handler has been downgraded from a panic to a successful return, as that certainly just means that kbd_add_driver failed (not possible at the moment) and we have no work to do. Modified: head/sys/dev/kbdmux/kbdmux.c Modified: head/sys/dev/kbdmux/kbdmux.c ============================================================================== --- head/sys/dev/kbdmux/kbdmux.c Thu Dec 26 17:09:36 2019 (r356091) +++ head/sys/dev/kbdmux/kbdmux.c Thu Dec 26 17:25:51 2019 (r356092) @@ -1427,7 +1427,6 @@ kbdmux_modevent(module_t mod, int type, void *data) break; if ((sw = kbd_get_switch(KEYBOARD_NAME)) == NULL) { - kbd_delete_driver(&kbdmux_kbd_driver); error = ENXIO; break; } @@ -1435,33 +1434,25 @@ kbdmux_modevent(module_t mod, int type, void *data) kbd = NULL; if ((error = (*sw->probe)(0, NULL, 0)) != 0 || - (error = (*sw->init)(0, &kbd, NULL, 0)) != 0) { - kbd_delete_driver(&kbdmux_kbd_driver); + (error = (*sw->init)(0, &kbd, NULL, 0)) != 0) break; - } #ifdef KBD_INSTALL_CDEV if ((error = kbd_attach(kbd)) != 0) { (*sw->term)(kbd); - kbd_delete_driver(&kbdmux_kbd_driver); break; } #endif - if ((error = (*sw->enable)(kbd)) != 0) { - (*sw->disable)(kbd); -#ifdef KBD_INSTALL_CDEV - kbd_detach(kbd); -#endif - (*sw->term)(kbd); - kbd_delete_driver(&kbdmux_kbd_driver); + if ((error = (*sw->enable)(kbd)) != 0) break; - } break; case MOD_UNLOAD: - if ((sw = kbd_get_switch(KEYBOARD_NAME)) == NULL) - panic("kbd_get_switch(" KEYBOARD_NAME ") == NULL"); + if ((sw = kbd_get_switch(KEYBOARD_NAME)) == NULL) { + error = 0; + break; + } kbd = kbd_get_keyboard(kbd_find_keyboard(KEYBOARD_NAME, 0)); if (kbd != NULL) { @@ -1470,8 +1461,8 @@ kbdmux_modevent(module_t mod, int type, void *data) kbd_detach(kbd); #endif (*sw->term)(kbd); - kbd_delete_driver(&kbdmux_kbd_driver); } + kbd_delete_driver(&kbdmux_kbd_driver); error = 0; break; _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"