Commit 3e11a00d authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'rpmsg-3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/ohad/rpmsg

Pull rpmsg changes from Ohad Ben-Cohen:
 "A small pull request consisting of:

   - Make rpmsg process all pending messages instead of just one, from
     Robert Tivy

   - Fix Kconfig dependency on VIRTUALIZATION, from Suman.

     Note: this was submitted late during the 3.9 rc cycle and it seemed
     appropriate to wait with it for the merge window.

   - Belated addition of an rpmsg entry to the MAINTAINERS file.  People
     seem to look for this"

* tag 'rpmsg-3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/ohad/rpmsg:
  rpmsg: fix kconfig dependencies for VIRTIO
  MAINTAINERS: add rpmsg entry
  rpmsg: process _all_ pending messages in rpmsg_recv_done
parents c807b173 397944df
...@@ -6716,6 +6716,14 @@ F: drivers/remoteproc/ ...@@ -6716,6 +6716,14 @@ F: drivers/remoteproc/
F: Documentation/remoteproc.txt F: Documentation/remoteproc.txt
F: include/linux/remoteproc.h F: include/linux/remoteproc.h
REMOTE PROCESSOR MESSAGING (RPMSG) SUBSYSTEM
M: Ohad Ben-Cohen <ohad@wizery.com>
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ohad/rpmsg.git
S: Maintained
F: drivers/rpmsg/
F: Documentation/rpmsg.txt
F: include/linux/rpmsg.h
RFKILL RFKILL
M: Johannes Berg <johannes@sipsolutions.net> M: Johannes Berg <johannes@sipsolutions.net>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
......
...@@ -4,5 +4,6 @@ menu "Rpmsg drivers" ...@@ -4,5 +4,6 @@ menu "Rpmsg drivers"
config RPMSG config RPMSG
tristate tristate
select VIRTIO select VIRTIO
select VIRTUALIZATION
endmenu endmenu
...@@ -776,23 +776,13 @@ int rpmsg_send_offchannel_raw(struct rpmsg_channel *rpdev, u32 src, u32 dst, ...@@ -776,23 +776,13 @@ int rpmsg_send_offchannel_raw(struct rpmsg_channel *rpdev, u32 src, u32 dst,
} }
EXPORT_SYMBOL(rpmsg_send_offchannel_raw); EXPORT_SYMBOL(rpmsg_send_offchannel_raw);
/* called when an rx buffer is used, and it's time to digest a message */ static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev,
static void rpmsg_recv_done(struct virtqueue *rvq) struct rpmsg_hdr *msg, unsigned int len)
{ {
struct rpmsg_hdr *msg;
unsigned int len;
struct rpmsg_endpoint *ept; struct rpmsg_endpoint *ept;
struct scatterlist sg; struct scatterlist sg;
struct virtproc_info *vrp = rvq->vdev->priv;
struct device *dev = &rvq->vdev->dev;
int err; int err;
msg = virtqueue_get_buf(rvq, &len);
if (!msg) {
dev_err(dev, "uhm, incoming signal, but no used buffer ?\n");
return;
}
dev_dbg(dev, "From: 0x%x, To: 0x%x, Len: %d, Flags: %d, Reserved: %d\n", dev_dbg(dev, "From: 0x%x, To: 0x%x, Len: %d, Flags: %d, Reserved: %d\n",
msg->src, msg->dst, msg->len, msg->src, msg->dst, msg->len,
msg->flags, msg->reserved); msg->flags, msg->reserved);
...@@ -806,7 +796,7 @@ static void rpmsg_recv_done(struct virtqueue *rvq) ...@@ -806,7 +796,7 @@ static void rpmsg_recv_done(struct virtqueue *rvq)
if (len > RPMSG_BUF_SIZE || if (len > RPMSG_BUF_SIZE ||
msg->len > (len - sizeof(struct rpmsg_hdr))) { msg->len > (len - sizeof(struct rpmsg_hdr))) {
dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, msg->len); dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, msg->len);
return; return -EINVAL;
} }
/* use the dst addr to fetch the callback of the appropriate user */ /* use the dst addr to fetch the callback of the appropriate user */
...@@ -842,11 +832,42 @@ static void rpmsg_recv_done(struct virtqueue *rvq) ...@@ -842,11 +832,42 @@ static void rpmsg_recv_done(struct virtqueue *rvq)
err = virtqueue_add_inbuf(vrp->rvq, &sg, 1, msg, GFP_KERNEL); err = virtqueue_add_inbuf(vrp->rvq, &sg, 1, msg, GFP_KERNEL);
if (err < 0) { if (err < 0) {
dev_err(dev, "failed to add a virtqueue buffer: %d\n", err); dev_err(dev, "failed to add a virtqueue buffer: %d\n", err);
return err;
}
return 0;
}
/* called when an rx buffer is used, and it's time to digest a message */
static void rpmsg_recv_done(struct virtqueue *rvq)
{
struct virtproc_info *vrp = rvq->vdev->priv;
struct device *dev = &rvq->vdev->dev;
struct rpmsg_hdr *msg;
unsigned int len, msgs_received = 0;
int err;
msg = virtqueue_get_buf(rvq, &len);
if (!msg) {
dev_err(dev, "uhm, incoming signal, but no used buffer ?\n");
return; return;
} }
while (msg) {
err = rpmsg_recv_single(vrp, dev, msg, len);
if (err)
break;
msgs_received++;
msg = virtqueue_get_buf(rvq, &len);
};
dev_dbg(dev, "Received %u messages\n", msgs_received);
/* tell the remote processor we added another available rx buffer */ /* tell the remote processor we added another available rx buffer */
virtqueue_kick(vrp->rvq); if (msgs_received)
virtqueue_kick(vrp->rvq);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment