Fix mifare authentication for multiple blocks
[librfid] / src / rfid_asic_rc632.c
index 6de9c11..803a09c 100644 (file)
 #include <errno.h>
 #include <sys/types.h>
 
-#include <rfid/rfid.h>
-#include <rfid/rfid_asic.h>
-#include <rfid/rfid_asic_rc632.h>
-#include <rfid/rfid_reader_cm5121.h>
-#include <rfid/rfid_layer2_iso14443a.h>
-#include <rfid/rfid_protocol_mifare_classic.h>
+#include <librfid/rfid.h>
+#include <librfid/rfid_asic.h>
+#include <librfid/rfid_asic_rc632.h>
+#include <librfid/rfid_reader_cm5121.h>
+#include <librfid/rfid_layer2_iso14443a.h>
+#include <librfid/rfid_protocol_mifare_classic.h>
 
 #include "rfid_iso14443_common.h"
 #include "rc632.h"
@@ -170,7 +170,8 @@ static int
 rc632_wait_idle(struct rfid_asic_handle *handle, u_int64_t timeout)
 {
        u_int8_t cmd = 0xff;
-       int ret;
+       int ret, cycles = 0;
+#define USLEEP_PER_CYCLE       128
 
        while (cmd != 0) {
                ret = rc632_reg_read(handle, RC632_REG_COMMAND, &cmd);
@@ -189,9 +190,14 @@ rc632_wait_idle(struct rfid_asic_handle *handle, u_int64_t timeout)
                                rc632_reg_read(handle, RC632_REG_ERROR_FLAG, &foo);
                }
 
-               usleep(100);
+               /* Abort after some timeout */
+               if (cycles > timeout*10/USLEEP_PER_CYCLE) {
+                       fprintf(stderr, "TIMEOUT!!\n");
+                       return -1;
+               }
 
-               /* Fixme: Abort after some timeout */
+               cycles++;
+               usleep(USLEEP_PER_CYCLE);
        }
 
        return 0;
@@ -1312,9 +1318,6 @@ rc632_mifare_auth(struct rfid_asic_handle *h, u_int8_t cmd, u_int32_t serno,
        //acmd.serno = htonl(serno);
        acmd.serno = serno;
 
-       ret = rc632_clear_bits(h, RC632_REG_CONTROL,
-                               RC632_CONTROL_CRYPTO1_ON);
-
        /* Clear Rx CRC */
        ret = rc632_clear_bits(h, RC632_REG_CHANNEL_REDUNDANCY,
                                RC632_CR_RX_CRC_ENABLE);