diff options
author | 2013-04-03 08:02:12 +0200 | |
---|---|---|
committer | 2013-04-11 16:29:06 +0200 | |
commit | 58520373d8aff974f4b3f1bd9eb84c1ff3d6bd8b (patch) | |
tree | ee1657b3025e42f9b25ee401b0b508a43367f114 /drivers/nfc/pn533.c | |
parent | NFC: pn533: Move wq_in_error to cmd context (diff) | |
download | linux-58520373d8aff974f4b3f1bd9eb84c1ff3d6bd8b.tar.gz linux-58520373d8aff974f4b3f1bd9eb84c1ff3d6bd8b.tar.bz2 linux-58520373d8aff974f4b3f1bd9eb84c1ff3d6bd8b.zip |
NFC: pn533: Add protocol type for frame ops
As not all devices require ACK confirmation of every request sent to the
controller, differentiate two protocol types.
First one, request-ack-response and the second one request-response type.
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.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/drivers/nfc/pn533.c b/drivers/nfc/pn533.c index edee0d55d8f4..2fd8029f377d 100644 --- a/drivers/nfc/pn533.c +++ b/drivers/nfc/pn533.c @@ -310,11 +310,17 @@ struct pn533_cmd_jump_dep_response { #define PN533_INIT_TARGET_RESP_ACTIVE 0x1 #define PN533_INIT_TARGET_RESP_DEP 0x4 +enum pn533_protocol_type { + PN533_PROTO_REQ_ACK_RESP = 0, + PN533_PROTO_REQ_RESP +}; + struct pn533 { struct usb_device *udev; struct usb_interface *interface; struct nfc_dev *nfc_dev; u32 device_type; + enum pn533_protocol_type protocol_type; struct urb *out_urb; struct urb *in_urb; @@ -646,9 +652,17 @@ static int __pn533_send_frame_async(struct pn533 *dev, if (rc) return rc; - rc = pn533_submit_urb_for_ack(dev, GFP_KERNEL); - if (rc) - goto error; + if (dev->protocol_type == PN533_PROTO_REQ_RESP) { + /* request for response for sent packet directly */ + rc = pn533_submit_urb_for_response(dev, GFP_ATOMIC); + if (rc) + goto error; + } else if (dev->protocol_type == PN533_PROTO_REQ_ACK_RESP) { + /* request for ACK if that's the case */ + rc = pn533_submit_urb_for_ack(dev, GFP_KERNEL); + if (rc) + goto error; + } return 0; @@ -2485,6 +2499,7 @@ static int pn533_probe(struct usb_interface *interface, dev->ops = &pn533_std_frame_ops; + dev->protocol_type = PN533_PROTO_REQ_ACK_RESP; dev->device_type = id->driver_info; switch (dev->device_type) { case PN533_DEVICE_STD: |