aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/nfc
diff options
context:
space:
mode:
authorWaldemar Rymarkiewicz <waldemar.rymarkiewicz@tieto.com>2013-04-03 02:02:04 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2013-04-11 10:29:02 -0400
commit4231604b3e867bd8cff7ae81a3068615954aa1c8 (patch)
treebb65ac126c0aab904a455efb52f8ba38d1126aed /drivers/nfc
parent0ce1fbdd609875f523de0d8179c6f4f8500807c7 (diff)
NFC: pn533: Optimise issued cmd context tracking
Use struct pn533_cmd instead of pn533_send_async_complete_arg to track the context of the issued cmd. This way pn533_send_async_complete_arg struct is no needed anymore. Just move issuer complete callback to pn533_cmd struct. Signed-off-by: Waldemar Rymarkiewicz <waldemar.rymarkiewicz@tieto.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/nfc')
-rw-r--r--drivers/nfc/pn533.c87
1 files changed, 35 insertions, 52 deletions
diff --git a/drivers/nfc/pn533.c b/drivers/nfc/pn533.c
index 48902e58cacb..2f39209507d4 100644
--- a/drivers/nfc/pn533.c
+++ b/drivers/nfc/pn533.c
@@ -363,7 +363,8 @@ struct pn533_cmd {
363 struct sk_buff *req; 363 struct sk_buff *req;
364 struct sk_buff *resp; 364 struct sk_buff *resp;
365 int resp_len; 365 int resp_len;
366 void *arg; 366 pn533_send_async_complete_t complete_cb;
367 void *complete_cb_context;
367}; 368};
368 369
369struct pn533_std_frame { 370struct pn533_std_frame {
@@ -691,39 +692,32 @@ static void pn533_build_cmd_frame(struct pn533 *dev, u8 cmd_code,
691 ops->tx_frame_finish(skb->data); 692 ops->tx_frame_finish(skb->data);
692} 693}
693 694
694struct pn533_send_async_complete_arg { 695static int pn533_send_async_complete(struct pn533 *dev, void *arg, int status)
695 pn533_send_async_complete_t complete_cb;
696 void *complete_cb_context;
697 struct sk_buff *resp;
698 struct sk_buff *req;
699};
700
701static int pn533_send_async_complete(struct pn533 *dev, void *_arg, int status)
702{ 696{
703 struct pn533_send_async_complete_arg *arg = _arg; 697 struct pn533_cmd *cmd = arg;
704 698
705 struct sk_buff *req = arg->req; 699 struct sk_buff *req = cmd->req;
706 struct sk_buff *resp = arg->resp; 700 struct sk_buff *resp = cmd->resp;
707 701
708 int rc; 702 int rc;
709 703
710 dev_kfree_skb(req); 704 dev_kfree_skb(req);
711 705
712 if (status < 0) { 706 if (status < 0) {
713 arg->complete_cb(dev, arg->complete_cb_context, 707 rc = cmd->complete_cb(dev, cmd->complete_cb_context,
714 ERR_PTR(status)); 708 ERR_PTR(status));
715 dev_kfree_skb(resp); 709 dev_kfree_skb(resp);
716 kfree(arg); 710 kfree(cmd);
717 return status; 711 return rc;
718 } 712 }
719 713
720 skb_put(resp, dev->ops->rx_frame_size(resp->data)); 714 skb_put(resp, dev->ops->rx_frame_size(resp->data));
721 skb_pull(resp, dev->ops->rx_header_len); 715 skb_pull(resp, dev->ops->rx_header_len);
722 skb_trim(resp, resp->len - dev->ops->rx_tail_len); 716 skb_trim(resp, resp->len - dev->ops->rx_tail_len);
723 717
724 rc = arg->complete_cb(dev, arg->complete_cb_context, resp); 718 rc = cmd->complete_cb(dev, cmd->complete_cb_context, resp);
725 719
726 kfree(arg); 720 kfree(cmd);
727 return rc; 721 return rc;
728} 722}
729 723
@@ -734,19 +728,20 @@ static int __pn533_send_async(struct pn533 *dev, u8 cmd_code,
734 void *complete_cb_context) 728 void *complete_cb_context)
735{ 729{
736 struct pn533_cmd *cmd; 730 struct pn533_cmd *cmd;
737 struct pn533_send_async_complete_arg *arg;
738 int rc = 0; 731 int rc = 0;
739 732
740 nfc_dev_dbg(&dev->interface->dev, "Sending command 0x%x", cmd_code); 733 nfc_dev_dbg(&dev->interface->dev, "Sending command 0x%x", cmd_code);
741 734
742 arg = kzalloc(sizeof(*arg), GFP_KERNEL); 735 cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
743 if (!arg) 736 if (!cmd)
744 return -ENOMEM; 737 return -ENOMEM;
745 738
746 arg->complete_cb = complete_cb; 739 cmd->cmd_code = cmd_code;
747 arg->complete_cb_context = complete_cb_context; 740 cmd->req = req;
748 arg->resp = resp; 741 cmd->resp = resp;
749 arg->req = req; 742 cmd->resp_len = resp_len;
743 cmd->complete_cb = complete_cb;
744 cmd->complete_cb_context = complete_cb_context;
750 745
751 pn533_build_cmd_frame(dev, cmd_code, req); 746 pn533_build_cmd_frame(dev, cmd_code, req);
752 747
@@ -754,7 +749,7 @@ static int __pn533_send_async(struct pn533 *dev, u8 cmd_code,
754 749
755 if (!dev->cmd_pending) { 750 if (!dev->cmd_pending) {
756 rc = __pn533_send_frame_async(dev, req, resp, resp_len, 751 rc = __pn533_send_frame_async(dev, req, resp, resp_len,
757 pn533_send_async_complete, arg); 752 pn533_send_async_complete, cmd);
758 if (rc) 753 if (rc)
759 goto error; 754 goto error;
760 755
@@ -765,25 +760,13 @@ static int __pn533_send_async(struct pn533 *dev, u8 cmd_code,
765 nfc_dev_dbg(&dev->interface->dev, "%s Queueing command 0x%x", __func__, 760 nfc_dev_dbg(&dev->interface->dev, "%s Queueing command 0x%x", __func__,
766 cmd_code); 761 cmd_code);
767 762
768 cmd = kzalloc(sizeof(struct pn533_cmd), GFP_KERNEL);
769 if (!cmd) {
770 rc = -ENOMEM;
771 goto error;
772 }
773
774 INIT_LIST_HEAD(&cmd->queue); 763 INIT_LIST_HEAD(&cmd->queue);
775 cmd->cmd_code = cmd_code;
776 cmd->req = req;
777 cmd->resp = resp;
778 cmd->resp_len = resp_len;
779 cmd->arg = arg;
780
781 list_add_tail(&cmd->queue, &dev->cmd_queue); 764 list_add_tail(&cmd->queue, &dev->cmd_queue);
782 765
783 goto unlock; 766 goto unlock;
784 767
785error: 768error:
786 kfree(arg); 769 kfree(cmd);
787unlock: 770unlock:
788 mutex_unlock(&dev->cmd_lock); 771 mutex_unlock(&dev->cmd_lock);
789 return rc; 772 return rc;
@@ -848,8 +831,8 @@ static int pn533_send_cmd_direct_async(struct pn533 *dev, u8 cmd_code,
848 pn533_send_async_complete_t complete_cb, 831 pn533_send_async_complete_t complete_cb,
849 void *complete_cb_context) 832 void *complete_cb_context)
850{ 833{
851 struct pn533_send_async_complete_arg *arg;
852 struct sk_buff *resp; 834 struct sk_buff *resp;
835 struct pn533_cmd *cmd;
853 int rc; 836 int rc;
854 int resp_len = dev->ops->rx_header_len + 837 int resp_len = dev->ops->rx_header_len +
855 dev->ops->max_payload_len + 838 dev->ops->max_payload_len +
@@ -859,24 +842,26 @@ static int pn533_send_cmd_direct_async(struct pn533 *dev, u8 cmd_code,
859 if (!resp) 842 if (!resp)
860 return -ENOMEM; 843 return -ENOMEM;
861 844
862 arg = kzalloc(sizeof(*arg), GFP_KERNEL); 845 cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
863 if (!arg) { 846 if (!cmd) {
864 dev_kfree_skb(resp); 847 dev_kfree_skb(resp);
865 return -ENOMEM; 848 return -ENOMEM;
866 } 849 }
867 850
868 arg->complete_cb = complete_cb; 851 cmd->cmd_code = cmd_code;
869 arg->complete_cb_context = complete_cb_context; 852 cmd->req = req;
870 arg->resp = resp; 853 cmd->resp = resp;
871 arg->req = req; 854 cmd->resp_len = resp_len;
855 cmd->complete_cb = complete_cb;
856 cmd->complete_cb_context = complete_cb_context;
872 857
873 pn533_build_cmd_frame(dev, cmd_code, req); 858 pn533_build_cmd_frame(dev, cmd_code, req);
874 859
875 rc = __pn533_send_frame_async(dev, req, resp, resp_len, 860 rc = __pn533_send_frame_async(dev, req, resp, resp_len,
876 pn533_send_async_complete, arg); 861 pn533_send_async_complete, cmd);
877 if (rc < 0) { 862 if (rc < 0) {
878 dev_kfree_skb(resp); 863 dev_kfree_skb(resp);
879 kfree(arg); 864 kfree(cmd);
880 } 865 }
881 866
882 return rc; 867 return rc;
@@ -903,14 +888,12 @@ static void pn533_wq_cmd(struct work_struct *work)
903 mutex_unlock(&dev->cmd_lock); 888 mutex_unlock(&dev->cmd_lock);
904 889
905 rc = __pn533_send_frame_async(dev, cmd->req, cmd->resp, cmd->resp_len, 890 rc = __pn533_send_frame_async(dev, cmd->req, cmd->resp, cmd->resp_len,
906 pn533_send_async_complete, cmd->arg); 891 pn533_send_async_complete, cmd);
907 if (rc < 0) { 892 if (rc < 0) {
908 dev_kfree_skb(cmd->req); 893 dev_kfree_skb(cmd->req);
909 dev_kfree_skb(cmd->resp); 894 dev_kfree_skb(cmd->resp);
910 kfree(cmd->arg); 895 kfree(cmd);
911 } 896 }
912
913 kfree(cmd);
914} 897}
915 898
916struct pn533_sync_cmd_response { 899struct pn533_sync_cmd_response {