linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [char-misc-next 1/8] mei: recover after errors in runtime pm flow
@ 2016-06-16 14:58 Tomas Winkler
  2016-06-16 14:58 ` [char-misc-next 2/8] mei: hbm: add missing argument in the kdoc Tomas Winkler
                   ` (6 more replies)
  0 siblings, 7 replies; 9+ messages in thread
From: Tomas Winkler @ 2016-06-16 14:58 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Alexander Usyskin, linux-kernel, Tomas Winkler

From: Alexander Usyskin <alexander.usyskin@intel.com>

Schedule link reset if failed to perform runtime suspend or resume.
Set active runtime pm stte on link reset
to clean runtimr pm error, if present.

Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/hw-me.c   | 3 +++
 drivers/misc/mei/hw-txe.c  | 3 +++
 drivers/misc/mei/pci-me.c  | 6 ++++++
 drivers/misc/mei/pci-txe.c | 7 +++++++
 4 files changed, 19 insertions(+)

diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c
index e2fb44cc5c37..c2d70d2dd112 100644
--- a/drivers/misc/mei/hw-me.c
+++ b/drivers/misc/mei/hw-me.c
@@ -18,6 +18,7 @@
 
 #include <linux/kthread.h>
 #include <linux/interrupt.h>
+#include <linux/pm_runtime.h>
 
 #include "mei_dev.h"
 #include "hbm.h"
@@ -1063,6 +1064,8 @@ static int mei_me_hw_reset(struct mei_device *dev, bool intr_enable)
 		}
 	}
 
+	pm_runtime_set_active(dev->dev);
+
 	hcsr = mei_hcsr_read(dev);
 	/* H_RST may be found lit before reset is started,
 	 * for example if preceding reset flow hasn't completed.
diff --git a/drivers/misc/mei/hw-txe.c b/drivers/misc/mei/hw-txe.c
index 4a6c1b85f11e..e6e5e55a12ed 100644
--- a/drivers/misc/mei/hw-txe.c
+++ b/drivers/misc/mei/hw-txe.c
@@ -20,6 +20,7 @@
 #include <linux/delay.h>
 #include <linux/kthread.h>
 #include <linux/irqreturn.h>
+#include <linux/pm_runtime.h>
 
 #include <linux/mei.h>
 
@@ -935,6 +936,8 @@ static int mei_txe_hw_start(struct mei_device *dev)
 		return ret;
 	}
 
+	pm_runtime_set_active(dev->dev);
+
 	/* enable input ready interrupts:
 	 * SEC_IPC_HOST_INT_MASK.IPC_INPUT_READY_INT_MASK
 	 */
diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c
index 64e64da6da44..718addfa9fb0 100644
--- a/drivers/misc/mei/pci-me.c
+++ b/drivers/misc/mei/pci-me.c
@@ -400,6 +400,9 @@ static int mei_me_pm_runtime_suspend(struct device *device)
 
 	dev_dbg(&pdev->dev, "rpm: me: runtime suspend ret=%d\n", ret);
 
+	if (ret && ret != -EAGAIN)
+		schedule_work(&dev->reset_work);
+
 	return ret;
 }
 
@@ -423,6 +426,9 @@ static int mei_me_pm_runtime_resume(struct device *device)
 
 	dev_dbg(&pdev->dev, "rpm: me: runtime resume ret = %d\n", ret);
 
+	if (ret)
+		schedule_work(&dev->reset_work);
+
 	return ret;
 }
 
diff --git a/drivers/misc/mei/pci-txe.c b/drivers/misc/mei/pci-txe.c
index 30cc30683c07..58ffd30dcc91 100644
--- a/drivers/misc/mei/pci-txe.c
+++ b/drivers/misc/mei/pci-txe.c
@@ -347,6 +347,10 @@ static int mei_txe_pm_runtime_suspend(struct device *device)
 	dev_dbg(&pdev->dev, "rpm: txe: runtime suspend ret=%d\n", ret);
 
 	mutex_unlock(&dev->device_lock);
