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