Index: uspace/drv/uhci/root_hub/port.c
===================================================================
--- uspace/drv/uhci/root_hub/port.c	(revision 15701921a01f2a31b3a498f8f3fcc15ba16699ba)
+++ uspace/drv/uhci/root_hub/port.c	(revision 8f748215078e8edd57ba50ab2f9598013692e7b6)
@@ -33,14 +33,15 @@
 
 		/* read register value */
-		port_status_t port_status;
-		port_status.raw_value = pio_read_16(port_instance->address);
+		port_status_t port_status =
+			port_status_read(port_instance->address);
+//		port_status.raw_value = pio_read_16(port_instance->address);
 
 		/* debug print */
 		uhci_print_info("Port(%d) status %#.4x:\n",
-		  port_instance->number, port_status.raw_value);
-		print_port_status( &port_status );
-
-		if (port_status.status.connect_change) {
-			if (port_status.status.connected) {
+		  port_instance->number, port_status);
+		print_port_status( port_status );
+
+		if (port_status & STATUS_CONNECTED_CHANGED) {
+			if (port_status & STATUS_CONNECTED) {
 				/* assign address and report new device */
 				uhci_port_new_device(port_instance);
@@ -103,10 +104,19 @@
 
 	/* read register value */
-	port_status_t port_status;
-	port_status.raw_value = pio_read_16( port->address );
+	port_status_t port_status
+		= port_status_read(port->address);
 
 	/* enable port: register write */
+	if (enabled) {
+		port_status |= STATUS_ENABLED;
+	} else {
+		port_status &= ~STATUS_ENABLED;
+	}
+	port_status_write( port->address, port_status );
+
+/*
 	port_status.status.enabled = enabled;
 	pio_write_16( port->address, port_status.raw_value );
+*/
 
 	uhci_print_info( "%s port %d.\n",
Index: uspace/drv/uhci/root_hub/port.h
===================================================================
--- uspace/drv/uhci/root_hub/port.h	(revision 15701921a01f2a31b3a498f8f3fcc15ba16699ba)
+++ uspace/drv/uhci/root_hub/port.h	(revision 8f748215078e8edd57ba50ab2f9598013692e7b6)
@@ -39,9 +39,9 @@
 #include <stdint.h>
 
-typedef uint16_t uhci_port_reg_t;
+#include "port_status.h"
 
 typedef struct uhci_port
 {
-	uhci_port_reg_t *address;
+	port_status_t *address;
 	device_t *hc;
 	unsigned number;
@@ -51,5 +51,5 @@
 
 static inline void uhci_port_init(
-  uhci_port_t *port, uhci_port_reg_t *address, device_t *hc, unsigned number,
+  uhci_port_t *port, port_status_t *address, device_t *hc, unsigned number,
   unsigned usec)
 {
Index: uspace/drv/uhci/root_hub/port_status.c
===================================================================
--- uspace/drv/uhci/root_hub/port_status.c	(revision 15701921a01f2a31b3a498f8f3fcc15ba16699ba)
+++ uspace/drv/uhci/root_hub/port_status.c	(revision 8f748215078e8edd57ba50ab2f9598013692e7b6)
@@ -2,19 +2,34 @@
 #include <stdio.h>
 
+#include "debug.h"
 #include "port_status.h"
 
-void print_port_status( const port_status_t *status )
+struct flag_name
 {
-	assert( status );
-	printf( "\tsuspended: %s\n", status->status.suspended ? "YES" : "NO" );
-	printf( "\tin reset: %s\n", status->status.reset ? "YES" : "NO" );
-	printf( "\tlow speed: %s\n", status->status.low_speed ? "YES" : "NO" );
-	printf( "\tresume detected: %s\n", status->status.resume ? "YES" : "NO" );
-	printf( "\talways \"1\" reserved bit: %s\n",
-	  status->status.always_one ? "YES" : "NO" );
-	/* line status skipped */
-	printf( "\tenable/disable change: %s\n", status->status.enabled_change ? "YES" : "NO" );
-	printf( "\tport enabled: %s\n", status->status.enabled ? "YES" : "NO" );
-	printf( "\tconnect change: %s\n", status->status.connect_change ? "YES" : "NO" );
-	printf( "\tconnected: %s\n", status->status.connected ? "YES" : "NO" );
+	unsigned flag;
+	const char *name;
+};
+
+static const struct flag_name flags[] =
+{
+	{ STATUS_SUSPEND, "suspended" },
+	{ STATUS_IN_RESET, "in reset" },
+	{ STATUS_LOW_SPEED, "low speed device" },
+	{ STATUS_ALWAYS_ONE, "always 1 bit" },
+	{ STATUS_RESUME, "resume" },
+	{ STATUS_LINE_D_MINUS, "line D- value" },
+	{ STATUS_LINE_D_PLUS, "line D+ value" },
+	{ STATUS_ENABLED_CHANGED, "enabled changed" },
+	{ STATUS_ENABLED, "enabled" },
+	{ STATUS_CONNECTED_CHANGED, "connected changed" },
+	{ STATUS_CONNECTED, "connected" }
+};
+
+void print_port_status(port_status_t value)
+{
+	unsigned i = 0;
+	for (;i < sizeof(flags)/sizeof(struct flag_name); ++i) {
+		uhci_print_verbose("\t%s status: %s.\n", flags[i].name,
+		  value & flags[i].flag ? "ON" : "OFF");
+	}
 }
Index: uspace/drv/uhci/root_hub/port_status.h
===================================================================
--- uspace/drv/uhci/root_hub/port_status.h	(revision 15701921a01f2a31b3a498f8f3fcc15ba16699ba)
+++ uspace/drv/uhci/root_hub/port_status.h	(revision 8f748215078e8edd57ba50ab2f9598013692e7b6)
@@ -35,43 +35,32 @@
 #define DRV_UHCI_TD_PORT_STATUS_H
 
+#include <libarch/ddi.h>
 #include <stdint.h>
 
-struct port_register {
-	uint8_t connected:1;
-	uint8_t connect_change:1;
-	uint8_t enabled:1;
-	uint8_t enabled_change:1;
-	uint8_t line:2;
-	uint8_t resume:1;
-	const uint8_t always_one:1; /* reserved */
+typedef uint16_t port_status_t;
 
-	uint8_t low_speed:1;
-	uint8_t reset:1;
-	uint8_t :2; /* reserved */
-	uint8_t suspended:1;
-	uint8_t :3; /* reserved */
-	/* first byte */
-//	uint8_t :3; /* reserved */
-//	uint8_t suspended:1;
-//	uint8_t :2; /* reserved */
-//	uint8_t reset:1;
-//	uint8_t low_speed:1;
+enum {
+	STATUS_CONNECTED         = 1 << 0,
+	STATUS_CONNECTED_CHANGED = 1 << 1,
+	STATUS_ENABLED           = 1 << 2,
+	STATUS_ENABLED_CHANGED   = 1 << 3,
+	STATUS_LINE_D_PLUS       = 1 << 4,
+	STATUS_LINE_D_MINUS      = 1 << 5,
+	STATUS_RESUME            = 1 << 6,
+	STATUS_ALWAYS_ONE        = 1 << 7,
 
-	/* second byte */
-//	uint8_t :1; /* reserved */
-//	uint8_t resume:1;
-//	uint8_t line:2;
-//	uint8_t enabled_change:1;
-//	uint8_t enabled:1;
-//	uint8_t connect_change:1;
-//	uint8_t connected:1;
-} __attribute__((packed));
+	STATUS_LOW_SPEED = 1 <<  8,
+	STATUS_IN_RESET  = 1 <<  9,
+	STATUS_SUSPEND   = 1 << 12,
+};
 
-typedef union port_status {
-	struct port_register status;
-	uint16_t raw_value;
-} port_status_t;
+static inline port_status_t port_status_read(port_status_t * address)
+	{ return pio_read_16(address); }
 
-void print_port_status( const port_status_t *status );
+static inline void port_status_write(
+  port_status_t * address, port_status_t value)
+	{ pio_write_16(address, value); }
+
+void print_port_status(const port_status_t status);
 #endif
 /**
Index: uspace/drv/uhci/root_hub/root_hub.c
===================================================================
--- uspace/drv/uhci/root_hub/root_hub.c	(revision 15701921a01f2a31b3a498f8f3fcc15ba16699ba)
+++ uspace/drv/uhci/root_hub/root_hub.c	(revision 8f748215078e8edd57ba50ab2f9598013692e7b6)
@@ -15,7 +15,7 @@
 
 	/* allow access to root hub registers */
-	uhci_port_reg_t *regs;
+	port_status_t *regs;
 	const int ret = pio_enable(
-	  addr, sizeof(uhci_port_reg_t) * UHCI_ROOT_HUB_PORT_COUNT, (void**)&regs);
+	  addr, sizeof(port_status_t) * UHCI_ROOT_HUB_PORT_COUNT, (void**)&regs);
 
 	if (ret < 0) {
