aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/nfc/pn533.c
diff options
context:
space:
mode:
authorWaldemar Rymarkiewicz <waldemar.rymarkiewicz@tieto.com>2012-11-26 08:18:38 -0500
committerSamuel Ortiz <sameo@linux.intel.com>2013-01-09 18:44:30 -0500
commitcb950d9304b2965bef07e26d6c0eb34a0b1f75fe (patch)
tree26226de501519098433b2b59b56882b62f15fcbb /drivers/nfc/pn533.c
parentd22b2db69035ae3b8f71a58dfe0bd10ae1ee58d5 (diff)
NFC: pn533: Remove pn533_send_cmd_frame_sync
Remove obsolate pn533_send_cmd_frame_sync() and use previously added new iface for sync send. The new interface require the use of individual skb for each cmd which removes some memcpy calls and hides frame logic. Signed-off-by: Waldemar Rymarkiewicz <waldemar.rymarkiewicz@tieto.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/nfc/pn533.c')
-rw-r--r--drivers/nfc/pn533.c197
1 files changed, 85 insertions, 112 deletions
diff --git a/drivers/nfc/pn533.c b/drivers/nfc/pn533.c
index c34acd0dc5ff..e5615f538aaa 100644
--- a/drivers/nfc/pn533.c
+++ b/drivers/nfc/pn533.c
@@ -286,11 +286,6 @@ const struct pn533_poll_modulations poll_mod[] = {
286 286
287/* PN533_CMD_IN_ATR */ 287/* PN533_CMD_IN_ATR */
288 288
289struct pn533_cmd_activate_param {
290 u8 tg;
291 u8 next;
292} __packed;
293
294struct pn533_cmd_activate_response { 289struct pn533_cmd_activate_response {
295 u8 status; 290 u8 status;
296 u8 nfcid3t[10]; 291 u8 nfcid3t[10];
@@ -944,28 +939,10 @@ unlock:
944} 939}
945 940
946struct pn533_sync_cmd_response { 941struct pn533_sync_cmd_response {
947 int rc;
948 struct sk_buff *resp; 942 struct sk_buff *resp;
949 struct completion done; 943 struct completion done;
950}; 944};
951 945
952static int pn533_sync_cmd_complete(struct pn533 *dev, void *_arg,
953 u8 *params, int params_len)
954{
955 struct pn533_sync_cmd_response *arg = _arg;
956
957 nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
958
959 arg->rc = 0;
960
961 if (params_len < 0) /* error */
962 arg->rc = params_len;
963
964 complete(&arg->done);
965
966 return 0;
967}
968
969static int pn533_send_sync_complete(struct pn533 *dev, void *_arg, 946static int pn533_send_sync_complete(struct pn533 *dev, void *_arg,
970 struct sk_buff *resp) 947 struct sk_buff *resp)
971{ 948{
@@ -1018,28 +995,6 @@ static struct sk_buff *pn533_send_cmd_sync(struct pn533 *dev, u8 cmd_code,
1018 return arg.resp; 995 return arg.resp;
1019} 996}
1020 997
1021static int pn533_send_cmd_frame_sync(struct pn533 *dev,
1022 struct pn533_frame *out_frame,
1023 struct pn533_frame *in_frame,
1024 int in_frame_len)
1025{
1026 int rc;
1027 struct pn533_sync_cmd_response arg;
1028
1029 nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
1030
1031 init_completion(&arg.done);
1032
1033 rc = pn533_send_cmd_frame_async(dev, out_frame, in_frame, in_frame_len,
1034 pn533_sync_cmd_complete, &arg);
1035 if (rc)
1036 return rc;
1037
1038 wait_for_completion(&arg.done);
1039
1040 return arg.rc;
1041}
1042
1043static void pn533_send_complete(struct urb *urb) 998static void pn533_send_complete(struct urb *urb)
1044{ 999{
1045 struct pn533 *dev = urb->context; 1000 struct pn533 *dev = urb->context;
@@ -1801,38 +1756,37 @@ static void pn533_stop_poll(struct nfc_dev *nfc_dev)
1801 1756
1802static int pn533_activate_target_nfcdep(struct pn533 *dev) 1757static int pn533_activate_target_nfcdep(struct pn533 *dev)
1803{ 1758{
1804 struct pn533_cmd_activate_param param; 1759 struct pn533_cmd_activate_response *rsp;
1805 struct pn533_cmd_activate_response *resp;
1806 u16 gt_len; 1760 u16 gt_len;
1807 int rc; 1761 int rc;
1808 1762
1809 nfc_dev_dbg(&dev->interface->dev, "%s", __func__); 1763 struct sk_buff *skb;
1764 struct sk_buff *resp;
1810 1765
1811 pn533_tx_frame_init(dev->out_frame, PN533_CMD_IN_ATR); 1766 nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
1812 1767
1813 param.tg = 1; 1768 skb = pn533_alloc_skb(sizeof(u8) * 2); /*TG + Next*/
1814 param.next = 0; 1769 if (!skb)
1815 memcpy(PN533_FRAME_CMD_PARAMS_PTR(dev->out_frame), &param, 1770 return -ENOMEM;
1816 sizeof(struct pn533_cmd_activate_param));
1817 dev->out_frame->datalen += sizeof(struct pn533_cmd_activate_param);
1818 1771
1819 pn533_tx_frame_finish(dev->out_frame); 1772 *skb_put(skb, sizeof(u8)) = 1; /* TG */
1773 *skb_put(skb, sizeof(u8)) = 0; /* Next */
1820 1774
1821 rc = pn533_send_cmd_frame_sync(dev, dev->out_frame, dev->in_frame, 1775 resp = pn533_send_cmd_sync(dev, PN533_CMD_IN_ATR, skb);
1822 PN533_NORMAL_FRAME_MAX_LEN); 1776 if (IS_ERR(resp))
1823 if (rc) 1777 return PTR_ERR(resp);
1824 return rc;
1825 1778
1826 resp = (struct pn533_cmd_activate_response *) 1779 rsp = (struct pn533_cmd_activate_response *) resp->data;
1827 PN533_FRAME_CMD_PARAMS_PTR(dev->in_frame); 1780 rc = rsp->status & PN533_CMD_RET_MASK;
1828 rc = resp->status & PN533_CMD_RET_MASK;
1829 if (rc != PN533_CMD_RET_SUCCESS) 1781 if (rc != PN533_CMD_RET_SUCCESS)
1782 dev_kfree_skb(resp);
1830 return -EIO; 1783 return -EIO;
1831 1784
1832 /* ATR_RES general bytes are located at offset 16 */ 1785 /* ATR_RES general bytes are located at offset 16 */
1833 gt_len = PN533_FRAME_CMD_PARAMS_LEN(dev->in_frame) - 16; 1786 gt_len = resp->len - 16;
1834 rc = nfc_set_remote_general_bytes(dev->nfc_dev, resp->gt, gt_len); 1787 rc = nfc_set_remote_general_bytes(dev->nfc_dev, rsp->gt, gt_len);
1835 1788
1789 dev_kfree_skb(resp);
1836 return rc; 1790 return rc;
1837} 1791}
1838 1792
@@ -1889,8 +1843,10 @@ static void pn533_deactivate_target(struct nfc_dev *nfc_dev,
1889 struct nfc_target *target) 1843 struct nfc_target *target)
1890{ 1844{
1891 struct pn533 *dev = nfc_get_drvdata(nfc_dev); 1845 struct pn533 *dev = nfc_get_drvdata(nfc_dev);
1892 u8 tg; 1846
1893 u8 status; 1847 struct sk_buff *skb;
1848 struct sk_buff *resp;
1849
1894 int rc; 1850 int rc;
1895 1851
1896 nfc_dev_dbg(&dev->interface->dev, "%s", __func__); 1852 nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
@@ -1901,31 +1857,24 @@ static void pn533_deactivate_target(struct nfc_dev *nfc_dev,
1901 } 1857 }
1902 1858
1903 dev->tgt_active_prot = 0; 1859 dev->tgt_active_prot = 0;
1904
1905 skb_queue_purge(&dev->resp_q); 1860 skb_queue_purge(&dev->resp_q);
1906 1861
1907 pn533_tx_frame_init(dev->out_frame, PN533_CMD_IN_RELEASE); 1862 skb = pn533_alloc_skb(sizeof(u8));
1908 1863 if (!skb)
1909 tg = 1; 1864 return;
1910 memcpy(PN533_FRAME_CMD_PARAMS_PTR(dev->out_frame), &tg, sizeof(u8));
1911 dev->out_frame->datalen += sizeof(u8);
1912 1865
1913 pn533_tx_frame_finish(dev->out_frame); 1866 *skb_put(skb, 1) = 1; /* TG*/
1914 1867
1915 rc = pn533_send_cmd_frame_sync(dev, dev->out_frame, dev->in_frame, 1868 resp = pn533_send_cmd_sync(dev, PN533_CMD_IN_RELEASE, skb);
1916 PN533_NORMAL_FRAME_MAX_LEN); 1869 if (IS_ERR(resp))
1917 if (rc) {
1918 nfc_dev_err(&dev->interface->dev, "Error when sending release"
1919 " command to the controller");
1920 return; 1870 return;
1921 }
1922 1871
1923 status = PN533_FRAME_CMD_PARAMS_PTR(dev->in_frame)[0]; 1872 rc = resp->data[0] & PN533_CMD_RET_MASK;
1924 rc = status & PN533_CMD_RET_MASK;
1925 if (rc != PN533_CMD_RET_SUCCESS) 1873 if (rc != PN533_CMD_RET_SUCCESS)
1926 nfc_dev_err(&dev->interface->dev, "Error 0x%x when releasing" 1874 nfc_dev_err(&dev->interface->dev, "Error 0x%x when releasing"
1927 " the target", rc); 1875 " the target", rc);
1928 1876
1877 dev_kfree_skb(resp);
1929 return; 1878 return;
1930} 1879}
1931 1880
@@ -2457,43 +2406,71 @@ error_cmd:
2457static int pn533_set_configuration(struct pn533 *dev, u8 cfgitem, u8 *cfgdata, 2406static int pn533_set_configuration(struct pn533 *dev, u8 cfgitem, u8 *cfgdata,
2458 u8 cfgdata_len) 2407 u8 cfgdata_len)
2459{ 2408{
2460 int rc; 2409 struct sk_buff *skb;
2461 u8 *params; 2410 struct sk_buff *resp;
2411
2412 int skb_len;
2462 2413
2463 nfc_dev_dbg(&dev->interface->dev, "%s", __func__); 2414 nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
2464 2415
2465 pn533_tx_frame_init(dev->out_frame, PN533_CMD_RF_CONFIGURATION); 2416 skb_len = sizeof(cfgitem) + cfgdata_len; /* cfgitem + cfgdata */
2466 2417
2467 params = PN533_FRAME_CMD_PARAMS_PTR(dev->out_frame); 2418 skb = pn533_alloc_skb(skb_len);
2468 params[0] = cfgitem; 2419 if (!skb)
2469 memcpy(&params[1], cfgdata, cfgdata_len); 2420 return -ENOMEM;
2470 dev->out_frame->datalen += (1 + cfgdata_len);
2471 2421
2472 pn533_tx_frame_finish(dev->out_frame); 2422 *skb_put(skb, sizeof(cfgitem)) = cfgitem;
2423 memcpy(skb_put(skb, cfgdata_len), cfgdata, cfgdata_len);
2473 2424
2474 rc = pn533_send_cmd_frame_sync(dev, dev->out_frame, dev->in_frame, 2425 resp = pn533_send_cmd_sync(dev, PN533_CMD_RF_CONFIGURATION, skb);
2475 PN533_NORMAL_FRAME_MAX_LEN); 2426 if (IS_ERR(resp))
2427 return PTR_ERR(resp);
2476 2428
2477 return rc; 2429 dev_kfree_skb(resp);
2430 return 0;
2431}
2432
2433static int pn533_get_firmware_version(struct pn533 *dev,
2434 struct pn533_fw_version *fv)
2435{
2436 struct sk_buff *skb;
2437 struct sk_buff *resp;
2438
2439 skb = pn533_alloc_skb(0);
2440 if (!skb)
2441 return -ENOMEM;
2442
2443 resp = pn533_send_cmd_sync(dev, PN533_CMD_GET_FIRMWARE_VERSION, skb);
2444 if (IS_ERR(resp))
2445 return PTR_ERR(resp);
2446
2447 fv->ic = resp->data[0];
2448 fv->ver = resp->data[1];
2449 fv->rev = resp->data[2];
2450 fv->support = resp->data[3];
2451
2452 dev_kfree_skb(resp);
2453 return 0;
2478} 2454}
2479 2455
2480static int pn533_fw_reset(struct pn533 *dev) 2456static int pn533_fw_reset(struct pn533 *dev)
2481{ 2457{
2482 int rc; 2458 struct sk_buff *skb;
2483 u8 *params; 2459 struct sk_buff *resp;
2484 2460
2485 nfc_dev_dbg(&dev->interface->dev, "%s", __func__); 2461 nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
2486 2462
2487 pn533_tx_frame_init(dev->out_frame, 0x18); 2463 skb = pn533_alloc_skb(sizeof(u8));
2464 if (!skb)
2465 return -ENOMEM;
2488 2466
2489 params = PN533_FRAME_CMD_PARAMS_PTR(dev->out_frame); 2467 *skb_put(skb, sizeof(u8)) = 0x1;
2490 params[0] = 0x1;
2491 dev->out_frame->datalen += 1;
2492 2468
2493 pn533_tx_frame_finish(dev->out_frame); 2469 resp = pn533_send_cmd_sync(dev, 0x18, skb);
2470 if (IS_ERR(resp))
2471 return PTR_ERR(resp);
2494 2472
2495 rc = pn533_send_cmd_frame_sync(dev, dev->out_frame, dev->in_frame, 2473 dev_kfree_skb(resp);
2496 PN533_NORMAL_FRAME_MAX_LEN);
2497 2474
2498 return 0; 2475 return 0;
2499} 2476}
@@ -2592,7 +2569,7 @@ static int pn533_setup(struct pn533 *dev)
2592static int pn533_probe(struct usb_interface *interface, 2569static int pn533_probe(struct usb_interface *interface,
2593 const struct usb_device_id *id) 2570 const struct usb_device_id *id)
2594{ 2571{
2595 struct pn533_fw_version *fw_ver; 2572 struct pn533_fw_version fw_ver;
2596 struct pn533 *dev; 2573 struct pn533 *dev;
2597 struct usb_host_interface *iface_desc; 2574 struct usb_host_interface *iface_desc;
2598 struct usb_endpoint_descriptor *endpoint; 2575 struct usb_endpoint_descriptor *endpoint;
@@ -2664,18 +2641,14 @@ static int pn533_probe(struct usb_interface *interface,
2664 2641
2665 usb_set_intfdata(interface, dev); 2642 usb_set_intfdata(interface, dev);
2666 2643
2667 pn533_tx_frame_init(dev->out_frame, PN533_CMD_GET_FIRMWARE_VERSION); 2644 memset(&fw_ver, 0, sizeof(fw_ver));
2668 pn533_tx_frame_finish(dev->out_frame); 2645 rc = pn533_get_firmware_version(dev, &fw_ver);
2669 2646 if (rc < 0)
2670 rc = pn533_send_cmd_frame_sync(dev, dev->out_frame, dev->in_frame,
2671 PN533_NORMAL_FRAME_MAX_LEN);
2672 if (rc)
2673 goto destroy_wq; 2647 goto destroy_wq;
2674 2648
2675 fw_ver = (struct pn533_fw_version *) 2649 nfc_dev_info(&dev->interface->dev,
2676 PN533_FRAME_CMD_PARAMS_PTR(dev->in_frame); 2650 "NXP PN533 firmware ver %d.%d now attached",
2677 nfc_dev_info(&dev->interface->dev, "NXP PN533 firmware ver %d.%d now" 2651 fw_ver.ver, fw_ver.rev);
2678 " attached", fw_ver->ver, fw_ver->rev);
2679 2652
2680 dev->device_type = id->driver_info; 2653 dev->device_type = id->driver_info;
2681 switch (dev->device_type) { 2654 switch (dev->device_type) {