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