コード例 #1
0
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;
}
コード例 #2
0
void escore_slim_get_logical_addr(struct escore_priv *escore)
{
	do {
		slim_get_logical_addr(escore->gen0_client,
				      escore->gen0_client->e_addr,
				      6, &(escore->gen0_client->laddr));
		usleep_range(1000, 2000);
	} while (escore->gen0_client->laddr == 0xf0);
	dev_dbg(&escore->gen0_client->dev,
		"%s(): gen0_client LA = %d\n",
		 __func__, escore->gen0_client->laddr);
}
コード例 #3
0
static int es705_fw_thread(void *priv)
{
	struct es705_priv *es705 = (struct es705_priv  *)priv;

	do {
		slim_get_logical_addr(es705->gen0_client,
				      es705->gen0_client->e_addr,
				      6, &(es705->gen0_client->laddr));
		usleep_range(1000, 2000);
	} while (es705->gen0_client->laddr == 0xf0);
	dev_dbg(&es705->gen0_client->dev, "%s(): gen0_client LA = %d\n",
		__func__, es705->gen0_client->laddr);
	do {
		slim_get_logical_addr(es705->intf_client,
				      es705->intf_client->e_addr,
				      6, &(es705->intf_client->laddr));
		usleep_range(1000, 2000);
	} while (es705->intf_client->laddr == 0xf0);
	dev_dbg(&es705->intf_client->dev, "%s(): intf_client LA = %d\n",
		__func__, es705->intf_client->laddr);

	es705_slim_device_up(es705->gen0_client);
	return 0;
}
コード例 #4
0
int escore_slim_read(struct escore_priv *escore, void *buf, int len)
{
	int retry = MAX_SMB_TRIALS;
	int rc;
	struct slim_device *sbdev = escore->gen0_client;
	DECLARE_COMPLETION_ONSTACK(read_done);
	struct slim_ele_access msg = {
		.start_offset = ES_READ_VE_OFFSET,
		.num_bytes = ES_READ_VE_WIDTH,
		.comp = NULL,
	};

	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_request_val_element(sbdev, &msg, buf, len);
		if (rc != 0)
			dev_warn(&sbdev->dev,
				"%s: Warnning read 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 read failed rc=%d after %d retries\n",
			__func__, rc, MAX_SMB_TRIALS);

	return rc;
}