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