fwserial.c (76717B)
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(¶ms, port); 2063 fwserial_virt_plug_complete(peer, ¶ms); 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");