Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02eb1d9d authored by Ido Yariv's avatar Ido Yariv Committed by Luciano Coelho
Browse files

wlcore: Change read/write ops to return errors



While bus operations may fail, either due to HW or FW issues, these are
never propagated to higher layers. As a result, the core driver has no
way of knowing that the operations failed, and will only recover if high
level logic requires it (e.g. no command completion).

Change read/write bus operations to return errors to let higher layer
functionality handle these.

Signed-off-by: default avatarIdo Yariv <ido@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent b666bb7f
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ static void wl1271_sdio_set_block_size(struct device *child,
	sdio_release_host(func);
}

static void wl12xx_sdio_raw_read(struct device *child, int addr, void *buf,
static int wl12xx_sdio_raw_read(struct device *child, int addr, void *buf,
				size_t len, bool fixed)
{
	int ret;
@@ -103,11 +103,13 @@ static void wl12xx_sdio_raw_read(struct device *child, int addr, void *buf,

	sdio_release_host(func);

	if (ret)
	if (WARN_ON(ret))
		dev_err(child->parent, "sdio read failed (%d)\n", ret);

	return ret;
}

static void wl12xx_sdio_raw_write(struct device *child, int addr, void *buf,
static int wl12xx_sdio_raw_write(struct device *child, int addr, void *buf,
				 size_t len, bool fixed)
{
	int ret;
@@ -139,8 +141,10 @@ static void wl12xx_sdio_raw_write(struct device *child, int addr, void *buf,

	sdio_release_host(func);

	if (ret)
	if (WARN_ON(ret))
		dev_err(child->parent, "sdio write failed (%d)\n", ret);

	return ret;
}

static int wl12xx_sdio_power_on(struct wl12xx_sdio_glue *glue)
+9 −5
Original line number Diff line number Diff line
@@ -193,7 +193,7 @@ static int wl12xx_spi_read_busy(struct device *child)
	return -ETIMEDOUT;
}

static void wl12xx_spi_raw_read(struct device *child, int addr, void *buf,
static int wl12xx_spi_raw_read(struct device *child, int addr, void *buf,
			       size_t len, bool fixed)
{
	struct wl12xx_spi_glue *glue = dev_get_drvdata(child->parent);
@@ -238,7 +238,7 @@ static void wl12xx_spi_raw_read(struct device *child, int addr, void *buf,
		if (!(busy_buf[WL1271_BUSY_WORD_CNT - 1] & 0x1) &&
		    wl12xx_spi_read_busy(child)) {
			memset(buf, 0, chunk_len);
			return;
			return 0;
		}

		spi_message_init(&m);
@@ -256,9 +256,11 @@ static void wl12xx_spi_raw_read(struct device *child, int addr, void *buf,
		buf += chunk_len;
		len -= chunk_len;
	}

	return 0;
}

static void wl12xx_spi_raw_write(struct device *child, int addr, void *buf,
static int wl12xx_spi_raw_write(struct device *child, int addr, void *buf,
				size_t len, bool fixed)
{
	struct wl12xx_spi_glue *glue = dev_get_drvdata(child->parent);
@@ -304,6 +306,8 @@ static void wl12xx_spi_raw_write(struct device *child, int addr, void *buf,
	}

	spi_sync(to_spi_device(glue->dev), &m);

	return 0;
}

static struct wl1271_if_operations spi_ops = {
+3 −3
Original line number Diff line number Diff line
@@ -209,9 +209,9 @@ struct wl1271_scan {
};

struct wl1271_if_operations {
	void (*read)(struct device *child, int addr, void *buf, size_t len,
	int (*read)(struct device *child, int addr, void *buf, size_t len,
		    bool fixed);
	void (*write)(struct device *child, int addr, void *buf, size_t len,
	int (*write)(struct device *child, int addr, void *buf, size_t len,
		     bool fixed);
	void (*reset)(struct device *child);
	void (*init)(struct device *child);