![](https://secure.gravatar.com/avatar/5b19e9d0e834ea10ef75803718ad564b.jpg?s=120&d=mm&r=g)
On Fri, 20 Oct 2017 07:30:06 +0200, Vinod Koul wrote:
On Thu, Oct 19, 2017 at 11:13:48AM +0200, Takashi Iwai wrote:
On Thu, 19 Oct 2017 05:03:22 +0200, Vinod Koul wrote:
+/**
- sdw_transfer: Synchronous transfer message to a SDW Slave device
- @bus: SDW bus
- @slave: SDW Slave
- @msg: SDW message to be xfered
- */
+int sdw_transfer(struct sdw_bus *bus, struct sdw_slave *slave,
struct sdw_msg *msg)
+{
- bool page;
- int ret;
- mutex_lock(&bus->msg_lock);
- page = sdw_get_page(slave, msg);
- ret = do_transfer(bus, msg, page);
- if (ret != 0 && ret != -ENODATA) {
dev_err(bus->dev, "trf on Slave %d failed:%d\n",
msg->dev_num, ret);
goto error;
- }
- if (page)
ret = sdw_reset_page(bus, msg->dev_num);
+error:
- mutex_unlock(&bus->msg_lock);
- return ret;
So the logic here is that when -ENODATA is returned and page is false, this function should return -ENODATA to the caller, but when page is set, it returns 0?
Sorry no. do_transfer can succced (0) or in some case where Slaves didn't care for return error (ENODATA), or other errors. No ENODATA can be error depending on message sent so we dont treat this as failure and let caller decide.
In case of errors (others) we don't need to reset page and we bail out
Well, the question is the handling of ENODATA. Whether the function returns 0 or -ENODATA depends on page flag. If page flag is true, -ENODATA is cleared. My question was whether this behavior is intended or not.
If -ENODATA should be returned whenever it gets that from do_transfer(), the code has a potential bug there.
Takashi