Пример #1
0
static int rain_cec_adap_transmit(struct cec_adapter *adap, u8 attempts,
				    u32 signal_free_time, struct cec_msg *msg)
{
	struct rain *rain = cec_get_drvdata(adap);
	char cmd[2 * CEC_MAX_MSG_SIZE + 16];
	unsigned int i;
	int err;

	if (msg->len == 1) {
		snprintf(cmd, sizeof(cmd), "x%x", cec_msg_destination(msg));
	} else {
		char hex[3];

		snprintf(cmd, sizeof(cmd), "x%x %02x ",
			 cec_msg_destination(msg), msg->msg[1]);
		for (i = 2; i < msg->len; i++) {
			snprintf(hex, sizeof(hex), "%02x", msg->msg[i]);
			strlcat(cmd, hex, sizeof(cmd));
		}
	}
	mutex_lock(&rain->write_lock);
	err = rain_send(rain, cmd);
	mutex_unlock(&rain->write_lock);
	return err;
}
Пример #2
0
static int rain_send_and_wait(struct rain *rain,
			      const char *cmd, const char *reply)
{
	int err;

	init_completion(&rain->cmd_done);

	mutex_lock(&rain->write_lock);
	err = rain_send(rain, cmd);
	if (err)
		goto err;

	if (!wait_for_completion_timeout(&rain->cmd_done, HZ)) {
		err = -ETIMEDOUT;
		goto err;
	}
	if (reply && strncmp(rain->cmd_reply, reply, strlen(reply))) {
		dev_dbg(rain->dev,
			 "transmit of '%s': received '%s' instead of '%s'\n",
			 cmd, rain->cmd_reply, reply);
		err = -EIO;
	}
err:
	mutex_unlock(&rain->write_lock);
	return err;
}
Пример #3
0
void
tcpsvr_notifyconnect(tcpsvr_t * svr,tcpclient_t * cli)
{
	struct rainMsg msg;
	msg.data = &cli->id;
	msg.sz = sizeof(cli->id);
	msg.type = CONNECT;
	rain_send(svr->ctx,svr->watchdog,msg,RAIN_COPY,NULL);
}
Пример #4
0
void
tcpsvr_notifyclose(tcpsvr_t * svr,tcpclient_t * cli)
{
	struct rainMsg msg;
	msg.data = &cli->id;
	msg.sz = sizeof(cli->id);
	msg.type = CLOSE;
	rain_send(svr->ctx,svr->watchdog,msg,RAIN_COPY,NULL);
	tcpclient_destroy(cli);
}
Пример #5
0
void
tcpsvr_notifyread(tcpsvr_t * svr,tcpclient_t * cli ,void *buf,int sz)
{
	svr->all_recv += sz-4;
	struct rainMsg msg;
	msg.data = buf;
	msg.sz = sz;
	msg.type = MESSAGE;
	rain_send(svr->ctx,svr->watchdog,msg,RAIN_NOCOPY,NULL);
}
Пример #6
0
void
tcpsvr_notifyerror(tcpsvr_t *svr,tcpclient_t *cli)
{
	svr->num_cli -- ;
	struct rainMsg msg;
	msg.data = &cli->id;
	msg.sz = sizeof(cli->id);
	msg.type = ERROR;
	rain_send(svr->ctx,svr->watchdog,msg,RAIN_COPY,NULL);
	svr->num_cli -- ;
	cli->binuse = false;
}