linux/net/nfc/nci/core.c
<<
>>
Prefs
   1/*
   2 *  The NFC Controller Interface is the communication protocol between an
   3 *  NFC Controller (NFCC) and a Device Host (DH).
   4 *
   5 *  Copyright (C) 2011 Texas Instruments, Inc.
   6 *  Copyright (C) 2014 Marvell International Ltd.
   7 *
   8 *  Written by Ilan Elias <ilane@ti.com>
   9 *
  10 *  Acknowledgements:
  11 *  This file is based on hci_core.c, which was written
  12 *  by Maxim Krasnyansky.
  13 *
  14 *  This program is free software; you can redistribute it and/or modify
  15 *  it under the terms of the GNU General Public License version 2
  16 *  as published by the Free Software Foundation
  17 *
  18 *  This program is distributed in the hope that it will be useful,
  19 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21 *  GNU General Public License for more details.
  22 *
  23 *  You should have received a copy of the GNU General Public License
  24 *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  25 *
  26 */
  27
  28#define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__
  29
  30#include <linux/module.h>
  31#include <linux/kernel.h>
  32#include <linux/types.h>
  33#include <linux/workqueue.h>
  34#include <linux/completion.h>
  35#include <linux/export.h>
  36#include <linux/sched.h>
  37#include <linux/bitops.h>
  38#include <linux/skbuff.h>
  39
  40#include "../nfc.h"
  41#include <net/nfc/nci.h>
  42#include <net/nfc/nci_core.h>
  43#include <linux/nfc.h>
  44
  45struct core_conn_create_data {
  46        int length;
  47        struct nci_core_conn_create_cmd *cmd;
  48};
  49
  50static void nci_cmd_work(struct work_struct *work);
  51static void nci_rx_work(struct work_struct *work);
  52static void nci_tx_work(struct work_struct *work);
  53
  54struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev,
  55                                                   int conn_id)
  56{
  57        struct nci_conn_info *conn_info;
  58
  59        list_for_each_entry(conn_info, &ndev->conn_info_list, list) {
  60                if (conn_info->conn_id == conn_id)
  61                        return conn_info;
  62        }
  63
  64        return NULL;
  65}
  66
  67int nci_get_conn_info_by_dest_type_params(struct nci_dev *ndev, u8 dest_type,
  68                                          struct dest_spec_params *params)
  69{
  70        struct nci_conn_info *conn_info;
  71
  72        list_for_each_entry(conn_info, &ndev->conn_info_list, list) {
  73                if (conn_info->dest_type == dest_type) {
  74                        if (!params)
  75                                return conn_info->conn_id;
  76                        if (conn_info) {
  77                                if (params->id == conn_info->dest_params->id &&
  78                                    params->protocol == conn_info->dest_params->protocol)
  79                                        return conn_info->conn_id;
  80                        }
  81                }
  82        }
  83
  84        return -EINVAL;
  85}
  86EXPORT_SYMBOL(nci_get_conn_info_by_dest_type_params);
  87
  88/* ---- NCI requests ---- */
  89
  90void nci_req_complete(struct nci_dev *ndev, int result)
  91{
  92        if (ndev->req_status == NCI_REQ_PEND) {
  93                ndev->req_result = result;
  94                ndev->req_status = NCI_REQ_DONE;
  95                complete(&ndev->req_completion);
  96        }
  97}
  98EXPORT_SYMBOL(nci_req_complete);
  99
 100static void nci_req_cancel(struct nci_dev *ndev, int err)
 101{
 102        if (ndev->req_status == NCI_REQ_PEND) {
 103                ndev->req_result = err;
 104                ndev->req_status = NCI_REQ_CANCELED;
 105                complete(&ndev->req_completion);
 106        }
 107}
 108
 109/* Execute request and wait for completion. */
 110static int __nci_request(struct nci_dev *ndev,
 111                         void (*req)(struct nci_dev *ndev, unsigned long opt),
 112                         unsigned long opt, __u32 timeout)
 113{
 114        int rc = 0;
 115        long completion_rc;
 116
 117        ndev->req_status = NCI_REQ_PEND;
 118
 119        reinit_completion(&ndev->req_completion);
 120        req(ndev, opt);
 121        completion_rc =
 122                wait_for_completion_interruptible_timeout(&ndev->req_completion,
 123                                                          timeout);
 124
 125        pr_debug("wait_for_completion return %ld\n", completion_rc);
 126
 127        if (completion_rc > 0) {
 128                switch (ndev->req_status) {
 129                case NCI_REQ_DONE:
 130                        rc = nci_to_errno(ndev->req_result);
 131                        break;
 132
 133                case NCI_REQ_CANCELED:
 134                        rc = -ndev->req_result;
 135                        break;
 136
 137                default:
 138                        rc = -ETIMEDOUT;
 139                        break;
 140                }
 141        } else {
 142                pr_err("wait_for_completion_interruptible_timeout failed %ld\n",
 143                       completion_rc);
 144
 145                rc = ((completion_rc == 0) ? (-ETIMEDOUT) : (completion_rc));
 146        }
 147
 148        ndev->req_status = ndev->req_result = 0;
 149
 150        return rc;
 151}
 152
 153inline int nci_request(struct nci_dev *ndev,
 154                       void (*req)(struct nci_dev *ndev,
 155                                   unsigned long opt),
 156                       unsigned long opt, __u32 timeout)
 157{
 158        int rc;
 159
 160        if (!test_bit(NCI_UP, &ndev->flags))
 161                return -ENETDOWN;
 162
 163        /* Serialize all requests */
 164        mutex_lock(&ndev->req_lock);
 165        rc = __nci_request(ndev, req, opt, timeout);
 166        mutex_unlock(&ndev->req_lock);
 167
 168        return rc;
 169}
 170
 171static void nci_reset_req(struct nci_dev *ndev, unsigned long opt)
 172{
 173        struct nci_core_reset_cmd cmd;
 174
 175        cmd.reset_type = NCI_RESET_TYPE_RESET_CONFIG;
 176        nci_send_cmd(ndev, NCI_OP_CORE_RESET_CMD, 1, &cmd);
 177}
 178
 179static void nci_init_req(struct nci_dev *ndev, unsigned long opt)
 180{
 181        nci_send_cmd(ndev, NCI_OP_CORE_INIT_CMD, 0, NULL);
 182}
 183
 184static void nci_init_complete_req(struct nci_dev *ndev, unsigned long opt)
 185{
 186        struct nci_rf_disc_map_cmd cmd;
 187        struct disc_map_config *cfg = cmd.mapping_configs;
 188        __u8 *num = &cmd.num_mapping_configs;
 189        int i;
 190
 191        /* set rf mapping configurations */
 192        *num = 0;
 193
 194        /* by default mapping is set to NCI_RF_INTERFACE_FRAME */
 195        for (i = 0; i < ndev->num_supported_rf_interfaces; i++) {
 196                if (ndev->supported_rf_interfaces[i] ==
 197                    NCI_RF_INTERFACE_ISO_DEP) {
 198                        cfg[*num].rf_protocol = NCI_RF_PROTOCOL_ISO_DEP;
 199                        cfg[*num].mode = NCI_DISC_MAP_MODE_POLL |
 200                                NCI_DISC_MAP_MODE_LISTEN;
 201                        cfg[*num].rf_interface = NCI_RF_INTERFACE_ISO_DEP;
 202                        (*num)++;
 203                } else if (ndev->supported_rf_interfaces[i] ==
 204                           NCI_RF_INTERFACE_NFC_DEP) {
 205                        cfg[*num].rf_protocol = NCI_RF_PROTOCOL_NFC_DEP;
 206                        cfg[*num].mode = NCI_DISC_MAP_MODE_POLL |
 207                                NCI_DISC_MAP_MODE_LISTEN;
 208                        cfg[*num].rf_interface = NCI_RF_INTERFACE_NFC_DEP;
 209                        (*num)++;
 210                }
 211
 212                if (*num == NCI_MAX_NUM_MAPPING_CONFIGS)
 213                        break;
 214        }
 215
 216        nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_MAP_CMD,
 217                     (1 + ((*num) * sizeof(struct disc_map_config))), &cmd);
 218}
 219
 220struct nci_set_config_param {
 221        __u8    id;
 222        size_t  len;
 223        __u8    *val;
 224};
 225
 226static void nci_set_config_req(struct nci_dev *ndev, unsigned long opt)
 227{
 228        struct nci_set_config_param *param = (struct nci_set_config_param *)opt;
 229        struct nci_core_set_config_cmd cmd;
 230
 231        BUG_ON(param->len > NCI_MAX_PARAM_LEN);
 232
 233        cmd.num_params = 1;
 234        cmd.param.id = param->id;
 235        cmd.param.len = param->len;
 236        memcpy(cmd.param.val, param->val, param->len);
 237
 238        nci_send_cmd(ndev, NCI_OP_CORE_SET_CONFIG_CMD, (3 + param->len), &cmd);
 239}
 240
 241struct nci_rf_discover_param {
 242        __u32   im_protocols;
 243        __u32   tm_protocols;
 244};
 245
 246static void nci_rf_discover_req(struct nci_dev *ndev, unsigned long opt)
 247{
 248        struct nci_rf_discover_param *param =
 249                (struct nci_rf_discover_param *)opt;
 250        struct nci_rf_disc_cmd cmd;
 251
 252        cmd.num_disc_configs = 0;
 253
 254        if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
 255            (param->im_protocols & NFC_PROTO_JEWEL_MASK ||
 256             param->im_protocols & NFC_PROTO_MIFARE_MASK ||
 257             param->im_protocols & NFC_PROTO_ISO14443_MASK ||
 258             param->im_protocols & NFC_PROTO_NFC_DEP_MASK)) {
 259                cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
 260                        NCI_NFC_A_PASSIVE_POLL_MODE;
 261                cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
 262                cmd.num_disc_configs++;
 263        }
 264
 265        if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
 266            (param->im_protocols & NFC_PROTO_ISO14443_B_MASK)) {
 267                cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
 268                        NCI_NFC_B_PASSIVE_POLL_MODE;
 269                cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
 270                cmd.num_disc_configs++;
 271        }
 272
 273        if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
 274            (param->im_protocols & NFC_PROTO_FELICA_MASK ||
 275             param->im_protocols & NFC_PROTO_NFC_DEP_MASK)) {
 276                cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
 277                        NCI_NFC_F_PASSIVE_POLL_MODE;
 278                cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
 279                cmd.num_disc_configs++;
 280        }
 281
 282        if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
 283            (param->im_protocols & NFC_PROTO_ISO15693_MASK)) {
 284                cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
 285                        NCI_NFC_V_PASSIVE_POLL_MODE;
 286                cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
 287                cmd.num_disc_configs++;
 288        }
 289
 290        if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS - 1) &&
 291            (param->tm_protocols & NFC_PROTO_NFC_DEP_MASK)) {
 292                cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
 293                        NCI_NFC_A_PASSIVE_LISTEN_MODE;
 294                cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
 295                cmd.num_disc_configs++;
 296                cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
 297                        NCI_NFC_F_PASSIVE_LISTEN_MODE;
 298                cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
 299                cmd.num_disc_configs++;
 300        }
 301
 302        nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD,
 303                     (1 + (cmd.num_disc_configs * sizeof(struct disc_config))),
 304                     &cmd);
 305}
 306
 307struct nci_rf_discover_select_param {
 308        __u8    rf_discovery_id;
 309        __u8    rf_protocol;
 310};
 311
 312static void nci_rf_discover_select_req(struct nci_dev *ndev, unsigned long opt)
 313{
 314        struct nci_rf_discover_select_param *param =
 315                (struct nci_rf_discover_select_param *)opt;
 316        struct nci_rf_discover_select_cmd cmd;
 317
 318        cmd.rf_discovery_id = param->rf_discovery_id;
 319        cmd.rf_protocol = param->rf_protocol;
 320
 321        switch (cmd.rf_protocol) {
 322        case NCI_RF_PROTOCOL_ISO_DEP:
 323                cmd.rf_interface = NCI_RF_INTERFACE_ISO_DEP;
 324                break;
 325
 326        case NCI_RF_PROTOCOL_NFC_DEP:
 327                cmd.rf_interface = NCI_RF_INTERFACE_NFC_DEP;
 328                break;
 329
 330        default:
 331                cmd.rf_interface = NCI_RF_INTERFACE_FRAME;
 332                break;
 333        }
 334
 335        nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_SELECT_CMD,
 336                     sizeof(struct nci_rf_discover_select_cmd), &cmd);
 337}
 338
 339static void nci_rf_deactivate_req(struct nci_dev *ndev, unsigned long opt)
 340{
 341        struct nci_rf_deactivate_cmd cmd;
 342
 343        cmd.type = opt;
 344
 345        nci_send_cmd(ndev, NCI_OP_RF_DEACTIVATE_CMD,
 346                     sizeof(struct nci_rf_deactivate_cmd), &cmd);
 347}
 348
 349struct nci_cmd_param {
 350        __u16 opcode;
 351        size_t len;
 352        __u8 *payload;
 353};
 354
 355static void nci_generic_req(struct nci_dev *ndev, unsigned long opt)
 356{
 357        struct nci_cmd_param *param =
 358                (struct nci_cmd_param *)opt;
 359
 360        nci_send_cmd(ndev, param->opcode, param->len, param->payload);
 361}
 362
 363int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len, __u8 *payload)
 364{
 365        struct nci_cmd_param param;
 366
 367        param.opcode = nci_opcode_pack(NCI_GID_PROPRIETARY, oid);
 368        param.len = len;
 369        param.payload = payload;
 370
 371        return __nci_request(ndev, nci_generic_req, (unsigned long)&param,
 372                             msecs_to_jiffies(NCI_CMD_TIMEOUT));
 373}
 374EXPORT_SYMBOL(nci_prop_cmd);
 375
 376int nci_core_cmd(struct nci_dev *ndev, __u16 opcode, size_t len, __u8 *payload)
 377{
 378        struct nci_cmd_param param;
 379
 380        param.opcode = opcode;
 381        param.len = len;
 382        param.payload = payload;
 383
 384        return __nci_request(ndev, nci_generic_req, (unsigned long)&param,
 385                             msecs_to_jiffies(NCI_CMD_TIMEOUT));
 386}
 387EXPORT_SYMBOL(nci_core_cmd);
 388
 389int nci_core_reset(struct nci_dev *ndev)
 390{
 391        return __nci_request(ndev, nci_reset_req, 0,
 392                             msecs_to_jiffies(NCI_RESET_TIMEOUT));
 393}
 394EXPORT_SYMBOL(nci_core_reset);
 395
 396int nci_core_init(struct nci_dev *ndev)
 397{
 398        return __nci_request(ndev, nci_init_req, 0,
 399                             msecs_to_jiffies(NCI_INIT_TIMEOUT));
 400}
 401EXPORT_SYMBOL(nci_core_init);
 402
 403struct nci_loopback_data {
 404        u8 conn_id;
 405        struct sk_buff *data;
 406};
 407
 408static void nci_send_data_req(struct nci_dev *ndev, unsigned long opt)
 409{
 410        struct nci_loopback_data *data = (struct nci_loopback_data *)opt;
 411
 412        nci_send_data(ndev, data->conn_id, data->data);
 413}
 414
 415static void nci_nfcc_loopback_cb(void *context, struct sk_buff *skb, int err)
 416{
 417        struct nci_dev *ndev = (struct nci_dev *)context;
 418        struct nci_conn_info    *conn_info;
 419
 420        conn_info = nci_get_conn_info_by_conn_id(ndev, ndev->cur_conn_id);
 421        if (!conn_info) {
 422                nci_req_complete(ndev, NCI_STATUS_REJECTED);
 423                return;
 424        }
 425
 426        conn_info->rx_skb = skb;
 427
 428        nci_req_complete(ndev, NCI_STATUS_OK);
 429}
 430
 431int nci_nfcc_loopback(struct nci_dev *ndev, void *data, size_t data_len,
 432                      struct sk_buff **resp)
 433{
 434        int r;
 435        struct nci_loopback_data loopback_data;
 436        struct nci_conn_info *conn_info;
 437        struct sk_buff *skb;
 438        int conn_id = nci_get_conn_info_by_dest_type_params(ndev,
 439                                        NCI_DESTINATION_NFCC_LOOPBACK, NULL);
 440
 441        if (conn_id < 0) {
 442                r = nci_core_conn_create(ndev, NCI_DESTINATION_NFCC_LOOPBACK,
 443                                         0, 0, NULL);
 444                if (r != NCI_STATUS_OK)
 445                        return r;
 446
 447                conn_id = nci_get_conn_info_by_dest_type_params(ndev,
 448                                        NCI_DESTINATION_NFCC_LOOPBACK,
 449                                        NULL);
 450        }
 451
 452        conn_info = nci_get_conn_info_by_conn_id(ndev, conn_id);
 453        if (!conn_info)
 454                return -EPROTO;
 455
 456        /* store cb and context to be used on receiving data */
 457        conn_info->data_exchange_cb = nci_nfcc_loopback_cb;
 458        conn_info->data_exchange_cb_context = ndev;
 459
 460        skb = nci_skb_alloc(ndev, NCI_DATA_HDR_SIZE + data_len, GFP_KERNEL);
 461        if (!skb)
 462                return -ENOMEM;
 463
 464        skb_reserve(skb, NCI_DATA_HDR_SIZE);
 465        memcpy(skb_put(skb, data_len), data, data_len);
 466
 467        loopback_data.conn_id = conn_id;
 468        loopback_data.data = skb;
 469
 470        ndev->cur_conn_id = conn_id;
 471        r = nci_request(ndev, nci_send_data_req, (unsigned long)&loopback_data,
 472                        msecs_to_jiffies(NCI_DATA_TIMEOUT));
 473        if (r == NCI_STATUS_OK && resp)
 474                *resp = conn_info->rx_skb;
 475
 476        return r;
 477}
 478EXPORT_SYMBOL(nci_nfcc_loopback);
 479
 480static int nci_open_device(struct nci_dev *ndev)
 481{
 482        int rc = 0;
 483
 484        mutex_lock(&ndev->req_lock);
 485
 486        if (test_bit(NCI_UP, &ndev->flags)) {
 487                rc = -EALREADY;
 488                goto done;
 489        }
 490
 491        if (ndev->ops->open(ndev)) {
 492                rc = -EIO;
 493                goto done;
 494        }
 495
 496        atomic_set(&ndev->cmd_cnt, 1);
 497
 498        set_bit(NCI_INIT, &ndev->flags);
 499
 500        if (ndev->ops->init)
 501                rc = ndev->ops->init(ndev);
 502
 503        if (!rc) {
 504                rc = __nci_request(ndev, nci_reset_req, 0,
 505                                   msecs_to_jiffies(NCI_RESET_TIMEOUT));
 506        }
 507
 508        if (!rc && ndev->ops->setup) {
 509                rc = ndev->ops->setup(ndev);
 510        }
 511
 512        if (!rc) {
 513                rc = __nci_request(ndev, nci_init_req, 0,
 514                                   msecs_to_jiffies(NCI_INIT_TIMEOUT));
 515        }
 516
 517        if (!rc && ndev->ops->post_setup)
 518                rc = ndev->ops->post_setup(ndev);
 519
 520        if (!rc) {
 521                rc = __nci_request(ndev, nci_init_complete_req, 0,
 522                                   msecs_to_jiffies(NCI_INIT_TIMEOUT));
 523        }
 524
 525        clear_bit(NCI_INIT, &ndev->flags);
 526
 527        if (!rc) {
 528                set_bit(NCI_UP, &ndev->flags);
 529                nci_clear_target_list(ndev);
 530                atomic_set(&ndev->state, NCI_IDLE);
 531        } else {
 532                /* Init failed, cleanup */
 533                skb_queue_purge(&ndev->cmd_q);
 534                skb_queue_purge(&ndev->rx_q);
 535                skb_queue_purge(&ndev->tx_q);
 536
 537                ndev->ops->close(ndev);
 538                ndev->flags = 0;
 539        }
 540
 541done:
 542        mutex_unlock(&ndev->req_lock);
 543        return rc;
 544}
 545
 546static int nci_close_device(struct nci_dev *ndev)
 547{
 548        nci_req_cancel(ndev, ENODEV);
 549        mutex_lock(&ndev->req_lock);
 550
 551        if (!test_and_clear_bit(NCI_UP, &ndev->flags)) {
 552                del_timer_sync(&ndev->cmd_timer);
 553                del_timer_sync(&ndev->data_timer);
 554                mutex_unlock(&ndev->req_lock);
 555                return 0;
 556        }
 557
 558        /* Drop RX and TX queues */
 559        skb_queue_purge(&ndev->rx_q);
 560        skb_queue_purge(&ndev->tx_q);
 561
 562        /* Flush RX and TX wq */
 563        flush_workqueue(ndev->rx_wq);
 564        flush_workqueue(ndev->tx_wq);
 565
 566        /* Reset device */
 567        skb_queue_purge(&ndev->cmd_q);
 568        atomic_set(&ndev->cmd_cnt, 1);
 569
 570        set_bit(NCI_INIT, &ndev->flags);
 571        __nci_request(ndev, nci_reset_req, 0,
 572                      msecs_to_jiffies(NCI_RESET_TIMEOUT));
 573
 574        /* After this point our queues are empty
 575         * and no works are scheduled.
 576         */
 577        ndev->ops->close(ndev);
 578
 579        clear_bit(NCI_INIT, &ndev->flags);
 580
 581        del_timer_sync(&ndev->cmd_timer);
 582
 583        /* Flush cmd wq */
 584        flush_workqueue(ndev->cmd_wq);
 585
 586        /* Clear flags */
 587        ndev->flags = 0;
 588
 589        mutex_unlock(&ndev->req_lock);
 590
 591        return 0;
 592}
 593
 594/* NCI command timer function */
 595static void nci_cmd_timer(unsigned long arg)
 596{
 597        struct nci_dev *ndev = (void *) arg;
 598
 599        atomic_set(&ndev->cmd_cnt, 1);
 600        queue_work(ndev->cmd_wq, &ndev->cmd_work);
 601}
 602
 603/* NCI data exchange timer function */
 604static void nci_data_timer(unsigned long arg)
 605{
 606        struct nci_dev *ndev = (void *) arg;
 607
 608        set_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags);
 609        queue_work(ndev->rx_wq, &ndev->rx_work);
 610}
 611
 612static int nci_dev_up(struct nfc_dev *nfc_dev)
 613{
 614        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
 615
 616        return nci_open_device(ndev);
 617}
 618
 619static int nci_dev_down(struct nfc_dev *nfc_dev)
 620{
 621        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
 622
 623        return nci_close_device(ndev);
 624}
 625
 626int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, __u8 *val)
 627{
 628        struct nci_set_config_param param;
 629
 630        if (!val || !len)
 631                return 0;
 632
 633        param.id = id;
 634        param.len = len;
 635        param.val = val;
 636
 637        return __nci_request(ndev, nci_set_config_req, (unsigned long)&param,
 638                             msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
 639}
 640EXPORT_SYMBOL(nci_set_config);
 641
 642static void nci_nfcee_discover_req(struct nci_dev *ndev, unsigned long opt)
 643{
 644        struct nci_nfcee_discover_cmd cmd;
 645        __u8 action = opt;
 646
 647        cmd.discovery_action = action;
 648
 649        nci_send_cmd(ndev, NCI_OP_NFCEE_DISCOVER_CMD, 1, &cmd);
 650}
 651
 652int nci_nfcee_discover(struct nci_dev *ndev, u8 action)
 653{
 654        return __nci_request(ndev, nci_nfcee_discover_req, action,
 655                                msecs_to_jiffies(NCI_CMD_TIMEOUT));
 656}
 657EXPORT_SYMBOL(nci_nfcee_discover);
 658
 659static void nci_nfcee_mode_set_req(struct nci_dev *ndev, unsigned long opt)
 660{
 661        struct nci_nfcee_mode_set_cmd *cmd =
 662                                        (struct nci_nfcee_mode_set_cmd *)opt;
 663
 664        nci_send_cmd(ndev, NCI_OP_NFCEE_MODE_SET_CMD,
 665                     sizeof(struct nci_nfcee_mode_set_cmd), cmd);
 666}
 667
 668int nci_nfcee_mode_set(struct nci_dev *ndev, u8 nfcee_id, u8 nfcee_mode)
 669{
 670        struct nci_nfcee_mode_set_cmd cmd;
 671
 672        cmd.nfcee_id = nfcee_id;
 673        cmd.nfcee_mode = nfcee_mode;
 674
 675        return __nci_request(ndev, nci_nfcee_mode_set_req,
 676                             (unsigned long)&cmd,
 677                             msecs_to_jiffies(NCI_CMD_TIMEOUT));
 678}
 679EXPORT_SYMBOL(nci_nfcee_mode_set);
 680
 681static void nci_core_conn_create_req(struct nci_dev *ndev, unsigned long opt)
 682{
 683        struct core_conn_create_data *data =
 684                                        (struct core_conn_create_data *)opt;
 685
 686        nci_send_cmd(ndev, NCI_OP_CORE_CONN_CREATE_CMD, data->length, data->cmd);
 687}
 688
 689int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type,
 690                         u8 number_destination_params,
 691                         size_t params_len,
 692                         struct core_conn_create_dest_spec_params *params)
 693{
 694        int r;
 695        struct nci_core_conn_create_cmd *cmd;
 696        struct core_conn_create_data data;
 697
 698        data.length = params_len + sizeof(struct nci_core_conn_create_cmd);
 699        cmd = kzalloc(data.length, GFP_KERNEL);
 700        if (!cmd)
 701                return -ENOMEM;
 702
 703        cmd->destination_type = destination_type;
 704        cmd->number_destination_params = number_destination_params;
 705
 706        data.cmd = cmd;
 707
 708        if (params) {
 709                memcpy(cmd->params, params, params_len);
 710                if (params->length > 0)
 711                        memcpy(&ndev->cur_params,
 712                               &params->value[DEST_SPEC_PARAMS_ID_INDEX],
 713                               sizeof(struct dest_spec_params));
 714                else
 715                        ndev->cur_params.id = 0;
 716        } else {
 717                ndev->cur_params.id = 0;
 718        }
 719        ndev->cur_dest_type = destination_type;
 720
 721        r = __nci_request(ndev, nci_core_conn_create_req, (unsigned long)&data,
 722                          msecs_to_jiffies(NCI_CMD_TIMEOUT));
 723        kfree(cmd);
 724        return r;
 725}
 726EXPORT_SYMBOL(nci_core_conn_create);
 727
 728static void nci_core_conn_close_req(struct nci_dev *ndev, unsigned long opt)
 729{
 730        __u8 conn_id = opt;
 731
 732        nci_send_cmd(ndev, NCI_OP_CORE_CONN_CLOSE_CMD, 1, &conn_id);
 733}
 734
 735int nci_core_conn_close(struct nci_dev *ndev, u8 conn_id)
 736{
 737        ndev->cur_conn_id = conn_id;
 738        return __nci_request(ndev, nci_core_conn_close_req, conn_id,
 739                             msecs_to_jiffies(NCI_CMD_TIMEOUT));
 740}
 741EXPORT_SYMBOL(nci_core_conn_close);
 742
 743static int nci_set_local_general_bytes(struct nfc_dev *nfc_dev)
 744{
 745        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
 746        struct nci_set_config_param param;
 747        int rc;
 748
 749        param.val = nfc_get_local_general_bytes(nfc_dev, &param.len);
 750        if ((param.val == NULL) || (param.len == 0))
 751                return 0;
 752
 753        if (param.len > NFC_MAX_GT_LEN)
 754                return -EINVAL;
 755
 756        param.id = NCI_PN_ATR_REQ_GEN_BYTES;
 757
 758        rc = nci_request(ndev, nci_set_config_req, (unsigned long)&param,
 759                         msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
 760        if (rc)
 761                return rc;
 762
 763        param.id = NCI_LN_ATR_RES_GEN_BYTES;
 764
 765        return nci_request(ndev, nci_set_config_req, (unsigned long)&param,
 766                           msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
 767}
 768
 769static int nci_set_listen_parameters(struct nfc_dev *nfc_dev)
 770{
 771        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
 772        int rc;
 773        __u8 val;
 774
 775        val = NCI_LA_SEL_INFO_NFC_DEP_MASK;
 776
 777        rc = nci_set_config(ndev, NCI_LA_SEL_INFO, 1, &val);
 778        if (rc)
 779                return rc;
 780
 781        val = NCI_LF_PROTOCOL_TYPE_NFC_DEP_MASK;
 782
 783        rc = nci_set_config(ndev, NCI_LF_PROTOCOL_TYPE, 1, &val);
 784        if (rc)
 785                return rc;
 786
 787        val = NCI_LF_CON_BITR_F_212 | NCI_LF_CON_BITR_F_424;
 788
 789        return nci_set_config(ndev, NCI_LF_CON_BITR_F, 1, &val);
 790}
 791
 792static int nci_start_poll(struct nfc_dev *nfc_dev,
 793                          __u32 im_protocols, __u32 tm_protocols)
 794{
 795        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
 796        struct nci_rf_discover_param param;
 797        int rc;
 798
 799        if ((atomic_read(&ndev->state) == NCI_DISCOVERY) ||
 800            (atomic_read(&ndev->state) == NCI_W4_ALL_DISCOVERIES)) {
 801                pr_err("unable to start poll, since poll is already active\n");
 802                return -EBUSY;
 803        }
 804
 805        if (ndev->target_active_prot) {
 806                pr_err("there is an active target\n");
 807                return -EBUSY;
 808        }
 809
 810        if ((atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) ||
 811            (atomic_read(&ndev->state) == NCI_POLL_ACTIVE)) {
 812                pr_debug("target active or w4 select, implicitly deactivate\n");
 813
 814                rc = nci_request(ndev, nci_rf_deactivate_req,
 815                                 NCI_DEACTIVATE_TYPE_IDLE_MODE,
 816                                 msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
 817                if (rc)
 818                        return -EBUSY;
 819        }
 820
 821        if ((im_protocols | tm_protocols) & NFC_PROTO_NFC_DEP_MASK) {
 822                rc = nci_set_local_general_bytes(nfc_dev);
 823                if (rc) {
 824                        pr_err("failed to set local general bytes\n");
 825                        return rc;
 826                }
 827        }
 828
 829        if (tm_protocols & NFC_PROTO_NFC_DEP_MASK) {
 830                rc = nci_set_listen_parameters(nfc_dev);
 831                if (rc)
 832                        pr_err("failed to set listen parameters\n");
 833        }
 834
 835        param.im_protocols = im_protocols;
 836        param.tm_protocols = tm_protocols;
 837        rc = nci_request(ndev, nci_rf_discover_req, (unsigned long)&param,
 838                         msecs_to_jiffies(NCI_RF_DISC_TIMEOUT));
 839
 840        if (!rc)
 841                ndev->poll_prots = im_protocols;
 842
 843        return rc;
 844}
 845
 846static void nci_stop_poll(struct nfc_dev *nfc_dev)
 847{
 848        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
 849
 850        if ((atomic_read(&ndev->state) != NCI_DISCOVERY) &&
 851            (atomic_read(&ndev->state) != NCI_W4_ALL_DISCOVERIES)) {
 852                pr_err("unable to stop poll, since poll is not active\n");
 853                return;
 854        }
 855
 856        nci_request(ndev, nci_rf_deactivate_req, NCI_DEACTIVATE_TYPE_IDLE_MODE,
 857                    msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
 858}
 859
 860static int nci_activate_target(struct nfc_dev *nfc_dev,
 861                               struct nfc_target *target, __u32 protocol)
 862{
 863        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
 864        struct nci_rf_discover_select_param param;
 865        struct nfc_target *nci_target = NULL;
 866        int i;
 867        int rc = 0;
 868
 869        pr_debug("target_idx %d, protocol 0x%x\n", target->idx, protocol);
 870
 871        if ((atomic_read(&ndev->state) != NCI_W4_HOST_SELECT) &&
 872            (atomic_read(&ndev->state) != NCI_POLL_ACTIVE)) {
 873                pr_err("there is no available target to activate\n");
 874                return -EINVAL;
 875        }
 876
 877        if (ndev->target_active_prot) {
 878                pr_err("there is already an active target\n");
 879                return -EBUSY;
 880        }
 881
 882        for (i = 0; i < ndev->n_targets; i++) {
 883                if (ndev->targets[i].idx == target->idx) {
 884                        nci_target = &ndev->targets[i];
 885                        break;
 886                }
 887        }
 888
 889        if (!nci_target) {
 890                pr_err("unable to find the selected target\n");
 891                return -EINVAL;
 892        }
 893
 894        if (!(nci_target->supported_protocols & (1 << protocol))) {
 895                pr_err("target does not support the requested protocol 0x%x\n",
 896                       protocol);
 897                return -EINVAL;
 898        }
 899
 900        if (atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) {
 901                param.rf_discovery_id = nci_target->logical_idx;
 902
 903                if (protocol == NFC_PROTO_JEWEL)
 904                        param.rf_protocol = NCI_RF_PROTOCOL_T1T;
 905                else if (protocol == NFC_PROTO_MIFARE)
 906                        param.rf_protocol = NCI_RF_PROTOCOL_T2T;
 907                else if (protocol == NFC_PROTO_FELICA)
 908                        param.rf_protocol = NCI_RF_PROTOCOL_T3T;
 909                else if (protocol == NFC_PROTO_ISO14443 ||
 910                         protocol == NFC_PROTO_ISO14443_B)
 911                        param.rf_protocol = NCI_RF_PROTOCOL_ISO_DEP;
 912                else
 913                        param.rf_protocol = NCI_RF_PROTOCOL_NFC_DEP;
 914
 915                rc = nci_request(ndev, nci_rf_discover_select_req,
 916                                 (unsigned long)&param,
 917                                 msecs_to_jiffies(NCI_RF_DISC_SELECT_TIMEOUT));
 918        }
 919
 920        if (!rc)
 921                ndev->target_active_prot = protocol;
 922
 923        return rc;
 924}
 925
 926static void nci_deactivate_target(struct nfc_dev *nfc_dev,
 927                                  struct nfc_target *target,
 928                                  __u8 mode)
 929{
 930        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
 931        u8 nci_mode = NCI_DEACTIVATE_TYPE_IDLE_MODE;
 932
 933        pr_debug("entry\n");
 934
 935        if (!ndev->target_active_prot) {
 936                pr_err("unable to deactivate target, no active target\n");
 937                return;
 938        }
 939
 940        ndev->target_active_prot = 0;
 941
 942        switch (mode) {
 943        case NFC_TARGET_MODE_SLEEP:
 944                nci_mode = NCI_DEACTIVATE_TYPE_SLEEP_MODE;
 945                break;
 946        }
 947
 948        if (atomic_read(&ndev->state) == NCI_POLL_ACTIVE) {
 949                nci_request(ndev, nci_rf_deactivate_req, nci_mode,
 950                            msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
 951        }
 952}
 953
 954static int nci_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target,
 955                           __u8 comm_mode, __u8 *gb, size_t gb_len)
 956{
 957        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
 958        int rc;
 959
 960        pr_debug("target_idx %d, comm_mode %d\n", target->idx, comm_mode);
 961
 962        rc = nci_activate_target(nfc_dev, target, NFC_PROTO_NFC_DEP);
 963        if (rc)
 964                return rc;
 965
 966        rc = nfc_set_remote_general_bytes(nfc_dev, ndev->remote_gb,
 967                                          ndev->remote_gb_len);
 968        if (!rc)
 969                rc = nfc_dep_link_is_up(nfc_dev, target->idx, NFC_COMM_PASSIVE,
 970                                        NFC_RF_INITIATOR);
 971
 972        return rc;
 973}
 974
 975static int nci_dep_link_down(struct nfc_dev *nfc_dev)
 976{
 977        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
 978        int rc;
 979
 980        pr_debug("entry\n");
 981
 982        if (nfc_dev->rf_mode == NFC_RF_INITIATOR) {
 983                nci_deactivate_target(nfc_dev, NULL, NCI_DEACTIVATE_TYPE_IDLE_MODE);
 984        } else {
 985                if (atomic_read(&ndev->state) == NCI_LISTEN_ACTIVE ||
 986                    atomic_read(&ndev->state) == NCI_DISCOVERY) {
 987                        nci_request(ndev, nci_rf_deactivate_req, 0,
 988                                msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
 989                }
 990
 991                rc = nfc_tm_deactivated(nfc_dev);
 992                if (rc)
 993                        pr_err("error when signaling tm deactivation\n");
 994        }
 995
 996        return 0;
 997}
 998
 999
1000static int nci_transceive(struct nfc_dev *nfc_dev, struct nfc_target *target,
1001                          struct sk_buff *skb,
1002                          data_exchange_cb_t cb, void *cb_context)
1003{
1004        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1005        int rc;
1006        struct nci_conn_info    *conn_info;
1007
1008        conn_info = ndev->rf_conn_info;
1009        if (!conn_info)
1010                return -EPROTO;
1011
1012        pr_debug("target_idx %d, len %d\n", target->idx, skb->len);
1013
1014        if (!ndev->target_active_prot) {
1015                pr_err("unable to exchange data, no active target\n");
1016                return -EINVAL;
1017        }
1018
1019        if (test_and_set_bit(NCI_DATA_EXCHANGE, &ndev->flags))
1020                return -EBUSY;
1021
1022        /* store cb and context to be used on receiving data */
1023        conn_info->data_exchange_cb = cb;
1024        conn_info->data_exchange_cb_context = cb_context;
1025
1026        rc = nci_send_data(ndev, NCI_STATIC_RF_CONN_ID, skb);
1027        if (rc)
1028                clear_bit(NCI_DATA_EXCHANGE, &ndev->flags);
1029
1030        return rc;
1031}
1032
1033static int nci_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb)
1034{
1035        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1036        int rc;
1037
1038        rc = nci_send_data(ndev, NCI_STATIC_RF_CONN_ID, skb);
1039        if (rc)
1040                pr_err("unable to send data\n");
1041
1042        return rc;
1043}
1044
1045static int nci_enable_se(struct nfc_dev *nfc_dev, u32 se_idx)
1046{
1047        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1048
1049        if (ndev->ops->enable_se)
1050                return ndev->ops->enable_se(ndev, se_idx);
1051
1052        return 0;
1053}
1054
1055static int nci_disable_se(struct nfc_dev *nfc_dev, u32 se_idx)
1056{
1057        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1058
1059        if (ndev->ops->disable_se)
1060                return ndev->ops->disable_se(ndev, se_idx);
1061
1062        return 0;
1063}
1064
1065static int nci_discover_se(struct nfc_dev *nfc_dev)
1066{
1067        int r;
1068        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1069
1070        if (ndev->ops->discover_se) {
1071                r = nci_nfcee_discover(ndev, NCI_NFCEE_DISCOVERY_ACTION_ENABLE);
1072                if (r != NCI_STATUS_OK)
1073                        return -EPROTO;
1074
1075                return ndev->ops->discover_se(ndev);
1076        }
1077
1078        return 0;
1079}
1080
1081static int nci_se_io(struct nfc_dev *nfc_dev, u32 se_idx,
1082                     u8 *apdu, size_t apdu_length,
1083                     se_io_cb_t cb, void *cb_context)
1084{
1085        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1086
1087        if (ndev->ops->se_io)
1088                return ndev->ops->se_io(ndev, se_idx, apdu,
1089                                apdu_length, cb, cb_context);
1090
1091        return 0;
1092}
1093
1094static int nci_fw_download(struct nfc_dev *nfc_dev, const char *firmware_name)
1095{
1096        struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
1097
1098        if (!ndev->ops->fw_download)
1099                return -ENOTSUPP;
1100
1101        return ndev->ops->fw_download(ndev, firmware_name);
1102}
1103
1104static struct nfc_ops nci_nfc_ops = {
1105        .dev_up = nci_dev_up,
1106        .dev_down = nci_dev_down,
1107        .start_poll = nci_start_poll,
1108        .stop_poll = nci_stop_poll,
1109        .dep_link_up = nci_dep_link_up,
1110        .dep_link_down = nci_dep_link_down,
1111        .activate_target = nci_activate_target,
1112        .deactivate_target = nci_deactivate_target,
1113        .im_transceive = nci_transceive,
1114        .tm_send = nci_tm_send,
1115        .enable_se = nci_enable_se,
1116        .disable_se = nci_disable_se,
1117        .discover_se = nci_discover_se,
1118        .se_io = nci_se_io,
1119        .fw_download = nci_fw_download,
1120};
1121
1122/* ---- Interface to NCI drivers ---- */
1123/**
1124 * nci_allocate_device - allocate a new nci device
1125 *
1126 * @ops: device operations
1127 * @supported_protocols: NFC protocols supported by the device
1128 */
1129struct nci_dev *nci_allocate_device(struct nci_ops *ops,
1130                                    __u32 supported_protocols,
1131                                    int tx_headroom, int tx_tailroom)
1132{
1133        struct nci_dev *ndev;
1134
1135        pr_debug("supported_protocols 0x%x\n", supported_protocols);
1136
1137        if (!ops->open || !ops->close || !ops->send)
1138                return NULL;
1139
1140        if (!supported_protocols)
1141                return NULL;
1142
1143        ndev = kzalloc(sizeof(struct nci_dev), GFP_KERNEL);
1144        if (!ndev)
1145                return NULL;
1146
1147        ndev->ops = ops;
1148
1149        if (ops->n_prop_ops > NCI_MAX_PROPRIETARY_CMD) {
1150                pr_err("Too many proprietary commands: %zd\n",
1151                       ops->n_prop_ops);
1152                ops->prop_ops = NULL;
1153                ops->n_prop_ops = 0;
1154        }
1155
1156        ndev->tx_headroom = tx_headroom;
1157        ndev->tx_tailroom = tx_tailroom;
1158        init_completion(&ndev->req_completion);
1159
1160        ndev->nfc_dev = nfc_allocate_device(&nci_nfc_ops,
1161                                            supported_protocols,
1162                                            tx_headroom + NCI_DATA_HDR_SIZE,
1163                                            tx_tailroom);
1164        if (!ndev->nfc_dev)
1165                goto free_nci;
1166
1167        ndev->hci_dev = nci_hci_allocate(ndev);
1168        if (!ndev->hci_dev)
1169                goto free_nfc;
1170
1171        nfc_set_drvdata(ndev->nfc_dev, ndev);
1172
1173        return ndev;
1174
1175free_nfc:
1176        kfree(ndev->nfc_dev);
1177
1178free_nci:
1179        kfree(ndev);
1180        return NULL;
1181}
1182EXPORT_SYMBOL(nci_allocate_device);
1183
1184/**
1185 * nci_free_device - deallocate nci device
1186 *
1187 * @ndev: The nci device to deallocate
1188 */
1189void nci_free_device(struct nci_dev *ndev)
1190{
1191        nfc_free_device(ndev->nfc_dev);
1192        kfree(ndev);
1193}
1194EXPORT_SYMBOL(nci_free_device);
1195
1196/**
1197 * nci_register_device - register a nci device in the nfc subsystem
1198 *
1199 * @dev: The nci device to register
1200 */
1201int nci_register_device(struct nci_dev *ndev)
1202{
1203        int rc;
1204        struct device *dev = &ndev->nfc_dev->dev;
1205        char name[32];
1206
1207        ndev->flags = 0;
1208
1209        INIT_WORK(&ndev->cmd_work, nci_cmd_work);
1210        snprintf(name, sizeof(name), "%s_nci_cmd_wq", dev_name(dev));
1211        ndev->cmd_wq = create_singlethread_workqueue(name);
1212        if (!ndev->cmd_wq) {
1213                rc = -ENOMEM;
1214                goto exit;
1215        }
1216
1217        INIT_WORK(&ndev->rx_work, nci_rx_work);
1218        snprintf(name, sizeof(name), "%s_nci_rx_wq", dev_name(dev));
1219        ndev->rx_wq = create_singlethread_workqueue(name);
1220        if (!ndev->rx_wq) {
1221                rc = -ENOMEM;
1222                goto destroy_cmd_wq_exit;
1223        }
1224
1225        INIT_WORK(&ndev->tx_work, nci_tx_work);
1226        snprintf(name, sizeof(name), "%s_nci_tx_wq", dev_name(dev));
1227        ndev->tx_wq = create_singlethread_workqueue(name);
1228        if (!ndev->tx_wq) {
1229                rc = -ENOMEM;
1230                goto destroy_rx_wq_exit;
1231        }
1232
1233        skb_queue_head_init(&ndev->cmd_q);
1234        skb_queue_head_init(&ndev->rx_q);
1235        skb_queue_head_init(&ndev->tx_q);
1236
1237        setup_timer(&ndev->cmd_timer, nci_cmd_timer,
1238                    (unsigned long) ndev);
1239        setup_timer(&ndev->data_timer, nci_data_timer,
1240                    (unsigned long) ndev);
1241
1242        mutex_init(&ndev->req_lock);
1243        INIT_LIST_HEAD(&ndev->conn_info_list);
1244
1245        rc = nfc_register_device(ndev->nfc_dev);
1246        if (rc)
1247                goto destroy_rx_wq_exit;
1248
1249        goto exit;
1250
1251destroy_rx_wq_exit:
1252        destroy_workqueue(ndev->rx_wq);
1253
1254destroy_cmd_wq_exit:
1255        destroy_workqueue(ndev->cmd_wq);
1256
1257exit:
1258        return rc;
1259}
1260EXPORT_SYMBOL(nci_register_device);
1261
1262/**
1263 * nci_unregister_device - unregister a nci device in the nfc subsystem
1264 *
1265 * @dev: The nci device to unregister
1266 */
1267void nci_unregister_device(struct nci_dev *ndev)
1268{
1269        struct nci_conn_info    *conn_info, *n;
1270
1271        nci_close_device(ndev);
1272
1273        destroy_workqueue(ndev->cmd_wq);
1274        destroy_workqueue(ndev->rx_wq);
1275        destroy_workqueue(ndev->tx_wq);
1276
1277        list_for_each_entry_safe(conn_info, n, &ndev->conn_info_list, list) {
1278                list_del(&conn_info->list);
1279                /* conn_info is allocated with devm_kzalloc */
1280        }
1281
1282        nfc_unregister_device(ndev->nfc_dev);
1283}
1284EXPORT_SYMBOL(nci_unregister_device);
1285
1286/**
1287 * nci_recv_frame - receive frame from NCI drivers
1288 *
1289 * @ndev: The nci device
1290 * @skb: The sk_buff to receive
1291 */
1292int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb)
1293{
1294        pr_debug("len %d\n", skb->len);
1295
1296        if (!ndev || (!test_bit(NCI_UP, &ndev->flags) &&
1297            !test_bit(NCI_INIT, &ndev->flags))) {
1298                kfree_skb(skb);
1299                return -ENXIO;
1300        }
1301
1302        /* Queue frame for rx worker thread */
1303        skb_queue_tail(&ndev->rx_q, skb);
1304        queue_work(ndev->rx_wq, &ndev->rx_work);
1305
1306        return 0;
1307}
1308EXPORT_SYMBOL(nci_recv_frame);
1309
1310int nci_send_frame(struct nci_dev *ndev, struct sk_buff *skb)
1311{
1312        pr_debug("len %d\n", skb->len);
1313
1314        if (!ndev) {
1315                kfree_skb(skb);
1316                return -ENODEV;
1317        }
1318
1319        /* Get rid of skb owner, prior to sending to the driver. */
1320        skb_orphan(skb);
1321
1322        /* Send copy to sniffer */
1323        nfc_send_to_raw_sock(ndev->nfc_dev, skb,
1324                             RAW_PAYLOAD_NCI, NFC_DIRECTION_TX);
1325
1326        return ndev->ops->send(ndev, skb);
1327}
1328EXPORT_SYMBOL(nci_send_frame);
1329
1330/* Send NCI command */
1331int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload)
1332{
1333        struct nci_ctrl_hdr *hdr;
1334        struct sk_buff *skb;
1335
1336        pr_debug("opcode 0x%x, plen %d\n", opcode, plen);
1337
1338        skb = nci_skb_alloc(ndev, (NCI_CTRL_HDR_SIZE + plen), GFP_KERNEL);
1339        if (!skb) {
1340                pr_err("no memory for command\n");
1341                return -ENOMEM;
1342        }
1343
1344        hdr = (struct nci_ctrl_hdr *) skb_put(skb, NCI_CTRL_HDR_SIZE);
1345        hdr->gid = nci_opcode_gid(opcode);
1346        hdr->oid = nci_opcode_oid(opcode);
1347        hdr->plen = plen;
1348
1349        nci_mt_set((__u8 *)hdr, NCI_MT_CMD_PKT);
1350        nci_pbf_set((__u8 *)hdr, NCI_PBF_LAST);
1351
1352        if (plen)
1353                memcpy(skb_put(skb, plen), payload, plen);
1354
1355        skb_queue_tail(&ndev->cmd_q, skb);
1356        queue_work(ndev->cmd_wq, &ndev->cmd_work);
1357
1358        return 0;
1359}
1360EXPORT_SYMBOL(nci_send_cmd);
1361
1362/* Proprietary commands API */
1363static struct nci_driver_ops *ops_cmd_lookup(struct nci_driver_ops *ops,
1364                                             size_t n_ops,
1365                                             __u16 opcode)
1366{
1367        size_t i;
1368        struct nci_driver_ops *op;
1369
1370        if (!ops || !n_ops)
1371                return NULL;
1372
1373        for (i = 0; i < n_ops; i++) {
1374                op = &ops[i];
1375                if (op->opcode == opcode)
1376                        return op;
1377        }
1378
1379        return NULL;
1380}
1381
1382static int nci_op_rsp_packet(struct nci_dev *ndev, __u16 rsp_opcode,
1383                             struct sk_buff *skb, struct nci_driver_ops *ops,
1384                             size_t n_ops)
1385{
1386        struct nci_driver_ops *op;
1387
1388        op = ops_cmd_lookup(ops, n_ops, rsp_opcode);
1389        if (!op || !op->rsp)
1390                return -ENOTSUPP;
1391
1392        return op->rsp(ndev, skb);
1393}
1394
1395static int nci_op_ntf_packet(struct nci_dev *ndev, __u16 ntf_opcode,
1396                             struct sk_buff *skb, struct nci_driver_ops *ops,
1397                             size_t n_ops)
1398{
1399        struct nci_driver_ops *op;
1400
1401        op = ops_cmd_lookup(ops, n_ops, ntf_opcode);
1402        if (!op || !op->ntf)
1403                return -ENOTSUPP;
1404
1405        return op->ntf(ndev, skb);
1406}
1407
1408int nci_prop_rsp_packet(struct nci_dev *ndev, __u16 opcode,
1409                        struct sk_buff *skb)
1410{
1411        return nci_op_rsp_packet(ndev, opcode, skb, ndev->ops->prop_ops,
1412                                 ndev->ops->n_prop_ops);
1413}
1414
1415int nci_prop_ntf_packet(struct nci_dev *ndev, __u16 opcode,
1416                        struct sk_buff *skb)
1417{
1418        return nci_op_ntf_packet(ndev, opcode, skb, ndev->ops->prop_ops,
1419                                 ndev->ops->n_prop_ops);
1420}
1421
1422int nci_core_rsp_packet(struct nci_dev *ndev, __u16 opcode,
1423                        struct sk_buff *skb)
1424{
1425        return nci_op_rsp_packet(ndev, opcode, skb, ndev->ops->core_ops,
1426                                  ndev->ops->n_core_ops);
1427}
1428
1429int nci_core_ntf_packet(struct nci_dev *ndev, __u16 opcode,
1430                        struct sk_buff *skb)
1431{
1432        return nci_op_ntf_packet(ndev, opcode, skb, ndev->ops->core_ops,
1433                                 ndev->ops->n_core_ops);
1434}
1435
1436/* ---- NCI TX Data worker thread ---- */
1437
1438static void nci_tx_work(struct work_struct *work)
1439{
1440        struct nci_dev *ndev = container_of(work, struct nci_dev, tx_work);
1441        struct nci_conn_info    *conn_info;
1442        struct sk_buff *skb;
1443
1444        conn_info = nci_get_conn_info_by_conn_id(ndev, ndev->cur_conn_id);
1445        if (!conn_info)
1446                return;
1447
1448        pr_debug("credits_cnt %d\n", atomic_read(&conn_info->credits_cnt));
1449
1450        /* Send queued tx data */
1451        while (atomic_read(&conn_info->credits_cnt)) {
1452                skb = skb_dequeue(&ndev->tx_q);
1453                if (!skb)
1454                        return;
1455
1456                /* Check if data flow control is used */
1457                if (atomic_read(&conn_info->credits_cnt) !=
1458                    NCI_DATA_FLOW_CONTROL_NOT_USED)
1459                        atomic_dec(&conn_info->credits_cnt);
1460
1461                pr_debug("NCI TX: MT=data, PBF=%d, conn_id=%d, plen=%d\n",
1462                         nci_pbf(skb->data),
1463                         nci_conn_id(skb->data),
1464                         nci_plen(skb->data));
1465
1466                nci_send_frame(ndev, skb);
1467
1468                mod_timer(&ndev->data_timer,
1469                          jiffies + msecs_to_jiffies(NCI_DATA_TIMEOUT));
1470        }
1471}
1472
1473/* ----- NCI RX worker thread (data & control) ----- */
1474
1475static void nci_rx_work(struct work_struct *work)
1476{
1477        struct nci_dev *ndev = container_of(work, struct nci_dev, rx_work);
1478        struct sk_buff *skb;
1479
1480        while ((skb = skb_dequeue(&ndev->rx_q))) {
1481
1482                /* Send copy to sniffer */
1483                nfc_send_to_raw_sock(ndev->nfc_dev, skb,
1484                                     RAW_PAYLOAD_NCI, NFC_DIRECTION_RX);
1485
1486                /* Process frame */
1487                switch (nci_mt(skb->data)) {
1488                case NCI_MT_RSP_PKT:
1489                        nci_rsp_packet(ndev, skb);
1490                        break;
1491
1492                case NCI_MT_NTF_PKT:
1493                        nci_ntf_packet(ndev, skb);
1494                        break;
1495
1496                case NCI_MT_DATA_PKT:
1497                        nci_rx_data_packet(ndev, skb);
1498                        break;
1499
1500                default:
1501                        pr_err("unknown MT 0x%x\n", nci_mt(skb->data));
1502                        kfree_skb(skb);
1503                        break;
1504                }
1505        }
1506
1507        /* check if a data exchange timout has occurred */
1508        if (test_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags)) {
1509                /* complete the data exchange transaction, if exists */
1510                if (test_bit(NCI_DATA_EXCHANGE, &ndev->flags))
1511                        nci_data_exchange_complete(ndev, NULL,
1512                                                   ndev->cur_conn_id,
1513                                                   -ETIMEDOUT);
1514
1515                clear_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags);
1516        }
1517}
1518
1519/* ----- NCI TX CMD worker thread ----- */
1520
1521static void nci_cmd_work(struct work_struct *work)
1522{
1523        struct nci_dev *ndev = container_of(work, struct nci_dev, cmd_work);
1524        struct sk_buff *skb;
1525
1526        pr_debug("cmd_cnt %d\n", atomic_read(&ndev->cmd_cnt));
1527
1528        /* Send queued command */
1529        if (atomic_read(&ndev->cmd_cnt)) {
1530                skb = skb_dequeue(&ndev->cmd_q);
1531                if (!skb)
1532                        return;
1533
1534                atomic_dec(&ndev->cmd_cnt);
1535
1536                pr_debug("NCI TX: MT=cmd, PBF=%d, GID=0x%x, OID=0x%x, plen=%d\n",
1537                         nci_pbf(skb->data),
1538                         nci_opcode_gid(nci_opcode(skb->data)),
1539                         nci_opcode_oid(nci_opcode(skb->data)),
1540                         nci_plen(skb->data));
1541
1542                nci_send_frame(ndev, skb);
1543
1544                mod_timer(&ndev->cmd_timer,
1545                          jiffies + msecs_to_jiffies(NCI_CMD_TIMEOUT));
1546        }
1547}
1548
1549MODULE_LICENSE("GPL");
1550