facetimehd: change fthd_channel_ringbuf_send() error handling

In the current implementation it returns -1 on error, an offset value
otherwise. Change it to return a negative error value, and add a pointer
to an u32 for receiving the entry offset as an extra argument.

This makes the ugly (u32)-1 return code comparision obsolete, and we
can return a more detailed error code like EAGAIN if all ringbuffer slots
are busy.
This commit is contained in:
Sven Schnelle
2015-11-28 21:18:22 +01:00
parent 2ff298739a
commit aebaf60c07
5 changed files with 45 additions and 20 deletions

View File

@@ -104,6 +104,7 @@ static void sharedmalloc_handler(struct fthd_private *dev_priv,
{
u32 request_size, response_size, address;
struct isp_mem_obj *obj;
int ret;
request_size = FTHD_S2_MEM_READ(entry + FTHD_RINGBUF_REQUEST_SIZE);
response_size = FTHD_S2_MEM_READ(entry + FTHD_RINGBUF_RESPONSE_SIZE);
@@ -114,7 +115,9 @@ static void sharedmalloc_handler(struct fthd_private *dev_priv,
FTHD_S2_MEMCPY_FROMIO(&obj, address - 64, sizeof(obj));
isp_mem_destroy(obj);
fthd_channel_ringbuf_send(dev_priv, chan, 0, 0, 0);
ret = fthd_channel_ringbuf_send(dev_priv, chan, 0, 0, 0, NULL);
if (ret)
pr_err("%s: fthd_channel_ringbuf_send: %d\n", __FUNCTION__, ret);
} else {
if (!request_size)
return;
@@ -126,7 +129,10 @@ static void sharedmalloc_handler(struct fthd_private *dev_priv,
response_size >> 24,response_size >> 16,
response_size >> 8, response_size);
FTHD_S2_MEMCPY_TOIO(obj->offset, &obj, sizeof(obj));
fthd_channel_ringbuf_send(dev_priv, chan, obj->offset + 64, 0, 0);
ret = fthd_channel_ringbuf_send(dev_priv, chan, obj->offset + 64, 0, 0, NULL);
if (ret)
pr_err("%s: fthd_channel_ringbuf_send: %d\n", __FUNCTION__, ret);
}
}
@@ -157,7 +163,7 @@ static void buf_t2h_handler(struct fthd_private *dev_priv,
u32 entry)
{
u32 request_size, response_size, address;
int ret;
request_size = FTHD_S2_MEM_READ(entry + FTHD_RINGBUF_REQUEST_SIZE);
response_size = FTHD_S2_MEM_READ(entry + FTHD_RINGBUF_RESPONSE_SIZE);
address = FTHD_S2_MEM_READ(entry + FTHD_RINGBUF_ADDRESS_FLAGS);
@@ -167,15 +173,21 @@ static void buf_t2h_handler(struct fthd_private *dev_priv,
fthd_buffer_return_handler(dev_priv, address & ~3, request_size);
fthd_channel_ringbuf_send(dev_priv, chan, (response_size & 0x10000000) ? address : 0,
0, 0x80000000);
ret = fthd_channel_ringbuf_send(dev_priv, chan, (response_size & 0x10000000) ? address : 0,
0, 0x80000000, NULL);
if (ret)
pr_err("%s: fthd_channel_ringbuf_send: %d\n", __FUNCTION__, ret);
}
static void io_t2h_handler(struct fthd_private *dev_priv,
struct fw_channel *chan,
u32 entry)
{
fthd_channel_ringbuf_send(dev_priv, chan, 0, 0, 0);
int ret = fthd_channel_ringbuf_send(dev_priv, chan, 0, 0, 0, NULL);
if (ret)
pr_err("%s: fthd_channel_ringbuf_send: %d\n", __FUNCTION__, ret);
}
static void buf_h2t_handler(struct fthd_private *dev_priv,
@@ -188,6 +200,7 @@ static void buf_h2t_handler(struct fthd_private *dev_priv,
static void fthd_handle_irq(struct fthd_private *dev_priv, struct fw_channel *chan)
{
u32 entry;
int ret;
while((entry = fthd_channel_ringbuf_receive(dev_priv, chan)) != (u32)-1) {
pr_debug("channel %s: message available, address %08x\n", chan->name, FTHD_S2_MEM_READ(entry + FTHD_RINGBUF_ADDRESS_FLAGS));
@@ -195,7 +208,9 @@ static void fthd_handle_irq(struct fthd_private *dev_priv, struct fw_channel *ch
sharedmalloc_handler(dev_priv, chan, entry);
} else if (chan == dev_priv->channel_terminal) {
terminal_handler(dev_priv, chan, entry);
fthd_channel_ringbuf_send(dev_priv, chan, 0, 0, 0);
ret = fthd_channel_ringbuf_send(dev_priv, chan, 0, 0, 0, NULL);
if (ret)
pr_err("%s: fthd_channel_ringbuf_send: %d\n", __FUNCTION__, ret);
} else if (chan == dev_priv->channel_buf_t2h) {
buf_t2h_handler(dev_priv, chan, entry);
} else if (chan == dev_priv->channel_io) {