Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1450080
| From | Tomas Winkler <tomas.winkler@intel.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [char-misc-next v2 6/9] mei: enqueue consecutive reads |
| Date | 2016-07-26 00:10 +0200 |
| Message-ID | <rYWev-1Uf-45@gated-at.bofh.it> (permalink) |
| References | <rYWeu-1Uf-29@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
From: Alexander Usyskin <alexander.usyskin@intel.com>
The FW supports only one pending read per host client, in order to
support issuing of consecutive reads the driver queues read requests
internally and send them to the firmware after pending one has
completed.
Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
V2: resend
drivers/misc/mei/interrupt.c | 3 +++
drivers/misc/mei/main.c | 39 +++++++++++++++++++--------------------
2 files changed, 22 insertions(+), 20 deletions(-)
diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c
index 36382d782e20..bf745e03f21e 100644
--- a/drivers/misc/mei/interrupt.c
+++ b/drivers/misc/mei/interrupt.c
@@ -209,6 +209,9 @@ static int mei_cl_irq_read(struct mei_cl *cl, struct mei_cl_cb *cb,
int slots;
int ret;
+ if (!list_empty(&cl->rd_pending))
+ return 0;
+
msg_slots = mei_data2slots(sizeof(struct hbm_flow_control));
slots = mei_hbuf_empty_slots(dev);
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index d698ba32357c..650061b6ab9b 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -139,9 +139,8 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
struct mei_cl *cl = file->private_data;
struct mei_device *dev;
struct mei_cl_cb *cb = NULL;
+ bool nonblock = !!(file->f_flags & O_NONBLOCK);
int rets;
- int err;
-
if (WARN_ON(!cl || !cl->dev))
return -ENODEV;
@@ -177,25 +176,29 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
if (*offset > 0)
*offset = 0;
- err = mei_cl_read_start(cl, length, file);
- if (err && err != -EBUSY) {
- cl_dbg(dev, cl, "mei start read failure status = %d\n", err);
- rets = err;
+ rets = mei_cl_read_start(cl, length, file);
+ if (rets && rets != -EBUSY) {
+ cl_dbg(dev, cl, "mei start read failure status = %d\n", rets);
goto out;
}
- /* synchronized under device mutex */
- if (!waitqueue_active(&cl->rx_wait)) {
- if (file->f_flags & O_NONBLOCK) {
- rets = -EAGAIN;
- goto out;
- }
+ if (nonblock) {
+ rets = -EAGAIN;
+ goto out;
+ }
+
+ if (rets == -EBUSY &&
+ !mei_cl_enqueue_ctrl_wr_cb(cl, length, MEI_FOP_READ, file)) {
+ rets = -ENOMEM;
+ goto out;
+ }
+ do {
mutex_unlock(&dev->device_lock);
if (wait_event_interruptible(cl->rx_wait,
- (!list_empty(&cl->rd_completed)) ||
- (!mei_cl_is_connected(cl)))) {
+ (!list_empty(&cl->rd_completed)) ||
+ (!mei_cl_is_connected(cl)))) {
if (signal_pending(current))
return -EINTR;
@@ -207,13 +210,9 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
rets = -ENODEV;
goto out;
}
- }
- cb = mei_cl_read_cb(cl, file);
- if (!cb) {
- rets = 0;
- goto out;
- }
+ cb = mei_cl_read_cb(cl, file);
+ } while (!cb);
copy_buffer:
/* now copy the data to user space */
--
2.7.4
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[char-misc-next v2 0/9] mei: rx enhancements Tomas Winkler <tomas.winkler@intel.com> - 2016-07-26 00:10 +0200 [char-misc-next v2 7/9] mei: amthif: drop mei_amthif_read Tomas Winkler <tomas.winkler@intel.com> - 2016-07-26 00:10 +0200 [char-misc-next v2 6/9] mei: enqueue consecutive reads Tomas Winkler <tomas.winkler@intel.com> - 2016-07-26 00:10 +0200 [char-misc-next v2 8/9] mei: drop unused file transaction states Tomas Winkler <tomas.winkler@intel.com> - 2016-07-26 00:10 +0200 [char-misc-next v2 4/9] mei: use consistent naming for TX control flow credits Tomas Winkler <tomas.winkler@intel.com> - 2016-07-26 00:10 +0200 [char-misc-next v2 9/9] mei: amthif: fix deadlock in initialization during a reset Tomas Winkler <tomas.winkler@intel.com> - 2016-07-26 00:10 +0200 [char-misc-next v2 3/9] mei: rx flow control counter Tomas Winkler <tomas.winkler@intel.com> - 2016-07-26 00:10 +0200 [char-misc-next v2 1/9] mei: drop redundant krealloc and checks in irq read Tomas Winkler <tomas.winkler@intel.com> - 2016-07-26 00:20 +0200 [char-misc-next v2 2/9] mei: prepare read cb for fixed address clients on the receive path only. Tomas Winkler <tomas.winkler@intel.com> - 2016-07-26 00:20 +0200
csiph-web