mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-24 07:31:41 +00:00
NFC: Implement HCI DEP link up and down
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>
This commit is contained in:
parent
928326f223
commit
c40d17401f
3 changed files with 66 additions and 0 deletions
|
@ -746,6 +746,43 @@ static int pn544_hci_start_poll(struct nfc_hci_dev *hdev,
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pn544_hci_dep_link_up(struct nfc_hci_dev *hdev,
|
||||||
|
struct nfc_target *target, u8 comm_mode,
|
||||||
|
u8 *gb, size_t gb_len)
|
||||||
|
{
|
||||||
|
struct sk_buff *rgb_skb = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
r = nfc_hci_get_param(hdev, target->hci_reader_gate,
|
||||||
|
PN544_DEP_ATR_RES, &rgb_skb);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
if (rgb_skb->len == 0 || rgb_skb->len > NFC_GB_MAXSIZE) {
|
||||||
|
r = -EPROTO;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
print_hex_dump(KERN_DEBUG, "remote gb: ", DUMP_PREFIX_OFFSET,
|
||||||
|
16, 1, rgb_skb->data, rgb_skb->len, true);
|
||||||
|
|
||||||
|
r = nfc_set_remote_general_bytes(hdev->ndev, rgb_skb->data,
|
||||||
|
rgb_skb->len);
|
||||||
|
|
||||||
|
if (r == 0)
|
||||||
|
r = nfc_dep_link_is_up(hdev->ndev, target->idx, comm_mode,
|
||||||
|
NFC_RF_INITIATOR);
|
||||||
|
exit:
|
||||||
|
kfree_skb(rgb_skb);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pn544_hci_dep_link_down(struct nfc_hci_dev *hdev)
|
||||||
|
{
|
||||||
|
|
||||||
|
return nfc_hci_send_event(hdev, PN544_RF_READER_NFCIP1_INITIATOR_GATE,
|
||||||
|
NFC_HCI_EVT_END_OPERATION, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static int pn544_hci_target_from_gate(struct nfc_hci_dev *hdev, u8 gate,
|
static int pn544_hci_target_from_gate(struct nfc_hci_dev *hdev, u8 gate,
|
||||||
struct nfc_target *target)
|
struct nfc_target *target)
|
||||||
{
|
{
|
||||||
|
@ -973,6 +1010,8 @@ static struct nfc_hci_ops pn544_hci_ops = {
|
||||||
.hci_ready = pn544_hci_ready,
|
.hci_ready = pn544_hci_ready,
|
||||||
.xmit = pn544_hci_xmit,
|
.xmit = pn544_hci_xmit,
|
||||||
.start_poll = pn544_hci_start_poll,
|
.start_poll = pn544_hci_start_poll,
|
||||||
|
.dep_link_up = pn544_hci_dep_link_up,
|
||||||
|
.dep_link_down = pn544_hci_dep_link_down,
|
||||||
.target_from_gate = pn544_hci_target_from_gate,
|
.target_from_gate = pn544_hci_target_from_gate,
|
||||||
.complete_target_discovered = pn544_hci_complete_target_discovered,
|
.complete_target_discovered = pn544_hci_complete_target_discovered,
|
||||||
.data_exchange = pn544_hci_data_exchange,
|
.data_exchange = pn544_hci_data_exchange,
|
||||||
|
|
|
@ -38,6 +38,9 @@ struct nfc_hci_ops {
|
||||||
int (*xmit) (struct nfc_hci_dev *hdev, struct sk_buff *skb);
|
int (*xmit) (struct nfc_hci_dev *hdev, struct sk_buff *skb);
|
||||||
int (*start_poll) (struct nfc_hci_dev *hdev,
|
int (*start_poll) (struct nfc_hci_dev *hdev,
|
||||||
u32 im_protocols, u32 tm_protocols);
|
u32 im_protocols, u32 tm_protocols);
|
||||||
|
int (*dep_link_up)(struct nfc_hci_dev *hdev, struct nfc_target *target,
|
||||||
|
u8 comm_mode, u8 *gb, size_t gb_len);
|
||||||
|
int (*dep_link_down)(struct nfc_hci_dev *hdev);
|
||||||
int (*target_from_gate) (struct nfc_hci_dev *hdev, u8 gate,
|
int (*target_from_gate) (struct nfc_hci_dev *hdev, u8 gate,
|
||||||
struct nfc_target *target);
|
struct nfc_target *target);
|
||||||
int (*complete_target_discovered) (struct nfc_hci_dev *hdev, u8 gate,
|
int (*complete_target_discovered) (struct nfc_hci_dev *hdev, u8 gate,
|
||||||
|
|
|
@ -546,6 +546,28 @@ static void hci_stop_poll(struct nfc_dev *nfc_dev)
|
||||||
NFC_HCI_EVT_END_OPERATION, NULL, 0);
|
NFC_HCI_EVT_END_OPERATION, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hci_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target,
|
||||||
|
__u8 comm_mode, __u8 *gb, size_t gb_len)
|
||||||
|
{
|
||||||
|
struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev);
|
||||||
|
|
||||||
|
if (hdev->ops->dep_link_up)
|
||||||
|
return hdev->ops->dep_link_up(hdev, target, comm_mode,
|
||||||
|
gb, gb_len);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int hci_dep_link_down(struct nfc_dev *nfc_dev)
|
||||||
|
{
|
||||||
|
struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev);
|
||||||
|
|
||||||
|
if (hdev->ops->dep_link_down)
|
||||||
|
return hdev->ops->dep_link_down(hdev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int hci_activate_target(struct nfc_dev *nfc_dev,
|
static int hci_activate_target(struct nfc_dev *nfc_dev,
|
||||||
struct nfc_target *target, u32 protocol)
|
struct nfc_target *target, u32 protocol)
|
||||||
{
|
{
|
||||||
|
@ -731,6 +753,8 @@ static struct nfc_ops hci_nfc_ops = {
|
||||||
.dev_down = hci_dev_down,
|
.dev_down = hci_dev_down,
|
||||||
.start_poll = hci_start_poll,
|
.start_poll = hci_start_poll,
|
||||||
.stop_poll = hci_stop_poll,
|
.stop_poll = hci_stop_poll,
|
||||||
|
.dep_link_up = hci_dep_link_up,
|
||||||
|
.dep_link_down = hci_dep_link_down,
|
||||||
.activate_target = hci_activate_target,
|
.activate_target = hci_activate_target,
|
||||||
.deactivate_target = hci_deactivate_target,
|
.deactivate_target = hci_deactivate_target,
|
||||||
.im_transceive = hci_transceive,
|
.im_transceive = hci_transceive,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue