[Just noticed this didn't make it to the list because I sent
from a non-subscribed address. Resending.]

Hi Ludovic,

On Mon, Feb 01, 2010 at 03:52:07PM +0100, Ludovic Rousseau wrote:
> Souldn't you test the buffer[ERROR_OFFSET] value to be sure you do not
> ignore valid error codes?

Yep. Explicitly testing for HW_ERROR now.

> In the case of BCM588. I suggest to just correct the
> buffer[ERROR_OFFSET] and buffer[STATUS_OFFSET] bytes.
> And wrap the code inside a #ifdef BOGUS_BROADCOM_FIRMWARE like for the
> other BOGUS_* patches.

See below. I also made it log the values of both STATUS 
and ERROR register before correcting them to give a clear
trace of their previous values.

Anyone here who has a BCM588x and would be willing to 
test the change? Unfortunately I don't have access to
this reader anymore.

        Max

--- ccid-1.3.11/src/ccid.h
+++ ccid-1.3.11/src/ccid.h
@@ -172,6 +172,8 @@ typedef struct
 #define OZ776          0x0B977762
 #define OZ776_7772     0x0B977772
 #define SPR532         0x04E6E003
+#define BCM5880                0x0a5c5800
+#define BCM5881                0x0a5c5801
 #define MYSMARTPAD     0x09BE0002
 #define CHERRYXX44     0x046a0010
 #define CL1356D                0x0B810200
--- ccid-1.3.11/src/commands.c
+++ ccid-1.3.11/src/commands.c
@@ -47,6 +47,11 @@
  * of 260 bytes since the driver check this value */
 #define BOGUS_SCM_FIRMWARE_FOR_dwMaxCCIDMessageLength
 
+/* The firmware of Broadcom BCM5880/BCM5881 returns HW_ERROR if
+ * no card is inserted. This workaround turns the error into a "no
+ * card inserted, no error" status. */
+#define BOGUS_BCM588X_FIRMWARE
+
 #define max( a, b )   ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )
 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
 #define IFD_ERROR_INSUFFICIENT_BUFFER 700
@@ -1009,8 +1014,41 @@ again_status:
 #endif
                ccid_error(buffer[ERROR_OFFSET], __FILE__, __LINE__, 
__FUNCTION__);    /* bError */
 
+#ifdef BOGUS_BCM588X_FIRMWARE
+               /*
+                * Special case for BCM5880/5881 readers since they
+                * answer with HW_ERROR if no card is inserted. We still
+                * log the error but turn it into "no card inserted".
+                */
+
+               if ((BCM5880 == ccid_descriptor->readerID
+                   || BCM5881 == ccid_descriptor->readerID)
+                   && buffer[ERROR_OFFSET] == 0xFB)
+               {
+                       log_msg(PCSC_LOG_ERROR, "%s:%d:%s "
+                               "Firmware workaround for BCM5880/1 "
+                               "(status=%#02x error=%#02x)",
+                               __FILE__, __LINE__, __FUNCTION__,
+                               buffer[STATUS_OFFSET],
+                               buffer[ERROR_OFFSET]);
+
+                       /*
+                        * bmICCStatus: 2 ("No ICC present")
+                        * bmCommandStatus: 0 ("Processed without error")
+                        */
+
+                       buffer[STATUS_OFFSET] = 0x02;
+
+                       /*
+                        * Clear error register.
+                        */
+
+                       buffer[ERROR_OFFSET] = 0x00;
+               }
+#endif
+
                /* card absent or mute is not an communication error */
-               if (buffer[ERROR_OFFSET] != 0xFE)
+               if (buffer[ERROR_OFFSET] != 0x00 && buffer[ERROR_OFFSET] != 
0xFE)
                        return_value = IFD_COMMUNICATION_ERROR;
        }

_______________________________________________
Muscle mailing list
[email protected]
http://lists.drizzle.com/mailman/listinfo/muscle

Reply via email to