Exemplo n.º 1
0
static int diag_smd_write(void *ctxt, unsigned char *buf, int len)
{
	int write_len = 0;
	int retry_count = 0;
	int max_retries = 3;
	struct diag_smd_info *smd_info = NULL;

	if (!ctxt || !buf)
		return -EIO;

	smd_info = (struct diag_smd_info *)ctxt;
	if (!smd_info || !buf || len <= 0) {
		pr_err_ratelimited("diag: In %s, invalid params, smd_info: %p, buf: %p, len: %d\n",
				   __func__, smd_info, buf, len);
		return -EINVAL;
	}

	if (!smd_info->inited || !smd_info->hdl ||
	    !atomic_read(&smd_info->opened))
		return -ENODEV;

	if (len > smd_info->fifo_size)
		return diag_smd_write_ext(smd_info, buf, len);

	do {
		mutex_lock(&smd_info->lock);
		write_len = smd_write(smd_info->hdl, buf, len);
		mutex_unlock(&smd_info->lock);
		if (write_len == len)
			break;
		/*
		 * The channel maybe busy - the FIFO can be full. Retry after
		 * sometime. The value of 10000 was chosen emprically as the
		 * optimal value for the peripherals to read data from the SMD
		 * channel.
		 */
		usleep_range(10000, 10100);
		retry_count++;
	} while (retry_count < max_retries);

	DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "%s wrote to channel, write_len: %d\n",
		 smd_info->name, write_len);

	if (write_len != len)
		return -ENOMEM;

	return 0;
}
static int diag_smd_write(void *ctxt, unsigned char *buf, int len)
{
    int write_len = 0;
    int retry_count = 0;
    int max_retries = 3;
    struct diag_smd_info *smd_info = NULL;

    if (!ctxt || !buf)
        return -EIO;

    smd_info = (struct diag_smd_info *)ctxt;
    if (!smd_info || !buf || len <= 0) {
        pr_err_ratelimited("diag: In %s, invalid params, smd_info: %p, buf: %p, len: %d\n",
                           __func__, smd_info, buf, len);
        return -EINVAL;
    }

    if (!smd_info->inited || !smd_info->hdl ||
            !atomic_read(&smd_info->opened))
        return -ENODEV;

    if (len > smd_info->fifo_size)
        return diag_smd_write_ext(smd_info, buf, len);

    do {
        mutex_lock(&smd_info->lock);
        write_len = smd_write(smd_info->hdl, buf, len);
        mutex_unlock(&smd_info->lock);
        if (write_len == len)
            break;
        usleep_range(10000, 10100);
        retry_count++;
    } while (retry_count < max_retries);

    DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "%s wrote to channel, write_len: %d\n",
             smd_info->name, write_len);

    if (write_len != len)
        return -ENOMEM;

    return 0;
}