From: Samuel Ortiz <sameo@linux.intel.com>
To: gregkh@linuxfoundation.org
Cc: arnd@arndb.de, linux-kernel@vger.kernel.org,
tomas.winkler@intel.com, Samuel Ortiz <sameo@linux.intel.com>
Subject: [char-misc-next 07/12 v3] mei: bus: Synchronous API for the data transmission
Date: Tue, 12 Feb 2013 19:36:57 +0100 [thread overview]
Message-ID: <1360694222-27632-8-git-send-email-sameo@linux.intel.com> (raw)
In-Reply-To: <1360694222-27632-1-git-send-email-sameo@linux.intel.com>
Define a truly synchronous API for the bus Tx path by putting all pending
request to the write list and wait for the interrupt tx handler to wake
us up.
The ___mei_send() out path is also slightly reworked to make it look more
like main.c:mei_write().
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
drivers/misc/mei/bus.c | 38 ++++++++++++++++++++++++++++----------
drivers/misc/mei/mei_dev.h | 1 +
2 files changed, 29 insertions(+), 10 deletions(-)
diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c
index 4565e9a..85ca872 100644
--- a/drivers/misc/mei/bus.c
+++ b/drivers/misc/mei/bus.c
@@ -202,7 +202,7 @@ void mei_driver_unregister(struct mei_driver *driver)
}
EXPORT_SYMBOL_GPL(mei_driver_unregister);
-int __mei_send(struct mei_cl *cl, u8 *buf, size_t length)
+static int ___mei_send(struct mei_cl *cl, u8 *buf, size_t length, bool blocking)
{
struct mei_host *dev;
struct mei_msg_hdr mei_hdr;
@@ -253,11 +253,8 @@ int __mei_send(struct mei_cl *cl, u8 *buf, size_t length)
cb->buf_idx = 0;
mei_hdr.msg_complete = 0;
cl->writing_state = MEI_WRITING;
- list_add_tail(&cb->list, &dev->write_list.list);
-
- mutex_unlock(&dev->device_lock);
- return length;
+ goto out;
}
dev->hbuf_is_ready = false;
@@ -283,19 +280,30 @@ int __mei_send(struct mei_cl *cl, u8 *buf, size_t length)
cl->writing_state = MEI_WRITING;
cb->buf_idx = mei_hdr.length;
- if (!mei_hdr.msg_complete) {
- list_add_tail(&cb->list, &dev->write_list.list);
- } else {
+out:
+ if (mei_hdr.msg_complete) {
if (mei_cl_flow_ctrl_reduce(cl)) {
- err = -EIO;
+ err = -ENODEV;
goto out_err;
}
-
list_add_tail(&cb->list, &dev->write_waiting_list.list);
+ } else {
+ list_add_tail(&cb->list, &dev->write_list.list);
}
mutex_unlock(&dev->device_lock);
+ if (blocking && cl->writing_state != MEI_WRITE_COMPLETE) {
+ if (wait_event_interruptible(cl->tx_wait,
+ cl->writing_state == MEI_WRITE_COMPLETE)) {
+ if (signal_pending(current))
+ err = -EINTR;
+ err = -ERESTARTSYS;
+ mutex_lock(&dev->device_lock);
+ goto out_err;
+ }
+ }
+
return mei_hdr.length;
out_err:
@@ -362,6 +370,16 @@ out:
return r_length;
}
+inline int __mei_async_send(struct mei_cl *cl, u8 *buf, size_t length)
+{
+ return ___mei_send(cl, buf, length, 0);
+}
+
+inline int __mei_send(struct mei_cl *cl, u8 *buf, size_t length)
+{
+ return ___mei_send(cl, buf, length, 1);
+}
+
int mei_send(struct mei_device *device, u8 *buf, size_t length)
{
struct mei_cl *cl = device->cl;
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h
index 546cd87..fc485d4 100644
--- a/drivers/misc/mei/mei_dev.h
+++ b/drivers/misc/mei/mei_dev.h
@@ -273,6 +273,7 @@ struct mei_hw_ops {
struct mei_device *mei_add_device(struct mei_host *mei_host,
uuid_le uuid, char *name);
void mei_remove_device(struct mei_device *device);
+int __mei_async_send(struct mei_cl *cl, u8 *buf, size_t length);
int __mei_send(struct mei_cl *cl, u8 *buf, size_t length);
int __mei_recv(struct mei_cl *cl, u8 *buf, size_t length);
--
1.7.10.4
next prev parent reply other threads:[~2013-02-12 18:38 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-12 18:36 [char-misc-next 00/12 v3] Add MEI bus and NFC device Samuel Ortiz
2013-02-12 18:36 ` [char-misc-next 01/12 v3] mei: Rename mei_device to mei_host Samuel Ortiz
2013-02-12 21:17 ` Winkler, Tomas
2013-02-12 21:29 ` Samuel Ortiz
2013-02-12 21:38 ` gregkh
2013-02-12 23:09 ` Arnd Bergmann
2013-02-13 9:39 ` Samuel Ortiz
2013-02-19 13:32 ` Tomas Winkler
2013-02-20 10:57 ` Samuel Ortiz
2013-03-11 10:44 ` Samuel Ortiz
2013-03-11 13:34 ` Arnd Bergmann
2013-02-12 18:36 ` [char-misc-next 02/12 v3] mei: bus: Initial MEI bus type implementation Samuel Ortiz
2013-02-12 18:36 ` [char-misc-next 03/12 v3] mei: bus: Implement driver registration Samuel Ortiz
2013-02-12 18:36 ` [char-misc-next 04/12 v3] mei: bus: Initial implementation for I/O routines Samuel Ortiz
2013-02-12 18:36 ` [char-misc-next 05/12 v3] mei: bus: Add bus related structures to mei_cl Samuel Ortiz
2013-02-12 18:36 ` [char-misc-next 06/12 v3] mei: bus: Call bus routines from the core code Samuel Ortiz
2013-02-12 18:36 ` Samuel Ortiz [this message]
2013-02-12 18:36 ` [char-misc-next 08/12 v3] mei: bus: Implement bus driver data setter/getter Samuel Ortiz
2013-02-12 18:36 ` [char-misc-next 09/12 v3] mei: nfc: Initial nfc implementation Samuel Ortiz
2013-02-12 18:37 ` [char-misc-next 10/12 v3] mei: nfc: Connect also the regular ME client Samuel Ortiz
2013-02-12 18:37 ` [char-misc-next 11/12 v3] mei: nfc: Add NFC device to the MEI bus Samuel Ortiz
2013-02-12 18:37 ` [char-misc-next 12/12 v3] mei: nfc: Implement MEI bus IO ops Samuel Ortiz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1360694222-27632-8-git-send-email-sameo@linux.intel.com \
--to=sameo@linux.intel.com \
--cc=arnd@arndb.de \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tomas.winkler@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.