Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v5.2-rc7 2891 lines 77 kB view raw
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 * and 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 * @parameters: fw_address_callback_t as specified by firewire core interface 595 * 596 * This handler is responsible for handling inbound read/write dma from remotes. 597 */ 598static void fwtty_port_handler(struct fw_card *card, 599 struct fw_request *request, 600 int tcode, int destination, int source, 601 int generation, 602 unsigned long long addr, 603 void *data, size_t len, 604 void *callback_data) 605{ 606 struct fwtty_port *port = callback_data; 607 struct fwtty_peer *peer; 608 int err; 609 int rcode; 610 611 /* Only accept rx from the peer virtual-cabled to this port */ 612 rcu_read_lock(); 613 peer = __fwserial_peer_by_node_id(card, generation, source); 614 rcu_read_unlock(); 615 if (!peer || peer != rcu_access_pointer(port->peer)) { 616 rcode = RCODE_ADDRESS_ERROR; 617 fwtty_err_ratelimited(port, "ignoring unauthenticated data\n"); 618 goto respond; 619 } 620 621 switch (tcode) { 622 case TCODE_WRITE_QUADLET_REQUEST: 623 if (addr != port->rx_handler.offset || len != 4) { 624 rcode = RCODE_ADDRESS_ERROR; 625 } else { 626 fwtty_update_port_status(port, *(unsigned int *)data); 627 rcode = RCODE_COMPLETE; 628 } 629 break; 630 631 case TCODE_WRITE_BLOCK_REQUEST: 632 if (addr != port->rx_handler.offset + 4 || 633 len > port->rx_handler.length - 4) { 634 rcode = RCODE_ADDRESS_ERROR; 635 } else { 636 err = fwtty_rx(port, data, len); 637 switch (err) { 638 case 0: 639 rcode = RCODE_COMPLETE; 640 break; 641 case -EIO: 642 rcode = RCODE_DATA_ERROR; 643 break; 644 default: 645 rcode = RCODE_CONFLICT_ERROR; 646 break; 647 } 648 } 649 break; 650 651 default: 652 rcode = RCODE_TYPE_ERROR; 653 } 654 655respond: 656 fw_send_response(card, request, rcode); 657} 658 659/** 660 * fwtty_tx_complete - callback for tx dma 661 * @data: ignored, has no meaning for write txns 662 * @length: ignored, has no meaning for write txns 663 * 664 * The writer must be woken here if the fifo has been emptied because it 665 * may have slept if chars_in_buffer was != 0 666 */ 667static void fwtty_tx_complete(struct fw_card *card, int rcode, 668 void *data, size_t length, 669 struct fwtty_transaction *txn) 670{ 671 struct fwtty_port *port = txn->port; 672 int len; 673 674 fwtty_dbg(port, "rcode: %d\n", rcode); 675 676 switch (rcode) { 677 case RCODE_COMPLETE: 678 spin_lock_bh(&port->lock); 679 dma_fifo_out_complete(&port->tx_fifo, &txn->dma_pended); 680 len = dma_fifo_level(&port->tx_fifo); 681 spin_unlock_bh(&port->lock); 682 683 port->icount.tx += txn->dma_pended.len; 684 break; 685 686 default: 687 /* TODO: implement retries */ 688 spin_lock_bh(&port->lock); 689 dma_fifo_out_complete(&port->tx_fifo, &txn->dma_pended); 690 len = dma_fifo_level(&port->tx_fifo); 691 spin_unlock_bh(&port->lock); 692 693 port->stats.dropped += txn->dma_pended.len; 694 } 695 696 if (len < WAKEUP_CHARS) 697 tty_port_tty_wakeup(&port->port); 698} 699 700static int fwtty_tx(struct fwtty_port *port, bool drain) 701{ 702 struct fwtty_peer *peer; 703 struct fwtty_transaction *txn; 704 struct tty_struct *tty; 705 int n, len; 706 707 tty = tty_port_tty_get(&port->port); 708 if (!tty) 709 return -ENOENT; 710 711 rcu_read_lock(); 712 peer = rcu_dereference(port->peer); 713 if (!peer) { 714 n = -EIO; 715 goto out; 716 } 717 718 if (test_and_set_bit(IN_TX, &port->flags)) { 719 n = -EALREADY; 720 goto out; 721 } 722 723 /* try to write as many dma transactions out as possible */ 724 n = -EAGAIN; 725 while (!tty->stopped && !tty->hw_stopped && 726 !test_bit(STOP_TX, &port->flags)) { 727 txn = kmem_cache_alloc(fwtty_txn_cache, GFP_ATOMIC); 728 if (!txn) { 729 n = -ENOMEM; 730 break; 731 } 732 733 spin_lock_bh(&port->lock); 734 n = dma_fifo_out_pend(&port->tx_fifo, &txn->dma_pended); 735 spin_unlock_bh(&port->lock); 736 737 fwtty_dbg(port, "out: %u rem: %d\n", txn->dma_pended.len, n); 738 739 if (n < 0) { 740 kmem_cache_free(fwtty_txn_cache, txn); 741 if (n == -EAGAIN) { 742 ++port->stats.tx_stall; 743 } else if (n == -ENODATA) { 744 fwtty_profile_data(port->stats.txns, 0); 745 } else { 746 ++port->stats.fifo_errs; 747 fwtty_err_ratelimited(port, "fifo err: %d\n", 748 n); 749 } 750 break; 751 } 752 753 fwtty_profile_data(port->stats.txns, txn->dma_pended.len); 754 755 fwtty_send_txn_async(peer, txn, TCODE_WRITE_BLOCK_REQUEST, 756 peer->fifo_addr, txn->dma_pended.data, 757 txn->dma_pended.len, fwtty_tx_complete, 758 port); 759 ++port->stats.sent; 760 761 /* 762 * Stop tx if the 'last view' of the fifo is empty or if 763 * this is the writer and there's not enough data to bother 764 */ 765 if (n == 0 || (!drain && n < WRITER_MINIMUM)) 766 break; 767 } 768 769 if (n >= 0 || n == -EAGAIN || n == -ENOMEM || n == -ENODATA) { 770 spin_lock_bh(&port->lock); 771 len = dma_fifo_out_level(&port->tx_fifo); 772 if (len) { 773 unsigned long delay = (n == -ENOMEM) ? HZ : 1; 774 775 schedule_delayed_work(&port->drain, delay); 776 } 777 len = dma_fifo_level(&port->tx_fifo); 778 spin_unlock_bh(&port->lock); 779 780 /* wakeup the writer */ 781 if (drain && len < WAKEUP_CHARS) 782 tty_wakeup(tty); 783 } 784 785 clear_bit(IN_TX, &port->flags); 786 wake_up_interruptible(&port->wait_tx); 787 788out: 789 rcu_read_unlock(); 790 tty_kref_put(tty); 791 return n; 792} 793 794static void fwtty_drain_tx(struct work_struct *work) 795{ 796 struct fwtty_port *port = to_port(to_delayed_work(work), drain); 797 798 fwtty_tx(port, true); 799} 800 801static void fwtty_write_xchar(struct fwtty_port *port, char ch) 802{ 803 struct fwtty_peer *peer; 804 805 ++port->stats.xchars; 806 807 fwtty_dbg(port, "%02x\n", ch); 808 809 rcu_read_lock(); 810 peer = rcu_dereference(port->peer); 811 if (peer) { 812 fwtty_send_data_async(peer, TCODE_WRITE_BLOCK_REQUEST, 813 peer->fifo_addr, &ch, sizeof(ch), 814 NULL, port); 815 } 816 rcu_read_unlock(); 817} 818 819static struct fwtty_port *fwtty_port_get(unsigned int index) 820{ 821 struct fwtty_port *port; 822 823 if (index >= MAX_TOTAL_PORTS) 824 return NULL; 825 826 mutex_lock(&port_table_lock); 827 port = port_table[index]; 828 if (port) 829 kref_get(&port->serial->kref); 830 mutex_unlock(&port_table_lock); 831 return port; 832} 833 834static int fwtty_ports_add(struct fw_serial *serial) 835{ 836 int err = -EBUSY; 837 int i, j; 838 839 if (port_table_corrupt) 840 return err; 841 842 mutex_lock(&port_table_lock); 843 for (i = 0; i + num_ports <= MAX_TOTAL_PORTS; i += num_ports) { 844 if (!port_table[i]) { 845 for (j = 0; j < num_ports; ++i, ++j) { 846 serial->ports[j]->index = i; 847 port_table[i] = serial->ports[j]; 848 } 849 err = 0; 850 break; 851 } 852 } 853 mutex_unlock(&port_table_lock); 854 return err; 855} 856 857static void fwserial_destroy(struct kref *kref) 858{ 859 struct fw_serial *serial = to_serial(kref, kref); 860 struct fwtty_port **ports = serial->ports; 861 int j, i = ports[0]->index; 862 863 synchronize_rcu(); 864 865 mutex_lock(&port_table_lock); 866 for (j = 0; j < num_ports; ++i, ++j) { 867 port_table_corrupt |= port_table[i] != ports[j]; 868 WARN_ONCE(port_table_corrupt, "port_table[%d]: %p != ports[%d]: %p", 869 i, port_table[i], j, ports[j]); 870 871 port_table[i] = NULL; 872 } 873 mutex_unlock(&port_table_lock); 874 875 for (j = 0; j < num_ports; ++j) { 876 fw_core_remove_address_handler(&ports[j]->rx_handler); 877 tty_port_destroy(&ports[j]->port); 878 kfree(ports[j]); 879 } 880 kfree(serial); 881} 882 883static void fwtty_port_put(struct fwtty_port *port) 884{ 885 kref_put(&port->serial->kref, fwserial_destroy); 886} 887 888static void fwtty_port_dtr_rts(struct tty_port *tty_port, int on) 889{ 890 struct fwtty_port *port = to_port(tty_port, port); 891 892 fwtty_dbg(port, "on/off: %d\n", on); 893 894 spin_lock_bh(&port->lock); 895 /* Don't change carrier state if this is a console */ 896 if (!port->port.console) { 897 if (on) 898 port->mctrl |= TIOCM_DTR | TIOCM_RTS; 899 else 900 port->mctrl &= ~(TIOCM_DTR | TIOCM_RTS); 901 } 902 903 __fwtty_write_port_status(port); 904 spin_unlock_bh(&port->lock); 905} 906 907/** 908 * fwtty_port_carrier_raised: required tty_port operation 909 * 910 * This port operation is polled after a tty has been opened and is waiting for 911 * carrier detect -- see drivers/tty/tty_port:tty_port_block_til_ready(). 912 */ 913static int fwtty_port_carrier_raised(struct tty_port *tty_port) 914{ 915 struct fwtty_port *port = to_port(tty_port, port); 916 int rc; 917 918 rc = (port->mstatus & TIOCM_CAR); 919 920 fwtty_dbg(port, "%d\n", rc); 921 922 return rc; 923} 924 925static unsigned int set_termios(struct fwtty_port *port, struct tty_struct *tty) 926{ 927 unsigned int baud, frame; 928 929 baud = tty_termios_baud_rate(&tty->termios); 930 tty_termios_encode_baud_rate(&tty->termios, baud, baud); 931 932 /* compute bit count of 2 frames */ 933 frame = 12 + ((C_CSTOPB(tty)) ? 4 : 2) + ((C_PARENB(tty)) ? 2 : 0); 934 935 switch (C_CSIZE(tty)) { 936 case CS5: 937 frame -= (C_CSTOPB(tty)) ? 1 : 0; 938 break; 939 case CS6: 940 frame += 2; 941 break; 942 case CS7: 943 frame += 4; 944 break; 945 case CS8: 946 frame += 6; 947 break; 948 } 949 950 port->cps = (baud << 1) / frame; 951 952 port->status_mask = UART_LSR_OE; 953 if (_I_FLAG(tty, BRKINT | PARMRK)) 954 port->status_mask |= UART_LSR_BI; 955 956 port->ignore_mask = 0; 957 if (I_IGNBRK(tty)) { 958 port->ignore_mask |= UART_LSR_BI; 959 if (I_IGNPAR(tty)) 960 port->ignore_mask |= UART_LSR_OE; 961 } 962 963 port->write_only = !C_CREAD(tty); 964 965 /* turn off echo and newline xlat if loopback */ 966 if (port->loopback) { 967 tty->termios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHOKE | 968 ECHONL | ECHOPRT | ECHOCTL); 969 tty->termios.c_oflag &= ~ONLCR; 970 } 971 972 return baud; 973} 974 975static int fwtty_port_activate(struct tty_port *tty_port, 976 struct tty_struct *tty) 977{ 978 struct fwtty_port *port = to_port(tty_port, port); 979 unsigned int baud; 980 int err; 981 982 set_bit(TTY_IO_ERROR, &tty->flags); 983 984 err = dma_fifo_alloc(&port->tx_fifo, FWTTY_PORT_TXFIFO_LEN, 985 cache_line_size(), 986 port->max_payload, 987 FWTTY_PORT_MAX_PEND_DMA, 988 GFP_KERNEL); 989 if (err) 990 return err; 991 992 spin_lock_bh(&port->lock); 993 994 baud = set_termios(port, tty); 995 996 /* if console, don't change carrier state */ 997 if (!port->port.console) { 998 port->mctrl = 0; 999 if (baud != 0) 1000 port->mctrl = TIOCM_DTR | TIOCM_RTS; 1001 } 1002 1003 if (C_CRTSCTS(tty) && ~port->mstatus & TIOCM_CTS) 1004 tty->hw_stopped = 1; 1005 1006 __fwtty_write_port_status(port); 1007 spin_unlock_bh(&port->lock); 1008 1009 clear_bit(TTY_IO_ERROR, &tty->flags); 1010 1011 return 0; 1012} 1013 1014/** 1015 * fwtty_port_shutdown 1016 * 1017 * Note: the tty port core ensures this is not the console and 1018 * manages TTY_IO_ERROR properly 1019 */ 1020static void fwtty_port_shutdown(struct tty_port *tty_port) 1021{ 1022 struct fwtty_port *port = to_port(tty_port, port); 1023 1024 /* TODO: cancel outstanding transactions */ 1025 1026 cancel_delayed_work_sync(&port->emit_breaks); 1027 cancel_delayed_work_sync(&port->drain); 1028 1029 spin_lock_bh(&port->lock); 1030 port->flags = 0; 1031 port->break_ctl = 0; 1032 port->overrun = 0; 1033 __fwtty_write_port_status(port); 1034 dma_fifo_free(&port->tx_fifo); 1035 spin_unlock_bh(&port->lock); 1036} 1037 1038static int fwtty_open(struct tty_struct *tty, struct file *fp) 1039{ 1040 struct fwtty_port *port = tty->driver_data; 1041 1042 return tty_port_open(&port->port, tty, fp); 1043} 1044 1045static void fwtty_close(struct tty_struct *tty, struct file *fp) 1046{ 1047 struct fwtty_port *port = tty->driver_data; 1048 1049 tty_port_close(&port->port, tty, fp); 1050} 1051 1052static void fwtty_hangup(struct tty_struct *tty) 1053{ 1054 struct fwtty_port *port = tty->driver_data; 1055 1056 tty_port_hangup(&port->port); 1057} 1058 1059static void fwtty_cleanup(struct tty_struct *tty) 1060{ 1061 struct fwtty_port *port = tty->driver_data; 1062 1063 tty->driver_data = NULL; 1064 fwtty_port_put(port); 1065} 1066 1067static int fwtty_install(struct tty_driver *driver, struct tty_struct *tty) 1068{ 1069 struct fwtty_port *port = fwtty_port_get(tty->index); 1070 int err; 1071 1072 err = tty_standard_install(driver, tty); 1073 if (!err) 1074 tty->driver_data = port; 1075 else 1076 fwtty_port_put(port); 1077 return err; 1078} 1079 1080static int fwloop_install(struct tty_driver *driver, struct tty_struct *tty) 1081{ 1082 struct fwtty_port *port = fwtty_port_get(table_idx(tty->index)); 1083 int err; 1084 1085 err = tty_standard_install(driver, tty); 1086 if (!err) 1087 tty->driver_data = port; 1088 else 1089 fwtty_port_put(port); 1090 return err; 1091} 1092 1093static int fwtty_write(struct tty_struct *tty, const unsigned char *buf, int c) 1094{ 1095 struct fwtty_port *port = tty->driver_data; 1096 int n, len; 1097 1098 fwtty_dbg(port, "%d\n", c); 1099 fwtty_profile_data(port->stats.writes, c); 1100 1101 spin_lock_bh(&port->lock); 1102 n = dma_fifo_in(&port->tx_fifo, buf, c); 1103 len = dma_fifo_out_level(&port->tx_fifo); 1104 if (len < DRAIN_THRESHOLD) 1105 schedule_delayed_work(&port->drain, 1); 1106 spin_unlock_bh(&port->lock); 1107 1108 if (len >= DRAIN_THRESHOLD) 1109 fwtty_tx(port, false); 1110 1111 debug_short_write(port, c, n); 1112 1113 return (n < 0) ? 0 : n; 1114} 1115 1116static int fwtty_write_room(struct tty_struct *tty) 1117{ 1118 struct fwtty_port *port = tty->driver_data; 1119 int n; 1120 1121 spin_lock_bh(&port->lock); 1122 n = dma_fifo_avail(&port->tx_fifo); 1123 spin_unlock_bh(&port->lock); 1124 1125 fwtty_dbg(port, "%d\n", n); 1126 1127 return n; 1128} 1129 1130static int fwtty_chars_in_buffer(struct tty_struct *tty) 1131{ 1132 struct fwtty_port *port = tty->driver_data; 1133 int n; 1134 1135 spin_lock_bh(&port->lock); 1136 n = dma_fifo_level(&port->tx_fifo); 1137 spin_unlock_bh(&port->lock); 1138 1139 fwtty_dbg(port, "%d\n", n); 1140 1141 return n; 1142} 1143 1144static void fwtty_send_xchar(struct tty_struct *tty, char ch) 1145{ 1146 struct fwtty_port *port = tty->driver_data; 1147 1148 fwtty_dbg(port, "%02x\n", ch); 1149 1150 fwtty_write_xchar(port, ch); 1151} 1152 1153static void fwtty_throttle(struct tty_struct *tty) 1154{ 1155 struct fwtty_port *port = tty->driver_data; 1156 1157 /* 1158 * Ignore throttling (but not unthrottling). 1159 * It only makes sense to throttle when data will no longer be 1160 * accepted by the tty flip buffer. For example, it is 1161 * possible for received data to overflow the tty buffer long 1162 * before the line discipline ever has a chance to throttle the driver. 1163 * Additionally, the driver may have already completed the I/O 1164 * but the tty buffer is still emptying, so the line discipline is 1165 * throttling and unthrottling nothing. 1166 */ 1167 1168 ++port->stats.throttled; 1169} 1170 1171static void fwtty_unthrottle(struct tty_struct *tty) 1172{ 1173 struct fwtty_port *port = tty->driver_data; 1174 1175 fwtty_dbg(port, "CRTSCTS: %d\n", C_CRTSCTS(tty) != 0); 1176 1177 fwtty_profile_fifo(port, port->stats.unthrottle); 1178 1179 spin_lock_bh(&port->lock); 1180 port->mctrl &= ~OOB_RX_THROTTLE; 1181 if (C_CRTSCTS(tty)) 1182 port->mctrl |= TIOCM_RTS; 1183 __fwtty_write_port_status(port); 1184 spin_unlock_bh(&port->lock); 1185} 1186 1187static int check_msr_delta(struct fwtty_port *port, unsigned long mask, 1188 struct async_icount *prev) 1189{ 1190 struct async_icount now; 1191 int delta; 1192 1193 now = port->icount; 1194 1195 delta = ((mask & TIOCM_RNG && prev->rng != now.rng) || 1196 (mask & TIOCM_DSR && prev->dsr != now.dsr) || 1197 (mask & TIOCM_CAR && prev->dcd != now.dcd) || 1198 (mask & TIOCM_CTS && prev->cts != now.cts)); 1199 1200 *prev = now; 1201 1202 return delta; 1203} 1204 1205static int wait_msr_change(struct fwtty_port *port, unsigned long mask) 1206{ 1207 struct async_icount prev; 1208 1209 prev = port->icount; 1210 1211 return wait_event_interruptible(port->port.delta_msr_wait, 1212 check_msr_delta(port, mask, &prev)); 1213} 1214 1215static int get_serial_info(struct tty_struct *tty, 1216 struct serial_struct *ss) 1217{ 1218 struct fwtty_port *port = tty->driver_data; 1219 1220 mutex_lock(&port->port.mutex); 1221 ss->type = PORT_UNKNOWN; 1222 ss->line = port->port.tty->index; 1223 ss->flags = port->port.flags; 1224 ss->xmit_fifo_size = FWTTY_PORT_TXFIFO_LEN; 1225 ss->baud_base = 400000000; 1226 ss->close_delay = port->port.close_delay; 1227 mutex_unlock(&port->port.mutex); 1228 return 0; 1229} 1230 1231static int set_serial_info(struct tty_struct *tty, 1232 struct serial_struct *ss) 1233{ 1234 struct fwtty_port *port = tty->driver_data; 1235 1236 if (ss->irq != 0 || ss->port != 0 || ss->custom_divisor != 0 || 1237 ss->baud_base != 400000000) 1238 return -EPERM; 1239 1240 mutex_lock(&port->port.mutex); 1241 if (!capable(CAP_SYS_ADMIN)) { 1242 if (((ss->flags & ~ASYNC_USR_MASK) != 1243 (port->port.flags & ~ASYNC_USR_MASK))) { 1244 mutex_unlock(&port->port.mutex); 1245 return -EPERM; 1246 } 1247 } 1248 port->port.close_delay = ss->close_delay * HZ / 100; 1249 mutex_unlock(&port->port.mutex); 1250 1251 return 0; 1252} 1253 1254static int fwtty_ioctl(struct tty_struct *tty, unsigned int cmd, 1255 unsigned long arg) 1256{ 1257 struct fwtty_port *port = tty->driver_data; 1258 int err; 1259 1260 switch (cmd) { 1261 case TIOCMIWAIT: 1262 err = wait_msr_change(port, arg); 1263 break; 1264 1265 default: 1266 err = -ENOIOCTLCMD; 1267 } 1268 1269 return err; 1270} 1271 1272static void fwtty_set_termios(struct tty_struct *tty, struct ktermios *old) 1273{ 1274 struct fwtty_port *port = tty->driver_data; 1275 unsigned int baud; 1276 1277 spin_lock_bh(&port->lock); 1278 baud = set_termios(port, tty); 1279 1280 if ((baud == 0) && (old->c_cflag & CBAUD)) { 1281 port->mctrl &= ~(TIOCM_DTR | TIOCM_RTS); 1282 } else if ((baud != 0) && !(old->c_cflag & CBAUD)) { 1283 if (C_CRTSCTS(tty) || !tty_throttled(tty)) 1284 port->mctrl |= TIOCM_DTR | TIOCM_RTS; 1285 else 1286 port->mctrl |= TIOCM_DTR; 1287 } 1288 __fwtty_write_port_status(port); 1289 spin_unlock_bh(&port->lock); 1290 1291 if (old->c_cflag & CRTSCTS) { 1292 if (!C_CRTSCTS(tty)) { 1293 tty->hw_stopped = 0; 1294 fwtty_restart_tx(port); 1295 } 1296 } else if (C_CRTSCTS(tty) && ~port->mstatus & TIOCM_CTS) { 1297 tty->hw_stopped = 1; 1298 } 1299} 1300 1301/** 1302 * fwtty_break_ctl - start/stop sending breaks 1303 * 1304 * Signals the remote to start or stop generating simulated breaks. 1305 * First, stop dequeueing from the fifo and wait for writer/drain to leave tx 1306 * before signalling the break line status. This guarantees any pending rx will 1307 * be queued to the line discipline before break is simulated on the remote. 1308 * Conversely, turning off break_ctl requires signalling the line status change, 1309 * then enabling tx. 1310 */ 1311static int fwtty_break_ctl(struct tty_struct *tty, int state) 1312{ 1313 struct fwtty_port *port = tty->driver_data; 1314 long ret; 1315 1316 fwtty_dbg(port, "%d\n", state); 1317 1318 if (state == -1) { 1319 set_bit(STOP_TX, &port->flags); 1320 ret = wait_event_interruptible_timeout(port->wait_tx, 1321 !test_bit(IN_TX, &port->flags), 1322 10); 1323 if (ret == 0 || ret == -ERESTARTSYS) { 1324 clear_bit(STOP_TX, &port->flags); 1325 fwtty_restart_tx(port); 1326 return -EINTR; 1327 } 1328 } 1329 1330 spin_lock_bh(&port->lock); 1331 port->break_ctl = (state == -1); 1332 __fwtty_write_port_status(port); 1333 spin_unlock_bh(&port->lock); 1334 1335 if (state == 0) { 1336 spin_lock_bh(&port->lock); 1337 dma_fifo_reset(&port->tx_fifo); 1338 clear_bit(STOP_TX, &port->flags); 1339 spin_unlock_bh(&port->lock); 1340 } 1341 return 0; 1342} 1343 1344static int fwtty_tiocmget(struct tty_struct *tty) 1345{ 1346 struct fwtty_port *port = tty->driver_data; 1347 unsigned int tiocm; 1348 1349 spin_lock_bh(&port->lock); 1350 tiocm = (port->mctrl & MCTRL_MASK) | (port->mstatus & ~MCTRL_MASK); 1351 spin_unlock_bh(&port->lock); 1352 1353 fwtty_dbg(port, "%x\n", tiocm); 1354 1355 return tiocm; 1356} 1357 1358static int fwtty_tiocmset(struct tty_struct *tty, 1359 unsigned int set, unsigned int clear) 1360{ 1361 struct fwtty_port *port = tty->driver_data; 1362 1363 fwtty_dbg(port, "set: %x clear: %x\n", set, clear); 1364 1365 /* TODO: simulate loopback if TIOCM_LOOP set */ 1366 1367 spin_lock_bh(&port->lock); 1368 port->mctrl &= ~(clear & MCTRL_MASK & 0xffff); 1369 port->mctrl |= set & MCTRL_MASK & 0xffff; 1370 __fwtty_write_port_status(port); 1371 spin_unlock_bh(&port->lock); 1372 return 0; 1373} 1374 1375static int fwtty_get_icount(struct tty_struct *tty, 1376 struct serial_icounter_struct *icount) 1377{ 1378 struct fwtty_port *port = tty->driver_data; 1379 struct stats stats; 1380 1381 memcpy(&stats, &port->stats, sizeof(stats)); 1382 if (port->port.console) 1383 (*port->fwcon_ops->stats)(&stats, port->con_data); 1384 1385 icount->cts = port->icount.cts; 1386 icount->dsr = port->icount.dsr; 1387 icount->rng = port->icount.rng; 1388 icount->dcd = port->icount.dcd; 1389 icount->rx = port->icount.rx; 1390 icount->tx = port->icount.tx + stats.xchars; 1391 icount->frame = port->icount.frame; 1392 icount->overrun = port->icount.overrun; 1393 icount->parity = port->icount.parity; 1394 icount->brk = port->icount.brk; 1395 icount->buf_overrun = port->icount.overrun; 1396 return 0; 1397} 1398 1399static void fwtty_proc_show_port(struct seq_file *m, struct fwtty_port *port) 1400{ 1401 struct stats stats; 1402 1403 memcpy(&stats, &port->stats, sizeof(stats)); 1404 if (port->port.console) 1405 (*port->fwcon_ops->stats)(&stats, port->con_data); 1406 1407 seq_printf(m, " addr:%012llx tx:%d rx:%d", port->rx_handler.offset, 1408 port->icount.tx + stats.xchars, port->icount.rx); 1409 seq_printf(m, " cts:%d dsr:%d rng:%d dcd:%d", port->icount.cts, 1410 port->icount.dsr, port->icount.rng, port->icount.dcd); 1411 seq_printf(m, " fe:%d oe:%d pe:%d brk:%d", port->icount.frame, 1412 port->icount.overrun, port->icount.parity, port->icount.brk); 1413} 1414 1415static void fwtty_debugfs_show_port(struct seq_file *m, struct fwtty_port *port) 1416{ 1417 struct stats stats; 1418 1419 memcpy(&stats, &port->stats, sizeof(stats)); 1420 if (port->port.console) 1421 (*port->fwcon_ops->stats)(&stats, port->con_data); 1422 1423 seq_printf(m, " dr:%d st:%d err:%d lost:%d", stats.dropped, 1424 stats.tx_stall, stats.fifo_errs, stats.lost); 1425 seq_printf(m, " pkts:%d thr:%d", stats.sent, stats.throttled); 1426 1427 if (port->port.console) { 1428 seq_puts(m, "\n "); 1429 (*port->fwcon_ops->proc_show)(m, port->con_data); 1430 } 1431 1432 fwtty_dump_profile(m, &port->stats); 1433} 1434 1435static void fwtty_debugfs_show_peer(struct seq_file *m, struct fwtty_peer *peer) 1436{ 1437 int generation = peer->generation; 1438 1439 smp_rmb(); 1440 seq_printf(m, " %s:", dev_name(&peer->unit->device)); 1441 seq_printf(m, " node:%04x gen:%d", peer->node_id, generation); 1442 seq_printf(m, " sp:%d max:%d guid:%016llx", peer->speed, 1443 peer->max_payload, (unsigned long long)peer->guid); 1444 seq_printf(m, " mgmt:%012llx", (unsigned long long)peer->mgmt_addr); 1445 seq_printf(m, " addr:%012llx", (unsigned long long)peer->status_addr); 1446 seq_putc(m, '\n'); 1447} 1448 1449static int fwtty_proc_show(struct seq_file *m, void *v) 1450{ 1451 struct fwtty_port *port; 1452 int i; 1453 1454 seq_puts(m, "fwserinfo: 1.0 driver: 1.0\n"); 1455 for (i = 0; i < MAX_TOTAL_PORTS && (port = fwtty_port_get(i)); ++i) { 1456 seq_printf(m, "%2d:", i); 1457 if (capable(CAP_SYS_ADMIN)) 1458 fwtty_proc_show_port(m, port); 1459 fwtty_port_put(port); 1460 seq_puts(m, "\n"); 1461 } 1462 return 0; 1463} 1464 1465static int fwtty_stats_show(struct seq_file *m, void *v) 1466{ 1467 struct fw_serial *serial = m->private; 1468 struct fwtty_port *port; 1469 int i; 1470 1471 for (i = 0; i < num_ports; ++i) { 1472 port = fwtty_port_get(serial->ports[i]->index); 1473 if (port) { 1474 seq_printf(m, "%2d:", port->index); 1475 fwtty_proc_show_port(m, port); 1476 fwtty_debugfs_show_port(m, port); 1477 fwtty_port_put(port); 1478 seq_puts(m, "\n"); 1479 } 1480 } 1481 return 0; 1482} 1483DEFINE_SHOW_ATTRIBUTE(fwtty_stats); 1484 1485static int fwtty_peers_show(struct seq_file *m, void *v) 1486{ 1487 struct fw_serial *serial = m->private; 1488 struct fwtty_peer *peer; 1489 1490 rcu_read_lock(); 1491 seq_printf(m, "card: %s guid: %016llx\n", 1492 dev_name(serial->card->device), 1493 (unsigned long long)serial->card->guid); 1494 list_for_each_entry_rcu(peer, &serial->peer_list, list) 1495 fwtty_debugfs_show_peer(m, peer); 1496 rcu_read_unlock(); 1497 return 0; 1498} 1499DEFINE_SHOW_ATTRIBUTE(fwtty_peers); 1500 1501static const struct tty_port_operations fwtty_port_ops = { 1502 .dtr_rts = fwtty_port_dtr_rts, 1503 .carrier_raised = fwtty_port_carrier_raised, 1504 .shutdown = fwtty_port_shutdown, 1505 .activate = fwtty_port_activate, 1506}; 1507 1508static const struct tty_operations fwtty_ops = { 1509 .open = fwtty_open, 1510 .close = fwtty_close, 1511 .hangup = fwtty_hangup, 1512 .cleanup = fwtty_cleanup, 1513 .install = fwtty_install, 1514 .write = fwtty_write, 1515 .write_room = fwtty_write_room, 1516 .chars_in_buffer = fwtty_chars_in_buffer, 1517 .send_xchar = fwtty_send_xchar, 1518 .throttle = fwtty_throttle, 1519 .unthrottle = fwtty_unthrottle, 1520 .ioctl = fwtty_ioctl, 1521 .set_termios = fwtty_set_termios, 1522 .break_ctl = fwtty_break_ctl, 1523 .tiocmget = fwtty_tiocmget, 1524 .tiocmset = fwtty_tiocmset, 1525 .get_icount = fwtty_get_icount, 1526 .set_serial = set_serial_info, 1527 .get_serial = get_serial_info, 1528 .proc_show = fwtty_proc_show, 1529}; 1530 1531static const struct tty_operations fwloop_ops = { 1532 .open = fwtty_open, 1533 .close = fwtty_close, 1534 .hangup = fwtty_hangup, 1535 .cleanup = fwtty_cleanup, 1536 .install = fwloop_install, 1537 .write = fwtty_write, 1538 .write_room = fwtty_write_room, 1539 .chars_in_buffer = fwtty_chars_in_buffer, 1540 .send_xchar = fwtty_send_xchar, 1541 .throttle = fwtty_throttle, 1542 .unthrottle = fwtty_unthrottle, 1543 .ioctl = fwtty_ioctl, 1544 .set_termios = fwtty_set_termios, 1545 .break_ctl = fwtty_break_ctl, 1546 .tiocmget = fwtty_tiocmget, 1547 .tiocmset = fwtty_tiocmset, 1548 .get_icount = fwtty_get_icount, 1549 .set_serial = set_serial_info, 1550 .get_serial = get_serial_info, 1551}; 1552 1553static inline int mgmt_pkt_expected_len(__be16 code) 1554{ 1555 static const struct fwserial_mgmt_pkt pkt; 1556 1557 switch (be16_to_cpu(code)) { 1558 case FWSC_VIRT_CABLE_PLUG: 1559 return sizeof(pkt.hdr) + sizeof(pkt.plug_req); 1560 1561 case FWSC_VIRT_CABLE_PLUG_RSP: /* | FWSC_RSP_OK */ 1562 return sizeof(pkt.hdr) + sizeof(pkt.plug_rsp); 1563 1564 case FWSC_VIRT_CABLE_UNPLUG: 1565 case FWSC_VIRT_CABLE_UNPLUG_RSP: 1566 case FWSC_VIRT_CABLE_PLUG_RSP | FWSC_RSP_NACK: 1567 case FWSC_VIRT_CABLE_UNPLUG_RSP | FWSC_RSP_NACK: 1568 return sizeof(pkt.hdr); 1569 1570 default: 1571 return -1; 1572 } 1573} 1574 1575static inline void fill_plug_params(struct virt_plug_params *params, 1576 struct fwtty_port *port) 1577{ 1578 u64 status_addr = port->rx_handler.offset; 1579 u64 fifo_addr = port->rx_handler.offset + 4; 1580 size_t fifo_len = port->rx_handler.length - 4; 1581 1582 params->status_hi = cpu_to_be32(status_addr >> 32); 1583 params->status_lo = cpu_to_be32(status_addr); 1584 params->fifo_hi = cpu_to_be32(fifo_addr >> 32); 1585 params->fifo_lo = cpu_to_be32(fifo_addr); 1586 params->fifo_len = cpu_to_be32(fifo_len); 1587} 1588 1589static inline void fill_plug_req(struct fwserial_mgmt_pkt *pkt, 1590 struct fwtty_port *port) 1591{ 1592 pkt->hdr.code = cpu_to_be16(FWSC_VIRT_CABLE_PLUG); 1593 pkt->hdr.len = cpu_to_be16(mgmt_pkt_expected_len(pkt->hdr.code)); 1594 fill_plug_params(&pkt->plug_req, port); 1595} 1596 1597static inline void fill_plug_rsp_ok(struct fwserial_mgmt_pkt *pkt, 1598 struct fwtty_port *port) 1599{ 1600 pkt->hdr.code = cpu_to_be16(FWSC_VIRT_CABLE_PLUG_RSP); 1601 pkt->hdr.len = cpu_to_be16(mgmt_pkt_expected_len(pkt->hdr.code)); 1602 fill_plug_params(&pkt->plug_rsp, port); 1603} 1604 1605static inline void fill_plug_rsp_nack(struct fwserial_mgmt_pkt *pkt) 1606{ 1607 pkt->hdr.code = cpu_to_be16(FWSC_VIRT_CABLE_PLUG_RSP | FWSC_RSP_NACK); 1608 pkt->hdr.len = cpu_to_be16(mgmt_pkt_expected_len(pkt->hdr.code)); 1609} 1610 1611static inline void fill_unplug_rsp_nack(struct fwserial_mgmt_pkt *pkt) 1612{ 1613 pkt->hdr.code = cpu_to_be16(FWSC_VIRT_CABLE_UNPLUG_RSP | FWSC_RSP_NACK); 1614 pkt->hdr.len = cpu_to_be16(mgmt_pkt_expected_len(pkt->hdr.code)); 1615} 1616 1617static inline void fill_unplug_rsp_ok(struct fwserial_mgmt_pkt *pkt) 1618{ 1619 pkt->hdr.code = cpu_to_be16(FWSC_VIRT_CABLE_UNPLUG_RSP); 1620 pkt->hdr.len = cpu_to_be16(mgmt_pkt_expected_len(pkt->hdr.code)); 1621} 1622 1623static void fwserial_virt_plug_complete(struct fwtty_peer *peer, 1624 struct virt_plug_params *params) 1625{ 1626 struct fwtty_port *port = peer->port; 1627 1628 peer->status_addr = be32_to_u64(params->status_hi, params->status_lo); 1629 peer->fifo_addr = be32_to_u64(params->fifo_hi, params->fifo_lo); 1630 peer->fifo_len = be32_to_cpu(params->fifo_len); 1631 peer_set_state(peer, FWPS_ATTACHED); 1632 1633 /* reconfigure tx_fifo optimally for this peer */ 1634 spin_lock_bh(&port->lock); 1635 port->max_payload = min(peer->max_payload, peer->fifo_len); 1636 dma_fifo_change_tx_limit(&port->tx_fifo, port->max_payload); 1637 spin_unlock_bh(&peer->port->lock); 1638 1639 if (port->port.console && port->fwcon_ops->notify) 1640 (*port->fwcon_ops->notify)(FWCON_NOTIFY_ATTACH, port->con_data); 1641 1642 fwtty_info(&peer->unit, "peer (guid:%016llx) connected on %s\n", 1643 (unsigned long long)peer->guid, dev_name(port->device)); 1644} 1645 1646static inline int fwserial_send_mgmt_sync(struct fwtty_peer *peer, 1647 struct fwserial_mgmt_pkt *pkt) 1648{ 1649 int generation; 1650 int rcode, tries = 5; 1651 1652 do { 1653 generation = peer->generation; 1654 smp_rmb(); 1655 1656 rcode = fw_run_transaction(peer->serial->card, 1657 TCODE_WRITE_BLOCK_REQUEST, 1658 peer->node_id, 1659 generation, peer->speed, 1660 peer->mgmt_addr, 1661 pkt, be16_to_cpu(pkt->hdr.len)); 1662 if (rcode == RCODE_BUSY || rcode == RCODE_SEND_ERROR || 1663 rcode == RCODE_GENERATION) { 1664 fwtty_dbg(&peer->unit, "mgmt write error: %d\n", rcode); 1665 continue; 1666 } else { 1667 break; 1668 } 1669 } while (--tries > 0); 1670 return rcode; 1671} 1672 1673/** 1674 * fwserial_claim_port - attempt to claim port @ index for peer 1675 * 1676 * Returns ptr to claimed port or error code (as ERR_PTR()) 1677 * Can sleep - must be called from process context 1678 */ 1679static struct fwtty_port *fwserial_claim_port(struct fwtty_peer *peer, 1680 int index) 1681{ 1682 struct fwtty_port *port; 1683 1684 if (index < 0 || index >= num_ports) 1685 return ERR_PTR(-EINVAL); 1686 1687 /* must guarantee that previous port releases have completed */ 1688 synchronize_rcu(); 1689 1690 port = peer->serial->ports[index]; 1691 spin_lock_bh(&port->lock); 1692 if (!rcu_access_pointer(port->peer)) 1693 rcu_assign_pointer(port->peer, peer); 1694 else 1695 port = ERR_PTR(-EBUSY); 1696 spin_unlock_bh(&port->lock); 1697 1698 return port; 1699} 1700 1701/** 1702 * fwserial_find_port - find avail port and claim for peer 1703 * 1704 * Returns ptr to claimed port or NULL if none avail 1705 * Can sleep - must be called from process context 1706 */ 1707static struct fwtty_port *fwserial_find_port(struct fwtty_peer *peer) 1708{ 1709 struct fwtty_port **ports = peer->serial->ports; 1710 int i; 1711 1712 /* must guarantee that previous port releases have completed */ 1713 synchronize_rcu(); 1714 1715 /* TODO: implement optional GUID-to-specific port # matching */ 1716 1717 /* find an unattached port (but not the loopback port, if present) */ 1718 for (i = 0; i < num_ttys; ++i) { 1719 spin_lock_bh(&ports[i]->lock); 1720 if (!ports[i]->peer) { 1721 /* claim port */ 1722 rcu_assign_pointer(ports[i]->peer, peer); 1723 spin_unlock_bh(&ports[i]->lock); 1724 return ports[i]; 1725 } 1726 spin_unlock_bh(&ports[i]->lock); 1727 } 1728 return NULL; 1729} 1730 1731static void fwserial_release_port(struct fwtty_port *port, bool reset) 1732{ 1733 /* drop carrier (and all other line status) */ 1734 if (reset) 1735 fwtty_update_port_status(port, 0); 1736 1737 spin_lock_bh(&port->lock); 1738 1739 /* reset dma fifo max transmission size back to S100 */ 1740 port->max_payload = link_speed_to_max_payload(SCODE_100); 1741 dma_fifo_change_tx_limit(&port->tx_fifo, port->max_payload); 1742 1743 RCU_INIT_POINTER(port->peer, NULL); 1744 spin_unlock_bh(&port->lock); 1745 1746 if (port->port.console && port->fwcon_ops->notify) 1747 (*port->fwcon_ops->notify)(FWCON_NOTIFY_DETACH, port->con_data); 1748} 1749 1750static void fwserial_plug_timeout(struct timer_list *t) 1751{ 1752 struct fwtty_peer *peer = from_timer(peer, t, timer); 1753 struct fwtty_port *port; 1754 1755 spin_lock_bh(&peer->lock); 1756 if (peer->state != FWPS_PLUG_PENDING) { 1757 spin_unlock_bh(&peer->lock); 1758 return; 1759 } 1760 1761 port = peer_revert_state(peer); 1762 spin_unlock_bh(&peer->lock); 1763 1764 if (port) 1765 fwserial_release_port(port, false); 1766} 1767 1768/** 1769 * fwserial_connect_peer - initiate virtual cable with peer 1770 * 1771 * Returns 0 if VIRT_CABLE_PLUG request was successfully sent, 1772 * otherwise error code. Must be called from process context. 1773 */ 1774static int fwserial_connect_peer(struct fwtty_peer *peer) 1775{ 1776 struct fwtty_port *port; 1777 struct fwserial_mgmt_pkt *pkt; 1778 int err, rcode; 1779 1780 pkt = kmalloc(sizeof(*pkt), GFP_KERNEL); 1781 if (!pkt) 1782 return -ENOMEM; 1783 1784 port = fwserial_find_port(peer); 1785 if (!port) { 1786 fwtty_err(&peer->unit, "avail ports in use\n"); 1787 err = -EBUSY; 1788 goto free_pkt; 1789 } 1790 1791 spin_lock_bh(&peer->lock); 1792 1793 /* only initiate VIRT_CABLE_PLUG if peer is currently not attached */ 1794 if (peer->state != FWPS_NOT_ATTACHED) { 1795 err = -EBUSY; 1796 goto release_port; 1797 } 1798 1799 peer->port = port; 1800 peer_set_state(peer, FWPS_PLUG_PENDING); 1801 1802 fill_plug_req(pkt, peer->port); 1803 1804 mod_timer(&peer->timer, jiffies + VIRT_CABLE_PLUG_TIMEOUT); 1805 spin_unlock_bh(&peer->lock); 1806 1807 rcode = fwserial_send_mgmt_sync(peer, pkt); 1808 1809 spin_lock_bh(&peer->lock); 1810 if (peer->state == FWPS_PLUG_PENDING && rcode != RCODE_COMPLETE) { 1811 if (rcode == RCODE_CONFLICT_ERROR) 1812 err = -EAGAIN; 1813 else 1814 err = -EIO; 1815 goto cancel_timer; 1816 } 1817 spin_unlock_bh(&peer->lock); 1818 1819 kfree(pkt); 1820 return 0; 1821 1822cancel_timer: 1823 del_timer(&peer->timer); 1824 peer_revert_state(peer); 1825release_port: 1826 spin_unlock_bh(&peer->lock); 1827 fwserial_release_port(port, false); 1828free_pkt: 1829 kfree(pkt); 1830 return err; 1831} 1832 1833/** 1834 * fwserial_close_port - 1835 * HUP the tty (if the tty exists) and unregister the tty device. 1836 * Only used by the unit driver upon unit removal to disconnect and 1837 * cleanup all attached ports 1838 * 1839 * The port reference is put by fwtty_cleanup (if a reference was 1840 * ever taken). 1841 */ 1842static void fwserial_close_port(struct tty_driver *driver, 1843 struct fwtty_port *port) 1844{ 1845 struct tty_struct *tty; 1846 1847 mutex_lock(&port->port.mutex); 1848 tty = tty_port_tty_get(&port->port); 1849 if (tty) { 1850 tty_vhangup(tty); 1851 tty_kref_put(tty); 1852 } 1853 mutex_unlock(&port->port.mutex); 1854 1855 if (driver == fwloop_driver) 1856 tty_unregister_device(driver, loop_idx(port)); 1857 else 1858 tty_unregister_device(driver, port->index); 1859} 1860 1861/** 1862 * fwserial_lookup - finds first fw_serial associated with card 1863 * @card: fw_card to match 1864 * 1865 * NB: caller must be holding fwserial_list_mutex 1866 */ 1867static struct fw_serial *fwserial_lookup(struct fw_card *card) 1868{ 1869 struct fw_serial *serial; 1870 1871 list_for_each_entry(serial, &fwserial_list, list) { 1872 if (card == serial->card) 1873 return serial; 1874 } 1875 1876 return NULL; 1877} 1878 1879/** 1880 * __fwserial_lookup_rcu - finds first fw_serial associated with card 1881 * @card: fw_card to match 1882 * 1883 * NB: caller must be inside rcu_read_lock() section 1884 */ 1885static struct fw_serial *__fwserial_lookup_rcu(struct fw_card *card) 1886{ 1887 struct fw_serial *serial; 1888 1889 list_for_each_entry_rcu(serial, &fwserial_list, list) { 1890 if (card == serial->card) 1891 return serial; 1892 } 1893 1894 return NULL; 1895} 1896 1897/** 1898 * __fwserial_peer_by_node_id - finds a peer matching the given generation + id 1899 * 1900 * If a matching peer could not be found for the specified generation/node id, 1901 * this could be because: 1902 * a) the generation has changed and one of the nodes hasn't updated yet 1903 * b) the remote node has created its remote unit device before this 1904 * local node has created its corresponding remote unit device 1905 * In either case, the remote node should retry 1906 * 1907 * Note: caller must be in rcu_read_lock() section 1908 */ 1909static struct fwtty_peer *__fwserial_peer_by_node_id(struct fw_card *card, 1910 int generation, int id) 1911{ 1912 struct fw_serial *serial; 1913 struct fwtty_peer *peer; 1914 1915 serial = __fwserial_lookup_rcu(card); 1916 if (!serial) { 1917 /* 1918 * Something is very wrong - there should be a matching 1919 * fw_serial structure for every fw_card. Maybe the remote node 1920 * has created its remote unit device before this driver has 1921 * been probed for any unit devices... 1922 */ 1923 fwtty_err(card, "unknown card (guid %016llx)\n", 1924 (unsigned long long)card->guid); 1925 return NULL; 1926 } 1927 1928 list_for_each_entry_rcu(peer, &serial->peer_list, list) { 1929 int g = peer->generation; 1930 1931 smp_rmb(); 1932 if (generation == g && id == peer->node_id) 1933 return peer; 1934 } 1935 1936 return NULL; 1937} 1938 1939#ifdef DEBUG 1940static void __dump_peer_list(struct fw_card *card) 1941{ 1942 struct fw_serial *serial; 1943 struct fwtty_peer *peer; 1944 1945 serial = __fwserial_lookup_rcu(card); 1946 if (!serial) 1947 return; 1948 1949 list_for_each_entry_rcu(peer, &serial->peer_list, list) { 1950 int g = peer->generation; 1951 1952 smp_rmb(); 1953 fwtty_dbg(card, "peer(%d:%x) guid: %016llx\n", 1954 g, peer->node_id, (unsigned long long)peer->guid); 1955 } 1956} 1957#else 1958#define __dump_peer_list(s) 1959#endif 1960 1961static void fwserial_auto_connect(struct work_struct *work) 1962{ 1963 struct fwtty_peer *peer = to_peer(to_delayed_work(work), connect); 1964 int err; 1965 1966 err = fwserial_connect_peer(peer); 1967 if (err == -EAGAIN && ++peer->connect_retries < MAX_CONNECT_RETRIES) 1968 schedule_delayed_work(&peer->connect, CONNECT_RETRY_DELAY); 1969} 1970 1971static void fwserial_peer_workfn(struct work_struct *work) 1972{ 1973 struct fwtty_peer *peer = to_peer(work, work); 1974 1975 peer->workfn(work); 1976} 1977 1978/** 1979 * fwserial_add_peer - add a newly probed 'serial' unit device as a 'peer' 1980 * @serial: aggregate representing the specific fw_card to add the peer to 1981 * @unit: 'peer' to create and add to peer_list of serial 1982 * 1983 * Adds a 'peer' (ie, a local or remote 'serial' unit device) to the list of 1984 * peers for a specific fw_card. Optionally, auto-attach this peer to an 1985 * available tty port. This function is called either directly or indirectly 1986 * as a result of a 'serial' unit device being created & probed. 1987 * 1988 * Note: this function is serialized with fwserial_remove_peer() by the 1989 * fwserial_list_mutex held in fwserial_probe(). 1990 * 1991 * A 1:1 correspondence between an fw_unit and an fwtty_peer is maintained 1992 * via the dev_set_drvdata() for the device of the fw_unit. 1993 */ 1994static int fwserial_add_peer(struct fw_serial *serial, struct fw_unit *unit) 1995{ 1996 struct device *dev = &unit->device; 1997 struct fw_device *parent = fw_parent_device(unit); 1998 struct fwtty_peer *peer; 1999 struct fw_csr_iterator ci; 2000 int key, val; 2001 int generation; 2002 2003 peer = kzalloc(sizeof(*peer), GFP_KERNEL); 2004 if (!peer) 2005 return -ENOMEM; 2006 2007 peer_set_state(peer, FWPS_NOT_ATTACHED); 2008 2009 dev_set_drvdata(dev, peer); 2010 peer->unit = unit; 2011 peer->guid = (u64)parent->config_rom[3] << 32 | parent->config_rom[4]; 2012 peer->speed = parent->max_speed; 2013 peer->max_payload = min(device_max_receive(parent), 2014 link_speed_to_max_payload(peer->speed)); 2015 2016 generation = parent->generation; 2017 smp_rmb(); 2018 peer->node_id = parent->node_id; 2019 smp_wmb(); 2020 peer->generation = generation; 2021 2022 /* retrieve the mgmt bus addr from the unit directory */ 2023 fw_csr_iterator_init(&ci, unit->directory); 2024 while (fw_csr_iterator_next(&ci, &key, &val)) { 2025 if (key == (CSR_OFFSET | CSR_DEPENDENT_INFO)) { 2026 peer->mgmt_addr = CSR_REGISTER_BASE + 4 * val; 2027 break; 2028 } 2029 } 2030 if (peer->mgmt_addr == 0ULL) { 2031 /* 2032 * No mgmt address effectively disables VIRT_CABLE_PLUG - 2033 * this peer will not be able to attach to a remote 2034 */ 2035 peer_set_state(peer, FWPS_NO_MGMT_ADDR); 2036 } 2037 2038 spin_lock_init(&peer->lock); 2039 peer->port = NULL; 2040 2041 timer_setup(&peer->timer, fwserial_plug_timeout, 0); 2042 INIT_WORK(&peer->work, fwserial_peer_workfn); 2043 INIT_DELAYED_WORK(&peer->connect, fwserial_auto_connect); 2044 2045 /* associate peer with specific fw_card */ 2046 peer->serial = serial; 2047 list_add_rcu(&peer->list, &serial->peer_list); 2048 2049 fwtty_info(&peer->unit, "peer added (guid:%016llx)\n", 2050 (unsigned long long)peer->guid); 2051 2052 /* identify the local unit & virt cable to loopback port */ 2053 if (parent->is_local) { 2054 serial->self = peer; 2055 if (create_loop_dev) { 2056 struct fwtty_port *port; 2057 2058 port = fwserial_claim_port(peer, num_ttys); 2059 if (!IS_ERR(port)) { 2060 struct virt_plug_params params; 2061 2062 spin_lock_bh(&peer->lock); 2063 peer->port = port; 2064 fill_plug_params(&params, port); 2065 fwserial_virt_plug_complete(peer, &params); 2066 spin_unlock_bh(&peer->lock); 2067 2068 fwtty_write_port_status(port); 2069 } 2070 } 2071 2072 } else if (auto_connect) { 2073 /* auto-attach to remote units only (if policy allows) */ 2074 schedule_delayed_work(&peer->connect, 1); 2075 } 2076 2077 return 0; 2078} 2079 2080/** 2081 * fwserial_remove_peer - remove a 'serial' unit device as a 'peer' 2082 * 2083 * Remove a 'peer' from its list of peers. This function is only 2084 * called by fwserial_remove() on bus removal of the unit device. 2085 * 2086 * Note: this function is serialized with fwserial_add_peer() by the 2087 * fwserial_list_mutex held in fwserial_remove(). 2088 */ 2089static void fwserial_remove_peer(struct fwtty_peer *peer) 2090{ 2091 struct fwtty_port *port; 2092 2093 spin_lock_bh(&peer->lock); 2094 peer_set_state(peer, FWPS_GONE); 2095 spin_unlock_bh(&peer->lock); 2096 2097 cancel_delayed_work_sync(&peer->connect); 2098 cancel_work_sync(&peer->work); 2099 2100 spin_lock_bh(&peer->lock); 2101 /* if this unit is the local unit, clear link */ 2102 if (peer == peer->serial->self) 2103 peer->serial->self = NULL; 2104 2105 /* cancel the request timeout timer (if running) */ 2106 del_timer(&peer->timer); 2107 2108 port = peer->port; 2109 peer->port = NULL; 2110 2111 list_del_rcu(&peer->list); 2112 2113 fwtty_info(&peer->unit, "peer removed (guid:%016llx)\n", 2114 (unsigned long long)peer->guid); 2115 2116 spin_unlock_bh(&peer->lock); 2117 2118 if (port) 2119 fwserial_release_port(port, true); 2120 2121 synchronize_rcu(); 2122 kfree(peer); 2123} 2124 2125/** 2126 * fwserial_create - init everything to create TTYs for a specific fw_card 2127 * @unit: fw_unit for first 'serial' unit device probed for this fw_card 2128 * 2129 * This function inits the aggregate structure (an fw_serial instance) 2130 * used to manage the TTY ports registered by a specific fw_card. Also, the 2131 * unit device is added as the first 'peer'. 2132 * 2133 * This unit device may represent a local unit device (as specified by the 2134 * config ROM unit directory) or it may represent a remote unit device 2135 * (as specified by the reading of the remote node's config ROM). 2136 * 2137 * Returns 0 to indicate "ownership" of the unit device, or a negative errno 2138 * value to indicate which error. 2139 */ 2140static int fwserial_create(struct fw_unit *unit) 2141{ 2142 struct fw_device *parent = fw_parent_device(unit); 2143 struct fw_card *card = parent->card; 2144 struct fw_serial *serial; 2145 struct fwtty_port *port; 2146 struct device *tty_dev; 2147 int i, j; 2148 int err; 2149 2150 serial = kzalloc(sizeof(*serial), GFP_KERNEL); 2151 if (!serial) 2152 return -ENOMEM; 2153 2154 kref_init(&serial->kref); 2155 serial->card = card; 2156 INIT_LIST_HEAD(&serial->peer_list); 2157 2158 for (i = 0; i < num_ports; ++i) { 2159 port = kzalloc(sizeof(*port), GFP_KERNEL); 2160 if (!port) { 2161 err = -ENOMEM; 2162 goto free_ports; 2163 } 2164 tty_port_init(&port->port); 2165 port->index = FWTTY_INVALID_INDEX; 2166 port->port.ops = &fwtty_port_ops; 2167 port->serial = serial; 2168 tty_buffer_set_limit(&port->port, 128 * 1024); 2169 2170 spin_lock_init(&port->lock); 2171 INIT_DELAYED_WORK(&port->drain, fwtty_drain_tx); 2172 INIT_DELAYED_WORK(&port->emit_breaks, fwtty_emit_breaks); 2173 INIT_WORK(&port->hangup, fwtty_do_hangup); 2174 init_waitqueue_head(&port->wait_tx); 2175 port->max_payload = link_speed_to_max_payload(SCODE_100); 2176 dma_fifo_init(&port->tx_fifo); 2177 2178 RCU_INIT_POINTER(port->peer, NULL); 2179 serial->ports[i] = port; 2180 2181 /* get unique bus addr region for port's status & recv fifo */ 2182 port->rx_handler.length = FWTTY_PORT_RXFIFO_LEN + 4; 2183 port->rx_handler.address_callback = fwtty_port_handler; 2184 port->rx_handler.callback_data = port; 2185 /* 2186 * XXX: use custom memory region above cpu physical memory addrs 2187 * this will ease porting to 64-bit firewire adapters 2188 */ 2189 err = fw_core_add_address_handler(&port->rx_handler, 2190 &fw_high_memory_region); 2191 if (err) { 2192 kfree(port); 2193 goto free_ports; 2194 } 2195 } 2196 /* preserve i for error cleanup */ 2197 2198 err = fwtty_ports_add(serial); 2199 if (err) { 2200 fwtty_err(&unit, "no space in port table\n"); 2201 goto free_ports; 2202 } 2203 2204 for (j = 0; j < num_ttys; ++j) { 2205 tty_dev = tty_port_register_device(&serial->ports[j]->port, 2206 fwtty_driver, 2207 serial->ports[j]->index, 2208 card->device); 2209 if (IS_ERR(tty_dev)) { 2210 err = PTR_ERR(tty_dev); 2211 fwtty_err(&unit, "register tty device error (%d)\n", 2212 err); 2213 goto unregister_ttys; 2214 } 2215 2216 serial->ports[j]->device = tty_dev; 2217 } 2218 /* preserve j for error cleanup */ 2219 2220 if (create_loop_dev) { 2221 struct device *loop_dev; 2222 2223 loop_dev = tty_port_register_device(&serial->ports[j]->port, 2224 fwloop_driver, 2225 loop_idx(serial->ports[j]), 2226 card->device); 2227 if (IS_ERR(loop_dev)) { 2228 err = PTR_ERR(loop_dev); 2229 fwtty_err(&unit, "create loop device failed (%d)\n", 2230 err); 2231 goto unregister_ttys; 2232 } 2233 serial->ports[j]->device = loop_dev; 2234 serial->ports[j]->loopback = true; 2235 } 2236 2237 if (!IS_ERR_OR_NULL(fwserial_debugfs)) { 2238 serial->debugfs = debugfs_create_dir(dev_name(&unit->device), 2239 fwserial_debugfs); 2240 if (!IS_ERR_OR_NULL(serial->debugfs)) { 2241 debugfs_create_file("peers", 0444, serial->debugfs, 2242 serial, &fwtty_peers_fops); 2243 debugfs_create_file("stats", 0444, serial->debugfs, 2244 serial, &fwtty_stats_fops); 2245 } 2246 } 2247 2248 list_add_rcu(&serial->list, &fwserial_list); 2249 2250 fwtty_notice(&unit, "TTY over FireWire on device %s (guid %016llx)\n", 2251 dev_name(card->device), (unsigned long long)card->guid); 2252 2253 err = fwserial_add_peer(serial, unit); 2254 if (!err) 2255 return 0; 2256 2257 fwtty_err(&unit, "unable to add peer unit device (%d)\n", err); 2258 2259 /* fall-through to error processing */ 2260 debugfs_remove_recursive(serial->debugfs); 2261 2262 list_del_rcu(&serial->list); 2263 if (create_loop_dev) 2264 tty_unregister_device(fwloop_driver, 2265 loop_idx(serial->ports[j])); 2266unregister_ttys: 2267 for (--j; j >= 0; --j) 2268 tty_unregister_device(fwtty_driver, serial->ports[j]->index); 2269 kref_put(&serial->kref, fwserial_destroy); 2270 return err; 2271 2272free_ports: 2273 for (--i; i >= 0; --i) { 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: %04hx\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 * @parameters: fw_address_callback_t as specified by firewire core interface 2704 * 2705 * This handler is responsible for handling virtual cable requests from remotes 2706 * for all cards. 2707 */ 2708static void fwserial_mgmt_handler(struct fw_card *card, 2709 struct fw_request *request, 2710 int tcode, int destination, int source, 2711 int generation, 2712 unsigned long long addr, 2713 void *data, size_t len, 2714 void *callback_data) 2715{ 2716 struct fwserial_mgmt_pkt *pkt = data; 2717 struct fwtty_peer *peer; 2718 int rcode; 2719 2720 rcu_read_lock(); 2721 peer = __fwserial_peer_by_node_id(card, generation, source); 2722 if (!peer) { 2723 fwtty_dbg(card, "peer(%d:%x) not found\n", generation, source); 2724 __dump_peer_list(card); 2725 rcode = RCODE_CONFLICT_ERROR; 2726 2727 } else { 2728 switch (tcode) { 2729 case TCODE_WRITE_BLOCK_REQUEST: 2730 rcode = fwserial_parse_mgmt_write(peer, pkt, addr, len); 2731 break; 2732 2733 default: 2734 rcode = RCODE_TYPE_ERROR; 2735 } 2736 } 2737 2738 rcu_read_unlock(); 2739 fw_send_response(card, request, rcode); 2740} 2741 2742static int __init fwserial_init(void) 2743{ 2744 int err, num_loops = !!(create_loop_dev); 2745 2746 /* XXX: placeholder for a "firewire" debugfs node */ 2747 fwserial_debugfs = debugfs_create_dir(KBUILD_MODNAME, NULL); 2748 2749 /* num_ttys/num_ports must not be set above the static alloc avail */ 2750 if (num_ttys + num_loops > MAX_CARD_PORTS) 2751 num_ttys = MAX_CARD_PORTS - num_loops; 2752 2753 num_ports = num_ttys + num_loops; 2754 2755 fwtty_driver = tty_alloc_driver(MAX_TOTAL_PORTS, TTY_DRIVER_REAL_RAW 2756 | TTY_DRIVER_DYNAMIC_DEV); 2757 if (IS_ERR(fwtty_driver)) { 2758 err = PTR_ERR(fwtty_driver); 2759 goto remove_debugfs; 2760 } 2761 2762 fwtty_driver->driver_name = KBUILD_MODNAME; 2763 fwtty_driver->name = tty_dev_name; 2764 fwtty_driver->major = 0; 2765 fwtty_driver->minor_start = 0; 2766 fwtty_driver->type = TTY_DRIVER_TYPE_SERIAL; 2767 fwtty_driver->subtype = SERIAL_TYPE_NORMAL; 2768 fwtty_driver->init_termios = tty_std_termios; 2769 fwtty_driver->init_termios.c_cflag |= CLOCAL; 2770 tty_set_operations(fwtty_driver, &fwtty_ops); 2771 2772 err = tty_register_driver(fwtty_driver); 2773 if (err) { 2774 pr_err("register tty driver failed (%d)\n", err); 2775 goto put_tty; 2776 } 2777 2778 if (create_loop_dev) { 2779 fwloop_driver = tty_alloc_driver(MAX_TOTAL_PORTS / num_ports, 2780 TTY_DRIVER_REAL_RAW 2781 | TTY_DRIVER_DYNAMIC_DEV); 2782 if (IS_ERR(fwloop_driver)) { 2783 err = PTR_ERR(fwloop_driver); 2784 goto unregister_driver; 2785 } 2786 2787 fwloop_driver->driver_name = KBUILD_MODNAME "_loop"; 2788 fwloop_driver->name = loop_dev_name; 2789 fwloop_driver->major = 0; 2790 fwloop_driver->minor_start = 0; 2791 fwloop_driver->type = TTY_DRIVER_TYPE_SERIAL; 2792 fwloop_driver->subtype = SERIAL_TYPE_NORMAL; 2793 fwloop_driver->init_termios = tty_std_termios; 2794 fwloop_driver->init_termios.c_cflag |= CLOCAL; 2795 tty_set_operations(fwloop_driver, &fwloop_ops); 2796 2797 err = tty_register_driver(fwloop_driver); 2798 if (err) { 2799 pr_err("register loop driver failed (%d)\n", err); 2800 goto put_loop; 2801 } 2802 } 2803 2804 fwtty_txn_cache = kmem_cache_create("fwtty_txn_cache", 2805 sizeof(struct fwtty_transaction), 2806 0, 0, NULL); 2807 if (!fwtty_txn_cache) { 2808 err = -ENOMEM; 2809 goto unregister_loop; 2810 } 2811 2812 /* 2813 * Ideally, this address handler would be registered per local node 2814 * (rather than the same handler for all local nodes). However, 2815 * since the firewire core requires the config rom descriptor *before* 2816 * the local unit device(s) are created, a single management handler 2817 * must suffice for all local serial units. 2818 */ 2819 fwserial_mgmt_addr_handler.length = sizeof(struct fwserial_mgmt_pkt); 2820 fwserial_mgmt_addr_handler.address_callback = fwserial_mgmt_handler; 2821 2822 err = fw_core_add_address_handler(&fwserial_mgmt_addr_handler, 2823 &fwserial_mgmt_addr_region); 2824 if (err) { 2825 pr_err("add management handler failed (%d)\n", err); 2826 goto destroy_cache; 2827 } 2828 2829 fwserial_unit_directory_data.unit_addr_offset = 2830 FW_UNIT_ADDRESS(fwserial_mgmt_addr_handler.offset); 2831 err = fw_core_add_descriptor(&fwserial_unit_directory); 2832 if (err) { 2833 pr_err("add unit descriptor failed (%d)\n", err); 2834 goto remove_handler; 2835 } 2836 2837 err = driver_register(&fwserial_driver.driver); 2838 if (err) { 2839 pr_err("register fwserial driver failed (%d)\n", err); 2840 goto remove_descriptor; 2841 } 2842 2843 return 0; 2844 2845remove_descriptor: 2846 fw_core_remove_descriptor(&fwserial_unit_directory); 2847remove_handler: 2848 fw_core_remove_address_handler(&fwserial_mgmt_addr_handler); 2849destroy_cache: 2850 kmem_cache_destroy(fwtty_txn_cache); 2851unregister_loop: 2852 if (create_loop_dev) 2853 tty_unregister_driver(fwloop_driver); 2854put_loop: 2855 if (create_loop_dev) 2856 put_tty_driver(fwloop_driver); 2857unregister_driver: 2858 tty_unregister_driver(fwtty_driver); 2859put_tty: 2860 put_tty_driver(fwtty_driver); 2861remove_debugfs: 2862 debugfs_remove_recursive(fwserial_debugfs); 2863 2864 return err; 2865} 2866 2867static void __exit fwserial_exit(void) 2868{ 2869 driver_unregister(&fwserial_driver.driver); 2870 fw_core_remove_descriptor(&fwserial_unit_directory); 2871 fw_core_remove_address_handler(&fwserial_mgmt_addr_handler); 2872 kmem_cache_destroy(fwtty_txn_cache); 2873 if (create_loop_dev) { 2874 tty_unregister_driver(fwloop_driver); 2875 put_tty_driver(fwloop_driver); 2876 } 2877 tty_unregister_driver(fwtty_driver); 2878 put_tty_driver(fwtty_driver); 2879 debugfs_remove_recursive(fwserial_debugfs); 2880} 2881 2882module_init(fwserial_init); 2883module_exit(fwserial_exit); 2884 2885MODULE_AUTHOR("Peter Hurley (peter@hurleysoftware.com)"); 2886MODULE_DESCRIPTION("FireWire Serial TTY Driver"); 2887MODULE_LICENSE("GPL"); 2888MODULE_DEVICE_TABLE(ieee1394, fwserial_id_table); 2889MODULE_PARM_DESC(ttys, "Number of ttys to create for each local firewire node"); 2890MODULE_PARM_DESC(auto, "Auto-connect a tty to each firewire node discovered"); 2891MODULE_PARM_DESC(loop, "Create a loopback device, fwloop<n>, with ttys");