Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff1586a7 authored by Alexander Usyskin's avatar Alexander Usyskin Committed by Greg Kroah-Hartman
Browse files

mei: enqueue consecutive reads



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: default avatarAlexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3030dc05
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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);

+19 −20
Original line number Diff line number Diff line
@@ -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,20 +176,24 @@ 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) {
	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,
@@ -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;
	}
	} while (!cb);

copy_buffer:
	/* now copy the data to user space */