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