Index: uspace/app/nic/nic.c
===================================================================
--- uspace/app/nic/nic.c	(revision af2a76c3fbf1a0a9aee19905c674ce43f4ffc6db)
+++ uspace/app/nic/nic.c	(revision 7493e7b128b8fc8029d87ee738eedfbec825e676)
@@ -45,6 +45,9 @@
 
 typedef struct {
+	nic_device_info_t device_info;
 	nic_address_t address;
 	nic_cable_state_t link_state;
+	nic_channel_mode_t duplex;
+	int speed;
 } nic_info_t;
 
@@ -59,4 +62,5 @@
 {
 	async_sess_t *sess;
+	nic_role_t role;
 	int rc;
 
@@ -75,4 +79,11 @@
 	}
 
+	rc = nic_get_device_info(sess, &info->device_info);
+	if (rc != EOK) {
+		printf("Error getting NIC device info.\n");
+		rc = EIO;
+		goto error;
+	}
+
 	rc = nic_get_cable_state(sess, &info->link_state);
 	if (rc != EOK) {
@@ -81,4 +92,12 @@
 		goto error;
 	}
+
+	rc = nic_get_operation_mode(sess, &info->speed, &info->duplex, &role);
+	if (rc != EOK) {
+		printf("Error getting NIC speed and duplex mode.\n");
+		rc = EIO;
+		goto error;
+	}
+
 
 	return EOK;
@@ -93,4 +112,13 @@
 	case NIC_CS_PLUGGED: return "up";
 	case NIC_CS_UNPLUGGED: return "down";
+	default: assert(false); return NULL;
+	}
+}
+
+static const char *nic_duplex_mode_str(nic_channel_mode_t mode)
+{
+	switch (mode) {
+	case NIC_CM_FULL_DUPLEX: return "full-duplex";
+	case NIC_CM_HALF_DUPLEX: return "half-duplex";
 	default: assert(false); return NULL;
 	}
@@ -133,5 +161,5 @@
 	}
 
-	printf("[Address] [Link State] [Service Name]\n");
+	printf("[Address] [Service Name]\n");
 	for (i = 0; i < count; i++) {
 		rc = loc_service_get_name(nics[i], &svc_name);
@@ -152,6 +180,16 @@
 		}
 
-		printf("%s %s %s\n", addr_str,
-		    nic_link_state_str(nic_info.link_state), svc_name);
+		printf("%s %s\n", addr_str, svc_name);
+		printf("\tVendor name: %s\n",
+		    nic_info.device_info.vendor_name);
+		printf("\tModel name: %s\n",
+		    nic_info.device_info.model_name);
+		printf("\tLink state: %s\n",
+		    nic_link_state_str(nic_info.link_state));
+
+		if (nic_info.link_state == NIC_CS_PLUGGED) {
+			printf("\tSpeed: %dMbps %s\n", nic_info.speed,
+			    nic_duplex_mode_str(nic_info.duplex));
+		}
 
 		free(svc_name);
Index: uspace/lib/drv/generic/remote_nic.c
===================================================================
--- uspace/lib/drv/generic/remote_nic.c	(revision af2a76c3fbf1a0a9aee19905c674ce43f4ffc6db)
+++ uspace/lib/drv/generic/remote_nic.c	(revision 7493e7b128b8fc8029d87ee738eedfbec825e676)
@@ -288,16 +288,16 @@
 	async_exch_t *exch = async_exchange_begin(dev_sess);
 	
-	int rc = async_req_1_0(exch, DEV_IFACE_ID(NIC_DEV_IFACE),
-	    NIC_GET_DEVICE_INFO);
-	if (rc != EOK) {
-		async_exchange_end(exch);
+	aid_t aid = async_send_1(exch, DEV_IFACE_ID(NIC_DEV_IFACE),
+	    NIC_GET_DEVICE_INFO, NULL);
+	int rc = async_data_read_start(exch, device_info, sizeof(nic_device_info_t));
+	async_exchange_end(exch);
+
+	sysarg_t res;
+	async_wait_for(aid, &res);
+	
+	if (rc != EOK)
 		return rc;
-	}
-	
-	rc = async_data_read_start(exch, device_info, sizeof(nic_device_info_t));
-	
-	async_exchange_end(exch);
-	
-	return rc;
+	
+	return (int) res;
 }
 
