NFS: pn533 : delete timer when polling is complete 58/33458/1 accepted/tizen_3.0_ivi accepted/tizen_ivi accepted/tizen_unified tizen_3.0 tizen_3.0.m2 accepted/tizen/3.0/ivi/20150120.102759 accepted/tizen/3.0/ivi/20161011.044304 accepted/tizen/ivi/20150120.050638 accepted/tizen/ivi/20160606.040828 accepted/tizen/unified/20170309.074707 accepted/tizen/unified/20170310.110236 submit/tizen/20150120.011017 submit/tizen/20160603.052607 submit/tizen_3.0_ivi/20150120.063505 submit/tizen_3.0_ivi/20161010.000003 submit/tizen_unified/20170308.100418 submit/tizen_unified/20170309.100417 submit/tizen_unified/20170310.104248 tizen_3.0_ivi_release
authorRicardo Neri <ricardo.neri-calderon@linux.intel.com>
Sat, 10 Jan 2015 03:30:25 +0000 (19:30 -0800)
committerRicardo Neri <ricardo.neri-calderon@linux.intel.com>
Sat, 10 Jan 2015 03:55:25 +0000 (19:55 -0800)
When polling is complete, the listen timer is not longer required.
Thus, we delete it. Otherwise, it might be possible that the
expiring timer runs its callback with the mod list already reset.
This would cause a division by zero in pn533_poll_next_mod. A
warning is issued to make sure that we are informed of the condition.

Also, cancel the timer in dep_link_down as it resets the poll mod
count.

Change-Id: Ia3590ec536deeaed3abf36d2c9abf065174d7e33
Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
drivers/nfc/pn533.c

index cf1a87b..9509342 100644 (file)
@@ -1505,6 +1505,10 @@ static int pn533_target_found(struct pn533 *dev, u8 tg, u8 *tgdata,
 
 static inline void pn533_poll_next_mod(struct pn533 *dev)
 {
+       if (!dev->poll_mod_count) {
+               WARN(1, "poll_mod_count is zero!");
+               return;
+       }
        dev->poll_mod_curr = (dev->poll_mod_curr + 1) % dev->poll_mod_count;
 }
 
@@ -1564,6 +1568,7 @@ static int pn533_start_poll_complete(struct pn533 *dev, struct sk_buff *resp)
 
                /* We must stop the poll after a valid target found */
                if (rc == 0) {
+                       del_timer(&dev->listen_timer);
                        pn533_poll_reset_mod_list(dev);
                        return 0;
                }
@@ -1912,8 +1917,10 @@ static int pn533_poll_dep_complete(struct pn533 *dev, void *arg,
                                        dev->nfc_dev->targets[0].idx,
                                        0, NFC_RF_INITIATOR);
 
-               if (!rc)
+               if (!rc) {
+                       del_timer(&dev->listen_timer);
                        pn533_poll_reset_mod_list(dev);
+               }
        }
 error:
        dev_kfree_skb(resp);
@@ -2465,6 +2472,7 @@ static int pn533_dep_link_down(struct nfc_dev *nfc_dev)
 
        dev_dbg(&dev->interface->dev, "%s\n", __func__);
 
+       del_timer(&dev->listen_timer);
        pn533_poll_reset_mod_list(dev);
 
        if (dev->tgt_mode || dev->tgt_active_prot)