diff options
author | Thierry Escande <thierry.escande@collabora.com> | 2016-06-07 10:21:52 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2016-07-04 06:26:27 -0400 |
commit | 7854a44526de84142e367f08288c9f3a33c4c8ee (patch) | |
tree | bb06beaf8e3ff9803d4018bd2c41bd209b645fcb | |
parent | a81ba50a89930a96e34862cf236b4f4461e741ae (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.h | 2 | ||||
-rw-r--r-- | net/nfc/digital_core.c | 16 |
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 | |||
33 | struct digital_cmd { | 36 | struct 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 | ||
425 | static void digital_wq_poll(struct work_struct *work) | 429 | static 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 | ||