Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c1c5b9e authored by Eric Lapuyade's avatar Eric Lapuyade Committed by John W. Linville
Browse files

NFC: Changed HCI cmd execution completion result to std linux errno



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: default avatarEric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 72b06f75
Loading
Loading
Loading
Loading
+3 −15
Original line number Original line Diff line number Diff line
@@ -28,26 +28,14 @@


#include "hci.h"
#include "hci.h"


static int nfc_hci_result_to_errno(u8 result)
static void nfc_hci_execute_cb(struct nfc_hci_dev *hdev, int err,
{
	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,
			       struct sk_buff *skb, void *cb_data)
			       struct sk_buff *skb, void *cb_data)
{
{
	struct hcp_exec_waiter *hcp_ew = (struct hcp_exec_waiter *)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)
	if (hcp_ew->exec_result == 0)
		hcp_ew->result_skb = skb;
		hcp_ew->result_skb = skb;
	else
	else
+16 −4
Original line number Original line Diff line number Diff line
@@ -32,6 +32,18 @@
/* Largest headroom needed for outgoing HCI commands */
/* Largest headroom needed for outgoing HCI commands */
#define HCI_CMDS_HEADROOM 1
#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)
static void nfc_hci_msg_tx_work(struct work_struct *work)
{
{
	struct nfc_hci_dev *hdev = container_of(work, struct nfc_hci_dev,
	struct nfc_hci_dev *hdev = container_of(work, struct nfc_hci_dev,
@@ -46,7 +58,7 @@ static void nfc_hci_msg_tx_work(struct work_struct *work)
		if (timer_pending(&hdev->cmd_timer) == 0) {
		if (timer_pending(&hdev->cmd_timer) == 0) {
			if (hdev->cmd_pending_msg->cb)
			if (hdev->cmd_pending_msg->cb)
				hdev->cmd_pending_msg->cb(hdev,
				hdev->cmd_pending_msg->cb(hdev,
							  NFC_HCI_ANY_E_TIMEOUT,
							  -ETIME,
							  NULL,
							  NULL,
							  hdev->
							  hdev->
							  cmd_pending_msg->
							  cmd_pending_msg->
@@ -71,8 +83,7 @@ static void nfc_hci_msg_tx_work(struct work_struct *work)
			kfree_skb(skb);
			kfree_skb(skb);
			skb_queue_purge(&msg->msg_frags);
			skb_queue_purge(&msg->msg_frags);
			if (msg->cb)
			if (msg->cb)
				msg->cb(hdev, NFC_HCI_ANY_E_NOK, NULL,
				msg->cb(hdev, r, NULL, msg->cb_context);
					msg->cb_context);
			kfree(msg);
			kfree(msg);
			break;
			break;
		}
		}
@@ -129,7 +140,8 @@ void nfc_hci_resp_received(struct nfc_hci_dev *hdev, u8 result,
	del_timer_sync(&hdev->cmd_timer);
	del_timer_sync(&hdev->cmd_timer);


	if (hdev->cmd_pending_msg->cb)
	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);
					  hdev->cmd_pending_msg->cb_context);
	else
	else
		kfree_skb(skb);
		kfree_skb(skb);
+4 −3
Original line number Original line Diff line number Diff line
@@ -37,10 +37,11 @@ struct hcp_packet {


/*
/*
 * HCI command execution completion callback.
 * HCI command execution completion callback.
 * result will be one of the HCI response codes.
 * result will be a standard linux error (may be converted from HCI response)
 * skb contains the response data and must be disposed.
 * 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 sk_buff *skb, void *cb_data);


struct hcp_exec_waiter {
struct hcp_exec_waiter {