+static int
+iso14443a_setopt(struct rfid_layer2_handle *handle, int optname,
+ const void *optval, unsigned int optlen)
+{
+ int ret = -EINVAL;
+ const struct rfid_reader *rdr = handle->rh->reader;
+ unsigned int speed;
+
+ switch (optname) {
+ case RFID_OPT_14443A_SPEED_RX:
+ if (!rdr->iso14443a.set_speed)
+ return -ENOTSUP;
+ speed = *(unsigned int *)optval;
+ ret = rdr->iso14443a.set_speed(handle->rh, 0, speed);
+ break;
+ case RFID_OPT_14443A_SPEED_TX:
+ if (!rdr->iso14443a.set_speed)
+ return -ENOTSUP;
+ speed = *(unsigned int *)optval;
+ ret = rdr->iso14443a.set_speed(handle->rh, 1, speed);
+ break;
+ case RFID_OPT_14443A_WUPA:
+ if((unsigned int*)optval)
+ handle->flags |= RFID_OPT_LAYER2_WUP;
+ else
+ handle->flags &= ~RFID_OPT_LAYER2_WUP;
+ ret = 0;
+ break;
+ };
+
+ return ret;
+}
+
+static int
+iso14443a_getopt(struct rfid_layer2_handle *handle, int optname,
+ void *optval, unsigned int *optlen)
+{
+ int ret = -EINVAL;
+ struct iso14443a_handle *h = &handle->priv.iso14443a;
+ struct iso14443a_atqa *atqa = optval;
+ u_int8_t *opt_u8 = optval;
+ int *wupa = optval;
+
+ switch (optname) {
+ case RFID_OPT_14443A_SAK:
+ *opt_u8 = h->sak;
+ *optlen = sizeof(*opt_u8);
+ break;
+ case RFID_OPT_14443A_ATQA:
+ *atqa = h->atqa;
+ *optlen = sizeof(*atqa);
+ ret = 0;
+ break;
+ case RFID_OPT_14443A_WUPA:
+ *wupa = ((handle->flags & RFID_OPT_LAYER2_WUP) != 0);
+ *optlen = sizeof(*wupa);
+ ret = 0;
+ break;
+ };
+
+ return ret;
+}
+
+