aboutsummaryrefslogtreecommitdiffstats
path: root/net/nfc
diff options
context:
space:
mode:
authorMark A. Greer <mgreer@animalcreek.com>2014-04-23 14:00:56 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2014-05-19 17:52:40 -0400
commit4b8b6267bed9261c5c2f52e6b1ff258cd9305ad2 (patch)
treef374f1917387a773def8ddc78c3b8ccc124ee121 /net/nfc
parent96e829b433056d8325916631dc370a4ba42bdaf8 (diff)
NFC: digital: Handle multiple SENSF_REQ frames
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>
Diffstat (limited to 'net/nfc')
-rw-r--r--net/nfc/digital_technology.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/net/nfc/digital_technology.c b/net/nfc/digital_technology.c
index c8dfb1b90fa0..12a233e9ece5 100644
--- a/net/nfc/digital_technology.c
+++ b/net/nfc/digital_technology.c
@@ -1091,6 +1091,18 @@ exit:
1091 dev_kfree_skb(resp); 1091 dev_kfree_skb(resp);
1092} 1092}
1093 1093
1094static void digital_tg_recv_atr_or_sensf_req(struct nfc_digital_dev *ddev,
1095 void *arg, struct sk_buff *resp)
1096{
1097 if (!IS_ERR(resp) && (resp->len >= 2) &&
1098 (resp->data[1] == DIGITAL_CMD_SENSF_REQ))
1099 digital_tg_recv_sensf_req(ddev, arg, resp);
1100 else
1101 digital_tg_recv_atr_req(ddev, arg, resp);
1102
1103 return;
1104}
1105
1094static int digital_tg_send_sensf_res(struct nfc_digital_dev *ddev, 1106static int digital_tg_send_sensf_res(struct nfc_digital_dev *ddev,
1095 struct digital_sensf_req *sensf_req) 1107 struct digital_sensf_req *sensf_req)
1096{ 1108{
@@ -1136,7 +1148,7 @@ static int digital_tg_send_sensf_res(struct nfc_digital_dev *ddev,
1136 digital_skb_add_crc_f(skb); 1148 digital_skb_add_crc_f(skb);
1137 1149
1138 rc = digital_tg_send_cmd(ddev, skb, 300, 1150 rc = digital_tg_send_cmd(ddev, skb, 300,
1139 digital_tg_recv_atr_req, NULL); 1151 digital_tg_recv_atr_or_sensf_req, NULL);
1140 if (rc) 1152 if (rc)
1141 kfree_skb(skb); 1153 kfree_skb(skb);
1142 1154