Skip to content

Commit

Permalink
Input: vmmouse - remove port reservation
Browse files Browse the repository at this point in the history
The VMWare EFI BIOS will expose port 0x5658 as an ACPI resource.  This
causes the port to be reserved by the APCI module as the system comes up,
making it unavailable to be reserved again by other drivers, thus
preserving this VMWare port for special use in a VMWare guest.

This port is designed to be shared among multiple VMWare services, such as
the VMMOUSE.  Because of this, VMMOUSE should not try to reserve this port
on its own.

The VMWare non-EFI BIOS does not do this to preserve compatibility with
existing/legacy VMs.  It is known that there is small chance a VM may be
configured such that these ports get reserved by other non-VMWare devices,
and if this ever happens, the result is undefined.

Signed-off-by: Sinclair Yeh <syeh@vmware.com>
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
Cc: <stable@vger.kernel.org> # 4.1-
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
  • Loading branch information
Sinclair Yeh authored and Dmitry Torokhov committed Jun 24, 2016
1 parent 226ba70 commit 60842ef
Showing 1 changed file with 2 additions and 20 deletions.
22 changes: 2 additions & 20 deletions drivers/input/mouse/vmmouse.c
Original file line number Diff line number Diff line change
Expand Up @@ -355,27 +355,18 @@ int vmmouse_detect(struct psmouse *psmouse, bool set_properties)
return -ENXIO;
}

if (!request_region(VMMOUSE_PROTO_PORT, 4, "vmmouse")) {
psmouse_dbg(psmouse, "VMMouse port in use.\n");
return -EBUSY;
}

/* Check if the device is present */
response = ~VMMOUSE_PROTO_MAGIC;
VMMOUSE_CMD(GETVERSION, 0, version, response, dummy1, dummy2);
if (response != VMMOUSE_PROTO_MAGIC || version == 0xffffffffU) {
release_region(VMMOUSE_PROTO_PORT, 4);
if (response != VMMOUSE_PROTO_MAGIC || version == 0xffffffffU)
return -ENXIO;
}

if (set_properties) {
psmouse->vendor = VMMOUSE_VENDOR;
psmouse->name = VMMOUSE_NAME;
psmouse->model = version;
}

release_region(VMMOUSE_PROTO_PORT, 4);

return 0;
}

Expand All @@ -394,7 +385,6 @@ static void vmmouse_disconnect(struct psmouse *psmouse)
psmouse_reset(psmouse);
input_unregister_device(priv->abs_dev);
kfree(priv);
release_region(VMMOUSE_PROTO_PORT, 4);
}

/**
Expand Down Expand Up @@ -438,15 +428,10 @@ int vmmouse_init(struct psmouse *psmouse)
struct input_dev *rel_dev = psmouse->dev, *abs_dev;
int error;

if (!request_region(VMMOUSE_PROTO_PORT, 4, "vmmouse")) {
psmouse_dbg(psmouse, "VMMouse port in use.\n");
return -EBUSY;
}

psmouse_reset(psmouse);
error = vmmouse_enable(psmouse);
if (error)
goto release_region;
return error;

priv = kzalloc(sizeof(*priv), GFP_KERNEL);
abs_dev = input_allocate_device();
Expand Down Expand Up @@ -502,8 +487,5 @@ int vmmouse_init(struct psmouse *psmouse)
kfree(priv);
psmouse->private = NULL;

release_region:
release_region(VMMOUSE_PROTO_PORT, 4);

return error;
}

0 comments on commit 60842ef

Please sign in to comment.