devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Christophe Ricard <christophe.ricard@gmail.com>
To: sameo@linux.intel.com
Cc: linux-nfc@lists.01.org, christophe-h.ricard@st.com,
	christophe.ricard@gmail.com, devicetree@vger.kernel.org,
	stable@vger.kernel.org
Subject: [PATCH v3 06/35] nfc: nci: Fix improper management of HCI return code
Date: Mon, 26 Oct 2015 07:49:46 +0100	[thread overview]
Message-ID: <1445842215-28403-7-git-send-email-christophe-h.ricard@st.com> (raw)
In-Reply-To: <1445842215-28403-1-git-send-email-christophe-h.ricard@st.com>

When sending HCI data over NCI, HCI return code is part of the NCI data.
In order to get correctly the HCI return code, we assume the NCI
communication is successful and extract the return code for the nci_hci
functions return code.

This is done because nci_to_errno does not match hci return code value.

Cc: stable@vger.kernel.org
Signed-off-by: Christophe Ricard <christophe-h.ricard@st.com>
---
 net/nfc/nci/hci.c | 60 ++++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 44 insertions(+), 16 deletions(-)

diff --git a/net/nfc/nci/hci.c b/net/nfc/nci/hci.c
index bc6b9d5..73afb47 100644
--- a/net/nfc/nci/hci.c
+++ b/net/nfc/nci/hci.c
@@ -101,6 +101,20 @@ struct nci_hcp_packet {
 #define NCI_HCP_MSG_GET_CMD(header)  (header & 0x3f)
 #define NCI_HCP_MSG_GET_PIPE(header) (header & 0x7f)
 
+static int nci_hci_result_to_errno(u8 result)
+{
+	switch (result) {
+	case NCI_HCI_ANY_OK:
+		return 0;
+	case NCI_HCI_ANY_E_REG_PAR_UNKNOWN:
+		return -EOPNOTSUPP;
+	case NCI_HCI_ANY_E_TIMEOUT:
+		return -ETIME;
+	default:
+		return -1;
+	}
+}
+
 /* HCI core */
 static void nci_hci_reset_pipes(struct nci_hci_dev *hdev)
 {
@@ -217,7 +231,8 @@ int nci_hci_send_cmd(struct nci_dev *ndev, u8 gate, u8 cmd,
 		     const u8 *param, size_t param_len,
 		     struct sk_buff **skb)
 {
-	struct nci_conn_info    *conn_info;
+	struct nci_hcp_message *message;
+	struct nci_conn_info   *conn_info;
 	struct nci_data data;
 	int r;
 	u8 pipe = ndev->hci_dev->gate2pipe[gate];
@@ -237,9 +252,14 @@ int nci_hci_send_cmd(struct nci_dev *ndev, u8 gate, u8 cmd,
 
 	r = nci_request(ndev, nci_hci_send_data_req, (unsigned long)&data,
 			msecs_to_jiffies(NCI_DATA_TIMEOUT));
+	if (r == NCI_STATUS_OK) {
+		message = (struct nci_hcp_message *)conn_info->rx_skb->data;
+		r = nci_hci_result_to_errno(NCI_HCP_MSG_GET_CMD(message->header));
+		skb_pull(conn_info->rx_skb, NCI_HCI_HCP_MESSAGE_HEADER_LEN);
 
-	if (r == NCI_STATUS_OK && skb)
-		*skb = conn_info->rx_skb;
+		if (!r && skb)
+			*skb = conn_info->rx_skb;
+	}
 
 	return r;
 }
@@ -333,9 +353,6 @@ static void nci_hci_resp_received(struct nci_dev *ndev, u8 pipe,
 	struct nci_conn_info    *conn_info;
 	u8 status = result;
 
-	if (result != NCI_HCI_ANY_OK)
-		goto exit;
-
 	conn_info = ndev->hci_dev->conn_info;
 	if (!conn_info) {
 		status = NCI_STATUS_REJECTED;
@@ -345,7 +362,7 @@ static void nci_hci_resp_received(struct nci_dev *ndev, u8 pipe,
 	conn_info->rx_skb = skb;
 
 exit:
-	nci_req_complete(ndev, status);
+	nci_req_complete(ndev, NCI_STATUS_OK);
 }
 
 /* Receive hcp message for pipe, with type and cmd.
@@ -400,7 +417,7 @@ void nci_hci_data_received_cb(void *context,
 {
 	struct nci_dev *ndev = (struct nci_dev *)context;
 	struct nci_hcp_packet *packet;
-	u8 pipe, type, instruction;
+	u8 pipe, type;
 	struct sk_buff *hcp_skb;
 	struct sk_buff *frag_skb;
 	int msg_len;
@@ -439,7 +456,7 @@ void nci_hci_data_received_cb(void *context,
 		*skb_put(hcp_skb, NCI_HCI_HCP_PACKET_HEADER_LEN) = pipe;
 
 		skb_queue_walk(&ndev->hci_dev->rx_hcp_frags, frag_skb) {
-		       msg_len = frag_skb->len - NCI_HCI_HCP_PACKET_HEADER_LEN;
+			msg_len = frag_skb->len - NCI_HCI_HCP_PACKET_HEADER_LEN;
 			memcpy(skb_put(hcp_skb, msg_len), frag_skb->data +
 			       NCI_HCI_HCP_PACKET_HEADER_LEN, msg_len);
 		}
@@ -457,11 +474,9 @@ void nci_hci_data_received_cb(void *context,
 	packet = (struct nci_hcp_packet *)hcp_skb->data;
 	type = NCI_HCP_MSG_GET_TYPE(packet->message.header);
 	if (type == NCI_HCI_HCP_RESPONSE) {
-		pipe = packet->header;
-		instruction = NCI_HCP_MSG_GET_CMD(packet->message.header);
-		skb_pull(hcp_skb, NCI_HCI_HCP_PACKET_HEADER_LEN +
-			 NCI_HCI_HCP_MESSAGE_HEADER_LEN);
-		nci_hci_hcp_message_rx(ndev, pipe, type, instruction, hcp_skb);
+		pipe = NCI_HCP_MSG_GET_PIPE(packet->header);
+		skb_pull(hcp_skb, NCI_HCI_HCP_PACKET_HEADER_LEN);
+		nci_hci_hcp_message_rx(ndev, pipe, type, NCI_STATUS_OK, hcp_skb);
 	} else {
 		skb_queue_tail(&ndev->hci_dev->msg_rx_queue, hcp_skb);
 		schedule_work(&ndev->hci_dev->msg_rx_work);
@@ -493,6 +508,7 @@ EXPORT_SYMBOL(nci_hci_open_pipe);
 int nci_hci_set_param(struct nci_dev *ndev, u8 gate, u8 idx,
 		      const u8 *param, size_t param_len)
 {
+	struct nci_hcp_message *message;
 	struct nci_conn_info *conn_info;
 	struct nci_data data;
 	int r;
@@ -525,6 +541,11 @@ int nci_hci_set_param(struct nci_dev *ndev, u8 gate, u8 idx,
 	r = nci_request(ndev, nci_hci_send_data_req,
 			(unsigned long)&data,
 			msecs_to_jiffies(NCI_DATA_TIMEOUT));
+	if (r == NCI_STATUS_OK) {
+		message = (struct nci_hcp_message *)conn_info->rx_skb->data;
+		r = nci_hci_result_to_errno(NCI_HCP_MSG_GET_CMD(message->header));
+		skb_pull(conn_info->rx_skb, NCI_HCI_HCP_MESSAGE_HEADER_LEN);
+	}
 
 	kfree(tmp);
 	return r;
@@ -534,6 +555,7 @@ EXPORT_SYMBOL(nci_hci_set_param);
 int nci_hci_get_param(struct nci_dev *ndev, u8 gate, u8 idx,
 		      struct sk_buff **skb)
 {
+	struct nci_hcp_message *message;
 	struct nci_conn_info    *conn_info;
 	struct nci_data data;
 	int r;
@@ -558,8 +580,14 @@ int nci_hci_get_param(struct nci_dev *ndev, u8 gate, u8 idx,
 	r = nci_request(ndev, nci_hci_send_data_req, (unsigned long)&data,
 			msecs_to_jiffies(NCI_DATA_TIMEOUT));
 
-	if (r == NCI_STATUS_OK)
-		*skb = conn_info->rx_skb;
+	if (r == NCI_STATUS_OK) {
+		message = (struct nci_hcp_message *)conn_info->rx_skb->data;
+		r = nci_hci_result_to_errno(NCI_HCP_MSG_GET_CMD(message->header));
+		skb_pull(conn_info->rx_skb, NCI_HCI_HCP_MESSAGE_HEADER_LEN);
+
+		if (!r && skb)
+			*skb = conn_info->rx_skb;
+	}
 
 	return r;
 }
-- 
2.1.4

  parent reply	other threads:[~2015-10-26  6:49 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-26  6:49 [PATCH v3 00/35] Few fixes and st21nfca/st-nci vendor_cmds support Christophe Ricard
2015-10-26  6:49 ` [PATCH v3 04/35] nfc: st-nci: Fix incorrect spi buffer size Christophe Ricard
2015-10-26  6:49 ` [PATCH v3 05/35] nfc: nci: Fix incorrect data chaining when sending data Christophe Ricard
2015-10-26  6:49 ` Christophe Ricard [this message]
2015-10-26  6:49 ` [PATCH v3 07/35] nfc: nci: extract pipe value using NCI_HCP_MSG_GET_PIPE Christophe Ricard
2015-10-26  6:49 ` [PATCH v3 11/35] nfc: st-nci: Remove ndev->hci_dev->init_data.gates initialization in load_session Christophe Ricard
2015-10-26  6:49 ` [PATCH v3 12/35] nfc: st21nfca: Remove hdev->init_data.gates " Christophe Ricard
2015-10-26  6:49 ` [PATCH v3 14/35] nfc: st21nfca: Open NFC_HCI_LINK_MGMT_PIPE Christophe Ricard
2015-10-26  6:49 ` [PATCH v3 15/35] nfc: st-nci: Keep st_nci_gates unchanged in load_session Christophe Ricard
2015-10-26  6:49 ` [PATCH v3 16/35] nfc: st21nfca: Keep st21nfca_gates " Christophe Ricard
2015-10-26  6:49 ` [PATCH v3 17/35] nfc: st-nci: initialize gate_count in st_nci_hci_network_init Christophe Ricard
2015-10-26  6:49 ` [PATCH v3 19/35] nfc: st-nci: Change st_nci_gates offset when looking for a pipe in the table Christophe Ricard
     [not found] ` <1445842215-28403-1-git-send-email-christophe-h.ricard-qxv4g6HH51o@public.gmane.org>
2015-10-26  6:49   ` [PATCH v3 01/35] nfc: st-nci: Align st-nci driver with other nfc driver Christophe Ricard
2015-10-26  6:49   ` [PATCH v3 02/35] nfc: st-nci: include st-nci.h instead of ndlc.h Christophe Ricard
2015-10-26  6:49   ` [PATCH v3 03/35] nfc: st21nfca: Align st21nfca driver with other nfc driver Christophe Ricard
2015-10-26  6:49   ` [PATCH v3 08/35] nfc: nci: add nci_hci_clear_all_pipes functions Christophe Ricard
2015-10-26  6:49   ` [PATCH v3 09/35] nfc: nci: Add a call to nci_hci_clear_all_pipes at HCI initial activation Christophe Ricard
2015-10-26  6:49   ` [PATCH v3 10/35] nfc: nci: add capability to create pipe on specific gate in nci_hci_connect_gate Christophe Ricard
2015-10-26  6:49   ` [PATCH v3 13/35] nfc: st-nci: Open NCI_HCI_LINK_MGMT_PIPE Christophe Ricard
2015-10-26  6:49   ` [PATCH v3 18/35] nfc: st-nci: Add support for NCI_HCI_IDENTITY_MGMT_GATE Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 20/35] nfc: st21nfca: Change st21nfca_gates offset when looking for a pipe in the table Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 21/35] nfc: st-nci: Add support for proprietary commands for factory tests Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 22/35] nfc: st-nci: Add error messages when an unexpected HCI event occurs Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 23/35] nfc: netlink: Add missing NFC_ATTR comments Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 24/35] nfc: st-nci: Add ese-present/uicc-present dts properties Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 25/35] nfc: st-nci: Increase waiting time between 2 secure element activation Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 28/35] nfc: netlink: Add mode parameter to deactivate_target functions Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 29/35] nfc: st-nci: Add few code style fixes Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 31/35] nfc: st21nfca: Add support for proprietary commands for factory tests Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 32/35] nfc: st21nfca: Add error messages when an unexpected HCI event occurs Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 33/35] nfc: st-nci: Make sure irq is not already active when powering the device Christophe Ricard
2015-10-26  6:50   ` [PATCH v3 35/35] nfc: st-nci: Replace st21nfcb by st_nci in makefile Christophe Ricard
2015-10-26  6:50 ` [PATCH v3 26/35] nfc: st-nci: Fix host_list verification after secure element activation Christophe Ricard
2015-10-26  6:50 ` [PATCH v3 27/35] nfc: st21nfca: " Christophe Ricard
2015-10-26  6:50 ` [PATCH v3 30/35] nfc: st21nfca: Add few code style fixes Christophe Ricard
2015-10-26  6:50 ` [PATCH v3 34/35] nfc: st-nci: remove duplicated skb dump Christophe Ricard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1445842215-28403-7-git-send-email-christophe-h.ricard@st.com \
    --to=christophe.ricard@gmail.com \
    --cc=christophe-h.ricard@st.com \
    --cc=devicetree@vger.kernel.org \
    --cc=linux-nfc@lists.01.org \
    --cc=sameo@linux.intel.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).