#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
 
 /* 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,
                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->
                        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;
                }
        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);
 
 
 /*
  * 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 {