Index: uspace/drv/hid/ps2mouse/ps2mouse.c
===================================================================
--- uspace/drv/hid/ps2mouse/ps2mouse.c	(revision 5d50c419de1e8d7b6b57065ea652ba23b83e5a97)
+++ uspace/drv/hid/ps2mouse/ps2mouse.c	(revision b2f542a7efa3ca69bfbe7544962e906503d25b89)
@@ -212,4 +212,35 @@
 }
 
+/** Read fixed-size mouse packet.
+ *
+ * Continue reading until entire packet is received.
+ *
+ * @param mouse Mouse device
+ * @param pbuf Buffer for storing packet
+ * @param psize Packet size
+ *
+ * @return EOK on success or non-zero error code
+ */
+static int ps2_mouse_read_packet(ps2_mouse_t *mouse, void *pbuf, size_t psize)
+{
+	int rc;
+	size_t pos;
+	size_t nread;
+
+	pos = 0;
+	while (pos < psize) {
+		rc = chardev_read(mouse->chardev, pbuf + pos, psize - pos,
+		    &nread);
+		if (rc != EOK) {
+			ddf_msg(LVL_WARN, "Error reading packet.");
+			return rc;
+		}
+
+		pos += nread;
+	}
+
+	return EOK;
+}
+
 /** Get data and parse ps2 protocol packets.
  * @param arg Pointer to ps2_mouse_t structure.
@@ -219,5 +250,4 @@
 {
 	ps2_mouse_t *mouse = (ps2_mouse_t *) arg;
-	size_t nread;
 	int rc;
 
@@ -225,9 +255,7 @@
 	while (1) {
 		uint8_t packet[PS2_BUFSIZE] = {};
-		rc = chardev_read(mouse->chardev, packet, PS2_BUFSIZE, &nread);
-		if (rc != EOK || nread != PS2_BUFSIZE) {
-			ddf_msg(LVL_WARN, "Incorrect packet size: %zd.", nread);
+		rc = ps2_mouse_read_packet(mouse, packet, PS2_BUFSIZE);
+		if (rc != EOK)
 			continue;
-		}
 
 		ddf_msg(LVL_DEBUG2, "Got packet: %hhx:%hhx:%hhx.",
@@ -274,5 +302,4 @@
 {
 	ps2_mouse_t *mouse = (ps2_mouse_t *) arg;
-	size_t nread;
 	int rc;
 
@@ -280,10 +307,8 @@
 	while (1) {
 		uint8_t packet[INTELLIMOUSE_BUFSIZE] = {};
-		rc = chardev_read(mouse->chardev, packet, INTELLIMOUSE_BUFSIZE,
-		    &nread);
-		if (rc != EOK || nread != INTELLIMOUSE_BUFSIZE) {
-			ddf_msg(LVL_WARN, "Incorrect packet size: %zd.", nread);
+		rc = ps2_mouse_read_packet(mouse, packet, INTELLIMOUSE_BUFSIZE);
+		if (rc != EOK)
 			continue;
-		}
+
 		ddf_msg(LVL_DEBUG2, "Got packet: %hhx:%hhx:%hhx:%hhx.",
 		    packet[0], packet[1], packet[2], packet[3]);
