Lines Matching +full:ats +full:- +full:supported
1 // SPDX-License-Identifier: GPL-2.0-only
173 if (skb->len < 1) in digital_in_iso_dep_pull_sod()
174 return -EIO; in digital_in_iso_dep_pull_sod()
176 pcb = *skb->data; in digital_in_iso_dep_pull_sod()
179 /* No support fo R-block nor S-block */ in digital_in_iso_dep_pull_sod()
181 pr_err("ISO_DEP R-block and S-block not supported\n"); in digital_in_iso_dep_pull_sod()
182 return -EIO; in digital_in_iso_dep_pull_sod()
186 pr_err("DID field in ISO_DEP PCB not supported\n"); in digital_in_iso_dep_pull_sod()
187 return -EIO; in digital_in_iso_dep_pull_sod()
199 * Chaining not supported so skb->len + 1 PCB byte + 2 CRC bytes must in digital_in_iso_dep_push_sod()
202 if (skb->len + 3 > ddev->target_fsc) in digital_in_iso_dep_push_sod()
203 return -EIO; in digital_in_iso_dep_push_sod()
207 *skb->data = DIGITAL_ISO_DEP_I_PCB | ddev->curr_nfc_dep_pni; in digital_in_iso_dep_push_sod()
209 ddev->curr_nfc_dep_pni = in digital_in_iso_dep_push_sod()
210 DIGITAL_ISO_DEP_PNI(ddev->curr_nfc_dep_pni + 1); in digital_in_iso_dep_push_sod()
228 if (resp->len < 2) { in digital_in_recv_ats()
229 rc = -EIO; in digital_in_recv_ats()
233 fsdi = DIGITAL_ATS_FSCI(resp->data[1]); in digital_in_recv_ats()
235 ddev->target_fsc = DIGITAL_ATS_MAX_FSC; in digital_in_recv_ats()
237 ddev->target_fsc = digital_ats_fsc[fsdi]; in digital_in_recv_ats()
239 ddev->curr_nfc_dep_pni = 0; in digital_in_recv_ats()
259 return -ENOMEM; in digital_in_send_rats()
294 if (resp->len != DIGITAL_SEL_RES_LEN) { in digital_in_recv_sel_res()
295 rc = -EIO; in digital_in_recv_sel_res()
299 sel_res = resp->data[0]; in digital_in_recv_sel_res()
309 target->sel_res = sel_res; in digital_in_recv_sel_res()
321 * done when receiving the ATS in digital_in_recv_sel_res()
325 rc = -EOPNOTSUPP; in digital_in_recv_sel_res()
352 return -ENOMEM; in digital_in_send_sel_req()
355 sel_req = (struct digital_sel_req *)skb->data; in digital_in_send_sel_req()
357 if (target->nfcid1_len <= 4) in digital_in_send_sel_req()
359 else if (target->nfcid1_len < 10) in digital_in_send_sel_req()
364 sel_req->sel_cmd = sel_cmd; in digital_in_send_sel_req()
365 sel_req->b2 = 0x70; in digital_in_send_sel_req()
366 memcpy(sel_req->nfcid1, sdd_res->nfcid1, 4); in digital_in_send_sel_req()
367 sel_req->bcc = sdd_res->bcc; in digital_in_send_sel_req()
402 if (resp->len < DIGITAL_SDD_RES_LEN) { in digital_in_recv_sdd_res()
404 rc = -EINVAL; in digital_in_recv_sdd_res()
408 sdd_res = (struct digital_sdd_res *)resp->data; in digital_in_recv_sdd_res()
411 bcc ^= sdd_res->nfcid1[i]; in digital_in_recv_sdd_res()
413 if (bcc != sdd_res->bcc) { in digital_in_recv_sdd_res()
415 rc = -EINVAL; in digital_in_recv_sdd_res()
419 if (sdd_res->nfcid1[0] == DIGITAL_SDD_RES_CT) { in digital_in_recv_sdd_res()
427 memcpy(target->nfcid1 + target->nfcid1_len, sdd_res->nfcid1 + offset, in digital_in_recv_sdd_res()
429 target->nfcid1_len += size; in digital_in_recv_sdd_res()
456 return -ENOMEM; in digital_in_send_sdd_req()
458 if (target->nfcid1_len == 0) in digital_in_send_sdd_req()
460 else if (target->nfcid1_len == 3) in digital_in_send_sdd_req()
488 if (resp->len < sizeof(u16)) { in digital_in_recv_sens_res()
489 rc = -EIO; in digital_in_recv_sens_res()
495 rc = -ENOMEM; in digital_in_recv_sens_res()
499 target->sens_res = __le16_to_cpu(*(__le16 *)resp->data); in digital_in_recv_sens_res()
501 if (!DIGITAL_SENS_RES_IS_VALID(target->sens_res)) { in digital_in_recv_sens_res()
503 rc = -EINVAL; in digital_in_recv_sens_res()
507 if (DIGITAL_SENS_RES_IS_T1T(target->sens_res)) in digital_in_recv_sens_res()
538 return -ENOMEM; in digital_in_send_sens_req()
556 if (resp->len == DIGITAL_MIFARE_READ_RES_LEN + DIGITAL_CRC_LEN) { in digital_in_recv_mifare_res()
559 return -EIO; in digital_in_recv_mifare_res()
566 if (resp->len == 1 && resp->data[0] == DIGITAL_MIFARE_ACK_RES) { in digital_in_recv_mifare_res()
567 resp->data[0] = 0; in digital_in_recv_mifare_res()
572 return -EIO; in digital_in_recv_mifare_res()
588 if (resp->len < sizeof(*attrib_res)) { in digital_in_recv_attrib_res()
590 rc = -EIO; in digital_in_recv_attrib_res()
594 attrib_res = (struct digital_attrib_res *)resp->data; in digital_in_recv_attrib_res()
596 if (attrib_res->mbli_did & 0x0f) { in digital_in_recv_attrib_res()
598 rc = -EIO; in digital_in_recv_attrib_res()
622 return -ENOMEM; in digital_in_send_attrib_req()
626 attrib_req->cmd = DIGITAL_CMD_ATTRIB_REQ; in digital_in_send_attrib_req()
627 memcpy(attrib_req->nfcid0, sensb_res->nfcid0, in digital_in_send_attrib_req()
628 sizeof(attrib_req->nfcid0)); in digital_in_send_attrib_req()
629 attrib_req->param1 = DIGITAL_ATTRIB_P1_TR0_DEFAULT | in digital_in_send_attrib_req()
631 attrib_req->param2 = DIGITAL_ATTRIB_P2_LISTEN_POLL_1 | in digital_in_send_attrib_req()
634 attrib_req->param3 = sensb_res->proto_info[1] & 0x07; in digital_in_send_attrib_req()
635 attrib_req->param4 = DIGITAL_ATTRIB_P4_DID(0); in digital_in_send_attrib_req()
659 if (resp->len != sizeof(*sensb_res)) { in digital_in_recv_sensb_res()
661 rc = -EIO; in digital_in_recv_sensb_res()
665 sensb_res = (struct digital_sensb_res *)resp->data; in digital_in_recv_sensb_res()
667 if (sensb_res->cmd != DIGITAL_CMD_SENSB_RES) { in digital_in_recv_sensb_res()
669 rc = -EIO; in digital_in_recv_sensb_res()
673 if (!(sensb_res->proto_info[1] & BIT(0))) { in digital_in_recv_sensb_res()
675 rc = -EIO; in digital_in_recv_sensb_res()
679 if (sensb_res->proto_info[1] & BIT(3)) { in digital_in_recv_sensb_res()
681 rc = -EIO; in digital_in_recv_sensb_res()
685 fsci = DIGITAL_SENSB_FSCI(sensb_res->proto_info[1]); in digital_in_recv_sensb_res()
687 ddev->target_fsc = DIGITAL_ATS_MAX_FSC; in digital_in_recv_sensb_res()
689 ddev->target_fsc = digital_ats_fsc[fsci]; in digital_in_recv_sensb_res()
693 rc = -ENOMEM; in digital_in_recv_sensb_res()
726 return -ENOMEM; in digital_in_send_sensb_req()
730 sensb_req->cmd = DIGITAL_CMD_SENSB_REQ; in digital_in_send_sensb_req()
731 sensb_req->afi = 0x00; /* All families and sub-families */ in digital_in_send_sensb_req()
732 sensb_req->param = DIGITAL_SENSB_N(0); in digital_in_send_sensb_req()
756 if (resp->len < DIGITAL_SENSF_RES_MIN_LENGTH) { in digital_in_recv_sensf_res()
757 rc = -EIO; in digital_in_recv_sensf_res()
773 sensf_res = (struct digital_sensf_res *)resp->data; in digital_in_recv_sensf_res()
775 memcpy(target.sensf_res, sensf_res, resp->len); in digital_in_recv_sensf_res()
776 target.sensf_res_len = resp->len; in digital_in_recv_sensf_res()
778 memcpy(target.nfcid2, sensf_res->nfcid2, NFC_NFCID2_MAXSIZE); in digital_in_recv_sensf_res()
816 return -ENOMEM; in digital_in_send_sensf_req()
820 sensf_req = (struct digital_sensf_req *)skb->data; in digital_in_send_sensf_req()
821 sensf_req->cmd = DIGITAL_CMD_SENSF_REQ; in digital_in_send_sensf_req()
822 sensf_req->sc1 = 0xFF; in digital_in_send_sensf_req()
823 sensf_req->sc2 = 0xFF; in digital_in_send_sensf_req()
824 sensf_req->rc = 0; in digital_in_send_sensf_req()
825 sensf_req->tsn = 0; in digital_in_send_sensf_req()
853 if (resp->len != sizeof(*res)) { in digital_in_recv_iso15693_inv_res()
854 rc = -EIO; in digital_in_recv_iso15693_inv_res()
858 res = (struct digital_iso15693_inv_res *)resp->data; in digital_in_recv_iso15693_inv_res()
860 if (!DIGITAL_ISO15693_RES_IS_VALID(res->flags)) { in digital_in_recv_iso15693_inv_res()
861 PROTOCOL_ERR("ISO15693 - 10.3.1"); in digital_in_recv_iso15693_inv_res()
862 rc = -EINVAL; in digital_in_recv_iso15693_inv_res()
868 rc = -ENOMEM; in digital_in_recv_iso15693_inv_res()
872 target->is_iso15693 = 1; in digital_in_recv_iso15693_inv_res()
873 target->iso15693_dsfid = res->dsfid; in digital_in_recv_iso15693_inv_res()
874 memcpy(target->iso15693_uid, &res->uid, sizeof(target->iso15693_uid)); in digital_in_recv_iso15693_inv_res()
905 return -ENOMEM; in digital_in_send_iso15693_inv_req()
907 skb_put(skb, sizeof(*req) - sizeof(req->mask)); /* No mask */ in digital_in_send_iso15693_inv_req()
908 req = (struct digital_iso15693_inv_req *)skb->data; in digital_in_send_iso15693_inv_req()
910 /* Single sub-carrier, high data rate, no AFI, single slot in digital_in_send_iso15693_inv_req()
913 req->flags = DIGITAL_ISO15693_REQ_FLAG_DATA_RATE | in digital_in_send_iso15693_inv_req()
916 req->cmd = DIGITAL_CMD_ISO15693_INVENTORY_REQ; in digital_in_send_iso15693_inv_req()
917 req->mask_len = 0; in digital_in_send_iso15693_inv_req()
934 return -ENOMEM; in digital_tg_send_sel_res()
975 /* Silently ignore SEL_REQ content and send a SEL_RES for NFC-DEP */ in digital_tg_recv_sel_req()
994 return -ENOMEM; in digital_tg_send_sdd_res()
997 sdd_res = (struct digital_sdd_res *)skb->data; in digital_tg_send_sdd_res()
999 sdd_res->nfcid1[0] = 0x08; in digital_tg_send_sdd_res()
1000 get_random_bytes(sdd_res->nfcid1 + 1, 3); in digital_tg_send_sdd_res()
1002 sdd_res->bcc = 0; in digital_tg_send_sdd_res()
1004 sdd_res->bcc ^= sdd_res->nfcid1[i]; in digital_tg_send_sdd_res()
1033 sdd_req = resp->data; in digital_tg_recv_sdd_req()
1035 if (resp->len < 2 || sdd_req[0] != DIGITAL_CMD_SEL_REQ_CL1 || in digital_tg_recv_sdd_req()
1037 rc = -EINVAL; in digital_tg_recv_sdd_req()
1058 return -ENOMEM; in digital_tg_send_sens_res()
1092 sens_req = resp->data[0]; in digital_tg_recv_sens_req()
1094 if (!resp->len || (sens_req != DIGITAL_CMD_SENS_REQ && in digital_tg_recv_sens_req()
1096 rc = -EINVAL; in digital_tg_recv_sens_req()
1112 if (!IS_ERR(resp) && (resp->len >= 2) && in digital_tg_recv_atr_or_sensf_req()
1113 (resp->data[1] == DIGITAL_CMD_SENSF_REQ)) in digital_tg_recv_atr_or_sensf_req()
1131 if (sensf_req->rc == DIGITAL_SENSF_REQ_RC_NONE) in digital_tg_send_sensf_res()
1132 size -= sizeof(sensf_res->rd); in digital_tg_send_sensf_res()
1136 return -ENOMEM; in digital_tg_send_sensf_res()
1140 sensf_res = (struct digital_sensf_res *)skb->data; in digital_tg_send_sensf_res()
1144 sensf_res->cmd = DIGITAL_CMD_SENSF_RES; in digital_tg_send_sensf_res()
1145 sensf_res->nfcid2[0] = DIGITAL_SENSF_NFCID2_NFC_DEP_B1; in digital_tg_send_sensf_res()
1146 sensf_res->nfcid2[1] = DIGITAL_SENSF_NFCID2_NFC_DEP_B2; in digital_tg_send_sensf_res()
1147 get_random_bytes(&sensf_res->nfcid2[2], 6); in digital_tg_send_sensf_res()
1149 switch (sensf_req->rc) { in digital_tg_send_sensf_res()
1151 sensf_res->rd[0] = sensf_req->sc1; in digital_tg_send_sensf_res()
1152 sensf_res->rd[1] = sensf_req->sc2; in digital_tg_send_sensf_res()
1155 sensf_res->rd[0] = DIGITAL_SENSF_RES_RD_AP_B1; in digital_tg_send_sensf_res()
1156 sensf_res->rd[1] = DIGITAL_SENSF_RES_RD_AP_B2; in digital_tg_send_sensf_res()
1193 if (resp->len != sizeof(struct digital_sensf_req) + 1) { in digital_tg_recv_sensf_req()
1194 rc = -EINVAL; in digital_tg_recv_sensf_req()
1199 sensf_req = (struct digital_sensf_req *)resp->data; in digital_tg_recv_sensf_req()
1201 if (sensf_req->cmd != DIGITAL_CMD_SENSF_REQ) { in digital_tg_recv_sensf_req()
1202 rc = -EINVAL; in digital_tg_recv_sensf_req()
1273 rc = ddev->ops->tg_get_rf_tech(ddev, &rf_tech); in digital_tg_recv_md_req()