NFC: Set and get DEP general bytes
authorSamuel Ortiz <sameo@linux.intel.com>
Wed, 14 Dec 2011 15:43:10 +0000 (16:43 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 14 Dec 2011 19:50:13 +0000 (14:50 -0500)
Without an API for setting and getting the local and remote general bytes,
drivers won't be able to properly establish a DEP link.
This API also allows them to propagate the remote general bytes they get
from the DEP link establishment up to the LLCP layer.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/nfc/pn533.c
include/net/nfc/nfc.h
net/nfc/core.c

index ea1caaeed13cc9a70440c2e5e6a33791066b5783..dccd96552f5db3542623834fe0cce7f597c9a151 100644 (file)
@@ -1121,6 +1121,7 @@ static int pn533_activate_target_nfcdep(struct pn533 *dev)
 {
        struct pn533_cmd_activate_param param;
        struct pn533_cmd_activate_response *resp;
+       u16 gt_len;
        int rc;
 
        nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
@@ -1146,7 +1147,11 @@ static int pn533_activate_target_nfcdep(struct pn533 *dev)
        if (rc != PN533_CMD_RET_SUCCESS)
                return -EIO;
 
-       return 0;
+       /* ATR_RES general bytes are located at offset 16 */
+       gt_len = PN533_FRAME_CMD_PARAMS_LEN(dev->in_frame) - 16;
+       rc = nfc_set_remote_general_bytes(dev->nfc_dev, resp->gt, gt_len);
+
+       return rc;
 }
 
 static int pn533_activate_target(struct nfc_dev *nfc_dev, u32 target_idx,
index bf82d292d68c73584ea3ed07348c71137adbf4c9..ccfe757a94ec2d17a16bb4d9424cd21510823800 100644 (file)
@@ -170,6 +170,11 @@ struct sk_buff *nfc_alloc_send_skb(struct nfc_dev *dev, struct sock *sk,
                                        unsigned int *err);
 struct sk_buff *nfc_alloc_recv_skb(unsigned int size, gfp_t gfp);
 
+int nfc_set_remote_general_bytes(struct nfc_dev *dev,
+                                       u8 *gt, u8 gt_len);
+
+u8 *nfc_get_local_general_bytes(struct nfc_dev *dev, u8 *gt_len);
+
 int nfc_targets_found(struct nfc_dev *dev, struct nfc_target *targets,
                                                        int ntargets);
 
index 785f1f20c7ba62d78b065d79bb23e4a0d48cef5e..3a45f21b3b97ee2fbce1ef9989bf6979746fa500 100644 (file)
@@ -352,6 +352,24 @@ error:
        return rc;
 }
 
+int nfc_set_remote_general_bytes(struct nfc_dev *dev, u8 *gb, u8 gb_len)
+{
+       pr_debug("dev_name=%s gb_len=%d\n",
+                       dev_name(&dev->dev), gb_len);
+
+       if (gb_len > NFC_MAX_GT_LEN)
+               return -EINVAL;
+
+       return 0;
+}
+EXPORT_SYMBOL(nfc_set_remote_general_bytes);
+
+u8 *nfc_get_local_general_bytes(struct nfc_dev *dev, u8 *gt_len)
+{
+       return NULL;
+}
+EXPORT_SYMBOL(nfc_get_local_general_bytes);
+
 /**
  * nfc_alloc_send_skb - allocate a skb for data exchange responses
  *