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->read_irq, chan);
199 if (chan->output && chan->enabled)
200 um_free_irq(chan->line->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->read_irq, chan);
219 if (chan->output && chan->enabled)
220 um_free_irq(chan->line->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 u8 *buf, size_t len, int write_irq)
254 if (len == 0 || !chan || !chan->ops->write)
257 n = chan->ops->write(chan->fd, buf, len, chan->data);
258 if (chan->primary) {
264 int console_write_chan(struct chan *chan, const char *buf, int len)
268 if (!chan || !chan->ops->console_write)
271 n = chan->ops->console_write(chan->fd, buf, len);
272 if (chan->primary)
293 struct chan *chan;
295 chan = line->chan_in;
296 if (chan && chan->primary) {
297 if (chan->ops->window_size == NULL)
299 return chan->ops->window_size(chan->fd, chan->data,
302 chan = line->chan_out;
303 if (chan && chan->primary) {
304 if (chan->ops->window_size == NULL)
306 return chan->ops->window_size(chan->fd, chan->data,
312 static void free_one_chan(struct chan *chan)
314 list_del(&chan->list);
316 close_one_chan(chan, 0);
318 if (chan->ops->free != NULL)
319 (*chan->ops->free)(chan->data);
321 if (chan->primary && chan->output)
322 ignore_sigio_fd(chan->fd);
323 kfree(chan);
329 struct chan *chan;
332 chan = list_entry(ele, struct chan, list);
333 free_one_chan(chan);
337 static int one_chan_config_string(struct chan *chan, char *str, int size,
342 if (chan == NULL) {
347 CONFIG_CHUNK(str, size, n, chan->ops->type, 0);
349 if (chan->dev == NULL) {
355 CONFIG_CHUNK(str, size, n, chan->dev, 0);
360 static int chan_pair_config_string(struct chan *in, struct chan *out,
386 struct chan *in = line->chan_in, *out = line->chan_out;
437 static struct chan *parse_chan(struct line *line, char *str, int device,
442 struct chan *chan;
467 chan = kmalloc(sizeof(*chan), GFP_ATOMIC);
468 if (chan == NULL) {
472 *chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list),
474 LIST_HEAD_INIT(chan->free_list),
484 return chan;
491 struct chan *new;
540 struct chan *chan = line->chan_in;
544 if (!chan || !chan->ops->read)
552 err = chan->ops->read(chan->fd, &c, chan->data);
558 if (chan->primary) {
560 if (line->chan_out != chan)
563 close_one_chan(chan, 1);
564 if (chan->primary)