diff options
author | Arron Wang <arron.wang@intel.com> | 2012-09-27 05:32:58 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-10-26 12:26:46 -0400 |
commit | e81076235b46189a776362ec5e4c6626bf1599ff (patch) | |
tree | f1623677ef0202907a94ef32ee52b928b9aa36f8 /drivers/nfc | |
parent | c40d17401f89f575a6ff5774abaa0838398b820c (diff) |
NFC: Implement HCI DEP send and receive data
And implement the corresponding hooks for pn544.
Signed-off-by: Arron Wang <arron.wang@intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/nfc')
-rw-r--r-- | drivers/nfc/pn544_hci.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/drivers/nfc/pn544_hci.c b/drivers/nfc/pn544_hci.c index 4ed2b8356017..554faf0a92d7 100644 --- a/drivers/nfc/pn544_hci.c +++ b/drivers/nfc/pn544_hci.c | |||
@@ -900,7 +900,7 @@ static void pn544_hci_data_exchange_cb(void *context, struct sk_buff *skb, | |||
900 | * <= 0: driver handled the data exchange | 900 | * <= 0: driver handled the data exchange |
901 | * 1: driver doesn't especially handle, please do standard processing | 901 | * 1: driver doesn't especially handle, please do standard processing |
902 | */ | 902 | */ |
903 | static int pn544_hci_data_exchange(struct nfc_hci_dev *hdev, | 903 | static int pn544_hci_im_transceive(struct nfc_hci_dev *hdev, |
904 | struct nfc_target *target, | 904 | struct nfc_target *target, |
905 | struct sk_buff *skb, data_exchange_cb_t cb, | 905 | struct sk_buff *skb, data_exchange_cb_t cb, |
906 | void *cb_context) | 906 | void *cb_context) |
@@ -953,11 +953,26 @@ static int pn544_hci_data_exchange(struct nfc_hci_dev *hdev, | |||
953 | return nfc_hci_send_cmd_async(hdev, target->hci_reader_gate, | 953 | return nfc_hci_send_cmd_async(hdev, target->hci_reader_gate, |
954 | PN544_JEWEL_RAW_CMD, skb->data, | 954 | PN544_JEWEL_RAW_CMD, skb->data, |
955 | skb->len, cb, cb_context); | 955 | skb->len, cb, cb_context); |
956 | case PN544_RF_READER_NFCIP1_INITIATOR_GATE: | ||
957 | *skb_push(skb, 1) = 0; | ||
958 | |||
959 | return nfc_hci_send_event(hdev, target->hci_reader_gate, | ||
960 | PN544_HCI_EVT_SND_DATA, skb->data, | ||
961 | skb->len); | ||
956 | default: | 962 | default: |
957 | return 1; | 963 | return 1; |
958 | } | 964 | } |
959 | } | 965 | } |
960 | 966 | ||
967 | static int pn544_hci_tm_send(struct nfc_hci_dev *hdev, struct sk_buff *skb) | ||
968 | { | ||
969 | /* Set default false for multiple information chaining */ | ||
970 | *skb_push(skb, 1) = 0; | ||
971 | |||
972 | return nfc_hci_send_event(hdev, PN544_RF_READER_NFCIP1_TARGET_GATE, | ||
973 | PN544_HCI_EVT_SND_DATA, skb->data, skb->len); | ||
974 | } | ||
975 | |||
961 | static int pn544_hci_check_presence(struct nfc_hci_dev *hdev, | 976 | static int pn544_hci_check_presence(struct nfc_hci_dev *hdev, |
962 | struct nfc_target *target) | 977 | struct nfc_target *target) |
963 | { | 978 | { |
@@ -996,6 +1011,22 @@ void pn544_hci_event_received(struct nfc_hci_dev *hdev, u8 gate, u8 event, | |||
996 | nfc_hci_send_event(hdev, gate, | 1011 | nfc_hci_send_event(hdev, gate, |
997 | NFC_HCI_EVT_END_OPERATION, NULL, 0); | 1012 | NFC_HCI_EVT_END_OPERATION, NULL, 0); |
998 | break; | 1013 | break; |
1014 | case PN544_HCI_EVT_RCV_DATA: | ||
1015 | if (skb->len < 2) { | ||
1016 | r = -EPROTO; | ||
1017 | goto exit; | ||
1018 | } | ||
1019 | |||
1020 | if (skb->data[0] != 0) { | ||
1021 | pr_debug("data0 %d", skb->data[0]); | ||
1022 | r = -EPROTO; | ||
1023 | goto exit; | ||
1024 | } | ||
1025 | |||
1026 | skb_pull(skb, 2); | ||
1027 | nfc_tm_data_received(hdev->ndev, skb); | ||
1028 | |||
1029 | return; | ||
999 | default: | 1030 | default: |
1000 | break; | 1031 | break; |
1001 | } | 1032 | } |
@@ -1014,7 +1045,8 @@ static struct nfc_hci_ops pn544_hci_ops = { | |||
1014 | .dep_link_down = pn544_hci_dep_link_down, | 1045 | .dep_link_down = pn544_hci_dep_link_down, |
1015 | .target_from_gate = pn544_hci_target_from_gate, | 1046 | .target_from_gate = pn544_hci_target_from_gate, |
1016 | .complete_target_discovered = pn544_hci_complete_target_discovered, | 1047 | .complete_target_discovered = pn544_hci_complete_target_discovered, |
1017 | .data_exchange = pn544_hci_data_exchange, | 1048 | .im_transceive = pn544_hci_im_transceive, |
1049 | .tm_send = pn544_hci_tm_send, | ||
1018 | .check_presence = pn544_hci_check_presence, | 1050 | .check_presence = pn544_hci_check_presence, |
1019 | .event_received = pn544_hci_event_received, | 1051 | .event_received = pn544_hci_event_received, |
1020 | }; | 1052 | }; |