NFC: digital: Handle multiple SENSF_REQ frames
authorMark A. Greer <mgreer@animalcreek.com>
Wed, 23 Apr 2014 18:00:56 +0000 (11:00 -0700)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 19 May 2014 21:52:40 +0000 (23:52 +0200)
According to section 5.15.1.3 of the NFC Activity
Specification, multiple SENSF_REQ commands can be
received by a target before it receives an ATR_REQ
command.  To handle this, add a routine that checks
whether a SENSF_REQ or ATR_REQ has been recieved.
If its a SENSF_REQ, respond appropriately and
continue waiting for a ATR_REQ.  If its an ATR_REQ,
handle it as before.

CC: Thierry Escande <thierry.escande@linux.intel.com>
Signed-off-by: Mark A. Greer <mgreer@animalcreek.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
net/nfc/digital_technology.c

index c8dfb1b90fa0c3d83a48b8a00a0646940fb8a2e4..12a233e9ece593d89e7f6df2b63c13c5e6d21275 100644 (file)
@@ -1091,6 +1091,18 @@ exit:
        dev_kfree_skb(resp);
 }
 
+static void digital_tg_recv_atr_or_sensf_req(struct nfc_digital_dev *ddev,
+               void *arg, struct sk_buff *resp)
+{
+       if (!IS_ERR(resp) && (resp->len >= 2) &&
+                       (resp->data[1] == DIGITAL_CMD_SENSF_REQ))
+               digital_tg_recv_sensf_req(ddev, arg, resp);
+       else
+               digital_tg_recv_atr_req(ddev, arg, resp);
+
+       return;
+}
+
 static int digital_tg_send_sensf_res(struct nfc_digital_dev *ddev,
                              struct digital_sensf_req *sensf_req)
 {
@@ -1136,7 +1148,7 @@ static int digital_tg_send_sensf_res(struct nfc_digital_dev *ddev,
                digital_skb_add_crc_f(skb);
 
        rc = digital_tg_send_cmd(ddev, skb, 300,
-                                digital_tg_recv_atr_req, NULL);
+                                digital_tg_recv_atr_or_sensf_req, NULL);
        if (rc)
                kfree_skb(skb);