| 43 | }; |
| 44 | |
| 45 | static void virtio_console_send_ctrl(struct virtio_console_device *virtio_console_dev, |
| 46 | struct virtio_console_control *ctrl) |
| 47 | { |
| 48 | rt_uint16_t id; |
| 49 | struct virtio_device *virtio_dev = &virtio_console_dev->virtio_dev; |
| 50 | struct virtq *queue_ctrl_tx; |
| 51 | |
| 52 | #ifdef RT_USING_SMP |
| 53 | rt_base_t level = rt_spin_lock_irqsave(&virtio_dev->spinlock); |
| 54 | #endif |
| 55 | |
| 56 | queue_ctrl_tx = &virtio_dev->queues[VIRTIO_CONSOLE_QUEUE_CTRL_TX]; |
| 57 | |
| 58 | id = queue_ctrl_tx->avail->idx % queue_ctrl_tx->num; |
| 59 | |
| 60 | rt_memcpy(&virtio_console_dev->info[id].tx_ctrl, ctrl, sizeof(struct virtio_console_control)); |
| 61 | |
| 62 | virtio_free_desc(virtio_dev, VIRTIO_CONSOLE_QUEUE_CTRL_TX, id); |
| 63 | |
| 64 | virtio_fill_desc(virtio_dev, VIRTIO_CONSOLE_QUEUE_CTRL_TX, id, |
| 65 | virtio_console_dev->info[id].tx_ctrl_paddr, sizeof(struct virtio_console_control), 0, 0); |
| 66 | |
| 67 | virtio_submit_chain(virtio_dev, VIRTIO_CONSOLE_QUEUE_CTRL_TX, id); |
| 68 | |
| 69 | virtio_queue_notify(virtio_dev, VIRTIO_CONSOLE_QUEUE_CTRL_TX); |
| 70 | |
| 71 | virtio_alloc_desc(virtio_dev, VIRTIO_CONSOLE_QUEUE_CTRL_TX); |
| 72 | |
| 73 | #ifdef RT_USING_SMP |
| 74 | rt_spin_unlock_irqrestore(&virtio_dev->spinlock, level); |
| 75 | #endif |
| 76 | } |
| 77 | |
| 78 | static rt_err_t virtio_console_port_init(rt_device_t dev); |
| 79 | static rt_err_t virtio_console_port_open(rt_device_t dev, rt_uint16_t oflag); |
no test coverage detected