cyclades.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:187k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #undef BLOCKMOVE
  2. #define Z_WAKE
  3. #undef Z_EXT_CHARS_IN_BUFFER
  4. static char rcsid[] =
  5. "$Revision: 2.3.2.8 $$Date: 2000/07/06 18:14:16 $";
  6. /*
  7.  *  linux/drivers/char/cyclades.c
  8.  *
  9.  * This file contains the driver for the Cyclades async multiport
  10.  * serial boards.
  11.  *
  12.  * Initially written by Randolph Bentson <bentson@grieg.seaslug.org>.
  13.  * Modified and maintained by Marcio Saito <marcio@cyclades.com>.
  14.  * Currently maintained by Ivan Passos <ivan@cyclades.com>.
  15.  *
  16.  * For Technical support and installation problems, please send e-mail
  17.  * to support@cyclades.com.
  18.  *
  19.  * Much of the design and some of the code came from serial.c
  20.  * which was copyright (C) 1991, 1992  Linus Torvalds.  It was
  21.  * extensively rewritten by Theodore Ts'o, 8/16/92 -- 9/14/92,
  22.  * and then fixed as suggested by Michael K. Johnson 12/12/92.
  23.  *
  24.  * This version supports shared IRQ's (only for PCI boards).
  25.  *
  26.  * $Log: cyclades.c,v $
  27.  * Revision 2.3.2.8   2000/07/06 18:14:16 ivan
  28.  * Fixed the PCI detection function to work properly on Alpha systems.
  29.  * Implemented support for TIOCSERGETLSR ioctl.
  30.  * Implemented full support for non-standard baud rates.
  31.  *
  32.  * Revision 2.3.2.7   2000/06/01 18:26:34 ivan
  33.  * Request PLX I/O region, although driver doesn't use it, to avoid
  34.  * problems with other drivers accessing it.
  35.  * Removed count for on-board buffer characters in cy_chars_in_buffer
  36.  * (Cyclades-Z only).
  37.  *
  38.  * Revision 2.3.2.6   2000/05/05 13:56:05 ivan
  39.  * Driver now reports physical instead of virtual memory addresses.
  40.  * Masks were added to some Cyclades-Z read accesses.
  41.  * Implemented workaround for PLX9050 bug that would cause a system lockup
  42.  * in certain systems, depending on the MMIO addresses allocated to the
  43.  * board.
  44.  * Changed the Tx interrupt programming in the CD1400 chips to boost up
  45.  * performance (Cyclom-Y only).
  46.  * Code is now compliant with the new module interface (module_[init|exit]).
  47.  * Make use of the PCI helper functions to access PCI resources.
  48.  * Did some code "housekeeping".
  49.  *
  50.  * Revision 2.3.2.5   2000/01/19 14:35:33 ivan
  51.  * Fixed bug in cy_set_termios on CRTSCTS flag turnoff.
  52.  *
  53.  * Revision 2.3.2.4   2000/01/17 09:19:40 ivan
  54.  * Fixed SMP locking in Cyclom-Y interrupt handler.
  55.  *
  56.  * Revision 2.3.2.3   1999/12/28 12:11:39 ivan
  57.  * Added a new cyclades_card field called nports to allow the driver to
  58.  * know the exact number of ports found by the Z firmware after its load;
  59.  * RX buffer contention prevention logic on interrupt op mode revisited
  60.  * (Cyclades-Z only);
  61.  * Revisited printk's for Z debug;
  62.  * Driver now makes sure that the constant SERIAL_XMIT_SIZE is defined;
  63.  *
  64.  * Revision 2.3.2.2   1999/10/01 11:27:43 ivan
  65.  * Fixed bug in cyz_poll that would make all ports but port 0 
  66.  * unable to transmit/receive data (Cyclades-Z only);
  67.  * Implemented logic to prevent the RX buffer from being stuck with data
  68.  * due to a driver / firmware race condition in interrupt op mode
  69.  * (Cyclades-Z only);
  70.  * Fixed bug in block_til_ready logic that would lead to a system crash;
  71.  * Revisited cy_close spinlock usage;
  72.  *
  73.  * Revision 2.3.2.1   1999/09/28 11:01:22 ivan
  74.  * Revisited CONFIG_PCI conditional compilation for PCI board support;
  75.  * Implemented TIOCGICOUNT and TIOCMIWAIT ioctl support;
  76.  * _Major_ cleanup on the Cyclades-Z interrupt support code / logic;
  77.  * Removed CTS handling from the driver -- this is now completely handled
  78.  * by the firmware (Cyclades-Z only);
  79.  * Flush RX on-board buffers on a port open (Cyclades-Z only);
  80.  * Fixed handling of ASYNC_SPD_* TTY flags;
  81.  * Module unload now unmaps all memory area allocated by ioremap;
  82.  *
  83.  * Revision 2.3.1.1   1999/07/15 16:45:53 ivan
  84.  * Removed CY_PROC conditional compilation;
  85.  * Implemented SMP-awareness for the driver;
  86.  * Implemented a new ISA IRQ autoprobe that uses the irq_probe_[on|off] 
  87.  * functions;
  88.  * The driver now accepts memory addresses (maddr=0xMMMMM) and IRQs
  89.  * (irq=NN) as parameters (only for ISA boards);
  90.  * Fixed bug in set_line_char that would prevent the Cyclades-Z 
  91.  * ports from being configured at speeds above 115.2Kbps;
  92.  * Fixed bug in cy_set_termios that would prevent XON/XOFF flow control
  93.  * switching from working properly;
  94.  * The driver now only prints IRQ info for the Cyclades-Z if it's 
  95.  * configured to work in interrupt mode;
  96.  *
  97.  * Revision 2.2.2.3   1999/06/28 11:13:29 ivan
  98.  * Added support for interrupt mode operation for the Z cards;
  99.  * Removed the driver inactivity control for the Z;
  100.  * Added a missing MOD_DEC_USE_COUNT in the cy_open function for when 
  101.  * the Z firmware is not loaded yet;
  102.  * Replaced the "manual" Z Tx flush buffer by a call to a FW command of 
  103.  * same functionality;
  104.  * Implemented workaround for IRQ setting loss on the PCI configuration 
  105.  * registers after a PCI bridge EEPROM reload (affects PLX9060 only);
  106.  *
  107.  * Revision 2.2.2.2  1999/05/14 17:18:15 ivan
  108.  * /proc entry location changed to /proc/tty/driver/cyclades;
  109.  * Added support to shared IRQ's (only for PCI boards);
  110.  * Added support for Cobalt Qube2 systems;
  111.  * IRQ [de]allocation scheme revisited;
  112.  * BREAK implementation changed in order to make use of the 'break_ctl'
  113.  * TTY facility;
  114.  * Fixed typo in TTY structure field 'driver_name';
  115.  * Included a PCI bridge reset and EEPROM reload in the board 
  116.  * initialization code (for both Y and Z series).
  117.  *
  118.  * Revision 2.2.2.1  1999/04/08 16:17:43 ivan
  119.  * Fixed a bug in cy_wait_until_sent that was preventing the port to be 
  120.  * closed properly after a SIGINT;
  121.  * Module usage counter scheme revisited;
  122.  * Added support to the upcoming Y PCI boards (i.e., support to additional
  123.  * PCI Device ID's).
  124.  * 
  125.  * Revision 2.2.1.10 1999/01/20 16:14:29 ivan
  126.  * Removed all unnecessary page-alignement operations in ioremap calls
  127.  * (ioremap is currently safe for these operations).
  128.  *
  129.  * Revision 2.2.1.9  1998/12/30 18:18:30 ivan
  130.  * Changed access to PLX PCI bridge registers from I/O to MMIO, in 
  131.  * order to make PLX9050-based boards work with certain motherboards.
  132.  *
  133.  * Revision 2.2.1.8  1998/11/13 12:46:20 ivan
  134.  * cy_close function now resets (correctly) the tty->closing flag;
  135.  * JIFFIES_DIFF macro fixed.
  136.  *
  137.  * Revision 2.2.1.7  1998/09/03 12:07:28 ivan
  138.  * Fixed bug in cy_close function, which was not informing HW of
  139.  * which port should have the reception disabled before doing so;
  140.  * fixed Cyclom-8YoP hardware detection bug.
  141.  *
  142.  * Revision 2.2.1.6  1998/08/20 17:15:39 ivan
  143.  * Fixed bug in cy_close function, which causes malfunction
  144.  * of one of the first 4 ports when a higher port is closed
  145.  * (Cyclom-Y only).
  146.  *
  147.  * Revision 2.2.1.5  1998/08/10 18:10:28 ivan
  148.  * Fixed Cyclom-4Yo hardware detection bug.
  149.  *
  150.  * Revision 2.2.1.4  1998/08/04 11:02:50 ivan
  151.  * /proc/cyclades implementation with great collaboration of 
  152.  * Marc Lewis <marc@blarg.net>;
  153.  * cyy_interrupt was changed to avoid occurence of kernel oopses
  154.  * during PPP operation.
  155.  *
  156.  * Revision 2.2.1.3  1998/06/01 12:09:10 ivan
  157.  * General code review in order to comply with 2.1 kernel standards;
  158.  * data loss prevention for slow devices revisited (cy_wait_until_sent
  159.  * was created);
  160.  * removed conditional compilation for new/old PCI structure support 
  161.  * (now the driver only supports the new PCI structure).
  162.  *
  163.  * Revision 2.2.1.1  1998/03/19 16:43:12 ivan
  164.  * added conditional compilation for new/old PCI structure support;
  165.  * removed kernel series (2.0.x / 2.1.x) conditional compilation.
  166.  *
  167.  * Revision 2.1.1.3  1998/03/16 18:01:12 ivan
  168.  * cleaned up the data loss fix;
  169.  * fixed XON/XOFF handling once more (Cyclades-Z);
  170.  * general review of the driver routines;
  171.  * introduction of a mechanism to prevent data loss with slow 
  172.  * printers, by forcing a delay before closing the port.
  173.  *
  174.  * Revision 2.1.1.2  1998/02/17 16:50:00 ivan
  175.  * fixed detection/handling of new CD1400 in Ye boards;
  176.  * fixed XON/XOFF handling (Cyclades-Z);
  177.  * fixed data loss caused by a premature port close;
  178.  * introduction of a flag that holds the CD1400 version ID per port
  179.  * (used by the CYGETCD1400VER new ioctl).
  180.  *
  181.  * Revision 2.1.1.1  1997/12/03 17:31:19 ivan
  182.  * Code review for the module cleanup routine;
  183.  * fixed RTS and DTR status report for new CD1400's in get_modem_info;
  184.  * includes anonymous changes regarding signal_pending.
  185.  * 
  186.  * Revision 2.1  1997/11/01 17:42:41 ivan
  187.  * Changes in the driver to support Alpha systems (except 8Zo V_1);
  188.  * BREAK fix for the Cyclades-Z boards;
  189.  * driver inactivity control by FW implemented;
  190.  * introduction of flag that allows driver to take advantage of 
  191.  * a special CD1400 feature related to HW flow control;
  192.  * added support for the CD1400  rev. J (Cyclom-Y boards);
  193.  * introduction of ioctls to:
  194.  *  - control the rtsdtr_inv flag (Cyclom-Y);
  195.  *  - control the rflow flag (Cyclom-Y);
  196.  *  - adjust the polling interval (Cyclades-Z);
  197.  *
  198.  * Revision 1.36.4.33  1997/06/27 19:00:00  ivan
  199.  * Fixes related to kernel version conditional 
  200.  * compilation.
  201.  *  
  202.  * Revision 1.36.4.32  1997/06/14 19:30:00  ivan
  203.  * Compatibility issues between kernels 2.0.x and 
  204.  * 2.1.x (mainly related to clear_bit function).
  205.  *  
  206.  * Revision 1.36.4.31  1997/06/03 15:30:00  ivan
  207.  * Changes to define the memory window according to the 
  208.  * board type.
  209.  *  
  210.  * Revision 1.36.4.30  1997/05/16 15:30:00  daniel
  211.  * Changes to support new cycladesZ boards.
  212.  *
  213.  * Revision 1.36.4.29  1997/05/12 11:30:00  daniel
  214.  * Merge of Bentson's and Daniel's version 1.36.4.28.
  215.  * Corrects bug in cy_detect_pci: check if there are more
  216.  * ports than the number of static structs allocated.
  217.  * Warning message during initialization if this driver is
  218.  * used with the new generation of cycladesZ boards.  Those
  219.  * will be supported only in next release of the driver.
  220.  * Corrects bug in cy_detect_pci and cy_detect_isa that
  221.  * returned wrong number of VALID boards, when a cyclomY
  222.  * was found with no serial modules connected.
  223.  * Changes to use current (2.1.x) kernel subroutine names
  224.  * and created macros for compilation with 2.0.x kernel,
  225.  * instead of the other way around.
  226.  *
  227.  * Revision 1.36.4.28  1997/05/?? ??:00:00  bentson
  228.  * Change queue_task_irq_off to queue_task_irq.
  229.  * The inline function queue_task_irq_off (tqueue.h)
  230.  * was removed from latest releases of 2.1.x kernel.
  231.  * Use of macro __init to mark the initialization
  232.  * routines, so memory can be reused.
  233.  * Also incorporate implementation of critical region
  234.  * in function cleanup_module() created by anonymous
  235.  * linuxer.
  236.  *
  237.  * Revision 1.36.4.28  1997/04/25 16:00:00  daniel
  238.  * Change to support new firmware that solves DCD problem:
  239.  * application could fail to receive SIGHUP signal when DCD
  240.  * varying too fast.
  241.  *
  242.  * Revision 1.36.4.27  1997/03/26 10:30:00  daniel
  243.  * Changed for support linux versions 2.1.X.
  244.  * Backward compatible with linux versions 2.0.X.
  245.  * Corrected illegal use of filler field in
  246.  * CH_CTRL struct.
  247.  * Deleted some debug messages.
  248.  *
  249.  * Revision 1.36.4.26  1997/02/27 12:00:00  daniel
  250.  * Included check for NULL tty pointer in cyz_poll.
  251.  *
  252.  * Revision 1.36.4.25  1997/02/26 16:28:30  bentson
  253.  * Bill Foster at Blarg! Online services noticed that
  254.  * some of the switch elements of -Z modem control
  255.  * lacked a closing "break;"
  256.  *
  257.  * Revision 1.36.4.24  1997/02/24 11:00:00  daniel
  258.  * Changed low water threshold for buffer xmit_buf
  259.  *
  260.  * Revision 1.36.4.23  1996/12/02 21:50:16  bentson
  261.  * Marcio provided fix to modem status fetch for -Z
  262.  *
  263.  * Revision 1.36.4.22  1996/10/28 22:41:17  bentson
  264.  * improve mapping of -Z control page (thanks to Steve
  265.  * Price <stevep@fa.tdktca.com> for help on this)
  266.  *
  267.  * Revision 1.36.4.21  1996/09/10 17:00:10  bentson
  268.  * shift from CPU-bound to memcopy in cyz_polling operation
  269.  *
  270.  * Revision 1.36.4.20  1996/09/09 18:30:32  Bentson
  271.  * Added support to set and report higher speeds.
  272.  *
  273.  * Revision 1.36.4.19c  1996/08/09 10:00:00  Marcio Saito
  274.  * Some fixes in the HW flow control for the BETA release.
  275.  * Don't try to register the IRQ.
  276.  *
  277.  * Revision 1.36.4.19  1996/08/08 16:23:18  Bentson
  278.  * make sure "cyc" appears in all kernel messages; all soft interrupts
  279.  * handled by same routine; recognize out-of-band reception; comment
  280.  * out some diagnostic messages; leave RTS/CTS flow control to hardware;
  281.  * fix race condition in -Z buffer management; only -Y needs to explictly
  282.  * flush chars; tidy up some startup messages;
  283.  *
  284.  * Revision 1.36.4.18  1996/07/25 18:57:31  bentson
  285.  * shift MOD_INC_USE_COUNT location to match
  286.  * serial.c; purge some diagnostic messages;
  287.  *
  288.  * Revision 1.36.4.17  1996/07/25 18:01:08  bentson
  289.  * enable modem status messages and fetch & process them; note
  290.  * time of last activity type for each port; set_line_char now
  291.  * supports more than line 0 and treats 0 baud correctly;
  292.  * get_modem_info senses rs_status;
  293.  *
  294.  * Revision 1.36.4.16  1996/07/20 08:43:15  bentson
  295.  * barely works--now's time to turn on
  296.  * more features 'til it breaks
  297.  *
  298.  * Revision 1.36.4.15  1996/07/19 22:30:06  bentson
  299.  * check more -Z board status; shorten boot message
  300.  *
  301.  * Revision 1.36.4.14  1996/07/19 22:20:37  bentson
  302.  * fix reference to ch_ctrl in startup; verify return
  303.  * values from cyz_issue_cmd and cyz_update_channel;
  304.  * more stuff to get modem control correct;
  305.  *
  306.  * Revision 1.36.4.13  1996/07/11 19:53:33  bentson
  307.  * more -Z stuff folded in; re-order changes to put -Z stuff
  308.  * after -Y stuff (to make changes clearer)
  309.  *
  310.  * Revision 1.36.4.12  1996/07/11 15:40:55  bentson
  311.  * Add code to poll Cyclades-Z.  Add code to get & set RS-232 control.
  312.  * Add code to send break.  Clear firmware ID word at startup (so
  313.  * that other code won't talk to inactive board).
  314.  *
  315.  * Revision 1.36.4.11  1996/07/09 05:28:29  bentson
  316.  * add code for -Z in set_line_char
  317.  *
  318.  * Revision 1.36.4.10  1996/07/08 19:28:37  bentson
  319.  * fold more -Z stuff (or in some cases, error messages)
  320.  * into driver; add text to "don't know what to do" messages.
  321.  *
  322.  * Revision 1.36.4.9  1996/07/08 18:38:38  bentson
  323.  * moved compile-time flags near top of file; cosmetic changes
  324.  * to narrow text (to allow 2-up printing); changed many declarations
  325.  * to "static" to limit external symbols; shuffled code order to
  326.  * coalesce -Y and -Z specific code, also to put internal functions
  327.  * in order of tty_driver structure; added code to recognize -Z
  328.  * ports (and for moment, do nothing or report error); add cy_startup
  329.  * to parse boot command line for extra base addresses for ISA probes;
  330.  *
  331.  * Revision 1.36.4.8  1996/06/25 17:40:19  bentson
  332.  * reorder some code, fix types of some vars (int vs. long),
  333.  * add cy_setup to support user declared ISA addresses
  334.  *
  335.  * Revision 1.36.4.7  1996/06/21 23:06:18  bentson
  336.  * dump ioctl based firmware load (it's now a user level
  337.  * program); ensure uninitialzed ports cannot be used
  338.  *
  339.  * Revision 1.36.4.6  1996/06/20 23:17:19  bentson
  340.  * rename vars and restructure some code
  341.  *
  342.  * Revision 1.36.4.5  1996/06/14 15:09:44  bentson
  343.  * get right status back after boot load
  344.  *
  345.  * Revision 1.36.4.4  1996/06/13 19:51:44  bentson
  346.  * successfully loads firmware
  347.  *
  348.  * Revision 1.36.4.3  1996/06/13 06:08:33  bentson
  349.  * add more of the code for the boot/load ioctls
  350.  *
  351.  * Revision 1.36.4.2  1996/06/11 21:00:51  bentson
  352.  * start to add Z functionality--starting with ioctl
  353.  * for loading firmware
  354.  *
  355.  * Revision 1.36.4.1  1996/06/10 18:03:02  bentson
  356.  * added code to recognize Z/PCI card at initialization; report
  357.  * presence, but card is not initialized (because firmware needs
  358.  * to be loaded)
  359.  *
  360.  * Revision 1.36.3.8  1996/06/07 16:29:00  bentson
  361.  * starting minor number at zero; added missing verify_area
  362.  * as noted by Heiko Eissfeldt <heiko@colossus.escape.de>
  363.  *
  364.  * Revision 1.36.3.7  1996/04/19 21:06:18  bentson
  365.  * remove unneeded boot message & fix CLOCAL hardware flow
  366.  * control (Miquel van Smoorenburg <miquels@Q.cistron.nl>);
  367.  * remove unused diagnostic statements; minor 0 is first;
  368.  *
  369.  * Revision 1.36.3.6  1996/03/13 13:21:17  marcio
  370.  * The kernel function vremap (available only in later 1.3.xx kernels)
  371.  * allows the access to memory addresses above the RAM. This revision
  372.  * of the driver supports PCI boards below 1Mb (device id 0x100) and
  373.  * above 1Mb (device id 0x101).
  374.  *
  375.  * Revision 1.36.3.5  1996/03/07 15:20:17  bentson
  376.  * Some global changes to interrupt handling spilled into
  377.  * this driver--mostly unused arguments in system function
  378.  * calls.  Also added change by Marcio Saito which should
  379.  * reduce lost interrupts at startup by fast processors.
  380.  *
  381.  * Revision 1.36.3.4  1995/11/13  20:45:10  bentson
  382.  * Changes by Corey Minyard <minyard@wf-rch.cirr.com> distributed
  383.  * in 1.3.41 kernel to remove a possible race condition, extend
  384.  * some error messages, and let the driver run as a loadable module
  385.  * Change by Alan Wendt <alan@ez0.ezlink.com> to remove a
  386.  * possible race condition.
  387.  * Change by Marcio Saito <marcio@cyclades.com> to fix PCI addressing.
  388.  *
  389.  * Revision 1.36.3.3  1995/11/13  19:44:48  bentson
  390.  * Changes by Linus Torvalds in 1.3.33 kernel distribution
  391.  * required due to reordering of driver initialization.
  392.  * Drivers are now initialized *after* memory management.
  393.  *
  394.  * Revision 1.36.3.2  1995/09/08  22:07:14  bentson
  395.  * remove printk from ISR; fix typo
  396.  *
  397.  * Revision 1.36.3.1  1995/09/01  12:00:42  marcio
  398.  * Minor fixes in the PCI board support. PCI function calls in
  399.  * conditional compilation (CONFIG_PCI). Thanks to Jim Duncan
  400.  * <duncan@okay.com>. "bad serial count" message removed.
  401.  *
  402.  * Revision 1.36.3  1995/08/22  09:19:42  marcio
  403.  * Cyclom-Y/PCI support added. Changes in the cy_init routine and
  404.  * board initialization. Changes in the boot messages. The driver
  405.  * supports up to 4 boards and 64 ports by default.
  406.  *
  407.  * Revision 1.36.1.4  1995/03/29  06:14:14  bentson
  408.  * disambiguate between Cyclom-16Y and Cyclom-32Ye;
  409.  *
  410.  * Revision 1.36.1.3  1995/03/23  22:15:35  bentson
  411.  * add missing break in modem control block in ioctl switch statement
  412.  * (discovered by Michael Edward Chastain <mec@jobe.shell.portal.com>);
  413.  *
  414.  * Revision 1.36.1.2  1995/03/22  19:16:22  bentson
  415.  * make sure CTS flow control is set as soon as possible (thanks
  416.  * to note from David Lambert <lambert@chesapeake.rps.slb.com>);
  417.  *
  418.  * Revision 1.36.1.1  1995/03/13  15:44:43  bentson
  419.  * initialize defaults for receive threshold and stale data timeout;
  420.  * cosmetic changes;
  421.  *
  422.  * Revision 1.36  1995/03/10  23:33:53  bentson
  423.  * added support of chips 4-7 in 32 port Cyclom-Ye;
  424.  * fix cy_interrupt pointer dereference problem
  425.  * (Joe Portman <baron@aa.net>);
  426.  * give better error response if open is attempted on non-existent port
  427.  * (Zachariah Vaum <jchryslr@netcom.com>);
  428.  * correct command timeout (Kenneth Lerman <lerman@@seltd.newnet.com>);
  429.  * conditional compilation for -16Y on systems with fast, noisy bus;
  430.  * comment out diagnostic print function;
  431.  * cleaned up table of base addresses;
  432.  * set receiver time-out period register to correct value,
  433.  * set receive threshold to better default values,
  434.  * set chip timer to more accurate 200 Hz ticking,
  435.  * add code to monitor and modify receive parameters
  436.  * (Rik Faith <faith@cs.unc.edu> Nick Simicich
  437.  * <njs@scifi.emi.net>);
  438.  *
  439.  * Revision 1.35  1994/12/16  13:54:18  steffen
  440.  * additional patch by Marcio Saito for board detection
  441.  * Accidently left out in 1.34
  442.  *
  443.  * Revision 1.34  1994/12/10  12:37:12  steffen
  444.  * This is the corrected version as suggested by Marcio Saito
  445.  *
  446.  * Revision 1.33  1994/12/01  22:41:18  bentson
  447.  * add hooks to support more high speeds directly; add tytso
  448.  * patch regarding CLOCAL wakeups
  449.  *
  450.  * Revision 1.32  1994/11/23  19:50:04  bentson
  451.  * allow direct kernel control of higher signalling rates;
  452.  * look for cards at additional locations
  453.  *
  454.  * Revision 1.31  1994/11/16  04:33:28  bentson
  455.  * ANOTHER fix from Corey Minyard, minyard@wf-rch.cirr.com--
  456.  * a problem in chars_in_buffer has been resolved by some
  457.  * small changes;  this should yield smoother output
  458.  *
  459.  * Revision 1.30  1994/11/16  04:28:05  bentson
  460.  * Fix from Corey Minyard, Internet: minyard@metronet.com,
  461.  * UUCP: minyard@wf-rch.cirr.com, WORK: minyardbnr.ca, to
  462.  * cy_hangup that appears to clear up much (all?) of the
  463.  * DTR glitches; also he's added/cleaned-up diagnostic messages
  464.  *
  465.  * Revision 1.29  1994/11/16  04:16:07  bentson
  466.  * add change proposed by Ralph Sims, ralphs@halcyon.com, to
  467.  * operate higher speeds in same way as other serial ports;
  468.  * add more serial ports (for up to two 16-port muxes).
  469.  *
  470.  * Revision 1.28  1994/11/04  00:13:16  root
  471.  * turn off diagnostic messages
  472.  *
  473.  * Revision 1.27  1994/11/03  23:46:37  root
  474.  * bunch of changes to bring driver into greater conformance
  475.  * with the serial.c driver (looking for missed fixes)
  476.  *
  477.  * Revision 1.26  1994/11/03  22:40:36  root
  478.  * automatic interrupt probing fixed.
  479.  *
  480.  * Revision 1.25  1994/11/03  20:17:02  root
  481.  * start to implement auto-irq
  482.  *
  483.  * Revision 1.24  1994/11/03  18:01:55  root
  484.  * still working on modem signals--trying not to drop DTR
  485.  * during the getty/login processes
  486.  *
  487.  * Revision 1.23  1994/11/03  17:51:36  root
  488.  * extend baud rate support; set receive threshold as function
  489.  * of baud rate; fix some problems with RTS/CTS;
  490.  *
  491.  * Revision 1.22  1994/11/02  18:05:35  root
  492.  * changed arguments to udelay to type long to get
  493.  * delays to be of correct duration
  494.  *
  495.  * Revision 1.21  1994/11/02  17:37:30  root
  496.  * employ udelay (after calibrating loops_per_second earlier
  497.  * in init/main.c) instead of using home-grown delay routines
  498.  *
  499.  * Revision 1.20  1994/11/02  03:11:38  root
  500.  * cy_chars_in_buffer forces a return value of 0 to let
  501.  * login work (don't know why it does); some functions
  502.  * that were returning EFAULT, now executes the code;
  503.  * more work on deciding when to disable xmit interrupts;
  504.  *
  505.  * Revision 1.19  1994/11/01  20:10:14  root
  506.  * define routine to start transmission interrupts (by enabling
  507.  * transmit interrupts); directly enable/disable modem interrupts;
  508.  *
  509.  * Revision 1.18  1994/11/01  18:40:45  bentson
  510.  * Don't always enable transmit interrupts in startup; interrupt on
  511.  * TxMpty instead of TxRdy to help characters get out before shutdown;
  512.  * restructure xmit interrupt to check for chars first and quit if
  513.  * none are ready to go; modem status (MXVRx) is upright, _not_ inverted
  514.  * (to my view);
  515.  *
  516.  * Revision 1.17  1994/10/30  04:39:45  bentson
  517.  * rename serial_driver and callout_driver to cy_serial_driver and
  518.  * cy_callout_driver to avoid linkage interference; initialize
  519.  * info->type to PORT_CIRRUS; ruggedize paranoia test; elide ->port
  520.  * from cyclades_port structure; add paranoia check to cy_close;
  521.  *
  522.  * Revision 1.16  1994/10/30  01:14:33  bentson
  523.  * change major numbers; add some _early_ return statements;
  524.  *
  525.  * Revision 1.15  1994/10/29  06:43:15  bentson
  526.  * final tidying up for clean compile;  enable some error reporting
  527.  *
  528.  * Revision 1.14  1994/10/28  20:30:22  Bentson
  529.  * lots of changes to drag the driver towards the new tty_io
  530.  * structures and operation.  not expected to work, but may
  531.  * compile cleanly.
  532.  *
  533.  * Revision 1.13  1994/07/21  23:08:57  Bentson
  534.  * add some diagnostic cruft; support 24 lines (for testing
  535.  * both -8Y and -16Y cards; be more thorough in servicing all
  536.  * chips during interrupt; add "volatile" a few places to
  537.  * circumvent compiler optimizations; fix base & offset
  538.  * computations in block_til_ready (was causing chip 0 to
  539.  * stop operation)
  540.  *
  541.  * Revision 1.12  1994/07/19  16:42:11  Bentson
  542.  * add some hackery for kernel version 1.1.8; expand
  543.  * error messages; refine timing for delay loops and
  544.  * declare loop params volatile
  545.  *
  546.  * Revision 1.11  1994/06/11  21:53:10  bentson
  547.  * get use of save_car right in transmit interrupt service
  548.  *
  549.  * Revision 1.10.1.1  1994/06/11  21:31:18  bentson
  550.  * add some diagnostic printing; try to fix save_car stuff
  551.  *
  552.  * Revision 1.10  1994/06/11  20:36:08  bentson
  553.  * clean up compiler warnings
  554.  *
  555.  * Revision 1.9  1994/06/11  19:42:46  bentson
  556.  * added a bunch of code to support modem signalling
  557.  *
  558.  * Revision 1.8  1994/06/11  17:57:07  bentson
  559.  * recognize break & parity error
  560.  *
  561.  * Revision 1.7  1994/06/05  05:51:34  bentson
  562.  * Reorder baud table to be monotonic; add cli to CP; discard
  563.  * incoming characters and status if the line isn't open; start to
  564.  * fold code into cy_throttle; start to port get_serial_info,
  565.  * set_serial_info, get_modem_info, set_modem_info, and send_break
  566.  * from serial.c; expand cy_ioctl; relocate and expand config_setup;
  567.  * get flow control characters from tty struct; invalidate ports w/o
  568.  * hardware;
  569.  *
  570.  * Revision 1.6  1994/05/31  18:42:21  bentson
  571.  * add a loop-breaker in the interrupt service routine;
  572.  * note when port is initialized so that it can be shut
  573.  * down under the right conditions; receive works without
  574.  * any obvious errors
  575.  *
  576.  * Revision 1.5  1994/05/30  00:55:02  bentson
  577.  * transmit works without obvious errors
  578.  *
  579.  * Revision 1.4  1994/05/27  18:46:27  bentson
  580.  * incorporated more code from lib_y.c; can now print short
  581.  * strings under interrupt control to port zero; seems to
  582.  * select ports/channels/lines correctly
  583.  *
  584.  * Revision 1.3  1994/05/25  22:12:44  bentson
  585.  * shifting from multi-port on a card to proper multiplexor
  586.  * data structures;  added skeletons of most routines
  587.  *
  588.  * Revision 1.2  1994/05/19  13:21:43  bentson
  589.  * start to crib from other sources
  590.  *
  591.  */
  592. /* If you need to install more boards than NR_CARDS, change the constant
  593.    in the definition below. No other change is necessary to support up to
  594.    eight boards. Beyond that you'll have to extend cy_isa_addresses. */
  595. #define NR_CARDS        4
  596. /*
  597.    If the total number of ports is larger than NR_PORTS, change this
  598.    constant in the definition below. No other change is necessary to
  599.    support more boards/ports. */
  600. #define NR_PORTS        256
  601. #define ZE_V1_NPORTS 64
  602. #define ZO_V1 0
  603. #define ZO_V2 1
  604. #define ZE_V1 2
  605. #define SERIAL_PARANOIA_CHECK
  606. #undef CY_DEBUG_OPEN
  607. #undef CY_DEBUG_THROTTLE
  608. #undef CY_DEBUG_OTHER
  609. #undef CY_DEBUG_IO
  610. #undef CY_DEBUG_COUNT
  611. #undef CY_DEBUG_DTR
  612. #undef CY_DEBUG_WAIT_UNTIL_SENT
  613. #undef CY_DEBUG_INTERRUPTS
  614. #undef CY_16Y_HACK
  615. #undef CY_ENABLE_MONITORING
  616. #undef CY_PCI_DEBUG
  617. #if 0
  618. #define PAUSE __asm__("nop");
  619. #else
  620. #define PAUSE ;
  621. #endif
  622. /*
  623.  * Include section 
  624.  */
  625. #include <linux/config.h>
  626. #include <linux/module.h>
  627. #include <linux/errno.h>
  628. #include <linux/signal.h>
  629. #include <linux/sched.h>
  630. #include <linux/timer.h>
  631. #include <linux/interrupt.h>
  632. #include <linux/tty.h>
  633. #include <linux/serial.h>
  634. #include <linux/major.h>
  635. #include <linux/string.h>
  636. #include <linux/fcntl.h>
  637. #include <linux/ptrace.h>
  638. #include <linux/cyclades.h>
  639. #include <linux/mm.h>
  640. #include <linux/ioport.h>
  641. #include <linux/init.h>
  642. #include <linux/delay.h>
  643. #include <linux/spinlock.h>
  644. #include <asm/system.h>
  645. #include <asm/io.h>
  646. #include <asm/irq.h>
  647. #include <asm/uaccess.h>
  648. #include <asm/bitops.h>
  649. #define CY_LOCK(info,flags)
  650. do {
  651. spin_lock_irqsave(&cy_card[info->card].card_lock, flags); 
  652. } while (0)
  653. #define CY_UNLOCK(info,flags)
  654. do {
  655. spin_unlock_irqrestore(&cy_card[info->card].card_lock, flags); 
  656. } while (0)
  657. #include <linux/types.h>
  658. #include <linux/kernel.h>
  659. #include <linux/pci.h>
  660. #include <linux/version.h>
  661. #include <linux/stat.h>
  662. #include <linux/proc_fs.h>
  663. #define cy_put_user put_user
  664. static unsigned long 
  665. cy_get_user(unsigned long *addr)
  666. {
  667. unsigned long result = 0;
  668. int error = get_user (result, addr);
  669. if (error)
  670. printk ("cyclades: cy_get_user: error == %dn", error);
  671. return result;
  672. }
  673. #ifndef MIN
  674. #define MIN(a,b)        ((a) < (b) ? (a) : (b))
  675. #endif
  676. #define IS_CYC_Z(card) ((card).num_chips == -1)
  677. #define Z_FPGA_CHECK(card) 
  678.     ((cy_readl(&((struct RUNTIME_9060 *) 
  679.  ((card).ctl_addr))->init_ctrl) & (1<<17)) != 0)
  680. #define ISZLOADED(card) (((ZO_V1==cy_readl(&((struct RUNTIME_9060 *) 
  681. ((card).ctl_addr))->mail_box_0)) || 
  682. Z_FPGA_CHECK(card)) && 
  683. (ZFIRM_ID==cy_readl(&((struct FIRM_ID *) 
  684. ((card).base_addr+ID_ADDRESS))->signature)))
  685. #ifndef SERIAL_XMIT_SIZE
  686. #define SERIAL_XMIT_SIZE (MIN(PAGE_SIZE, 4096))
  687. #endif
  688. #define WAKEUP_CHARS 256
  689. #define STD_COM_FLAGS (0)
  690. #define JIFFIES_DIFF(n, j) ((j) - (n))
  691. static DECLARE_TASK_QUEUE(tq_cyclades);
  692. static struct tty_driver cy_serial_driver, cy_callout_driver;
  693. static int serial_refcount;
  694. #ifdef CONFIG_ISA
  695. /* This is the address lookup table. The driver will probe for
  696.    Cyclom-Y/ISA boards at all addresses in here. If you want the
  697.    driver to probe addresses at a different address, add it to
  698.    this table.  If the driver is probing some other board and
  699.    causing problems, remove the offending address from this table.
  700.    The cy_setup function extracts additional addresses from the
  701.    boot options line.  The form is "cyclades=address,address..."
  702. */
  703. static unsigned char *cy_isa_addresses[] = {
  704.         (unsigned char *) 0xD0000,
  705.         (unsigned char *) 0xD2000,
  706.         (unsigned char *) 0xD4000,
  707.         (unsigned char *) 0xD6000,
  708.         (unsigned char *) 0xD8000,
  709.         (unsigned char *) 0xDA000,
  710.         (unsigned char *) 0xDC000,
  711.         (unsigned char *) 0xDE000,
  712.         0,0,0,0,0,0,0,0
  713. };
  714. #define NR_ISA_ADDRS (sizeof(cy_isa_addresses)/sizeof(unsigned char*))
  715. #ifdef MODULE
  716. static long maddr[NR_CARDS] = { 0, };
  717. static int irq[NR_CARDS]  = { 0, };
  718. MODULE_PARM(maddr, "1-" __MODULE_STRING(NR_CARDS) "l");
  719. MODULE_PARM(irq, "1-" __MODULE_STRING(NR_CARDS) "i");
  720. #endif
  721. #endif /* CONFIG_ISA */
  722. /* This is the per-card data structure containing address, irq, number of
  723.    channels, etc. This driver supports a maximum of NR_CARDS cards.
  724. */
  725. static struct cyclades_card cy_card[NR_CARDS];
  726. /* This is the per-channel data structure containing pointers, flags
  727.  and variables for the port. This driver supports a maximum of NR_PORTS.
  728. */
  729. static struct cyclades_port cy_port[NR_PORTS];
  730. static int cy_next_channel; /* next minor available */
  731. static struct tty_struct *serial_table[NR_PORTS];
  732. static struct termios *serial_termios[NR_PORTS];
  733. static struct termios *serial_termios_locked[NR_PORTS];
  734. /*
  735.  * tmp_buf is used as a temporary buffer by serial_write.  We need to
  736.  * lock it in case the copy_from_user blocks while swapping in a page,
  737.  * and some other program tries to do a serial write at the same time.
  738.  * Since the lock will only come under contention when the system is
  739.  * swapping and available memory is low, it makes sense to share one
  740.  * buffer across all the serial ports, since it significantly saves
  741.  * memory if large numbers of serial ports are open.  This buffer is
  742.  * allocated when the first cy_open occurs.
  743.  */
  744. static unsigned char *tmp_buf;
  745. DECLARE_MUTEX(tmp_buf_sem);
  746. /*
  747.  * This is used to look up the divisor speeds and the timeouts
  748.  * We're normally limited to 15 distinct baud rates.  The extra
  749.  * are accessed via settings in info->flags.
  750.  *      0,     1,     2,     3,     4,     5,     6,     7,     8,     9,
  751.  *     10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
  752.  *                                               HI            VHI
  753.  *     20
  754.  */
  755. static int baud_table[] = {
  756.        0,    50,    75,   110,   134,   150,   200,   300,   600,  1200,
  757.     1800,  2400,  4800,  9600, 19200, 38400, 57600, 76800,115200,150000,
  758.   230400,     0};
  759. static char baud_co_25[] = {  /* 25 MHz clock option table */
  760.     /* value =>    00    01   02    03    04 */
  761.     /* divide by    8    32   128   512  2048 */
  762.     0x00,  0x04,  0x04,  0x04,  0x04,  0x04,  0x03,  0x03,  0x03,  0x02,
  763.     0x02,  0x02,  0x01,  0x01,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00};
  764. static char baud_bpr_25[] = {  /* 25 MHz baud rate period table */
  765.     0x00,  0xf5,  0xa3,  0x6f,  0x5c,  0x51,  0xf5,  0xa3,  0x51,  0xa3,
  766.     0x6d,  0x51,  0xa3,  0x51,  0xa3,  0x51,  0x36,  0x29,  0x1b,  0x15};
  767. static char baud_co_60[] = {  /* 60 MHz clock option table (CD1400 J) */
  768.     /* value =>    00    01   02    03    04 */
  769.     /* divide by    8    32   128   512  2048 */
  770.     0x00,  0x00,  0x00,  0x04,  0x04,  0x04,  0x04,  0x04,  0x03,  0x03,
  771.     0x03,  0x02,  0x02,  0x01,  0x01,  0x00,  0x00,  0x00,  0x00,  0x00,
  772.     0x00};
  773. static char baud_bpr_60[] = {  /* 60 MHz baud rate period table (CD1400 J) */
  774.     0x00,  0x82,  0x21,  0xff,  0xdb,  0xc3,  0x92,  0x62,  0xc3,  0x62,
  775.     0x41,  0xc3,  0x62,  0xc3,  0x62,  0xc3,  0x82,  0x62,  0x41,  0x32,
  776.     0x21};
  777. static char baud_cor3[] = {  /* receive threshold */
  778.     0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,
  779.     0x0a,  0x0a,  0x0a,  0x09,  0x09,  0x08,  0x08,  0x08,  0x08,  0x07,
  780.     0x07};
  781. /*
  782.  * The Cyclades driver implements HW flow control as any serial driver.
  783.  * The cyclades_port structure member rflow and the vector rflow_thr 
  784.  * allows us to take advantage of a special feature in the CD1400 to avoid 
  785.  * data loss even when the system interrupt latency is too high. These flags 
  786.  * are to be used only with very special applications. Setting these flags 
  787.  * requires the use of a special cable (DTR and RTS reversed). In the new 
  788.  * CD1400-based boards (rev. 6.00 or later), there is no need for special 
  789.  * cables.
  790.  */
  791. static char rflow_thr[] = {  /* rflow threshold */
  792.     0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
  793.     0x00,  0x00,  0x00,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,
  794.     0x0a};
  795. /*  The Cyclom-Ye has placed the sequential chips in non-sequential
  796.  *  address order.  This look-up table overcomes that problem.
  797.  */
  798. static int cy_chip_offset [] =
  799.     { 0x0000,
  800.       0x0400,
  801.       0x0800,
  802.       0x0C00,
  803.       0x0200,
  804.       0x0600,
  805.       0x0A00,
  806.       0x0E00
  807.     };
  808. /* PCI related definitions */
  809. static unsigned short cy_pci_nboard;
  810. static unsigned short cy_isa_nboard;
  811. static unsigned short cy_nboard;
  812. #ifdef CONFIG_PCI
  813. static unsigned short cy_pci_dev_id[] = {
  814.     PCI_DEVICE_ID_CYCLOM_Y_Lo, /* PCI < 1Mb */
  815.     PCI_DEVICE_ID_CYCLOM_Y_Hi, /* PCI > 1Mb */
  816.     PCI_DEVICE_ID_CYCLOM_4Y_Lo, /* 4Y PCI < 1Mb */
  817.     PCI_DEVICE_ID_CYCLOM_4Y_Hi, /* 4Y PCI > 1Mb */
  818.     PCI_DEVICE_ID_CYCLOM_8Y_Lo, /* 8Y PCI < 1Mb */
  819.     PCI_DEVICE_ID_CYCLOM_8Y_Hi, /* 8Y PCI > 1Mb */
  820.     PCI_DEVICE_ID_CYCLOM_Z_Lo, /* Z PCI < 1Mb */
  821.     PCI_DEVICE_ID_CYCLOM_Z_Hi, /* Z PCI > 1Mb */
  822.     0 /* end of table */
  823. };
  824. #endif
  825. static void cy_start(struct tty_struct *);
  826. static void set_line_char(struct cyclades_port *);
  827. static int cyz_issue_cmd(struct cyclades_card *, uclong, ucchar, uclong);
  828. #ifdef CONFIG_ISA
  829. static unsigned detect_isa_irq (volatile ucchar *);
  830. #endif /* CONFIG_ISA */
  831. static int cyclades_get_proc_info(char *, char **, off_t , int , int *, void *);
  832. #ifndef CONFIG_CYZ_INTR
  833. static void cyz_poll(unsigned long);
  834. /* The Cyclades-Z polling cycle is defined by this variable */
  835. static long cyz_polling_cycle = CZ_DEF_POLL;
  836. static int cyz_timeron = 0;
  837. static struct timer_list cyz_timerlist = {
  838.     function: cyz_poll
  839. };
  840. #else /* CONFIG_CYZ_INTR */
  841. static void cyz_rx_restart(unsigned long);
  842. static struct timer_list cyz_rx_full_timer[NR_PORTS];
  843. #endif /* CONFIG_CYZ_INTR */
  844. static inline int
  845. serial_paranoia_check(struct cyclades_port *info,
  846.                         kdev_t device, const char *routine)
  847. {
  848. #ifdef SERIAL_PARANOIA_CHECK
  849.     static const char *badmagic =
  850.         "cyc Warning: bad magic number for serial struct (%s) in %sn";
  851.     static const char *badinfo =
  852.         "cyc Warning: null cyclades_port for (%s) in %sn";
  853.     static const char *badrange =
  854.         "cyc Warning: cyclades_port out of range for (%s) in %sn";
  855.     if (!info) {
  856.         printk(badinfo, kdevname(device), routine);
  857.         return 1;
  858.     }
  859.     if( (long)info < (long)(&cy_port[0])
  860.     || (long)(&cy_port[NR_PORTS]) < (long)info ){
  861.         printk(badrange, kdevname(device), routine);
  862.         return 1;
  863.     }
  864.     if (info->magic != CYCLADES_MAGIC) {
  865.         printk(badmagic, kdevname(device), routine);
  866.         return 1;
  867.     }
  868. #endif
  869.         return 0;
  870. } /* serial_paranoia_check */
  871. /*
  872.  * This routine is used by the interrupt handler to schedule
  873.  * processing in the software interrupt portion of the driver
  874.  * (also known as the "bottom half").  This can be called any
  875.  * number of times for any channel without harm.
  876.  */
  877. static inline void
  878. cy_sched_event(struct cyclades_port *info, int event)
  879. {
  880.     info->event |= 1 << event; /* remember what kind of event and who */
  881.     queue_task(&info->tqueue, &tq_cyclades); /* it belongs to */
  882.     mark_bh(CYCLADES_BH);                       /* then trigger event */
  883. } /* cy_sched_event */
  884. /*
  885.  * This routine is used to handle the "bottom half" processing for the
  886.  * serial driver, known also the "software interrupt" processing.
  887.  * This processing is done at the kernel interrupt level, after the
  888.  * cy#/_interrupt() has returned, BUT WITH INTERRUPTS TURNED ON.  This
  889.  * is where time-consuming activities which can not be done in the
  890.  * interrupt driver proper are done; the interrupt driver schedules
  891.  * them using cy_sched_event(), and they get done here.
  892.  *
  893.  * This is done through one level of indirection--the task queue.
  894.  * When a hardware interrupt service routine wants service by the
  895.  * driver's bottom half, it enqueues the appropriate tq_struct (one
  896.  * per port) to the tq_cyclades work queue and sets a request flag
  897.  * via mark_bh for processing that queue.  When the time is right,
  898.  * do_cyclades_bh is called (because of the mark_bh) and it requests
  899.  * that the work queue be processed.
  900.  *
  901.  * Although this may seem unwieldy, it gives the system a way to
  902.  * pass an argument (in this case the pointer to the cyclades_port
  903.  * structure) to the bottom half of the driver.  Previous kernels
  904.  * had to poll every port to see if that port needed servicing.
  905.  */
  906. static void
  907. do_cyclades_bh(void)
  908. {
  909.     run_task_queue(&tq_cyclades);
  910. } /* do_cyclades_bh */
  911. static void
  912. do_softint(void *private_)
  913. {
  914.   struct cyclades_port *info = (struct cyclades_port *) private_;
  915.   struct tty_struct    *tty;
  916.     tty = info->tty;
  917.     if (!tty)
  918.         return;
  919.     if (test_and_clear_bit(Cy_EVENT_HANGUP, &info->event)) {
  920.         tty_hangup(info->tty);
  921.         wake_up_interruptible(&info->open_wait);
  922.         info->flags &= ~(ASYNC_NORMAL_ACTIVE|
  923.                              ASYNC_CALLOUT_ACTIVE);
  924.     }
  925.     if (test_and_clear_bit(Cy_EVENT_OPEN_WAKEUP, &info->event)) {
  926.         wake_up_interruptible(&info->open_wait);
  927.     }
  928. #ifdef CONFIG_CYZ_INTR
  929.     if (test_and_clear_bit(Cy_EVENT_Z_RX_FULL, &info->event)) {
  930. if (cyz_rx_full_timer[info->line].function == NULL) {
  931.     cyz_rx_full_timer[info->line].expires = jiffies + 1;
  932.     cyz_rx_full_timer[info->line].function = cyz_rx_restart;
  933.     cyz_rx_full_timer[info->line].data = (unsigned long)info;
  934.     add_timer(&cyz_rx_full_timer[info->line]);
  935. }
  936.     }
  937. #endif
  938.     if (test_and_clear_bit(Cy_EVENT_DELTA_WAKEUP, &info->event)) {
  939. wake_up_interruptible(&info->delta_msr_wait);
  940.     }
  941.     if (test_and_clear_bit(Cy_EVENT_WRITE_WAKEUP, &info->event)) {
  942.         if((tty->flags & (1<< TTY_DO_WRITE_WAKEUP))
  943.         && tty->ldisc.write_wakeup){
  944.             (tty->ldisc.write_wakeup)(tty);
  945.         }
  946.         wake_up_interruptible(&tty->write_wait);
  947.     }
  948. #ifdef Z_WAKE
  949.     if (test_and_clear_bit(Cy_EVENT_SHUTDOWN_WAKEUP, &info->event)) {
  950.         wake_up_interruptible(&info->shutdown_wait);
  951.     }
  952. #endif
  953. } /* do_softint */
  954. /***********************************************************/
  955. /********* Start of block of Cyclom-Y specific code ********/
  956. /* This routine waits up to 1000 micro-seconds for the previous
  957.    command to the Cirrus chip to complete and then issues the
  958.    new command.  An error is returned if the previous command
  959.    didn't finish within the time limit.
  960.    This function is only called from inside spinlock-protected code.
  961.  */
  962. static int
  963. cyy_issue_cmd(volatile ucchar *base_addr, u_char cmd, int index)
  964. {
  965.   volatile int  i;
  966.     /* Check to see that the previous command has completed */
  967.     for(i = 0 ; i < 100 ; i++){
  968. if (cy_readb(base_addr+(CyCCR<<index)) == 0){
  969.     break;
  970. }
  971. udelay(10L);
  972.     }
  973.     /* if the CCR never cleared, the previous command
  974.        didn't finish within the "reasonable time" */
  975.     if (i == 100) return (-1);
  976.     /* Issue the new command */
  977.     cy_writeb((u_long)base_addr+(CyCCR<<index), cmd);
  978.     return(0);
  979. } /* cyy_issue_cmd */
  980. #ifdef CONFIG_ISA
  981. /* ISA interrupt detection code */
  982. static unsigned 
  983. detect_isa_irq (volatile ucchar *address)
  984. {
  985.   int irq;
  986.   unsigned long irqs, flags;
  987.   int save_xir, save_car;
  988.   int index = 0; /* IRQ probing is only for ISA */
  989.     /* forget possible initially masked and pending IRQ */
  990.     irq = probe_irq_off(probe_irq_on());
  991.     /* Clear interrupts on the board first */
  992.     cy_writeb((u_long)address + (Cy_ClrIntr<<index), 0);
  993.       /* Cy_ClrIntr is 0x1800 */
  994.     irqs = probe_irq_on();
  995.     /* Wait ... */
  996.     udelay(5000L);
  997.     /* Enable the Tx interrupts on the CD1400 */
  998.     save_flags(flags); cli();
  999. cy_writeb((u_long)address + (CyCAR<<index), 0);
  1000. cyy_issue_cmd(address, CyCHAN_CTL|CyENB_XMTR, index);
  1001. cy_writeb((u_long)address + (CyCAR<<index), 0);
  1002. cy_writeb((u_long)address + (CySRER<<index), 
  1003. cy_readb(address + (CySRER<<index)) | CyTxRdy);
  1004.     restore_flags(flags);
  1005.     /* Wait ... */
  1006.     udelay(5000L);
  1007.     /* Check which interrupt is in use */
  1008.     irq = probe_irq_off(irqs);
  1009.     /* Clean up */
  1010.     save_xir = (u_char) cy_readb(address + (CyTIR<<index));
  1011.     save_car = cy_readb(address + (CyCAR<<index));
  1012.     cy_writeb((u_long)address + (CyCAR<<index), (save_xir & 0x3));
  1013.     cy_writeb((u_long)address + (CySRER<<index),
  1014. cy_readb(address + (CySRER<<index)) & ~CyTxRdy);
  1015.     cy_writeb((u_long)address + (CyTIR<<index), (save_xir & 0x3f));
  1016.     cy_writeb((u_long)address + (CyCAR<<index), (save_car));
  1017.     cy_writeb((u_long)address + (Cy_ClrIntr<<index), 0);
  1018.       /* Cy_ClrIntr is 0x1800 */
  1019.     return (irq > 0)? irq : 0;
  1020. }
  1021. #endif /* CONFIG_ISA */
  1022. /* The real interrupt service routine is called
  1023.    whenever the card wants its hand held--chars
  1024.    received, out buffer empty, modem change, etc.
  1025.  */
  1026. static void
  1027. cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  1028. {
  1029.   struct tty_struct *tty;
  1030.   int status;
  1031.   struct cyclades_card *cinfo;
  1032.   struct cyclades_port *info;
  1033.   volatile unsigned char *base_addr, *card_base_addr;
  1034.   int chip;
  1035.   int save_xir, channel, save_car;
  1036.   char data;
  1037.   volatile int char_count;
  1038.   int outch;
  1039.   int i,j,index;
  1040.   int too_many;
  1041.   int had_work;
  1042.   int mdm_change;
  1043.   int mdm_status;
  1044.     if((cinfo = (struct cyclades_card *)dev_id) == 0){
  1045. #ifdef CY_DEBUG_INTERRUPTS
  1046. printk("cyy_interrupt: spurious interrupt %dnr", irq);
  1047. #endif
  1048.         return; /* spurious interrupt */
  1049.     }
  1050.     card_base_addr = (unsigned char *)cinfo->base_addr;
  1051.     index = cinfo->bus_index;
  1052.     /* This loop checks all chips in the card.  Make a note whenever
  1053.        _any_ chip had some work to do, as this is considered an
  1054.        indication that there will be more to do.  Only when no chip
  1055.        has any work does this outermost loop exit.
  1056.      */
  1057.     do{
  1058.         had_work = 0;
  1059.         for ( chip = 0 ; chip < cinfo->num_chips ; chip ++) {
  1060.             base_addr = (unsigned char *)
  1061.        (cinfo->base_addr + (cy_chip_offset[chip]<<index));
  1062.             too_many = 0;
  1063.             while ( (status = cy_readb(base_addr+(CySVRR<<index))) != 0x00) {
  1064.                 had_work++;
  1065.                 /* The purpose of the following test is to ensure that
  1066.                    no chip can monopolize the driver.  This forces the
  1067.                    chips to be checked in a round-robin fashion (after
  1068.                    draining each of a bunch (1000) of characters).
  1069.                  */
  1070.                 if(1000<too_many++){
  1071.                     break;
  1072.                 }
  1073.                 if (status & CySRReceive) { /* reception interrupt */
  1074. #ifdef CY_DEBUG_INTERRUPTS
  1075.     printk("cyy_interrupt: rcvd intr, chip %dnr", chip);
  1076. #endif
  1077.                     /* determine the channel & change to that context */
  1078.     spin_lock(&cinfo->card_lock);
  1079.                     save_xir = (u_char) cy_readb(base_addr+(CyRIR<<index));
  1080.                     channel = (u_short ) (save_xir & CyIRChannel);
  1081.                     i = channel + chip * 4 + cinfo->first_line;
  1082.                     info = &cy_port[i];
  1083.                     info->last_active = jiffies;
  1084.                     save_car = cy_readb(base_addr+(CyCAR<<index));
  1085.                     cy_writeb((u_long)base_addr+(CyCAR<<index), save_xir);
  1086.                     /* if there is nowhere to put the data, discard it */
  1087.                     if(info->tty == 0){
  1088.                         j = (cy_readb(base_addr+(CyRIVR<<index)) & CyIVRMask);
  1089.                         if ( j == CyIVRRxEx ) { /* exception */
  1090.                             data = cy_readb(base_addr+(CyRDSR<<index));
  1091.                         } else { /* normal character reception */
  1092.                             char_count = cy_readb(base_addr+(CyRDCR<<index));
  1093.                             while(char_count--){
  1094.                                 data = cy_readb(base_addr+(CyRDSR<<index));
  1095.                             }
  1096.                         }
  1097.                     }else{ /* there is an open port for this data */
  1098.                         tty = info->tty;
  1099.                         j = (cy_readb(base_addr+(CyRIVR<<index)) & CyIVRMask);
  1100.                         if ( j == CyIVRRxEx ) { /* exception */
  1101.                             data = cy_readb(base_addr+(CyRDSR<<index));
  1102.     /* For statistics only */
  1103.     if (data & CyBREAK)
  1104. info->icount.brk++;
  1105.     else if(data & CyFRAME)
  1106. info->icount.frame++;
  1107.     else if(data & CyPARITY)
  1108. info->icount.parity++;
  1109.     else if(data & CyOVERRUN)
  1110. info->icount.overrun++;
  1111.                             if(data & info->ignore_status_mask){
  1112. info->icount.rx++;
  1113.                                 continue;
  1114.                             }
  1115.                             if (tty->flip.count < TTY_FLIPBUF_SIZE){
  1116.                                 tty->flip.count++;
  1117.                                 if (data & info->read_status_mask){
  1118.                                     if(data & CyBREAK){
  1119.                                         *tty->flip.flag_buf_ptr++ =
  1120.          TTY_BREAK;
  1121.                                         *tty->flip.char_buf_ptr++ =
  1122.   cy_readb(base_addr+(CyRDSR<<index));
  1123. info->icount.rx++;
  1124.                                         if (info->flags & ASYNC_SAK){
  1125.                                             do_SAK(tty);
  1126.                                         }
  1127.                                     }else if(data & CyFRAME){
  1128.                                         *tty->flip.flag_buf_ptr++ =
  1129.     TTY_FRAME;
  1130.                                         *tty->flip.char_buf_ptr++ =
  1131.   cy_readb(base_addr+(CyRDSR<<index));
  1132. info->icount.rx++;
  1133. info->idle_stats.frame_errs++;
  1134.                                     }else if(data & CyPARITY){
  1135.                                         *tty->flip.flag_buf_ptr++ =
  1136.     TTY_PARITY;
  1137.                                         *tty->flip.char_buf_ptr++ =
  1138.   cy_readb(base_addr+(CyRDSR<<index));
  1139. info->icount.rx++;
  1140. info->idle_stats.parity_errs++;
  1141.                                     }else if(data & CyOVERRUN){
  1142.                                         *tty->flip.flag_buf_ptr++ =
  1143.     TTY_OVERRUN;
  1144.                                         *tty->flip.char_buf_ptr++ = 0;
  1145. info->icount.rx++;
  1146.                                         /* If the flip buffer itself is
  1147.                                            overflowing, we still lose
  1148.                                            the next incoming character.
  1149.                                          */
  1150.                                         if(tty->flip.count
  1151.            < TTY_FLIPBUF_SIZE){
  1152.                                             tty->flip.count++;
  1153.                                             *tty->flip.flag_buf_ptr++ =
  1154.      TTY_NORMAL;
  1155.                                            *tty->flip.char_buf_ptr++ =
  1156.     cy_readb(base_addr+(CyRDSR<<index));
  1157.     info->icount.rx++;
  1158.                                         }
  1159. info->idle_stats.overruns++;
  1160.                                     /* These two conditions may imply */
  1161.                                     /* a normal read should be done. */
  1162.                                     /* }else if(data & CyTIMEOUT){ */
  1163.                                     /* }else if(data & CySPECHAR){ */
  1164.                                     }else{
  1165.                                         *tty->flip.flag_buf_ptr++ = 0;
  1166.                                         *tty->flip.char_buf_ptr++ = 0;
  1167. info->icount.rx++;
  1168.                                     }
  1169.                                 }else{
  1170.                                     *tty->flip.flag_buf_ptr++ = 0;
  1171.                                     *tty->flip.char_buf_ptr++ = 0;
  1172.     info->icount.rx++;
  1173.                                 }
  1174.                             }else{
  1175.                                 /* there was a software buffer
  1176.    overrun and nothing could be
  1177.    done about it!!! */
  1178. info->icount.buf_overrun++;
  1179. info->idle_stats.overruns++;
  1180.                             }
  1181.                         } else { /* normal character reception */
  1182.                             /* load # chars available from the chip */
  1183.                             char_count = cy_readb(base_addr+(CyRDCR<<index));
  1184. #ifdef CY_ENABLE_MONITORING
  1185.                             ++info->mon.int_count;
  1186.                             info->mon.char_count += char_count;
  1187.                             if (char_count > info->mon.char_max)
  1188.                                info->mon.char_max = char_count;
  1189.                             info->mon.char_last = char_count;
  1190. #endif
  1191.     info->idle_stats.recv_bytes += char_count;
  1192.     info->idle_stats.recv_idle   = jiffies;
  1193.                             while(char_count--){
  1194.                                 if (tty->flip.count >= TTY_FLIPBUF_SIZE){
  1195.                                         break;
  1196.                                 }
  1197.                                 tty->flip.count++;
  1198.                                 data = cy_readb(base_addr+(CyRDSR<<index));
  1199.                                 *tty->flip.flag_buf_ptr++ = TTY_NORMAL;
  1200.                                 *tty->flip.char_buf_ptr++ = data;
  1201. info->icount.rx++;
  1202. #ifdef CY_16Y_HACK
  1203.                                 udelay(10L);
  1204. #endif
  1205.                             }
  1206.                         }
  1207.                         queue_task(&tty->flip.tqueue, &tq_timer);
  1208.                     }
  1209.                     /* end of service */
  1210.                     cy_writeb((u_long)base_addr+(CyRIR<<index), (save_xir & 0x3f));
  1211.                     cy_writeb((u_long)base_addr+(CyCAR<<index), (save_car));
  1212.     spin_unlock(&cinfo->card_lock);
  1213.                 }
  1214.                 if (status & CySRTransmit) { /* transmission interrupt */
  1215.                     /* Since we only get here when the transmit buffer
  1216.                        is empty, we know we can always stuff a dozen
  1217.                        characters. */
  1218. #ifdef CY_DEBUG_INTERRUPTS
  1219.     printk("cyy_interrupt: xmit intr, chip %dnr", chip);
  1220. #endif
  1221.                     /* determine the channel & change to that context */
  1222.     spin_lock(&cinfo->card_lock);
  1223.                     save_xir = (u_char) cy_readb(base_addr+(CyTIR<<index));
  1224.                     channel = (u_short ) (save_xir & CyIRChannel);
  1225.                     i = channel + chip * 4 + cinfo->first_line;
  1226.                     save_car = cy_readb(base_addr+(CyCAR<<index));
  1227.                     cy_writeb((u_long)base_addr+(CyCAR<<index), save_xir);
  1228.                     /* validate the port# (as configured and open) */
  1229.                     if( (i < 0) || (NR_PORTS <= i) ){
  1230.                         cy_writeb((u_long)base_addr+(CySRER<<index),
  1231.                              cy_readb(base_addr+(CySRER<<index)) & ~CyTxRdy);
  1232.                         goto txend;
  1233.                     }
  1234.                     info = &cy_port[i];
  1235.                     info->last_active = jiffies;
  1236.                     if(info->tty == 0){
  1237.                         cy_writeb((u_long)base_addr+(CySRER<<index),
  1238.                              cy_readb(base_addr+(CySRER<<index)) & ~CyTxRdy);
  1239.                         goto txdone;
  1240.                     }
  1241.                     /* load the on-chip space for outbound data */
  1242.                     char_count = info->xmit_fifo_size;
  1243.                     if(info->x_char) { /* send special char */
  1244.                         outch = info->x_char;
  1245.                         cy_writeb((u_long)base_addr+(CyTDR<<index), outch);
  1246.                         char_count--;
  1247. info->icount.tx++;
  1248.                         info->x_char = 0;
  1249.                     }
  1250.                     if (info->breakon || info->breakoff) {
  1251. if (info->breakon) {
  1252.     cy_writeb((u_long)base_addr + (CyTDR<<index), 0); 
  1253.     cy_writeb((u_long)base_addr + (CyTDR<<index), 0x81);
  1254.     info->breakon = 0;
  1255.                             char_count -= 2;
  1256. }
  1257. if (info->breakoff) {
  1258.     cy_writeb((u_long)base_addr + (CyTDR<<index), 0); 
  1259.     cy_writeb((u_long)base_addr + (CyTDR<<index), 0x83);
  1260.     info->breakoff = 0;
  1261.                             char_count -= 2;
  1262. }
  1263.                     }
  1264.                     while (char_count-- > 0){
  1265. if (!info->xmit_cnt){
  1266.     if (cy_readb(base_addr+(CySRER<<index))&CyTxMpty) {
  1267. cy_writeb((u_long)base_addr+(CySRER<<index),
  1268.   cy_readb(base_addr+(CySRER<<index)) &
  1269.   ~CyTxMpty);
  1270.     } else {
  1271. cy_writeb((u_long)base_addr+(CySRER<<index),
  1272.   ((cy_readb(base_addr+(CySRER<<index))
  1273.     & ~CyTxRdy)
  1274.    | CyTxMpty));
  1275.     }
  1276.     goto txdone;
  1277. }
  1278. if (info->xmit_buf == 0){
  1279.                             cy_writeb((u_long)base_addr+(CySRER<<index),
  1280. cy_readb(base_addr+(CySRER<<index)) & 
  1281. ~CyTxRdy);
  1282.                             goto txdone;
  1283. }
  1284. if (info->tty->stopped || info->tty->hw_stopped){
  1285.                             cy_writeb((u_long)base_addr+(CySRER<<index),
  1286. cy_readb(base_addr+(CySRER<<index)) & 
  1287. ~CyTxRdy);
  1288.                             goto txdone;
  1289. }
  1290.                         /* Because the Embedded Transmit Commands have
  1291.                            been enabled, we must check to see if the
  1292.    escape character, NULL, is being sent.  If it
  1293.    is, we must ensure that there is room for it
  1294.    to be doubled in the output stream.  Therefore
  1295.    we no longer advance the pointer when the
  1296.    character is fetched, but rather wait until
  1297.    after the check for a NULL output character.
  1298.    This is necessary because there may not be
  1299.    room for the two chars needed to send a NULL.)
  1300.                          */
  1301.                         outch = info->xmit_buf[info->xmit_tail];
  1302.                         if( outch ){
  1303.                             info->xmit_cnt--;
  1304.                             info->xmit_tail = (info->xmit_tail + 1)
  1305.                                                       & (SERIAL_XMIT_SIZE - 1);
  1306.                             cy_writeb((u_long)base_addr+(CyTDR<<index), outch);
  1307.     info->icount.tx++;
  1308.                         }else{
  1309.                             if(char_count > 1){
  1310.                                 info->xmit_cnt--;
  1311.                                 info->xmit_tail = (info->xmit_tail + 1)
  1312.       & (SERIAL_XMIT_SIZE - 1);
  1313.                                 cy_writeb((u_long)base_addr+(CyTDR<<index), 
  1314.   outch);
  1315.                                 cy_writeb((u_long)base_addr+(CyTDR<<index), 0);
  1316. info->icount.tx++;
  1317.                                 char_count--;
  1318.                             }else{
  1319.                             }
  1320.                         }
  1321.                     }
  1322.         txdone:
  1323.                     if (info->xmit_cnt < WAKEUP_CHARS) {
  1324.                         cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP);
  1325.                     }
  1326.         txend:
  1327.                     /* end of service */
  1328.                     cy_writeb((u_long)base_addr+(CyTIR<<index), 
  1329.       (save_xir & 0x3f));
  1330.                     cy_writeb((u_long)base_addr+(CyCAR<<index), (save_car));
  1331.     spin_unlock(&cinfo->card_lock);
  1332.                 }
  1333.                 if (status & CySRModem) {        /* modem interrupt */
  1334.                     /* determine the channel & change to that context */
  1335.     spin_lock(&cinfo->card_lock);
  1336.                     save_xir = (u_char) cy_readb(base_addr+(CyMIR<<index));
  1337.                     channel = (u_short ) (save_xir & CyIRChannel);
  1338.                     info = &cy_port[channel + chip * 4
  1339.                            + cinfo->first_line];
  1340.                     info->last_active = jiffies;
  1341.                     save_car = cy_readb(base_addr+(CyCAR<<index));
  1342.                     cy_writeb((u_long)base_addr+(CyCAR<<index), save_xir);
  1343.                     mdm_change = cy_readb(base_addr+(CyMISR<<index));
  1344.                     mdm_status = cy_readb(base_addr+(CyMSVR1<<index));
  1345.                     if(info->tty == 0){/* no place for data, ignore it*/
  1346.                         ;
  1347.                     }else{
  1348. if (mdm_change & CyANY_DELTA) {
  1349.     /* For statistics only */
  1350.     if (mdm_change & CyDCD) info->icount.dcd++;
  1351.     if (mdm_change & CyCTS) info->icount.cts++;
  1352.     if (mdm_change & CyDSR) info->icount.dsr++;
  1353.     if (mdm_change & CyRI) info->icount.rng++;
  1354.     cy_sched_event(info, Cy_EVENT_DELTA_WAKEUP);
  1355. }
  1356.                         if((mdm_change & CyDCD)
  1357.                         && (info->flags & ASYNC_CHECK_CD)){
  1358.                             if(mdm_status & CyDCD){
  1359.                                 cy_sched_event(info,
  1360.     Cy_EVENT_OPEN_WAKEUP);
  1361.                             }else if(!((info->flags
  1362.                 & ASYNC_CALLOUT_ACTIVE)
  1363.  &&(info->flags
  1364.     & ASYNC_CALLOUT_NOHUP))){
  1365.                                 cy_sched_event(info,
  1366.     Cy_EVENT_HANGUP);
  1367.                             }
  1368.                         }
  1369.                         if((mdm_change & CyCTS)
  1370.                         && (info->flags & ASYNC_CTS_FLOW)){
  1371.                             if(info->tty->hw_stopped){
  1372.                                 if(mdm_status & CyCTS){
  1373.                                     /* cy_start isn't used
  1374.          because... !!! */
  1375.                                     info->tty->hw_stopped = 0;
  1376.                                   cy_writeb((u_long)base_addr+(CySRER<<index),
  1377.                                        cy_readb(base_addr+(CySRER<<index)) | 
  1378.                                        CyTxRdy);
  1379.                                     cy_sched_event(info,
  1380.         Cy_EVENT_WRITE_WAKEUP);
  1381.                                 }
  1382.                             }else{
  1383.                                 if(!(mdm_status & CyCTS)){
  1384.                                     /* cy_stop isn't used
  1385.          because ... !!! */
  1386.                                     info->tty->hw_stopped = 1;
  1387.                                   cy_writeb((u_long)base_addr+(CySRER<<index),
  1388.                                        cy_readb(base_addr+(CySRER<<index)) & 
  1389.                                        ~CyTxRdy);
  1390.                                 }
  1391.                             }
  1392.                         }
  1393.                         if(mdm_change & CyDSR){
  1394.                         }
  1395.                         if(mdm_change & CyRI){
  1396.                         }
  1397.                     }
  1398.                     /* end of service */
  1399.                     cy_writeb((u_long)base_addr+(CyMIR<<index), 
  1400.       (save_xir & 0x3f));
  1401.                     cy_writeb((u_long)base_addr+(CyCAR<<index), save_car);
  1402.     spin_unlock(&cinfo->card_lock);
  1403.                 }
  1404.             }          /* end while status != 0 */
  1405.         }            /* end loop for chips... */
  1406.     } while(had_work);
  1407.    /* clear interrupts */
  1408.    spin_lock(&cinfo->card_lock);
  1409.    cy_writeb((u_long)card_base_addr + (Cy_ClrIntr<<index), 0);
  1410.                                 /* Cy_ClrIntr is 0x1800 */
  1411.    spin_unlock(&cinfo->card_lock);
  1412. } /* cyy_interrupt */
  1413. /***********************************************************/
  1414. /********* End of block of Cyclom-Y specific code **********/
  1415. /******** Start of block of Cyclades-Z specific code *********/
  1416. /***********************************************************/
  1417. static int
  1418. cyz_fetch_msg( struct cyclades_card *cinfo,
  1419.     uclong *channel, ucchar *cmd, uclong *param)
  1420. {
  1421.   struct FIRM_ID *firm_id;
  1422.   struct ZFW_CTRL *zfw_ctrl;
  1423.   struct BOARD_CTRL *board_ctrl;
  1424.   unsigned long loc_doorbell;
  1425.     firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS);
  1426.     if (!ISZLOADED(*cinfo)){
  1427. return (-1);
  1428.     }
  1429.     zfw_ctrl = (struct ZFW_CTRL *)
  1430. (cinfo->base_addr + 
  1431.  (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  1432.     board_ctrl = &zfw_ctrl->board_ctrl;
  1433.     loc_doorbell = cy_readl(&((struct RUNTIME_9060 *)
  1434.                      (cinfo->ctl_addr))->loc_doorbell);
  1435.     if (loc_doorbell){
  1436. *cmd = (char)(0xff & loc_doorbell);
  1437. *channel = cy_readl(&board_ctrl->fwcmd_channel);
  1438. *param = (uclong)cy_readl(&board_ctrl->fwcmd_param);
  1439. cy_writel(&((struct RUNTIME_9060 *)(cinfo->ctl_addr))->loc_doorbell, 
  1440.                  0xffffffff);
  1441. return 1;
  1442.     }
  1443.     return 0;
  1444. } /* cyz_fetch_msg */
  1445. static int
  1446. cyz_issue_cmd( struct cyclades_card *cinfo,
  1447.     uclong channel, ucchar cmd, uclong param)
  1448. {
  1449.   struct FIRM_ID *firm_id;
  1450.   struct ZFW_CTRL *zfw_ctrl;
  1451.   struct BOARD_CTRL *board_ctrl;
  1452.   volatile uclong *pci_doorbell;
  1453.   int index;
  1454.     firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS);
  1455.     if (!ISZLOADED(*cinfo)){
  1456. return (-1);
  1457.     }
  1458.     zfw_ctrl = (struct ZFW_CTRL *)
  1459. (cinfo->base_addr + 
  1460.  (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  1461.     board_ctrl = &zfw_ctrl->board_ctrl;
  1462.     index = 0;
  1463.     pci_doorbell = (uclong *)(&((struct RUNTIME_9060 *)
  1464.                                (cinfo->ctl_addr))->pci_doorbell);
  1465.     while( (cy_readl(pci_doorbell) & 0xff) != 0){
  1466.         if (index++ == 1000){
  1467.     return((int)(cy_readl(pci_doorbell) & 0xff));
  1468.         }
  1469. udelay(50L);
  1470.     }
  1471.     cy_writel((u_long)&board_ctrl->hcmd_channel, channel);
  1472.     cy_writel((u_long)&board_ctrl->hcmd_param , param);
  1473.     cy_writel((u_long)pci_doorbell, (long)cmd);
  1474.     return(0);
  1475. } /* cyz_issue_cmd */
  1476. static void
  1477. cyz_handle_rx(struct cyclades_port *info, volatile struct CH_CTRL *ch_ctrl,
  1478.       volatile struct BUF_CTRL *buf_ctrl)
  1479. {
  1480.   struct cyclades_card *cinfo = &cy_card[info->card];
  1481.   struct tty_struct *tty = info->tty;
  1482.   volatile int char_count;
  1483. #ifdef BLOCKMOVE
  1484.   int small_count;
  1485. #else
  1486.   char data;
  1487. #endif
  1488.   volatile uclong rx_put, rx_get, new_rx_get, rx_bufsize, rx_bufaddr;
  1489.     rx_get = new_rx_get = cy_readl(&buf_ctrl->rx_get);
  1490.     rx_put = cy_readl(&buf_ctrl->rx_put);
  1491.     rx_bufsize = cy_readl(&buf_ctrl->rx_bufsize);
  1492.     rx_bufaddr = cy_readl(&buf_ctrl->rx_bufaddr);
  1493.     if (rx_put >= rx_get)
  1494. char_count = rx_put - rx_get;
  1495.     else
  1496. char_count = rx_put - rx_get + rx_bufsize;
  1497.     if ( char_count ) {
  1498. info->last_active = jiffies;
  1499. info->jiffies[1] = jiffies;
  1500. #ifdef CY_ENABLE_MONITORING
  1501. info->mon.int_count++;
  1502. info->mon.char_count += char_count;
  1503. if (char_count > info->mon.char_max)
  1504.     info->mon.char_max = char_count;
  1505. info->mon.char_last = char_count;
  1506. #endif
  1507. if(tty == 0){
  1508.     /* flush received characters */
  1509.     new_rx_get = (new_rx_get + char_count) & (rx_bufsize - 1);
  1510.     info->rflush_count++;
  1511. }else{
  1512. #ifdef BLOCKMOVE
  1513.     /* we'd like to use memcpy(t, f, n) and memset(s, c, count)
  1514.        for performance, but because of buffer boundaries, there
  1515.        may be several steps to the operation */
  1516.     while(0 < (small_count = 
  1517.        min_t(unsigned int, (rx_bufsize - new_rx_get),
  1518.        min_t(unsigned int, (TTY_FLIPBUF_SIZE - tty->flip.count), char_count))
  1519.  )) {
  1520. memcpy_fromio(tty->flip.char_buf_ptr,
  1521.       (char *)(cinfo->base_addr
  1522.        + rx_bufaddr + new_rx_get),
  1523.       small_count);
  1524. tty->flip.char_buf_ptr += small_count;
  1525. memset(tty->flip.flag_buf_ptr, TTY_NORMAL, small_count);
  1526. tty->flip.flag_buf_ptr += small_count;
  1527. new_rx_get = (new_rx_get + small_count) & (rx_bufsize - 1);
  1528. char_count -= small_count;
  1529. info->icount.rx += small_count;
  1530. info->idle_stats.recv_bytes += small_count;
  1531. tty->flip.count += small_count;
  1532.     }
  1533. #else
  1534.     while(char_count--){
  1535. if (tty->flip.count >= TTY_FLIPBUF_SIZE){
  1536.     break;
  1537. }
  1538. data = cy_readb(cinfo->base_addr + rx_bufaddr + new_rx_get);
  1539. new_rx_get = (new_rx_get + 1) & (rx_bufsize - 1);
  1540. tty->flip.count++;
  1541. *tty->flip.flag_buf_ptr++ = TTY_NORMAL;
  1542. *tty->flip.char_buf_ptr++ = data;
  1543. info->idle_stats.recv_bytes++;
  1544. info->icount.rx++;
  1545.     }
  1546. #endif
  1547. #ifdef CONFIG_CYZ_INTR
  1548.     /* Recalculate the number of chars in the RX buffer and issue
  1549.        a cmd in case it's higher than the RX high water mark */
  1550.     rx_put = cy_readl(&buf_ctrl->rx_put);
  1551.     if (rx_put >= rx_get)
  1552. char_count = rx_put - rx_get;
  1553.     else
  1554. char_count = rx_put - rx_get + rx_bufsize;
  1555.     if(char_count >= cy_readl(&buf_ctrl->rx_threshold)) {
  1556. cy_sched_event(info, Cy_EVENT_Z_RX_FULL);
  1557.     }
  1558. #endif
  1559.     info->idle_stats.recv_idle = jiffies;
  1560.     queue_task(&tty->flip.tqueue, &tq_timer);
  1561. }
  1562. /* Update rx_get */
  1563. cy_writel(&buf_ctrl->rx_get, new_rx_get);
  1564.     }
  1565. }
  1566. static void
  1567. cyz_handle_tx(struct cyclades_port *info, volatile struct CH_CTRL *ch_ctrl,
  1568.       volatile struct BUF_CTRL *buf_ctrl)
  1569. {
  1570.   struct cyclades_card *cinfo = &cy_card[info->card];
  1571.   struct tty_struct *tty = info->tty;
  1572.   char data;
  1573.   volatile int char_count;
  1574. #ifdef BLOCKMOVE
  1575.   int small_count;
  1576. #endif
  1577.   volatile uclong tx_put, tx_get, tx_bufsize, tx_bufaddr;
  1578.     if (info->xmit_cnt <= 0) /* Nothing to transmit */
  1579. return;
  1580.     tx_get = cy_readl(&buf_ctrl->tx_get);
  1581.     tx_put = cy_readl(&buf_ctrl->tx_put);
  1582.     tx_bufsize = cy_readl(&buf_ctrl->tx_bufsize);
  1583.     tx_bufaddr = cy_readl(&buf_ctrl->tx_bufaddr);
  1584.     if (tx_put >= tx_get)
  1585. char_count = tx_get - tx_put - 1 + tx_bufsize;
  1586.     else
  1587. char_count = tx_get - tx_put - 1;
  1588.     if ( char_count ) {
  1589. if( tty == 0 ){
  1590.     goto ztxdone;
  1591. }
  1592. if(info->x_char) { /* send special char */
  1593.     data = info->x_char;
  1594.     cy_writeb((cinfo->base_addr + tx_bufaddr + tx_put), data);
  1595.     tx_put = (tx_put + 1) & (tx_bufsize - 1);
  1596.     info->x_char = 0;
  1597.     char_count--;
  1598.     info->icount.tx++;
  1599.     info->last_active = jiffies;
  1600.     info->jiffies[2] = jiffies;
  1601. }
  1602. #ifdef BLOCKMOVE
  1603. while(0 < (small_count = 
  1604.    min_t(unsigned int, (tx_bufsize - tx_put),
  1605.        min_t(unsigned int, (SERIAL_XMIT_SIZE - info->xmit_tail),
  1606.    min_t(unsigned int, info->xmit_cnt, char_count))))) {
  1607.     memcpy_toio((char *)(cinfo->base_addr + tx_bufaddr + tx_put),
  1608. &info->xmit_buf[info->xmit_tail],
  1609. small_count);
  1610.     tx_put = (tx_put + small_count) & (tx_bufsize - 1);
  1611.     char_count -= small_count;
  1612.     info->icount.tx += small_count;
  1613.     info->xmit_cnt -= small_count;
  1614.     info->xmit_tail = 
  1615. (info->xmit_tail + small_count) & (SERIAL_XMIT_SIZE - 1);
  1616.     info->last_active = jiffies;
  1617.     info->jiffies[2] = jiffies;
  1618. }
  1619. #else
  1620. while (info->xmit_cnt && char_count){
  1621.     data = info->xmit_buf[info->xmit_tail];
  1622.     info->xmit_cnt--;
  1623.     info->xmit_tail = (info->xmit_tail + 1) & (SERIAL_XMIT_SIZE - 1);
  1624.     cy_writeb(cinfo->base_addr + tx_bufaddr + tx_put, data);
  1625.     tx_put = (tx_put + 1) & (tx_bufsize - 1);
  1626.     char_count--;
  1627.     info->icount.tx++;
  1628.     info->last_active = jiffies;
  1629.     info->jiffies[2] = jiffies;
  1630. }
  1631. #endif
  1632.     ztxdone:
  1633. if (info->xmit_cnt < WAKEUP_CHARS) {
  1634.     cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP);
  1635. }
  1636. /* Update tx_put */
  1637. cy_writel(&buf_ctrl->tx_put, tx_put);
  1638.     }
  1639. }
  1640. static void
  1641. cyz_handle_cmd(struct cyclades_card *cinfo)
  1642. {
  1643.   struct tty_struct *tty;
  1644.   struct cyclades_port *info;
  1645.   static volatile struct FIRM_ID *firm_id;
  1646.   static volatile struct ZFW_CTRL *zfw_ctrl;
  1647.   static volatile struct BOARD_CTRL *board_ctrl;
  1648.   static volatile struct CH_CTRL *ch_ctrl;
  1649.   static volatile struct BUF_CTRL *buf_ctrl;
  1650.   uclong channel;
  1651.   ucchar cmd;
  1652.   uclong param;
  1653.   uclong hw_ver, fw_ver;
  1654.   int special_count;
  1655.   int delta_count;
  1656.     firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS);
  1657.     zfw_ctrl = (struct ZFW_CTRL *)
  1658. (cinfo->base_addr + 
  1659.  (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  1660.     board_ctrl = &(zfw_ctrl->board_ctrl);
  1661.     fw_ver = cy_readl(&board_ctrl->fw_version);
  1662.     hw_ver = cy_readl(&((struct RUNTIME_9060 *)(cinfo->ctl_addr))->mail_box_0);
  1663. #ifdef CONFIG_CYZ_INTR
  1664.     if (!cinfo->nports)
  1665. cinfo->nports = (int) cy_readl(&board_ctrl->n_channel);
  1666. #endif
  1667.     while(cyz_fetch_msg(cinfo, &channel, &cmd, &param) == 1) {
  1668. special_count = 0;
  1669. delta_count = 0;
  1670. info = &cy_port[channel + cinfo->first_line];
  1671. if((tty = info->tty) == 0) {
  1672.     continue;
  1673. }
  1674. ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]);
  1675. buf_ctrl = &(zfw_ctrl->buf_ctrl[channel]);
  1676. switch(cmd) {
  1677.     case C_CM_PR_ERROR:
  1678. tty->flip.count++;
  1679. *tty->flip.flag_buf_ptr++ = TTY_PARITY;
  1680. *tty->flip.char_buf_ptr++ = 0;
  1681. info->icount.rx++;
  1682. special_count++;
  1683. break;
  1684.     case C_CM_FR_ERROR:
  1685. tty->flip.count++;
  1686. *tty->flip.flag_buf_ptr++ = TTY_FRAME;
  1687. *tty->flip.char_buf_ptr++ = 0;
  1688. info->icount.rx++;
  1689. special_count++;
  1690. break;
  1691.     case C_CM_RXBRK:
  1692. tty->flip.count++;
  1693. *tty->flip.flag_buf_ptr++ = TTY_BREAK;
  1694. *tty->flip.char_buf_ptr++ = 0;
  1695. info->icount.rx++;
  1696. special_count++;
  1697. break;
  1698.     case C_CM_MDCD:
  1699. info->icount.dcd++;
  1700. delta_count++;
  1701. if (info->flags & ASYNC_CHECK_CD){
  1702.     if ((fw_ver > 241 ? 
  1703.   ((u_long)param) : 
  1704.   cy_readl(&ch_ctrl->rs_status)) & C_RS_DCD) {
  1705. cy_sched_event(info, Cy_EVENT_OPEN_WAKEUP);
  1706.     }else if(!((info->flags & ASYNC_CALLOUT_ACTIVE)
  1707.      &&(info->flags & ASYNC_CALLOUT_NOHUP))){
  1708. cy_sched_event(info, Cy_EVENT_HANGUP);
  1709.     }
  1710. }
  1711. break;
  1712.     case C_CM_MCTS:
  1713. info->icount.cts++;
  1714. delta_count++;
  1715. break;
  1716.     case C_CM_MRI:
  1717. info->icount.rng++;
  1718. delta_count++;
  1719. break;
  1720.     case C_CM_MDSR:
  1721. info->icount.dsr++;
  1722. delta_count++;
  1723. break;
  1724. #ifdef Z_WAKE
  1725.     case C_CM_IOCTLW:
  1726. cy_sched_event(info, Cy_EVENT_SHUTDOWN_WAKEUP);
  1727. break;
  1728. #endif
  1729. #ifdef CONFIG_CYZ_INTR
  1730.     case C_CM_RXHIWM:
  1731.     case C_CM_RXNNDT:
  1732.     case C_CM_INTBACK2:
  1733. /* Reception Interrupt */
  1734. #ifdef CY_DEBUG_INTERRUPTS
  1735. printk("cyz_interrupt: rcvd intr, card %d, port %ldnr", 
  1736. info->card, channel);
  1737. #endif
  1738. cyz_handle_rx(info, ch_ctrl, buf_ctrl);
  1739. break;
  1740.     case C_CM_TXBEMPTY:
  1741.     case C_CM_TXLOWWM:
  1742.     case C_CM_INTBACK:
  1743. /* Transmission Interrupt */
  1744. #ifdef CY_DEBUG_INTERRUPTS
  1745. printk("cyz_interrupt: xmit intr, card %d, port %ldnr", 
  1746. info->card, channel);
  1747. #endif
  1748. cyz_handle_tx(info, ch_ctrl, buf_ctrl);
  1749. break;
  1750. #endif /* CONFIG_CYZ_INTR */
  1751.     case C_CM_FATAL:
  1752. /* should do something with this !!! */
  1753. break;
  1754.     default:
  1755. break;
  1756. }
  1757. if(delta_count)
  1758.     cy_sched_event(info, Cy_EVENT_DELTA_WAKEUP);
  1759. if(special_count)
  1760.     queue_task(&tty->flip.tqueue, &tq_timer);
  1761.     }
  1762. }
  1763. #ifdef CONFIG_CYZ_INTR
  1764. static void
  1765. cyz_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  1766. {
  1767.   struct cyclades_card *cinfo;
  1768.     if((cinfo = (struct cyclades_card *)dev_id) == 0){
  1769. #ifdef CY_DEBUG_INTERRUPTS
  1770. printk("cyz_interrupt: spurious interrupt %dnr", irq);
  1771. #endif
  1772.         return; /* spurious interrupt */
  1773.     }
  1774.     if (!ISZLOADED(*cinfo)) {
  1775. #ifdef CY_DEBUG_INTERRUPTS
  1776. printk("cyz_interrupt: board not yet loaded (IRQ%d).nr", irq);
  1777. #endif
  1778. return;
  1779.     }
  1780.     /* Handle the interrupts */
  1781.     cyz_handle_cmd(cinfo);
  1782.     return;
  1783. } /* cyz_interrupt */
  1784. static void
  1785. cyz_rx_restart(unsigned long arg)
  1786. {
  1787.     struct cyclades_port *info = (struct cyclades_port *)arg;
  1788.     int retval;
  1789.     int card = info->card;
  1790.     uclong channel = (info->line) - (cy_card[card].first_line);
  1791.     unsigned long flags;
  1792.     CY_LOCK(info, flags);
  1793.     retval = cyz_issue_cmd(&cy_card[card], channel, C_CM_INTBACK2, 0L);
  1794.     if (retval != 0){
  1795. printk("cyc:cyz_rx_restart retval on ttyC%d was %xn", 
  1796.        info->line, retval);
  1797.     }
  1798.     cyz_rx_full_timer[info->line].function = NULL;
  1799.     CY_UNLOCK(info, flags);
  1800. }
  1801. #else /* CONFIG_CYZ_INTR */
  1802. static void
  1803. cyz_poll(unsigned long arg)
  1804. {
  1805.   struct cyclades_card *cinfo;
  1806.   struct cyclades_port *info;
  1807.   struct tty_struct *tty;
  1808.   static volatile struct FIRM_ID *firm_id;
  1809.   static volatile struct ZFW_CTRL *zfw_ctrl;
  1810.   static volatile struct BOARD_CTRL *board_ctrl;
  1811.   static volatile struct CH_CTRL *ch_ctrl;
  1812.   static volatile struct BUF_CTRL *buf_ctrl;
  1813.   int card, port;
  1814.     cyz_timerlist.expires = jiffies + (HZ);
  1815.     for (card = 0 ; card < NR_CARDS ; card++){
  1816. cinfo = &cy_card[card];
  1817. if (!IS_CYC_Z(*cinfo)) continue;
  1818. if (!ISZLOADED(*cinfo)) continue;
  1819. firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS);
  1820. zfw_ctrl = (struct ZFW_CTRL *)
  1821.     (cinfo->base_addr + 
  1822.      (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  1823. board_ctrl = &(zfw_ctrl->board_ctrl);
  1824. /* Skip first polling cycle to avoid racing conditions with the FW */
  1825. if (!cinfo->intr_enabled) {
  1826.     cinfo->nports = (int) cy_readl(&board_ctrl->n_channel);
  1827.     cinfo->intr_enabled = 1;
  1828.     continue;
  1829. }
  1830. cyz_handle_cmd(cinfo);
  1831. for (port = 0 ; port < cinfo->nports ; port++) {
  1832.     info = &cy_port[ port + cinfo->first_line ];
  1833.             tty = info->tty;
  1834.     ch_ctrl = &(zfw_ctrl->ch_ctrl[port]);
  1835.     buf_ctrl = &(zfw_ctrl->buf_ctrl[port]);
  1836.     cyz_handle_rx(info, ch_ctrl, buf_ctrl);
  1837.     cyz_handle_tx(info, ch_ctrl, buf_ctrl);
  1838. }
  1839. /* poll every 'cyz_polling_cycle' period */
  1840. cyz_timerlist.expires = jiffies + cyz_polling_cycle;
  1841.     }
  1842.     add_timer(&cyz_timerlist);
  1843.     return;
  1844. } /* cyz_poll */
  1845. #endif /* CONFIG_CYZ_INTR */
  1846. /********** End of block of Cyclades-Z specific code *********/
  1847. /***********************************************************/
  1848. /* This is called whenever a port becomes active;
  1849.    interrupts are enabled and DTR & RTS are turned on.
  1850.  */
  1851. static int
  1852. startup(struct cyclades_port * info)
  1853. {
  1854.   unsigned long flags;
  1855.   int retval = 0;
  1856.   unsigned char *base_addr;
  1857.   int card,chip,channel,index;
  1858.   unsigned long page;
  1859.     card = info->card;
  1860.     channel = (info->line) - (cy_card[card].first_line);
  1861.     page = get_free_page(GFP_KERNEL);
  1862.     if (!page)
  1863. return -ENOMEM;
  1864.     CY_LOCK(info, flags);
  1865.     if (info->flags & ASYNC_INITIALIZED){
  1866. free_page(page);
  1867. goto errout;
  1868.     }
  1869.     if (!info->type){
  1870.         if (info->tty){
  1871.             set_bit(TTY_IO_ERROR, &info->tty->flags);
  1872.         }
  1873. free_page(page);
  1874. goto errout;
  1875.     }
  1876.     if (info->xmit_buf)
  1877. free_page(page);
  1878.     else
  1879. info->xmit_buf = (unsigned char *) page;
  1880.     CY_UNLOCK(info, flags);
  1881.     set_line_char(info);
  1882.     if (!IS_CYC_Z(cy_card[card])) {
  1883. chip = channel>>2;
  1884. channel &= 0x03;
  1885. index = cy_card[card].bus_index;
  1886. base_addr = (unsigned char*)
  1887.    (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
  1888. #ifdef CY_DEBUG_OPEN
  1889. printk("cyc startup card %d, chip %d, channel %d, base_addr %lxn",
  1890.      card, chip, channel, (long)base_addr);/**/
  1891. #endif
  1892. CY_LOCK(info, flags);
  1893. cy_writeb((ulong)base_addr+(CyCAR<<index), (u_char)channel);
  1894. cy_writeb((ulong)base_addr+(CyRTPR<<index), (info->default_timeout
  1895.  ? info->default_timeout : 0x02)); /* 10ms rx timeout */
  1896. cyy_issue_cmd(base_addr,CyCHAN_CTL|CyENB_RCVR|CyENB_XMTR,index);
  1897. cy_writeb((ulong)base_addr+(CyCAR<<index), (u_char)channel);
  1898. cy_writeb((ulong)base_addr+(CyMSVR1<<index), CyRTS);
  1899. cy_writeb((ulong)base_addr+(CyMSVR2<<index), CyDTR);
  1900. #ifdef CY_DEBUG_DTR
  1901. printk("cyc:startup raising DTRn");
  1902. printk("     status: 0x%x, 0x%xn",
  1903. cy_readb(base_addr+(CyMSVR1<<index)), 
  1904.                 cy_readb(base_addr+(CyMSVR2<<index)));
  1905. #endif
  1906. cy_writeb((u_long)base_addr+(CySRER<<index),
  1907. cy_readb(base_addr+(CySRER<<index)) | CyRxData);
  1908. info->flags |= ASYNC_INITIALIZED;
  1909. if (info->tty){
  1910.     clear_bit(TTY_IO_ERROR, &info->tty->flags);
  1911. }
  1912. info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
  1913. info->breakon = info->breakoff = 0;
  1914. memset((char *)&info->idle_stats, 0, sizeof(info->idle_stats));
  1915. info->idle_stats.in_use    =
  1916. info->idle_stats.recv_idle =
  1917. info->idle_stats.xmit_idle = jiffies;
  1918. CY_UNLOCK(info, flags);
  1919.     } else {
  1920.       struct FIRM_ID *firm_id;
  1921.       struct ZFW_CTRL *zfw_ctrl;
  1922.       struct BOARD_CTRL *board_ctrl;
  1923.       struct CH_CTRL *ch_ctrl;
  1924.       int retval;
  1925. base_addr = (unsigned char*) (cy_card[card].base_addr);
  1926.         firm_id = (struct FIRM_ID *) (base_addr + ID_ADDRESS);
  1927.         if (!ISZLOADED(cy_card[card])){
  1928.     return -ENODEV;
  1929. }
  1930. zfw_ctrl = (struct ZFW_CTRL *)
  1931.     (cy_card[card].base_addr + 
  1932.      (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  1933. board_ctrl = &zfw_ctrl->board_ctrl;
  1934. ch_ctrl = zfw_ctrl->ch_ctrl;
  1935. #ifdef CY_DEBUG_OPEN
  1936. printk("cyc startup Z card %d, channel %d, base_addr %lxn",
  1937.      card, channel, (long)base_addr);/**/
  1938. #endif
  1939. CY_LOCK(info, flags);
  1940. cy_writel(&ch_ctrl[channel].op_mode, C_CH_ENABLE);
  1941. #ifdef Z_WAKE
  1942. #ifdef CONFIG_CYZ_INTR
  1943. cy_writel(&ch_ctrl[channel].intr_enable, 
  1944.   C_IN_TXBEMPTY|C_IN_TXLOWWM|C_IN_RXHIWM|C_IN_RXNNDT|
  1945.   C_IN_IOCTLW|
  1946.   C_IN_MDCD);
  1947. #else
  1948. cy_writel(&ch_ctrl[channel].intr_enable, 
  1949.   C_IN_IOCTLW|
  1950.   C_IN_MDCD);
  1951. #endif /* CONFIG_CYZ_INTR */
  1952. #else
  1953. #ifdef CONFIG_CYZ_INTR
  1954. cy_writel(&ch_ctrl[channel].intr_enable, 
  1955.   C_IN_TXBEMPTY|C_IN_TXLOWWM|C_IN_RXHIWM|C_IN_RXNNDT|
  1956.   C_IN_MDCD);
  1957. #else
  1958. cy_writel(&ch_ctrl[channel].intr_enable, 
  1959.   C_IN_MDCD);
  1960. #endif /* CONFIG_CYZ_INTR */
  1961. #endif /* Z_WAKE */
  1962. retval = cyz_issue_cmd(&cy_card[card], channel, C_CM_IOCTL, 0L);
  1963. if (retval != 0){
  1964.     printk("cyc:startup(1) retval on ttyC%d was %xn",
  1965.    info->line, retval);
  1966. }
  1967. /* Flush RX buffers before raising DTR and RTS */
  1968. retval = cyz_issue_cmd(&cy_card[card], channel, C_CM_FLUSH_RX, 0L);
  1969. if (retval != 0){
  1970.     printk("cyc:startup(2) retval on ttyC%d was %xn",
  1971.    info->line, retval);
  1972. }
  1973. /* set timeout !!! */
  1974. /* set RTS and DTR !!! */
  1975. cy_writel(&ch_ctrl[channel].rs_control,
  1976.              cy_readl(&ch_ctrl[channel].rs_control) | C_RS_RTS | C_RS_DTR) ;
  1977. retval = cyz_issue_cmd(&cy_card[info->card],
  1978.     channel, C_CM_IOCTLM, 0L);
  1979. if (retval != 0){
  1980.     printk("cyc:startup(3) retval on ttyC%d was %xn",
  1981.    info->line, retval);
  1982. }
  1983. #ifdef CY_DEBUG_DTR
  1984.     printk("cyc:startup raising Z DTRn");
  1985. #endif
  1986. /* enable send, recv, modem !!! */
  1987. info->flags |= ASYNC_INITIALIZED;
  1988. if (info->tty){
  1989.     clear_bit(TTY_IO_ERROR, &info->tty->flags);
  1990. }
  1991. info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
  1992. info->breakon = info->breakoff = 0;
  1993. memset((char *)&info->idle_stats, 0, sizeof(info->idle_stats));
  1994. info->idle_stats.in_use    =
  1995. info->idle_stats.recv_idle =
  1996. info->idle_stats.xmit_idle = jiffies;
  1997. CY_UNLOCK(info, flags);
  1998.     }
  1999. #ifdef CY_DEBUG_OPEN
  2000. printk(" cyc startup donen");
  2001. #endif
  2002. return 0;
  2003. errout:
  2004. CY_UNLOCK(info, flags);
  2005. return retval;
  2006. } /* startup */
  2007. static void
  2008. start_xmit( struct cyclades_port *info )
  2009. {
  2010.   unsigned long flags;
  2011.   unsigned char *base_addr;
  2012.   int card,chip,channel,index;
  2013.     card = info->card;
  2014.     channel = (info->line) - (cy_card[card].first_line);
  2015.     if (!IS_CYC_Z(cy_card[card])) {
  2016. chip = channel>>2;
  2017. channel &= 0x03;
  2018. index = cy_card[card].bus_index;
  2019. base_addr = (unsigned char*)
  2020.        (cy_card[card].base_addr
  2021.        + (cy_chip_offset[chip]<<index));
  2022. CY_LOCK(info, flags);
  2023.     cy_writeb((u_long)base_addr+(CyCAR<<index), channel);
  2024.     cy_writeb((u_long)base_addr+(CySRER<<index), 
  2025.                cy_readb(base_addr+(CySRER<<index)) | CyTxRdy);
  2026. CY_UNLOCK(info, flags);
  2027.     } else {
  2028. #ifdef CONFIG_CYZ_INTR
  2029.       int retval;
  2030. CY_LOCK(info, flags);
  2031.     retval = cyz_issue_cmd(&cy_card[card], channel, C_CM_INTBACK, 0L);
  2032.     if (retval != 0){
  2033. printk("cyc:start_xmit retval on ttyC%d was %xn",
  2034.        info->line, retval);
  2035.     }
  2036. CY_UNLOCK(info, flags);
  2037. #else /* CONFIG_CYZ_INTR */
  2038. /* Don't have to do anything at this time */
  2039. #endif /* CONFIG_CYZ_INTR */
  2040.     }
  2041. } /* start_xmit */
  2042. /*
  2043.  * This routine shuts down a serial port; interrupts are disabled,
  2044.  * and DTR is dropped if the hangup on close termio flag is on.
  2045.  */
  2046. static void
  2047. shutdown(struct cyclades_port * info)
  2048. {
  2049.   unsigned long flags;
  2050.   unsigned char *base_addr;
  2051.   int card,chip,channel,index;
  2052.     if (!(info->flags & ASYNC_INITIALIZED)){
  2053.         return;
  2054.     }
  2055.     card = info->card;
  2056.     channel = info->line - cy_card[card].first_line;
  2057.     if (!IS_CYC_Z(cy_card[card])) {
  2058. chip = channel>>2;
  2059. channel &= 0x03;
  2060. index = cy_card[card].bus_index;
  2061. base_addr = (unsigned char*)
  2062.        (cy_card[card].base_addr
  2063.        + (cy_chip_offset[chip]<<index));
  2064. #ifdef CY_DEBUG_OPEN
  2065.     printk("cyc shutdown Y card %d, chip %d, channel %d, base_addr %lxn",
  2066. card, chip, channel, (long)base_addr);
  2067. #endif
  2068. CY_LOCK(info, flags);
  2069.     /* Clear delta_msr_wait queue to avoid mem leaks. */
  2070.     wake_up_interruptible(&info->delta_msr_wait);
  2071.     if (info->xmit_buf){
  2072. unsigned char * temp;
  2073. temp = info->xmit_buf;
  2074. info->xmit_buf = 0;
  2075. free_page((unsigned long) temp);
  2076.     }
  2077.     cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  2078.     if (!info->tty || (info->tty->termios->c_cflag & HUPCL)) {
  2079. cy_writeb((u_long)base_addr+(CyMSVR1<<index), ~CyRTS);
  2080. cy_writeb((u_long)base_addr+(CyMSVR2<<index), ~CyDTR);
  2081. #ifdef CY_DEBUG_DTR
  2082. printk("cyc shutdown dropping DTRn");
  2083. printk("     status: 0x%x, 0x%xn",
  2084.     cy_readb(base_addr+(CyMSVR1<<index)), 
  2085.                     cy_readb(base_addr+(CyMSVR2<<index)));
  2086. #endif
  2087.     }
  2088.     cyy_issue_cmd(base_addr,CyCHAN_CTL|CyDIS_RCVR,index);
  2089.      /* it may be appropriate to clear _XMIT at
  2090.        some later date (after testing)!!! */
  2091.     if (info->tty){
  2092. set_bit(TTY_IO_ERROR, &info->tty->flags);
  2093.     }
  2094.     info->flags &= ~ASYNC_INITIALIZED;
  2095. CY_UNLOCK(info, flags);
  2096.     } else {
  2097.       struct FIRM_ID *firm_id;
  2098.       struct ZFW_CTRL *zfw_ctrl;
  2099.       struct BOARD_CTRL *board_ctrl;
  2100.       struct CH_CTRL *ch_ctrl;
  2101.       int retval;
  2102. base_addr = (unsigned char*) (cy_card[card].base_addr);
  2103. #ifdef CY_DEBUG_OPEN
  2104.     printk("cyc shutdown Z card %d, channel %d, base_addr %lxn",
  2105. card, channel, (long)base_addr);
  2106. #endif
  2107.         firm_id = (struct FIRM_ID *) (base_addr + ID_ADDRESS);
  2108.         if (!ISZLOADED(cy_card[card])) {
  2109.     return;
  2110. }
  2111. zfw_ctrl = (struct ZFW_CTRL *)
  2112.     (cy_card[card].base_addr + 
  2113.      (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  2114. board_ctrl = &(zfw_ctrl->board_ctrl);
  2115. ch_ctrl = zfw_ctrl->ch_ctrl;
  2116. CY_LOCK(info, flags);
  2117.     if (info->xmit_buf){
  2118. unsigned char * temp;
  2119. temp = info->xmit_buf;
  2120. info->xmit_buf = 0;
  2121. free_page((unsigned long) temp);
  2122.     }
  2123.     
  2124.     if (!info->tty || (info->tty->termios->c_cflag & HUPCL)) {
  2125. cy_writel((u_long)&ch_ctrl[channel].rs_control,
  2126.                    (uclong)(cy_readl(&ch_ctrl[channel].rs_control) & 
  2127.                    ~(C_RS_RTS | C_RS_DTR)));
  2128. retval = cyz_issue_cmd(&cy_card[info->card],
  2129. channel, C_CM_IOCTLM, 0L);
  2130. if (retval != 0){
  2131.     printk("cyc:shutdown retval on ttyC%d was %xn",
  2132.    info->line, retval);
  2133. }
  2134. #ifdef CY_DEBUG_DTR
  2135. printk("cyc:shutdown dropping Z DTRn");
  2136. #endif
  2137.     }
  2138.     
  2139.     if (info->tty){
  2140. set_bit(TTY_IO_ERROR, &info->tty->flags);
  2141.     }
  2142.     info->flags &= ~ASYNC_INITIALIZED;
  2143. CY_UNLOCK(info, flags);
  2144.     }
  2145. #ifdef CY_DEBUG_OPEN
  2146.     printk(" cyc shutdown donen");
  2147. #endif
  2148.     return;
  2149. } /* shutdown */
  2150. /*
  2151.  * ------------------------------------------------------------
  2152.  * cy_open() and friends
  2153.  * ------------------------------------------------------------
  2154.  */
  2155. static int
  2156. block_til_ready(struct tty_struct *tty, struct file * filp,
  2157.                            struct cyclades_port *info)
  2158. {
  2159.   DECLARE_WAITQUEUE(wait, current);
  2160.   struct cyclades_card *cinfo;
  2161.   unsigned long flags;
  2162.   int chip, channel,index;
  2163.   int retval;
  2164.   char *base_addr;
  2165.     cinfo = &cy_card[info->card];
  2166.     channel = info->line - cinfo->first_line;
  2167.     /*
  2168.      * If the device is in the middle of being closed, then block
  2169.      * until it's done, and then try again.
  2170.      */
  2171.     if (tty_hung_up_p(filp) || (info->flags & ASYNC_CLOSING)) {
  2172. if (info->flags & ASYNC_CLOSING) {
  2173.             interruptible_sleep_on(&info->close_wait);
  2174. }
  2175.         return ((info->flags & ASYNC_HUP_NOTIFY) ? -EAGAIN : -ERESTARTSYS);
  2176.     }
  2177.     /*
  2178.      * If this is a callout device, then just make sure the normal
  2179.      * device isn't being used.
  2180.      */
  2181.     if (tty->driver.subtype == SERIAL_TYPE_CALLOUT) {
  2182.         if (info->flags & ASYNC_NORMAL_ACTIVE){
  2183.             return -EBUSY;
  2184.         }
  2185.         if ((info->flags & ASYNC_CALLOUT_ACTIVE) &&
  2186.             (info->flags & ASYNC_SESSION_LOCKOUT) &&
  2187.             (info->session != current->session)){
  2188.             return -EBUSY;
  2189.         }
  2190.         if ((info->flags & ASYNC_CALLOUT_ACTIVE) &&
  2191.             (info->flags & ASYNC_PGRP_LOCKOUT) &&
  2192.             (info->pgrp != current->pgrp)){
  2193.             return -EBUSY;
  2194.         }
  2195.         info->flags |= ASYNC_CALLOUT_ACTIVE;
  2196.         return 0;
  2197.     }
  2198.     /*
  2199.      * If non-blocking mode is set, then make the check up front
  2200.      * and then exit.
  2201.      */
  2202.     if ((filp->f_flags & O_NONBLOCK) ||
  2203. (tty->flags & (1 << TTY_IO_ERROR))) {
  2204.         if (info->flags & ASYNC_CALLOUT_ACTIVE){
  2205.             return -EBUSY;
  2206.         }
  2207.         info->flags |= ASYNC_NORMAL_ACTIVE;
  2208.         return 0;
  2209.     }
  2210.     /*
  2211.      * Block waiting for the carrier detect and the line to become
  2212.      * free (i.e., not in use by the callout).  While we are in
  2213.      * this loop, info->count is dropped by one, so that
  2214.      * cy_close() knows when to free things.  We restore it upon
  2215.      * exit, either normal or abnormal.
  2216.      */
  2217.     retval = 0;
  2218.     add_wait_queue(&info->open_wait, &wait);
  2219. #ifdef CY_DEBUG_OPEN
  2220.     printk("cyc block_til_ready before block: ttyC%d, count = %dn",
  2221.            info->line, info->count);/**/
  2222. #endif
  2223.     CY_LOCK(info, flags);
  2224.     if (!tty_hung_up_p(filp))
  2225. info->count--;
  2226.     CY_UNLOCK(info, flags);
  2227. #ifdef CY_DEBUG_COUNT
  2228.     printk("cyc block_til_ready: (%d): decrementing count to %dn",
  2229.         current->pid, info->count);
  2230. #endif
  2231.     info->blocked_open++;
  2232.     if (!IS_CYC_Z(*cinfo)) {
  2233. chip = channel>>2;
  2234. channel &= 0x03;
  2235. index = cinfo->bus_index;
  2236. base_addr = (char *)(cinfo->base_addr
  2237.     + (cy_chip_offset[chip]<<index));
  2238. while (1) {
  2239.     CY_LOCK(info, flags);
  2240. if (!(info->flags & ASYNC_CALLOUT_ACTIVE) &&
  2241.     (tty->termios->c_cflag & CBAUD)){
  2242.     cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  2243.     cy_writeb((u_long)base_addr+(CyMSVR1<<index), CyRTS);
  2244.     cy_writeb((u_long)base_addr+(CyMSVR2<<index), CyDTR);
  2245. #ifdef CY_DEBUG_DTR
  2246.     printk("cyc:block_til_ready raising DTRn");
  2247.     printk("     status: 0x%x, 0x%xn",
  2248. cy_readb(base_addr+(CyMSVR1<<index)), 
  2249.                         cy_readb(base_addr+(CyMSVR2<<index)));
  2250. #endif
  2251. }
  2252.     CY_UNLOCK(info, flags);
  2253.     set_current_state(TASK_INTERRUPTIBLE);
  2254.     if (tty_hung_up_p(filp)
  2255.     || !(info->flags & ASYNC_INITIALIZED) ){
  2256. retval = ((info->flags & ASYNC_HUP_NOTIFY) ? 
  2257.     -EAGAIN : -ERESTARTSYS);
  2258. break;
  2259.     }
  2260.     CY_LOCK(info, flags);
  2261. cy_writeb((u_long)base_addr+(CyCAR<<index), (u_char)channel);
  2262. if (!(info->flags & ASYNC_CALLOUT_ACTIVE)
  2263. && !(info->flags & ASYNC_CLOSING)
  2264. && (C_CLOCAL(tty)
  2265.     || (cy_readb(base_addr+(CyMSVR1<<index)) & CyDCD))) {
  2266. CY_UNLOCK(info, flags);
  2267. break;
  2268. }
  2269.     CY_UNLOCK(info, flags);
  2270.     if (signal_pending(current)) {
  2271. retval = -ERESTARTSYS;
  2272. break;
  2273.     }
  2274. #ifdef CY_DEBUG_OPEN
  2275.     printk("cyc block_til_ready blocking: ttyC%d, count = %dn",
  2276.    info->line, info->count);/**/
  2277. #endif
  2278.     schedule();
  2279. }
  2280.     } else {
  2281.       struct FIRM_ID *firm_id;
  2282.       struct ZFW_CTRL *zfw_ctrl;
  2283.       struct BOARD_CTRL *board_ctrl;
  2284.       struct CH_CTRL *ch_ctrl;
  2285.       int retval;
  2286. base_addr = (char *)(cinfo->base_addr);
  2287. firm_id = (struct FIRM_ID *)
  2288. (base_addr + ID_ADDRESS);
  2289.         if (!ISZLOADED(*cinfo)){
  2290.             current->state = TASK_RUNNING;
  2291.     remove_wait_queue(&info->open_wait, &wait);
  2292.     return -EINVAL;
  2293. }
  2294. zfw_ctrl = (struct ZFW_CTRL *)
  2295.     (base_addr + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  2296. board_ctrl = &zfw_ctrl->board_ctrl;
  2297. ch_ctrl = zfw_ctrl->ch_ctrl;
  2298. while (1) {
  2299.     if (!(info->flags & ASYNC_CALLOUT_ACTIVE) &&
  2300. (tty->termios->c_cflag & CBAUD)){
  2301. cy_writel(&ch_ctrl[channel].rs_control,
  2302. cy_readl(&ch_ctrl[channel].rs_control) |
  2303. (C_RS_RTS | C_RS_DTR));
  2304. retval = cyz_issue_cmd(&cy_card[info->card],
  2305.        channel, C_CM_IOCTLM, 0L);
  2306. if (retval != 0){
  2307.     printk("cyc:block_til_ready retval on ttyC%d was %xn",
  2308.    info->line, retval);
  2309. }
  2310. #ifdef CY_DEBUG_DTR
  2311. printk("cyc:block_til_ready raising Z DTRn");
  2312. #endif
  2313.     }
  2314.     set_current_state(TASK_INTERRUPTIBLE);
  2315.     if (tty_hung_up_p(filp)
  2316.     || !(info->flags & ASYNC_INITIALIZED) ){
  2317. retval = ((info->flags & ASYNC_HUP_NOTIFY) ?
  2318.     -EAGAIN : -ERESTARTSYS);
  2319. break;
  2320.     }
  2321.     if (!(info->flags & ASYNC_CALLOUT_ACTIVE)
  2322.     && !(info->flags & ASYNC_CLOSING)
  2323.     && (C_CLOCAL(tty)
  2324.       || (cy_readl(&ch_ctrl[channel].rs_status) & C_RS_DCD))) {
  2325. break;
  2326.     }
  2327.     if (signal_pending(current)) {
  2328. retval = -ERESTARTSYS;
  2329. break;
  2330.     }
  2331. #ifdef CY_DEBUG_OPEN
  2332.     printk("cyc block_til_ready blocking: ttyC%d, count = %dn",
  2333.    info->line, info->count);/**/
  2334. #endif
  2335.     schedule();
  2336. }
  2337.     }
  2338.     current->state = TASK_RUNNING;
  2339.     remove_wait_queue(&info->open_wait, &wait);
  2340.     if (!tty_hung_up_p(filp)){
  2341. info->count++;
  2342. #ifdef CY_DEBUG_COUNT
  2343. printk("cyc:block_til_ready (%d): incrementing count to %dn",
  2344.     current->pid, info->count);
  2345. #endif
  2346.     }
  2347.     info->blocked_open--;
  2348. #ifdef CY_DEBUG_OPEN
  2349.     printk("cyc:block_til_ready after blocking: ttyC%d, count = %dn",
  2350.    info->line, info->count);/**/
  2351. #endif
  2352.     if (retval)
  2353. return retval;
  2354.     info->flags |= ASYNC_NORMAL_ACTIVE;
  2355.     return 0;
  2356. } /* block_til_ready */
  2357. /*
  2358.  * This routine is called whenever a serial port is opened.  It
  2359.  * performs the serial-specific initialization for the tty structure.
  2360.  */
  2361. static int
  2362. cy_open(struct tty_struct *tty, struct file * filp)
  2363. {
  2364.   struct cyclades_port  *info;
  2365.   int retval, line;
  2366.   unsigned long page;
  2367.     MOD_INC_USE_COUNT;
  2368.     line = MINOR(tty->device) - tty->driver.minor_start;
  2369.     if ((line < 0) || (NR_PORTS <= line)){
  2370. MOD_DEC_USE_COUNT;
  2371.         return -ENODEV;
  2372.     }
  2373.     info = &cy_port[line];
  2374.     if (info->line < 0){
  2375. MOD_DEC_USE_COUNT;
  2376.         return -ENODEV;
  2377.     }
  2378.     
  2379.     /* If the card's firmware hasn't been loaded,
  2380.        treat it as absent from the system.  This
  2381.        will make the user pay attention.
  2382.     */
  2383.     if (IS_CYC_Z(cy_card[info->card])) {
  2384.         if (!ISZLOADED(cy_card[info->card])) {
  2385.     if (((ZE_V1 ==cy_readl(&((struct RUNTIME_9060 *)
  2386. ((cy_card[info->card]).ctl_addr))->mail_box_0)) &&
  2387. Z_FPGA_CHECK(cy_card[info->card])) &&
  2388. (ZFIRM_HLT==cy_readl(&((struct FIRM_ID *)
  2389. ((cy_card[info->card]).base_addr+ID_ADDRESS))->signature)))
  2390.     {
  2391. printk ("cyc:Cyclades-Z Error: you need an external power supply for this number of ports.nrFirmware halted.rn");
  2392.     } else {
  2393. printk("cyc:Cyclades-Z firmware not yet loadedn");
  2394.     }
  2395.     MOD_DEC_USE_COUNT;
  2396.     return -ENODEV;
  2397. }
  2398. #ifdef CONFIG_CYZ_INTR
  2399. else {
  2400.     /* In case this Z board is operating in interrupt mode, its 
  2401.        interrupts should be enabled as soon as the first open happens 
  2402.        to one of its ports. */
  2403.     if (!cy_card[info->card].intr_enabled) {
  2404. /* Enable interrupts on the PLX chip */
  2405. cy_writew(cy_card[info->card].ctl_addr+0x68,
  2406. cy_readw(cy_card[info->card].ctl_addr+0x68)|0x0900);
  2407. /* Enable interrupts on the FW */
  2408. retval = cyz_issue_cmd(&cy_card[info->card], 
  2409. 0, C_CM_IRQ_ENBL, 0L);
  2410. if (retval != 0){
  2411.     printk("cyc:IRQ enable retval was %xn", retval);
  2412. }
  2413. cy_card[info->card].intr_enabled = 1;
  2414.     }
  2415. }
  2416. #endif /* CONFIG_CYZ_INTR */
  2417.     }
  2418. #ifdef CY_DEBUG_OTHER
  2419.     printk("cyc:cy_open ttyC%dn", info->line); /* */
  2420. #endif
  2421.     tty->driver_data = info;
  2422.     info->tty = tty;
  2423.     if (serial_paranoia_check(info, tty->device, "cy_open")){
  2424.         return -ENODEV;
  2425.     }
  2426. #ifdef CY_DEBUG_OPEN
  2427.     printk("cyc:cy_open ttyC%d, count = %dn",
  2428.         info->line, info->count);/**/
  2429. #endif
  2430.     info->count++;
  2431. #ifdef CY_DEBUG_COUNT
  2432.     printk("cyc:cy_open (%d): incrementing count to %dn",
  2433.         current->pid, info->count);
  2434. #endif
  2435.     if (!tmp_buf) {
  2436. page = get_free_page(GFP_KERNEL);
  2437. if (!page)
  2438.     return -ENOMEM;
  2439. if (tmp_buf)
  2440.     free_page(page);
  2441. else
  2442.     tmp_buf = (unsigned char *) page;
  2443.     }
  2444.     /*
  2445.      * If the port is the middle of closing, bail out now
  2446.      */
  2447.     if (tty_hung_up_p(filp) || (info->flags & ASYNC_CLOSING)) {
  2448. if (info->flags & ASYNC_CLOSING)
  2449.     interruptible_sleep_on(&info->close_wait);
  2450. return ((info->flags & ASYNC_HUP_NOTIFY) ? -EAGAIN : -ERESTARTSYS);
  2451.     }
  2452.     /*
  2453.      * Start up serial port
  2454.      */
  2455.     retval = startup(info);
  2456.     if (retval){
  2457.         return retval;
  2458.     }
  2459.     retval = block_til_ready(tty, filp, info);
  2460.     if (retval) {
  2461. #ifdef CY_DEBUG_OPEN
  2462.         printk("cyc:cy_open returning after block_til_ready with %dn",
  2463.                retval);
  2464. #endif
  2465.         return retval;
  2466.     }
  2467.     if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) {
  2468.         if (tty->driver.subtype == SERIAL_TYPE_NORMAL)
  2469.             *tty->termios = info->normal_termios;
  2470.         else 
  2471.             *tty->termios = info->callout_termios;
  2472.     }
  2473.     info->session = current->session;
  2474.     info->pgrp = current->pgrp;
  2475. #ifdef CY_DEBUG_OPEN
  2476.     printk(" cyc:cy_open donen");/**/
  2477. #endif
  2478.     return 0;
  2479. } /* cy_open */
  2480. /*
  2481.  * cy_wait_until_sent() --- wait until the transmitter is empty
  2482.  */
  2483. static void 
  2484. cy_wait_until_sent(struct tty_struct *tty, int timeout)
  2485. {
  2486.   struct cyclades_port * info = (struct cyclades_port *)tty->driver_data;
  2487.   unsigned char *base_addr;
  2488.   int card,chip,channel,index;
  2489.   unsigned long orig_jiffies, char_time;
  2490.     if (serial_paranoia_check(info, tty->device, "cy_wait_until_sent"))
  2491. return;
  2492.     if (info->xmit_fifo_size == 0)
  2493. return; /* Just in case.... */
  2494.     orig_jiffies = jiffies;
  2495.     /*
  2496.      * Set the check interval to be 1/5 of the estimated time to
  2497.      * send a single character, and make it at least 1.  The check
  2498.      * interval should also be less than the timeout.
  2499.      * 
  2500.      * Note: we have to use pretty tight timings here to satisfy
  2501.      * the NIST-PCTS.
  2502.      */
  2503.     char_time = (info->timeout - HZ/50) / info->xmit_fifo_size;
  2504.     char_time = char_time / 5;
  2505.     if (char_time == 0)
  2506. char_time = 1;
  2507.     if (timeout < 0)
  2508. timeout = 0;
  2509.     if (timeout)
  2510. char_time = MIN(char_time, timeout);
  2511.     /*
  2512.      * If the transmitter hasn't cleared in twice the approximate
  2513.      * amount of time to send the entire FIFO, it probably won't
  2514.      * ever clear.  This assumes the UART isn't doing flow
  2515.      * control, which is currently the case.  Hence, if it ever
  2516.      * takes longer than info->timeout, this is probably due to a
  2517.      * UART bug of some kind.  So, we clamp the timeout parameter at
  2518.      * 2*info->timeout.
  2519.      */
  2520.     if (!timeout || timeout > 2*info->timeout)
  2521. timeout = 2*info->timeout;
  2522. #ifdef CY_DEBUG_WAIT_UNTIL_SENT
  2523.     printk("In cy_wait_until_sent(%d) check=%lu...", timeout, char_time);
  2524.     printk("jiff=%lu...", jiffies);
  2525. #endif
  2526.     card = info->card;
  2527.     channel = (info->line) - (cy_card[card].first_line);
  2528.     if (!IS_CYC_Z(cy_card[card])) {
  2529. chip = channel>>2;
  2530. channel &= 0x03;
  2531. index = cy_card[card].bus_index;
  2532. base_addr = (unsigned char *)
  2533. (cy_card[card].base_addr + (cy_chip_offset[chip]<<index));
  2534. while (cy_readb(base_addr+(CySRER<<index)) & CyTxRdy) {
  2535. #ifdef CY_DEBUG_WAIT_UNTIL_SENT
  2536.     printk("Not clean (jiff=%lu)...", jiffies);
  2537. #endif
  2538.     current->state = TASK_INTERRUPTIBLE;
  2539.     schedule_timeout(char_time);
  2540.     if (signal_pending(current))
  2541. break;
  2542.     if (timeout && time_after(jiffies, orig_jiffies + timeout))
  2543. break;
  2544. }
  2545. current->state = TASK_RUNNING;
  2546.     } else {
  2547. // Nothing to do!
  2548.     }
  2549.     /* Run one more char cycle */
  2550.     current->state = TASK_INTERRUPTIBLE;
  2551.     schedule_timeout(char_time * 5);
  2552.     current->state = TASK_RUNNING;
  2553. #ifdef CY_DEBUG_WAIT_UNTIL_SENT
  2554.     printk("Clean (jiff=%lu)...donen", jiffies);
  2555. #endif
  2556. }
  2557. /*
  2558.  * This routine is called when a particular tty device is closed.
  2559.  */
  2560. static void
  2561. cy_close(struct tty_struct *tty, struct file *filp)
  2562. {
  2563.   struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
  2564.   unsigned long flags;
  2565. #ifdef CY_DEBUG_OTHER
  2566.     printk("cyc:cy_close ttyC%dn", info->line);
  2567. #endif
  2568.     if (!info || serial_paranoia_check(info, tty->device, "cy_close")){
  2569.         return;
  2570.     }
  2571.     CY_LOCK(info, flags);
  2572.     /* If the TTY is being hung up, nothing to do */
  2573.     if (tty_hung_up_p(filp)) {
  2574. MOD_DEC_USE_COUNT;
  2575. CY_UNLOCK(info, flags);
  2576.         return;
  2577.     }
  2578.         
  2579. #ifdef CY_DEBUG_OPEN
  2580.     printk("cyc:cy_close ttyC%d, count = %dn", info->line, info->count);
  2581. #endif
  2582.     if ((tty->count == 1) && (info->count != 1)) {
  2583.         /*
  2584.          * Uh, oh.  tty->count is 1, which means that the tty
  2585.          * structure will be freed.  Info->count should always
  2586.          * be one in these conditions.  If it's greater than
  2587.          * one, we've got real problems, since it means the
  2588.          * serial port won't be shutdown.
  2589.          */
  2590.         printk("cyc:cy_close: bad serial port count; tty->count is 1, "
  2591.            "info->count is %dn", info->count);
  2592.         info->count = 1;
  2593.     }
  2594. #ifdef CY_DEBUG_COUNT
  2595.     printk("cyc:cy_close at (%d): decrementing count to %dn",
  2596.         current->pid, info->count - 1);
  2597. #endif
  2598.     if (--info->count < 0) {
  2599. #ifdef CY_DEBUG_COUNT
  2600.     printk("cyc:cyc_close setting count to 0n");
  2601. #endif
  2602.         info->count = 0;
  2603.     }
  2604.     if (info->count) {
  2605. MOD_DEC_USE_COUNT;
  2606. CY_UNLOCK(info, flags);
  2607.         return;
  2608.     }
  2609.     info->flags |= ASYNC_CLOSING;
  2610.     /*
  2611.      * Save the termios structure, since this port may have
  2612.      * separate termios for callout and dialin.
  2613.      */
  2614.     if (info->flags & ASYNC_NORMAL_ACTIVE)
  2615.         info->normal_termios = *tty->termios;
  2616.     if (info->flags & ASYNC_CALLOUT_ACTIVE)
  2617.         info->callout_termios = *tty->termios;
  2618.     /*
  2619.     * Now we wait for the transmit buffer to clear; and we notify
  2620.     * the line discipline to only process XON/XOFF characters.
  2621.     */
  2622.     tty->closing = 1;
  2623.     CY_UNLOCK(info, flags);
  2624.     if (info->closing_wait != CY_CLOSING_WAIT_NONE) {
  2625. tty_wait_until_sent(tty, info->closing_wait);
  2626.     }
  2627.     CY_LOCK(info, flags);
  2628.     if (!IS_CYC_Z(cy_card[info->card])) {
  2629. int channel = info->line - cy_card[info->card].first_line;
  2630. int index = cy_card[info->card].bus_index;
  2631. unsigned char *base_addr = (unsigned char *)
  2632. (cy_card[info->card].base_addr +
  2633.  (cy_chip_offset[channel>>2] <<index));
  2634. /* Stop accepting input */
  2635. channel &= 0x03;
  2636. cy_writeb((ulong)base_addr+(CyCAR<<index), (u_char)channel);
  2637. cy_writeb((u_long)base_addr+(CySRER<<index),
  2638. cy_readb(base_addr+(CySRER<<index)) & ~CyRxData);
  2639. if (info->flags & ASYNC_INITIALIZED) {
  2640.     /* Waiting for on-board buffers to be empty before closing 
  2641.        the port */
  2642.     CY_UNLOCK(info, flags);
  2643.     cy_wait_until_sent(tty, info->timeout);
  2644.     CY_LOCK(info, flags);
  2645. }
  2646.     } else {
  2647. #ifdef Z_WAKE
  2648. /* Waiting for on-board buffers to be empty before closing the port */
  2649. unsigned char *base_addr = (unsigned char *) 
  2650. cy_card[info->card].base_addr;
  2651. struct FIRM_ID *firm_id = (struct FIRM_ID *) (base_addr + ID_ADDRESS);
  2652. struct ZFW_CTRL *zfw_ctrl = (struct ZFW_CTRL *)
  2653. (base_addr + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff));
  2654. struct CH_CTRL *ch_ctrl = zfw_ctrl->ch_ctrl;
  2655. int channel = info->line - cy_card[info->card].first_line;
  2656. int retval;
  2657. if (cy_readl(&ch_ctrl[channel].flow_status) != C_FS_TXIDLE) {
  2658.     retval = cyz_issue_cmd(&cy_card[info->card], channel, 
  2659.    C_CM_IOCTLW, 0L);
  2660.     if (retval != 0){
  2661. printk("cyc:cy_close retval on ttyC%d was %xn",
  2662.        info->line, retval);
  2663.     }
  2664.     CY_UNLOCK(info, flags);
  2665.     interruptible_sleep_on(&info->shutdown_wait);
  2666.     CY_LOCK(info, flags);
  2667. }
  2668. #endif
  2669.     }
  2670.     CY_UNLOCK(info, flags);
  2671.     shutdown(info);
  2672.     if (tty->driver.flush_buffer)
  2673.         tty->driver.flush_buffer(tty);
  2674.     if (tty->ldisc.flush_buffer)
  2675.         tty->ldisc.flush_buffer(tty);
  2676.     CY_LOCK(info, flags);
  2677.     tty->closing = 0;
  2678.     info->event = 0;
  2679.     info->tty = 0;