int escore_slim_write(struct escore_priv *escore, const void *buf, int len)
{
	int retry = MAX_SMB_TRIALS;
	int rc;
	int wr;
	struct slim_device *sbdev = escore->gen0_client;
	struct slim_ele_access msg = {
		.start_offset = ES_WRITE_VE_OFFSET,
		.num_bytes = ES_WRITE_VE_WIDTH,
		.comp = NULL,
	};

	BUG_ON(len < 0);

	rc = wr = 0;
	while (wr < len) {
		int sz = min(len - wr, ES_WRITE_VE_WIDTH);

		/* As long as the caller expects the most significant
		 * bytes of the VE value written to be zero, this is
		 * valid.
		 */
		if (sz < ES_WRITE_VE_WIDTH)
			dev_dbg(&sbdev->dev,
				"write smaller than VE size %d < %d\n",
				sz, ES_WRITE_VE_WIDTH);
		rc = slim_get_logical_addr(sbdev,
				escore->gen0_client->e_addr,
				6, &(escore->gen0_client->laddr));
		if (rc)
			dev_err(&sbdev->dev,
				"%s(): get logical addr err %d\n",
				__func__, rc);

		do {
			rc = slim_change_val_element(sbdev, &msg, buf + wr, sz);
			if (rc != 0)
				dev_warn(&sbdev->dev,
					"%s: Warnning write failed rc=%d\n",
					__func__, rc);
			else
				break;
			usleep_range(SMB_DELAY, SMB_DELAY);
		} while (--retry);

		if (rc != 0) {
			dev_err(&sbdev->dev,
			"%s: Error write failed rc=%d after %d retries\n",
			__func__, rc, MAX_SMB_TRIALS);
			break;
		}
		wr += sz;
	}

	return rc;
}
static int es705_slim_write(struct es705_priv *es705,
				const void *buf, int len)
{
	struct slim_device *sbdev = es705->gen0_client;
	int rc = 0;
	int wr = 0;

	struct slim_ele_access msg = {
		.start_offset = ES705_WRITE_VE_OFFSET,
		.num_bytes = ES705_WRITE_VE_WIDTH,
		.comp = NULL,
	};

	BUG_ON(len < 0);

	while (wr < len) {
		int i;
		int sz = min(len - wr, ES705_WRITE_VE_WIDTH);

		/*
		 * As long as the caller expects the most significant
		 * bytes of the VE value written to be zero, this is
		 * valid.
		 */

		for (i = 0; i < MAX_SMB_TRIALS; i++) {
			if (sz < ES705_WRITE_VE_WIDTH)
				dev_dbg(&sbdev->dev,
					"%s(): write smaller than VE size %d < %d\n",
					__func__, sz, ES705_WRITE_VE_WIDTH);

			rc = slim_change_val_element(sbdev, &msg,
						(char *)buf + wr, sz);
			if (!rc)
				break;
			usleep_range(SMB_DELAY, SMB_DELAY);
		}
		if (i == MAX_SMB_TRIALS) {
			dev_err(&sbdev->dev, "%s(): reach MAX_TRIALS (%d)\n",
				__func__, MAX_SMB_TRIALS);
			break;
		}
		wr += sz;
	}
	return rc;
}