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