^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * NFC Digital Protocol stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2013, Intel Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define pr_fmt(fmt) "digital: %s: " fmt, __func__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include "digital.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define DIGITAL_NFC_DEP_N_RETRY_NACK 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define DIGITAL_NFC_DEP_N_RETRY_ATN 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define DIGITAL_NFC_DEP_FRAME_DIR_OUT 0xD4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define DIGITAL_NFC_DEP_FRAME_DIR_IN 0xD5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define DIGITAL_NFC_DEP_NFCA_SOD_SB 0xF0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define DIGITAL_CMD_ATR_REQ 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define DIGITAL_CMD_ATR_RES 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define DIGITAL_CMD_PSL_REQ 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define DIGITAL_CMD_PSL_RES 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define DIGITAL_CMD_DEP_REQ 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define DIGITAL_CMD_DEP_RES 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define DIGITAL_ATR_REQ_MIN_SIZE 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define DIGITAL_ATR_REQ_MAX_SIZE 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define DIGITAL_ATR_RES_TO_WT(s) ((s) & 0xF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define DIGITAL_DID_MAX 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define DIGITAL_PAYLOAD_SIZE_MAX 254
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define DIGITAL_PAYLOAD_BITS_TO_PP(s) (((s) & 0x3) << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define DIGITAL_PAYLOAD_PP_TO_BITS(s) (((s) >> 4) & 0x3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define DIGITAL_PAYLOAD_BITS_TO_FSL(s) ((s) & 0x3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define DIGITAL_PAYLOAD_FSL_TO_BITS(s) ((s) & 0x3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define DIGITAL_GB_BIT 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define DIGITAL_NFC_DEP_PFB_TYPE(pfb) ((pfb) & 0xE0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define DIGITAL_NFC_DEP_PFB_TIMEOUT_BIT 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define DIGITAL_NFC_DEP_PFB_MI_BIT 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define DIGITAL_NFC_DEP_PFB_NACK_BIT 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define DIGITAL_NFC_DEP_PFB_DID_BIT 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define DIGITAL_NFC_DEP_PFB_IS_TIMEOUT(pfb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ((pfb) & DIGITAL_NFC_DEP_PFB_TIMEOUT_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define DIGITAL_NFC_DEP_MI_BIT_SET(pfb) ((pfb) & DIGITAL_NFC_DEP_PFB_MI_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define DIGITAL_NFC_DEP_NACK_BIT_SET(pfb) ((pfb) & DIGITAL_NFC_DEP_PFB_NACK_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define DIGITAL_NFC_DEP_NAD_BIT_SET(pfb) ((pfb) & 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define DIGITAL_NFC_DEP_DID_BIT_SET(pfb) ((pfb) & DIGITAL_NFC_DEP_PFB_DID_BIT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define DIGITAL_NFC_DEP_PFB_PNI(pfb) ((pfb) & 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define DIGITAL_NFC_DEP_RTOX_VALUE(data) ((data) & 0x3F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define DIGITAL_NFC_DEP_RTOX_MAX 59
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define DIGITAL_NFC_DEP_PFB_I_PDU 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define DIGITAL_NFC_DEP_PFB_ACK_NACK_PDU 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define DIGITAL_NFC_DEP_PFB_SUPERVISOR_PDU 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct digital_atr_req {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) u8 dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) u8 nfcid3[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) u8 did;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) u8 bs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) u8 br;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) u8 pp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) u8 gb[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) struct digital_atr_res {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) u8 dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) u8 nfcid3[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u8 did;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u8 bs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) u8 br;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u8 to;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) u8 pp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) u8 gb[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) struct digital_psl_req {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) u8 dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) u8 did;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) u8 brs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) u8 fsl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) struct digital_psl_res {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) u8 dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) u8 did;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct digital_dep_req_res {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) u8 dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) u8 pfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) static void digital_in_recv_dep_res(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct sk_buff *resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) static void digital_tg_recv_dep_req(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct sk_buff *resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) static const u8 digital_payload_bits_map[4] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) [0] = 64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) [1] = 128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) [2] = 192,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) [3] = 254
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) /* Response Waiting Time for ATR_RES PDU in ms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * RWT(ATR_RES) = RWT(nfcdep,activation) + dRWT(nfcdep) + dT(nfcdep,initiator)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * with:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) * RWT(nfcdep,activation) = 4096 * 2^12 / f(c) s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) * dRWT(nfcdep) = 16 / f(c) s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) * dT(nfcdep,initiator) = 100 ms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) * f(c) = 13560000 Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define DIGITAL_ATR_RES_RWT 1337
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* Response Waiting Time for other DEP PDUs in ms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) * max_rwt = rwt + dRWT(nfcdep) + dT(nfcdep,initiator)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * with:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) * rwt = (256 * 16 / f(c)) * 2^wt s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * dRWT(nfcdep) = 16 / f(c) s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * dT(nfcdep,initiator) = 100 ms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) * f(c) = 13560000 Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * 0 <= wt <= 14 (given by the target by the TO field of ATR_RES response)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define DIGITAL_NFC_DEP_IN_MAX_WT 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define DIGITAL_NFC_DEP_TG_MAX_WT 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static const u16 digital_rwt_map[DIGITAL_NFC_DEP_IN_MAX_WT + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 100, 101, 101, 102, 105,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 110, 119, 139, 177, 255,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 409, 719, 1337, 2575, 5049,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) static u8 digital_payload_bits_to_size(u8 payload_bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) if (payload_bits >= ARRAY_SIZE(digital_payload_bits_map))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) return digital_payload_bits_map[payload_bits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) static u8 digital_payload_size_to_bits(u8 payload_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) for (i = 0; i < ARRAY_SIZE(digital_payload_bits_map); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) if (digital_payload_bits_map[i] == payload_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) return 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) static void digital_skb_push_dep_sod(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) skb_push(skb, sizeof(u8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) skb->data[0] = skb->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) if (ddev->curr_rf_tech == NFC_DIGITAL_RF_TECH_106A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) *(u8 *)skb_push(skb, sizeof(u8)) = DIGITAL_NFC_DEP_NFCA_SOD_SB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) static int digital_skb_pull_dep_sod(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) u8 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) if (skb->len < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) if (ddev->curr_rf_tech == NFC_DIGITAL_RF_TECH_106A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) skb_pull(skb, sizeof(u8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) size = skb->data[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) if (size != skb->len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) skb_pull(skb, sizeof(u8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) static struct sk_buff *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) digital_send_dep_data_prep(struct nfc_digital_dev *ddev, struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) struct digital_dep_req_res *dep_req_res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) struct digital_data_exch *data_exch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) struct sk_buff *new_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) if (skb->len > ddev->remote_payload_max) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) dep_req_res->pfb |= DIGITAL_NFC_DEP_PFB_MI_BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) new_skb = digital_skb_alloc(ddev, ddev->remote_payload_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) if (!new_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) kfree_skb(ddev->chaining_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) ddev->chaining_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) skb_put_data(new_skb, skb->data, ddev->remote_payload_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) skb_pull(skb, ddev->remote_payload_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) ddev->chaining_skb = skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) ddev->data_exch = data_exch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) ddev->chaining_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) new_skb = skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) return new_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) static struct sk_buff *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) digital_recv_dep_data_gather(struct nfc_digital_dev *ddev, u8 pfb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) struct sk_buff *resp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) int (*send_ack)(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) struct digital_data_exch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) *data_exch),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) struct digital_data_exch *data_exch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct sk_buff *new_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) if (DIGITAL_NFC_DEP_MI_BIT_SET(pfb) && (!ddev->chaining_skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) ddev->chaining_skb =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) nfc_alloc_recv_skb(8 * ddev->local_payload_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) if (!ddev->chaining_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) if (ddev->chaining_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if (resp->len > skb_tailroom(ddev->chaining_skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) new_skb = skb_copy_expand(ddev->chaining_skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) skb_headroom(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) ddev->chaining_skb),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 8 * ddev->local_payload_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) if (!new_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) kfree_skb(ddev->chaining_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) ddev->chaining_skb = new_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) skb_put_data(ddev->chaining_skb, resp->data, resp->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) resp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) if (DIGITAL_NFC_DEP_MI_BIT_SET(pfb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) rc = send_ack(ddev, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) resp = ddev->chaining_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) ddev->chaining_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) return resp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) kfree_skb(ddev->chaining_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) ddev->chaining_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) return ERR_PTR(rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) static void digital_in_recv_psl_res(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) struct sk_buff *resp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) struct nfc_target *target = arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) struct digital_psl_res *psl_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) if (IS_ERR(resp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) rc = PTR_ERR(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) resp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) rc = ddev->skb_check_crc(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) PROTOCOL_ERR("14.4.1.6");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) rc = digital_skb_pull_dep_sod(ddev, resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) PROTOCOL_ERR("14.4.1.2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) psl_res = (struct digital_psl_res *)resp->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) if ((resp->len != sizeof(*psl_res)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) (psl_res->dir != DIGITAL_NFC_DEP_FRAME_DIR_IN) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) (psl_res->cmd != DIGITAL_CMD_PSL_RES)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) NFC_DIGITAL_RF_TECH_424F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) NFC_DIGITAL_FRAMING_NFCF_NFC_DEP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) if (!DIGITAL_DRV_CAPS_IN_CRC(ddev) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) (ddev->curr_rf_tech == NFC_DIGITAL_RF_TECH_106A)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) ddev->skb_add_crc = digital_skb_add_crc_f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) ddev->skb_check_crc = digital_skb_check_crc_f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) ddev->curr_rf_tech = NFC_DIGITAL_RF_TECH_424F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) nfc_dep_link_is_up(ddev->nfc_dev, target->idx, NFC_COMM_ACTIVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) NFC_RF_INITIATOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) ddev->curr_nfc_dep_pni = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) dev_kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) ddev->curr_protocol = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) static int digital_in_send_psl_req(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) struct nfc_target *target)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) struct digital_psl_req *psl_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) u8 payload_size, payload_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) skb = digital_skb_alloc(ddev, sizeof(*psl_req));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) skb_put(skb, sizeof(*psl_req));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) psl_req = (struct digital_psl_req *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) psl_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) psl_req->cmd = DIGITAL_CMD_PSL_REQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) psl_req->did = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) psl_req->brs = (0x2 << 3) | 0x2; /* 424F both directions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) payload_size = min(ddev->local_payload_max, ddev->remote_payload_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) payload_bits = digital_payload_size_to_bits(payload_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) psl_req->fsl = DIGITAL_PAYLOAD_BITS_TO_FSL(payload_bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) ddev->local_payload_max = payload_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) ddev->remote_payload_max = payload_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) digital_skb_push_dep_sod(ddev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) ddev->skb_add_crc(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) rc = digital_in_send_cmd(ddev, skb, ddev->dep_rwt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) digital_in_recv_psl_res, target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) static void digital_in_recv_atr_res(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) struct sk_buff *resp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) struct nfc_target *target = arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) struct digital_atr_res *atr_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) u8 gb_len, payload_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) u8 wt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) if (IS_ERR(resp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) rc = PTR_ERR(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) resp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) rc = ddev->skb_check_crc(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) PROTOCOL_ERR("14.4.1.6");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) rc = digital_skb_pull_dep_sod(ddev, resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) PROTOCOL_ERR("14.4.1.2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) if (resp->len < sizeof(struct digital_atr_res)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) gb_len = resp->len - sizeof(struct digital_atr_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) atr_res = (struct digital_atr_res *)resp->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) wt = DIGITAL_ATR_RES_TO_WT(atr_res->to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) if (wt > DIGITAL_NFC_DEP_IN_MAX_WT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) wt = DIGITAL_NFC_DEP_IN_MAX_WT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) ddev->dep_rwt = digital_rwt_map[wt];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) payload_bits = DIGITAL_PAYLOAD_PP_TO_BITS(atr_res->pp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) ddev->remote_payload_max = digital_payload_bits_to_size(payload_bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) if (!ddev->remote_payload_max) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) rc = nfc_set_remote_general_bytes(ddev->nfc_dev, atr_res->gb, gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) if ((ddev->protocols & NFC_PROTO_FELICA_MASK) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) (ddev->curr_rf_tech != NFC_DIGITAL_RF_TECH_424F)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) rc = digital_in_send_psl_req(ddev, target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) if (!rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) rc = nfc_dep_link_is_up(ddev->nfc_dev, target->idx, NFC_COMM_ACTIVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) NFC_RF_INITIATOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) ddev->curr_nfc_dep_pni = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) dev_kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) ddev->curr_protocol = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) int digital_in_send_atr_req(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) struct nfc_target *target, __u8 comm_mode, __u8 *gb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) size_t gb_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) struct digital_atr_req *atr_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) uint size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) u8 payload_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) size = DIGITAL_ATR_REQ_MIN_SIZE + gb_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) if (size > DIGITAL_ATR_REQ_MAX_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) PROTOCOL_ERR("14.6.1.1");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) skb = digital_skb_alloc(ddev, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) skb_put(skb, sizeof(struct digital_atr_req));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) atr_req = (struct digital_atr_req *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) memset(atr_req, 0, sizeof(struct digital_atr_req));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) atr_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) atr_req->cmd = DIGITAL_CMD_ATR_REQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) if (target->nfcid2_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) memcpy(atr_req->nfcid3, target->nfcid2, NFC_NFCID2_MAXSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) get_random_bytes(atr_req->nfcid3, NFC_NFCID3_MAXSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) atr_req->did = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) atr_req->bs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) atr_req->br = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) ddev->local_payload_max = DIGITAL_PAYLOAD_SIZE_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) payload_bits = digital_payload_size_to_bits(ddev->local_payload_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) atr_req->pp = DIGITAL_PAYLOAD_BITS_TO_PP(payload_bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) if (gb_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) atr_req->pp |= DIGITAL_GB_BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) skb_put_data(skb, gb, gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) digital_skb_push_dep_sod(ddev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) ddev->skb_add_crc(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) rc = digital_in_send_cmd(ddev, skb, DIGITAL_ATR_RES_RWT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) digital_in_recv_atr_res, target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) static int digital_in_send_ack(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) struct digital_data_exch *data_exch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) struct digital_dep_req_res *dep_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) skb = digital_skb_alloc(ddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) skb_push(skb, sizeof(struct digital_dep_req_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) dep_req = (struct digital_dep_req_res *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) dep_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) dep_req->cmd = DIGITAL_CMD_DEP_REQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) dep_req->pfb = DIGITAL_NFC_DEP_PFB_ACK_NACK_PDU |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) ddev->curr_nfc_dep_pni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) digital_skb_push_dep_sod(ddev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) ddev->skb_add_crc(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) ddev->saved_skb = pskb_copy(skb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) rc = digital_in_send_cmd(ddev, skb, ddev->dep_rwt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) digital_in_recv_dep_res, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) ddev->saved_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) static int digital_in_send_nack(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) struct digital_data_exch *data_exch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) struct digital_dep_req_res *dep_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) skb = digital_skb_alloc(ddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) skb_push(skb, sizeof(struct digital_dep_req_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) dep_req = (struct digital_dep_req_res *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) dep_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) dep_req->cmd = DIGITAL_CMD_DEP_REQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) dep_req->pfb = DIGITAL_NFC_DEP_PFB_ACK_NACK_PDU |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) DIGITAL_NFC_DEP_PFB_NACK_BIT | ddev->curr_nfc_dep_pni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) digital_skb_push_dep_sod(ddev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) ddev->skb_add_crc(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) rc = digital_in_send_cmd(ddev, skb, ddev->dep_rwt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) digital_in_recv_dep_res, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) static int digital_in_send_atn(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) struct digital_data_exch *data_exch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) struct digital_dep_req_res *dep_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) skb = digital_skb_alloc(ddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) skb_push(skb, sizeof(struct digital_dep_req_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) dep_req = (struct digital_dep_req_res *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) dep_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) dep_req->cmd = DIGITAL_CMD_DEP_REQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) dep_req->pfb = DIGITAL_NFC_DEP_PFB_SUPERVISOR_PDU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) digital_skb_push_dep_sod(ddev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) ddev->skb_add_crc(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) rc = digital_in_send_cmd(ddev, skb, ddev->dep_rwt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) digital_in_recv_dep_res, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) static int digital_in_send_rtox(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) struct digital_data_exch *data_exch, u8 rtox)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) struct digital_dep_req_res *dep_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) u16 rwt_int;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) rwt_int = ddev->dep_rwt * rtox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) if (rwt_int > digital_rwt_map[DIGITAL_NFC_DEP_IN_MAX_WT])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) rwt_int = digital_rwt_map[DIGITAL_NFC_DEP_IN_MAX_WT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) skb = digital_skb_alloc(ddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) skb_put_u8(skb, rtox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) skb_push(skb, sizeof(struct digital_dep_req_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) dep_req = (struct digital_dep_req_res *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) dep_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) dep_req->cmd = DIGITAL_CMD_DEP_REQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) dep_req->pfb = DIGITAL_NFC_DEP_PFB_SUPERVISOR_PDU |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) DIGITAL_NFC_DEP_PFB_TIMEOUT_BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) digital_skb_push_dep_sod(ddev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) ddev->skb_add_crc(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) rc = digital_in_send_cmd(ddev, skb, rwt_int,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) digital_in_recv_dep_res, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) static int digital_in_send_saved_skb(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) struct digital_data_exch *data_exch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) if (!ddev->saved_skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) skb_get(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) rc = digital_in_send_cmd(ddev, ddev->saved_skb, ddev->dep_rwt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) digital_in_recv_dep_res, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) static void digital_in_recv_dep_res(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) struct sk_buff *resp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) struct digital_data_exch *data_exch = arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) struct digital_dep_req_res *dep_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) u8 pfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) uint size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) u8 rtox;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) if (IS_ERR(resp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) rc = PTR_ERR(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) resp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) if ((rc == -EIO || (rc == -ETIMEDOUT && ddev->nack_count)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) (ddev->nack_count++ < DIGITAL_NFC_DEP_N_RETRY_NACK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) ddev->atn_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) rc = digital_in_send_nack(ddev, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) } else if ((rc == -ETIMEDOUT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) (ddev->atn_count++ < DIGITAL_NFC_DEP_N_RETRY_ATN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) ddev->nack_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) rc = digital_in_send_atn(ddev, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) rc = digital_skb_pull_dep_sod(ddev, resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) PROTOCOL_ERR("14.4.1.2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) rc = ddev->skb_check_crc(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) if ((resp->len >= 4) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) (ddev->nack_count++ < DIGITAL_NFC_DEP_N_RETRY_NACK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) ddev->atn_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) rc = digital_in_send_nack(ddev, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) PROTOCOL_ERR("14.4.1.6");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) ddev->atn_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) ddev->nack_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) if (resp->len > ddev->local_payload_max) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) rc = -EMSGSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) size = sizeof(struct digital_dep_req_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) dep_res = (struct digital_dep_req_res *)resp->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) if (resp->len < size || dep_res->dir != DIGITAL_NFC_DEP_FRAME_DIR_IN ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) dep_res->cmd != DIGITAL_CMD_DEP_RES) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) pfb = dep_res->pfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) if (DIGITAL_NFC_DEP_DID_BIT_SET(pfb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) PROTOCOL_ERR("14.8.2.1");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) if (DIGITAL_NFC_DEP_NAD_BIT_SET(pfb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) if (size > resp->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) skb_pull(resp, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) switch (DIGITAL_NFC_DEP_PFB_TYPE(pfb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) case DIGITAL_NFC_DEP_PFB_I_PDU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) if (DIGITAL_NFC_DEP_PFB_PNI(pfb) != ddev->curr_nfc_dep_pni) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) PROTOCOL_ERR("14.12.3.3");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) ddev->curr_nfc_dep_pni =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) DIGITAL_NFC_DEP_PFB_PNI(ddev->curr_nfc_dep_pni + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) ddev->saved_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) resp = digital_recv_dep_data_gather(ddev, pfb, resp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) digital_in_send_ack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) if (IS_ERR(resp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) rc = PTR_ERR(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) resp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) /* If resp is NULL then we're still chaining so return and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) * wait for the next part of the PDU. Else, the PDU is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) * complete so pass it up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) if (!resp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) case DIGITAL_NFC_DEP_PFB_ACK_NACK_PDU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) if (DIGITAL_NFC_DEP_NACK_BIT_SET(pfb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) PROTOCOL_ERR("14.12.4.5");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) if (DIGITAL_NFC_DEP_PFB_PNI(pfb) != ddev->curr_nfc_dep_pni) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) PROTOCOL_ERR("14.12.3.3");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) ddev->curr_nfc_dep_pni =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) DIGITAL_NFC_DEP_PFB_PNI(ddev->curr_nfc_dep_pni + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) if (!ddev->chaining_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) PROTOCOL_ERR("14.12.4.3");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) /* The initiator has received a valid ACK. Free the last sent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) * PDU and keep on sending chained skb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) ddev->saved_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) rc = digital_in_send_dep_req(ddev, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) ddev->chaining_skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) ddev->data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) goto free_resp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) case DIGITAL_NFC_DEP_PFB_SUPERVISOR_PDU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) if (!DIGITAL_NFC_DEP_PFB_IS_TIMEOUT(pfb)) { /* ATN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) rc = digital_in_send_saved_skb(ddev, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) goto free_resp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) if (ddev->atn_count || ddev->nack_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) PROTOCOL_ERR("14.12.4.4");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) rtox = DIGITAL_NFC_DEP_RTOX_VALUE(resp->data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) if (!rtox || rtox > DIGITAL_NFC_DEP_RTOX_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) PROTOCOL_ERR("14.8.4.1");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) rc = digital_in_send_rtox(ddev, data_exch, rtox);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) goto free_resp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) data_exch->cb(data_exch->cb_context, resp, rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) kfree(data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) kfree_skb(ddev->chaining_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) ddev->chaining_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) ddev->saved_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) free_resp:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) dev_kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) int digital_in_send_dep_req(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) struct nfc_target *target, struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) struct digital_data_exch *data_exch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) struct digital_dep_req_res *dep_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) struct sk_buff *chaining_skb, *tmp_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) skb_push(skb, sizeof(struct digital_dep_req_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) dep_req = (struct digital_dep_req_res *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) dep_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) dep_req->cmd = DIGITAL_CMD_DEP_REQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) dep_req->pfb = ddev->curr_nfc_dep_pni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) ddev->atn_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) ddev->nack_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) chaining_skb = ddev->chaining_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) tmp_skb = digital_send_dep_data_prep(ddev, skb, dep_req, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) if (IS_ERR(tmp_skb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) return PTR_ERR(tmp_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) digital_skb_push_dep_sod(ddev, tmp_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) ddev->skb_add_crc(tmp_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) ddev->saved_skb = pskb_copy(tmp_skb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) rc = digital_in_send_cmd(ddev, tmp_skb, ddev->dep_rwt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) digital_in_recv_dep_res, data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) if (tmp_skb != skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) kfree_skb(tmp_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) kfree_skb(chaining_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) ddev->chaining_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) ddev->saved_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) static void digital_tg_set_rf_tech(struct nfc_digital_dev *ddev, u8 rf_tech)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) ddev->curr_rf_tech = rf_tech;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) ddev->skb_add_crc = digital_skb_add_crc_none;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) ddev->skb_check_crc = digital_skb_check_crc_none;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) if (DIGITAL_DRV_CAPS_TG_CRC(ddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) switch (ddev->curr_rf_tech) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) case NFC_DIGITAL_RF_TECH_106A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) ddev->skb_add_crc = digital_skb_add_crc_a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) ddev->skb_check_crc = digital_skb_check_crc_a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) case NFC_DIGITAL_RF_TECH_212F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) case NFC_DIGITAL_RF_TECH_424F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) ddev->skb_add_crc = digital_skb_add_crc_f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) ddev->skb_check_crc = digital_skb_check_crc_f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) static int digital_tg_send_ack(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) struct digital_data_exch *data_exch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) struct digital_dep_req_res *dep_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) skb = digital_skb_alloc(ddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) skb_push(skb, sizeof(struct digital_dep_req_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) dep_res = (struct digital_dep_req_res *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) dep_res->dir = DIGITAL_NFC_DEP_FRAME_DIR_IN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) dep_res->cmd = DIGITAL_CMD_DEP_RES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) dep_res->pfb = DIGITAL_NFC_DEP_PFB_ACK_NACK_PDU |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) ddev->curr_nfc_dep_pni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) if (ddev->did) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) dep_res->pfb |= DIGITAL_NFC_DEP_PFB_DID_BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) skb_put_data(skb, &ddev->did, sizeof(ddev->did));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) ddev->curr_nfc_dep_pni =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) DIGITAL_NFC_DEP_PFB_PNI(ddev->curr_nfc_dep_pni + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) digital_skb_push_dep_sod(ddev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) ddev->skb_add_crc(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) ddev->saved_skb = pskb_copy(skb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) rc = digital_tg_send_cmd(ddev, skb, 1500, digital_tg_recv_dep_req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) ddev->saved_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) static int digital_tg_send_atn(struct nfc_digital_dev *ddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) struct digital_dep_req_res *dep_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) skb = digital_skb_alloc(ddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) skb_push(skb, sizeof(struct digital_dep_req_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) dep_res = (struct digital_dep_req_res *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) dep_res->dir = DIGITAL_NFC_DEP_FRAME_DIR_IN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) dep_res->cmd = DIGITAL_CMD_DEP_RES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) dep_res->pfb = DIGITAL_NFC_DEP_PFB_SUPERVISOR_PDU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) if (ddev->did) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) dep_res->pfb |= DIGITAL_NFC_DEP_PFB_DID_BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) skb_put_data(skb, &ddev->did, sizeof(ddev->did));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) digital_skb_push_dep_sod(ddev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) ddev->skb_add_crc(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) rc = digital_tg_send_cmd(ddev, skb, 1500, digital_tg_recv_dep_req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) static int digital_tg_send_saved_skb(struct nfc_digital_dev *ddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) if (!ddev->saved_skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) skb_get(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) rc = digital_tg_send_cmd(ddev, ddev->saved_skb, 1500,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) digital_tg_recv_dep_req, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) static void digital_tg_recv_dep_req(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) struct sk_buff *resp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) struct digital_dep_req_res *dep_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) u8 pfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) size_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) if (IS_ERR(resp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) rc = PTR_ERR(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) resp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) rc = ddev->skb_check_crc(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) PROTOCOL_ERR("14.4.1.6");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) rc = digital_skb_pull_dep_sod(ddev, resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) PROTOCOL_ERR("14.4.1.2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) if (resp->len > ddev->local_payload_max) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) rc = -EMSGSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) size = sizeof(struct digital_dep_req_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) dep_req = (struct digital_dep_req_res *)resp->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) if (resp->len < size || dep_req->dir != DIGITAL_NFC_DEP_FRAME_DIR_OUT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) dep_req->cmd != DIGITAL_CMD_DEP_REQ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) pfb = dep_req->pfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) if (DIGITAL_NFC_DEP_DID_BIT_SET(pfb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) if (ddev->did && (ddev->did == resp->data[3])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) size++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) } else if (ddev->did) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) if (DIGITAL_NFC_DEP_NAD_BIT_SET(pfb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) if (size > resp->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) skb_pull(resp, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) switch (DIGITAL_NFC_DEP_PFB_TYPE(pfb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) case DIGITAL_NFC_DEP_PFB_I_PDU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) pr_debug("DIGITAL_NFC_DEP_PFB_I_PDU\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) if (ddev->atn_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) /* The target has received (and replied to) at least one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) * ATN DEP_REQ.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) ddev->atn_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) /* pni of resp PDU equal to the target current pni - 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) * means resp is the previous DEP_REQ PDU received from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) * the initiator so the target replies with saved_skb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) * which is the previous DEP_RES saved in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) * digital_tg_send_dep_res().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) if (DIGITAL_NFC_DEP_PFB_PNI(pfb) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) DIGITAL_NFC_DEP_PFB_PNI(ddev->curr_nfc_dep_pni - 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) rc = digital_tg_send_saved_skb(ddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) goto free_resp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) /* atn_count > 0 and PDU pni != curr_nfc_dep_pni - 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) * means the target probably did not received the last
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) * DEP_REQ PDU sent by the initiator. The target
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) * fallbacks to normal processing then.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) if (DIGITAL_NFC_DEP_PFB_PNI(pfb) != ddev->curr_nfc_dep_pni) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) PROTOCOL_ERR("14.12.3.4");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) ddev->saved_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) resp = digital_recv_dep_data_gather(ddev, pfb, resp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) digital_tg_send_ack, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) if (IS_ERR(resp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) rc = PTR_ERR(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) resp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) /* If resp is NULL then we're still chaining so return and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) * wait for the next part of the PDU. Else, the PDU is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) * complete so pass it up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) if (!resp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) case DIGITAL_NFC_DEP_PFB_ACK_NACK_PDU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) if (DIGITAL_NFC_DEP_NACK_BIT_SET(pfb)) { /* NACK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) if (DIGITAL_NFC_DEP_PFB_PNI(pfb + 1) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) ddev->curr_nfc_dep_pni) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) ddev->atn_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) rc = digital_tg_send_saved_skb(ddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) goto free_resp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) /* ACK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) if (ddev->atn_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) /* The target has previously recevied one or more ATN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) * PDUs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) ddev->atn_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) /* If the ACK PNI is equal to the target PNI - 1 means
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) * that the initiator did not receive the previous PDU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) * sent by the target so re-send it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) if (DIGITAL_NFC_DEP_PFB_PNI(pfb + 1) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) ddev->curr_nfc_dep_pni) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) rc = digital_tg_send_saved_skb(ddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) goto free_resp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) /* Otherwise, the target did not receive the previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) * ACK PDU from the initiator. Fallback to normal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) * processing of chained PDU then.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) /* Keep on sending chained PDU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) if (!ddev->chaining_skb ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) DIGITAL_NFC_DEP_PFB_PNI(pfb) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) ddev->curr_nfc_dep_pni) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) ddev->saved_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) rc = digital_tg_send_dep_res(ddev, ddev->chaining_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) goto free_resp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) case DIGITAL_NFC_DEP_PFB_SUPERVISOR_PDU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) if (DIGITAL_NFC_DEP_PFB_IS_TIMEOUT(pfb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) rc = digital_tg_send_atn(ddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) ddev->atn_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) goto free_resp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) rc = nfc_tm_data_received(ddev->nfc_dev, resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) resp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) kfree_skb(ddev->chaining_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) ddev->chaining_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) ddev->atn_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) ddev->saved_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) free_resp:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) dev_kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) struct digital_dep_req_res *dep_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) struct sk_buff *chaining_skb, *tmp_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) skb_push(skb, sizeof(struct digital_dep_req_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) dep_res = (struct digital_dep_req_res *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) dep_res->dir = DIGITAL_NFC_DEP_FRAME_DIR_IN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) dep_res->cmd = DIGITAL_CMD_DEP_RES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) dep_res->pfb = ddev->curr_nfc_dep_pni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) if (ddev->did) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) dep_res->pfb |= DIGITAL_NFC_DEP_PFB_DID_BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) skb_put_data(skb, &ddev->did, sizeof(ddev->did));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) ddev->curr_nfc_dep_pni =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) DIGITAL_NFC_DEP_PFB_PNI(ddev->curr_nfc_dep_pni + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) chaining_skb = ddev->chaining_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) tmp_skb = digital_send_dep_data_prep(ddev, skb, dep_res, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) if (IS_ERR(tmp_skb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) return PTR_ERR(tmp_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) digital_skb_push_dep_sod(ddev, tmp_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) ddev->skb_add_crc(tmp_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) ddev->saved_skb = pskb_copy(tmp_skb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) rc = digital_tg_send_cmd(ddev, tmp_skb, 1500, digital_tg_recv_dep_req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) if (tmp_skb != skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) kfree_skb(tmp_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) kfree_skb(chaining_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) ddev->chaining_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) kfree_skb(ddev->saved_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) ddev->saved_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) static void digital_tg_send_psl_res_complete(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) void *arg, struct sk_buff *resp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) u8 rf_tech = (unsigned long)arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) if (IS_ERR(resp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) digital_tg_set_rf_tech(ddev, rf_tech);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) digital_tg_listen(ddev, 1500, digital_tg_recv_dep_req, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) dev_kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) static int digital_tg_send_psl_res(struct nfc_digital_dev *ddev, u8 did,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) u8 rf_tech)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) struct digital_psl_res *psl_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) skb = digital_skb_alloc(ddev, sizeof(struct digital_psl_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) skb_put(skb, sizeof(struct digital_psl_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) psl_res = (struct digital_psl_res *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) psl_res->dir = DIGITAL_NFC_DEP_FRAME_DIR_IN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) psl_res->cmd = DIGITAL_CMD_PSL_RES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) psl_res->did = did;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) digital_skb_push_dep_sod(ddev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) ddev->skb_add_crc(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) ddev->curr_nfc_dep_pni = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) rc = digital_tg_send_cmd(ddev, skb, 0, digital_tg_send_psl_res_complete,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) (void *)(unsigned long)rf_tech);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) static void digital_tg_recv_psl_req(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) struct sk_buff *resp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) struct digital_psl_req *psl_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) u8 rf_tech;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) u8 dsi, payload_size, payload_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) if (IS_ERR(resp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) rc = PTR_ERR(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) resp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) rc = ddev->skb_check_crc(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) PROTOCOL_ERR("14.4.1.6");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) rc = digital_skb_pull_dep_sod(ddev, resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) PROTOCOL_ERR("14.4.1.2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) psl_req = (struct digital_psl_req *)resp->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) if (resp->len != sizeof(struct digital_psl_req) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) psl_req->dir != DIGITAL_NFC_DEP_FRAME_DIR_OUT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) psl_req->cmd != DIGITAL_CMD_PSL_REQ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) dsi = (psl_req->brs >> 3) & 0x07;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) switch (dsi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) rf_tech = NFC_DIGITAL_RF_TECH_106A;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) rf_tech = NFC_DIGITAL_RF_TECH_212F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) rf_tech = NFC_DIGITAL_RF_TECH_424F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) pr_err("Unsupported dsi value %d\n", dsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) payload_bits = DIGITAL_PAYLOAD_FSL_TO_BITS(psl_req->fsl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) payload_size = digital_payload_bits_to_size(payload_bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) if (!payload_size || (payload_size > min(ddev->local_payload_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) ddev->remote_payload_max))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) ddev->local_payload_max = payload_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) ddev->remote_payload_max = payload_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) rc = digital_tg_send_psl_res(ddev, psl_req->did, rf_tech);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) static void digital_tg_send_atr_res_complete(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) void *arg, struct sk_buff *resp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) int offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) if (IS_ERR(resp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) digital_poll_next_tech(ddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) offset = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) if (resp->data[0] == DIGITAL_NFC_DEP_NFCA_SOD_SB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) offset++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) ddev->atn_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) if (resp->data[offset] == DIGITAL_CMD_PSL_REQ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) digital_tg_recv_psl_req(ddev, arg, resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) digital_tg_recv_dep_req(ddev, arg, resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) static int digital_tg_send_atr_res(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) struct digital_atr_req *atr_req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) struct digital_atr_res *atr_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) u8 *gb, payload_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) size_t gb_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) gb = nfc_get_local_general_bytes(ddev->nfc_dev, &gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) if (!gb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) gb_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) skb = digital_skb_alloc(ddev, sizeof(struct digital_atr_res) + gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) skb_put(skb, sizeof(struct digital_atr_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) atr_res = (struct digital_atr_res *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) memset(atr_res, 0, sizeof(struct digital_atr_res));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) atr_res->dir = DIGITAL_NFC_DEP_FRAME_DIR_IN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) atr_res->cmd = DIGITAL_CMD_ATR_RES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) memcpy(atr_res->nfcid3, atr_req->nfcid3, sizeof(atr_req->nfcid3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) atr_res->to = DIGITAL_NFC_DEP_TG_MAX_WT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) ddev->local_payload_max = DIGITAL_PAYLOAD_SIZE_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) payload_bits = digital_payload_size_to_bits(ddev->local_payload_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) atr_res->pp = DIGITAL_PAYLOAD_BITS_TO_PP(payload_bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) if (gb_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) skb_put(skb, gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) atr_res->pp |= DIGITAL_GB_BIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) memcpy(atr_res->gb, gb, gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) digital_skb_push_dep_sod(ddev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) ddev->skb_add_crc(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) ddev->curr_nfc_dep_pni = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) rc = digital_tg_send_cmd(ddev, skb, 999,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) digital_tg_send_atr_res_complete, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) struct sk_buff *resp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) struct digital_atr_req *atr_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) size_t gb_len, min_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) u8 poll_tech_count, payload_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) if (IS_ERR(resp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) rc = PTR_ERR(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) resp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) if (!resp->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) if (resp->data[0] == DIGITAL_NFC_DEP_NFCA_SOD_SB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) min_size = DIGITAL_ATR_REQ_MIN_SIZE + 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) digital_tg_set_rf_tech(ddev, NFC_DIGITAL_RF_TECH_106A);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) min_size = DIGITAL_ATR_REQ_MIN_SIZE + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) digital_tg_set_rf_tech(ddev, NFC_DIGITAL_RF_TECH_212F);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) if (resp->len < min_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) ddev->curr_protocol = NFC_PROTO_NFC_DEP_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) rc = ddev->skb_check_crc(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) PROTOCOL_ERR("14.4.1.6");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) rc = digital_skb_pull_dep_sod(ddev, resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) PROTOCOL_ERR("14.4.1.2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) atr_req = (struct digital_atr_req *)resp->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) if (atr_req->dir != DIGITAL_NFC_DEP_FRAME_DIR_OUT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) atr_req->cmd != DIGITAL_CMD_ATR_REQ ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) atr_req->did > DIGITAL_DID_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) payload_bits = DIGITAL_PAYLOAD_PP_TO_BITS(atr_req->pp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) ddev->remote_payload_max = digital_payload_bits_to_size(payload_bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) if (!ddev->remote_payload_max) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) ddev->did = atr_req->did;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) rc = digital_tg_send_atr_res(ddev, atr_req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) gb_len = resp->len - sizeof(struct digital_atr_req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) poll_tech_count = ddev->poll_tech_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) ddev->poll_tech_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) rc = nfc_tm_activated(ddev->nfc_dev, NFC_PROTO_NFC_DEP_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) NFC_COMM_PASSIVE, atr_req->gb, gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) ddev->poll_tech_count = poll_tech_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) digital_poll_next_tech(ddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) dev_kfree_skb(resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) }