Lines Matching +full:break +full:- +full:control
1 /*-
93 #define VTCON_PORT_LOCK(_port) mtx_lock(&(_port)->vtcport_mtx)
94 #define VTCON_PORT_UNLOCK(_port) mtx_unlock(&(_port)->vtcport_mtx)
126 #define VTCON_LOCK(_sc) mtx_lock(&(_sc)->vtcon_mtx)
127 #define VTCON_UNLOCK(_sc) mtx_unlock(&(_sc)->vtcon_mtx)
129 mtx_assert(&(_sc)->vtcon_mtx, MA_OWNED)
131 mtx_assert(&(_sc)->vtcon_mtx, MA_NOTOWNED)
133 #define VTCON_CTRL_TX_LOCK(_sc) mtx_lock(&(_sc)->vtcon_ctrl_tx_mtx)
134 #define VTCON_CTRL_TX_UNLOCK(_sc) mtx_unlock(&(_sc)->vtcon_ctrl_tx_mtx)
137 KASSERT((_id) >= 0 && (_id) < (_sc)->vtcon_max_ports, \
189 struct virtio_console_control *control);
226 #define vtcon_modern(_sc) (((_sc)->vtcon_features & VIRTIO_F_VERSION_1) != 0)
277 break; in vtcon_modevent()
280 break; in vtcon_modevent()
284 break; in vtcon_modevent()
287 break; in vtcon_modevent()
290 break; in vtcon_modevent()
324 sc->vtcon_dev = dev; in vtcon_attach()
327 mtx_init(&sc->vtcon_mtx, "vtconmtx", NULL, MTX_DEF); in vtcon_attach()
328 mtx_init(&sc->vtcon_ctrl_tx_mtx, "vtconctrlmtx", NULL, MTX_DEF); in vtcon_attach()
351 if (sc->vtcon_flags & VTCON_FLAG_MULTIPORT) { in vtcon_attach()
352 TASK_INIT(&sc->vtcon_ctrl_task, 0, vtcon_ctrl_task_cb, sc); in vtcon_attach()
360 if (sc->vtcon_flags & VTCON_FLAG_SIZE) in vtcon_attach()
390 sc->vtcon_flags |= VTCON_FLAG_DETACHED; in vtcon_detach()
395 if (sc->vtcon_flags & VTCON_FLAG_MULTIPORT) { in vtcon_detach()
396 taskqueue_drain(taskqueue_thread, &sc->vtcon_ctrl_task); in vtcon_detach()
401 mtx_destroy(&sc->vtcon_mtx); in vtcon_detach()
402 mtx_destroy(&sc->vtcon_ctrl_tx_mtx); in vtcon_detach()
416 * changes are done through control virtqueue events. in vtcon_config_change()
418 if ((sc->vtcon_flags & VTCON_FLAG_MULTIPORT) == 0) { in vtcon_config_change()
419 if (sc->vtcon_flags & VTCON_FLAG_SIZE) in vtcon_config_change()
432 dev = sc->vtcon_dev; in vtcon_negotiate_features()
435 sc->vtcon_features = virtio_negotiate_features(dev, features); in vtcon_negotiate_features()
445 dev = sc->vtcon_dev; in vtcon_setup_features()
452 sc->vtcon_flags |= VTCON_FLAG_SIZE; in vtcon_setup_features()
454 sc->vtcon_flags |= VTCON_FLAG_MULTIPORT; in vtcon_setup_features()
463 &(_cfg)->_field, sizeof((_cfg)->_field)); \
471 dev = sc->vtcon_dev; in vtcon_read_config()
488 max = sc->vtcon_max_ports; in vtcon_alloc_scports()
490 sc->vtcon_ports = malloc(sizeof(struct vtcon_softc_port) * max, in vtcon_alloc_scports()
492 if (sc->vtcon_ports == NULL) in vtcon_alloc_scports()
496 scport = &sc->vtcon_ports[i]; in vtcon_alloc_scports()
497 scport->vcsp_sc = sc; in vtcon_alloc_scports()
511 dev = sc->vtcon_dev; in vtcon_alloc_virtqueues()
513 nvqs = sc->vtcon_max_ports * 2; in vtcon_alloc_virtqueues()
514 if (sc->vtcon_flags & VTCON_FLAG_MULTIPORT) in vtcon_alloc_virtqueues()
523 /* The control virtqueues are after the first port. */ in vtcon_alloc_virtqueues()
525 vtcon_ctrl_event_intr, sc, &sc->vtcon_ctrl_rxvq, in vtcon_alloc_virtqueues()
526 "%s-control rx", device_get_nameunit(dev)); in vtcon_alloc_virtqueues()
528 NULL, sc, &sc->vtcon_ctrl_txvq, in vtcon_alloc_virtqueues()
529 "%s-control tx", device_get_nameunit(dev)); in vtcon_alloc_virtqueues()
533 scport = &sc->vtcon_ports[portidx]; in vtcon_alloc_virtqueues()
536 scport, &scport->vcsp_invq, "%s-port%d in", in vtcon_alloc_virtqueues()
539 NULL, &scport->vcsp_outvq, "%s-port%d out", in vtcon_alloc_virtqueues()
556 if (sc->vtcon_flags & VTCON_FLAG_MULTIPORT) { in vtcon_determine_max_ports()
557 sc->vtcon_max_ports = in vtcon_determine_max_ports()
558 min(concfg->max_nr_ports, VTCON_MAX_PORTS); in vtcon_determine_max_ports()
559 if (sc->vtcon_max_ports == 0) in vtcon_determine_max_ports()
560 sc->vtcon_max_ports = 1; in vtcon_determine_max_ports()
562 sc->vtcon_max_ports = 1; in vtcon_determine_max_ports()
573 if (sc->vtcon_ports == NULL) in vtcon_destroy_ports()
577 for (i = 0; i < sc->vtcon_max_ports; i++) { in vtcon_destroy_ports()
578 scport = &sc->vtcon_ports[i]; in vtcon_destroy_ports()
580 port = scport->vcsp_port; in vtcon_destroy_ports()
582 scport->vcsp_port = NULL; in vtcon_destroy_ports()
589 vq = scport->vcsp_invq; in vtcon_destroy_ports()
595 free(sc->vtcon_ports, M_DEVBUF); in vtcon_destroy_ports()
596 sc->vtcon_ports = NULL; in vtcon_destroy_ports()
604 virtio_stop(sc->vtcon_dev); in vtcon_stop()
609 struct virtio_console_control *control) in vtcon_ctrl_event_enqueue() argument
616 vq = sc->vtcon_ctrl_rxvq; in vtcon_ctrl_event_enqueue()
619 error = sglist_append(&sg, control, VTCON_CTRL_BUFSZ); in vtcon_ctrl_event_enqueue()
620 KASSERT(error == 0, ("%s: error %d adding control to sglist", in vtcon_ctrl_event_enqueue()
623 return (virtqueue_enqueue(vq, control, &sg, 0, sg.sg_nseg)); in vtcon_ctrl_event_enqueue()
629 struct virtio_console_control *control; in vtcon_ctrl_event_create() local
632 control = malloc(VTCON_CTRL_BUFSZ, M_DEVBUF, M_ZERO | M_NOWAIT); in vtcon_ctrl_event_create()
633 if (control == NULL) in vtcon_ctrl_event_create()
636 error = vtcon_ctrl_event_enqueue(sc, control); in vtcon_ctrl_event_create()
638 free(control, M_DEVBUF); in vtcon_ctrl_event_create()
645 struct virtio_console_control *control) in vtcon_ctrl_event_requeue() argument
649 bzero(control, VTCON_CTRL_BUFSZ); in vtcon_ctrl_event_requeue()
651 error = vtcon_ctrl_event_enqueue(sc, control); in vtcon_ctrl_event_requeue()
653 ("%s: cannot requeue control buffer %d", __func__, error)); in vtcon_ctrl_event_requeue()
662 vq = sc->vtcon_ctrl_rxvq; in vtcon_ctrl_event_populate()
668 break; in vtcon_ctrl_event_populate()
682 struct virtio_console_control *control; in vtcon_ctrl_event_drain() local
686 vq = sc->vtcon_ctrl_rxvq; in vtcon_ctrl_event_drain()
693 while ((control = virtqueue_drain(vq, &last)) != NULL) in vtcon_ctrl_event_drain()
694 free(control, M_DEVBUF); in vtcon_ctrl_event_drain()
721 dev = sc->vtcon_dev; in vtcon_ctrl_port_add_event()
724 if (sc->vtcon_ports[id].vcsp_port != NULL) { in vtcon_ctrl_port_add_event()
746 dev = sc->vtcon_dev; in vtcon_ctrl_port_remove_event()
747 scport = &sc->vtcon_ports[id]; in vtcon_ctrl_port_remove_event()
750 port = scport->vcsp_port; in vtcon_ctrl_port_remove_event()
758 scport->vcsp_port = NULL; in vtcon_ctrl_port_remove_event()
771 dev = sc->vtcon_dev; in vtcon_ctrl_port_console_event()
772 scport = &sc->vtcon_ports[id]; in vtcon_ctrl_port_console_event()
775 port = scport->vcsp_port; in vtcon_ctrl_port_console_event()
785 port->vtcport_flags |= VTCON_PORT_FLAG_CONSOLE; in vtcon_ctrl_port_console_event()
797 dev = sc->vtcon_dev; in vtcon_ctrl_port_open_event()
798 scport = &sc->vtcon_ports[id]; in vtcon_ctrl_port_open_event()
801 port = scport->vcsp_port; in vtcon_ctrl_port_open_event()
823 dev = sc->vtcon_dev; in vtcon_ctrl_port_name_event()
824 scport = &sc->vtcon_ports[id]; in vtcon_ctrl_port_name_event()
832 if (name[len - 1] == '\0') { in vtcon_ctrl_port_name_event()
833 len--; in vtcon_ctrl_port_name_event()
839 port = scport->vcsp_port; in vtcon_ctrl_port_name_event()
855 struct virtio_console_control *control, void *data, size_t data_len) in vtcon_ctrl_process_event() argument
861 dev = sc->vtcon_dev; in vtcon_ctrl_process_event()
862 id = vtcon_htog32(sc, control->id); in vtcon_ctrl_process_event()
863 event = vtcon_htog16(sc, control->event); in vtcon_ctrl_process_event()
865 if (id >= sc->vtcon_max_ports) { in vtcon_ctrl_process_event()
874 break; in vtcon_ctrl_process_event()
878 break; in vtcon_ctrl_process_event()
882 break; in vtcon_ctrl_process_event()
885 break; in vtcon_ctrl_process_event()
889 break; in vtcon_ctrl_process_event()
893 break; in vtcon_ctrl_process_event()
902 struct virtio_console_control *control; in vtcon_ctrl_task_cb() local
909 vq = sc->vtcon_ctrl_rxvq; in vtcon_ctrl_task_cb()
913 while ((detached = (sc->vtcon_flags & VTCON_FLAG_DETACHED)) == 0) { in vtcon_ctrl_task_cb()
914 control = virtqueue_dequeue(vq, &len); in vtcon_ctrl_task_cb()
915 if (control == NULL) in vtcon_ctrl_task_cb()
916 break; in vtcon_ctrl_task_cb()
919 data = (void *) &control[1]; in vtcon_ctrl_task_cb()
920 data_len = len - sizeof(struct virtio_console_control); in vtcon_ctrl_task_cb()
927 vtcon_ctrl_process_event(sc, control, data, data_len); in vtcon_ctrl_task_cb()
929 vtcon_ctrl_event_requeue(sc, control); in vtcon_ctrl_task_cb()
936 &sc->vtcon_ctrl_task); in vtcon_ctrl_task_cb()
953 taskqueue_enqueue(taskqueue_thread, &sc->vtcon_ctrl_task); in vtcon_ctrl_event_intr()
958 struct virtio_console_control *control) in vtcon_ctrl_poll() argument
965 vq = sc->vtcon_ctrl_txvq; in vtcon_ctrl_poll()
968 error = sglist_append(&sg, control, in vtcon_ctrl_poll()
970 KASSERT(error == 0, ("%s: error %d adding control to sglist", in vtcon_ctrl_poll()
982 error = virtqueue_enqueue(vq, control, &sg, sg.sg_nseg, 0); in vtcon_ctrl_poll()
994 struct virtio_console_control control; in vtcon_ctrl_send_control() local
996 if ((sc->vtcon_flags & VTCON_FLAG_MULTIPORT) == 0) in vtcon_ctrl_send_control()
999 control.id = vtcon_gtoh32(sc, portid); in vtcon_ctrl_send_control()
1000 control.event = vtcon_gtoh16(sc, event); in vtcon_ctrl_send_control()
1001 control.value = vtcon_gtoh16(sc, value); in vtcon_ctrl_send_control()
1003 vtcon_ctrl_poll(sc, &control); in vtcon_ctrl_send_control()
1014 vq = port->vtcport_invq; in vtcon_port_enqueue_buf()
1059 vq = port->vtcport_invq; in vtcon_port_populate()
1065 break; in vtcon_port_populate()
1080 port->vtcport_sc = NULL; in vtcon_port_destroy()
1081 port->vtcport_scport = NULL; in vtcon_port_destroy()
1082 port->vtcport_invq = NULL; in vtcon_port_destroy()
1083 port->vtcport_outvq = NULL; in vtcon_port_destroy()
1084 port->vtcport_id = -1; in vtcon_port_destroy()
1085 mtx_destroy(&port->vtcport_mtx); in vtcon_port_destroy()
1095 scport = port->vtcport_scport; in vtcon_port_init_vqs()
1097 port->vtcport_invq = scport->vcsp_invq; in vtcon_port_init_vqs()
1098 port->vtcport_outvq = scport->vcsp_outvq; in vtcon_port_init_vqs()
1107 KASSERT(virtqueue_empty(port->vtcport_invq), in vtcon_port_init_vqs()
1109 KASSERT(virtqueue_empty(port->vtcport_outvq), in vtcon_port_init_vqs()
1127 dev = sc->vtcon_dev; in vtcon_port_create()
1128 scport = &sc->vtcon_ports[id]; in vtcon_port_create()
1131 MPASS(scport->vcsp_port == NULL); in vtcon_port_create()
1137 port->vtcport_sc = sc; in vtcon_port_create()
1138 port->vtcport_scport = scport; in vtcon_port_create()
1139 port->vtcport_id = id; in vtcon_port_create()
1140 mtx_init(&port->vtcport_mtx, "vtcpmtx", NULL, MTX_DEF); in vtcon_port_create()
1141 port->vtcport_tty = tty_alloc_mutex(&vtcon_tty_class, port, in vtcon_port_create()
1142 &port->vtcport_mtx); in vtcon_port_create()
1153 scport->vcsp_port = port; in vtcon_port_create()
1159 tty_makedev(port->vtcport_tty, NULL, "%s%r.%r", VTCON_TTY_PREFIX, in vtcon_port_create()
1173 sc = port->vtcport_sc; in vtcon_port_dev_alias()
1174 tp = port->vtcport_tty; in vtcon_port_dev_alias()
1176 if (port->vtcport_flags & VTCON_PORT_FLAG_ALIAS) in vtcon_port_dev_alias()
1179 /* Port name is UTF-8, but we can only handle ASCII. */ in vtcon_port_dev_alias()
1190 tp->t_dev, "%s/%*s", VTCON_TTY_ALIAS_PREFIX, (int)len, name); in vtcon_port_dev_alias()
1192 device_printf(sc->vtcon_dev, in vtcon_port_dev_alias()
1196 port->vtcport_flags |= VTCON_PORT_FLAG_ALIAS; in vtcon_port_dev_alias()
1215 vtcon_port_drain_bufs(port->vtcport_invq); in vtcon_port_drain()
1223 tp = port->vtcport_tty; in vtcon_port_teardown()
1225 port->vtcport_flags |= VTCON_PORT_FLAG_GONE; in vtcon_port_teardown()
1240 tp = port->vtcport_tty; in vtcon_port_change_size()
1265 scport = &sc->vtcon_ports[0]; in vtcon_port_update_console_size()
1268 port = scport->vcsp_port; in vtcon_port_update_console_size()
1287 virtqueue_enable_intr(port->vtcport_invq); in vtcon_port_enable_intr()
1294 if (port->vtcport_invq != NULL) in vtcon_port_disable_intr()
1295 virtqueue_disable_intr(port->vtcport_invq); in vtcon_port_disable_intr()
1296 if (port->vtcport_outvq != NULL) in vtcon_port_disable_intr()
1297 virtqueue_disable_intr(port->vtcport_outvq); in vtcon_port_disable_intr()
1309 tp = port->vtcport_tty; in vtcon_port_in()
1310 vq = port->vtcport_invq; in vtcon_port_in()
1318 if (port->vtcport_flags & VTCON_PORT_FLAG_CONSOLE) in vtcon_port_in()
1320 &port->vtcport_alt_break_state); in vtcon_port_in()
1344 sc = scport->vcsp_sc; in vtcon_port_intr()
1347 port = scport->vcsp_port; in vtcon_port_intr()
1354 if ((port->vtcport_flags & VTCON_PORT_FLAG_GONE) == 0) in vtcon_port_intr()
1367 vq = port->vtcport_outvq; in vtcon_port_out()
1389 sc = port->vtcport_sc; in vtcon_port_submit_event()
1391 vtcon_ctrl_send_control(sc, port->vtcport_id, event, value); in vtcon_port_submit_event()
1401 if (port->vtcport_flags & VTCON_PORT_FLAG_GONE) in vtcon_tty_open()
1416 if (port->vtcport_flags & VTCON_PORT_FLAG_GONE) in vtcon_tty_close()
1431 if (port->vtcport_flags & VTCON_PORT_FLAG_GONE) in vtcon_tty_outwakeup()
1454 KASSERT(sc->vtcon_flags & VTCON_FLAG_SIZE, in vtcon_get_console_size()
1472 if (sc->vtcon_flags & VTCON_FLAG_MULTIPORT) in vtcon_enable_interrupts()
1473 virtqueue_enable_intr(sc->vtcon_ctrl_rxvq); in vtcon_enable_interrupts()
1475 for (i = 0; i < sc->vtcon_max_ports; i++) { in vtcon_enable_interrupts()
1476 scport = &sc->vtcon_ports[i]; in vtcon_enable_interrupts()
1478 port = scport->vcsp_port; in vtcon_enable_interrupts()
1499 if (sc->vtcon_flags & VTCON_FLAG_MULTIPORT) in vtcon_disable_interrupts()
1500 virtqueue_disable_intr(sc->vtcon_ctrl_rxvq); in vtcon_disable_interrupts()
1502 for (i = 0; i < sc->vtcon_max_ports; i++) { in vtcon_disable_interrupts()
1503 scport = &sc->vtcon_ports[i]; in vtcon_disable_interrupts()
1505 port = scport->vcsp_port; in vtcon_disable_interrupts()