Skip to content

Commit

Permalink
rpmsg: Allow callback to return errors
Browse files Browse the repository at this point in the history
Some rpmsg backends support holding on to and redelivering messages upon
failed handling of them, so provide a way for the callback to report and
error and allow the backends to handle this.

Signed-off-by: Bjorn Andersson <[email protected]>
  • Loading branch information
andersson committed Sep 9, 2016
1 parent e88dae5 commit 4b83c52
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 8 deletions.
10 changes: 6 additions & 4 deletions drivers/rpmsg/virtio_rpmsg_bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -791,8 +791,8 @@ static void rpmsg_xmit_done(struct virtqueue *svq)
}

/* invoked when a name service announcement arrives */
static void rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len,
void *priv, u32 src)
static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len,
void *priv, u32 src)
{
struct rpmsg_ns_msg *msg = data;
struct rpmsg_device *newch;
Expand All @@ -808,7 +808,7 @@ static void rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len,

if (len != sizeof(*msg)) {
dev_err(dev, "malformed ns msg (%d)\n", len);
return;
return -EINVAL;
}

/*
Expand All @@ -819,7 +819,7 @@ static void rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len,
*/
if (rpdev) {
dev_err(dev, "anomaly: ns ept has an rpdev handle\n");
return;
return -EINVAL;
}

/* don't trust the remote processor for null terminating the name */
Expand All @@ -842,6 +842,8 @@ static void rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len,
if (!newch)
dev_err(dev, "rpmsg_create_channel failed\n");
}

return 0;
}

static int rpmsg_probe(struct virtio_device *vdev)
Expand Down
4 changes: 2 additions & 2 deletions include/linux/rpmsg.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ struct rpmsg_device {
const struct rpmsg_device_ops *ops;
};

typedef void (*rpmsg_rx_cb_t)(struct rpmsg_device *, void *, int, void *, u32);
typedef int (*rpmsg_rx_cb_t)(struct rpmsg_device *, void *, int, void *, u32);

/**
* struct rpmsg_endpoint - binds a local rpmsg address to its user
Expand Down Expand Up @@ -129,7 +129,7 @@ struct rpmsg_driver {
const struct rpmsg_device_id *id_table;
int (*probe)(struct rpmsg_device *dev);
void (*remove)(struct rpmsg_device *dev);
void (*callback)(struct rpmsg_device *, void *, int, void *, u32);
int (*callback)(struct rpmsg_device *, void *, int, void *, u32);
};

int register_rpmsg_device(struct rpmsg_device *dev);
Expand Down
6 changes: 4 additions & 2 deletions samples/rpmsg/rpmsg_client_sample.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ struct instance_data {
int rx_count;
};

static void rpmsg_sample_cb(struct rpmsg_device *rpdev, void *data, int len,
static int rpmsg_sample_cb(struct rpmsg_device *rpdev, void *data, int len,
void *priv, u32 src)
{
int ret;
Expand All @@ -43,13 +43,15 @@ static void rpmsg_sample_cb(struct rpmsg_device *rpdev, void *data, int len,
/* samples should not live forever */
if (idata->rx_count >= MSG_LIMIT) {
dev_info(&rpdev->dev, "goodbye!\n");
return;
return 0;
}

/* send a new message now */
ret = rpmsg_send(rpdev->ept, MSG, strlen(MSG));
if (ret)
dev_err(&rpdev->dev, "rpmsg_send failed: %d\n", ret);

return 0;
}

static int rpmsg_sample_probe(struct rpmsg_device *rpdev)
Expand Down

0 comments on commit 4b83c52

Please sign in to comment.