+
+	if (ret && ret != -EAGAIN)
+		schedule_work(&dev->reset_work);
+
 	return ret;
 }
 
@@ -372,6 +376,9 @@ static int mei_txe_pm_runtime_resume(struct device *device)
 
 	dev_dbg(&pdev->dev, "rpm: txe: runtime resume ret = %d\n", ret);
 
+	if (ret)
+		schedule_work(&dev->reset_work);
+
 	return ret;
 }
 
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [char-misc-next 2/8] mei: hbm: add missing argument in the kdoc
  2016-06-16 14:58 [char-misc-next 1/8] mei: recover after errors in runtime pm flow Tomas Winkler
@ 2016-06-16 14:58 ` Tomas Winkler
  2016-06-16 14:58 ` [char-misc-next 3/8] mei: drop read complete queue emptiness check Tomas Winkler
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Tomas Winkler @ 2016-06-16 14:58 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Alexander Usyskin, linux-kernel, Tomas Winkler

In mei_hbm_cl_hdr buf argument was not described

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
---
 drivers/misc/mei/hbm.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c
index 085f3aafe6fa..b1697a329af1 100644
--- a/drivers/misc/mei/hbm.c
+++ b/drivers/misc/mei/hbm.c
@@ -161,6 +161,7 @@ void mei_hbm_cl_hdr(struct mei_cl *cl, u8 hbm_cmd, void *buf, size_t len)
  * @dev: the device structure
  * @cl: client
  * @hbm_cmd: host bus message command
+ * @buf: message buffer
  * @len: buffer length
  *
  * Return: 0 on success, <0 on failure.
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [char-misc-next 3/8] mei: drop read complete queue emptiness check
  2016-06-16 14:58 [char-misc-next 1/8] mei: recover after errors in runtime pm flow Tomas Winkler
  2016-06-16 14:58 ` [char-misc-next 2/8] mei: hbm: add missing argument in the kdoc Tomas Winkler
@ 2016-06-16 14:58 ` Tomas Winkler
  2016-06-16 14:58 ` [char-misc-next 4/8] mei: fix return value on disconnection Tomas Winkler
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Tomas Winkler @ 2016-06-16 14:58 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Alexander Usyskin, linux-kernel, Tomas Winkler

From: Alexander Usyskin <alexander.usyskin@intel.com>

In the course of the read flow we want to wait for read completion only
if the read queue is empty.
However the calling list_empty(&cl->rd_completed) is a duplication as the
same check was performed by mei_cl_read_cb() and the waiting is skipped
if it returns not NULL.

Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/bus.c  | 3 ++-
 drivers/misc/mei/main.c | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c
index 1f33fea9299f..63411ddfb83d 100644
--- a/drivers/misc/mei/bus.c
+++ b/drivers/misc/mei/bus.c
@@ -126,7 +126,8 @@ ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length)
 		goto out;
 
 	/* wait on event only if there is no other waiter */
-	if (list_empty(&cl->rd_completed) && !waitqueue_active(&cl->rx_wait)) {
+	/* synchronized under device mutex */
+	if (!waitqueue_active(&cl->rx_wait)) {
 
 		mutex_unlock(&bus->device_lock);
 
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index a8d0471f817f..3326bde7fba1 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -183,7 +183,8 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
 		goto out;
 	}
 
-	if (list_empty(&cl->rd_completed) && !waitqueue_active(&cl->rx_wait)) {
+	/* synchronized under device mutex */
+	if (!waitqueue_active(&cl->rx_wait)) {
 		if (file->f_flags & O_NONBLOCK) {
 			rets = -EAGAIN;
 			goto out;
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [char-misc-next 4/8] mei: fix return value on disconnection
  2016-06-16 14:58 [char-misc-next 1/8] mei: recover after errors in runtime pm flow Tomas Winkler
  2016-06-16 14:58 ` [char-misc-next 2/8] mei: hbm: add missing argument in the kdoc Tomas Winkler
  2016-06-16 14:58 ` [char-misc-next 3/8] mei: drop read complete queue emptiness check Tomas Winkler
@ 2016-06-16 14:58 ` Tomas Winkler
  2016-06-22 21:25   ` [char-misc-next v2 " Tomas Winkler
  2016-06-16 14:58 ` [char-misc-next 5/8] mei: move read cb to complete queue if not connected Tomas Winkler
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 9+ messages in thread
From: Tomas Winkler @ 2016-06-16 14:58 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Alexander Usyskin, linux-kernel, Tomas Winkler, stable

