Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 340929
b: refs/heads/master
c: f7a5f6c
h: refs/heads/master
i:
  340927: 6a2e4a1
v: v3
  • Loading branch information
Arron Wang authored and Samuel Ortiz committed Oct 26, 2012
1 parent f984db9 commit 57acf66
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7e2afc9d072b9f84b314b208a125c2b1ce36b685
refs/heads/master: f7a5f6c532f33ba66a7ca19e81ed447a83dab2db
45 changes: 45 additions & 0 deletions trunk/drivers/nfc/pn544_hci.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,12 @@ enum pn544_state {

#define PN544_NFC_WI_MGMT_GATE 0xA1

#define PN544_HCI_EVT_SND_DATA 0x01
#define PN544_HCI_EVT_ACTIVATED 0x02
#define PN544_HCI_EVT_DEACTIVATED 0x03
#define PN544_HCI_EVT_RCV_DATA 0x04
#define PN544_HCI_EVT_CONTINUE_MI 0x05

static struct nfc_hci_gate pn544_gates[] = {
{NFC_HCI_ADMIN_GATE, NFC_HCI_INVALID_PIPE},
{NFC_HCI_LOOPBACK_GATE, NFC_HCI_INVALID_PIPE},
Expand Down Expand Up @@ -897,6 +903,44 @@ static int pn544_hci_check_presence(struct nfc_hci_dev *hdev,
NULL, 0, NULL);
}

void pn544_hci_event_received(struct nfc_hci_dev *hdev, u8 gate, u8 event,
struct sk_buff *skb)
{
struct sk_buff *rgb_skb = NULL;
int r = 0;

pr_debug("hci event %d", event);
switch (event) {
case PN544_HCI_EVT_ACTIVATED:
if (gate == PN544_RF_READER_NFCIP1_INITIATOR_GATE)
nfc_hci_target_discovered(hdev, gate);
else if (gate == PN544_RF_READER_NFCIP1_TARGET_GATE) {
r = nfc_hci_get_param(hdev, gate, PN544_DEP_ATR_REQ,
&rgb_skb);

if (r < 0)
goto exit;

nfc_tm_activated(hdev->ndev, NFC_PROTO_NFC_DEP_MASK,
NFC_COMM_PASSIVE, rgb_skb->data,
rgb_skb->len);

kfree_skb(rgb_skb);
}

break;
case PN544_HCI_EVT_DEACTIVATED:
nfc_hci_send_event(hdev, gate,
NFC_HCI_EVT_END_OPERATION, NULL, 0);
break;
default:
break;
}

exit:
kfree_skb(skb);
}

static struct nfc_hci_ops pn544_hci_ops = {
.open = pn544_hci_open,
.close = pn544_hci_close,
Expand All @@ -907,6 +951,7 @@ static struct nfc_hci_ops pn544_hci_ops = {
.complete_target_discovered = pn544_hci_complete_target_discovered,
.data_exchange = pn544_hci_data_exchange,
.check_presence = pn544_hci_check_presence,
.event_received = pn544_hci_event_received,
};

static int __devinit pn544_hci_probe(struct i2c_client *client,
Expand Down
3 changes: 3 additions & 0 deletions trunk/include/net/nfc/hci.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ struct nfc_hci_ops {
data_exchange_cb_t cb, void *cb_context);
int (*check_presence)(struct nfc_hci_dev *hdev,
struct nfc_target *target);
void (*event_received)(struct nfc_hci_dev *hdev, u8 gate, u8 event,
struct sk_buff *skb);
};

/* Pipes */
Expand Down Expand Up @@ -222,5 +224,6 @@ int nfc_hci_send_response(struct nfc_hci_dev *hdev, u8 gate, u8 response,
const u8 *param, size_t param_len);
int nfc_hci_send_event(struct nfc_hci_dev *hdev, u8 gate, u8 event,
const u8 *param, size_t param_len);
int nfc_hci_target_discovered(struct nfc_hci_dev *hdev, u8 gate);

#endif /* __NET_HCI_H */
12 changes: 9 additions & 3 deletions trunk/net/nfc/hci/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ static u32 nfc_hci_sak_to_protocol(u8 sak)
}
}

static int nfc_hci_target_discovered(struct nfc_hci_dev *hdev, u8 gate)
int nfc_hci_target_discovered(struct nfc_hci_dev *hdev, u8 gate)
{
struct nfc_target *targets;
struct sk_buff *atqa_skb = NULL;
Expand Down Expand Up @@ -275,6 +275,7 @@ static int nfc_hci_target_discovered(struct nfc_hci_dev *hdev, u8 gate)

return r;
}
EXPORT_SYMBOL(nfc_hci_target_discovered);

void nfc_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event,
struct sk_buff *skb)
Expand Down Expand Up @@ -307,8 +308,13 @@ void nfc_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event,
nfc_hci_pipe2gate(hdev, pipe));
break;
default:
/* TODO: Unknown events are hardware specific
* pass them to the driver (needs a new hci_ops) */
if (hdev->ops->event_received) {
hdev->ops->event_received(hdev,
nfc_hci_pipe2gate(hdev, pipe),
event, skb);
return;
}

break;
}

Expand Down

0 comments on commit 57acf66

Please sign in to comment.