コード例 #1
0
ファイル: vivid-cec.c プロジェクト: ChineseDr/linux
static void vivid_cec_xfer_done_worker(struct work_struct *work)
{
	struct vivid_cec_work *cw =
		container_of(work, struct vivid_cec_work, work.work);
	struct vivid_dev *dev = cw->dev;
	struct cec_adapter *adap = cw->adap;
	u8 dest = cec_msg_destination(&cw->msg);
	bool valid_dest;
	unsigned int i;

	valid_dest = cec_msg_is_broadcast(&cw->msg);
	if (!valid_dest)
		valid_dest = vivid_cec_find_dest_adap(dev, adap, dest);

	cw->tx_status = valid_dest ? CEC_TX_STATUS_OK : CEC_TX_STATUS_NACK;
	spin_lock(&dev->cec_slock);
	dev->cec_xfer_time_jiffies = 0;
	dev->cec_xfer_start_jiffies = 0;
	list_del(&cw->list);
	spin_unlock(&dev->cec_slock);
	cec_transmit_done(cw->adap, cw->tx_status, 0, valid_dest ? 0 : 1, 0, 0);

	/* Broadcast message */
	if (adap != dev->cec_rx_adap)
		cec_received_msg(dev->cec_rx_adap, &cw->msg);
	for (i = 0; i < MAX_OUTPUTS && dev->cec_tx_adap[i]; i++)
		if (adap != dev->cec_tx_adap[i])
			cec_received_msg(dev->cec_tx_adap[i], &cw->msg);
	kfree(cw);
}
コード例 #2
0
static void vivid_cec_xfer_done_worker(struct work_struct *work)
{
	struct vivid_cec_work *cw =
		container_of(work, struct vivid_cec_work, work.work);
	struct vivid_dev *dev = cw->dev;
	struct cec_adapter *adap = cw->adap;
	bool is_poll = cw->msg.len == 1;
	u8 dest = cec_msg_destination(&cw->msg);
	struct cec_adapter *dest_adap = NULL;
	bool valid_dest;
	unsigned int i;

	valid_dest = cec_msg_is_broadcast(&cw->msg);
	if (!valid_dest) {
		dest_adap = vivid_cec_find_dest_adap(dev, adap, dest);
		if (dest_adap)
			valid_dest = true;
	}
	cw->tx_status = valid_dest ? CEC_TX_STATUS_OK : CEC_TX_STATUS_NACK;
	spin_lock(&dev->cec_slock);
	dev->cec_xfer_time_jiffies = 0;
	dev->cec_xfer_start_jiffies = 0;
	list_del(&cw->list);
	spin_unlock(&dev->cec_slock);
	cec_transmit_done(cw->adap, cw->tx_status, 0, valid_dest ? 0 : 1, 0, 0);

	if (!is_poll && dest_adap) {
		/* Directed message */
		cec_received_msg(dest_adap, &cw->msg);
	} else if (!is_poll && valid_dest) {
		/* Broadcast message */
		if (adap != dev->cec_rx_adap &&
		    dev->cec_rx_adap->log_addrs.log_addr_mask)
			cec_received_msg(dev->cec_rx_adap, &cw->msg);
		for (i = 0; i < MAX_OUTPUTS && dev->cec_tx_adap[i]; i++) {
			if (adap == dev->cec_tx_adap[i] ||
			    !dev->cec_tx_adap[i]->log_addrs.log_addr_mask)
				continue;
			cec_received_msg(dev->cec_tx_adap[i], &cw->msg);
		}
	}
	kfree(cw);
}