• Home
  • Raw
  • Download

Lines Matching +full:ese +full:- +full:present

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2014-2015 STMicroelectronics SAS. All rights reserved.
14 #include "st-nci.h"
45 #define ST_NCI_EVT_HOT_PLUG_IS_INHIBITED(x) (x->data[0] & 0x80)
85 /* If TA is present bit 0 is set */
87 /* If TB is present bit 1 is set */
121 td = ST_NCI_ATR_GET_Y_FROM_TD(info->se_info.atr[i]); in st_nci_se_get_bwi()
126 return info->se_info.atr[i] >> 4; in st_nci_se_get_bwi()
143 if (skb->len <= ST_NCI_ESE_MAX_LENGTH) { in st_nci_se_get_atr()
144 memcpy(info->se_info.atr, skb->data, skb->len); in st_nci_se_get_atr()
146 info->se_info.wt_timeout = in st_nci_se_get_atr()
165 * - It does useless EEPROM cycling in st_nci_hci_load_session()
166 * - It might cause issue for secure elements support in st_nci_hci_load_session()
169 * - get a pipe list for each host. in st_nci_hci_load_session()
171 * (TODO Later on UICC HOST and eSE HOST) in st_nci_hci_load_session()
172 * - get pipe information in st_nci_hci_load_session()
173 * - match retrieved pipe list in st_nci_gates in st_nci_hci_load_session()
192 for (i = 0; i < skb_pipe_list->len; i++) { in st_nci_hci_load_session()
193 pipe_info[2] = skb_pipe_list->data[i]; in st_nci_hci_load_session()
204 * - pipe state (1byte) in st_nci_hci_load_session()
205 * - source hid (1byte) in st_nci_hci_load_session()
206 * - source gid (1byte) in st_nci_hci_load_session()
207 * - destination hid (1byte) in st_nci_hci_load_session()
208 * - destination gid (1byte) in st_nci_hci_load_session()
210 dm_pipe_info = (struct st_nci_pipe_info *)skb_pipe_info->data; in st_nci_hci_load_session()
211 if (dm_pipe_info->dst_gate_id == ST_NCI_APDU_READER_GATE && in st_nci_hci_load_session()
212 dm_pipe_info->src_host_id == ST_NCI_UICC_HOST_ID) { in st_nci_hci_load_session()
214 dm_pipe_info->src_host_id); in st_nci_hci_load_session()
220 (st_nci_gates[j].gate != dm_pipe_info->dst_gate_id); j++) in st_nci_hci_load_session()
224 st_nci_gates[j].gate == dm_pipe_info->dst_gate_id && in st_nci_hci_load_session()
225 ST_NCI_DM_IS_PIPE_OPEN(dm_pipe_info->pipe_state)) { in st_nci_hci_load_session()
226 ndev->hci_dev->init_data.gates[j].pipe = pipe_info[2]; in st_nci_hci_load_session()
228 ndev->hci_dev->gate2pipe[st_nci_gates[j].gate] = in st_nci_hci_load_session()
230 ndev->hci_dev->pipes[pipe_info[2]].gate = in st_nci_hci_load_session()
232 ndev->hci_dev->pipes[pipe_info[2]].host = in st_nci_hci_load_session()
233 dm_pipe_info->src_host_id; in st_nci_hci_load_session()
258 if (info->se_info.se_active) { in st_nci_hci_admin_event_received()
260 del_timer_sync(&info->se_info.se_active_timer); in st_nci_hci_admin_event_received()
261 info->se_info.se_active = false; in st_nci_hci_admin_event_received()
262 complete(&info->se_info.req_completion); in st_nci_hci_admin_event_received()
264 mod_timer(&info->se_info.se_active_timer, in st_nci_hci_admin_event_received()
271 nfc_err(&ndev->nfc_dev->dev, "Unexpected event on admin gate\n"); in st_nci_hci_admin_event_received()
286 del_timer_sync(&info->se_info.bwi_timer); in st_nci_hci_apdu_reader_event_received()
287 info->se_info.bwi_active = false; in st_nci_hci_apdu_reader_event_received()
288 info->se_info.cb(info->se_info.cb_context, in st_nci_hci_apdu_reader_event_received()
289 skb->data, skb->len, 0); in st_nci_hci_apdu_reader_event_received()
292 mod_timer(&info->se_info.bwi_timer, jiffies + in st_nci_hci_apdu_reader_event_received()
293 msecs_to_jiffies(info->se_info.wt_timeout)); in st_nci_hci_apdu_reader_event_received()
296 nfc_err(&ndev->nfc_dev->dev, "Unexpected event on apdu reader gate\n"); in st_nci_hci_apdu_reader_event_received()
314 struct device *dev = &ndev->nfc_dev->dev; in st_nci_hci_connectivity_event_received()
321 r = nfc_se_connectivity(ndev->nfc_dev, host); in st_nci_hci_connectivity_event_received()
330 if (skb->len < NFC_MIN_AID_LENGTH + 2 || in st_nci_hci_connectivity_event_received()
331 skb->data[0] != NFC_EVT_TRANSACTION_AID_TAG) in st_nci_hci_connectivity_event_received()
332 return -EPROTO; in st_nci_hci_connectivity_event_received()
334 transaction = devm_kzalloc(dev, skb->len - 2, GFP_KERNEL); in st_nci_hci_connectivity_event_received()
336 return -ENOMEM; in st_nci_hci_connectivity_event_received()
338 transaction->aid_len = skb->data[1]; in st_nci_hci_connectivity_event_received()
339 memcpy(transaction->aid, &skb->data[2], transaction->aid_len); in st_nci_hci_connectivity_event_received()
342 if (skb->data[transaction->aid_len + 2] != in st_nci_hci_connectivity_event_received()
345 return -EPROTO; in st_nci_hci_connectivity_event_received()
348 transaction->params_len = skb->data[transaction->aid_len + 3]; in st_nci_hci_connectivity_event_received()
349 memcpy(transaction->params, skb->data + in st_nci_hci_connectivity_event_received()
350 transaction->aid_len + 4, transaction->params_len); in st_nci_hci_connectivity_event_received()
352 r = nfc_se_transaction(ndev->nfc_dev, host, transaction); in st_nci_hci_connectivity_event_received()
355 nfc_err(&ndev->nfc_dev->dev, "Unexpected event on connectivity gate\n"); in st_nci_hci_connectivity_event_received()
365 u8 gate = ndev->hci_dev->pipes[pipe].gate; in st_nci_hci_event_received()
366 u8 host = ndev->hci_dev->pipes[pipe].host; in st_nci_hci_event_received()
386 u8 gate = ndev->hci_dev->pipes[pipe].gate; in st_nci_hci_cmd_received()
393 ndev->hci_dev->pipes[pipe].host != ST_NCI_UICC_HOST_ID) in st_nci_hci_cmd_received()
394 ndev->hci_dev->count_pipes++; in st_nci_hci_cmd_received()
396 if (ndev->hci_dev->count_pipes == in st_nci_hci_cmd_received()
397 ndev->hci_dev->expected_pipes) { in st_nci_hci_cmd_received()
398 del_timer_sync(&info->se_info.se_active_timer); in st_nci_hci_cmd_received()
399 info->se_info.se_active = false; in st_nci_hci_cmd_received()
400 ndev->hci_dev->count_pipes = 0; in st_nci_hci_cmd_received()
401 complete(&info->se_info.req_completion); in st_nci_hci_cmd_received()
418 ndev->hci_dev->count_pipes = 0; in st_nci_control_se()
419 ndev->hci_dev->expected_pipes = ST_NCI_SE_COUNT_PIPE_UICC; in st_nci_control_se()
422 ndev->hci_dev->count_pipes = 0; in st_nci_control_se()
423 ndev->hci_dev->expected_pipes = ST_NCI_SE_COUNT_PIPE_EMBEDDED; in st_nci_control_se()
426 return -EINVAL; in st_nci_control_se()
433 reinit_completion(&info->se_info.req_completion); in st_nci_control_se()
438 mod_timer(&info->se_info.se_active_timer, jiffies + in st_nci_control_se()
440 info->se_info.se_active = true; in st_nci_control_se()
443 wait_for_completion_interruptible(&info->se_info.req_completion); in st_nci_control_se()
450 if (info->se_info.se_status->is_ese_present && in st_nci_control_se()
451 info->se_info.se_status->is_uicc_present) in st_nci_control_se()
459 for (i = 0; i < sk_host_list->len && in st_nci_control_se()
460 sk_host_list->data[i] != se_idx; i++) in st_nci_control_se()
462 host_id = sk_host_list->data[i]; in st_nci_control_se()
469 return -1; in st_nci_control_se()
480 * info->se_info.se_status->is_uicc_enable is true should never happen in st_nci_disable_se()
481 * Same for eSE. in st_nci_disable_se()
506 * info->se_info.se_status->is_uicc_enable is true should never happen. in st_nci_enable_se()
507 * Same for eSE. in st_nci_enable_se()
521 nfc_remove_se(ndev->nfc_dev, se_idx); in st_nci_enable_se()
541 r = -ENOMEM; in st_nci_hci_network_init()
545 dest_params->type = NCI_DESTINATION_SPECIFIC_PARAM_NFCEE_TYPE; in st_nci_hci_network_init()
546 dest_params->length = sizeof(struct dest_spec_params); in st_nci_hci_network_init()
547 spec_params.id = ndev->hci_dev->nfcee_id; in st_nci_hci_network_init()
549 memcpy(dest_params->value, &spec_params, in st_nci_hci_network_init()
558 conn_info = ndev->hci_dev->conn_info; in st_nci_hci_network_init()
562 ndev->hci_dev->init_data.gate_count = ARRAY_SIZE(st_nci_gates); in st_nci_hci_network_init()
563 memcpy(ndev->hci_dev->init_data.gates, st_nci_gates, in st_nci_hci_network_init()
572 r = -ENODEV; in st_nci_hci_network_init()
576 scnprintf(ndev->hci_dev->init_data.session_id, in st_nci_hci_network_init()
577 sizeof(ndev->hci_dev->init_data.session_id), in st_nci_hci_network_init()
589 if (test_bit(ST_NCI_FACTORY_MODE, &info->flags)) in st_nci_hci_network_init()
591 ndev->hci_dev->conn_info->dest_params->id, in st_nci_hci_network_init()
595 ndev->hci_dev->conn_info->dest_params->id, in st_nci_hci_network_init()
618 if (test_bit(ST_NCI_FACTORY_MODE, &info->flags)) in st_nci_discover_se()
621 if (info->se_info.se_status->is_uicc_present) in st_nci_discover_se()
623 if (info->se_info.se_status->is_ese_present) in st_nci_discover_se()
634 if (info->se_info.se_status->is_uicc_present) { in st_nci_discover_se()
635 nfc_add_se(ndev->nfc_dev, ST_NCI_UICC_HOST_ID, NFC_SE_UICC); in st_nci_discover_se()
639 if (info->se_info.se_status->is_ese_present) { in st_nci_discover_se()
640 nfc_add_se(ndev->nfc_dev, ST_NCI_ESE_HOST_ID, NFC_SE_EMBEDDED); in st_nci_discover_se()
658 info->se_info.cb = cb; in st_nci_se_io()
659 info->se_info.cb_context = cb_context; in st_nci_se_io()
660 mod_timer(&info->se_info.bwi_timer, jiffies + in st_nci_se_io()
661 msecs_to_jiffies(info->se_info.wt_timeout)); in st_nci_se_io()
662 info->se_info.bwi_active = true; in st_nci_se_io()
673 return -ENODEV; in st_nci_se_io()
695 info->se_info.bwi_active = false; in st_nci_se_wt_timeout()
697 if (!info->se_info.xch_error) { in st_nci_se_wt_timeout()
698 info->se_info.xch_error = true; in st_nci_se_wt_timeout()
699 nci_hci_send_event(info->ndlc->ndev, ST_NCI_APDU_READER_GATE, in st_nci_se_wt_timeout()
702 info->se_info.xch_error = false; in st_nci_se_wt_timeout()
703 nci_hci_send_event(info->ndlc->ndev, ST_NCI_DEVICE_MGNT_GATE, in st_nci_se_wt_timeout()
706 info->se_info.cb(info->se_info.cb_context, NULL, 0, -ETIME); in st_nci_se_wt_timeout()
716 info->se_info.se_active = false; in st_nci_se_activation_timeout()
718 complete(&info->se_info.req_completion); in st_nci_se_activation_timeout()
725 init_completion(&info->se_info.req_completion); in st_nci_se_init()
727 timer_setup(&info->se_info.bwi_timer, st_nci_se_wt_timeout, 0); in st_nci_se_init()
728 info->se_info.bwi_active = false; in st_nci_se_init()
730 timer_setup(&info->se_info.se_active_timer, in st_nci_se_init()
732 info->se_info.se_active = false; in st_nci_se_init()
734 info->se_info.xch_error = false; in st_nci_se_init()
736 info->se_info.wt_timeout = in st_nci_se_init()
739 info->se_info.se_status = se_status; in st_nci_se_init()
749 if (info->se_info.bwi_active) in st_nci_se_deinit()
750 del_timer_sync(&info->se_info.bwi_timer); in st_nci_se_deinit()
751 if (info->se_info.se_active) in st_nci_se_deinit()
752 del_timer_sync(&info->se_info.se_active_timer); in st_nci_se_deinit()
754 info->se_info.se_active = false; in st_nci_se_deinit()
755 info->se_info.bwi_active = false; in st_nci_se_deinit()