Correct errno on client disconnection is -ENODEV not -EBUSY

Cc: <stable@vger.kernel.org> #4.3+
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/bus.c  | 2 +-
 drivers/misc/mei/main.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c
index 63411ddfb83d..9c404dc8eada 100644
--- a/drivers/misc/mei/bus.c
+++ b/drivers/misc/mei/bus.c
@@ -143,7 +143,7 @@ ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length)
 		mutex_lock(&bus->device_lock);
 
 		if (!mei_cl_is_connected(cl)) {
-			rets = -EBUSY;
+			rets = -ENODEV;
 			goto out;
 		}
 	}
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index 3326bde7fba1..d62e89c80beb 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -203,7 +203,7 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
 
 		mutex_lock(&dev->device_lock);
 		if (!mei_cl_is_connected(cl)) {
-			rets = -EBUSY;
+			rets = -ENODEV;
 			goto out;
 		}
 	}
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [char-misc-next 5/8] mei: move read cb to complete queue if not connected
  2016-06-16 14:58 [char-misc-next 1/8] mei: recover after errors in runtime pm flow Tomas Winkler
                   ` (2 preceding siblings ...)
  2016-06-16 14:58 ` [char-misc-next 4/8] mei: fix return value on disconnection Tomas Winkler
@ 2016-06-16 14:58 ` Tomas Winkler
  2016-06-16 14:58 ` [char-misc-next 6/8] mei: add file pointer to the host client structure Tomas Winkler
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Tomas Winkler @ 2016-06-16 14:58 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Alexander Usyskin, linux-kernel, Tomas Winkler

From: Alexander Usyskin <alexander.usyskin@intel.com>

Move read cb to the completion queue if a read finds out that client
is not connected. This expedite user space reader wake on error
condition.

Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/interrupt.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c
index 436ecda3935e..412229e7bb7c 100644
--- a/drivers/misc/mei/interrupt.c
+++ b/drivers/misc/mei/interrupt.c
@@ -113,6 +113,7 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
 
 	if (!mei_cl_is_connected(cl)) {
 		cl_dbg(dev, cl, "not connected\n");
+		list_move_tail(&cb->list, &complete_list->list);
 		cb->status = -ENODEV;
 		goto out;
 	}
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [char-misc-next 6/8] mei: add file pointer to the host client structure
  2016-06-16 14:58 [char-misc-next 1/8] mei: recover after errors in runtime pm flow Tomas Winkler
                   ` (3 preceding siblings ...)
  2016-06-16 14:58 ` [char-misc-next 5/8] mei: move read cb to complete queue if not connected Tomas Winkler
