in pn533/pn533.c [1626:1739]
static int pn533_start_poll(struct nfc_dev *nfc_dev,
u32 im_protocols, u32 tm_protocols)
{
struct pn533 *dev = nfc_get_drvdata(nfc_dev);
struct pn533_poll_modulations *cur_mod;
struct sk_buff *skb;
u8 rand_mod;
int rc;
dev_dbg(dev->dev,
"%s: im protocols 0x%x tm protocols 0x%x\n",
__func__, im_protocols, tm_protocols);
if (dev->tgt_active_prot) {
nfc_err(dev->dev,
"Cannot poll with a target already activated\n");
return -EBUSY;
}
if (dev->tgt_mode) {
nfc_err(dev->dev,
"Cannot poll while already being activated\n");
return -EBUSY;
}
if (tm_protocols) {
dev->gb = nfc_get_local_general_bytes(nfc_dev, &dev->gb_len);
if (dev->gb == NULL)
tm_protocols = 0;
}
dev->poll_protocols = im_protocols;
dev->listen_protocols = tm_protocols;
if (dev->device_type == PN533_DEVICE_PN532_AUTOPOLL) {
skb = pn533_alloc_skb(dev, 4 + 6);
if (!skb)
return -ENOMEM;
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_POLLNR_INFINITE;
*((u8 *)skb_put(skb, sizeof(u8))) = PN532_AUTOPOLL_PERIOD;
if ((im_protocols & NFC_PROTO_MIFARE_MASK) &&
(im_protocols & NFC_PROTO_ISO14443_MASK) &&
(im_protocols & NFC_PROTO_NFC_DEP_MASK))
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_TYPE_GENERIC_106;
else {
if (im_protocols & NFC_PROTO_MIFARE_MASK)
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_TYPE_MIFARE;
if (im_protocols & NFC_PROTO_ISO14443_MASK)
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_TYPE_ISOA;
if (im_protocols & NFC_PROTO_NFC_DEP_MASK) {
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_TYPE_DEP_PASSIVE_106;
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_TYPE_DEP_PASSIVE_212;
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_TYPE_DEP_PASSIVE_424;
}
}
if (im_protocols & NFC_PROTO_FELICA_MASK ||
im_protocols & NFC_PROTO_NFC_DEP_MASK) {
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_TYPE_FELICA212;
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_TYPE_FELICA424;
}
if (im_protocols & NFC_PROTO_JEWEL_MASK)
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_TYPE_JEWEL;
if (im_protocols & NFC_PROTO_ISO14443_B_MASK)
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_TYPE_ISOB;
if (tm_protocols)
*((u8 *)skb_put(skb, sizeof(u8))) =
PN532_AUTOPOLL_TYPE_DEP_ACTIVE_106;
rc = pn533_send_cmd_async(dev, PN533_CMD_IN_AUTOPOLL, skb,
pn533_autopoll_complete, NULL);
if (rc < 0)
dev_kfree_skb(skb);
else
dev->poll_mod_count++;
return rc;
}
pn533_poll_create_mod_list(dev, im_protocols, tm_protocols);
/* Do not always start polling from the same modulation */
get_random_bytes(&rand_mod, sizeof(rand_mod));
rand_mod %= dev->poll_mod_count;
dev->poll_mod_curr = rand_mod;
cur_mod = dev->poll_mod_active[dev->poll_mod_curr];
rc = pn533_send_poll_frame(dev);
/* Start listen timer */
if (!rc && cur_mod->len == 0 && dev->poll_mod_count > 1)
mod_timer(&dev->listen_timer, jiffies + PN533_LISTEN_TIME * HZ);
return rc;
}