Skip to content

Commit

Permalink
NFC: Changed HCI cmd execution completion result to std linux errno
Browse files Browse the repository at this point in the history
An HCI command can complete either from an HCI response
(with an HCI result) or as a consequence of any other system
error during processing. The completion therefore needs to take
a standard errno code. The HCI response will convert its result
to a standard errno before calling the completion.

Signed-off-by: Eric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
  • Loading branch information
Eric Lapuyade authored and John W. Linville committed Jul 9, 2012
1 parent 72b06f7 commit 6c1c5b9
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 22 deletions.
18 changes: 3 additions & 15 deletions net/nfc/hci/command.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,26 +28,14 @@

#include "hci.h"

static int nfc_hci_result_to_errno(u8 result)
{
switch (result) {
case NFC_HCI_ANY_OK:
return 0;
case NFC_HCI_ANY_E_TIMEOUT:
return -ETIMEDOUT;
default:
return -1;
}
}

static void nfc_hci_execute_cb(struct nfc_hci_dev *hdev, u8 result,
static void nfc_hci_execute_cb(struct nfc_hci_dev *hdev, int err,
struct sk_buff *skb, void *cb_data)
{
struct hcp_exec_waiter *hcp_ew = (struct hcp_exec_waiter *)cb_data;

pr_debug("HCI Cmd completed with HCI result=%d\n", result);
pr_debug("HCI Cmd completed with result=%d\n", err);

hcp_ew->exec_result = nfc_hci_result_to_errno(result);
hcp_ew->exec_result = err;
if (hcp_ew->exec_result == 0)
hcp_ew->result_skb = skb;
else
Expand Down
20 changes: 16 additions & 4 deletions net/nfc/hci/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,18 @@
/* Largest headroom needed for outgoing HCI commands */
#define HCI_CMDS_HEADROOM 1

static int nfc_hci_result_to_errno(u8 result)
{
switch (result) {
case NFC_HCI_ANY_OK:
return 0;
case NFC_HCI_ANY_E_TIMEOUT:
return -ETIME;
default:
return -1;
}
}

static void nfc_hci_msg_tx_work(struct work_struct *work)
{
struct nfc_hci_dev *hdev = container_of(work, struct nfc_hci_dev,
Expand All @@ -46,7 +58,7 @@ static void nfc_hci_msg_tx_work(struct work_struct *work)
if (timer_pending(&hdev->cmd_timer) == 0) {
if (hdev->cmd_pending_msg->cb)
hdev->cmd_pending_msg->cb(hdev,
NFC_HCI_ANY_E_TIMEOUT,
-ETIME,
NULL,
hdev->
cmd_pending_msg->
Expand All @@ -71,8 +83,7 @@ static void nfc_hci_msg_tx_work(struct work_struct *work)
kfree_skb(skb);
skb_queue_purge(&msg->msg_frags);
if (msg->cb)
msg->cb(hdev, NFC_HCI_ANY_E_NOK, NULL,
msg->cb_context);
msg->cb(hdev, r, NULL, msg->cb_context);
kfree(msg);
break;
}
Expand Down Expand Up @@ -129,7 +140,8 @@ void nfc_hci_resp_received(struct nfc_hci_dev *hdev, u8 result,
del_timer_sync(&hdev->cmd_timer);

if (hdev->cmd_pending_msg->cb)
hdev->cmd_pending_msg->cb(hdev, result, skb,
hdev->cmd_pending_msg->cb(hdev, nfc_hci_result_to_errno(result),
skb,
hdev->cmd_pending_msg->cb_context);
else
kfree_skb(skb);
Expand Down
7 changes: 4 additions & 3 deletions net/nfc/hci/hci.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,11 @@ struct hcp_packet {

/*
* HCI command execution completion callback.
* result will be one of the HCI response codes.
* skb contains the response data and must be disposed.
* result will be a standard linux error (may be converted from HCI response)
* skb contains the response data and must be disposed, or may be NULL if
* an error occured
*/
typedef void (*hci_cmd_cb_t) (struct nfc_hci_dev *hdev, u8 result,
typedef void (*hci_cmd_cb_t) (struct nfc_hci_dev *hdev, int result,
struct sk_buff *skb, void *cb_data);

struct hcp_exec_waiter {
Expand Down

0 comments on commit 6c1c5b9

Please sign in to comment.