diff -ru ccid-1.4.6/src/commands.c ccid-1.4.6.new//src/commands.c
--- ccid-1.4.6/src/commands.c	2012-03-30 10:42:20.000000000 +0200
+++ ccid-1.4.6.new//src/commands.c	2012-05-26 10:52:44.961512265 +0200
@@ -79,6 +79,19 @@
 static unsigned int bei2i(unsigned char *buffer);
 
 
+static int status2IFD(status_t status) {
+	switch(status) {
+	case STATUS_SUCCESS: return IFD_SUCCESS;
+	case STATUS_NO_SUCH_DEVICE: return IFD_NO_SUCH_DEVICE;
+
+	default:
+		break;
+	}
+
+	return IFD_COMMUNICATION_ERROR;
+}
+
+
 /*****************************************************************************
  *
  *					CmdPowerOn
@@ -212,7 +225,8 @@
 
 	res = WritePort(reader_index, sizeof(cmd), cmd);
 	if (res != STATUS_SUCCESS)
-		return IFD_COMMUNICATION_ERROR;
+		return status2IFD(res);
+
 
 	/* reset available buffer size */
 	/* needed if we go back after a switch to ISO mode */
@@ -292,6 +306,7 @@
 	PIN_VERIFY_STRUCTURE *pvs;
 	_ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
 	int old_read_timeout;
+	status_t res;
 	RESPONSECODE ret;
 
 	pvs = (PIN_VERIFY_STRUCTURE *)TxBuffer;
@@ -464,10 +479,10 @@
 
 	old_read_timeout = ccid_descriptor -> readTimeout;
 	ccid_descriptor -> readTimeout = max(90, TxBuffer[0]+10)*1000;	/* at least 90 seconds */
-
-	if (WritePort(reader_index, a, cmd) != STATUS_SUCCESS)
+	res=WritePort(reader_index, a, cmd);
+	if (res != STATUS_SUCCESS)
 	{
-		ret = IFD_COMMUNICATION_ERROR;
+		ret = status2IFD(res);
 		goto end;
 	}
 
@@ -553,6 +568,7 @@
 	PIN_MODIFY_STRUCTURE *pms;
 	_ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
 	int old_read_timeout;
+	status_t res;
 	RESPONSECODE ret;
 #ifdef BOGUS_PINPAD_FIRMWARE
 	int bNumberMessage = 0; /* for GemPC Pinpad */
@@ -747,10 +763,10 @@
 
 	old_read_timeout = ccid_descriptor -> readTimeout;
 	ccid_descriptor -> readTimeout = max(90, TxBuffer[0]+10)*1000;	/* at least 90 seconds */
-
-	if (WritePort(reader_index, a, cmd) != STATUS_SUCCESS)
+	res=WritePort(reader_index, a, cmd);
+	if (res != STATUS_SUCCESS)
 	{
-		ret = IFD_COMMUNICATION_ERROR;
+		ret = status2IFD(res); 
 		goto end;
 	}
 
@@ -828,13 +844,12 @@
 
 	/* copy the command */
 	memcpy(&cmd_in[10], TxBuffer, TxLength);
-
 	res = WritePort(reader_index, length_in, cmd_in);
 	free(cmd_in);
 	if (res != STATUS_SUCCESS)
 	{
 		free(cmd_out);
-		return_value = IFD_COMMUNICATION_ERROR;
+		return_value = status2IFD(res); 
 		goto end;
 	}
 
@@ -954,7 +969,7 @@
 
 	res = WritePort(reader_index, sizeof(cmd), cmd);
 	if (res != STATUS_SUCCESS)
-		return IFD_COMMUNICATION_ERROR;
+		return status2IFD(res); 
 
 	length = sizeof(cmd);
 	res = ReadPort(reader_index, &length, cmd);
@@ -1075,9 +1090,7 @@
 	res = WritePort(reader_index, sizeof(cmd), cmd);
 	if (res != STATUS_SUCCESS)
 	{
-		if (STATUS_NO_SUCH_DEVICE == res)
-			return IFD_NO_SUCH_DEVICE;
-		return IFD_COMMUNICATION_ERROR;
+		return status2IFD(res);
 	}
 
 	length = SIZE_GET_SLOT_STATUS;
