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