]> www.infradead.org Git - users/jedix/linux-maple.git/commit
Input: i8042 - break load dependency between atkbd/psmouse and i8042
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 25 Jul 2016 18:36:54 +0000 (11:36 -0700)
committerDhaval Giani <dhaval.giani@oracle.com>
Fri, 20 Jan 2017 22:22:08 +0000 (17:22 -0500)
commit037ad9d4083f7dd19ee8a0e8b8f9648e740b38a8
tree84792a4a39a4df1fbb153d566a290c97c51c97ce
parent3167e89739851344ed25331a91732100d0fef990
Input: i8042 - break load dependency between atkbd/psmouse and i8042

Orabug: 25308136

[ Upstream commit 4097461897df91041382ff6fcd2bfa7ee6b2448c ]

As explained in 1407814240-4275-1-git-send-email-decui@microsoft.com we
have a hard load dependency between i8042 and atkbd which prevents
keyboard from working on Gen2 Hyper-V VMs.

> hyperv_keyboard invokes serio_interrupt(), which needs a valid serio
> driver like atkbd.c.  atkbd.c depends on libps2.c because it invokes
> ps2_command().  libps2.c depends on i8042.c because it invokes
> i8042_check_port_owner().  As a result, hyperv_keyboard actually
> depends on i8042.c.
>
> For a Generation 2 Hyper-V VM (meaning no i8042 device emulated), if a
> Linux VM (like Arch Linux) happens to configure CONFIG_SERIO_I8042=m
> rather than =y, atkbd.ko can't load because i8042.ko can't load(due to
> no i8042 device emulated) and finally hyperv_keyboard can't work and
> the user can't input: https://bugs.archlinux.org/task/39820
> (Ubuntu/RHEL/SUSE aren't affected since they use CONFIG_SERIO_I8042=y)

To break the dependency we move away from using i8042_check_port_owner()
and instead allow serio port owner specify a mutex that clients should use
to serialize PS/2 command stream.

Reported-by: Mark Laws <mdl@60hz.org>
Tested-by: Mark Laws <mdl@60hz.org>
Cc: stable@vger.kernel.org
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
(cherry picked from commit b5e8e7f655d3d01430c357bdebe72a6ddc19e9a7)
Signed-off-by: Dhaval Giani <dhaval.giani@oracle.com>
drivers/input/serio/i8042.c
drivers/input/serio/libps2.c
include/linux/i8042.h
include/linux/serio.h