Lines Matching refs:chan

9 #include "chan.h"
84 static int open_one_chan(struct chan *chan)
88 if (chan->opened)
91 if (chan->ops->open == NULL)
93 else fd = (*chan->ops->open)(chan->input, chan->output, chan->primary,
94 chan->data, &chan->dev);
100 (*chan->ops->close)(fd, chan->data);
104 chan->fd = fd;
106 chan->opened = 1;
113 struct chan *chan;
117 chan = list_entry(ele, struct chan, list);
118 ret = open_one_chan(chan);
119 if (chan->primary)
125 void chan_enable_winch(struct chan *chan, struct tty_port *port)
127 if (chan && chan->primary && chan->ops->winch)
128 register_winch(chan->fd, port);
142 struct chan *chan;
148 chan = list_entry(ele, struct chan, list);
149 err = open_one_chan(chan);
151 if (chan->primary)
157 if (chan->enabled)
159 err = line_setup_irq(chan->fd, chan->input, chan->output, line,
160 chan);
164 chan->enabled = 1;
185 struct chan *chan;
195 chan = list_entry(ele, struct chan, free_list);
197 if (chan->input && chan->enabled)
198 um_free_irq(chan->line->driver->read_irq, chan);
199 if (chan->output && chan->enabled)
200 um_free_irq(chan->line->driver->write_irq, chan);
201 chan->enabled = 0;
205 static void close_one_chan(struct chan *chan, int delay_free_irq)
209 if (!chan->opened)
214 list_add(&chan->free_list, &irqs_to_free);
217 if (chan->input && chan->enabled)
218 um_free_irq(chan->line->driver->read_irq, chan);
219 if (chan->output && chan->enabled)
220 um_free_irq(chan->line->driver->write_irq, chan);
221 chan->enabled = 0;
223 if (chan->ops->close != NULL)
224 (*chan->ops->close)(chan->fd, chan->data);
226 chan->opened = 0;
227 chan->fd = -1;
232 struct chan *chan;
239 list_for_each_entry_reverse(chan, &line->chan_list, list) {
240 close_one_chan(chan, 0);
244 void deactivate_chan(struct chan *chan, int irq)
246 if (chan && chan->enabled)
247 deactivate_fd(chan->fd, irq);
250 int write_chan(struct chan *chan, const char *buf, int len,
255 if (len == 0 || !chan || !chan->ops->write)
258 n = chan->ops->write(chan->fd, buf, len, chan->data);
259 if (chan->primary) {
265 int console_write_chan(struct chan *chan, const char *buf, int len)
269 if (!chan || !chan->ops->console_write)
272 n = chan->ops->console_write(chan->fd, buf, len);
273 if (chan->primary)
294 struct chan *chan;
296 chan = line->chan_in;
297 if (chan && chan->primary) {
298 if (chan->ops->window_size == NULL)
300 return chan->ops->window_size(chan->fd, chan->data,
303 chan = line->chan_out;
304 if (chan && chan->primary) {
305 if (chan->ops->window_size == NULL)
307 return chan->ops->window_size(chan->fd, chan->data,
313 static void free_one_chan(struct chan *chan)
315 list_del(&chan->list);
317 close_one_chan(chan, 0);
319 if (chan->ops->free != NULL)
320 (*chan->ops->free)(chan->data);
322 if (chan->primary && chan->output)
323 ignore_sigio_fd(chan->fd);
324 kfree(chan);
330 struct chan *chan;
333 chan = list_entry(ele, struct chan, list);
334 free_one_chan(chan);
338 static int one_chan_config_string(struct chan *chan, char *str, int size,
343 if (chan == NULL) {
348 CONFIG_CHUNK(str, size, n, chan->ops->type, 0);
350 if (chan->dev == NULL) {
356 CONFIG_CHUNK(str, size, n, chan->dev, 0);
361 static int chan_pair_config_string(struct chan *in, struct chan *out,
387 struct chan *in = line->chan_in, *out = line->chan_out;
438 static struct chan *parse_chan(struct line *line, char *str, int device,
443 struct chan *chan;
468 chan = kmalloc(sizeof(*chan), GFP_ATOMIC);
469 if (chan == NULL) {
473 *chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list),
475 LIST_HEAD_INIT(chan->free_list),
485 return chan;
492 struct chan *new;
541 struct chan *chan = line->chan_in;
545 if (!chan || !chan->ops->read)
553 err = chan->ops->read(chan->fd, &c, chan->data);
559 if (chan->primary) {
561 if (line->chan_out != chan)
564 close_one_chan(chan, 1);
565 if (chan->primary)