diff --git a/src/add-ons/kernel/bus_managers/ps2/ps2_service.c b/src/add-ons/kernel/bus_managers/ps2/ps2_service.c index 60eb4300e3..23313d2042 100644 --- a/src/add-ons/kernel/bus_managers/ps2/ps2_service.c +++ b/src/add-ons/kernel/bus_managers/ps2/ps2_service.c @@ -25,6 +25,7 @@ typedef struct enum { PS2_SERVICE_NOTIFY_DEVICE_ADDED = 1, + PS2_SERVICE_NOTIFY_DEVICE_REPUBLISH, PS2_SERVICE_NOTIFY_DEVICE_REMOVED, }; @@ -45,6 +46,23 @@ ps2_service_notify_device_added(ps2_dev *dev) } +void +ps2_service_notify_device_republish(ps2_dev *dev) +{ + ps2_service_cmd cmd; + + TRACE("ps2: ps2_service_notify_device_republish %s\n", dev->name); + + cmd.id = PS2_SERVICE_NOTIFY_DEVICE_REPUBLISH; + cmd.dev = dev; + + packet_buffer_write(sServiceCmdBuffer, (const uint8 *)&cmd, sizeof(cmd)); + release_sem_etc(sServiceSem, 1, B_DO_NOT_RESCHEDULE); + + TRACE("ps2: ps2_service_notify_device_republish done\n"); +} + + void ps2_service_notify_device_removed(ps2_dev *dev) { @@ -82,6 +100,13 @@ ps2_service_thread(void *arg) TRACE("ps2: PS2_SERVICE_NOTIFY_DEVICE_ADDED %s\n", cmd.dev->name); ps2_dev_publish(cmd.dev); break; + + case PS2_SERVICE_NOTIFY_DEVICE_REPUBLISH: + TRACE("ps2: PS2_SERVICE_NOTIFY_DEVICE_REPUBLISH %s\n", cmd.dev->name); + ps2_dev_unpublish(cmd.dev); + snooze(2500000); + ps2_dev_publish(cmd.dev); + break; case PS2_SERVICE_NOTIFY_DEVICE_REMOVED: TRACE("ps2: PS2_SERVICE_NOTIFY_DEVICE_REMOVED %s\n", cmd.dev->name); diff --git a/src/add-ons/kernel/bus_managers/ps2/ps2_service.h b/src/add-ons/kernel/bus_managers/ps2/ps2_service.h index 3680d2354a..068c8c9eb7 100644 --- a/src/add-ons/kernel/bus_managers/ps2/ps2_service.h +++ b/src/add-ons/kernel/bus_managers/ps2/ps2_service.h @@ -17,6 +17,7 @@ status_t ps2_service_init(void); void ps2_service_exit(void); void ps2_service_notify_device_added(ps2_dev *dev); +void ps2_service_notify_device_republish(ps2_dev *dev); void ps2_service_notify_device_removed(ps2_dev *dev); #endif