NFC: Monitor pn533 target mode
authorSamuel Ortiz <sameo@linux.intel.com>
Thu, 31 May 2012 18:01:32 +0000 (20:01 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 4 Jun 2012 19:34:34 +0000 (21:34 +0200)
When receiving a DEP link down event, we should cancel all pending URBs
if we're activated as a target or if we're an initiator.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/nfc/pn533.c

index 58c1641cf658c1d551a21c010c00eaf1f2c4162c..9ac829e22e732036f1c13ed5ec4668102a2c261e 100644 (file)
@@ -343,6 +343,7 @@ struct pn533 {
 
        u8 tgt_available_prots;
        u8 tgt_active_prot;
+       u8 tgt_mode;
 };
 
 struct pn533_frame {
@@ -1158,6 +1159,8 @@ static int pn533_tm_get_data_complete(struct pn533 *dev, void *arg,
        if (params_len > 0 && params[0] != 0) {
                nfc_tm_deactivated(dev->nfc_dev);
 
+               dev->tgt_mode = 0;
+
                kfree_skb(skb_resp);
                return 0;
        }
@@ -1245,6 +1248,8 @@ static int pn533_init_target_complete(struct pn533 *dev, void *arg,
                return rc;
        }
 
+       dev->tgt_mode = 1;
+
        queue_work(dev->wq, &dev->tg_work);
 
        return 0;
@@ -1397,6 +1402,12 @@ static int pn533_start_poll(struct nfc_dev *nfc_dev,
                return -EBUSY;
        }
 
+       if (dev->tgt_mode) {
+               nfc_dev_err(&dev->interface->dev,
+                           "Cannot poll while already being activated");
+               return -EBUSY;
+       }
+
        if (tm_protocols) {
                dev->gb = nfc_get_local_general_bytes(nfc_dev, &dev->gb_len);
                if (dev->gb == NULL)
@@ -1725,7 +1736,15 @@ static int pn533_dep_link_down(struct nfc_dev *nfc_dev)
 
        pn533_poll_reset_mod_list(dev);
 
-       pn533_deactivate_target(nfc_dev, 0);
+       if (dev->tgt_mode || dev->tgt_active_prot) {
+               pn533_send_ack(dev, GFP_KERNEL);
+               usb_kill_urb(dev->in_urb);
+       }
+
+       dev->tgt_active_prot = 0;
+       dev->tgt_mode = 0;
+
+       skb_queue_purge(&dev->resp_q);
 
        return 0;
 }
@@ -1956,6 +1975,8 @@ static int pn533_tm_send_complete(struct pn533 *dev, void *arg,
        if (params_len > 0 && params[0] != 0) {
                nfc_tm_deactivated(dev->nfc_dev);
 
+               dev->tgt_mode = 0;
+
                return 0;
        }
 
This page took 0.02634 seconds and 5 git commands to generate.