diff --git a/src/add-ons/kernel/bus_managers/ps2/ps2_dev.c b/src/add-ons/kernel/bus_managers/ps2/ps2_dev.c index 85d137dd8b..708cee2d45 100644 --- a/src/add-ons/kernel/bus_managers/ps2/ps2_dev.c +++ b/src/add-ons/kernel/bus_managers/ps2/ps2_dev.c @@ -66,7 +66,7 @@ ps2_dev ps2_device[PS2_DEVICE_COUNT] = { }; -static status_t +status_t ps2_reset_mouse(ps2_dev *dev) { uint8 data[2]; diff --git a/src/add-ons/kernel/bus_managers/ps2/ps2_dev.h b/src/add-ons/kernel/bus_managers/ps2/ps2_dev.h index 7d950a6481..0b8368faf7 100644 --- a/src/add-ons/kernel/bus_managers/ps2/ps2_dev.h +++ b/src/add-ons/kernel/bus_managers/ps2/ps2_dev.h @@ -74,6 +74,8 @@ status_t ps2_dev_command(ps2_dev *dev, uint8 cmd, const uint8 *out, status_t ps2_dev_command_timeout(ps2_dev *dev, uint8 cmd, const uint8 *out, int out_count, uint8 *in, int in_count, bigtime_t timeout); +status_t ps2_reset_mouse(ps2_dev *dev); + void ps2_dev_publish(ps2_dev *dev); void ps2_dev_unpublish(ps2_dev *dev); diff --git a/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c b/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c index 894d614571..e9c9ef6e32 100644 --- a/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c +++ b/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c @@ -630,6 +630,7 @@ err1: status_t synaptics_close(void *_cookie) { + status_t status; synaptics_cookie *cookie = _cookie; ps2_dev_command_timeout(cookie->dev, PS2_CMD_DISABLE, NULL, 0, NULL, 0, @@ -641,6 +642,15 @@ synaptics_close(void *_cookie) atomic_and(&cookie->dev->flags, ~PS2_FLAG_OPEN); atomic_and(&cookie->dev->flags, ~PS2_FLAG_ENABLED); + // Reset the touchpad so it generate standard ps2 packets instead of + // extended ones. If not, BeOS is confused with such packets when rebooting + // without a complete shutdown. + status = ps2_reset_mouse(cookie->dev); + if (status != B_OK) { + INFO("ps2: reset failed\n"); + return B_ERROR; + } + if (gTouchpadInfo.capPassThrough) ps2_service_notify_device_removed(gPassthroughDevice);