Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision decfc8d1ee4490ba5e7b9b806d65f5fe006ec089)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision 3d8a3bd8e7d58487ec7bfeb137b908371b06f5f9)
@@ -402,5 +402,5 @@
 }
 
-static void hc_handle_event(xhci_hc_t *hc, xhci_trb_t *trb)
+static void hc_handle_event(xhci_hc_t *hc, xhci_trb_t *trb, xhci_interrupter_regs_t *intr)
 {
 	usb_log_debug2("TRB event encountered.");
@@ -410,4 +410,14 @@
 		break;
 	case XHCI_TRB_TYPE_PORT_STATUS_CHANGE_EVENT:
+		/**
+		 * TODO: This is a very crude hotfix, I'm not sure if
+		 *       we can do this one level above in the event handling
+		 *       loop (incase the xHC adds more events while we process events).
+		 */
+		hc->event_ring.dequeue_ptr = host2xhci(64, addr_to_phys(hc->event_ring.dequeue_trb));
+		uint64_t erdp = hc->event_ring.dequeue_ptr;
+		XHCI_REG_WR(intr, XHCI_INTR_ERDP_LO, LOWER32(erdp));
+		XHCI_REG_WR(intr, XHCI_INTR_ERDP_HI, UPPER32(erdp));
+		XHCI_REG_SET(intr, XHCI_INTR_ERDP_EHB, 1);
 		xhci_handle_port_status_change_event(hc, trb);
 		break;
@@ -430,5 +440,5 @@
 					xhci_trb_str_type(TRB_TYPE(trb)));
 
-			hc_handle_event(hc, &trb);
+			hc_handle_event(hc, &trb, intr);
 		} else {
 			usb_log_warning("Error while accessing event ring: %s", str_error(err));
Index: uspace/drv/bus/usb/xhci/trb_ring.c
===================================================================
--- uspace/drv/bus/usb/xhci/trb_ring.c	(revision decfc8d1ee4490ba5e7b9b806d65f5fe006ec089)
+++ uspace/drv/bus/usb/xhci/trb_ring.c	(revision 3d8a3bd8e7d58487ec7bfeb137b908371b06f5f9)
@@ -121,4 +121,7 @@
 int xhci_trb_ring_fini(xhci_trb_ring_t *ring)
 {
+	if (!ring)
+		return EOK;
+
 	list_foreach(ring->segments, segments_link, trb_segment_t, segment)
 		dmamem_unmap_anonymous(segment);
