mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-05 08:26:59 +00:00
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>
This commit is contained in:
parent
96e829b433
commit
4b8b6267be
1 changed files with 13 additions and 1 deletions
|
@ -1091,6 +1091,18 @@ void digital_tg_recv_sens_req(struct nfc_digital_dev *ddev, void *arg,
|
||||||
dev_kfree_skb(resp);
|
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,
|
static int digital_tg_send_sensf_res(struct nfc_digital_dev *ddev,
|
||||||
struct digital_sensf_req *sensf_req)
|
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);
|
digital_skb_add_crc_f(skb);
|
||||||
|
|
||||||
rc = digital_tg_send_cmd(ddev, skb, 300,
|
rc = digital_tg_send_cmd(ddev, skb, 300,
|
||||||
digital_tg_recv_atr_req, NULL);
|
digital_tg_recv_atr_or_sensf_req, NULL);
|
||||||
if (rc)
|
if (rc)
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue