Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 351879
b: refs/heads/master
c: 94c5c15
h: refs/heads/master
i:
  351877: 844c20c
  351875: 4afaa78
  351871: 585e11d
v: v3
  • Loading branch information
Waldemar Rymarkiewicz authored and Samuel Ortiz committed Jan 9, 2013
1 parent 7ae54e6 commit af74db8
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 2 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: 15461aeb53ae2d3bbde6b374de913e3df81d1ad0
refs/heads/master: 94c5c1561dde894766b1a9135e47b056fdbe13a4
55 changes: 54 additions & 1 deletion trunk/drivers/nfc/pn533.c
Original file line number Diff line number Diff line change
Expand Up @@ -945,6 +945,7 @@ static int pn533_send_cmd_frame_async(struct pn533 *dev,

struct pn533_sync_cmd_response {
int rc;
struct sk_buff *resp;
struct completion done;
};

Expand All @@ -965,6 +966,58 @@ static int pn533_sync_cmd_complete(struct pn533 *dev, void *_arg,
return 0;
}

static int pn533_send_sync_complete(struct pn533 *dev, void *_arg,
struct sk_buff *resp)
{
struct pn533_sync_cmd_response *arg = _arg;

nfc_dev_dbg(&dev->interface->dev, "%s", __func__);

arg->resp = resp;
complete(&arg->done);

return 0;
}

/* pn533_send_cmd_sync
*
* Please note the req parameter is freed inside the function to
* limit a number of return value interpretations by the caller.
*
* 1. negative in case of error during TX path -> req should be freed
*
* 2. negative in case of error during RX path -> req should not be freed
* as it's been already freed at the begining of RX path by
* async_complete_cb.
*
* 3. valid pointer in case of succesfult RX path
*
* A caller has to check a return value with IS_ERR macro. If the test pass,
* the returned pointer is valid.
*
* */
static struct sk_buff *pn533_send_cmd_sync(struct pn533 *dev, u8 cmd_code,
struct sk_buff *req)
{
int rc;
struct pn533_sync_cmd_response arg;

nfc_dev_dbg(&dev->interface->dev, "%s", __func__);

init_completion(&arg.done);

rc = pn533_send_cmd_async(dev, cmd_code, req,
pn533_send_sync_complete, &arg);
if (rc) {
dev_kfree_skb(req);
return ERR_PTR(rc);
}

wait_for_completion(&arg.done);

return arg.resp;
}

static int pn533_send_cmd_frame_sync(struct pn533 *dev,
struct pn533_frame *out_frame,
struct pn533_frame *in_frame,
Expand Down Expand Up @@ -2432,7 +2485,7 @@ static int pn533_fw_reset(struct pn533 *dev)
rc = pn533_send_cmd_frame_sync(dev, dev->out_frame, dev->in_frame,
PN533_NORMAL_FRAME_MAX_LEN);

return rc;
return 0;
}

static struct nfc_ops pn533_nfc_ops = {
Expand Down

0 comments on commit af74db8

Please sign in to comment.