Skip to content

Commit

Permalink
mei: enqueue consecutive reads
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Tomas Winkler <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
ausyskin authored and gregkh committed Aug 30, 2016
1 parent 3030dc0 commit ff1586a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 20 deletions.
3 changes: 3 additions & 0 deletions drivers/misc/mei/interrupt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
39 changes: 19 additions & 20 deletions drivers/misc/mei/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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 */
Expand Down

0 comments on commit ff1586a

Please sign in to comment.