Index: uspace/drv/usbmouse/mouse.c
===================================================================
--- uspace/drv/usbmouse/mouse.c	(revision 140c03318a1ee75de1ade2a03d1d2511431e2d9e)
+++ uspace/drv/usbmouse/mouse.c	(revision 3faf416ce37ffbf7df67fe86c4f559fa80980afb)
@@ -37,4 +37,5 @@
 #include <usb/debug.h>
 #include <errno.h>
+#include <str_error.h>
 #include <ipc/mouse.h>
 
@@ -64,12 +65,32 @@
 
 		size_t actual_size;
+		int rc;
 
-		/* FIXME: check for errors. */
-		usb_endpoint_pipe_start_session(&mouse->poll_pipe);
+		/*
+		 * Error checking note:
+		 * - failure when starting a session is considered
+		 *   temporary (e.g. out of phones, next try might succeed)
+		 * - failure of transfer considered fatal (probably the
+		 *   device was unplugged)
+		 * - session closing not checked (shall not fail anyway)
+		 */
 
-		usb_endpoint_pipe_read(&mouse->poll_pipe,
+		rc = usb_endpoint_pipe_start_session(&mouse->poll_pipe);
+		if (rc != EOK) {
+			usb_log_warning("Failed to start session, will try again: %s.\n",
+			    str_error(rc));
+			continue;
+		}
+
+		rc = usb_endpoint_pipe_read(&mouse->poll_pipe,
 		    buffer, buffer_size, &actual_size);
 
 		usb_endpoint_pipe_end_session(&mouse->poll_pipe);
+
+		if (rc != EOK) {
+			usb_log_error("Failed reading mouse input: %s.\n",
+			    str_error(rc));
+			break;
+		}
 
 		uint8_t butt = buffer[0];
@@ -115,4 +136,14 @@
 	}
 
+	/*
+	 * Device was probably unplugged.
+	 * Hang-up the phone to the console.
+	 * FIXME: release allocated memory.
+	 */
+	async_hangup(mouse->console_phone);
+	mouse->console_phone = -1;
+
+	usb_log_error("Mouse polling fibril terminated.\n");
+
 	return EOK;
 }
