static int st_nci_hci_dm_get_data(struct nfc_dev *dev, void *data, size_t data_len) { int r; struct sk_buff *msg, *skb; struct nci_dev *ndev = nfc_get_drvdata(dev); r = nci_hci_send_cmd(ndev, ST_NCI_DEVICE_MGNT_GATE, ST_NCI_HCI_DM_GETDATA, data, data_len, &skb); if (r) goto exit; msg = nfc_vendor_cmd_alloc_reply_skb(dev, ST_NCI_VENDOR_OUI, HCI_DM_GET_DATA, skb->len); if (!msg) { r = -ENOMEM; goto free_skb; } if (nla_put(msg, NFC_ATTR_VENDOR_DATA, skb->len, skb->data)) { kfree_skb(msg); r = -ENOBUFS; goto free_skb; } r = nfc_vendor_cmd_reply(msg); free_skb: kfree_skb(skb); exit: return r; }
static int st_nci_hci_dm_update_aid(struct nfc_dev *dev, void *data, size_t data_len) { struct nci_dev *ndev = nfc_get_drvdata(dev); return nci_hci_send_cmd(ndev, ST_NCI_DEVICE_MGNT_GATE, ST_NCI_HCI_DM_UPDATE_AID, data, data_len, NULL); }
static int st_nci_hci_dm_field_generator(struct nfc_dev *dev, void *data, size_t data_len) { struct nci_dev *ndev = nfc_get_drvdata(dev); return nci_hci_send_cmd(ndev, ST_NCI_DEVICE_MGNT_GATE, ST_NCI_HCI_DM_FIELD_GENERATOR, data, data_len, NULL); }
static int st_nci_hci_dm_fwupd_end(struct nfc_dev *dev, void *data, size_t data_len) { struct nci_dev *ndev = nfc_get_drvdata(dev); return nci_hci_send_cmd(ndev, ST_NCI_DEVICE_MGNT_GATE, ST_NCI_HCI_DM_FWUPD_STOP, data, data_len, NULL); }
static int st_nci_hci_dm_reset(struct nfc_dev *dev, void *data, size_t data_len) { struct nci_dev *ndev = nfc_get_drvdata(dev); nci_hci_send_cmd(ndev, ST_NCI_DEVICE_MGNT_GATE, ST_NCI_HCI_DM_RESET, data, data_len, NULL); msleep(200); return 0; }
static int st_nci_hci_dm_direct_load(struct nfc_dev *dev, void *data, size_t data_len) { struct nci_dev *ndev = nfc_get_drvdata(dev); if (dev->fw_download_in_progress) { dev->fw_download_in_progress = false; return nci_hci_send_cmd(ndev, ST_NCI_DEVICE_MGNT_GATE, ST_NCI_HCI_DM_LOAD, data, data_len, NULL); } return -EPROTO; }
int nci_hci_clear_all_pipes(struct nci_dev *ndev) { int r; r = nci_hci_send_cmd(ndev, NCI_HCI_ADMIN_GATE, NCI_HCI_ADM_CLEAR_ALL_PIPE, NULL, 0, NULL); if (r < 0) return r; nci_hci_reset_pipes(ndev->hci_dev); return r; }
static int st_nci_hci_dm_fwupd_start(struct nfc_dev *dev, void *data, size_t data_len) { int r; struct nci_dev *ndev = nfc_get_drvdata(dev); dev->fw_download_in_progress = true; r = nci_hci_send_cmd(ndev, ST_NCI_DEVICE_MGNT_GATE, ST_NCI_HCI_DM_FWUPD_START, data, data_len, NULL); if (r) dev->fw_download_in_progress = false; return r; }