@@ -1171,7 +1184,7 @@
 	unsigned char cmd[10+tx_length];	/* CCID + APDU buffer */
 	_ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
 	status_t ret;
-
+	Log1(PCSC_LOG_INFO, "entering CCID_Transmit");
 #ifndef TWIN_SERIAL
 	if (PROTOCOL_ICCD_A == ccid_descriptor->bInterfaceProtocol)
 	{
@@ -1226,10 +1239,8 @@
 	memcpy(cmd+10, tx_buffer, tx_length);
 
 	ret = WritePort(reader_index, 10+tx_length, cmd);
-	if (STATUS_NO_SUCH_DEVICE == ret)
-		return IFD_NO_SUCH_DEVICE;
 	if (ret != STATUS_SUCCESS)
-		return IFD_COMMUNICATION_ERROR;
+		return status2IFD(ret);
 
 	return IFD_SUCCESS;
 } /* CCID_Transmit */
@@ -1503,6 +1514,7 @@
 	}
 
 send_next_block:
+
 	return_value = CCID_Transmit(reader_index, local_tx_length, tx_buffer,
 		chain_parameter, 0);
 	if (return_value != IFD_SUCCESS)
@@ -2104,6 +2116,7 @@
 RESPONSECODE SetParameters(unsigned int reader_index, char protocol,
 	unsigned int length, unsigned char buffer[])
 {
+	status_t res;
 	unsigned char cmd[10+length];	/* CCID + APDU buffer */
 	_ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
 
@@ -2117,9 +2130,9 @@
 	cmd[8] = cmd[9] = 0; /* RFU */
 
 	memcpy(cmd+10, buffer, length);
-
-	if (WritePort(reader_index, 10+length, cmd) != STATUS_SUCCESS)
-		return IFD_COMMUNICATION_ERROR;
+	res=WritePort(reader_index, 10+length, cmd);
+	if (res != STATUS_SUCCESS)
+		return status2IFD(res);
 
 	length = sizeof(cmd);
 	if (ReadPort(reader_index, &length, cmd) != STATUS_SUCCESS)
diff -ru ccid-1.4.6/src/openct/proto-t1.c ccid-1.4.6.new//src/openct/proto-t1.c
--- ccid-1.4.6/src/openct/proto-t1.c	2011-01-29 14:59:41.000000000 +0100
+++ ccid-1.4.6.new//src/openct/proto-t1.c	2012-05-26 10:55:11.866240723 +0200
@@ -664,8 +664,10 @@
 		rmax = 3;
 
 		n = CCID_Transmit(t1 -> lun, slen, block, rmax, t1->wtx);
-		if (n != IFD_SUCCESS)
-			return n;
+		if (n != IFD_SUCCESS) {
+			printf("Return Error code:-1 (1)\n");
+			return -1;
+		}
 
 		/* the second argument of CCID_Receive() is (unsigned int *)
 		 * so we can't use &rmax since &rmax is a (size_t *) and may not
@@ -681,8 +683,10 @@
 		rmax = block[2] + 1;
 
 		n = CCID_Transmit(t1 -> lun, 0, block, rmax, t1->wtx);
-		if (n != IFD_SUCCESS)
-			return n;
+		if (n != IFD_SUCCESS) {
+			printf("Return Error code:-1 (2)\n");
+			return -1;
+		}
 
 		rmax_int = rmax;
 		n = CCID_Receive(t1 -> lun, &rmax_int, &block[3], NULL);
@@ -698,8 +702,10 @@
 	{
 		n = CCID_Transmit(t1 -> lun, slen, block, 0, t1->wtx);
 		t1->wtx = 0;	/* reset to default value */
-		if (n != IFD_SUCCESS)
-			return n;
+		if (n != IFD_SUCCESS) {
+			printf("Return Error code: -1 (3)\n");
+			return -1;
+		}
 
 		/* Get the response en bloc */
 		rmax_int = rmax;
