in st-nci/se.c [522:592]
static int st_nci_hci_network_init(struct nci_dev *ndev)
{
struct st_nci_info *info = nci_get_drvdata(ndev);
struct core_conn_create_dest_spec_params *dest_params;
struct dest_spec_params spec_params;
struct nci_conn_info *conn_info;
int r, dev_num;
dest_params =
kzalloc(sizeof(struct core_conn_create_dest_spec_params) +
sizeof(struct dest_spec_params), GFP_KERNEL);
if (dest_params == NULL)
return -ENOMEM;
dest_params->type = NCI_DESTINATION_SPECIFIC_PARAM_NFCEE_TYPE;
dest_params->length = sizeof(struct dest_spec_params);
spec_params.id = ndev->hci_dev->nfcee_id;
spec_params.protocol = NCI_NFCEE_INTERFACE_HCI_ACCESS;
memcpy(dest_params->value, &spec_params,
sizeof(struct dest_spec_params));
r = nci_core_conn_create(ndev, NCI_DESTINATION_NFCEE, 1,
sizeof(struct core_conn_create_dest_spec_params) +
sizeof(struct dest_spec_params),
dest_params);
if (r != NCI_STATUS_OK)
goto free_dest_params;
conn_info = ndev->hci_dev->conn_info;
if (!conn_info)
goto free_dest_params;
ndev->hci_dev->init_data.gate_count = ARRAY_SIZE(st_nci_gates);
memcpy(ndev->hci_dev->init_data.gates, st_nci_gates,
sizeof(st_nci_gates));
/*
* Session id must include the driver name + i2c bus addr
* persistent info to discriminate 2 identical chips
*/
dev_num = find_first_zero_bit(dev_mask, ST_NCI_NUM_DEVICES);
if (dev_num >= ST_NCI_NUM_DEVICES) {
r = -ENODEV;
goto free_dest_params;
}
scnprintf(ndev->hci_dev->init_data.session_id,
sizeof(ndev->hci_dev->init_data.session_id),
"%s%2x", "ST21BH", dev_num);
r = nci_hci_dev_session_init(ndev);
if (r != NCI_HCI_ANY_OK)
goto free_dest_params;
/*
* In factory mode, we prevent secure elements activation
* by disabling nfcee on the current HCI connection id.
* HCI will be used here only for proprietary commands.
*/
if (test_bit(ST_NCI_FACTORY_MODE, &info->flags))
r = nci_nfcee_mode_set(ndev,
ndev->hci_dev->conn_info->dest_params->id,
NCI_NFCEE_DISABLE);
else
r = nci_nfcee_mode_set(ndev,
ndev->hci_dev->conn_info->dest_params->id,
NCI_NFCEE_ENABLE);
free_dest_params:
kfree(dest_params);
return r;
}