aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Escande <thierry.escande@collabora.com>2016-06-07 10:21:52 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2016-07-04 06:26:27 -0400
commit7854a44526de84142e367f08288c9f3a33c4c8ee (patch)
treebb06beaf8e3ff9803d4018bd2c41bd209b645fcb
parenta81ba50a89930a96e34862cf236b4f4461e741ae (diff)
NFC: digital: Add a delay between poll cycles
This replaces the polling work struct with a delayed work struct and add a 10 ms delay between 2 poll cycles. This avoids to flood the device with 'switch off'/'switch on' commands. Signed-off-by: Thierry Escande <thierry.escande@collabora.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
-rw-r--r--include/net/nfc/digital.h2
-rw-r--r--net/nfc/digital_core.c16
2 files changed, 11 insertions, 7 deletions
diff --git a/include/net/nfc/digital.h b/include/net/nfc/digital.h
index 0ae101eef0f4..506e3f6eabef 100644
--- a/include/net/nfc/digital.h
+++ b/include/net/nfc/digital.h
@@ -220,7 +220,7 @@ struct nfc_digital_dev {
220 struct list_head cmd_queue; 220 struct list_head cmd_queue;
221 struct mutex cmd_lock; 221 struct mutex cmd_lock;
222 222
223 struct work_struct poll_work; 223 struct delayed_work poll_work;
224 224
225 u8 curr_protocol; 225 u8 curr_protocol;
226 u8 curr_rf_tech; 226 u8 curr_rf_tech;
diff --git a/net/nfc/digital_core.c b/net/nfc/digital_core.c
index dd9003f38822..27769ac89d27 100644
--- a/net/nfc/digital_core.c
+++ b/net/nfc/digital_core.c
@@ -30,6 +30,9 @@
30 30
31#define DIGITAL_PROTO_ISO15693_RF_TECH NFC_PROTO_ISO15693_MASK 31#define DIGITAL_PROTO_ISO15693_RF_TECH NFC_PROTO_ISO15693_MASK
32 32
33/* Delay between each poll frame (ms) */
34#define DIGITAL_POLL_INTERVAL 10
35
33struct digital_cmd { 36struct digital_cmd {
34 struct list_head queue; 37 struct list_head queue;
35 38
@@ -419,7 +422,8 @@ void digital_poll_next_tech(struct nfc_digital_dev *ddev)
419 422
420 mutex_unlock(&ddev->poll_lock); 423 mutex_unlock(&ddev->poll_lock);
421 424
422 schedule_work(&ddev->poll_work); 425 schedule_delayed_work(&ddev->poll_work,
426 msecs_to_jiffies(DIGITAL_POLL_INTERVAL));
423} 427}
424 428
425static void digital_wq_poll(struct work_struct *work) 429static void digital_wq_poll(struct work_struct *work)
@@ -428,7 +432,7 @@ static void digital_wq_poll(struct work_struct *work)
428 struct digital_poll_tech *poll_tech; 432 struct digital_poll_tech *poll_tech;
429 struct nfc_digital_dev *ddev = container_of(work, 433 struct nfc_digital_dev *ddev = container_of(work,
430 struct nfc_digital_dev, 434 struct nfc_digital_dev,
431 poll_work); 435 poll_work.work);
432 mutex_lock(&ddev->poll_lock); 436 mutex_lock(&ddev->poll_lock);
433 437
434 if (!ddev->poll_tech_count) { 438 if (!ddev->poll_tech_count) {
@@ -543,7 +547,7 @@ static int digital_start_poll(struct nfc_dev *nfc_dev, __u32 im_protocols,
543 return -EINVAL; 547 return -EINVAL;
544 } 548 }
545 549
546 schedule_work(&ddev->poll_work); 550 schedule_delayed_work(&ddev->poll_work, 0);
547 551
548 return 0; 552 return 0;
549} 553}
@@ -564,7 +568,7 @@ static void digital_stop_poll(struct nfc_dev *nfc_dev)
564 568
565 mutex_unlock(&ddev->poll_lock); 569 mutex_unlock(&ddev->poll_lock);
566 570
567 cancel_work_sync(&ddev->poll_work); 571 cancel_delayed_work_sync(&ddev->poll_work);
568 572
569 digital_abort_cmd(ddev); 573 digital_abort_cmd(ddev);
570} 574}
@@ -770,7 +774,7 @@ struct nfc_digital_dev *nfc_digital_allocate_device(struct nfc_digital_ops *ops,
770 INIT_WORK(&ddev->cmd_complete_work, digital_wq_cmd_complete); 774 INIT_WORK(&ddev->cmd_complete_work, digital_wq_cmd_complete);
771 775
772 mutex_init(&ddev->poll_lock); 776 mutex_init(&ddev->poll_lock);
773 INIT_WORK(&ddev->poll_work, digital_wq_poll); 777 INIT_DELAYED_WORK(&ddev->poll_work, digital_wq_poll);
774 778
775 if (supported_protocols & NFC_PROTO_JEWEL_MASK) 779 if (supported_protocols & NFC_PROTO_JEWEL_MASK)
776 ddev->protocols |= NFC_PROTO_JEWEL_MASK; 780 ddev->protocols |= NFC_PROTO_JEWEL_MASK;
@@ -832,7 +836,7 @@ void nfc_digital_unregister_device(struct nfc_digital_dev *ddev)
832 ddev->poll_tech_count = 0; 836 ddev->poll_tech_count = 0;
833 mutex_unlock(&ddev->poll_lock); 837 mutex_unlock(&ddev->poll_lock);
834 838
835 cancel_work_sync(&ddev->poll_work); 839 cancel_delayed_work_sync(&ddev->poll_work);
836 cancel_work_sync(&ddev->cmd_work); 840 cancel_work_sync(&ddev->cmd_work);
837 cancel_work_sync(&ddev->cmd_complete_work); 841 cancel_work_sync(&ddev->cmd_complete_work);
838 842