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; }