[Pcsclite-cvs-commit] r2358 - trunk/Drivers/ccid/src

Ludovic Rousseau rousseau at alioth.debian.org
Sat Jan 27 14:28:27 CET 2007


Author: rousseau
Date: 2007-01-27 14:28:26 +0100 (Sat, 27 Jan 2007)
New Revision: 2358

Modified:
   trunk/Drivers/ccid/src/commands.c
Log:
T0ProcACK(): use a hack to circumvent the Oz776 firmware bug with
commands of size modulo 64


Modified: trunk/Drivers/ccid/src/commands.c
===================================================================
--- trunk/Drivers/ccid/src/commands.c	2007-01-26 16:57:45 UTC (rev 2357)
+++ trunk/Drivers/ccid/src/commands.c	2007-01-27 13:28:26 UTC (rev 2358)
@@ -1202,15 +1202,42 @@
 
 		memset(tmp_buf, 0, sizeof(tmp_buf));
 
-		ret_len = remain_len;
-		return_value = CCID_Transmit(reader_index, 0, *snd_buf, ret_len, 0);
-		if (return_value != IFD_SUCCESS)
-			return return_value;
+#ifdef O2MICRO_OZ776_PATCH
+		if((0 != remain_len) && (0 == (remain_len + 10) % 64))
+        {
+			/* special hack to avoid a command of size modulo 64
+			 * we send two commands instead */
+            ret_len = 1;
+            return_value = CCID_Transmit(reader_index, 0, *snd_buf, ret_len, 0);
+            if (return_value != IFD_SUCCESS)
+                return return_value;
+            return_value = CCID_Receive(reader_index, &ret_len, tmp_buf, NULL);
+            if (return_value != IFD_SUCCESS)
+                return return_value;
 
-		return_value = CCID_Receive(reader_index, &ret_len, tmp_buf, NULL);
-		if (return_value != IFD_SUCCESS)
-			return return_value;
+            ret_len = remain_len - 1;
+            return_value = CCID_Transmit(reader_index, 0, *snd_buf, ret_len, 0);
+            if (return_value != IFD_SUCCESS)
+                return return_value;
+            return_value = CCID_Receive(reader_index, &ret_len, &tmp_buf[1],
+				NULL);
+            if (return_value != IFD_SUCCESS)
+                return return_value;
 
+            ret_len += 1;
+        }
+        else
+#endif
+		{
+			ret_len = remain_len;
+			return_value = CCID_Transmit(reader_index, 0, *snd_buf, ret_len, 0);
+			if (return_value != IFD_SUCCESS)
+				return return_value;
+
+			return_value = CCID_Receive(reader_index, &ret_len, tmp_buf, NULL);
+			if (return_value != IFD_SUCCESS)
+				return return_value;
+		}
 		memcpy(*rcv_buf, tmp_buf, remain_len);
 		*rcv_buf += remain_len, *rcv_len += remain_len;
 




More information about the Pcsclite-cvs-commit mailing list