1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
19#include <linux/sched.h>
20#include <linux/slab.h>
21#include <linux/device.h>
22#include <linux/mod_devicetable.h>
23#include <linux/rculist.h>
24#include <linux/workqueue.h>
25#include <linux/ratelimit.h>
26#include <linux/bug.h>
27#include <linux/uaccess.h>
28
29#include "fwserial.h"
30
31#define be32_to_u64(hi, lo) ((u64)be32_to_cpu(hi) << 32 | be32_to_cpu(lo))
32
33#define LINUX_VENDOR_ID 0xd00d1eU
34#define FWSERIAL_VERSION 0x00e81cU
35
36
37static int num_ttys = 4;
38
39static bool auto_connect = true;
40static bool create_loop_dev = true;
41
42module_param_named(ttys, num_ttys, int, S_IRUGO | S_IWUSR);
43module_param_named(auto, auto_connect, bool, S_IRUGO | S_IWUSR);
44module_param_named(loop, create_loop_dev, bool, S_IRUGO | S_IWUSR);
45
46
47
48
49
50
51
52#define WAKEUP_CHARS 256
53
54
55
56
57
58static LIST_HEAD(fwserial_list);
59static DEFINE_MUTEX(fwserial_list_mutex);
60
61
62
63
64
65
66
67
68static struct fwtty_port *port_table[MAX_TOTAL_PORTS];
69static DEFINE_MUTEX(port_table_lock);
70static bool port_table_corrupt;
71#define FWTTY_INVALID_INDEX MAX_TOTAL_PORTS
72
73#define loop_idx(port) (((port)->index) / num_ports)
74#define table_idx(loop) ((loop) * num_ports + num_ttys)
75
76
77static int num_ports;
78
79
80static struct kmem_cache *fwtty_txn_cache;
81
82struct tty_driver *fwtty_driver;
83static struct tty_driver *fwloop_driver;
84
85static struct dentry *fwserial_debugfs;
86
87struct fwtty_transaction;
88typedef void (*fwtty_transaction_cb)(struct fw_card *card, int rcode,
89 void *data, size_t length,
90 struct fwtty_transaction *txn);
91
92struct fwtty_transaction {
93 struct fw_transaction fw_txn;
94 fwtty_transaction_cb callback;
95 struct fwtty_port *port;
96 union {
97 struct dma_pending dma_pended;
98 };
99};
100
101#define to_device(a, b) (a->b)
102#define fwtty_err(p, fmt, ...) \
103 dev_err(to_device(p, device), fmt, ##__VA_ARGS__)
104#define fwtty_info(p, fmt, ...) \
105 dev_info(to_device(p, device), fmt, ##__VA_ARGS__)
106#define fwtty_notice(p, fmt, ...) \
107 dev_notice(to_device(p, device), fmt, ##__VA_ARGS__)
108#define fwtty_dbg(p, fmt, ...) \
109 dev_dbg(to_device(p, device), "%s: " fmt, __func__, ##__VA_ARGS__)
110#define fwtty_err_ratelimited(p, fmt, ...) \
111 dev_err_ratelimited(to_device(p, device), fmt, ##__VA_ARGS__)
112
113#ifdef DEBUG
114static inline void debug_short_write(struct fwtty_port *port, int c, int n)
115{
116 int avail;
117
118 if (n < c) {
119 spin_lock_bh(&port->lock);
120 avail = dma_fifo_avail(&port->tx_fifo);
121 spin_unlock_bh(&port->lock);
122 fwtty_dbg(port, "short write: avail:%d req:%d wrote:%d\n",
123 avail, c, n);
124 }
125}
126#else
127#define debug_short_write(port, c, n)
128#endif
129
130static struct fwtty_peer *__fwserial_peer_by_node_id(struct fw_card *card,
131 int generation, int id);
132
133#ifdef FWTTY_PROFILING
134
135static void fwtty_profile_fifo(struct fwtty_port *port, unsigned int *stat)
136{
137 spin_lock_bh(&port->lock);
138 fwtty_profile_data(stat, dma_fifo_avail(&port->tx_fifo));
139 spin_unlock_bh(&port->lock);
140}
141
142static void fwtty_dump_profile(struct seq_file *m, struct stats *stats)
143{
144
145 int k = 4;
146 unsigned int sum;
147 int j;
148 char t[10];
149
150 snprintf(t, 10, "< %d", 1 << k);
151 seq_printf(m, "\n%14s %6s", " ", t);
152 for (j = k + 1; j < DISTRIBUTION_MAX_INDEX; ++j)
153 seq_printf(m, "%6d", 1 << j);
154
155 ++k;
156 for (j = 0, sum = 0; j <= k; ++j)
157 sum += stats->reads[j];
158 seq_printf(m, "\n%14s: %6d", "reads", sum);
159 for (j = k + 1; j <= DISTRIBUTION_MAX_INDEX; ++j)
160 seq_printf(m, "%6d", stats->reads[j]);
161
162 for (j = 0, sum = 0; j <= k; ++j)
163 sum += stats->writes[j];
164 seq_printf(m, "\n%14s: %6d", "writes", sum);
165 for (j = k + 1; j <= DISTRIBUTION_MAX_INDEX; ++j)
166 seq_printf(m, "%6d", stats->writes[j]);
167
168 for (j = 0, sum = 0; j <= k; ++j)
169 sum += stats->txns[j];
170 seq_printf(m, "\n%14s: %6d", "txns", sum);
171 for (j = k + 1; j <= DISTRIBUTION_MAX_INDEX; ++j)
172 seq_printf(m, "%6d", stats->txns[j]);
173
174 for (j = 0, sum = 0; j <= k; ++j)
175 sum += stats->unthrottle[j];
176 seq_printf(m, "\n%14s: %6d", "avail @ unthr", sum);
177 for (j = k + 1; j <= DISTRIBUTION_MAX_INDEX; ++j)
178 seq_printf(m, "%6d", stats->unthrottle[j]);
179}
180
181#else
182#define fwtty_profile_fifo(port, stat)
183#define fwtty_dump_profile(m, stats)
184#endif
185
186
187
188
189
190
191static inline int device_max_receive(struct fw_device *fw_device)
192{
193
194 return min(2 << fw_device->max_rec, 4096);
195}
196
197static void fwtty_log_tx_error(struct fwtty_port *port, int rcode)
198{
199 switch (rcode) {
200 case RCODE_SEND_ERROR:
201 fwtty_err_ratelimited(port, "card busy\n");
202 break;
203 case RCODE_ADDRESS_ERROR:
204 fwtty_err_ratelimited(port, "bad unit addr or write length\n");
205 break;
206 case RCODE_DATA_ERROR:
207 fwtty_err_ratelimited(port, "failed rx\n");
208 break;
209 case RCODE_NO_ACK:
210 fwtty_err_ratelimited(port, "missing ack\n");
211 break;
212 case RCODE_BUSY:
213 fwtty_err_ratelimited(port, "remote busy\n");
214 break;
215 default:
216 fwtty_err_ratelimited(port, "failed tx: %d\n", rcode);
217 }
218}
219
220static void fwtty_txn_constructor(void *this)
221{
222 struct fwtty_transaction *txn = this;
223
224 init_timer(&txn->fw_txn.split_timeout_timer);
225}
226
227static void fwtty_common_callback(struct fw_card *card, int rcode,
228 void *payload, size_t len, void *cb_data)
229{
230 struct fwtty_transaction *txn = cb_data;
231 struct fwtty_port *port = txn->port;
232
233 if (port && rcode != RCODE_COMPLETE)
234 fwtty_log_tx_error(port, rcode);
235 if (txn->callback)
236 txn->callback(card, rcode, payload, len, txn);
237 kmem_cache_free(fwtty_txn_cache, txn);
238}
239
240static int fwtty_send_data_async(struct fwtty_peer *peer, int tcode,
241 unsigned long long addr, void *payload,
242 size_t len, fwtty_transaction_cb callback,
243 struct fwtty_port *port)
244{
245 struct fwtty_transaction *txn;
246 int generation;
247
248 txn = kmem_cache_alloc(fwtty_txn_cache, GFP_ATOMIC);
249 if (!txn)
250 return -ENOMEM;
251
252 txn->callback = callback;
253 txn->port = port;
254
255 generation = peer->generation;
256 smp_rmb();
257 fw_send_request(peer->serial->card, &txn->fw_txn, tcode,
258 peer->node_id, generation, peer->speed, addr, payload,
259 len, fwtty_common_callback, txn);
260 return 0;
261}
262
263static void fwtty_send_txn_async(struct fwtty_peer *peer,
264 struct fwtty_transaction *txn, int tcode,
265 unsigned long long addr, void *payload,
266 size_t len, fwtty_transaction_cb callback,
267 struct fwtty_port *port)
268{
269 int generation;
270
271 txn->callback = callback;
272 txn->port = port;
273
274 generation = peer->generation;
275 smp_rmb();
276 fw_send_request(peer->serial->card, &txn->fw_txn, tcode,
277 peer->node_id, generation, peer->speed, addr, payload,
278 len, fwtty_common_callback, txn);
279}
280
281static void __fwtty_restart_tx(struct fwtty_port *port)
282{
283 int len, avail;
284
285 len = dma_fifo_out_level(&port->tx_fifo);
286 if (len)
287 schedule_delayed_work(&port->drain, 0);
288 avail = dma_fifo_avail(&port->tx_fifo);
289
290 fwtty_dbg(port, "fifo len: %d avail: %d\n", len, avail);
291}
292
293static void fwtty_restart_tx(struct fwtty_port *port)
294{
295 spin_lock_bh(&port->lock);
296 __fwtty_restart_tx(port);
297 spin_unlock_bh(&port->lock);
298}
299
300
301
302
303
304
305
306static void fwtty_update_port_status(struct fwtty_port *port,
307 unsigned int status)
308{
309 unsigned int delta;
310 struct tty_struct *tty;
311
312
313 status &= ~MCTRL_MASK;
314 delta = (port->mstatus ^ status) & ~MCTRL_MASK;
315 delta &= ~(status & TIOCM_RNG);
316 port->mstatus = status;
317
318 if (delta & TIOCM_RNG)
319 ++port->icount.rng;
320 if (delta & TIOCM_DSR)
321 ++port->icount.dsr;
322 if (delta & TIOCM_CAR)
323 ++port->icount.dcd;
324 if (delta & TIOCM_CTS)
325 ++port->icount.cts;
326
327 fwtty_dbg(port, "status: %x delta: %x\n", status, delta);
328
329 if (delta & TIOCM_CAR) {
330 tty = tty_port_tty_get(&port->port);
331 if (tty && !C_CLOCAL(tty)) {
332 if (status & TIOCM_CAR)
333 wake_up_interruptible(&port->port.open_wait);
334 else
335 schedule_work(&port->hangup);
336 }
337 tty_kref_put(tty);
338 }
339
340 if (delta & TIOCM_CTS) {
341 tty = tty_port_tty_get(&port->port);
342 if (tty && C_CRTSCTS(tty)) {
343 if (tty->hw_stopped) {
344 if (status & TIOCM_CTS) {
345 tty->hw_stopped = 0;
346 if (port->loopback)
347 __fwtty_restart_tx(port);
348 else
349 fwtty_restart_tx(port);
350 }
351 } else {
352 if (~status & TIOCM_CTS)
353 tty->hw_stopped = 1;
354 }
355 }
356 tty_kref_put(tty);
357
358 } else if (delta & OOB_TX_THROTTLE) {
359 tty = tty_port_tty_get(&port->port);
360 if (tty) {
361 if (tty->hw_stopped) {
362 if (~status & OOB_TX_THROTTLE) {
363 tty->hw_stopped = 0;
364 if (port->loopback)
365 __fwtty_restart_tx(port);
366 else
367 fwtty_restart_tx(port);
368 }
369 } else {
370 if (status & OOB_TX_THROTTLE)
371 tty->hw_stopped = 1;
372 }
373 }
374 tty_kref_put(tty);
375 }
376
377 if (delta & (UART_LSR_BI << 24)) {
378 if (status & (UART_LSR_BI << 24)) {
379 port->break_last = jiffies;
380 schedule_delayed_work(&port->emit_breaks, 0);
381 } else {
382
383 mod_delayed_work(system_wq, &port->emit_breaks, 0);
384 }
385 }
386
387 if (delta & (TIOCM_DSR | TIOCM_CAR | TIOCM_CTS | TIOCM_RNG))
388 wake_up_interruptible(&port->port.delta_msr_wait);
389}
390
391
392
393
394
395
396
397
398
399
400static unsigned int __fwtty_port_line_status(struct fwtty_port *port)
401{
402 unsigned int status = 0;
403
404
405
406 if (port->mctrl & TIOCM_DTR)
407 status |= TIOCM_DSR | TIOCM_CAR;
408 if (port->mctrl & TIOCM_RTS)
409 status |= TIOCM_CTS;
410 if (port->mctrl & OOB_RX_THROTTLE)
411 status |= OOB_TX_THROTTLE;
412
413 if (port->break_ctl)
414 status |= UART_LSR_BI << 24;
415
416 return status;
417}
418
419
420
421
422
423
424static int __fwtty_write_port_status(struct fwtty_port *port)
425{
426 struct fwtty_peer *peer;
427 int err = -ENOENT;
428 unsigned int status = __fwtty_port_line_status(port);
429
430 rcu_read_lock();
431 peer = rcu_dereference(port->peer);
432 if (peer) {
433 err = fwtty_send_data_async(peer, TCODE_WRITE_QUADLET_REQUEST,
434 peer->status_addr, &status,
435 sizeof(status), NULL, port);
436 }
437 rcu_read_unlock();
438
439 return err;
440}
441
442
443
444
445static int fwtty_write_port_status(struct fwtty_port *port)
446{
447 int err;
448
449 spin_lock_bh(&port->lock);
450 err = __fwtty_write_port_status(port);
451 spin_unlock_bh(&port->lock);
452 return err;
453}
454
455static void fwtty_throttle_port(struct fwtty_port *port)
456{
457 struct tty_struct *tty;
458 unsigned int old;
459
460 tty = tty_port_tty_get(&port->port);
461 if (!tty)
462 return;
463
464 spin_lock_bh(&port->lock);
465
466 old = port->mctrl;
467 port->mctrl |= OOB_RX_THROTTLE;
468 if (C_CRTSCTS(tty))
469 port->mctrl &= ~TIOCM_RTS;
470 if (~old & OOB_RX_THROTTLE)
471 __fwtty_write_port_status(port);
472
473 spin_unlock_bh(&port->lock);
474
475 tty_kref_put(tty);
476}
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498static void fwtty_do_hangup(struct work_struct *work)
499{
500 struct fwtty_port *port = to_port(work, hangup);
501 struct tty_struct *tty;
502
503 schedule_timeout_uninterruptible(msecs_to_jiffies(50));
504
505 tty = tty_port_tty_get(&port->port);
506 if (tty)
507 tty_vhangup(tty);
508 tty_kref_put(tty);
509}
510
511static void fwtty_emit_breaks(struct work_struct *work)
512{
513 struct fwtty_port *port = to_port(to_delayed_work(work), emit_breaks);
514 static const char buf[16];
515 unsigned long now = jiffies;
516 unsigned long elapsed = now - port->break_last;
517 int n, t, c, brk = 0;
518
519
520 n = (elapsed * port->cps) / HZ + 1;
521 port->break_last = now;
522
523 fwtty_dbg(port, "sending %d brks\n", n);
524
525 while (n) {
526 t = min(n, 16);
527 c = tty_insert_flip_string_fixed_flag(&port->port, buf,
528 TTY_BREAK, t);
529 n -= c;
530 brk += c;
531 if (c < t)
532 break;
533 }
534 tty_flip_buffer_push(&port->port);
535
536 if (port->mstatus & (UART_LSR_BI << 24))
537 schedule_delayed_work(&port->emit_breaks, FREQ_BREAKS);
538 port->icount.brk += brk;
539}
540
541static int fwtty_rx(struct fwtty_port *port, unsigned char *data, size_t len)
542{
543 int c, n = len;
544 unsigned int lsr;
545 int err = 0;
546
547 fwtty_dbg(port, "%d\n", n);
548 fwtty_profile_data(port->stats.reads, n);
549
550 if (port->write_only) {
551 n = 0;
552 goto out;
553 }
554
555
556 lsr = (port->mstatus >> 24) & ~UART_LSR_BI;
557
558 if (port->overrun)
559 lsr |= UART_LSR_OE;
560
561 if (lsr & UART_LSR_OE)
562 ++port->icount.overrun;
563
564 lsr &= port->status_mask;
565 if (lsr & ~port->ignore_mask & UART_LSR_OE) {
566 if (!tty_insert_flip_char(&port->port, 0, TTY_OVERRUN)) {
567 err = -EIO;
568 goto out;
569 }
570 }
571 port->overrun = false;
572
573 if (lsr & port->ignore_mask & ~UART_LSR_OE) {
574
575 n = 0;
576 goto out;
577 }
578
579 c = tty_insert_flip_string_fixed_flag(&port->port, data, TTY_NORMAL, n);
580 if (c > 0)
581 tty_flip_buffer_push(&port->port);
582 n -= c;
583
584 if (n) {
585 port->overrun = true;
586 err = -EIO;
587 fwtty_err_ratelimited(port, "flip buffer overrun\n");
588
589 } else {
590
591
592
593
594
595 if (tty_buffer_space_avail(&port->port) < HIGH_WATERMARK)
596 fwtty_throttle_port(port);
597 }
598
599out:
600 port->icount.rx += len;
601 port->stats.lost += n;
602 return err;
603}
604
605
606
607
608
609
610
611static void fwtty_port_handler(struct fw_card *card,
612 struct fw_request *request,
613 int tcode, int destination, int source,
614 int generation,
615 unsigned long long addr,
616 void *data, size_t len,
617 void *callback_data)
618{
619 struct fwtty_port *port = callback_data;
620 struct fwtty_peer *peer;
621 int err;
622 int rcode;
623
624
625 rcu_read_lock();
626 peer = __fwserial_peer_by_node_id(card, generation, source);
627 rcu_read_unlock();
628 if (!peer || peer != rcu_access_pointer(port->peer)) {
629 rcode = RCODE_ADDRESS_ERROR;
630 fwtty_err_ratelimited(port, "ignoring unauthenticated data\n");
631 goto respond;
632 }
633
634 switch (tcode) {
635 case TCODE_WRITE_QUADLET_REQUEST:
636 if (addr != port->rx_handler.offset || len != 4) {
637 rcode = RCODE_ADDRESS_ERROR;
638 } else {
639 fwtty_update_port_status(port, *(unsigned int *)data);
640 rcode = RCODE_COMPLETE;
641 }
642 break;
643
644 case TCODE_WRITE_BLOCK_REQUEST:
645 if (addr != port->rx_handler.offset + 4 ||
646 len > port->rx_handler.length - 4) {
647 rcode = RCODE_ADDRESS_ERROR;
648 } else {
649 err = fwtty_rx(port, data, len);
650 switch (err) {
651 case 0:
652 rcode = RCODE_COMPLETE;
653 break;
654 case -EIO:
655 rcode = RCODE_DATA_ERROR;
656 break;
657 default:
658 rcode = RCODE_CONFLICT_ERROR;
659 break;
660 }
661 }
662 break;
663
664 default:
665 rcode = RCODE_TYPE_ERROR;
666 }
667
668respond:
669 fw_send_response(card, request, rcode);
670}
671
672
673
674
675
676
677
678
679
680static void fwtty_tx_complete(struct fw_card *card, int rcode,
681 void *data, size_t length,
682 struct fwtty_transaction *txn)
683{
684 struct fwtty_port *port = txn->port;
685 int len;
686
687 fwtty_dbg(port, "rcode: %d\n", rcode);
688
689 switch (rcode) {
690 case RCODE_COMPLETE:
691 spin_lock_bh(&port->lock);
692 dma_fifo_out_complete(&port->tx_fifo, &txn->dma_pended);
693 len = dma_fifo_level(&port->tx_fifo);
694 spin_unlock_bh(&port->lock);
695
696 port->icount.tx += txn->dma_pended.len;
697 break;
698
699 default:
700
701 spin_lock_bh(&port->lock);
702 dma_fifo_out_complete(&port->tx_fifo, &txn->dma_pended);
703 len = dma_fifo_level(&port->tx_fifo);
704 spin_unlock_bh(&port->lock);
705
706 port->stats.dropped += txn->dma_pended.len;
707 }
708
709 if (len < WAKEUP_CHARS)
710 tty_port_tty_wakeup(&port->port);
711}
712
713static int fwtty_tx(struct fwtty_port *port, bool drain)
714{
715 struct fwtty_peer *peer;
716 struct fwtty_transaction *txn;
717 struct tty_struct *tty;
718 int n, len;
719
720 tty = tty_port_tty_get(&port->port);
721 if (!tty)
722 return -ENOENT;
723
724 rcu_read_lock();
725 peer = rcu_dereference(port->peer);
726 if (!peer) {
727 n = -EIO;
728 goto out;
729 }
730
731 if (test_and_set_bit(IN_TX, &port->flags)) {
732 n = -EALREADY;
733 goto out;
734 }
735
736
737 n = -EAGAIN;
738 while (!tty->stopped && !tty->hw_stopped &&
739 !test_bit(STOP_TX, &port->flags)) {
740 txn = kmem_cache_alloc(fwtty_txn_cache, GFP_ATOMIC);
741 if (!txn) {
742 n = -ENOMEM;
743 break;
744 }
745
746 spin_lock_bh(&port->lock);
747 n = dma_fifo_out_pend(&port->tx_fifo, &txn->dma_pended);
748 spin_unlock_bh(&port->lock);
749
750 fwtty_dbg(port, "out: %u rem: %d\n", txn->dma_pended.len, n);
751
752 if (n < 0) {
753 kmem_cache_free(fwtty_txn_cache, txn);
754 if (n == -EAGAIN) {
755 ++port->stats.tx_stall;
756 } else if (n == -ENODATA) {
757 fwtty_profile_data(port->stats.txns, 0);
758 } else {
759 ++port->stats.fifo_errs;
760 fwtty_err_ratelimited(port, "fifo err: %d\n",
761 n);
762 }
763 break;
764 }
765
766 fwtty_profile_data(port->stats.txns, txn->dma_pended.len);
767
768 fwtty_send_txn_async(peer, txn, TCODE_WRITE_BLOCK_REQUEST,
769 peer->fifo_addr, txn->dma_pended.data,
770 txn->dma_pended.len, fwtty_tx_complete,
771 port);
772 ++port->stats.sent;
773
774
775
776
777
778 if (n == 0 || (!drain && n < WRITER_MINIMUM))
779 break;
780 }
781
782 if (n >= 0 || n == -EAGAIN || n == -ENOMEM || n == -ENODATA) {
783 spin_lock_bh(&port->lock);
784 len = dma_fifo_out_level(&port->tx_fifo);
785 if (len) {
786 unsigned long delay = (n == -ENOMEM) ? HZ : 1;
787
788 schedule_delayed_work(&port->drain, delay);
789 }
790 len = dma_fifo_level(&port->tx_fifo);
791 spin_unlock_bh(&port->lock);
792
793
794 if (drain && len < WAKEUP_CHARS)
795 tty_wakeup(tty);
796 }
797
798 clear_bit(IN_TX, &port->flags);
799 wake_up_interruptible(&port->wait_tx);
800
801out:
802 rcu_read_unlock();
803 tty_kref_put(tty);
804 return n;
805}
806
807static void fwtty_drain_tx(struct work_struct *work)
808{
809 struct fwtty_port *port = to_port(to_delayed_work(work), drain);
810
811 fwtty_tx(port, true);
812}
813
814static void fwtty_write_xchar(struct fwtty_port *port, char ch)
815{
816 struct fwtty_peer *peer;
817
818 ++port->stats.xchars;
819
820 fwtty_dbg(port, "%02x\n", ch);
821
822 rcu_read_lock();
823 peer = rcu_dereference(port->peer);
824 if (peer) {
825 fwtty_send_data_async(peer, TCODE_WRITE_BLOCK_REQUEST,
826 peer->fifo_addr, &ch, sizeof(ch),
827 NULL, port);
828 }
829 rcu_read_unlock();
830}
831
832static struct fwtty_port *fwtty_port_get(unsigned int index)
833{
834 struct fwtty_port *port;
835
836 if (index >= MAX_TOTAL_PORTS)
837 return NULL;
838
839 mutex_lock(&port_table_lock);
840 port = port_table[index];
841 if (port)
842 kref_get(&port->serial->kref);
843 mutex_unlock(&port_table_lock);
844 return port;
845}
846
847static int fwtty_ports_add(struct fw_serial *serial)
848{
849 int err = -EBUSY;
850 int i, j;
851
852 if (port_table_corrupt)
853 return err;
854
855 mutex_lock(&port_table_lock);
856 for (i = 0; i + num_ports <= MAX_TOTAL_PORTS; i += num_ports) {
857 if (!port_table[i]) {
858 for (j = 0; j < num_ports; ++i, ++j) {
859 serial->ports[j]->index = i;
860 port_table[i] = serial->ports[j];
861 }
862 err = 0;
863 break;
864 }
865 }
866 mutex_unlock(&port_table_lock);
867 return err;
868}
869
870static void fwserial_destroy(struct kref *kref)
871{
872 struct fw_serial *serial = to_serial(kref, kref);
873 struct fwtty_port **ports = serial->ports;
874 int j, i = ports[0]->index;
875
876 synchronize_rcu();
877
878 mutex_lock(&port_table_lock);
879 for (j = 0; j < num_ports; ++i, ++j) {
880 port_table_corrupt |= port_table[i] != ports[j];
881 WARN_ONCE(port_table_corrupt, "port_table[%d]: %p != ports[%d]: %p",
882 i, port_table[i], j, ports[j]);
883
884 port_table[i] = NULL;
885 }
886 mutex_unlock(&port_table_lock);
887
888 for (j = 0; j < num_ports; ++j) {
889 fw_core_remove_address_handler(&ports[j]->rx_handler);
890 tty_port_destroy(&ports[j]->port);
891 kfree(ports[j]);
892 }
893 kfree(serial);
894}
895
896static void fwtty_port_put(struct fwtty_port *port)
897{
898 kref_put(&port->serial->kref, fwserial_destroy);
899}
900
901static void fwtty_port_dtr_rts(struct tty_port *tty_port, int on)
902{
903 struct fwtty_port *port = to_port(tty_port, port);
904
905 fwtty_dbg(port, "on/off: %d\n", on);
906
907 spin_lock_bh(&port->lock);
908
909 if (!port->port.console) {
910 if (on)
911 port->mctrl |= TIOCM_DTR | TIOCM_RTS;
912 else
913 port->mctrl &= ~(TIOCM_DTR | TIOCM_RTS);
914 }
915
916 __fwtty_write_port_status(port);
917 spin_unlock_bh(&port->lock);
918}
919
920
921
922
923
924
925
926static int fwtty_port_carrier_raised(struct tty_port *tty_port)
927{
928 struct fwtty_port *port = to_port(tty_port, port);
929 int rc;
930
931 rc = (port->mstatus & TIOCM_CAR);
932
933 fwtty_dbg(port, "%d\n", rc);
934
935 return rc;
936}
937
938static unsigned int set_termios(struct fwtty_port *port, struct tty_struct *tty)
939{
940 unsigned int baud, frame;
941
942 baud = tty_termios_baud_rate(&tty->termios);
943 tty_termios_encode_baud_rate(&tty->termios, baud, baud);
944
945
946 frame = 12 + ((C_CSTOPB(tty)) ? 4 : 2) + ((C_PARENB(tty)) ? 2 : 0);
947
948 switch (C_CSIZE(tty)) {
949 case CS5:
950 frame -= (C_CSTOPB(tty)) ? 1 : 0;
951 break;
952 case CS6:
953 frame += 2;
954 break;
955 case CS7:
956 frame += 4;
957 break;
958 case CS8:
959 frame += 6;
960 break;
961 }
962
963 port->cps = (baud << 1) / frame;
964
965 port->status_mask = UART_LSR_OE;
966 if (_I_FLAG(tty, BRKINT | PARMRK))
967 port->status_mask |= UART_LSR_BI;
968
969 port->ignore_mask = 0;
970 if (I_IGNBRK(tty)) {
971 port->ignore_mask |= UART_LSR_BI;
972 if (I_IGNPAR(tty))
973 port->ignore_mask |= UART_LSR_OE;
974 }
975
976 port->write_only = !C_CREAD(tty);
977
978
979 if (port->loopback) {
980 tty->termios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHOKE |
981 ECHONL | ECHOPRT | ECHOCTL);
982 tty->termios.c_oflag &= ~ONLCR;
983 }
984
985 return baud;
986}
987
988static int fwtty_port_activate(struct tty_port *tty_port,
989 struct tty_struct *tty)
990{
991 struct fwtty_port *port = to_port(tty_port, port);
992 unsigned int baud;
993 int err;
994
995 set_bit(TTY_IO_ERROR, &tty->flags);
996
997 err = dma_fifo_alloc(&port->tx_fifo, FWTTY_PORT_TXFIFO_LEN,
998 cache_line_size(),
999 port->max_payload,
1000 FWTTY_PORT_MAX_PEND_DMA,
1001 GFP_KERNEL);
1002 if (err)
1003 return err;
1004
1005 spin_lock_bh(&port->lock);
1006
1007 baud = set_termios(port, tty);
1008
1009
1010 if (!port->port.console) {
1011 port->mctrl = 0;
1012 if (baud != 0)
1013 port->mctrl = TIOCM_DTR | TIOCM_RTS;
1014 }
1015
1016 if (C_CRTSCTS(tty) && ~port->mstatus & TIOCM_CTS)
1017 tty->hw_stopped = 1;
1018
1019 __fwtty_write_port_status(port);
1020 spin_unlock_bh(&port->lock);
1021
1022 clear_bit(TTY_IO_ERROR, &tty->flags);
1023
1024 return 0;
1025}
1026
1027
1028
1029
1030
1031
1032
1033static void fwtty_port_shutdown(struct tty_port *tty_port)
1034{
1035 struct fwtty_port *port = to_port(tty_port, port);
1036
1037
1038
1039 cancel_delayed_work_sync(&port->emit_breaks);
1040 cancel_delayed_work_sync(&port->drain);
1041
1042 spin_lock_bh(&port->lock);
1043 port->flags = 0;
1044 port->break_ctl = 0;
1045 port->overrun = 0;
1046 __fwtty_write_port_status(port);
1047 dma_fifo_free(&port->tx_fifo);
1048 spin_unlock_bh(&port->lock);
1049}
1050
1051static int fwtty_open(struct tty_struct *tty, struct file *fp)
1052{
1053 struct fwtty_port *port = tty->driver_data;
1054
1055 return tty_port_open(&port->port, tty, fp);
1056}
1057
1058static void fwtty_close(struct tty_struct *tty, struct file *fp)
1059{
1060 struct fwtty_port *port = tty->driver_data;
1061
1062 tty_port_close(&port->port, tty, fp);
1063}
1064
1065static void fwtty_hangup(struct tty_struct *tty)
1066{
1067 struct fwtty_port *port = tty->driver_data;
1068
1069 tty_port_hangup(&port->port);
1070}
1071
1072static void fwtty_cleanup(struct tty_struct *tty)
1073{
1074 struct fwtty_port *port = tty->driver_data;
1075
1076 tty->driver_data = NULL;
1077 fwtty_port_put(port);
1078}
1079
1080static int fwtty_install(struct tty_driver *driver, struct tty_struct *tty)
1081{
1082 struct fwtty_port *port = fwtty_port_get(tty->index);
1083 int err;
1084
1085 err = tty_standard_install(driver, tty);
1086 if (!err)
1087 tty->driver_data = port;
1088 else
1089 fwtty_port_put(port);
1090 return err;
1091}
1092
1093static int fwloop_install(struct tty_driver *driver, struct tty_struct *tty)
1094{
1095 struct fwtty_port *port = fwtty_port_get(table_idx(tty->index));
1096 int err;
1097
1098 err = tty_standard_install(driver, tty);
1099 if (!err)
1100 tty->driver_data = port;
1101 else
1102 fwtty_port_put(port);
1103 return err;
1104}
1105
1106static int fwtty_write(struct tty_struct *tty, const unsigned char *buf, int c)
1107{
1108 struct fwtty_port *port = tty->driver_data;
1109 int n, len;
1110
1111 fwtty_dbg(port, "%d\n", c);
1112 fwtty_profile_data(port->stats.writes, c);
1113
1114 spin_lock_bh(&port->lock);
1115 n = dma_fifo_in(&port->tx_fifo, buf, c);
1116 len = dma_fifo_out_level(&port->tx_fifo);
1117 if (len < DRAIN_THRESHOLD)
1118 schedule_delayed_work(&port->drain, 1);
1119 spin_unlock_bh(&port->lock);
1120
1121 if (len >= DRAIN_THRESHOLD)
1122 fwtty_tx(port, false);
1123
1124 debug_short_write(port, c, n);
1125
1126 return (n < 0) ? 0 : n;
1127}
1128
1129static int fwtty_write_room(struct tty_struct *tty)
1130{
1131 struct fwtty_port *port = tty->driver_data;
1132 int n;
1133
1134 spin_lock_bh(&port->lock);
1135 n = dma_fifo_avail(&port->tx_fifo);
1136 spin_unlock_bh(&port->lock);
1137
1138 fwtty_dbg(port, "%d\n", n);
1139
1140 return n;
1141}
1142
1143static int fwtty_chars_in_buffer(struct tty_struct *tty)
1144{
1145 struct fwtty_port *port = tty->driver_data;
1146 int n;
1147
1148 spin_lock_bh(&port->lock);
1149 n = dma_fifo_level(&port->tx_fifo);
1150 spin_unlock_bh(&port->lock);
1151
1152 fwtty_dbg(port, "%d\n", n);
1153
1154 return n;
1155}
1156
1157static void fwtty_send_xchar(struct tty_struct *tty, char ch)
1158{
1159 struct fwtty_port *port = tty->driver_data;
1160
1161 fwtty_dbg(port, "%02x\n", ch);
1162
1163 fwtty_write_xchar(port, ch);
1164}
1165
1166static void fwtty_throttle(struct tty_struct *tty)
1167{
1168 struct fwtty_port *port = tty->driver_data;
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181 ++port->stats.throttled;
1182}
1183
1184static void fwtty_unthrottle(struct tty_struct *tty)
1185{
1186 struct fwtty_port *port = tty->driver_data;
1187
1188 fwtty_dbg(port, "CRTSCTS: %d\n", C_CRTSCTS(tty) != 0);
1189
1190 fwtty_profile_fifo(port, port->stats.unthrottle);
1191
1192 spin_lock_bh(&port->lock);
1193 port->mctrl &= ~OOB_RX_THROTTLE;
1194 if (C_CRTSCTS(tty))
1195 port->mctrl |= TIOCM_RTS;
1196 __fwtty_write_port_status(port);
1197 spin_unlock_bh(&port->lock);
1198}
1199
1200static int check_msr_delta(struct fwtty_port *port, unsigned long mask,
1201 struct async_icount *prev)
1202{
1203 struct async_icount now;
1204 int delta;
1205
1206 now = port->icount;
1207
1208 delta = ((mask & TIOCM_RNG && prev->rng != now.rng) ||
1209 (mask & TIOCM_DSR && prev->dsr != now.dsr) ||
1210 (mask & TIOCM_CAR && prev->dcd != now.dcd) ||
1211 (mask & TIOCM_CTS && prev->cts != now.cts));
1212
1213 *prev = now;
1214
1215 return delta;
1216}
1217
1218static int wait_msr_change(struct fwtty_port *port, unsigned long mask)
1219{
1220 struct async_icount prev;
1221
1222 prev = port->icount;
1223
1224 return wait_event_interruptible(port->port.delta_msr_wait,
1225 check_msr_delta(port, mask, &prev));
1226}
1227
1228static int get_serial_info(struct fwtty_port *port,
1229 struct serial_struct __user *info)
1230{
1231 struct serial_struct tmp;
1232
1233 memset(&tmp, 0, sizeof(tmp));
1234
1235 tmp.type = PORT_UNKNOWN;
1236 tmp.line = port->port.tty->index;
1237 tmp.flags = port->port.flags;
1238 tmp.xmit_fifo_size = FWTTY_PORT_TXFIFO_LEN;
1239 tmp.baud_base = 400000000;
1240 tmp.close_delay = port->port.close_delay;
1241
1242 return (copy_to_user(info, &tmp, sizeof(*info))) ? -EFAULT : 0;
1243}
1244
1245static int set_serial_info(struct fwtty_port *port,
1246 struct serial_struct __user *info)
1247{
1248 struct serial_struct tmp;
1249
1250 if (copy_from_user(&tmp, info, sizeof(tmp)))
1251 return -EFAULT;
1252
1253 if (tmp.irq != 0 || tmp.port != 0 || tmp.custom_divisor != 0 ||
1254 tmp.baud_base != 400000000)
1255 return -EPERM;
1256
1257 if (!capable(CAP_SYS_ADMIN)) {
1258 if (((tmp.flags & ~ASYNC_USR_MASK) !=
1259 (port->port.flags & ~ASYNC_USR_MASK)))
1260 return -EPERM;
1261 } else {
1262 port->port.close_delay = tmp.close_delay * HZ / 100;
1263 }
1264
1265 return 0;
1266}
1267
1268static int fwtty_ioctl(struct tty_struct *tty, unsigned int cmd,
1269 unsigned long arg)
1270{
1271 struct fwtty_port *port = tty->driver_data;
1272 int err;
1273
1274 switch (cmd) {
1275 case TIOCGSERIAL:
1276 mutex_lock(&port->port.mutex);
1277 err = get_serial_info(port, (void __user *)arg);
1278 mutex_unlock(&port->port.mutex);
1279 break;
1280
1281 case TIOCSSERIAL:
1282 mutex_lock(&port->port.mutex);
1283 err = set_serial_info(port, (void __user *)arg);
1284 mutex_unlock(&port->port.mutex);
1285 break;
1286
1287 case TIOCMIWAIT:
1288 err = wait_msr_change(port, arg);
1289 break;
1290
1291 default:
1292 err = -ENOIOCTLCMD;
1293 }
1294
1295 return err;
1296}
1297
1298static void fwtty_set_termios(struct tty_struct *tty, struct ktermios *old)
1299{
1300 struct fwtty_port *port = tty->driver_data;
1301 unsigned int baud;
1302
1303 spin_lock_bh(&port->lock);
1304 baud = set_termios(port, tty);
1305
1306 if ((baud == 0) && (old->c_cflag & CBAUD)) {
1307 port->mctrl &= ~(TIOCM_DTR | TIOCM_RTS);
1308 } else if ((baud != 0) && !(old->c_cflag & CBAUD)) {
1309 if (C_CRTSCTS(tty) || !tty_throttled(tty))
1310 port->mctrl |= TIOCM_DTR | TIOCM_RTS;
1311 else
1312 port->mctrl |= TIOCM_DTR;
1313 }
1314 __fwtty_write_port_status(port);
1315 spin_unlock_bh(&port->lock);
1316
1317 if (old->c_cflag & CRTSCTS) {
1318 if (!C_CRTSCTS(tty)) {
1319 tty->hw_stopped = 0;
1320 fwtty_restart_tx(port);
1321 }
1322 } else if (C_CRTSCTS(tty) && ~port->mstatus & TIOCM_CTS) {
1323 tty->hw_stopped = 1;
1324 }
1325}
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337static int fwtty_break_ctl(struct tty_struct *tty, int state)
1338{
1339 struct fwtty_port *port = tty->driver_data;
1340 long ret;
1341
1342 fwtty_dbg(port, "%d\n", state);
1343
1344 if (state == -1) {
1345 set_bit(STOP_TX, &port->flags);
1346 ret = wait_event_interruptible_timeout(port->wait_tx,
1347 !test_bit(IN_TX, &port->flags),
1348 10);
1349 if (ret == 0 || ret == -ERESTARTSYS) {
1350 clear_bit(STOP_TX, &port->flags);
1351 fwtty_restart_tx(port);
1352 return -EINTR;
1353 }
1354 }
1355
1356 spin_lock_bh(&port->lock);
1357 port->break_ctl = (state == -1);
1358 __fwtty_write_port_status(port);
1359 spin_unlock_bh(&port->lock);
1360
1361 if (state == 0) {
1362 spin_lock_bh(&port->lock);
1363 dma_fifo_reset(&port->tx_fifo);
1364 clear_bit(STOP_TX, &port->flags);
1365 spin_unlock_bh(&port->lock);
1366 }
1367 return 0;
1368}
1369
1370static int fwtty_tiocmget(struct tty_struct *tty)
1371{
1372 struct fwtty_port *port = tty->driver_data;
1373 unsigned int tiocm;
1374
1375 spin_lock_bh(&port->lock);
1376 tiocm = (port->mctrl & MCTRL_MASK) | (port->mstatus & ~MCTRL_MASK);
1377 spin_unlock_bh(&port->lock);
1378
1379 fwtty_dbg(port, "%x\n", tiocm);
1380
1381 return tiocm;
1382}
1383
1384static int fwtty_tiocmset(struct tty_struct *tty,
1385 unsigned int set, unsigned int clear)
1386{
1387 struct fwtty_port *port = tty->driver_data;
1388
1389 fwtty_dbg(port, "set: %x clear: %x\n", set, clear);
1390
1391
1392
1393 spin_lock_bh(&port->lock);
1394 port->mctrl &= ~(clear & MCTRL_MASK & 0xffff);
1395 port->mctrl |= set & MCTRL_MASK & 0xffff;
1396 __fwtty_write_port_status(port);
1397 spin_unlock_bh(&port->lock);
1398 return 0;
1399}
1400
1401static int fwtty_get_icount(struct tty_struct *tty,
1402 struct serial_icounter_struct *icount)
1403{
1404 struct fwtty_port *port = tty->driver_data;
1405 struct stats stats;
1406
1407 memcpy(&stats, &port->stats, sizeof(stats));
1408 if (port->port.console)
1409 (*port->fwcon_ops->stats)(&stats, port->con_data);
1410
1411 icount->cts = port->icount.cts;
1412 icount->dsr = port->icount.dsr;
1413 icount->rng = port->icount.rng;
1414 icount->dcd = port->icount.dcd;
1415 icount->rx = port->icount.rx;
1416 icount->tx = port->icount.tx + stats.xchars;
1417 icount->frame = port->icount.frame;
1418 icount->overrun = port->icount.overrun;
1419 icount->parity = port->icount.parity;
1420 icount->brk = port->icount.brk;
1421 icount->buf_overrun = port->icount.overrun;
1422 return 0;
1423}
1424
1425static void fwtty_proc_show_port(struct seq_file *m, struct fwtty_port *port)
1426{
1427 struct stats stats;
1428
1429 memcpy(&stats, &port->stats, sizeof(stats));
1430 if (port->port.console)
1431 (*port->fwcon_ops->stats)(&stats, port->con_data);
1432
1433 seq_printf(m, " addr:%012llx tx:%d rx:%d", port->rx_handler.offset,
1434 port->icount.tx + stats.xchars, port->icount.rx);
1435 seq_printf(m, " cts:%d dsr:%d rng:%d dcd:%d", port->icount.cts,
1436 port->icount.dsr, port->icount.rng, port->icount.dcd);
1437 seq_printf(m, " fe:%d oe:%d pe:%d brk:%d", port->icount.frame,
1438 port->icount.overrun, port->icount.parity, port->icount.brk);
1439}
1440
1441static void fwtty_debugfs_show_port(struct seq_file *m, struct fwtty_port *port)
1442{
1443 struct stats stats;
1444
1445 memcpy(&stats, &port->stats, sizeof(stats));
1446 if (port->port.console)
1447 (*port->fwcon_ops->stats)(&stats, port->con_data);
1448
1449 seq_printf(m, " dr:%d st:%d err:%d lost:%d", stats.dropped,
1450 stats.tx_stall, stats.fifo_errs, stats.lost);
1451 seq_printf(m, " pkts:%d thr:%d", stats.sent, stats.throttled);
1452
1453 if (port->port.console) {
1454 seq_puts(m, "\n ");
1455 (*port->fwcon_ops->proc_show)(m, port->con_data);
1456 }
1457
1458 fwtty_dump_profile(m, &port->stats);
1459}
1460
1461static void fwtty_debugfs_show_peer(struct seq_file *m, struct fwtty_peer *peer)
1462{
1463 int generation = peer->generation;
1464
1465 smp_rmb();
1466 seq_printf(m, " %s:", dev_name(&peer->unit->device));
1467 seq_printf(m, " node:%04x gen:%d", peer->node_id, generation);
1468 seq_printf(m, " sp:%d max:%d guid:%016llx", peer->speed,
1469 peer->max_payload, (unsigned long long)peer->guid);
1470 seq_printf(m, " mgmt:%012llx", (unsigned long long)peer->mgmt_addr);
1471 seq_printf(m, " addr:%012llx", (unsigned long long)peer->status_addr);
1472 seq_putc(m, '\n');
1473}
1474
1475static int fwtty_proc_show(struct seq_file *m, void *v)
1476{
1477 struct fwtty_port *port;
1478 int i;
1479
1480 seq_puts(m, "fwserinfo: 1.0 driver: 1.0\n");
1481 for (i = 0; i < MAX_TOTAL_PORTS && (port = fwtty_port_get(i)); ++i) {
1482 seq_printf(m, "%2d:", i);
1483 if (capable(CAP_SYS_ADMIN))
1484 fwtty_proc_show_port(m, port);
1485 fwtty_port_put(port);
1486 seq_puts(m, "\n");
1487 }
1488 return 0;
1489}
1490
1491static int fwtty_debugfs_stats_show(struct seq_file *m, void *v)
1492{
1493 struct fw_serial *serial = m->private;
1494 struct fwtty_port *port;
1495 int i;
1496
1497 for (i = 0; i < num_ports; ++i) {
1498 port = fwtty_port_get(serial->ports[i]->index);
1499 if (port) {
1500 seq_printf(m, "%2d:", port->index);
1501 fwtty_proc_show_port(m, port);
1502 fwtty_debugfs_show_port(m, port);
1503 fwtty_port_put(port);
1504 seq_puts(m, "\n");
1505 }
1506 }
1507 return 0;
1508}
1509
1510static int fwtty_debugfs_peers_show(struct seq_file *m, void *v)
1511{
1512 struct fw_serial *serial = m->private;
1513 struct fwtty_peer *peer;
1514
1515 rcu_read_lock();
1516 seq_printf(m, "card: %s guid: %016llx\n",
1517 dev_name(serial->card->device),
1518 (unsigned long long)serial->card->guid);
1519 list_for_each_entry_rcu(peer, &serial->peer_list, list)
1520 fwtty_debugfs_show_peer(m, peer);
1521 rcu_read_unlock();
1522 return 0;
1523}
1524
1525static int fwtty_proc_open(struct inode *inode, struct file *fp)
1526{
1527 return single_open(fp, fwtty_proc_show, NULL);
1528}
1529
1530static int fwtty_stats_open(struct inode *inode, struct file *fp)
1531{
1532 return single_open(fp, fwtty_debugfs_stats_show, inode->i_private);
1533}
1534
1535static int fwtty_peers_open(struct inode *inode, struct file *fp)
1536{
1537 return single_open(fp, fwtty_debugfs_peers_show, inode->i_private);
1538}
1539
1540static const struct file_operations fwtty_stats_fops = {
1541 .owner = THIS_MODULE,
1542 .open = fwtty_stats_open,
1543 .read = seq_read,
1544 .llseek = seq_lseek,
1545 .release = single_release,
1546};
1547
1548static const struct file_operations fwtty_peers_fops = {
1549 .owner = THIS_MODULE,
1550 .open = fwtty_peers_open,
1551 .read = seq_read,
1552 .llseek = seq_lseek,
1553 .release = single_release,
1554};
1555
1556static const struct file_operations fwtty_proc_fops = {
1557 .owner = THIS_MODULE,
1558 .open = fwtty_proc_open,
1559 .read = seq_read,
1560 .llseek = seq_lseek,
1561 .release = single_release,
1562};
1563
1564static const struct tty_port_operations fwtty_port_ops = {
1565 .dtr_rts = fwtty_port_dtr_rts,
1566 .carrier_raised = fwtty_port_carrier_raised,
1567 .shutdown = fwtty_port_shutdown,
1568 .activate = fwtty_port_activate,
1569};
1570
1571static const struct tty_operations fwtty_ops = {
1572 .open = fwtty_open,
1573 .close = fwtty_close,
1574 .hangup = fwtty_hangup,
1575 .cleanup = fwtty_cleanup,
1576 .install = fwtty_install,
1577 .write = fwtty_write,
1578 .write_room = fwtty_write_room,
1579 .chars_in_buffer = fwtty_chars_in_buffer,
1580 .send_xchar = fwtty_send_xchar,
1581 .throttle = fwtty_throttle,
1582 .unthrottle = fwtty_unthrottle,
1583 .ioctl = fwtty_ioctl,
1584 .set_termios = fwtty_set_termios,
1585 .break_ctl = fwtty_break_ctl,
1586 .tiocmget = fwtty_tiocmget,
1587 .tiocmset = fwtty_tiocmset,
1588 .get_icount = fwtty_get_icount,
1589 .proc_fops = &fwtty_proc_fops,
1590};
1591
1592static const struct tty_operations fwloop_ops = {
1593 .open = fwtty_open,
1594 .close = fwtty_close,
1595 .hangup = fwtty_hangup,
1596 .cleanup = fwtty_cleanup,
1597 .install = fwloop_install,
1598 .write = fwtty_write,
1599 .write_room = fwtty_write_room,
1600 .chars_in_buffer = fwtty_chars_in_buffer,
1601 .send_xchar = fwtty_send_xchar,
1602 .throttle = fwtty_throttle,
1603 .unthrottle = fwtty_unthrottle,
1604 .ioctl = fwtty_ioctl,
1605 .set_termios = fwtty_set_termios,
1606 .break_ctl = fwtty_break_ctl,
1607 .tiocmget = fwtty_tiocmget,
1608 .tiocmset = fwtty_tiocmset,
1609 .get_icount = fwtty_get_icount,
1610};
1611
1612static inline int mgmt_pkt_expected_len(__be16 code)
1613{
1614 static const struct fwserial_mgmt_pkt pkt;
1615
1616 switch (be16_to_cpu(code)) {
1617 case FWSC_VIRT_CABLE_PLUG:
1618 return sizeof(pkt.hdr) + sizeof(pkt.plug_req);
1619
1620 case FWSC_VIRT_CABLE_PLUG_RSP:
1621 return sizeof(pkt.hdr) + sizeof(pkt.plug_rsp);
1622
1623 case FWSC_VIRT_CABLE_UNPLUG:
1624 case FWSC_VIRT_CABLE_UNPLUG_RSP:
1625 case FWSC_VIRT_CABLE_PLUG_RSP | FWSC_RSP_NACK:
1626 case FWSC_VIRT_CABLE_UNPLUG_RSP | FWSC_RSP_NACK:
1627 return sizeof(pkt.hdr);
1628
1629 default:
1630 return -1;
1631 }
1632}
1633
1634static inline void fill_plug_params(struct virt_plug_params *params,
1635 struct fwtty_port *port)
1636{
1637 u64 status_addr = port->rx_handler.offset;
1638 u64 fifo_addr = port->rx_handler.offset + 4;
1639 size_t fifo_len = port->rx_handler.length - 4;
1640
1641 params->status_hi = cpu_to_be32(status_addr >> 32);
1642 params->status_lo = cpu_to_be32(status_addr);
1643 params->fifo_hi = cpu_to_be32(fifo_addr >> 32);
1644 params->fifo_lo = cpu_to_be32(fifo_addr);
1645 params->fifo_len = cpu_to_be32(fifo_len);
1646}
1647
1648static inline void fill_plug_req(struct fwserial_mgmt_pkt *pkt,
1649 struct fwtty_port *port)
1650{
1651 pkt->hdr.code = cpu_to_be16(FWSC_VIRT_CABLE_PLUG);
1652 pkt->hdr.len = cpu_to_be16(mgmt_pkt_expected_len(pkt->hdr.code));
1653 fill_plug_params(&pkt->plug_req, port);
1654}
1655
1656static inline void fill_plug_rsp_ok(struct fwserial_mgmt_pkt *pkt,
1657 struct fwtty_port *port)
1658{
1659 pkt->hdr.code = cpu_to_be16(FWSC_VIRT_CABLE_PLUG_RSP);
1660 pkt->hdr.len = cpu_to_be16(mgmt_pkt_expected_len(pkt->hdr.code));
1661 fill_plug_params(&pkt->plug_rsp, port);
1662}
1663
1664static inline void fill_plug_rsp_nack(struct fwserial_mgmt_pkt *pkt)
1665{
1666 pkt->hdr.code = cpu_to_be16(FWSC_VIRT_CABLE_PLUG_RSP | FWSC_RSP_NACK);
1667 pkt->hdr.len = cpu_to_be16(mgmt_pkt_expected_len(pkt->hdr.code));
1668}
1669
1670static inline void fill_unplug_req(struct fwserial_mgmt_pkt *pkt)
1671{
1672 pkt->hdr.code = cpu_to_be16(FWSC_VIRT_CABLE_UNPLUG);
1673 pkt->hdr.len = cpu_to_be16(mgmt_pkt_expected_len(pkt->hdr.code));
1674}
1675
1676static inline void fill_unplug_rsp_nack(struct fwserial_mgmt_pkt *pkt)
1677{
1678 pkt->hdr.code = cpu_to_be16(FWSC_VIRT_CABLE_UNPLUG_RSP | FWSC_RSP_NACK);
1679 pkt->hdr.len = cpu_to_be16(mgmt_pkt_expected_len(pkt->hdr.code));
1680}
1681
1682static inline void fill_unplug_rsp_ok(struct fwserial_mgmt_pkt *pkt)
1683{
1684 pkt->hdr.code = cpu_to_be16(FWSC_VIRT_CABLE_UNPLUG_RSP);
1685 pkt->hdr.len = cpu_to_be16(mgmt_pkt_expected_len(pkt->hdr.code));
1686}
1687
1688static void fwserial_virt_plug_complete(struct fwtty_peer *peer,
1689 struct virt_plug_params *params)
1690{
1691 struct fwtty_port *port = peer->port;
1692
1693 peer->status_addr = be32_to_u64(params->status_hi, params->status_lo);
1694 peer->fifo_addr = be32_to_u64(params->fifo_hi, params->fifo_lo);
1695 peer->fifo_len = be32_to_cpu(params->fifo_len);
1696 peer_set_state(peer, FWPS_ATTACHED);
1697
1698
1699 spin_lock_bh(&port->lock);
1700 port->max_payload = min(peer->max_payload, peer->fifo_len);
1701 dma_fifo_change_tx_limit(&port->tx_fifo, port->max_payload);
1702 spin_unlock_bh(&peer->port->lock);
1703
1704 if (port->port.console && port->fwcon_ops->notify)
1705 (*port->fwcon_ops->notify)(FWCON_NOTIFY_ATTACH, port->con_data);
1706
1707 fwtty_info(&peer->unit, "peer (guid:%016llx) connected on %s\n",
1708 (unsigned long long)peer->guid, dev_name(port->device));
1709}
1710
1711static inline int fwserial_send_mgmt_sync(struct fwtty_peer *peer,
1712 struct fwserial_mgmt_pkt *pkt)
1713{
1714 int generation;
1715 int rcode, tries = 5;
1716
1717 do {
1718 generation = peer->generation;
1719 smp_rmb();
1720
1721 rcode = fw_run_transaction(peer->serial->card,
1722 TCODE_WRITE_BLOCK_REQUEST,
1723 peer->node_id,
1724 generation, peer->speed,
1725 peer->mgmt_addr,
1726 pkt, be16_to_cpu(pkt->hdr.len));
1727 if (rcode == RCODE_BUSY || rcode == RCODE_SEND_ERROR ||
1728 rcode == RCODE_GENERATION) {
1729 fwtty_dbg(&peer->unit, "mgmt write error: %d\n", rcode);
1730 continue;
1731 } else {
1732 break;
1733 }
1734 } while (--tries > 0);
1735 return rcode;
1736}
1737
1738
1739
1740
1741
1742
1743
1744static struct fwtty_port *fwserial_claim_port(struct fwtty_peer *peer,
1745 int index)
1746{
1747 struct fwtty_port *port;
1748
1749 if (index < 0 || index >= num_ports)
1750 return ERR_PTR(-EINVAL);
1751
1752
1753 synchronize_rcu();
1754
1755 port = peer->serial->ports[index];
1756 spin_lock_bh(&port->lock);
1757 if (!rcu_access_pointer(port->peer))
1758 rcu_assign_pointer(port->peer, peer);
1759 else
1760 port = ERR_PTR(-EBUSY);
1761 spin_unlock_bh(&port->lock);
1762
1763 return port;
1764}
1765
1766
1767
1768
1769
1770
1771
1772static struct fwtty_port *fwserial_find_port(struct fwtty_peer *peer)
1773{
1774 struct fwtty_port **ports = peer->serial->ports;
1775 int i;
1776
1777
1778 synchronize_rcu();
1779
1780
1781
1782
1783 for (i = 0; i < num_ttys; ++i) {
1784 spin_lock_bh(&ports[i]->lock);
1785 if (!ports[i]->peer) {
1786
1787 rcu_assign_pointer(ports[i]->peer, peer);
1788 spin_unlock_bh(&ports[i]->lock);
1789 return ports[i];
1790 }
1791 spin_unlock_bh(&ports[i]->lock);
1792 }
1793 return NULL;
1794}
1795
1796static void fwserial_release_port(struct fwtty_port *port, bool reset)
1797{
1798
1799 if (reset)
1800 fwtty_update_port_status(port, 0);
1801
1802 spin_lock_bh(&port->lock);
1803
1804
1805 port->max_payload = link_speed_to_max_payload(SCODE_100);
1806 dma_fifo_change_tx_limit(&port->tx_fifo, port->max_payload);
1807
1808 RCU_INIT_POINTER(port->peer, NULL);
1809 spin_unlock_bh(&port->lock);
1810
1811 if (port->port.console && port->fwcon_ops->notify)
1812 (*port->fwcon_ops->notify)(FWCON_NOTIFY_DETACH, port->con_data);
1813}
1814
1815static void fwserial_plug_timeout(unsigned long data)
1816{
1817 struct fwtty_peer *peer = (struct fwtty_peer *)data;
1818 struct fwtty_port *port;
1819
1820 spin_lock_bh(&peer->lock);
1821 if (peer->state != FWPS_PLUG_PENDING) {
1822 spin_unlock_bh(&peer->lock);
1823 return;
1824 }
1825
1826 port = peer_revert_state(peer);
1827 spin_unlock_bh(&peer->lock);
1828
1829 if (port)
1830 fwserial_release_port(port, false);
1831}
1832
1833
1834
1835
1836
1837
1838
1839static int fwserial_connect_peer(struct fwtty_peer *peer)
1840{
1841 struct fwtty_port *port;
1842 struct fwserial_mgmt_pkt *pkt;
1843 int err, rcode;
1844
1845 pkt = kmalloc(sizeof(*pkt), GFP_KERNEL);
1846 if (!pkt)
1847 return -ENOMEM;
1848
1849 port = fwserial_find_port(peer);
1850 if (!port) {
1851 fwtty_err(&peer->unit, "avail ports in use\n");
1852 err = -EBUSY;
1853 goto free_pkt;
1854 }
1855
1856 spin_lock_bh(&peer->lock);
1857
1858
1859 if (peer->state != FWPS_NOT_ATTACHED) {
1860 err = -EBUSY;
1861 goto release_port;
1862 }
1863
1864 peer->port = port;
1865 peer_set_state(peer, FWPS_PLUG_PENDING);
1866
1867 fill_plug_req(pkt, peer->port);
1868
1869 setup_timer(&peer->timer, fwserial_plug_timeout, (unsigned long)peer);
1870 mod_timer(&peer->timer, jiffies + VIRT_CABLE_PLUG_TIMEOUT);
1871 spin_unlock_bh(&peer->lock);
1872
1873 rcode = fwserial_send_mgmt_sync(peer, pkt);
1874
1875 spin_lock_bh(&peer->lock);
1876 if (peer->state == FWPS_PLUG_PENDING && rcode != RCODE_COMPLETE) {
1877 if (rcode == RCODE_CONFLICT_ERROR)
1878 err = -EAGAIN;
1879 else
1880 err = -EIO;
1881 goto cancel_timer;
1882 }
1883 spin_unlock_bh(&peer->lock);
1884
1885 kfree(pkt);
1886 return 0;
1887
1888cancel_timer:
1889 del_timer(&peer->timer);
1890 peer_revert_state(peer);
1891release_port:
1892 spin_unlock_bh(&peer->lock);
1893 fwserial_release_port(port, false);
1894free_pkt:
1895 kfree(pkt);
1896 return err;
1897}
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908static void fwserial_close_port(struct tty_driver *driver,
1909 struct fwtty_port *port)
1910{
1911 struct tty_struct *tty;
1912
1913 mutex_lock(&port->port.mutex);
1914 tty = tty_port_tty_get(&port->port);
1915 if (tty) {
1916 tty_vhangup(tty);
1917 tty_kref_put(tty);
1918 }
1919 mutex_unlock(&port->port.mutex);
1920
1921 if (driver == fwloop_driver)
1922 tty_unregister_device(driver, loop_idx(port));
1923 else
1924 tty_unregister_device(driver, port->index);
1925}
1926
1927
1928
1929
1930
1931
1932
1933static struct fw_serial *fwserial_lookup(struct fw_card *card)
1934{
1935 struct fw_serial *serial;
1936
1937 list_for_each_entry(serial, &fwserial_list, list) {
1938 if (card == serial->card)
1939 return serial;
1940 }
1941
1942 return NULL;
1943}
1944
1945
1946
1947
1948
1949
1950
1951static struct fw_serial *__fwserial_lookup_rcu(struct fw_card *card)
1952{
1953 struct fw_serial *serial;
1954
1955 list_for_each_entry_rcu(serial, &fwserial_list, list) {
1956 if (card == serial->card)
1957 return serial;
1958 }
1959
1960 return NULL;
1961}
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975static struct fwtty_peer *__fwserial_peer_by_node_id(struct fw_card *card,
1976 int generation, int id)
1977{
1978 struct fw_serial *serial;
1979 struct fwtty_peer *peer;
1980
1981 serial = __fwserial_lookup_rcu(card);
1982 if (!serial) {
1983
1984
1985
1986
1987
1988
1989 fwtty_err(card, "unknown card (guid %016llx)\n",
1990 (unsigned long long)card->guid);
1991 return NULL;
1992 }
1993
1994 list_for_each_entry_rcu(peer, &serial->peer_list, list) {
1995 int g = peer->generation;
1996
1997 smp_rmb();
1998 if (generation == g && id == peer->node_id)
1999 return peer;
2000 }
2001
2002 return NULL;
2003}
2004
2005#ifdef DEBUG
2006static void __dump_peer_list(struct fw_card *card)
2007{
2008 struct fw_serial *serial;
2009 struct fwtty_peer *peer;
2010
2011 serial = __fwserial_lookup_rcu(card);
2012 if (!serial)
2013 return;
2014
2015 list_for_each_entry_rcu(peer, &serial->peer_list, list) {
2016 int g = peer->generation;
2017
2018 smp_rmb();
2019 fwtty_dbg(card, "peer(%d:%x) guid: %016llx\n",
2020 g, peer->node_id, (unsigned long long)peer->guid);
2021 }
2022}
2023#else
2024#define __dump_peer_list(s)
2025#endif
2026
2027static void fwserial_auto_connect(struct work_struct *work)
2028{
2029 struct fwtty_peer *peer = to_peer(to_delayed_work(work), connect);
2030 int err;
2031
2032 err = fwserial_connect_peer(peer);
2033 if (err == -EAGAIN && ++peer->connect_retries < MAX_CONNECT_RETRIES)
2034 schedule_delayed_work(&peer->connect, CONNECT_RETRY_DELAY);
2035}
2036
2037static void fwserial_peer_workfn(struct work_struct *work)
2038{
2039 struct fwtty_peer *peer = to_peer(work, work);
2040
2041 peer->workfn(work);
2042}
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060static int fwserial_add_peer(struct fw_serial *serial, struct fw_unit *unit)
2061{
2062 struct device *dev = &unit->device;
2063 struct fw_device *parent = fw_parent_device(unit);
2064 struct fwtty_peer *peer;
2065 struct fw_csr_iterator ci;
2066 int key, val;
2067 int generation;
2068
2069 peer = kzalloc(sizeof(*peer), GFP_KERNEL);
2070 if (!peer)
2071 return -ENOMEM;
2072
2073 peer_set_state(peer, FWPS_NOT_ATTACHED);
2074
2075 dev_set_drvdata(dev, peer);
2076 peer->unit = unit;
2077 peer->guid = (u64)parent->config_rom[3] << 32 | parent->config_rom[4];
2078 peer->speed = parent->max_speed;
2079 peer->max_payload = min(device_max_receive(parent),
2080 link_speed_to_max_payload(peer->speed));
2081
2082 generation = parent->generation;
2083 smp_rmb();
2084 peer->node_id = parent->node_id;
2085 smp_wmb();
2086 peer->generation = generation;
2087
2088
2089 fw_csr_iterator_init(&ci, unit->directory);
2090 while (fw_csr_iterator_next(&ci, &key, &val)) {
2091 if (key == (CSR_OFFSET | CSR_DEPENDENT_INFO)) {
2092 peer->mgmt_addr = CSR_REGISTER_BASE + 4 * val;
2093 break;
2094 }
2095 }
2096 if (peer->mgmt_addr == 0ULL) {
2097
2098
2099
2100
2101 peer_set_state(peer, FWPS_NO_MGMT_ADDR);
2102 }
2103
2104 spin_lock_init(&peer->lock);
2105 peer->port = NULL;
2106
2107 init_timer(&peer->timer);
2108 INIT_WORK(&peer->work, fwserial_peer_workfn);
2109 INIT_DELAYED_WORK(&peer->connect, fwserial_auto_connect);
2110
2111
2112 peer->serial = serial;
2113 list_add_rcu(&peer->list, &serial->peer_list);
2114
2115 fwtty_info(&peer->unit, "peer added (guid:%016llx)\n",
2116 (unsigned long long)peer->guid);
2117
2118
2119 if (parent->is_local) {
2120 serial->self = peer;
2121 if (create_loop_dev) {
2122 struct fwtty_port *port;
2123
2124 port = fwserial_claim_port(peer, num_ttys);
2125 if (!IS_ERR(port)) {
2126 struct virt_plug_params params;
2127
2128 spin_lock_bh(&peer->lock);
2129 peer->port = port;
2130 fill_plug_params(¶ms, port);
2131 fwserial_virt_plug_complete(peer, ¶ms);
2132 spin_unlock_bh(&peer->lock);
2133
2134 fwtty_write_port_status(port);
2135 }
2136 }
2137
2138 } else if (auto_connect) {
2139
2140 schedule_delayed_work(&peer->connect, 1);
2141 }
2142
2143 return 0;
2144}
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155static void fwserial_remove_peer(struct fwtty_peer *peer)
2156{
2157 struct fwtty_port *port;
2158
2159 spin_lock_bh(&peer->lock);
2160 peer_set_state(peer, FWPS_GONE);
2161 spin_unlock_bh(&peer->lock);
2162
2163 cancel_delayed_work_sync(&peer->connect);
2164 cancel_work_sync(&peer->work);
2165
2166 spin_lock_bh(&peer->lock);
2167
2168 if (peer == peer->serial->self)
2169 peer->serial->self = NULL;
2170
2171
2172 del_timer(&peer->timer);
2173
2174 port = peer->port;
2175 peer->port = NULL;
2176
2177 list_del_rcu(&peer->list);
2178
2179 fwtty_info(&peer->unit, "peer removed (guid:%016llx)\n",
2180 (unsigned long long)peer->guid);
2181
2182 spin_unlock_bh(&peer->lock);
2183
2184 if (port)
2185 fwserial_release_port(port, true);
2186
2187 synchronize_rcu();
2188 kfree(peer);
2189}
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206static int fwserial_create(struct fw_unit *unit)
2207{
2208 struct fw_device *parent = fw_parent_device(unit);
2209 struct fw_card *card = parent->card;
2210 struct fw_serial *serial;
2211 struct fwtty_port *port;
2212 struct device *tty_dev;
2213 int i, j;
2214 int err;
2215
2216 serial = kzalloc(sizeof(*serial), GFP_KERNEL);
2217 if (!serial)
2218 return -ENOMEM;
2219
2220 kref_init(&serial->kref);
2221 serial->card = card;
2222 INIT_LIST_HEAD(&serial->peer_list);
2223
2224 for (i = 0; i < num_ports; ++i) {
2225 port = kzalloc(sizeof(*port), GFP_KERNEL);
2226 if (!port) {
2227 err = -ENOMEM;
2228 goto free_ports;
2229 }
2230 tty_port_init(&port->port);
2231 port->index = FWTTY_INVALID_INDEX;
2232 port->port.ops = &fwtty_port_ops;
2233 port->serial = serial;
2234 tty_buffer_set_limit(&port->port, 128 * 1024);
2235
2236 spin_lock_init(&port->lock);
2237 INIT_DELAYED_WORK(&port->drain, fwtty_drain_tx);
2238 INIT_DELAYED_WORK(&port->emit_breaks, fwtty_emit_breaks);
2239 INIT_WORK(&port->hangup, fwtty_do_hangup);
2240 init_waitqueue_head(&port->wait_tx);
2241 port->max_payload = link_speed_to_max_payload(SCODE_100);
2242 dma_fifo_init(&port->tx_fifo);
2243
2244 RCU_INIT_POINTER(port->peer, NULL);
2245 serial->ports[i] = port;
2246
2247
2248 port->rx_handler.length = FWTTY_PORT_RXFIFO_LEN + 4;
2249 port->rx_handler.address_callback = fwtty_port_handler;
2250 port->rx_handler.callback_data = port;
2251
2252
2253
2254
2255 err = fw_core_add_address_handler(&port->rx_handler,
2256 &fw_high_memory_region);
2257 if (err) {
2258 kfree(port);
2259 goto free_ports;
2260 }
2261 }
2262
2263
2264 err = fwtty_ports_add(serial);
2265 if (err) {
2266 fwtty_err(&unit, "no space in port table\n");
2267 goto free_ports;
2268 }
2269
2270 for (j = 0; j < num_ttys; ++j) {
2271 tty_dev = tty_port_register_device(&serial->ports[j]->port,
2272 fwtty_driver,
2273 serial->ports[j]->index,
2274 card->device);
2275 if (IS_ERR(tty_dev)) {
2276 err = PTR_ERR(tty_dev);
2277 fwtty_err(&unit, "register tty device error (%d)\n",
2278 err);
2279 goto unregister_ttys;
2280 }
2281
2282 serial->ports[j]->device = tty_dev;
2283 }
2284
2285
2286 if (create_loop_dev) {
2287 struct device *loop_dev;
2288
2289 loop_dev = tty_port_register_device(&serial->ports[j]->port,
2290 fwloop_driver,
2291 loop_idx(serial->ports[j]),
2292 card->device);
2293 if (IS_ERR(loop_dev)) {
2294 err = PTR_ERR(loop_dev);
2295 fwtty_err(&unit, "create loop device failed (%d)\n",
2296 err);
2297 goto unregister_ttys;
2298 }
2299 serial->ports[j]->device = loop_dev;
2300 serial->ports[j]->loopback = true;
2301 }
2302
2303 if (!IS_ERR_OR_NULL(fwserial_debugfs)) {
2304 serial->debugfs = debugfs_create_dir(dev_name(&unit->device),
2305 fwserial_debugfs);
2306 if (!IS_ERR_OR_NULL(serial->debugfs)) {
2307 debugfs_create_file("peers", 0444, serial->debugfs,
2308 serial, &fwtty_peers_fops);
2309 debugfs_create_file("stats", 0444, serial->debugfs,
2310 serial, &fwtty_stats_fops);
2311 }
2312 }
2313
2314 list_add_rcu(&serial->list, &fwserial_list);
2315
2316 fwtty_notice(&unit, "TTY over FireWire on device %s (guid %016llx)\n",
2317 dev_name(card->device), (unsigned long long)card->guid);
2318
2319 err = fwserial_add_peer(serial, unit);
2320 if (!err)
2321 return 0;
2322
2323 fwtty_err(&unit, "unable to add peer unit device (%d)\n", err);
2324
2325
2326 debugfs_remove_recursive(serial->debugfs);
2327
2328 list_del_rcu(&serial->list);
2329 if (create_loop_dev)
2330 tty_unregister_device(fwloop_driver,
2331 loop_idx(serial->ports[j]));
2332unregister_ttys:
2333 for (--j; j >= 0; --j)
2334 tty_unregister_device(fwtty_driver, serial->ports[j]->index);
2335 kref_put(&serial->kref, fwserial_destroy);
2336 return err;
2337
2338free_ports:
2339 for (--i; i >= 0; --i) {
2340 tty_port_destroy(&serial->ports[i]->port);
2341 kfree(serial->ports[i]);
2342 }
2343 kfree(serial);
2344 return err;
2345}
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383static int fwserial_probe(struct fw_unit *unit,
2384 const struct ieee1394_device_id *id)
2385{
2386 struct fw_serial *serial;
2387 int err;
2388
2389 mutex_lock(&fwserial_list_mutex);
2390 serial = fwserial_lookup(fw_parent_device(unit)->card);
2391 if (!serial)
2392 err = fwserial_create(unit);
2393 else
2394 err = fwserial_add_peer(serial, unit);
2395 mutex_unlock(&fwserial_list_mutex);
2396 return err;
2397}
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407static void fwserial_remove(struct fw_unit *unit)
2408{
2409 struct fwtty_peer *peer = dev_get_drvdata(&unit->device);
2410 struct fw_serial *serial = peer->serial;
2411 int i;
2412
2413 mutex_lock(&fwserial_list_mutex);
2414 fwserial_remove_peer(peer);
2415
2416 if (list_empty(&serial->peer_list)) {
2417
2418 list_del_rcu(&serial->list);
2419
2420 debugfs_remove_recursive(serial->debugfs);
2421
2422 for (i = 0; i < num_ttys; ++i)
2423 fwserial_close_port(fwtty_driver, serial->ports[i]);
2424 if (create_loop_dev)
2425 fwserial_close_port(fwloop_driver, serial->ports[i]);
2426 kref_put(&serial->kref, fwserial_destroy);
2427 }
2428 mutex_unlock(&fwserial_list_mutex);
2429}
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445static void fwserial_update(struct fw_unit *unit)
2446{
2447 struct fw_device *parent = fw_parent_device(unit);
2448 struct fwtty_peer *peer = dev_get_drvdata(&unit->device);
2449 int generation;
2450
2451 generation = parent->generation;
2452 smp_rmb();
2453 peer->node_id = parent->node_id;
2454 smp_wmb();
2455 peer->generation = generation;
2456}
2457
2458static const struct ieee1394_device_id fwserial_id_table[] = {
2459 {
2460 .match_flags = IEEE1394_MATCH_SPECIFIER_ID |
2461 IEEE1394_MATCH_VERSION,
2462 .specifier_id = LINUX_VENDOR_ID,
2463 .version = FWSERIAL_VERSION,
2464 },
2465 { }
2466};
2467
2468static struct fw_driver fwserial_driver = {
2469 .driver = {
2470 .owner = THIS_MODULE,
2471 .name = KBUILD_MODNAME,
2472 .bus = &fw_bus_type,
2473 },
2474 .probe = fwserial_probe,
2475 .update = fwserial_update,
2476 .remove = fwserial_remove,
2477 .id_table = fwserial_id_table,
2478};
2479
2480#define FW_UNIT_SPECIFIER(id) ((CSR_SPECIFIER_ID << 24) | (id))
2481#define FW_UNIT_VERSION(ver) ((CSR_VERSION << 24) | (ver))
2482#define FW_UNIT_ADDRESS(ofs) (((CSR_OFFSET | CSR_DEPENDENT_INFO) << 24) \
2483 | (((ofs) - CSR_REGISTER_BASE) >> 2))
2484
2485
2486
2487#define FW_ROM_LEN(quads) ((quads) << 16)
2488#define FW_ROM_DESCRIPTOR(ofs) (((CSR_LEAF | CSR_DESCRIPTOR) << 24) | (ofs))
2489
2490struct fwserial_unit_directory_data {
2491 u32 len_crc;
2492 u32 unit_specifier;
2493 u32 unit_sw_version;
2494 u32 unit_addr_offset;
2495 u32 desc1_ofs;
2496 u32 desc1_len_crc;
2497 u32 desc1_data[5];
2498} __packed;
2499
2500static struct fwserial_unit_directory_data fwserial_unit_directory_data = {
2501 .len_crc = FW_ROM_LEN(4),
2502 .unit_specifier = FW_UNIT_SPECIFIER(LINUX_VENDOR_ID),
2503 .unit_sw_version = FW_UNIT_VERSION(FWSERIAL_VERSION),
2504 .desc1_ofs = FW_ROM_DESCRIPTOR(1),
2505 .desc1_len_crc = FW_ROM_LEN(5),
2506 .desc1_data = {
2507 0x00000000,
2508 0x00000000,
2509 0x4c696e75,
2510 0x78205454,
2511 0x59000000,
2512 },
2513};
2514
2515static struct fw_descriptor fwserial_unit_directory = {
2516 .length = sizeof(fwserial_unit_directory_data) / sizeof(u32),
2517 .key = (CSR_DIRECTORY | CSR_UNIT) << 24,
2518 .data = (u32 *)&fwserial_unit_directory_data,
2519};
2520
2521
2522
2523
2524
2525static const struct fw_address_region fwserial_mgmt_addr_region = {
2526 .start = CSR_REGISTER_BASE + 0x1e0000ULL,
2527 .end = 0x1000000000000ULL,
2528};
2529
2530static struct fw_address_handler fwserial_mgmt_addr_handler;
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545static void fwserial_handle_plug_req(struct work_struct *work)
2546{
2547 struct fwtty_peer *peer = to_peer(work, work);
2548 struct virt_plug_params *plug_req = &peer->work_params.plug_req;
2549 struct fwtty_port *port;
2550 struct fwserial_mgmt_pkt *pkt;
2551 int rcode;
2552
2553 pkt = kmalloc(sizeof(*pkt), GFP_KERNEL);
2554 if (!pkt)
2555 return;
2556
2557 port = fwserial_find_port(peer);
2558
2559 spin_lock_bh(&peer->lock);
2560
2561 switch (peer->state) {
2562 case FWPS_NOT_ATTACHED:
2563 if (!port) {
2564 fwtty_err(&peer->unit, "no more ports avail\n");
2565 fill_plug_rsp_nack(pkt);
2566 } else {
2567 peer->port = port;
2568 fill_plug_rsp_ok(pkt, peer->port);
2569 peer_set_state(peer, FWPS_PLUG_RESPONDING);
2570
2571 port = NULL;
2572 }
2573 break;
2574
2575 case FWPS_PLUG_PENDING:
2576 if (peer->serial->card->guid > peer->guid)
2577 goto cleanup;
2578
2579
2580 del_timer(&peer->timer);
2581 fill_plug_rsp_ok(pkt, peer->port);
2582 peer_set_state(peer, FWPS_PLUG_RESPONDING);
2583 break;
2584
2585 default:
2586 fill_plug_rsp_nack(pkt);
2587 }
2588
2589 spin_unlock_bh(&peer->lock);
2590 if (port)
2591 fwserial_release_port(port, false);
2592
2593 rcode = fwserial_send_mgmt_sync(peer, pkt);
2594
2595 spin_lock_bh(&peer->lock);
2596 if (peer->state == FWPS_PLUG_RESPONDING) {
2597 if (rcode == RCODE_COMPLETE) {
2598 struct fwtty_port *tmp = peer->port;
2599
2600 fwserial_virt_plug_complete(peer, plug_req);
2601 spin_unlock_bh(&peer->lock);
2602
2603 fwtty_write_port_status(tmp);
2604 spin_lock_bh(&peer->lock);
2605 } else {
2606 fwtty_err(&peer->unit, "PLUG_RSP error (%d)\n", rcode);
2607 port = peer_revert_state(peer);
2608 }
2609 }
2610cleanup:
2611 spin_unlock_bh(&peer->lock);
2612 if (port)
2613 fwserial_release_port(port, false);
2614 kfree(pkt);
2615}
2616
2617static void fwserial_handle_unplug_req(struct work_struct *work)
2618{
2619 struct fwtty_peer *peer = to_peer(work, work);
2620 struct fwtty_port *port = NULL;
2621 struct fwserial_mgmt_pkt *pkt;
2622 int rcode;
2623
2624 pkt = kmalloc(sizeof(*pkt), GFP_KERNEL);
2625 if (!pkt)
2626 return;
2627
2628 spin_lock_bh(&peer->lock);
2629
2630 switch (peer->state) {
2631 case FWPS_ATTACHED:
2632 fill_unplug_rsp_ok(pkt);
2633 peer_set_state(peer, FWPS_UNPLUG_RESPONDING);
2634 break;
2635
2636 case FWPS_UNPLUG_PENDING:
2637 if (peer->serial->card->guid > peer->guid)
2638 goto cleanup;
2639
2640
2641 del_timer(&peer->timer);
2642 fill_unplug_rsp_ok(pkt);
2643 peer_set_state(peer, FWPS_UNPLUG_RESPONDING);
2644 break;
2645
2646 default:
2647 fill_unplug_rsp_nack(pkt);
2648 }
2649
2650 spin_unlock_bh(&peer->lock);
2651
2652 rcode = fwserial_send_mgmt_sync(peer, pkt);
2653
2654 spin_lock_bh(&peer->lock);
2655 if (peer->state == FWPS_UNPLUG_RESPONDING) {
2656 if (rcode != RCODE_COMPLETE)
2657 fwtty_err(&peer->unit, "UNPLUG_RSP error (%d)\n",
2658 rcode);
2659 port = peer_revert_state(peer);
2660 }
2661cleanup:
2662 spin_unlock_bh(&peer->lock);
2663 if (port)
2664 fwserial_release_port(port, true);
2665 kfree(pkt);
2666}
2667
2668static int fwserial_parse_mgmt_write(struct fwtty_peer *peer,
2669 struct fwserial_mgmt_pkt *pkt,
2670 unsigned long long addr,
2671 size_t len)
2672{
2673 struct fwtty_port *port = NULL;
2674 bool reset = false;
2675 int rcode;
2676
2677 if (addr != fwserial_mgmt_addr_handler.offset || len < sizeof(pkt->hdr))
2678 return RCODE_ADDRESS_ERROR;
2679
2680 if (len != be16_to_cpu(pkt->hdr.len) ||
2681 len != mgmt_pkt_expected_len(pkt->hdr.code))
2682 return RCODE_DATA_ERROR;
2683
2684 spin_lock_bh(&peer->lock);
2685 if (peer->state == FWPS_GONE) {
2686
2687
2688
2689
2690
2691
2692 fwtty_err(&peer->unit, "peer already removed\n");
2693 spin_unlock_bh(&peer->lock);
2694 return RCODE_ADDRESS_ERROR;
2695 }
2696
2697 rcode = RCODE_COMPLETE;
2698
2699 fwtty_dbg(&peer->unit, "mgmt: hdr.code: %04hx\n", pkt->hdr.code);
2700
2701 switch (be16_to_cpu(pkt->hdr.code) & FWSC_CODE_MASK) {
2702 case FWSC_VIRT_CABLE_PLUG:
2703 if (work_pending(&peer->work)) {
2704 fwtty_err(&peer->unit, "plug req: busy\n");
2705 rcode = RCODE_CONFLICT_ERROR;
2706
2707 } else {
2708 peer->work_params.plug_req = pkt->plug_req;
2709 peer->workfn = fwserial_handle_plug_req;
2710 queue_work(system_unbound_wq, &peer->work);
2711 }
2712 break;
2713
2714 case FWSC_VIRT_CABLE_PLUG_RSP:
2715 if (peer->state != FWPS_PLUG_PENDING) {
2716 rcode = RCODE_CONFLICT_ERROR;
2717
2718 } else if (be16_to_cpu(pkt->hdr.code) & FWSC_RSP_NACK) {
2719 fwtty_notice(&peer->unit, "NACK plug rsp\n");
2720 port = peer_revert_state(peer);
2721
2722 } else {
2723 struct fwtty_port *tmp = peer->port;
2724
2725 fwserial_virt_plug_complete(peer, &pkt->plug_rsp);
2726 spin_unlock_bh(&peer->lock);
2727
2728 fwtty_write_port_status(tmp);
2729 spin_lock_bh(&peer->lock);
2730 }
2731 break;
2732
2733 case FWSC_VIRT_CABLE_UNPLUG:
2734 if (work_pending(&peer->work)) {
2735 fwtty_err(&peer->unit, "unplug req: busy\n");
2736 rcode = RCODE_CONFLICT_ERROR;
2737 } else {
2738 peer->workfn = fwserial_handle_unplug_req;
2739 queue_work(system_unbound_wq, &peer->work);
2740 }
2741 break;
2742
2743 case FWSC_VIRT_CABLE_UNPLUG_RSP:
2744 if (peer->state != FWPS_UNPLUG_PENDING) {
2745 rcode = RCODE_CONFLICT_ERROR;
2746 } else {
2747 if (be16_to_cpu(pkt->hdr.code) & FWSC_RSP_NACK)
2748 fwtty_notice(&peer->unit, "NACK unplug?\n");
2749 port = peer_revert_state(peer);
2750 reset = true;
2751 }
2752 break;
2753
2754 default:
2755 fwtty_err(&peer->unit, "unknown mgmt code %d\n",
2756 be16_to_cpu(pkt->hdr.code));
2757 rcode = RCODE_DATA_ERROR;
2758 }
2759 spin_unlock_bh(&peer->lock);
2760
2761 if (port)
2762 fwserial_release_port(port, reset);
2763
2764 return rcode;
2765}
2766
2767
2768
2769
2770
2771
2772
2773
2774static void fwserial_mgmt_handler(struct fw_card *card,
2775 struct fw_request *request,
2776 int tcode, int destination, int source,
2777 int generation,
2778 unsigned long long addr,
2779 void *data, size_t len,
2780 void *callback_data)
2781{
2782 struct fwserial_mgmt_pkt *pkt = data;
2783 struct fwtty_peer *peer;
2784 int rcode;
2785
2786 rcu_read_lock();
2787 peer = __fwserial_peer_by_node_id(card, generation, source);
2788 if (!peer) {
2789 fwtty_dbg(card, "peer(%d:%x) not found\n", generation, source);
2790 __dump_peer_list(card);
2791 rcode = RCODE_CONFLICT_ERROR;
2792
2793 } else {
2794 switch (tcode) {
2795 case TCODE_WRITE_BLOCK_REQUEST:
2796 rcode = fwserial_parse_mgmt_write(peer, pkt, addr, len);
2797 break;
2798
2799 default:
2800 rcode = RCODE_TYPE_ERROR;
2801 }
2802 }
2803
2804 rcu_read_unlock();
2805 fw_send_response(card, request, rcode);
2806}
2807
2808static int __init fwserial_init(void)
2809{
2810 int err, num_loops = !!(create_loop_dev);
2811
2812
2813 fwserial_debugfs = debugfs_create_dir(KBUILD_MODNAME, NULL);
2814
2815
2816 if (num_ttys + num_loops > MAX_CARD_PORTS)
2817 num_ttys = MAX_CARD_PORTS - num_loops;
2818
2819 num_ports = num_ttys + num_loops;
2820
2821 fwtty_driver = tty_alloc_driver(MAX_TOTAL_PORTS, TTY_DRIVER_REAL_RAW
2822 | TTY_DRIVER_DYNAMIC_DEV);
2823 if (IS_ERR(fwtty_driver)) {
2824 err = PTR_ERR(fwtty_driver);
2825 goto remove_debugfs;
2826 }
2827
2828 fwtty_driver->driver_name = KBUILD_MODNAME;
2829 fwtty_driver->name = tty_dev_name;
2830 fwtty_driver->major = 0;
2831 fwtty_driver->minor_start = 0;
2832 fwtty_driver->type = TTY_DRIVER_TYPE_SERIAL;
2833 fwtty_driver->subtype = SERIAL_TYPE_NORMAL;
2834 fwtty_driver->init_termios = tty_std_termios;
2835 fwtty_driver->init_termios.c_cflag |= CLOCAL;
2836 tty_set_operations(fwtty_driver, &fwtty_ops);
2837
2838 err = tty_register_driver(fwtty_driver);
2839 if (err) {
2840 pr_err("register tty driver failed (%d)\n", err);
2841 goto put_tty;
2842 }
2843
2844 if (create_loop_dev) {
2845 fwloop_driver = tty_alloc_driver(MAX_TOTAL_PORTS / num_ports,
2846 TTY_DRIVER_REAL_RAW
2847 | TTY_DRIVER_DYNAMIC_DEV);
2848 if (IS_ERR(fwloop_driver)) {
2849 err = PTR_ERR(fwloop_driver);
2850 goto unregister_driver;
2851 }
2852
2853 fwloop_driver->driver_name = KBUILD_MODNAME "_loop";
2854 fwloop_driver->name = loop_dev_name;
2855 fwloop_driver->major = 0;
2856 fwloop_driver->minor_start = 0;
2857 fwloop_driver->type = TTY_DRIVER_TYPE_SERIAL;
2858 fwloop_driver->subtype = SERIAL_TYPE_NORMAL;
2859 fwloop_driver->init_termios = tty_std_termios;
2860 fwloop_driver->init_termios.c_cflag |= CLOCAL;
2861 tty_set_operations(fwloop_driver, &fwloop_ops);
2862
2863 err = tty_register_driver(fwloop_driver);
2864 if (err) {
2865 pr_err("register loop driver failed (%d)\n", err);
2866 goto put_loop;
2867 }
2868 }
2869
2870 fwtty_txn_cache = kmem_cache_create("fwtty_txn_cache",
2871 sizeof(struct fwtty_transaction),
2872 0, 0, fwtty_txn_constructor);
2873 if (!fwtty_txn_cache) {
2874 err = -ENOMEM;
2875 goto unregister_loop;
2876 }
2877
2878
2879
2880
2881
2882
2883
2884
2885 fwserial_mgmt_addr_handler.length = sizeof(struct fwserial_mgmt_pkt);
2886 fwserial_mgmt_addr_handler.address_callback = fwserial_mgmt_handler;
2887
2888 err = fw_core_add_address_handler(&fwserial_mgmt_addr_handler,
2889 &fwserial_mgmt_addr_region);
2890 if (err) {
2891 pr_err("add management handler failed (%d)\n", err);
2892 goto destroy_cache;
2893 }
2894
2895 fwserial_unit_directory_data.unit_addr_offset =
2896 FW_UNIT_ADDRESS(fwserial_mgmt_addr_handler.offset);
2897 err = fw_core_add_descriptor(&fwserial_unit_directory);
2898 if (err) {
2899 pr_err("add unit descriptor failed (%d)\n", err);
2900 goto remove_handler;
2901 }
2902
2903 err = driver_register(&fwserial_driver.driver);
2904 if (err) {
2905 pr_err("register fwserial driver failed (%d)\n", err);
2906 goto remove_descriptor;
2907 }
2908
2909 return 0;
2910
2911remove_descriptor:
2912 fw_core_remove_descriptor(&fwserial_unit_directory);
2913remove_handler:
2914 fw_core_remove_address_handler(&fwserial_mgmt_addr_handler);
2915destroy_cache:
2916 kmem_cache_destroy(fwtty_txn_cache);
2917unregister_loop:
2918 if (create_loop_dev)
2919 tty_unregister_driver(fwloop_driver);
2920put_loop:
2921 if (create_loop_dev)
2922 put_tty_driver(fwloop_driver);
2923unregister_driver:
2924 tty_unregister_driver(fwtty_driver);
2925put_tty:
2926 put_tty_driver(fwtty_driver);
2927remove_debugfs:
2928 debugfs_remove_recursive(fwserial_debugfs);
2929
2930 return err;
2931}
2932
2933static void __exit fwserial_exit(void)
2934{
2935 driver_unregister(&fwserial_driver.driver);
2936 fw_core_remove_descriptor(&fwserial_unit_directory);
2937 fw_core_remove_address_handler(&fwserial_mgmt_addr_handler);
2938 kmem_cache_destroy(fwtty_txn_cache);
2939 if (create_loop_dev) {
2940 tty_unregister_driver(fwloop_driver);
2941 put_tty_driver(fwloop_driver);
2942 }
2943 tty_unregister_driver(fwtty_driver);
2944 put_tty_driver(fwtty_driver);
2945 debugfs_remove_recursive(fwserial_debugfs);
2946}
2947
2948module_init(fwserial_init);
2949module_exit(fwserial_exit);
2950
2951MODULE_AUTHOR("Peter Hurley (peter@hurleysoftware.com)");
2952MODULE_DESCRIPTION("FireWire Serial TTY Driver");
2953MODULE_LICENSE("GPL");
2954MODULE_DEVICE_TABLE(ieee1394, fwserial_id_table);
2955MODULE_PARM_DESC(ttys, "Number of ttys to create for each local firewire node");
2956MODULE_PARM_DESC(auto, "Auto-connect a tty to each firewire node discovered");
2957MODULE_PARM_DESC(loop, "Create a loopback device, fwloop<n>, with ttys");
2958