提交 1676f751 编写于 作者: E Eric Lapuyade 提交者: John W. Linville

NFC: Add HCI/SHDLC support to let driver check for tag presence

Signed-off-by: NEric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: NSamuel Ortiz <sameo@linux.intel.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 d4ccb132
...@@ -39,6 +39,8 @@ struct nfc_hci_ops { ...@@ -39,6 +39,8 @@ struct nfc_hci_ops {
int (*data_exchange) (struct nfc_hci_dev *hdev, int (*data_exchange) (struct nfc_hci_dev *hdev,
struct nfc_target *target, struct nfc_target *target,
struct sk_buff *skb, struct sk_buff **res_skb); struct sk_buff *skb, struct sk_buff **res_skb);
int (*check_presence)(struct nfc_hci_dev *hdev,
struct nfc_target *target);
}; };
#define NFC_HCI_MAX_CUSTOM_GATES 15 #define NFC_HCI_MAX_CUSTOM_GATES 15
......
...@@ -35,6 +35,8 @@ struct nfc_shdlc_ops { ...@@ -35,6 +35,8 @@ struct nfc_shdlc_ops {
int (*data_exchange) (struct nfc_shdlc *shdlc, int (*data_exchange) (struct nfc_shdlc *shdlc,
struct nfc_target *target, struct nfc_target *target,
struct sk_buff *skb, struct sk_buff **res_skb); struct sk_buff *skb, struct sk_buff **res_skb);
int (*check_presence)(struct nfc_shdlc *shdlc,
struct nfc_target *target);
}; };
enum shdlc_state { enum shdlc_state {
......
...@@ -574,6 +574,17 @@ static int hci_data_exchange(struct nfc_dev *nfc_dev, struct nfc_target *target, ...@@ -574,6 +574,17 @@ static int hci_data_exchange(struct nfc_dev *nfc_dev, struct nfc_target *target,
return 0; return 0;
} }
static int hci_check_presence(struct nfc_dev *nfc_dev,
struct nfc_target *target)
{
struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev);
if (hdev->ops->check_presence)
return hdev->ops->check_presence(hdev, target);
return 0;
}
struct nfc_ops hci_nfc_ops = { struct nfc_ops hci_nfc_ops = {
.dev_up = hci_dev_up, .dev_up = hci_dev_up,
.dev_down = hci_dev_down, .dev_down = hci_dev_down,
...@@ -582,6 +593,7 @@ struct nfc_ops hci_nfc_ops = { ...@@ -582,6 +593,7 @@ struct nfc_ops hci_nfc_ops = {
.activate_target = hci_activate_target, .activate_target = hci_activate_target,
.deactivate_target = hci_deactivate_target, .deactivate_target = hci_deactivate_target,
.data_exchange = hci_data_exchange, .data_exchange = hci_data_exchange,
.check_presence = hci_check_presence,
}; };
struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops, struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops,
......
...@@ -816,6 +816,17 @@ static int nfc_shdlc_data_exchange(struct nfc_hci_dev *hdev, ...@@ -816,6 +816,17 @@ static int nfc_shdlc_data_exchange(struct nfc_hci_dev *hdev,
return -EPERM; return -EPERM;
} }
static int nfc_shdlc_check_presence(struct nfc_hci_dev *hdev,
struct nfc_target *target)
{
struct nfc_shdlc *shdlc = nfc_hci_get_clientdata(hdev);
if (shdlc->ops->check_presence)
return shdlc->ops->check_presence(shdlc, target);
return 0;
}
static struct nfc_hci_ops shdlc_ops = { static struct nfc_hci_ops shdlc_ops = {
.open = nfc_shdlc_open, .open = nfc_shdlc_open,
.close = nfc_shdlc_close, .close = nfc_shdlc_close,
...@@ -825,6 +836,7 @@ static struct nfc_hci_ops shdlc_ops = { ...@@ -825,6 +836,7 @@ static struct nfc_hci_ops shdlc_ops = {
.target_from_gate = nfc_shdlc_target_from_gate, .target_from_gate = nfc_shdlc_target_from_gate,
.complete_target_discovered = nfc_shdlc_complete_target_discovered, .complete_target_discovered = nfc_shdlc_complete_target_discovered,
.data_exchange = nfc_shdlc_data_exchange, .data_exchange = nfc_shdlc_data_exchange,
.check_presence = nfc_shdlc_check_presence,
}; };
struct nfc_shdlc *nfc_shdlc_allocate(struct nfc_shdlc_ops *ops, struct nfc_shdlc *nfc_shdlc_allocate(struct nfc_shdlc_ops *ops,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册