Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1465045

[PATCH 05/11] Input: synaptics-rmi4 - f03: grab data passed by transport device

From Benjamin Tissoires <benjamin.tissoires@redhat.com>
Newsgroups linux.kernel
Subject [PATCH 05/11] Input: synaptics-rmi4 - f03: grab data passed by transport device
Date 2016-08-18 11:40 +0200
Message-ID <s7rXP-6j1-9@gated-at.bofh.it> (permalink)
References <s7rO9-6fy-7@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Dennis Wassenberg <dennis.wassenberg@secunet.com>

First check if there are data available passed by the transport device.
If data available use these data. If there are no data available
try to read the rmi block if dsata are passed this way.

This is the way the other rmi function handlers will do this.
That why apply this to f03 as well.

This will fix corrupted or missing data issues.

Signed-off-by: Dennis Wassenberg <dennis.wassenberg@secunet.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---
 drivers/input/rmi4/rmi_f03.c | 37 +++++++++++++++++++++++++++----------
 1 file changed, 27 insertions(+), 10 deletions(-)

diff --git a/drivers/input/rmi4/rmi_f03.c b/drivers/input/rmi4/rmi_f03.c
index 9945512..daae1c95 100644
--- a/drivers/input/rmi4/rmi_f03.c
+++ b/drivers/input/rmi4/rmi_f03.c
@@ -158,6 +158,7 @@ static int rmi_f03_config(struct rmi_function *fn)
 
 static int rmi_f03_attention(struct rmi_function *fn, unsigned long *irq_bits)
 {
+	struct rmi_device *rmi_dev = fn->rmi_dev;
 	struct f03_data *f03 = dev_get_drvdata(&fn->dev);
 	u16 data_addr = fn->fd.data_base_addr;
 	const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE;
@@ -166,16 +167,32 @@ static int rmi_f03_attention(struct rmi_function *fn, unsigned long *irq_bits)
 	u8 ob_data;
 	unsigned int serio_flags;
 	int i;
-	int retval;
-
-	/* Grab all of the data registers, and check them for data */
-	retval = rmi_read_block(fn->rmi_dev, data_addr + RMI_F03_OB_OFFSET,
-				&obs, ob_len);
-	if (retval) {
-		dev_err(&fn->dev, "%s: Failed to read F03 output buffers.\n",
-			__func__);
-		serio_interrupt(f03->serio, 0, SERIO_TIMEOUT);
-		return retval;
+	int ret;
+
+	if (!rmi_dev || !rmi_dev->xport)
+		return -ENODEV;
+
+	if (rmi_dev->xport->attn_data) {
+		/* First grab the data passed by the transport device */
+		if (rmi_dev->xport->attn_size < ob_len) {
+			dev_warn(&fn->dev, "F03 interrupted, but data is missing!\n");
+			return 0;
+		}
+
+		memcpy(obs, rmi_dev->xport->attn_data, ob_len);
+
+		rmi_dev->xport->attn_data += ob_len;
+		rmi_dev->xport->attn_size -= ob_len;
+	} else {
+		/* Grab all of the data registers, and check them for data */
+		ret = rmi_read_block(fn->rmi_dev, data_addr + RMI_F03_OB_OFFSET,
+				     &obs, ob_len);
+		if (ret) {
+			dev_err(&fn->dev, "%s: Failed to read F03 output buffers.\n",
+				__func__);
+			serio_interrupt(f03->serio, 0, SERIO_TIMEOUT);
+			return ret;
+		}
 	}
 
 	for (i = 0; i < ob_len; i += RMI_F03_OB_SIZE) {
-- 
2.5.5

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 00/11] Synaptics RMI4 over SMBus Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:30 +0200
  [PATCH 02/11] Input: serio - store the pt_buttons in the struct serio directly Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:30 +0200
  [PATCH 01/11] Input: synaptics-rmi4 - add SMBus support Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:30 +0200
  [PATCH 06/11] Input: synaptics-rmi4 - Add rmi_find_function() Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:40 +0200
  [PATCH 05/11] Input: synaptics-rmi4 - f03: grab data passed by transport device Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:40 +0200
  [PATCH 11/11] Input: synaptics-rmi4 - smbus: on resume, try 3 times if init fails Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:40 +0200
  [PATCH 08/11] Input: synaptics - allocate a Synaptics Intertouch device Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:40 +0200
  [PATCH 09/11] Input: synaptics-rmi4 - add rmi_platform Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:40 +0200
    Re: [PATCH 09/11] Input: synaptics-rmi4 - add rmi_platform kbuild test robot <lkp@intel.com> - 2016-08-24 04:50 +0200
    [PATCH] Input: fix semicolon.cocci warnings kbuild test robot <lkp@intel.com> - 2016-08-24 04:50 +0200
  [PATCH 04/11] Input: synaptics-rmi4 - add support for F03 Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:50 +0200
  [PATCH 03/11] Input: synaptics-rmi4 - have only one struct platform data Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:50 +0200
  [PATCH 10/11] Input: synaptics-rmi4 - smbus: call psmouse_deactivate before binding/resume Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:50 +0200
  [PATCH 07/11] Input: synaptics-rmi4 - f30/f03: Forward mechanical buttons on buttonpads to PS/2 guest Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-08-18 11:50 +0200

csiph-web