@ 2016-06-16 14:58 ` Tomas Winkler
  2016-06-16 14:58 ` [char-misc-next 7/8] mei: add read callback on demand for fixed_address clients Tomas Winkler
  2016-06-16 14:58 ` [char-misc-next 8/8] mei: amthif: drop mei_clear_lists function Tomas Winkler
  6 siblings, 0 replies; 9+ messages in thread
From: Tomas Winkler @ 2016-06-16 14:58 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Alexander Usyskin, linux-kernel, Tomas Winkler

From: Alexander Usyskin <alexander.usyskin@intel.com>

Store the file associated with a client in the host client structure,
this enables dropping the special amthif client file pointer from struct
mei_device, and this is also a preparation for changing the way rx
packet allocation for fixed_address clients

Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/amthif.c    | 13 +++++++------
 drivers/misc/mei/interrupt.c |  1 -
 drivers/misc/mei/main.c      |  1 +
 drivers/misc/mei/mei_dev.h   |  5 ++---
 4 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c
index 14b454143c81..795eacf3b8b4 100644
--- a/drivers/misc/mei/amthif.c
+++ b/drivers/misc/mei/amthif.c
@@ -204,7 +204,7 @@ static int mei_amthif_read_start(struct mei_cl *cl, const struct file *file)
 	list_add_tail(&cb->list, &dev->ctrl_wr_list.list);
 
 	dev->iamthif_state = MEI_IAMTHIF_READING;
-	dev->iamthif_fp = cb->fp;
+	cl->fp = cb->fp;
 
 	return 0;
 }
@@ -230,13 +230,13 @@ int mei_amthif_run_next_cmd(struct mei_device *dev)
 					typeof(*cb), list);
 	if (!cb) {
 		dev->iamthif_state = MEI_IAMTHIF_IDLE;
-		dev->iamthif_fp = NULL;
+		cl->fp = NULL;
 		return 0;
 	}
 
 	list_del_init(&cb->list);
 	dev->iamthif_state = MEI_IAMTHIF_WRITING;
-	dev->iamthif_fp = cb->fp;
+	cl->fp = cb->fp;
 
 	ret = mei_cl_write(cl, cb, false);
 	if (ret < 0)
@@ -375,7 +375,7 @@ void mei_amthif_complete(struct mei_cl *cl, struct mei_cl_cb *cb)
 			return;
 		}
 		dev->iamthif_state = MEI_IAMTHIF_IDLE;
-		dev->iamthif_fp = NULL;
+		cl->fp = NULL;
 		if (!dev->iamthif_canceled) {
 			/*
 			 * in case of error enqueue the write cb to complete
@@ -453,11 +453,12 @@ static void mei_clear_lists(struct mei_device *dev, const struct file *file)
 */
 int mei_amthif_release(struct mei_device *dev, struct file *file)
 {
+	struct mei_cl *cl = file->private_data;
+
 	if (dev->iamthif_open_count > 0)
 		dev->iamthif_open_count--;
 
-	if (dev->iamthif_fp == file &&
-	    dev->iamthif_state != MEI_IAMTHIF_IDLE) {
+	if (cl->fp == file && dev->iamthif_state != MEI_IAMTHIF_IDLE) {
 
 		dev_dbg(dev->dev, "amthif canceled iamthif state %d\n",
 		    dev->iamthif_state);
diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c
index 412229e7bb7c..8b5e4b4c4c15 100644
--- a/drivers/misc/mei/interrupt.c
+++ b/drivers/misc/mei/interrupt.c
@@ -516,7 +516,6 @@ void mei_timer(struct work_struct *work)
 			dev_err(dev->dev, "timer: amthif  hanged.\n");
 			mei_reset(dev);
 
-			dev->iamthif_fp = NULL;
 			mei_amthif_run_next_cmd(dev);
 		}
 	}
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index d62e89c80beb..d7ef5edf044a 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -71,6 +71,7 @@ static int mei_open(struct inode *inode, struct file *file)
 		goto err_unlock;
 	}
 
+	cl->fp = file;
 	file->private_data = cl;
 
 	mutex_unlock(&dev->device_lock);
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h
index d7b68063ace1..aaefbc87c2fc 100644
--- a/drivers/misc/mei/mei_dev.h
+++ b/drivers/misc/mei/mei_dev.h
@@ -200,6 +200,7 @@ struct mei_cl_cb {
  * @ev_async: event async notification
  * @status: connection status
  * @me_cl: fw client connected
+ * @fp: file associated with client
  * @host_client_id: host id
  * @mei_flow_ctrl_creds: transmit flow credentials
  * @timer_count:  watchdog timer for operation completion
@@ -223,6 +224,7 @@ struct mei_cl {
 	struct fasync_struct *ev_async;
 	int status;
 	struct mei_me_client *me_cl;
+	const struct file *fp;
 	u8 host_client_id;
 	u8 mei_flow_ctrl_creds;
 	u8 timer_count;
@@ -398,7 +400,6 @@ const char *mei_pg_state_str(enum mei_pg_state state);
  * @override_fixed_address: force allow fixed address behavior
  *
  * @amthif_cmd_list : amthif list for cmd waiting
- * @iamthif_fp : file for current amthif operation
  * @iamthif_cl  : amthif host client
  * @iamthif_open_count : number of opened amthif connections
  * @iamthif_stall_timer : timer to detect amthif hang
@@ -481,8 +482,6 @@ struct mei_device {
 
 	/* amthif list for cmd waiting */
 	struct mei_cl_cb amthif_cmd_list;
-	/* driver managed amthif list for reading completed amthif cmd data */
-	const struct file *iamthif_fp;
 	struct mei_cl iamthif_cl;
 	long iamthif_open_count;
 	u32 iamthif_stall_timer;
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [char-misc-next 7/8] mei: add read callback on demand for fixed_address clients
  2016-06-16 14:58 [char-misc-next 1/8] mei: recover after errors in runtime pm flow Tomas Winkler
                   ` (4 preceding siblings ...)
  2016-06-16 14:58 ` [char-misc-next 6/8] mei: add file pointer to the host client structure Tomas Winkler
@ 2016-06-16 14:58 ` Tomas Winkler
  2016-06-16 14:58 ` [char-misc-next 8/8] mei: amthif: drop mei_clear_lists function Tomas Winkler
  6 siblings, 0 replies; 9+ messages in thread
From: Tomas Winkler @ 2016-06-16 14:58 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Alexander Usyskin, linux-kernel, Tomas Winkler

From: Alexander Usyskin <alexander.usyskin@intel.com>

The Fixed address clients do not work with the flow control, and the
packet RX callback was allocated upon TX with anticipation of a
following RX. This won't work if the clients with unsolicited Rx. Rather
than preparing read callback upon a write we allocate one directly on
the reciev path if one doesn't exists.

Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/client.c    | 15 ++++-----------
 drivers/misc/mei/interrupt.c | 10 ++++++++--
 2 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c
index 6658917be64f..2a09db86e50e 100644
--- a/drivers/misc/mei/client.c
+++ b/drivers/misc/mei/client.c
@@ -1145,26 +1145,19 @@ err:
  * mei_cl_flow_ctrl_creds - checks flow_control credits for cl.
  *
  * @cl: host client
- * @fp: the file pointer associated with the pointer
  *
  * Return: 1 if mei_flow_ctrl_creds >0, 0 - otherwise.
  */
-static int mei_cl_flow_ctrl_creds(struct mei_cl *cl, const struct file *fp)
+static int mei_cl_flow_ctrl_creds(struct mei_cl *cl)
 {
-	int rets;
-
 	if (WARN_ON(!cl || !cl->me_cl))
 		return -EINVAL;
 
 	if (cl->mei_flow_ctrl_creds > 0)
 		return 1;
 
-	if (mei_cl_is_fixed_address(cl)) {
-		rets = mei_cl_read_start(cl, mei_cl_mtu(cl), fp);
-		if (rets && rets != -EBUSY)
-			return rets;
+	if (mei_cl_is_fixed_address(cl))
 		return 1;
-	}
 
 	if (mei_cl_is_single_recv_buf(cl)) {
 		if (cl->me_cl->mei_flow_ctrl_creds > 0)
@@ -1537,7 +1530,7 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
 
 	first_chunk = cb->buf_idx == 0;
 
-	rets = first_chunk ? mei_cl_flow_ctrl_creds(cl, cb->fp) : 1;
+	rets = first_chunk ? mei_cl_flow_ctrl_creds(cl) : 1;
 	if (rets < 0)
 		return rets;
 
@@ -1643,7 +1636,7 @@ int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking)
 	mei_hdr.msg_complete = 0;
 	mei_hdr.internal = cb->internal;
 
-	rets = mei_cl_flow_ctrl_creds(cl, cb->fp);
+	rets = mei_cl_flow_ctrl_creds(cl);
 	if (rets < 0)
 		goto err;
 
diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c
index 8b5e4b4c4c15..44ba90140725 100644
--- a/drivers/misc/mei/interrupt.c
+++ b/drivers/misc/mei/interrupt.c
@@ -107,8 +107,14 @@ int mei_cl_irq_read_msg(struct mei_cl *cl,
 
 	cb = list_first_entry_or_null(&cl->rd_pending, struct mei_cl_cb, list);
 	if (!cb) {
-		cl_err(dev, cl, "pending read cb not found\n");
-		goto out;
+		if (!mei_cl_is_fixed_address(cl)) {
+			cl_err(dev, cl, "pending read cb not found\n");
+			goto out;
+		}
+		cb = mei_cl_alloc_cb(cl, mei_cl_mtu(cl), MEI_FOP_READ, cl->fp);
+		if (!cb)
+			goto out;
+		list_add_tail(&cb->list, &cl->rd_pending);
 	}
 
 	if (!mei_cl_is_connected(cl)) {
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [char-misc-next 8/8] mei: amthif: drop mei_clear_lists function
  2016-06-16 14:58 [char-misc-next 1/8] mei: recover after errors in runtime pm flow Tomas Winkler
                   ` (5 preceding siblings ...)
  2016-06-16 14:58 ` [char-misc-next 7/8] mei: add read callback on demand for fixed_address clients Tomas Winkler
@ 2016-06-16 14:58 ` Tomas Winkler
  6 siblings, 0 replies; 9+ messages in thread
