Lines Matching +full:can +full:- +full:primary
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{linux.intel,addtoit}.com)
22 static int not_configged_open(int input, int output, int primary, void *data, in not_configged_open() argument
27 return -ENODEV; in not_configged_open()
40 return -EIO; in not_configged_read()
47 return -EIO; in not_configged_write()
54 return -EIO; in not_configged_console_write()
62 return -ENODEV; in not_configged_window_size()
94 if (chan->opened) in open_one_chan()
97 if (chan->ops->open == NULL) in open_one_chan()
99 else fd = (*chan->ops->open)(chan->input, chan->output, chan->primary, in open_one_chan()
100 chan->data, &chan->dev); in open_one_chan()
108 chan->fd_in = fd; in open_one_chan()
109 chan->fd_out = fd; in open_one_chan()
112 * In time-travel modes infinite-CPU and external we need to guarantee in open_one_chan()
122 if (chan->output && need_output_blocking()) { in open_one_chan()
123 err = os_dup_file(chan->fd_out); in open_one_chan()
127 chan->fd_out = err; in open_one_chan()
129 err = os_set_fd_block(chan->fd_out, 1); in open_one_chan()
131 os_close_file(chan->fd_out); in open_one_chan()
136 chan->opened = 1; in open_one_chan()
140 (*chan->ops->close)(fd, chan->data); in open_one_chan()
153 if (chan->primary) in open_chan()
161 if (chan && chan->primary && chan->ops->winch) in chan_enable_winch()
162 register_winch(chan->fd_in, port); in chan_enable_winch()
169 if (!line->throttled) in line_timer_cb()
170 chan_interrupt(line, line->read_irq); in line_timer_cb()
179 INIT_DELAYED_WORK(&line->task, line_timer_cb); in enable_chan()
181 list_for_each(ele, &line->chan_list) { in enable_chan()
185 if (chan->primary) in enable_chan()
191 if (chan->enabled) in enable_chan()
193 err = line_setup_irq(chan->fd_in, chan->input, in enable_chan()
194 chan->output && !need_output_blocking(), in enable_chan()
199 chan->enabled = 1; in enable_chan()
209 /* Items are added in IRQ context, when free_irq can't be called, and
210 * removed in process context, when it can.
232 if (chan->input && chan->enabled) in free_irqs()
233 um_free_irq(chan->line->read_irq, chan); in free_irqs()
234 if (chan->output && chan->enabled && in free_irqs()
236 um_free_irq(chan->line->write_irq, chan); in free_irqs()
237 chan->enabled = 0; in free_irqs()
245 if (!chan->opened) in close_one_chan()
250 list_add(&chan->free_list, &irqs_to_free); in close_one_chan()
253 if (chan->input && chan->enabled) in close_one_chan()
254 um_free_irq(chan->line->read_irq, chan); in close_one_chan()
255 if (chan->output && chan->enabled && in close_one_chan()
257 um_free_irq(chan->line->write_irq, chan); in close_one_chan()
258 chan->enabled = 0; in close_one_chan()
260 if (chan->fd_out != chan->fd_in) in close_one_chan()
261 os_close_file(chan->fd_out); in close_one_chan()
262 if (chan->ops->close != NULL) in close_one_chan()
263 (*chan->ops->close)(chan->fd_in, chan->data); in close_one_chan()
265 chan->opened = 0; in close_one_chan()
266 chan->fd_in = -1; in close_one_chan()
267 chan->fd_out = -1; in close_one_chan()
279 list_for_each_entry_reverse(chan, &line->chan_list, list) { in close_chan()
286 if (chan && chan->enabled) in deactivate_chan()
287 deactivate_fd(chan->fd_in, irq); in deactivate_chan()
294 if (len == 0 || !chan || !chan->ops->write) in write_chan()
297 n = chan->ops->write(chan->fd_out, buf, len, chan->data); in write_chan()
298 if (chan->primary) { in write_chan()
308 if (!chan || !chan->ops->console_write) in console_write_chan()
311 n = chan->ops->console_write(chan->fd_out, buf, len); in console_write_chan()
312 if (chan->primary) in console_write_chan()
321 err = open_chan(&line->chan_list); in console_open_chan()
325 printk(KERN_INFO "Console initialized on /dev/%s%d\n", co->name, in console_open_chan()
326 co->index); in console_open_chan()
335 chan = line->chan_in; in chan_window_size()
336 if (chan && chan->primary) { in chan_window_size()
337 if (chan->ops->window_size == NULL) in chan_window_size()
339 return chan->ops->window_size(chan->fd_in, chan->data, in chan_window_size()
342 chan = line->chan_out; in chan_window_size()
343 if (chan && chan->primary) { in chan_window_size()
344 if (chan->ops->window_size == NULL) in chan_window_size()
346 return chan->ops->window_size(chan->fd_in, chan->data, in chan_window_size()
354 list_del(&chan->list); in free_one_chan()
358 if (chan->ops->free != NULL) in free_one_chan()
359 (*chan->ops->free)(chan->data); in free_one_chan()
361 if (chan->primary && chan->output) in free_one_chan()
362 ignore_sigio_fd(chan->fd_in); in free_one_chan()
387 CONFIG_CHUNK(str, size, n, chan->ops->type, 0); in one_chan_config_string()
389 if (chan->dev == NULL) { in one_chan_config_string()
395 CONFIG_CHUNK(str, size, n, chan->dev, 0); in one_chan_config_string()
407 size -= n; in chan_pair_config_string()
417 size -= n; in chan_pair_config_string()
426 struct chan *in = line->chan_in, *out = line->chan_out; in chan_config_string()
428 if (in && !in->primary) in chan_config_string()
430 if (out && !out->primary) in chan_config_string()
490 if (!strncmp(str, entry->key, strlen(entry->key))) { in parse_chan()
491 ops = entry->ops; in parse_chan()
492 str += strlen(entry->key); in parse_chan()
501 data = (*ops->init)(str, device, opts); in parse_chan()
512 *chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list), in parse_chan()
514 LIST_HEAD_INIT(chan->free_list), in parse_chan()
516 .primary = 1, in parse_chan()
521 .fd_in = -1, in parse_chan()
522 .fd_out = -1, in parse_chan()
531 struct list_head *chans = &line->chan_list; in parse_chan_pair()
536 line->chan_in = line->chan_out = NULL; in parse_chan_pair()
551 return -1; in parse_chan_pair()
553 new->input = 1; in parse_chan_pair()
554 list_add(&new->list, chans); in parse_chan_pair()
555 line->chan_in = new; in parse_chan_pair()
559 return -1; in parse_chan_pair()
561 list_add(&new->list, chans); in parse_chan_pair()
562 new->output = 1; in parse_chan_pair()
563 line->chan_out = new; in parse_chan_pair()
568 return -1; in parse_chan_pair()
570 list_add(&new->list, chans); in parse_chan_pair()
571 new->input = 1; in parse_chan_pair()
572 new->output = 1; in parse_chan_pair()
573 line->chan_in = line->chan_out = new; in parse_chan_pair()
580 struct tty_port *port = &line->port; in chan_interrupt()
581 struct chan *chan = line->chan_in; in chan_interrupt()
585 if (!chan || !chan->ops->read) in chan_interrupt()
590 schedule_delayed_work(&line->task, 1); in chan_interrupt()
593 err = chan->ops->read(chan->fd_in, &c, chan->data); in chan_interrupt()
598 if (err == -EIO) { in chan_interrupt()
599 if (chan->primary) { in chan_interrupt()
600 tty_port_tty_hangup(&line->port, false); in chan_interrupt()
601 if (line->chan_out != chan) in chan_interrupt()
602 close_one_chan(line->chan_out, 1); in chan_interrupt()
605 if (chan->primary) in chan_interrupt()