+ req->flags = flags;
+ req->command = ISO15693_CMD_INVENTORY;
+ if (flags & RFID_15693_F5_AFI_PRES)
+ req->data[i++] = afi;
+ req->data[i++] = mask_len;
+
+ for (j = 0; j < mask_len; j++)
+ req->data[i++] = mask[j];
+
+ return i + sizeof(*req);
+}
+
+static int
+iso15693_anticol(struct rfid_layer2_handle *handle)
+{
+ int i, ret;
+ int tx_len, rx_len;
+ int num_valid = 0;
+ union {
+ struct iso15693_anticol_cmd_afi w_afi;
+ struct iso15693_anticol_cmd no_afi;
+ } acf;
+
+ struct iso15693_anticol_resp resp;
+
+ char boc;
+#define MAX_SLOTS 16
+ int num_slots = MAX_SLOTS;
+
+ u_int8_t uuid_list[MAX_SLOTS][ISO15693_UID_LEN];
+ int uuid_list_valid[MAX_SLOTS];
+
+ u_int8_t flags;
+
+#define MY_NONE 0
+#define MY_COLL 1
+#define MY_UUID 2
+
+ memset(uuid_list_valid, MY_NONE, sizeof(uuid_list_valid));
+ memset(uuid_list, 0, sizeof(uuid_list));
+
+ //memset(&acf, 0, sizeof(acf));
+
+ /* FIXME: we can't use multiple slots at this point, since the RC632
+ * with librfid on the host PC has too much latency between 'EOF pulse
+ * to mark start of next slot' and 'receive data' commands :( */
+
+ flags = RFID_15693_F_INV_TABLE_5;
+ if (handle->priv.iso15693.vicc_fast)
+ flags |= RFID_15693_F_RATE_HIGH;
+ if (handle->priv.iso15693.vicc_two_subc)
+ flags |= RFID_15693_F_SUBC_TWO;
+ if (handle->priv.iso15693.single_slot) {
+ flags |= RFID_15693_F5_NSLOTS_1;
+ num_slots = 1;
+ }
+ if (handle->priv.iso15693.use_afi)
+ flags |= RFID_15693_F5_AFI_PRES;
+
+ tx_len = iso15693_build_acf((u_int8_t *)&acf, flags,
+ handle->priv.iso15693.afi, 0, NULL);
+
+ for (i = 0; i < num_slots; i++) {
+ rx_len = sizeof(resp);
+ ret = iso15693_transceive_acf(handle, (u_int8_t *) &acf, tx_len, &resp, &rx_len, &boc);
+ if (ret == -ETIMEDOUT) {
+ DEBUGP("no answer from vicc in slot %d\n", i);
+ uuid_list_valid[i] = MY_NONE;
+ } else if (ret < 0) {
+ DEBUGP("ERROR ret: %d, slot %d\n", ret, i);
+ uuid_list_valid[i] = MY_NONE;
+ } else {
+
+ if (boc) {
+ DEBUGP("Collision during anticol. slot %d bit %d\n",
+ i, boc);
+ uuid_list_valid[i] = -boc;
+ memcpy(uuid_list[i], resp.uuid, ISO15693_UID_LEN);
+ } else {
+ DEBUGP("Slot %d ret: %d UUID: %s\n", i, ret,
+ rfid_hexdump(resp.uuid, ISO15693_UID_LEN));
+ uuid_list_valid[i] = MY_UUID;
+ memcpy(&uuid_list[i][0], resp.uuid, ISO15693_UID_LEN);
+ }
+ }