^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * HCI based Driver for NXP PN544 NFC Chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2012 Intel Corporation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/nfc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <net/nfc/hci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <net/nfc/llc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include "pn544.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) /* Timing restrictions (ms) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define PN544_HCI_RESETVEN_TIME 30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) enum pn544_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) PN544_ST_COLD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) PN544_ST_FW_READY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) PN544_ST_READY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define FULL_VERSION_LEN 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) /* Proprietary commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define PN544_WRITE 0x3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define PN544_TEST_SWP 0x21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /* Proprietary gates, events, commands and registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /* NFC_HCI_RF_READER_A_GATE additional registers and commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define PN544_RF_READER_A_AUTO_ACTIVATION 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define PN544_RF_READER_A_CMD_CONTINUE_ACTIVATION 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define PN544_MIFARE_CMD 0x21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /* Commands that apply to all RF readers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define PN544_RF_READER_CMD_PRESENCE_CHECK 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define PN544_RF_READER_CMD_ACTIVATE_NEXT 0x32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) /* NFC_HCI_ID_MGMT_GATE additional registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define PN544_ID_MGMT_FULL_VERSION_SW 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define PN544_RF_READER_ISO15693_GATE 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define PN544_RF_READER_F_GATE 0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define PN544_FELICA_ID 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define PN544_FELICA_RAW 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define PN544_RF_READER_JEWEL_GATE 0x15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define PN544_JEWEL_RAW_CMD 0x23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define PN544_RF_READER_NFCIP1_INITIATOR_GATE 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define PN544_RF_READER_NFCIP1_TARGET_GATE 0x31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define PN544_SYS_MGMT_GATE 0x90
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define PN544_SYS_MGMT_INFO_NOTIFICATION 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define PN544_POLLING_LOOP_MGMT_GATE 0x94
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define PN544_DEP_MODE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define PN544_DEP_ATR_REQ 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define PN544_DEP_ATR_RES 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define PN544_DEP_MERGE 0x0D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define PN544_PL_RDPHASES 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define PN544_PL_EMULATION 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define PN544_PL_NFCT_DEACTIVATED 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define PN544_SWP_MGMT_GATE 0xA0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define PN544_SWP_DEFAULT_MODE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define PN544_NFC_WI_MGMT_GATE 0xA1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define PN544_NFC_ESE_DEFAULT_MODE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define PN544_HCI_EVT_SND_DATA 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define PN544_HCI_EVT_ACTIVATED 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define PN544_HCI_EVT_DEACTIVATED 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define PN544_HCI_EVT_RCV_DATA 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define PN544_HCI_EVT_CONTINUE_MI 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define PN544_HCI_EVT_SWITCH_MODE 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define PN544_HCI_CMD_ATTREQUEST 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define PN544_HCI_CMD_CONTINUE_ACTIVATION 0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) static struct nfc_hci_gate pn544_gates[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) {NFC_HCI_ADMIN_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) {NFC_HCI_LOOPBACK_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) {NFC_HCI_ID_MGMT_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) {NFC_HCI_LINK_MGMT_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) {NFC_HCI_RF_READER_B_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) {NFC_HCI_RF_READER_A_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) {PN544_SYS_MGMT_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) {PN544_SWP_MGMT_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) {PN544_POLLING_LOOP_MGMT_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {PN544_NFC_WI_MGMT_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {PN544_RF_READER_F_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {PN544_RF_READER_JEWEL_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) {PN544_RF_READER_ISO15693_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {PN544_RF_READER_NFCIP1_INITIATOR_GATE, NFC_HCI_INVALID_PIPE},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) {PN544_RF_READER_NFCIP1_TARGET_GATE, NFC_HCI_INVALID_PIPE}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /* Largest headroom needed for outgoing custom commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define PN544_CMDS_HEADROOM 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct pn544_hci_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) struct nfc_phy_ops *phy_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) void *phy_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) struct nfc_hci_dev *hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) enum pn544_state state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) struct mutex info_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) int async_cb_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) data_exchange_cb_t async_cb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) void *async_cb_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) fw_download_t fw_download;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) static int pn544_hci_open(struct nfc_hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct pn544_hci_info *info = nfc_hci_get_clientdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) int r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) mutex_lock(&info->info_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) if (info->state != PN544_ST_COLD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) r = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) r = info->phy_ops->enable(info->phy_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) if (r == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) info->state = PN544_ST_READY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) mutex_unlock(&info->info_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) static void pn544_hci_close(struct nfc_hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) struct pn544_hci_info *info = nfc_hci_get_clientdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) mutex_lock(&info->info_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) if (info->state == PN544_ST_COLD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) info->phy_ops->disable(info->phy_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) info->state = PN544_ST_COLD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) mutex_unlock(&info->info_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) static int pn544_hci_ready(struct nfc_hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) static struct hw_config {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) u8 adr[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) u8 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) } hw_config[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {{0x9f, 0x9a}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) {{0x98, 0x10}, 0xbc},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) {{0x9e, 0x71}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) {{0x98, 0x09}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) {{0x9e, 0xb4}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) {{0x9c, 0x01}, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {{0x9e, 0xaa}, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) {{0x9b, 0xd1}, 0x17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) {{0x9b, 0xd2}, 0x58},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {{0x9b, 0xd3}, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) {{0x9b, 0xd4}, 0x47},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) {{0x9b, 0xd5}, 0x0c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) {{0x9b, 0xd6}, 0x37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) {{0x9b, 0xdd}, 0x33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) {{0x9b, 0x84}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) {{0x99, 0x81}, 0x79},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {{0x99, 0x31}, 0x79},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) {{0x98, 0x00}, 0x3f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) {{0x9f, 0x09}, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) {{0x9f, 0x0a}, 0x05},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) {{0x9e, 0xd1}, 0xa1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {{0x99, 0x23}, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) {{0x9e, 0x74}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {{0x9e, 0x90}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) {{0x9f, 0x28}, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) {{0x9f, 0x35}, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) {{0x9f, 0x36}, 0x11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) {{0x9c, 0x31}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) {{0x9c, 0x32}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) {{0x9c, 0x19}, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) {{0x9c, 0x1a}, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) {{0x9c, 0x0c}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) {{0x9c, 0x0d}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) {{0x9c, 0x12}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) {{0x9c, 0x13}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) {{0x98, 0xa2}, 0x09},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) {{0x98, 0x93}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) {{0x98, 0x7d}, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) {{0x98, 0x7e}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {{0x9f, 0xc8}, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) struct hw_config *p = hw_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) int count = ARRAY_SIZE(hw_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) struct sk_buff *res_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) u8 param[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) param[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) while (count--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) param[1] = p->adr[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) param[2] = p->adr[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) param[3] = p->value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) r = nfc_hci_send_cmd(hdev, PN544_SYS_MGMT_GATE, PN544_WRITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) param, 4, &res_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) if (res_skb->len != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) kfree_skb(res_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) if (res_skb->data[0] != p->value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) kfree_skb(res_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) kfree_skb(res_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) param[0] = NFC_HCI_UICC_HOST_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) r = nfc_hci_set_param(hdev, NFC_HCI_ADMIN_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) NFC_HCI_ADMIN_WHITELIST, param, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) param[0] = 0x3d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) r = nfc_hci_set_param(hdev, PN544_SYS_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) PN544_SYS_MGMT_INFO_NOTIFICATION, param, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) param[0] = 0x0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) r = nfc_hci_set_param(hdev, NFC_HCI_RF_READER_A_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) PN544_RF_READER_A_AUTO_ACTIVATION, param, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) r = nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) NFC_HCI_EVT_END_OPERATION, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) param[0] = 0x1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) r = nfc_hci_set_param(hdev, PN544_POLLING_LOOP_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) PN544_PL_NFCT_DEACTIVATED, param, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) param[0] = 0x0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) r = nfc_hci_set_param(hdev, PN544_POLLING_LOOP_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) PN544_PL_RDPHASES, param, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) r = nfc_hci_get_param(hdev, NFC_HCI_ID_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) PN544_ID_MGMT_FULL_VERSION_SW, &skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) if (skb->len != FULL_VERSION_LEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) print_hex_dump(KERN_DEBUG, "FULL VERSION SOFTWARE INFO: ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) DUMP_PREFIX_NONE, 16, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) skb->data, FULL_VERSION_LEN, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) static int pn544_hci_xmit(struct nfc_hci_dev *hdev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) struct pn544_hci_info *info = nfc_hci_get_clientdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) return info->phy_ops->write(info->phy_id, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) static int pn544_hci_start_poll(struct nfc_hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) u32 im_protocols, u32 tm_protocols)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) u8 phases = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) u8 duration[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) u8 activated;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) u8 i_mode = 0x3f; /* Enable all supported modes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) u8 t_mode = 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) u8 t_merge = 0x01; /* Enable merge by default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) pr_info(DRIVER_DESC ": %s protocols 0x%x 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) __func__, im_protocols, tm_protocols);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) r = nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) NFC_HCI_EVT_END_OPERATION, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) duration[0] = 0x18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) duration[1] = 0x6a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) r = nfc_hci_set_param(hdev, PN544_POLLING_LOOP_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) PN544_PL_EMULATION, duration, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) activated = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) r = nfc_hci_set_param(hdev, PN544_POLLING_LOOP_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) PN544_PL_NFCT_DEACTIVATED, &activated, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) if (im_protocols & (NFC_PROTO_ISO14443_MASK | NFC_PROTO_MIFARE_MASK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) NFC_PROTO_JEWEL_MASK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) phases |= 1; /* Type A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if (im_protocols & NFC_PROTO_FELICA_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) phases |= (1 << 2); /* Type F 212 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) phases |= (1 << 3); /* Type F 424 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) phases |= (1 << 5); /* NFC active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) r = nfc_hci_set_param(hdev, PN544_POLLING_LOOP_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) PN544_PL_RDPHASES, &phases, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) if ((im_protocols | tm_protocols) & NFC_PROTO_NFC_DEP_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) hdev->gb = nfc_get_local_general_bytes(hdev->ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) &hdev->gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) pr_debug("generate local bytes %p\n", hdev->gb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) if (hdev->gb == NULL || hdev->gb_len == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) im_protocols &= ~NFC_PROTO_NFC_DEP_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) tm_protocols &= ~NFC_PROTO_NFC_DEP_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) if (im_protocols & NFC_PROTO_NFC_DEP_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) r = nfc_hci_send_event(hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) PN544_RF_READER_NFCIP1_INITIATOR_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) NFC_HCI_EVT_END_OPERATION, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) r = nfc_hci_set_param(hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) PN544_RF_READER_NFCIP1_INITIATOR_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) PN544_DEP_MODE, &i_mode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) r = nfc_hci_set_param(hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) PN544_RF_READER_NFCIP1_INITIATOR_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) PN544_DEP_ATR_REQ, hdev->gb, hdev->gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) r = nfc_hci_send_event(hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) PN544_RF_READER_NFCIP1_INITIATOR_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) NFC_HCI_EVT_READER_REQUESTED, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) nfc_hci_send_event(hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) PN544_RF_READER_NFCIP1_INITIATOR_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) NFC_HCI_EVT_END_OPERATION, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) if (tm_protocols & NFC_PROTO_NFC_DEP_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) r = nfc_hci_set_param(hdev, PN544_RF_READER_NFCIP1_TARGET_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) PN544_DEP_MODE, &t_mode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) r = nfc_hci_set_param(hdev, PN544_RF_READER_NFCIP1_TARGET_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) PN544_DEP_ATR_RES, hdev->gb, hdev->gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) r = nfc_hci_set_param(hdev, PN544_RF_READER_NFCIP1_TARGET_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) PN544_DEP_MERGE, &t_merge, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) r = nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) NFC_HCI_EVT_READER_REQUESTED, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) NFC_HCI_EVT_END_OPERATION, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) static int pn544_hci_dep_link_up(struct nfc_hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) struct nfc_target *target, u8 comm_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) u8 *gb, size_t gb_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) struct sk_buff *rgb_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) r = nfc_hci_get_param(hdev, target->hci_reader_gate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) PN544_DEP_ATR_RES, &rgb_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) if (rgb_skb->len == 0 || rgb_skb->len > NFC_GB_MAXSIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) r = -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) print_hex_dump(KERN_DEBUG, "remote gb: ", DUMP_PREFIX_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 16, 1, rgb_skb->data, rgb_skb->len, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) r = nfc_set_remote_general_bytes(hdev->ndev, rgb_skb->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) rgb_skb->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (r == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) r = nfc_dep_link_is_up(hdev->ndev, target->idx, comm_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) NFC_RF_INITIATOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) kfree_skb(rgb_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) static int pn544_hci_dep_link_down(struct nfc_hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) return nfc_hci_send_event(hdev, PN544_RF_READER_NFCIP1_INITIATOR_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) NFC_HCI_EVT_END_OPERATION, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) static int pn544_hci_target_from_gate(struct nfc_hci_dev *hdev, u8 gate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) struct nfc_target *target)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) switch (gate) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) case PN544_RF_READER_F_GATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) target->supported_protocols = NFC_PROTO_FELICA_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) case PN544_RF_READER_JEWEL_GATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) target->supported_protocols = NFC_PROTO_JEWEL_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) target->sens_res = 0x0c00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) case PN544_RF_READER_NFCIP1_INITIATOR_GATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) target->supported_protocols = NFC_PROTO_NFC_DEP_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) static int pn544_hci_complete_target_discovered(struct nfc_hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) u8 gate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) struct nfc_target *target)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) struct sk_buff *uid_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) int r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) if (gate == PN544_RF_READER_NFCIP1_INITIATOR_GATE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) if (target->supported_protocols & NFC_PROTO_NFC_DEP_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) r = nfc_hci_send_cmd(hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) PN544_RF_READER_NFCIP1_INITIATOR_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) PN544_HCI_CMD_CONTINUE_ACTIVATION, NULL, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) target->hci_reader_gate = PN544_RF_READER_NFCIP1_INITIATOR_GATE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) } else if (target->supported_protocols & NFC_PROTO_MIFARE_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) if (target->nfcid1_len != 4 && target->nfcid1_len != 7 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) target->nfcid1_len != 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) r = nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) PN544_RF_READER_CMD_ACTIVATE_NEXT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) target->nfcid1, target->nfcid1_len, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) } else if (target->supported_protocols & NFC_PROTO_FELICA_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) r = nfc_hci_get_param(hdev, PN544_RF_READER_F_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) PN544_FELICA_ID, &uid_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) if (uid_skb->len != 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) kfree_skb(uid_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) /* Type F NFC-DEP IDm has prefix 0x01FE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) if ((uid_skb->data[0] == 0x01) && (uid_skb->data[1] == 0xfe)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) kfree_skb(uid_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) r = nfc_hci_send_cmd(hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) PN544_RF_READER_NFCIP1_INITIATOR_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) PN544_HCI_CMD_CONTINUE_ACTIVATION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) NULL, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) target->supported_protocols = NFC_PROTO_NFC_DEP_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) target->hci_reader_gate =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) PN544_RF_READER_NFCIP1_INITIATOR_GATE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) r = nfc_hci_send_cmd(hdev, PN544_RF_READER_F_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) PN544_RF_READER_CMD_ACTIVATE_NEXT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) uid_skb->data, uid_skb->len, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) kfree_skb(uid_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) } else if (target->supported_protocols & NFC_PROTO_ISO14443_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) * TODO: maybe other ISO 14443 require some kind of continue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) * activation, but for now we've seen only this one below.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) if (target->sens_res == 0x4403) /* Type 4 Mifare DESFire */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) r = nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) PN544_RF_READER_A_CMD_CONTINUE_ACTIVATION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) NULL, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) #define PN544_CB_TYPE_READER_F 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) static void pn544_hci_data_exchange_cb(void *context, struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) int err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) struct pn544_hci_info *info = context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) switch (info->async_cb_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) case PN544_CB_TYPE_READER_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) if (err == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) skb_pull(skb, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) info->async_cb(info->async_cb_context, skb, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) if (err == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) #define MIFARE_CMD_AUTH_KEY_A 0x60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) #define MIFARE_CMD_AUTH_KEY_B 0x61
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) #define MIFARE_CMD_HEADER 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) #define MIFARE_UID_LEN 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) #define MIFARE_KEY_LEN 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) #define MIFARE_CMD_LEN 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) * <= 0: driver handled the data exchange
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) * 1: driver doesn't especially handle, please do standard processing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) static int pn544_hci_im_transceive(struct nfc_hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) struct nfc_target *target,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) struct sk_buff *skb, data_exchange_cb_t cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) void *cb_context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) struct pn544_hci_info *info = nfc_hci_get_clientdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) pr_info(DRIVER_DESC ": %s for gate=%d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) target->hci_reader_gate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) switch (target->hci_reader_gate) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) case NFC_HCI_RF_READER_A_GATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) if (target->supported_protocols & NFC_PROTO_MIFARE_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) * It seems that pn544 is inverting key and UID for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) * MIFARE authentication commands.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) if (skb->len == MIFARE_CMD_LEN &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) (skb->data[0] == MIFARE_CMD_AUTH_KEY_A ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) skb->data[0] == MIFARE_CMD_AUTH_KEY_B)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) u8 uid[MIFARE_UID_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) u8 *data = skb->data + MIFARE_CMD_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) memcpy(uid, data + MIFARE_KEY_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) MIFARE_UID_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) memmove(data + MIFARE_UID_LEN, data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) MIFARE_KEY_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) memcpy(data, uid, MIFARE_UID_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) return nfc_hci_send_cmd_async(hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) target->hci_reader_gate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) PN544_MIFARE_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) skb->data, skb->len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) cb, cb_context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) case PN544_RF_READER_F_GATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) *(u8 *)skb_push(skb, 1) = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) *(u8 *)skb_push(skb, 1) = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) info->async_cb_type = PN544_CB_TYPE_READER_F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) info->async_cb = cb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) info->async_cb_context = cb_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) return nfc_hci_send_cmd_async(hdev, target->hci_reader_gate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) PN544_FELICA_RAW, skb->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) skb->len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) pn544_hci_data_exchange_cb, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) case PN544_RF_READER_JEWEL_GATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) return nfc_hci_send_cmd_async(hdev, target->hci_reader_gate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) PN544_JEWEL_RAW_CMD, skb->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) skb->len, cb, cb_context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) case PN544_RF_READER_NFCIP1_INITIATOR_GATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) *(u8 *)skb_push(skb, 1) = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) return nfc_hci_send_event(hdev, target->hci_reader_gate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) PN544_HCI_EVT_SND_DATA, skb->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) skb->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) static int pn544_hci_tm_send(struct nfc_hci_dev *hdev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) /* Set default false for multiple information chaining */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) *(u8 *)skb_push(skb, 1) = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) r = nfc_hci_send_event(hdev, PN544_RF_READER_NFCIP1_TARGET_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) PN544_HCI_EVT_SND_DATA, skb->data, skb->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) static int pn544_hci_check_presence(struct nfc_hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) struct nfc_target *target)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) pr_debug("supported protocol %d\n", target->supported_protocols);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) if (target->supported_protocols & (NFC_PROTO_ISO14443_MASK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) NFC_PROTO_ISO14443_B_MASK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) return nfc_hci_send_cmd(hdev, target->hci_reader_gate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) PN544_RF_READER_CMD_PRESENCE_CHECK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) NULL, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) } else if (target->supported_protocols & NFC_PROTO_MIFARE_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) if (target->nfcid1_len != 4 && target->nfcid1_len != 7 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) target->nfcid1_len != 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) return nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) PN544_RF_READER_CMD_ACTIVATE_NEXT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) target->nfcid1, target->nfcid1_len, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) } else if (target->supported_protocols & (NFC_PROTO_JEWEL_MASK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) NFC_PROTO_FELICA_MASK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) } else if (target->supported_protocols & NFC_PROTO_NFC_DEP_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) return nfc_hci_send_cmd(hdev, target->hci_reader_gate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) PN544_HCI_CMD_ATTREQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) NULL, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) * <= 0: driver handled the event, skb consumed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) * 1: driver does not handle the event, please do standard processing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) static int pn544_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) struct sk_buff *rgb_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) u8 gate = hdev->pipes[pipe].gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) pr_debug("hci event %d\n", event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) case PN544_HCI_EVT_ACTIVATED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) if (gate == PN544_RF_READER_NFCIP1_INITIATOR_GATE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) r = nfc_hci_target_discovered(hdev, gate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) } else if (gate == PN544_RF_READER_NFCIP1_TARGET_GATE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) r = nfc_hci_get_param(hdev, gate, PN544_DEP_ATR_REQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) &rgb_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) r = nfc_tm_activated(hdev->ndev, NFC_PROTO_NFC_DEP_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) NFC_COMM_PASSIVE, rgb_skb->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) rgb_skb->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) kfree_skb(rgb_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) r = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) case PN544_HCI_EVT_DEACTIVATED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) r = nfc_hci_send_event(hdev, gate, NFC_HCI_EVT_END_OPERATION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) case PN544_HCI_EVT_RCV_DATA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) if (skb->len < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) r = -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) if (skb->data[0] != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) pr_debug("data0 %d\n", skb->data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) r = -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) skb_pull(skb, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) return nfc_tm_data_received(hdev->ndev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) static int pn544_hci_fw_download(struct nfc_hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) const char *firmware_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) struct pn544_hci_info *info = nfc_hci_get_clientdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) if (info->fw_download == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) return -ENOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) return info->fw_download(info->phy_id, firmware_name, hdev->sw_romlib);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) static int pn544_hci_discover_se(struct nfc_hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) u32 se_idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) u8 ese_mode = 0x01; /* Default mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) struct sk_buff *res_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) r = nfc_hci_send_cmd(hdev, PN544_SYS_MGMT_GATE, PN544_TEST_SWP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) NULL, 0, &res_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) if (r == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) if (res_skb->len == 2 && res_skb->data[0] == 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) nfc_add_se(hdev->ndev, se_idx++, NFC_SE_UICC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) kfree_skb(res_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) r = nfc_hci_send_event(hdev, PN544_NFC_WI_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) PN544_HCI_EVT_SWITCH_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) &ese_mode, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) if (r == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) nfc_add_se(hdev->ndev, se_idx++, NFC_SE_EMBEDDED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) return !se_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) #define PN544_SE_MODE_OFF 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) #define PN544_SE_MODE_ON 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) static int pn544_hci_enable_se(struct nfc_hci_dev *hdev, u32 se_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) struct nfc_se *se;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) u8 enable = PN544_SE_MODE_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) static struct uicc_gatelist {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) u8 head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) u8 adr[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) u8 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) } uicc_gatelist[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) {0x00, {0x9e, 0xd9}, 0x23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) {0x00, {0x9e, 0xda}, 0x21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) {0x00, {0x9e, 0xdb}, 0x22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) {0x00, {0x9e, 0xdc}, 0x24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) struct uicc_gatelist *p = uicc_gatelist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) int count = ARRAY_SIZE(uicc_gatelist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) struct sk_buff *res_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) se = nfc_find_se(hdev->ndev, se_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) switch (se->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) case NFC_SE_UICC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) while (count--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) r = nfc_hci_send_cmd(hdev, PN544_SYS_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) PN544_WRITE, (u8 *)p, 4, &res_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) if (r < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) if (res_skb->len != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) kfree_skb(res_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) if (res_skb->data[0] != p->value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) kfree_skb(res_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) kfree_skb(res_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) return nfc_hci_set_param(hdev, PN544_SWP_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) PN544_SWP_DEFAULT_MODE, &enable, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) case NFC_SE_EMBEDDED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) return nfc_hci_set_param(hdev, PN544_NFC_WI_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) PN544_NFC_ESE_DEFAULT_MODE, &enable, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) static int pn544_hci_disable_se(struct nfc_hci_dev *hdev, u32 se_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) struct nfc_se *se;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) u8 disable = PN544_SE_MODE_OFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) se = nfc_find_se(hdev->ndev, se_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) switch (se->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) case NFC_SE_UICC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) return nfc_hci_set_param(hdev, PN544_SWP_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) PN544_SWP_DEFAULT_MODE, &disable, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) case NFC_SE_EMBEDDED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) return nfc_hci_set_param(hdev, PN544_NFC_WI_MGMT_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) PN544_NFC_ESE_DEFAULT_MODE, &disable, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) static struct nfc_hci_ops pn544_hci_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) .open = pn544_hci_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) .close = pn544_hci_close,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) .hci_ready = pn544_hci_ready,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) .xmit = pn544_hci_xmit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) .start_poll = pn544_hci_start_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) .dep_link_up = pn544_hci_dep_link_up,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) .dep_link_down = pn544_hci_dep_link_down,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) .target_from_gate = pn544_hci_target_from_gate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) .complete_target_discovered = pn544_hci_complete_target_discovered,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) .im_transceive = pn544_hci_im_transceive,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) .tm_send = pn544_hci_tm_send,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) .check_presence = pn544_hci_check_presence,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) .event_received = pn544_hci_event_received,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) .fw_download = pn544_hci_fw_download,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) .discover_se = pn544_hci_discover_se,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) .enable_se = pn544_hci_enable_se,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) .disable_se = pn544_hci_disable_se,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) int pn544_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops, char *llc_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) int phy_headroom, int phy_tailroom, int phy_payload,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) fw_download_t fw_download, struct nfc_hci_dev **hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) struct pn544_hci_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) u32 protocols;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) struct nfc_hci_init_data init_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) info = kzalloc(sizeof(struct pn544_hci_info), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) if (!info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) r = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) goto err_info_alloc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) info->phy_ops = phy_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) info->phy_id = phy_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) info->fw_download = fw_download;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) info->state = PN544_ST_COLD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) mutex_init(&info->info_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) init_data.gate_count = ARRAY_SIZE(pn544_gates);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) memcpy(init_data.gates, pn544_gates, sizeof(pn544_gates));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) * TODO: Session id must include the driver name + some bus addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) * persistent info to discriminate 2 identical chips
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) strcpy(init_data.session_id, "ID544HCI");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) protocols = NFC_PROTO_JEWEL_MASK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) NFC_PROTO_MIFARE_MASK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) NFC_PROTO_FELICA_MASK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) NFC_PROTO_ISO14443_MASK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) NFC_PROTO_ISO14443_B_MASK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) NFC_PROTO_NFC_DEP_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) info->hdev = nfc_hci_allocate_device(&pn544_hci_ops, &init_data, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) protocols, llc_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) phy_headroom + PN544_CMDS_HEADROOM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) phy_tailroom, phy_payload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) if (!info->hdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) pr_err("Cannot allocate nfc hdev\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) r = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) goto err_alloc_hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) nfc_hci_set_clientdata(info->hdev, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) r = nfc_hci_register_device(info->hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) goto err_regdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) *hdev = info->hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) err_regdev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) nfc_hci_free_device(info->hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) err_alloc_hdev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) kfree(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) err_info_alloc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) EXPORT_SYMBOL(pn544_hci_probe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) void pn544_hci_remove(struct nfc_hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) struct pn544_hci_info *info = nfc_hci_get_clientdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) nfc_hci_unregister_device(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) nfc_hci_free_device(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) kfree(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) EXPORT_SYMBOL(pn544_hci_remove);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) MODULE_DESCRIPTION(DRIVER_DESC);