NFC: pn533: Add protocol type for frame ops
Waldemar Rymarkiewicz [Wed, 3 Apr 2013 06:02:12 +0000 (08:02 +0200)]
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>

drivers/nfc/pn533.c

index edee0d5..2fd8029 100644 (file)
@@ -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: