root/drivers/nfc/st21nfca/dep.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. st21nfca_tx_work
  2. st21nfca_im_send_pdu
  3. st21nfca_tm_send_atr_res
  4. st21nfca_tm_recv_atr_req
  5. st21nfca_tm_send_psl_res
  6. st21nfca_tm_recv_psl_req
  7. st21nfca_tm_send_dep_res
  8. st21nfca_tm_recv_dep_req
  9. st21nfca_tm_event_send_data
  10. st21nfca_dep_event_received
  11. st21nfca_im_send_psl_req
  12. st21nfca_im_recv_atr_res_cb
  13. st21nfca_im_send_atr_req
  14. st21nfca_im_recv_dep_res_cb
  15. st21nfca_im_send_dep_req
  16. st21nfca_dep_init
  17. st21nfca_dep_deinit

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Copyright (C) 2014  STMicroelectronics SAS. All rights reserved.
   4  */
   5 
   6 #include <net/nfc/hci.h>
   7 
   8 #include "st21nfca.h"
   9 
  10 #define ST21NFCA_NFCIP1_INITIATOR 0x00
  11 #define ST21NFCA_NFCIP1_REQ 0xd4
  12 #define ST21NFCA_NFCIP1_RES 0xd5
  13 #define ST21NFCA_NFCIP1_ATR_REQ 0x00
  14 #define ST21NFCA_NFCIP1_ATR_RES 0x01
  15 #define ST21NFCA_NFCIP1_PSL_REQ 0x04
  16 #define ST21NFCA_NFCIP1_PSL_RES 0x05
  17 #define ST21NFCA_NFCIP1_DEP_REQ 0x06
  18 #define ST21NFCA_NFCIP1_DEP_RES 0x07
  19 
  20 #define ST21NFCA_NFC_DEP_PFB_PNI(pfb)     ((pfb) & 0x03)
  21 #define ST21NFCA_NFC_DEP_PFB_TYPE(pfb) ((pfb) & 0xE0)
  22 #define ST21NFCA_NFC_DEP_PFB_IS_TIMEOUT(pfb) \
  23                                 ((pfb) & ST21NFCA_NFC_DEP_PFB_TIMEOUT_BIT)
  24 #define ST21NFCA_NFC_DEP_DID_BIT_SET(pfb) ((pfb) & 0x04)
  25 #define ST21NFCA_NFC_DEP_NAD_BIT_SET(pfb) ((pfb) & 0x08)
  26 #define ST21NFCA_NFC_DEP_PFB_TIMEOUT_BIT 0x10
  27 
  28 #define ST21NFCA_NFC_DEP_PFB_IS_TIMEOUT(pfb) \
  29                                 ((pfb) & ST21NFCA_NFC_DEP_PFB_TIMEOUT_BIT)
  30 
  31 #define ST21NFCA_NFC_DEP_PFB_I_PDU          0x00
  32 #define ST21NFCA_NFC_DEP_PFB_ACK_NACK_PDU   0x40
  33 #define ST21NFCA_NFC_DEP_PFB_SUPERVISOR_PDU 0x80
  34 
  35 #define ST21NFCA_ATR_REQ_MIN_SIZE 17
  36 #define ST21NFCA_ATR_REQ_MAX_SIZE 65
  37 #define ST21NFCA_LR_BITS_PAYLOAD_SIZE_254B 0x30
  38 #define ST21NFCA_GB_BIT  0x02
  39 
  40 #define ST21NFCA_EVT_SEND_DATA          0x10
  41 #define ST21NFCA_EVT_FIELD_ON           0x11
  42 #define ST21NFCA_EVT_CARD_DEACTIVATED   0x12
  43 #define ST21NFCA_EVT_CARD_ACTIVATED     0x13
  44 #define ST21NFCA_EVT_FIELD_OFF          0x14
  45 
  46 #define ST21NFCA_EVT_CARD_F_BITRATE 0x16
  47 #define ST21NFCA_EVT_READER_F_BITRATE 0x13
  48 #define ST21NFCA_PSL_REQ_SEND_SPEED(brs) (brs & 0x38)
  49 #define ST21NFCA_PSL_REQ_RECV_SPEED(brs) (brs & 0x07)
  50 #define ST21NFCA_PP2LRI(pp) ((pp & 0x30) >> 4)
  51 #define ST21NFCA_CARD_BITRATE_212 0x01
  52 #define ST21NFCA_CARD_BITRATE_424 0x02
  53 
  54 #define ST21NFCA_DEFAULT_TIMEOUT 0x0a
  55 
  56 
  57 #define PROTOCOL_ERR(req) pr_err("%d: ST21NFCA Protocol error: %s\n", \
  58                                  __LINE__, req)
  59 
  60 struct st21nfca_atr_req {
  61         u8 length;
  62         u8 cmd0;
  63         u8 cmd1;
  64         u8 nfcid3[NFC_NFCID3_MAXSIZE];
  65         u8 did;
  66         u8 bsi;
  67         u8 bri;
  68         u8 ppi;
  69         u8 gbi[0];
  70 } __packed;
  71 
  72 struct st21nfca_atr_res {
  73         u8 length;
  74         u8 cmd0;
  75         u8 cmd1;
  76         u8 nfcid3[NFC_NFCID3_MAXSIZE];
  77         u8 did;
  78         u8 bsi;
  79         u8 bri;
  80         u8 to;
  81         u8 ppi;
  82         u8 gbi[0];
  83 } __packed;
  84 
  85 struct st21nfca_psl_req {
  86         u8 length;
  87         u8 cmd0;
  88         u8 cmd1;
  89         u8 did;
  90         u8 brs;
  91         u8 fsl;
  92 } __packed;
  93 
  94 struct st21nfca_psl_res {
  95         u8 length;
  96         u8 cmd0;
  97         u8 cmd1;
  98         u8 did;
  99 } __packed;
 100 
 101 struct st21nfca_dep_req_res {
 102         u8 length;
 103         u8 cmd0;
 104         u8 cmd1;
 105         u8 pfb;
 106         u8 did;
 107         u8 nad;
 108 } __packed;
 109 
 110 static void st21nfca_tx_work(struct work_struct *work)
 111 {
 112         struct st21nfca_hci_info *info = container_of(work,
 113                                                 struct st21nfca_hci_info,
 114                                                 dep_info.tx_work);
 115 
 116         struct nfc_dev *dev;
 117         struct sk_buff *skb;
 118 
 119         if (info) {
 120                 dev = info->hdev->ndev;
 121                 skb = info->dep_info.tx_pending;
 122 
 123                 device_lock(&dev->dev);
 124 
 125                 nfc_hci_send_cmd_async(info->hdev, ST21NFCA_RF_READER_F_GATE,
 126                                 ST21NFCA_WR_XCHG_DATA, skb->data, skb->len,
 127                                 info->async_cb, info);
 128                 device_unlock(&dev->dev);
 129                 kfree_skb(skb);
 130         }
 131 }
 132 
 133 static void st21nfca_im_send_pdu(struct st21nfca_hci_info *info,
 134                                                 struct sk_buff *skb)
 135 {
 136         info->dep_info.tx_pending = skb;
 137         schedule_work(&info->dep_info.tx_work);
 138 }
 139 
 140 static int st21nfca_tm_send_atr_res(struct nfc_hci_dev *hdev,
 141                                     struct st21nfca_atr_req *atr_req)
 142 {
 143         struct st21nfca_atr_res *atr_res;
 144         struct sk_buff *skb;
 145         size_t gb_len;
 146         int r;
 147         struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
 148 
 149         gb_len = atr_req->length - sizeof(struct st21nfca_atr_req);
 150         skb = alloc_skb(atr_req->length + 1, GFP_KERNEL);
 151         if (!skb)
 152                 return -ENOMEM;
 153 
 154         skb_put(skb, sizeof(struct st21nfca_atr_res));
 155 
 156         atr_res = (struct st21nfca_atr_res *)skb->data;
 157         memset(atr_res, 0, sizeof(struct st21nfca_atr_res));
 158 
 159         atr_res->length = atr_req->length + 1;
 160         atr_res->cmd0 = ST21NFCA_NFCIP1_RES;
 161         atr_res->cmd1 = ST21NFCA_NFCIP1_ATR_RES;
 162 
 163         memcpy(atr_res->nfcid3, atr_req->nfcid3, 6);
 164         atr_res->bsi = 0x00;
 165         atr_res->bri = 0x00;
 166         atr_res->to = ST21NFCA_DEFAULT_TIMEOUT;
 167         atr_res->ppi = ST21NFCA_LR_BITS_PAYLOAD_SIZE_254B;
 168 
 169         if (gb_len) {
 170                 skb_put(skb, gb_len);
 171 
 172                 atr_res->ppi |= ST21NFCA_GB_BIT;
 173                 memcpy(atr_res->gbi, atr_req->gbi, gb_len);
 174                 r = nfc_set_remote_general_bytes(hdev->ndev, atr_res->gbi,
 175                                                   gb_len);
 176                 if (r < 0) {
 177                         kfree_skb(skb);
 178                         return r;
 179                 }
 180         }
 181 
 182         info->dep_info.curr_nfc_dep_pni = 0;
 183 
 184         r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
 185                                 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
 186         kfree_skb(skb);
 187         return r;
 188 }
 189 
 190 static int st21nfca_tm_recv_atr_req(struct nfc_hci_dev *hdev,
 191                                     struct sk_buff *skb)
 192 {
 193         struct st21nfca_atr_req *atr_req;
 194         size_t gb_len;
 195         int r;
 196 
 197         skb_trim(skb, skb->len - 1);
 198 
 199         if (!skb->len) {
 200                 r = -EIO;
 201                 goto exit;
 202         }
 203 
 204         if (skb->len < ST21NFCA_ATR_REQ_MIN_SIZE) {
 205                 r = -EPROTO;
 206                 goto exit;
 207         }
 208 
 209         atr_req = (struct st21nfca_atr_req *)skb->data;
 210 
 211         if (atr_req->length < sizeof(struct st21nfca_atr_req)) {
 212                 r = -EPROTO;
 213                 goto exit;
 214         }
 215 
 216         r = st21nfca_tm_send_atr_res(hdev, atr_req);
 217         if (r)
 218                 goto exit;
 219 
 220         gb_len = skb->len - sizeof(struct st21nfca_atr_req);
 221 
 222         r = nfc_tm_activated(hdev->ndev, NFC_PROTO_NFC_DEP_MASK,
 223                               NFC_COMM_PASSIVE, atr_req->gbi, gb_len);
 224         if (r)
 225                 goto exit;
 226 
 227         r = 0;
 228 
 229 exit:
 230         return r;
 231 }
 232 
 233 static int st21nfca_tm_send_psl_res(struct nfc_hci_dev *hdev,
 234                                     struct st21nfca_psl_req *psl_req)
 235 {
 236         struct st21nfca_psl_res *psl_res;
 237         struct sk_buff *skb;
 238         u8 bitrate[2] = {0, 0};
 239         int r;
 240 
 241         skb = alloc_skb(sizeof(struct st21nfca_psl_res), GFP_KERNEL);
 242         if (!skb)
 243                 return -ENOMEM;
 244         skb_put(skb, sizeof(struct st21nfca_psl_res));
 245 
 246         psl_res = (struct st21nfca_psl_res *)skb->data;
 247 
 248         psl_res->length = sizeof(struct st21nfca_psl_res);
 249         psl_res->cmd0 = ST21NFCA_NFCIP1_RES;
 250         psl_res->cmd1 = ST21NFCA_NFCIP1_PSL_RES;
 251         psl_res->did = psl_req->did;
 252 
 253         r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
 254                                 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
 255         if (r < 0)
 256                 goto error;
 257 
 258         /*
 259          * ST21NFCA only support P2P passive.
 260          * PSL_REQ BRS value != 0 has only a meaning to
 261          * change technology to type F.
 262          * We change to BITRATE 424Kbits.
 263          * In other case switch to BITRATE 106Kbits.
 264          */
 265         if (ST21NFCA_PSL_REQ_SEND_SPEED(psl_req->brs) &&
 266             ST21NFCA_PSL_REQ_RECV_SPEED(psl_req->brs)) {
 267                 bitrate[0] = ST21NFCA_CARD_BITRATE_424;
 268                 bitrate[1] = ST21NFCA_CARD_BITRATE_424;
 269         }
 270 
 271         /* Send an event to change bitrate change event to card f */
 272         r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
 273                         ST21NFCA_EVT_CARD_F_BITRATE, bitrate, 2);
 274 error:
 275         kfree_skb(skb);
 276         return r;
 277 }
 278 
 279 static int st21nfca_tm_recv_psl_req(struct nfc_hci_dev *hdev,
 280                                     struct sk_buff *skb)
 281 {
 282         struct st21nfca_psl_req *psl_req;
 283         int r;
 284 
 285         skb_trim(skb, skb->len - 1);
 286 
 287         if (!skb->len) {
 288                 r = -EIO;
 289                 goto exit;
 290         }
 291 
 292         psl_req = (struct st21nfca_psl_req *)skb->data;
 293 
 294         if (skb->len < sizeof(struct st21nfca_psl_req)) {
 295                 r = -EIO;
 296                 goto exit;
 297         }
 298 
 299         r = st21nfca_tm_send_psl_res(hdev, psl_req);
 300 exit:
 301         return r;
 302 }
 303 
 304 int st21nfca_tm_send_dep_res(struct nfc_hci_dev *hdev, struct sk_buff *skb)
 305 {
 306         int r;
 307         struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
 308 
 309         *(u8 *)skb_push(skb, 1) = info->dep_info.curr_nfc_dep_pni;
 310         *(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_DEP_RES;
 311         *(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_RES;
 312         *(u8 *)skb_push(skb, 1) = skb->len;
 313 
 314         r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
 315                         ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
 316         kfree_skb(skb);
 317 
 318         return r;
 319 }
 320 EXPORT_SYMBOL(st21nfca_tm_send_dep_res);
 321 
 322 static int st21nfca_tm_recv_dep_req(struct nfc_hci_dev *hdev,
 323                                     struct sk_buff *skb)
 324 {
 325         struct st21nfca_dep_req_res *dep_req;
 326         u8 size;
 327         int r;
 328         struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
 329 
 330         skb_trim(skb, skb->len - 1);
 331 
 332         size = 4;
 333 
 334         dep_req = (struct st21nfca_dep_req_res *)skb->data;
 335         if (skb->len < size) {
 336                 r = -EIO;
 337                 goto exit;
 338         }
 339 
 340         if (ST21NFCA_NFC_DEP_DID_BIT_SET(dep_req->pfb))
 341                 size++;
 342         if (ST21NFCA_NFC_DEP_NAD_BIT_SET(dep_req->pfb))
 343                 size++;
 344 
 345         if (skb->len < size) {
 346                 r = -EIO;
 347                 goto exit;
 348         }
 349 
 350         /* Receiving DEP_REQ - Decoding */
 351         switch (ST21NFCA_NFC_DEP_PFB_TYPE(dep_req->pfb)) {
 352         case ST21NFCA_NFC_DEP_PFB_I_PDU:
 353                 info->dep_info.curr_nfc_dep_pni =
 354                                 ST21NFCA_NFC_DEP_PFB_PNI(dep_req->pfb);
 355                 break;
 356         case ST21NFCA_NFC_DEP_PFB_ACK_NACK_PDU:
 357                 pr_err("Received a ACK/NACK PDU\n");
 358                 break;
 359         case ST21NFCA_NFC_DEP_PFB_SUPERVISOR_PDU:
 360                 pr_err("Received a SUPERVISOR PDU\n");
 361                 break;
 362         }
 363 
 364         skb_pull(skb, size);
 365 
 366         return nfc_tm_data_received(hdev->ndev, skb);
 367 exit:
 368         return r;
 369 }
 370 
 371 static int st21nfca_tm_event_send_data(struct nfc_hci_dev *hdev,
 372                                 struct sk_buff *skb)
 373 {
 374         u8 cmd0, cmd1;
 375         int r;
 376 
 377         cmd0 = skb->data[1];
 378         switch (cmd0) {
 379         case ST21NFCA_NFCIP1_REQ:
 380                 cmd1 = skb->data[2];
 381                 switch (cmd1) {
 382                 case ST21NFCA_NFCIP1_ATR_REQ:
 383                         r = st21nfca_tm_recv_atr_req(hdev, skb);
 384                         break;
 385                 case ST21NFCA_NFCIP1_PSL_REQ:
 386                         r = st21nfca_tm_recv_psl_req(hdev, skb);
 387                         break;
 388                 case ST21NFCA_NFCIP1_DEP_REQ:
 389                         r = st21nfca_tm_recv_dep_req(hdev, skb);
 390                         break;
 391                 default:
 392                         return 1;
 393                 }
 394                 break;
 395         default:
 396                 return 1;
 397         }
 398         return r;
 399 }
 400 
 401 /*
 402  * Returns:
 403  * <= 0: driver handled the event, skb consumed
 404  *    1: driver does not handle the event, please do standard processing
 405  */
 406 int st21nfca_dep_event_received(struct nfc_hci_dev *hdev,
 407                                 u8 event, struct sk_buff *skb)
 408 {
 409         int r = 0;
 410         struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
 411 
 412         pr_debug("dep event: %d\n", event);
 413 
 414         switch (event) {
 415         case ST21NFCA_EVT_CARD_ACTIVATED:
 416                 info->dep_info.curr_nfc_dep_pni = 0;
 417                 break;
 418         case ST21NFCA_EVT_CARD_DEACTIVATED:
 419                 break;
 420         case ST21NFCA_EVT_FIELD_ON:
 421                 break;
 422         case ST21NFCA_EVT_FIELD_OFF:
 423                 break;
 424         case ST21NFCA_EVT_SEND_DATA:
 425                 r = st21nfca_tm_event_send_data(hdev, skb);
 426                 if (r < 0)
 427                         return r;
 428                 return 0;
 429         default:
 430                 nfc_err(&hdev->ndev->dev, "Unexpected event on card f gate\n");
 431                 return 1;
 432         }
 433         kfree_skb(skb);
 434         return r;
 435 }
 436 EXPORT_SYMBOL(st21nfca_dep_event_received);
 437 
 438 static void st21nfca_im_send_psl_req(struct nfc_hci_dev *hdev, u8 did, u8 bsi,
 439                                      u8 bri, u8 lri)
 440 {
 441         struct sk_buff *skb;
 442         struct st21nfca_psl_req *psl_req;
 443         struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
 444 
 445         skb =
 446             alloc_skb(sizeof(struct st21nfca_psl_req) + 1, GFP_KERNEL);
 447         if (!skb)
 448                 return;
 449         skb_reserve(skb, 1);
 450 
 451         skb_put(skb, sizeof(struct st21nfca_psl_req));
 452         psl_req = (struct st21nfca_psl_req *) skb->data;
 453 
 454         psl_req->length = sizeof(struct st21nfca_psl_req);
 455         psl_req->cmd0 = ST21NFCA_NFCIP1_REQ;
 456         psl_req->cmd1 = ST21NFCA_NFCIP1_PSL_REQ;
 457         psl_req->did = did;
 458         psl_req->brs = (0x30 & bsi << 4) | (bri & 0x03);
 459         psl_req->fsl = lri;
 460 
 461         *(u8 *)skb_push(skb, 1) = info->dep_info.to | 0x10;
 462 
 463         st21nfca_im_send_pdu(info, skb);
 464 }
 465 
 466 #define ST21NFCA_CB_TYPE_READER_F 1
 467 static void st21nfca_im_recv_atr_res_cb(void *context, struct sk_buff *skb,
 468                                         int err)
 469 {
 470         struct st21nfca_hci_info *info = context;
 471         struct st21nfca_atr_res *atr_res;
 472         int r;
 473 
 474         if (err != 0)
 475                 return;
 476 
 477         if (!skb)
 478                 return;
 479 
 480         switch (info->async_cb_type) {
 481         case ST21NFCA_CB_TYPE_READER_F:
 482                 skb_trim(skb, skb->len - 1);
 483                 atr_res = (struct st21nfca_atr_res *)skb->data;
 484                 r = nfc_set_remote_general_bytes(info->hdev->ndev,
 485                                 atr_res->gbi,
 486                                 skb->len - sizeof(struct st21nfca_atr_res));
 487                 if (r < 0)
 488                         return;
 489 
 490                 if (atr_res->to >= 0x0e)
 491                         info->dep_info.to = 0x0e;
 492                 else
 493                         info->dep_info.to = atr_res->to + 1;
 494 
 495                 info->dep_info.to |= 0x10;
 496 
 497                 r = nfc_dep_link_is_up(info->hdev->ndev, info->dep_info.idx,
 498                                         NFC_COMM_PASSIVE, NFC_RF_INITIATOR);
 499                 if (r < 0)
 500                         return;
 501 
 502                 info->dep_info.curr_nfc_dep_pni = 0;
 503                 if (ST21NFCA_PP2LRI(atr_res->ppi) != info->dep_info.lri)
 504                         st21nfca_im_send_psl_req(info->hdev, atr_res->did,
 505                                                 atr_res->bsi, atr_res->bri,
 506                                                 ST21NFCA_PP2LRI(atr_res->ppi));
 507                 break;
 508         default:
 509                 kfree_skb(skb);
 510                 break;
 511         }
 512 }
 513 
 514 int st21nfca_im_send_atr_req(struct nfc_hci_dev *hdev, u8 *gb, size_t gb_len)
 515 {
 516         struct sk_buff *skb;
 517         struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
 518         struct st21nfca_atr_req *atr_req;
 519         struct nfc_target *target;
 520         uint size;
 521 
 522         info->dep_info.to = ST21NFCA_DEFAULT_TIMEOUT;
 523         size = ST21NFCA_ATR_REQ_MIN_SIZE + gb_len;
 524         if (size > ST21NFCA_ATR_REQ_MAX_SIZE) {
 525                 PROTOCOL_ERR("14.6.1.1");
 526                 return -EINVAL;
 527         }
 528 
 529         skb =
 530             alloc_skb(sizeof(struct st21nfca_atr_req) + gb_len + 1, GFP_KERNEL);
 531         if (!skb)
 532                 return -ENOMEM;
 533 
 534         skb_reserve(skb, 1);
 535 
 536         skb_put(skb, sizeof(struct st21nfca_atr_req));
 537 
 538         atr_req = (struct st21nfca_atr_req *)skb->data;
 539         memset(atr_req, 0, sizeof(struct st21nfca_atr_req));
 540 
 541         atr_req->cmd0 = ST21NFCA_NFCIP1_REQ;
 542         atr_req->cmd1 = ST21NFCA_NFCIP1_ATR_REQ;
 543         memset(atr_req->nfcid3, 0, NFC_NFCID3_MAXSIZE);
 544         target = hdev->ndev->targets;
 545 
 546         if (target->sensf_res_len > 0)
 547                 memcpy(atr_req->nfcid3, target->sensf_res,
 548                                 target->sensf_res_len);
 549         else
 550                 get_random_bytes(atr_req->nfcid3, NFC_NFCID3_MAXSIZE);
 551 
 552         atr_req->did = 0x0;
 553 
 554         atr_req->bsi = 0x00;
 555         atr_req->bri = 0x00;
 556         atr_req->ppi = ST21NFCA_LR_BITS_PAYLOAD_SIZE_254B;
 557         if (gb_len) {
 558                 atr_req->ppi |= ST21NFCA_GB_BIT;
 559                 skb_put_data(skb, gb, gb_len);
 560         }
 561         atr_req->length = sizeof(struct st21nfca_atr_req) + hdev->gb_len;
 562 
 563         *(u8 *)skb_push(skb, 1) = info->dep_info.to | 0x10; /* timeout */
 564 
 565         info->async_cb_type = ST21NFCA_CB_TYPE_READER_F;
 566         info->async_cb_context = info;
 567         info->async_cb = st21nfca_im_recv_atr_res_cb;
 568         info->dep_info.bri = atr_req->bri;
 569         info->dep_info.bsi = atr_req->bsi;
 570         info->dep_info.lri = ST21NFCA_PP2LRI(atr_req->ppi);
 571 
 572         return nfc_hci_send_cmd_async(hdev, ST21NFCA_RF_READER_F_GATE,
 573                                 ST21NFCA_WR_XCHG_DATA, skb->data,
 574                                 skb->len, info->async_cb, info);
 575 }
 576 EXPORT_SYMBOL(st21nfca_im_send_atr_req);
 577 
 578 static void st21nfca_im_recv_dep_res_cb(void *context, struct sk_buff *skb,
 579                                         int err)
 580 {
 581         struct st21nfca_hci_info *info = context;
 582         struct st21nfca_dep_req_res *dep_res;
 583 
 584         int size;
 585 
 586         if (err != 0)
 587                 return;
 588 
 589         if (!skb)
 590                 return;
 591 
 592         switch (info->async_cb_type) {
 593         case ST21NFCA_CB_TYPE_READER_F:
 594                 dep_res = (struct st21nfca_dep_req_res *)skb->data;
 595 
 596                 size = 3;
 597                 if (skb->len < size)
 598                         goto exit;
 599 
 600                 if (ST21NFCA_NFC_DEP_DID_BIT_SET(dep_res->pfb))
 601                         size++;
 602                 if (ST21NFCA_NFC_DEP_NAD_BIT_SET(dep_res->pfb))
 603                         size++;
 604 
 605                 if (skb->len < size)
 606                         goto exit;
 607 
 608                 skb_trim(skb, skb->len - 1);
 609 
 610                 /* Receiving DEP_REQ - Decoding */
 611                 switch (ST21NFCA_NFC_DEP_PFB_TYPE(dep_res->pfb)) {
 612                 case ST21NFCA_NFC_DEP_PFB_ACK_NACK_PDU:
 613                         pr_err("Received a ACK/NACK PDU\n");
 614                         /* fall through */
 615                 case ST21NFCA_NFC_DEP_PFB_I_PDU:
 616                         info->dep_info.curr_nfc_dep_pni =
 617                             ST21NFCA_NFC_DEP_PFB_PNI(dep_res->pfb + 1);
 618                         size++;
 619                         skb_pull(skb, size);
 620                         nfc_tm_data_received(info->hdev->ndev, skb);
 621                         break;
 622                 case ST21NFCA_NFC_DEP_PFB_SUPERVISOR_PDU:
 623                         pr_err("Received a SUPERVISOR PDU\n");
 624                         skb_pull(skb, size);
 625                         *(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_DEP_REQ;
 626                         *(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_REQ;
 627                         *(u8 *)skb_push(skb, 1) = skb->len;
 628                         *(u8 *)skb_push(skb, 1) = info->dep_info.to | 0x10;
 629 
 630                         st21nfca_im_send_pdu(info, skb);
 631                         break;
 632                 }
 633 
 634                 return;
 635         default:
 636                 break;
 637         }
 638 
 639 exit:
 640         kfree_skb(skb);
 641 }
 642 
 643 int st21nfca_im_send_dep_req(struct nfc_hci_dev *hdev, struct sk_buff *skb)
 644 {
 645         struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
 646 
 647         info->async_cb_type = ST21NFCA_CB_TYPE_READER_F;
 648         info->async_cb_context = info;
 649         info->async_cb = st21nfca_im_recv_dep_res_cb;
 650 
 651         *(u8 *)skb_push(skb, 1) = info->dep_info.curr_nfc_dep_pni;
 652         *(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_DEP_REQ;
 653         *(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_REQ;
 654         *(u8 *)skb_push(skb, 1) = skb->len;
 655 
 656         *(u8 *)skb_push(skb, 1) = info->dep_info.to | 0x10;
 657 
 658         return nfc_hci_send_cmd_async(hdev, ST21NFCA_RF_READER_F_GATE,
 659                                       ST21NFCA_WR_XCHG_DATA,
 660                                       skb->data, skb->len,
 661                                       info->async_cb, info);
 662 }
 663 EXPORT_SYMBOL(st21nfca_im_send_dep_req);
 664 
 665 void st21nfca_dep_init(struct nfc_hci_dev *hdev)
 666 {
 667         struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
 668 
 669         INIT_WORK(&info->dep_info.tx_work, st21nfca_tx_work);
 670         info->dep_info.curr_nfc_dep_pni = 0;
 671         info->dep_info.idx = 0;
 672         info->dep_info.to = ST21NFCA_DEFAULT_TIMEOUT;
 673 }
 674 EXPORT_SYMBOL(st21nfca_dep_init);
 675 
 676 void st21nfca_dep_deinit(struct nfc_hci_dev *hdev)
 677 {
 678         struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
 679 
 680         cancel_work_sync(&info->dep_info.tx_work);
 681 }
 682 EXPORT_SYMBOL(st21nfca_dep_deinit);

/* [<][>][^][v][top][bottom][index][help] */