From ab89b2f0c928afb2833dce69ee4442056c2b1540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sun, 5 Apr 2009 08:18:53 +0000 Subject: [PATCH] Patch by Olivier Coursiere: Reset the touchpad mode when closing the device. Will be useful when (input) devices are closed during shutdown. (app_server and input_server are never quit during shutdown, so the drivers are not closed either.) Apparently, the touchpad will remain as configured before, on a soft reset which confuses for example BeOS, when it's booted after Haiku. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29920 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/bus_managers/ps2/ps2_dev.c | 2 +- src/add-ons/kernel/bus_managers/ps2/ps2_dev.h | 2 ++ src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c | 10 ++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) 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);