From: Tomas Winkler @ 2016-06-16 14:58 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Alexander Usyskin, linux-kernel, Tomas Winkler

From: Alexander Usyskin <alexander.usyskin@intel.com>

Open code mei_clear_lists into its only caller mei_amthif_releas
and drop unused parameter 'dev' form from mei_clear_list function.

Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/amthif.c | 27 +++++----------------------
 1 file changed, 5 insertions(+), 22 deletions(-)

diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c
index 795eacf3b8b4..e7fdab724c10 100644
--- a/drivers/misc/mei/amthif.c
+++ b/drivers/misc/mei/amthif.c
@@ -408,15 +408,14 @@ void mei_amthif_complete(struct mei_cl *cl, struct mei_cl_cb *cb)
  * mei_clear_list - removes all callbacks associated with file
  *		from mei_cb_list
  *
- * @dev: device structure.
  * @file: file structure
  * @mei_cb_list: callbacks list
  *
  * mei_clear_list is called to clear resources associated with file
  * when application calls close function or Ctrl-C was pressed
  */
-static void mei_clear_list(struct mei_device *dev,
-		const struct file *file, struct list_head *mei_cb_list)
+static void mei_clear_list(const struct file *file,
+			   struct list_head *mei_cb_list)
 {
 	struct mei_cl_cb *cb, *next;
 
@@ -426,24 +425,6 @@ static void mei_clear_list(struct mei_device *dev,
 }
 
 /**
- * mei_clear_lists - removes all callbacks associated with file
- *
- * @dev: device structure
- * @file: file structure
- *
- * mei_clear_lists is called to clear resources associated with file
- * when application calls close function or Ctrl-C was pressed
- */
-static void mei_clear_lists(struct mei_device *dev, const struct file *file)
-{
-	struct mei_cl *cl = &dev->iamthif_cl;
-
-	mei_clear_list(dev, file, &dev->amthif_cmd_list.list);
-	mei_clear_list(dev, file, &cl->rd_completed);
-	mei_clear_list(dev, file, &dev->ctrl_rd_list.list);
-}
-
-/**
 * mei_amthif_release - the release function
 *
 *  @dev: device structure
@@ -465,7 +446,9 @@ int mei_amthif_release(struct mei_device *dev, struct file *file)
 		dev->iamthif_canceled = true;
 	}
 
-	mei_clear_lists(dev, file);
+	mei_clear_list(file, &dev->amthif_cmd_list.list);
+	mei_clear_list(file, &cl->rd_completed);
+	mei_clear_list(file, &dev->ctrl_rd_list.list);
 
 	return 0;
 }
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [char-misc-next v2 4/8] mei: fix return value on disconnection
  2016-06-16 14:58 ` [char-misc-next 4/8] mei: fix return value on disconnection Tomas Winkler
@ 2016-06-22 21:25   ` Tomas Winkler
  0 siblings, 0 replies; 9+ messages in thread
From: Tomas Winkler @ 2016-06-22 21:25 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Alexander Usyskin, linux-kernel, Tomas Winkler, stable

Correct errno on client disconnection is -ENODEV not -EBUSY

Cc: <stable@vger.kernel.org> #4.3+
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
---
V2: fix the same issue also in amthif.c

 drivers/misc/mei/amthif.c | 2 +-
 drivers/misc/mei/bus.c    | 2 +-
 drivers/misc/mei/main.c   | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c
index 14b454143c81..3cf54ca051ea 100644
--- a/drivers/misc/mei/amthif.c
+++ b/drivers/misc/mei/amthif.c
@@ -132,7 +132,7 @@ int mei_amthif_read(struct mei_device *dev, struct file *file,
 			return -ERESTARTSYS;
 
 		if (!mei_cl_is_connected(cl)) {
-			rets = -EBUSY;
+			rets = -ENODEV;
 			goto out;
 		}
 
diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c
index 63411ddfb83d..9c404dc8eada 100644
--- a/drivers/misc/mei/bus.c
+++ b/drivers/misc/mei/bus.c
@@ -143,7 +143,7 @@ ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length)
 		mutex_lock(&bus->device_lock);
 
 		if (!mei_cl_is_connected(cl)) {
-			rets = -EBUSY;
+			rets = -ENODEV;
 			goto out;
 		}
 	}
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index 3326bde7fba1..d62e89c80beb 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -203,7 +203,7 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
 
 		mutex_lock(&dev->device_lock);
 		if (!mei_cl_is_connected(cl)) {
-			rets = -EBUSY;
+			rets = -ENODEV;
 			goto out;
 		}
 	}
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-06-22 21:25 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-16 14:58 [char-misc-next 1/8] mei: recover after errors in runtime pm flow Tomas Winkler
2016-06-16 14:58 ` [char-misc-next 2/8] mei: hbm: add missing argument in the kdoc Tomas Winkler
2016-06-16 14:58 ` [char-misc-next 3/8] mei: drop read complete queue emptiness check Tomas Winkler
2016-06-16 14:58 ` [char-misc-next 4/8] mei: fix return value on disconnection Tomas Winkler
2016-06-22 21:25   ` [char-misc-next v2 " Tomas Winkler
2016-06-16 14:58 ` [char-misc-next 5/8] mei: move read cb to complete queue if not connected Tomas Winkler
2016-06-16 14:58 ` [char-misc-next 6/8] mei: add file pointer to the host client structure Tomas Winkler
2016-06-16 14:58 ` [char-misc-next 7/8] mei: add read callback on demand for fixed_address clients Tomas Winkler
2016-06-16 14:58 ` [char-misc-next 8/8] mei: amthif: drop mei_clear_lists function Tomas Winkler

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).