add the IDE device ID for ATI SB700
[linux-2.6] / drivers / char / cyclades.c
1 #undef  BLOCKMOVE
2 #define Z_WAKE
3 #undef  Z_EXT_CHARS_IN_BUFFER
4
5 /*
6  *  linux/drivers/char/cyclades.c
7  *
8  * This file contains the driver for the Cyclades async multiport
9  * serial boards.
10  *
11  * Initially written by Randolph Bentson <bentson@grieg.seaslug.org>.
12  * Modified and maintained by Marcio Saito <marcio@cyclades.com>.
13  *
14  * Copyright (C) 2007 Jiri Slaby <jirislaby@gmail.com>
15  *
16  * Much of the design and some of the code came from serial.c
17  * which was copyright (C) 1991, 1992  Linus Torvalds.  It was
18  * extensively rewritten by Theodore Ts'o, 8/16/92 -- 9/14/92,
19  * and then fixed as suggested by Michael K. Johnson 12/12/92.
20  * Converted to pci probing and cleaned up by Jiri Slaby.
21  *
22  * This version supports shared IRQ's (only for PCI boards).
23  *
24  * $Log: cyclades.c,v $
25  * Prevent users from opening non-existing Z ports.
26  *
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 occurrence 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 explicitly
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
593 #define CY_VERSION      "2.5"
594
595 /* If you need to install more boards than NR_CARDS, change the constant
596    in the definition below. No other change is necessary to support up to
597    eight boards. Beyond that you'll have to extend cy_isa_addresses. */
598
599 #define NR_CARDS        4
600
601 /*
602    If the total number of ports is larger than NR_PORTS, change this
603    constant in the definition below. No other change is necessary to
604    support more boards/ports. */
605
606 #define NR_PORTS        256
607
608 #define ZE_V1_NPORTS    64
609 #define ZO_V1   0
610 #define ZO_V2   1
611 #define ZE_V1   2
612
613 #define SERIAL_PARANOIA_CHECK
614 #undef  CY_DEBUG_OPEN
615 #undef  CY_DEBUG_THROTTLE
616 #undef  CY_DEBUG_OTHER
617 #undef  CY_DEBUG_IO
618 #undef  CY_DEBUG_COUNT
619 #undef  CY_DEBUG_DTR
620 #undef  CY_DEBUG_WAIT_UNTIL_SENT
621 #undef  CY_DEBUG_INTERRUPTS
622 #undef  CY_16Y_HACK
623 #undef  CY_ENABLE_MONITORING
624 #undef  CY_PCI_DEBUG
625
626 /*
627  * Include section 
628  */
629 #include <linux/module.h>
630 #include <linux/errno.h>
631 #include <linux/signal.h>
632 #include <linux/sched.h>
633 #include <linux/timer.h>
634 #include <linux/interrupt.h>
635 #include <linux/tty.h>
636 #include <linux/tty_flip.h>
637 #include <linux/serial.h>
638 #include <linux/major.h>
639 #include <linux/string.h>
640 #include <linux/fcntl.h>
641 #include <linux/ptrace.h>
642 #include <linux/cyclades.h>
643 #include <linux/mm.h>
644 #include <linux/ioport.h>
645 #include <linux/init.h>
646 #include <linux/delay.h>
647 #include <linux/spinlock.h>
648 #include <linux/bitops.h>
649
650 #include <asm/system.h>
651 #include <asm/io.h>
652 #include <asm/irq.h>
653 #include <asm/uaccess.h>
654
655 #include <linux/kernel.h>
656 #include <linux/pci.h>
657
658 #include <linux/stat.h>
659 #include <linux/proc_fs.h>
660
661 static void cy_throttle(struct tty_struct *tty);
662 static void cy_send_xchar(struct tty_struct *tty, char ch);
663
664 #define IS_CYC_Z(card) ((card).num_chips == -1)
665
666 #define Z_FPGA_CHECK(card) \
667         ((readl(&((struct RUNTIME_9060 __iomem *) \
668                 ((card).ctl_addr))->init_ctrl) & (1<<17)) != 0)
669
670 #define ISZLOADED(card) (((ZO_V1==readl(&((struct RUNTIME_9060 __iomem *) \
671                         ((card).ctl_addr))->mail_box_0)) || \
672                         Z_FPGA_CHECK(card)) && \
673                         (ZFIRM_ID==readl(&((struct FIRM_ID __iomem *) \
674                         ((card).base_addr+ID_ADDRESS))->signature)))
675
676 #ifndef SERIAL_XMIT_SIZE
677 #define SERIAL_XMIT_SIZE        (min(PAGE_SIZE, 4096))
678 #endif
679 #define WAKEUP_CHARS            256
680
681 #define STD_COM_FLAGS (0)
682
683 static struct tty_driver *cy_serial_driver;
684
685 #ifdef CONFIG_ISA
686 /* This is the address lookup table. The driver will probe for
687    Cyclom-Y/ISA boards at all addresses in here. If you want the
688    driver to probe addresses at a different address, add it to
689    this table.  If the driver is probing some other board and
690    causing problems, remove the offending address from this table.
691    The cy_setup function extracts additional addresses from the
692    boot options line.  The form is "cyclades=address,address..."
693 */
694
695 static unsigned int cy_isa_addresses[] = {
696         0xD0000,
697         0xD2000,
698         0xD4000,
699         0xD6000,
700         0xD8000,
701         0xDA000,
702         0xDC000,
703         0xDE000,
704         0, 0, 0, 0, 0, 0, 0, 0
705 };
706
707 #define NR_ISA_ADDRS ARRAY_SIZE(cy_isa_addresses)
708
709 #ifdef MODULE
710 static long maddr[NR_CARDS];
711 static int irq[NR_CARDS];
712
713 module_param_array(maddr, long, NULL, 0);
714 module_param_array(irq, int, NULL, 0);
715 #endif
716
717 #endif                          /* CONFIG_ISA */
718
719 /* This is the per-card data structure containing address, irq, number of
720    channels, etc. This driver supports a maximum of NR_CARDS cards.
721 */
722 static struct cyclades_card cy_card[NR_CARDS];
723
724 static int cy_next_channel;     /* next minor available */
725
726 /*
727  * This is used to look up the divisor speeds and the timeouts
728  * We're normally limited to 15 distinct baud rates.  The extra
729  * are accessed via settings in info->flags.
730  *      0,     1,     2,     3,     4,     5,     6,     7,     8,     9,
731  *     10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
732  *                                               HI            VHI
733  *     20
734  */
735 static int baud_table[] = {
736         0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
737         1800, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200, 150000,
738         230400, 0
739 };
740
741 static char baud_co_25[] = {    /* 25 MHz clock option table */
742         /* value =>    00    01   02    03    04 */
743         /* divide by    8    32   128   512  2048 */
744         0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02,
745         0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
746 };
747
748 static char baud_bpr_25[] = {   /* 25 MHz baud rate period table */
749         0x00, 0xf5, 0xa3, 0x6f, 0x5c, 0x51, 0xf5, 0xa3, 0x51, 0xa3,
750         0x6d, 0x51, 0xa3, 0x51, 0xa3, 0x51, 0x36, 0x29, 0x1b, 0x15
751 };
752
753 static char baud_co_60[] = {    /* 60 MHz clock option table (CD1400 J) */
754         /* value =>    00    01   02    03    04 */
755         /* divide by    8    32   128   512  2048 */
756         0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03,
757         0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
758         0x00
759 };
760
761 static char baud_bpr_60[] = {   /* 60 MHz baud rate period table (CD1400 J) */
762         0x00, 0x82, 0x21, 0xff, 0xdb, 0xc3, 0x92, 0x62, 0xc3, 0x62,
763         0x41, 0xc3, 0x62, 0xc3, 0x62, 0xc3, 0x82, 0x62, 0x41, 0x32,
764         0x21
765 };
766
767 static char baud_cor3[] = {     /* receive threshold */
768         0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
769         0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07,
770         0x07
771 };
772
773 /*
774  * The Cyclades driver implements HW flow control as any serial driver.
775  * The cyclades_port structure member rflow and the vector rflow_thr 
776  * allows us to take advantage of a special feature in the CD1400 to avoid 
777  * data loss even when the system interrupt latency is too high. These flags 
778  * are to be used only with very special applications. Setting these flags 
779  * requires the use of a special cable (DTR and RTS reversed). In the new 
780  * CD1400-based boards (rev. 6.00 or later), there is no need for special 
781  * cables.
782  */
783
784 static char rflow_thr[] = {     /* rflow threshold */
785         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
786         0x00, 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
787         0x0a
788 };
789
790 /*  The Cyclom-Ye has placed the sequential chips in non-sequential
791  *  address order.  This look-up table overcomes that problem.
792  */
793 static int cy_chip_offset[] = { 0x0000,
794         0x0400,
795         0x0800,
796         0x0C00,
797         0x0200,
798         0x0600,
799         0x0A00,
800         0x0E00
801 };
802
803 /* PCI related definitions */
804
805 #ifdef CONFIG_PCI
806 static struct pci_device_id cy_pci_dev_id[] __devinitdata = {
807         { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Y_Lo) },      /* PCI < 1Mb */
808         { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Y_Hi) },      /* PCI > 1Mb */
809         { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_4Y_Lo) },     /* 4Y PCI < 1Mb */
810         { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_4Y_Hi) },     /* 4Y PCI > 1Mb */
811         { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_8Y_Lo) },     /* 8Y PCI < 1Mb */
812         { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_8Y_Hi) },     /* 8Y PCI > 1Mb */
813         { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Z_Lo) },      /* Z PCI < 1Mb */
814         { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Z_Hi) },      /* Z PCI > 1Mb */
815         { }                     /* end of table */
816 };
817 MODULE_DEVICE_TABLE(pci, cy_pci_dev_id);
818 #endif
819
820 static void cy_start(struct tty_struct *);
821 static void set_line_char(struct cyclades_port *);
822 static int cyz_issue_cmd(struct cyclades_card *, __u32, __u8, __u32);
823 #ifdef CONFIG_ISA
824 static unsigned detect_isa_irq(void __iomem *);
825 #endif                          /* CONFIG_ISA */
826
827 static int cyclades_get_proc_info(char *, char **, off_t, int, int *, void *);
828
829 #ifndef CONFIG_CYZ_INTR
830 static void cyz_poll(unsigned long);
831
832 /* The Cyclades-Z polling cycle is defined by this variable */
833 static long cyz_polling_cycle = CZ_DEF_POLL;
834
835 static DEFINE_TIMER(cyz_timerlist, cyz_poll, 0, 0);
836
837 #else                           /* CONFIG_CYZ_INTR */
838 static void cyz_rx_restart(unsigned long);
839 static struct timer_list cyz_rx_full_timer[NR_PORTS];
840 #endif                          /* CONFIG_CYZ_INTR */
841
842 static inline int serial_paranoia_check(struct cyclades_port *info,
843                 char *name, const char *routine)
844 {
845 #ifdef SERIAL_PARANOIA_CHECK
846         if (!info) {
847                 printk(KERN_WARNING "cyc Warning: null cyclades_port for (%s) "
848                                 "in %s\n", name, routine);
849                 return 1;
850         }
851
852         if (info->magic != CYCLADES_MAGIC) {
853                 printk(KERN_WARNING "cyc Warning: bad magic number for serial "
854                                 "struct (%s) in %s\n", name, routine);
855                 return 1;
856         }
857 #endif
858         return 0;
859 }                               /* serial_paranoia_check */
860
861 /*
862  * This routine is used by the interrupt handler to schedule
863  * processing in the software interrupt portion of the driver
864  * (also known as the "bottom half").  This can be called any
865  * number of times for any channel without harm.
866  */
867 static inline void cy_sched_event(struct cyclades_port *info, int event)
868 {
869         info->event |= 1 << event; /* remember what kind of event and who */
870         schedule_work(&info->tqueue);
871 }                               /* cy_sched_event */
872
873 /*
874  * This routine is used to handle the "bottom half" processing for the
875  * serial driver, known also the "software interrupt" processing.
876  * This processing is done at the kernel interrupt level, after the
877  * cy#/_interrupt() has returned, BUT WITH INTERRUPTS TURNED ON.  This
878  * is where time-consuming activities which can not be done in the
879  * interrupt driver proper are done; the interrupt driver schedules
880  * them using cy_sched_event(), and they get done here.
881  *
882  * This is done through one level of indirection--the task queue.
883  * When a hardware interrupt service routine wants service by the
884  * driver's bottom half, it enqueues the appropriate tq_struct (one
885  * per port) to the keventd work queue and sets a request flag
886  * that the work queue be processed.
887  *
888  * Although this may seem unwieldy, it gives the system a way to
889  * pass an argument (in this case the pointer to the cyclades_port
890  * structure) to the bottom half of the driver.  Previous kernels
891  * had to poll every port to see if that port needed servicing.
892  */
893 static void
894 do_softint(struct work_struct *work)
895 {
896         struct cyclades_port *info =
897                 container_of(work, struct cyclades_port, tqueue);
898         struct tty_struct    *tty;
899
900         tty = info->tty;
901         if (!tty)
902                 return;
903
904         if (test_and_clear_bit(Cy_EVENT_HANGUP, &info->event)) {
905                 tty_hangup(info->tty);
906                 wake_up_interruptible(&info->open_wait);
907                         info->flags &= ~ASYNC_NORMAL_ACTIVE;
908         }
909         if (test_and_clear_bit(Cy_EVENT_OPEN_WAKEUP, &info->event))
910                 wake_up_interruptible(&info->open_wait);
911 #ifdef CONFIG_CYZ_INTR
912         if (test_and_clear_bit(Cy_EVENT_Z_RX_FULL, &info->event) &&
913                         !timer_pending(&cyz_rx_full_timer[info->line]))
914                 mod_timer(&cyz_rx_full_timer[info->line], jiffies + 1);
915 #endif
916         if (test_and_clear_bit(Cy_EVENT_DELTA_WAKEUP, &info->event))
917                 wake_up_interruptible(&info->delta_msr_wait);
918         tty_wakeup(tty);
919 #ifdef Z_WAKE
920         if (test_and_clear_bit(Cy_EVENT_SHUTDOWN_WAKEUP, &info->event))
921                 complete(&info->shutdown_wait);
922 #endif
923 } /* do_softint */
924
925
926 /***********************************************************/
927 /********* Start of block of Cyclom-Y specific code ********/
928
929 /* This routine waits up to 1000 micro-seconds for the previous
930    command to the Cirrus chip to complete and then issues the
931    new command.  An error is returned if the previous command
932    didn't finish within the time limit.
933
934    This function is only called from inside spinlock-protected code.
935  */
936 static int cyy_issue_cmd(void __iomem * base_addr, u_char cmd, int index)
937 {
938         unsigned int i;
939
940         /* Check to see that the previous command has completed */
941         for (i = 0; i < 100; i++) {
942                 if (readb(base_addr + (CyCCR << index)) == 0) {
943                         break;
944                 }
945                 udelay(10L);
946         }
947         /* if the CCR never cleared, the previous command
948            didn't finish within the "reasonable time" */
949         if (i == 100)
950                 return -1;
951
952         /* Issue the new command */
953         cy_writeb(base_addr + (CyCCR << index), cmd);
954
955         return 0;
956 }                               /* cyy_issue_cmd */
957
958 #ifdef CONFIG_ISA
959 /* ISA interrupt detection code */
960 static unsigned detect_isa_irq(void __iomem * address)
961 {
962         int irq;
963         unsigned long irqs, flags;
964         int save_xir, save_car;
965         int index = 0;          /* IRQ probing is only for ISA */
966
967         /* forget possible initially masked and pending IRQ */
968         irq = probe_irq_off(probe_irq_on());
969
970         /* Clear interrupts on the board first */
971         cy_writeb(address + (Cy_ClrIntr << index), 0);
972         /* Cy_ClrIntr is 0x1800 */
973
974         irqs = probe_irq_on();
975         /* Wait ... */
976         udelay(5000L);
977
978         /* Enable the Tx interrupts on the CD1400 */
979         local_irq_save(flags);
980         cy_writeb(address + (CyCAR << index), 0);
981         cyy_issue_cmd(address, CyCHAN_CTL | CyENB_XMTR, index);
982
983         cy_writeb(address + (CyCAR << index), 0);
984         cy_writeb(address + (CySRER << index),
985                   readb(address + (CySRER << index)) | CyTxRdy);
986         local_irq_restore(flags);
987
988         /* Wait ... */
989         udelay(5000L);
990
991         /* Check which interrupt is in use */
992         irq = probe_irq_off(irqs);
993
994         /* Clean up */
995         save_xir = (u_char) readb(address + (CyTIR << index));
996         save_car = readb(address + (CyCAR << index));
997         cy_writeb(address + (CyCAR << index), (save_xir & 0x3));
998         cy_writeb(address + (CySRER << index),
999                   readb(address + (CySRER << index)) & ~CyTxRdy);
1000         cy_writeb(address + (CyTIR << index), (save_xir & 0x3f));
1001         cy_writeb(address + (CyCAR << index), (save_car));
1002         cy_writeb(address + (Cy_ClrIntr << index), 0);
1003         /* Cy_ClrIntr is 0x1800 */
1004
1005         return (irq > 0) ? irq : 0;
1006 }
1007 #endif                          /* CONFIG_ISA */
1008
1009 static void cyy_intr_chip(struct cyclades_card *cinfo, int chip,
1010                         void __iomem * base_addr, int status, int index)
1011 {
1012         struct cyclades_port *info;
1013         struct tty_struct *tty;
1014         int char_count;
1015         int j, len, mdm_change, mdm_status, outch;
1016         int save_xir, channel, save_car;
1017         char data;
1018
1019         if (status & CySRReceive) {     /* reception interrupt */
1020 #ifdef CY_DEBUG_INTERRUPTS
1021                 printk(KERN_DEBUG "cyy_interrupt: rcvd intr, chip %d\n", chip);
1022 #endif
1023                 /* determine the channel & change to that context */
1024                 spin_lock(&cinfo->card_lock);
1025                 save_xir = (u_char) readb(base_addr + (CyRIR << index));
1026                 channel = (u_short) (save_xir & CyIRChannel);
1027                 info = &cinfo->ports[channel + chip * 4];
1028                 save_car = readb(base_addr + (CyCAR << index));
1029                 cy_writeb(base_addr + (CyCAR << index), save_xir);
1030
1031                 /* if there is nowhere to put the data, discard it */
1032                 if (info->tty == NULL) {
1033                         j = (readb(base_addr + (CyRIVR << index)) &
1034                                 CyIVRMask);
1035                         if (j == CyIVRRxEx) {   /* exception */
1036                                 data = readb(base_addr + (CyRDSR << index));
1037                         } else {        /* normal character reception */
1038                                 char_count = readb(base_addr +
1039                                                 (CyRDCR << index));
1040                                 while (char_count--) {
1041                                         data = readb(base_addr +
1042                                                 (CyRDSR << index));
1043                                 }
1044                         }
1045                 } else {        /* there is an open port for this data */
1046                         tty = info->tty;
1047                         j = (readb(base_addr + (CyRIVR << index)) &
1048                                         CyIVRMask);
1049                         if (j == CyIVRRxEx) {   /* exception */
1050                                 data = readb(base_addr + (CyRDSR << index));
1051
1052                                 /* For statistics only */
1053                                 if (data & CyBREAK)
1054                                         info->icount.brk++;
1055                                 else if (data & CyFRAME)
1056                                         info->icount.frame++;
1057                                 else if (data & CyPARITY)
1058                                         info->icount.parity++;
1059                                 else if (data & CyOVERRUN)
1060                                         info->icount.overrun++;
1061
1062                                 if (data & info->ignore_status_mask) {
1063                                         info->icount.rx++;
1064                                         return;
1065                                 }
1066                                 if (tty_buffer_request_room(tty, 1)) {
1067                                         if (data & info->read_status_mask) {
1068                                                 if (data & CyBREAK) {
1069                                                         tty_insert_flip_char(
1070                                                                 tty,
1071                                                                 readb(
1072                                                                 base_addr +
1073                                                                 (CyRDSR <<
1074                                                                         index)),
1075                                                                 TTY_BREAK);
1076                                                         info->icount.rx++;
1077                                                         if (info->flags &
1078                                                             ASYNC_SAK) {
1079                                                                 do_SAK(tty);
1080                                                         }
1081                                                 } else if (data & CyFRAME) {
1082                                                         tty_insert_flip_char(
1083                                                                 tty,
1084                                                                 readb(
1085                                                                 base_addr +
1086                                                                 (CyRDSR <<
1087                                                                         index)),
1088                                                                 TTY_FRAME);
1089                                                         info->icount.rx++;
1090                                                         info->idle_stats.
1091                                                                 frame_errs++;
1092                                                 } else if (data & CyPARITY) {
1093                                                         /* Pieces of seven... */
1094                                                         tty_insert_flip_char(
1095                                                                 tty,
1096                                                                 readb(
1097                                                                 base_addr +
1098                                                                 (CyRDSR <<
1099                                                                         index)),
1100                                                                 TTY_PARITY);
1101                                                         info->icount.rx++;
1102                                                         info->idle_stats.
1103                                                                 parity_errs++;
1104                                                 } else if (data & CyOVERRUN) {
1105                                                         tty_insert_flip_char(
1106                                                                 tty, 0,
1107                                                                 TTY_OVERRUN);
1108                                                         info->icount.rx++;
1109                                                 /* If the flip buffer itself is
1110                                                    overflowing, we still lose
1111                                                    the next incoming character.
1112                                                  */
1113                                                         tty_insert_flip_char(
1114                                                                 tty,
1115                                                                 readb(
1116                                                                 base_addr +
1117                                                                 (CyRDSR <<
1118                                                                         index)),
1119                                                                 TTY_FRAME);
1120                                                         info->icount.rx++;
1121                                                         info->idle_stats.
1122                                                                 overruns++;
1123                                         /* These two conditions may imply */
1124                                         /* a normal read should be done. */
1125                                         /* }else if(data & CyTIMEOUT){ */
1126                                         /* }else if(data & CySPECHAR){ */
1127                                                 } else {
1128                                                         tty_insert_flip_char(
1129                                                                 tty, 0,
1130                                                                 TTY_NORMAL);
1131                                                         info->icount.rx++;
1132                                                 }
1133                                         } else {
1134                                                 tty_insert_flip_char(tty, 0,
1135                                                                 TTY_NORMAL);
1136                                                 info->icount.rx++;
1137                                         }
1138                                 } else {
1139                                         /* there was a software buffer
1140                                            overrun and nothing could be
1141                                            done about it!!! */
1142                                         info->icount.buf_overrun++;
1143                                         info->idle_stats.overruns++;
1144                                 }
1145                         } else {        /* normal character reception */
1146                                 /* load # chars available from the chip */
1147                                 char_count = readb(base_addr +
1148                                                 (CyRDCR << index));
1149
1150 #ifdef CY_ENABLE_MONITORING
1151                                 ++info->mon.int_count;
1152                                 info->mon.char_count += char_count;
1153                                 if (char_count > info->mon.char_max)
1154                                         info->mon.char_max = char_count;
1155                                 info->mon.char_last = char_count;
1156 #endif
1157                                 len = tty_buffer_request_room(tty, char_count);
1158                                 while (len--) {
1159                                         data = readb(base_addr +
1160                                                         (CyRDSR << index));
1161                                         tty_insert_flip_char(tty, data,
1162                                                         TTY_NORMAL);
1163                                         info->idle_stats.recv_bytes++;
1164                                         info->icount.rx++;
1165 #ifdef CY_16Y_HACK
1166                                         udelay(10L);
1167 #endif
1168                                 }
1169                                 info->idle_stats.recv_idle = jiffies;
1170                         }
1171                         tty_schedule_flip(tty);
1172                 }
1173                 /* end of service */
1174                 cy_writeb(base_addr + (CyRIR << index), (save_xir & 0x3f));
1175                 cy_writeb(base_addr + (CyCAR << index), (save_car));
1176                 spin_unlock(&cinfo->card_lock);
1177         }
1178
1179         if (status & CySRTransmit) {    /* transmission interrupt */
1180                 /* Since we only get here when the transmit buffer
1181                    is empty, we know we can always stuff a dozen
1182                    characters. */
1183 #ifdef CY_DEBUG_INTERRUPTS
1184                 printk(KERN_DEBUG "cyy_interrupt: xmit intr, chip %d\n", chip);
1185 #endif
1186
1187                 /* determine the channel & change to that context */
1188                 spin_lock(&cinfo->card_lock);
1189                 save_xir = (u_char) readb(base_addr + (CyTIR << index));
1190                 channel = (u_short) (save_xir & CyIRChannel);
1191                 save_car = readb(base_addr + (CyCAR << index));
1192                 cy_writeb(base_addr + (CyCAR << index), save_xir);
1193
1194                 /* validate the port# (as configured and open) */
1195                 if (channel + chip * 4 >= cinfo->nports) {
1196                         cy_writeb(base_addr + (CySRER << index),
1197                                   readb(base_addr + (CySRER << index)) &
1198                                   ~CyTxRdy);
1199                         goto txend;
1200                 }
1201                 info = &cinfo->ports[channel + chip * 4];
1202                 if (info->tty == NULL) {
1203                         cy_writeb(base_addr + (CySRER << index),
1204                                   readb(base_addr + (CySRER << index)) &
1205                                   ~CyTxRdy);
1206                         goto txdone;
1207                 }
1208
1209                 /* load the on-chip space for outbound data */
1210                 char_count = info->xmit_fifo_size;
1211
1212                 if (info->x_char) {     /* send special char */
1213                         outch = info->x_char;
1214                         cy_writeb(base_addr + (CyTDR << index), outch);
1215                         char_count--;
1216                         info->icount.tx++;
1217                         info->x_char = 0;
1218                 }
1219
1220                 if (info->breakon || info->breakoff) {
1221                         if (info->breakon) {
1222                                 cy_writeb(base_addr + (CyTDR << index), 0);
1223                                 cy_writeb(base_addr + (CyTDR << index), 0x81);
1224                                 info->breakon = 0;
1225                                 char_count -= 2;
1226                         }
1227                         if (info->breakoff) {
1228                                 cy_writeb(base_addr + (CyTDR << index), 0);
1229                                 cy_writeb(base_addr + (CyTDR << index), 0x83);
1230                                 info->breakoff = 0;
1231                                 char_count -= 2;
1232                         }
1233                 }
1234
1235                 while (char_count-- > 0) {
1236                         if (!info->xmit_cnt) {
1237                                 if (readb(base_addr + (CySRER << index)) &
1238                                                 CyTxMpty) {
1239                                         cy_writeb(base_addr + (CySRER << index),
1240                                                 readb(base_addr +
1241                                                         (CySRER << index)) &
1242                                                 ~CyTxMpty);
1243                                 } else {
1244                                         cy_writeb(base_addr + (CySRER << index),
1245                                                 (readb(base_addr +
1246                                                         (CySRER << index)) &
1247                                                 ~CyTxRdy) | CyTxMpty);
1248                                 }
1249                                 goto txdone;
1250                         }
1251                         if (info->xmit_buf == NULL) {
1252                                 cy_writeb(base_addr + (CySRER << index),
1253                                         readb(base_addr + (CySRER << index)) &
1254                                         ~CyTxRdy);
1255                                 goto txdone;
1256                         }
1257                         if (info->tty->stopped || info->tty->hw_stopped) {
1258                                 cy_writeb(base_addr + (CySRER << index),
1259                                         readb(base_addr + (CySRER << index)) &
1260                                         ~CyTxRdy);
1261                                 goto txdone;
1262                         }
1263                         /* Because the Embedded Transmit Commands have
1264                            been enabled, we must check to see if the
1265                            escape character, NULL, is being sent.  If it
1266                            is, we must ensure that there is room for it
1267                            to be doubled in the output stream.  Therefore
1268                            we no longer advance the pointer when the
1269                            character is fetched, but rather wait until
1270                            after the check for a NULL output character.
1271                            This is necessary because there may not be
1272                            room for the two chars needed to send a NULL.)
1273                          */
1274                         outch = info->xmit_buf[info->xmit_tail];
1275                         if (outch) {
1276                                 info->xmit_cnt--;
1277                                 info->xmit_tail = (info->xmit_tail + 1) &
1278                                                 (SERIAL_XMIT_SIZE - 1);
1279                                 cy_writeb(base_addr + (CyTDR << index), outch);
1280                                 info->icount.tx++;
1281                         } else {
1282                                 if (char_count > 1) {
1283                                         info->xmit_cnt--;
1284                                         info->xmit_tail = (info->xmit_tail + 1)&
1285                                                 (SERIAL_XMIT_SIZE - 1);
1286                                         cy_writeb(base_addr + (CyTDR << index),
1287                                                 outch);
1288                                         cy_writeb(base_addr + (CyTDR << index),
1289                                                 0);
1290                                         info->icount.tx++;
1291                                         char_count--;
1292                                 }
1293                         }
1294                 }
1295
1296 txdone:
1297                 if (info->xmit_cnt < WAKEUP_CHARS) {
1298                         cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP);
1299                 }
1300 txend:
1301                 /* end of service */
1302                 cy_writeb(base_addr + (CyTIR << index), (save_xir & 0x3f));
1303                 cy_writeb(base_addr + (CyCAR << index), (save_car));
1304                 spin_unlock(&cinfo->card_lock);
1305         }
1306
1307         if (status & CySRModem) {       /* modem interrupt */
1308
1309                 /* determine the channel & change to that context */
1310                 spin_lock(&cinfo->card_lock);
1311                 save_xir = (u_char) readb(base_addr + (CyMIR << index));
1312                 channel = (u_short) (save_xir & CyIRChannel);
1313                 info = &cinfo->ports[channel + chip * 4];
1314                 save_car = readb(base_addr + (CyCAR << index));
1315                 cy_writeb(base_addr + (CyCAR << index), save_xir);
1316
1317                 mdm_change = readb(base_addr + (CyMISR << index));
1318                 mdm_status = readb(base_addr + (CyMSVR1 << index));
1319
1320                 if (info->tty) {
1321                         if (mdm_change & CyANY_DELTA) {
1322                                 /* For statistics only */
1323                                 if (mdm_change & CyDCD)
1324                                         info->icount.dcd++;
1325                                 if (mdm_change & CyCTS)
1326                                         info->icount.cts++;
1327                                 if (mdm_change & CyDSR)
1328                                         info->icount.dsr++;
1329                                 if (mdm_change & CyRI)
1330                                         info->icount.rng++;
1331
1332                                 cy_sched_event(info, Cy_EVENT_DELTA_WAKEUP);
1333                         }
1334
1335                         if ((mdm_change & CyDCD) &&
1336                                         (info->flags & ASYNC_CHECK_CD)) {
1337                                 if (mdm_status & CyDCD) {
1338                                         cy_sched_event(info,
1339                                                         Cy_EVENT_OPEN_WAKEUP);
1340                                 } else {
1341                                         cy_sched_event(info, Cy_EVENT_HANGUP);
1342                                 }
1343                         }
1344                         if ((mdm_change & CyCTS) &&
1345                                         (info->flags & ASYNC_CTS_FLOW)) {
1346                                 if (info->tty->hw_stopped) {
1347                                         if (mdm_status & CyCTS) {
1348                                                 /* cy_start isn't used
1349                                                    because... !!! */
1350                                                 info->tty->hw_stopped = 0;
1351                                                 cy_writeb(base_addr +
1352                                                         (CySRER << index),
1353                                                         readb(base_addr +
1354                                                                 (CySRER <<
1355                                                                         index))|
1356                                                         CyTxRdy);
1357                                                 cy_sched_event(info,
1358                                                         Cy_EVENT_WRITE_WAKEUP);
1359                                         }
1360                                 } else {
1361                                         if (!(mdm_status & CyCTS)) {
1362                                                 /* cy_stop isn't used
1363                                                    because ... !!! */
1364                                                 info->tty->hw_stopped = 1;
1365                                                 cy_writeb(base_addr +
1366                                                         (CySRER << index),
1367                                                         readb(base_addr +
1368                                                                 (CySRER <<
1369                                                                 index)) &
1370                                                         ~CyTxRdy);
1371                                         }
1372                                 }
1373                         }
1374 /*                      if (mdm_change & CyDSR) {
1375                         }
1376                         if (mdm_change & CyRI) {
1377                         }*/
1378                 }
1379                 /* end of service */
1380                 cy_writeb(base_addr + (CyMIR << index), (save_xir & 0x3f));
1381                 cy_writeb(base_addr + (CyCAR << index), save_car);
1382                 spin_unlock(&cinfo->card_lock);
1383         }
1384 }
1385
1386 /* The real interrupt service routine is called
1387    whenever the card wants its hand held--chars
1388    received, out buffer empty, modem change, etc.
1389  */
1390 static irqreturn_t cyy_interrupt(int irq, void *dev_id)
1391 {
1392         int status;
1393         struct cyclades_card *cinfo = dev_id;
1394         void __iomem *base_addr, *card_base_addr;
1395         int chip;
1396         int index;
1397         int too_many;
1398         int had_work;
1399
1400         if (unlikely(cinfo == NULL)) {
1401 #ifdef CY_DEBUG_INTERRUPTS
1402                 printk(KERN_DEBUG "cyy_interrupt: spurious interrupt %d\n",irq);
1403 #endif
1404                 return IRQ_NONE;        /* spurious interrupt */
1405         }
1406
1407         card_base_addr = cinfo->base_addr;
1408         index = cinfo->bus_index;
1409
1410         /* card was not initialized yet (e.g. DEBUG_SHIRQ) */
1411         if (unlikely(card_base_addr == NULL))
1412                 return IRQ_HANDLED;
1413
1414         /* This loop checks all chips in the card.  Make a note whenever
1415            _any_ chip had some work to do, as this is considered an
1416            indication that there will be more to do.  Only when no chip
1417            has any work does this outermost loop exit.
1418          */
1419         do {
1420                 had_work = 0;
1421                 for (chip = 0; chip < cinfo->num_chips; chip++) {
1422                         base_addr = cinfo->base_addr +
1423                                         (cy_chip_offset[chip] << index);
1424                         too_many = 0;
1425                         while ((status = readb(base_addr +
1426                                                 (CySVRR << index))) != 0x00) {
1427                                 had_work++;
1428                         /* The purpose of the following test is to ensure that
1429                            no chip can monopolize the driver.  This forces the
1430                            chips to be checked in a round-robin fashion (after
1431                            draining each of a bunch (1000) of characters).
1432                          */
1433                                 if (1000 < too_many++) {
1434                                         break;
1435                                 }
1436                                 cyy_intr_chip(cinfo, chip, base_addr, status,
1437                                                 index);
1438                         }
1439                 }
1440         } while (had_work);
1441
1442         /* clear interrupts */
1443         spin_lock(&cinfo->card_lock);
1444         cy_writeb(card_base_addr + (Cy_ClrIntr << index), 0);
1445         /* Cy_ClrIntr is 0x1800 */
1446         spin_unlock(&cinfo->card_lock);
1447         return IRQ_HANDLED;
1448 }                               /* cyy_interrupt */
1449
1450 /***********************************************************/
1451 /********* End of block of Cyclom-Y specific code **********/
1452 /******** Start of block of Cyclades-Z specific code *********/
1453 /***********************************************************/
1454
1455 static int
1456 cyz_fetch_msg(struct cyclades_card *cinfo,
1457                 __u32 * channel, __u8 * cmd, __u32 * param)
1458 {
1459         struct FIRM_ID __iomem *firm_id;
1460         struct ZFW_CTRL __iomem *zfw_ctrl;
1461         struct BOARD_CTRL __iomem *board_ctrl;
1462         unsigned long loc_doorbell;
1463
1464         firm_id = cinfo->base_addr + ID_ADDRESS;
1465         if (!ISZLOADED(*cinfo)) {
1466                 return -1;
1467         }
1468         zfw_ctrl = cinfo->base_addr + (readl(&firm_id->zfwctrl_addr) & 0xfffff);
1469         board_ctrl = &zfw_ctrl->board_ctrl;
1470
1471         loc_doorbell = readl(&((struct RUNTIME_9060 __iomem *)
1472                                   (cinfo->ctl_addr))->loc_doorbell);
1473         if (loc_doorbell) {
1474                 *cmd = (char)(0xff & loc_doorbell);
1475                 *channel = readl(&board_ctrl->fwcmd_channel);
1476                 *param = (__u32) readl(&board_ctrl->fwcmd_param);
1477                 cy_writel(&((struct RUNTIME_9060 __iomem *)(cinfo->ctl_addr))->
1478                           loc_doorbell, 0xffffffff);
1479                 return 1;
1480         }
1481         return 0;
1482 }                               /* cyz_fetch_msg */
1483
1484 static int
1485 cyz_issue_cmd(struct cyclades_card *cinfo,
1486                 __u32 channel, __u8 cmd, __u32 param)
1487 {
1488         struct FIRM_ID __iomem *firm_id;
1489         struct ZFW_CTRL __iomem *zfw_ctrl;
1490         struct BOARD_CTRL __iomem *board_ctrl;
1491         __u32 __iomem *pci_doorbell;
1492         int index;
1493
1494         firm_id = cinfo->base_addr + ID_ADDRESS;
1495         if (!ISZLOADED(*cinfo)) {
1496                 return -1;
1497         }
1498         zfw_ctrl = cinfo->base_addr + (readl(&firm_id->zfwctrl_addr) & 0xfffff);
1499         board_ctrl = &zfw_ctrl->board_ctrl;
1500
1501         index = 0;
1502         pci_doorbell =
1503             &((struct RUNTIME_9060 __iomem *)(cinfo->ctl_addr))->pci_doorbell;
1504         while ((readl(pci_doorbell) & 0xff) != 0) {
1505                 if (index++ == 1000) {
1506                         return (int)(readl(pci_doorbell) & 0xff);
1507                 }
1508                 udelay(50L);
1509         }
1510         cy_writel(&board_ctrl->hcmd_channel, channel);
1511         cy_writel(&board_ctrl->hcmd_param, param);
1512         cy_writel(pci_doorbell, (long)cmd);
1513
1514         return 0;
1515 }                               /* cyz_issue_cmd */
1516
1517 static void
1518 cyz_handle_rx(struct cyclades_port *info, struct CH_CTRL __iomem *ch_ctrl,
1519                 struct BUF_CTRL __iomem *buf_ctrl)
1520 {
1521         struct cyclades_card *cinfo = info->card;
1522         struct tty_struct *tty = info->tty;
1523         int char_count;
1524         int len;
1525 #ifdef BLOCKMOVE
1526         unsigned char *buf;
1527 #else
1528         char data;
1529 #endif
1530         __u32 rx_put, rx_get, new_rx_get, rx_bufsize, rx_bufaddr;
1531
1532         rx_get = new_rx_get = readl(&buf_ctrl->rx_get);
1533         rx_put = readl(&buf_ctrl->rx_put);
1534         rx_bufsize = readl(&buf_ctrl->rx_bufsize);
1535         rx_bufaddr = readl(&buf_ctrl->rx_bufaddr);
1536         if (rx_put >= rx_get)
1537                 char_count = rx_put - rx_get;
1538         else
1539                 char_count = rx_put - rx_get + rx_bufsize;
1540
1541         if (char_count) {
1542 #ifdef CY_ENABLE_MONITORING
1543                 info->mon.int_count++;
1544                 info->mon.char_count += char_count;
1545                 if (char_count > info->mon.char_max)
1546                         info->mon.char_max = char_count;
1547                 info->mon.char_last = char_count;
1548 #endif
1549                 if (tty == NULL) {
1550                         /* flush received characters */
1551                         new_rx_get = (new_rx_get + char_count) &
1552                                         (rx_bufsize - 1);
1553                         info->rflush_count++;
1554                 } else {
1555 #ifdef BLOCKMOVE
1556                 /* we'd like to use memcpy(t, f, n) and memset(s, c, count)
1557                    for performance, but because of buffer boundaries, there
1558                    may be several steps to the operation */
1559                         while (1) {
1560                                 len = tty_prepare_flip_string(tty, &buf,
1561                                                 char_count);
1562                                 if (!len)
1563                                         break;
1564
1565                                 len = min_t(unsigned int, min(len, char_count),
1566                                                 rx_bufsize - new_rx_get);
1567
1568                                 memcpy_fromio(buf, cinfo->base_addr +
1569                                                 rx_bufaddr + new_rx_get, len);
1570
1571                                 new_rx_get = (new_rx_get + len) &
1572                                                 (rx_bufsize - 1);
1573                                 char_count -= len;
1574                                 info->icount.rx += len;
1575                                 info->idle_stats.recv_bytes += len;
1576                         }
1577 #else
1578                         len = tty_buffer_request_room(tty, char_count);
1579                         while (len--) {
1580                                 data = readb(cinfo->base_addr + rx_bufaddr +
1581                                                 new_rx_get);
1582                                 new_rx_get = (new_rx_get + 1)& (rx_bufsize - 1);
1583                                 tty_insert_flip_char(tty, data, TTY_NORMAL);
1584                                 info->idle_stats.recv_bytes++;
1585                                 info->icount.rx++;
1586                         }
1587 #endif
1588 #ifdef CONFIG_CYZ_INTR
1589                 /* Recalculate the number of chars in the RX buffer and issue
1590                    a cmd in case it's higher than the RX high water mark */
1591                         rx_put = readl(&buf_ctrl->rx_put);
1592                         if (rx_put >= rx_get)
1593                                 char_count = rx_put - rx_get;
1594                         else
1595                                 char_count = rx_put - rx_get + rx_bufsize;
1596                         if (char_count >= (int)readl(&buf_ctrl->rx_threshold)) {
1597                                 cy_sched_event(info, Cy_EVENT_Z_RX_FULL);
1598                         }
1599 #endif
1600                         info->idle_stats.recv_idle = jiffies;
1601                         tty_schedule_flip(tty);
1602                 }
1603                 /* Update rx_get */
1604                 cy_writel(&buf_ctrl->rx_get, new_rx_get);
1605         }
1606 }
1607
1608 static void
1609 cyz_handle_tx(struct cyclades_port *info, struct CH_CTRL __iomem *ch_ctrl,
1610                 struct BUF_CTRL __iomem *buf_ctrl)
1611 {
1612         struct cyclades_card *cinfo = info->card;
1613         struct tty_struct *tty = info->tty;
1614         char data;
1615         int char_count;
1616 #ifdef BLOCKMOVE
1617         int small_count;
1618 #endif
1619         __u32 tx_put, tx_get, tx_bufsize, tx_bufaddr;
1620
1621         if (info->xmit_cnt <= 0)        /* Nothing to transmit */
1622                 return;
1623
1624         tx_get = readl(&buf_ctrl->tx_get);
1625         tx_put = readl(&buf_ctrl->tx_put);
1626         tx_bufsize = readl(&buf_ctrl->tx_bufsize);
1627         tx_bufaddr = readl(&buf_ctrl->tx_bufaddr);
1628         if (tx_put >= tx_get)
1629                 char_count = tx_get - tx_put - 1 + tx_bufsize;
1630         else
1631                 char_count = tx_get - tx_put - 1;
1632
1633         if (char_count) {
1634
1635                 if (tty == NULL)
1636                         goto ztxdone;
1637
1638                 if (info->x_char) {     /* send special char */
1639                         data = info->x_char;
1640
1641                         cy_writeb(cinfo->base_addr + tx_bufaddr + tx_put, data);
1642                         tx_put = (tx_put + 1) & (tx_bufsize - 1);
1643                         info->x_char = 0;
1644                         char_count--;
1645                         info->icount.tx++;
1646                 }
1647 #ifdef BLOCKMOVE
1648                 while (0 < (small_count = min_t(unsigned int,
1649                                 tx_bufsize - tx_put, min_t(unsigned int,
1650                                         (SERIAL_XMIT_SIZE - info->xmit_tail),
1651                                         min_t(unsigned int, info->xmit_cnt,
1652                                                 char_count))))) {
1653
1654                         memcpy_toio((char *)(cinfo->base_addr + tx_bufaddr +
1655                                         tx_put),
1656                                         &info->xmit_buf[info->xmit_tail],
1657                                         small_count);
1658
1659                         tx_put = (tx_put + small_count) & (tx_bufsize - 1);
1660                         char_count -= small_count;
1661                         info->icount.tx += small_count;
1662                         info->xmit_cnt -= small_count;
1663                         info->xmit_tail = (info->xmit_tail + small_count) &
1664                                         (SERIAL_XMIT_SIZE - 1);
1665                 }
1666 #else
1667                 while (info->xmit_cnt && char_count) {
1668                         data = info->xmit_buf[info->xmit_tail];
1669                         info->xmit_cnt--;
1670                         info->xmit_tail = (info->xmit_tail + 1) &
1671                                         (SERIAL_XMIT_SIZE - 1);
1672
1673                         cy_writeb(cinfo->base_addr + tx_bufaddr + tx_put, data);
1674                         tx_put = (tx_put + 1) & (tx_bufsize - 1);
1675                         char_count--;
1676                         info->icount.tx++;
1677                 }
1678 #endif
1679 ztxdone:
1680                 if (info->xmit_cnt < WAKEUP_CHARS) {
1681                         cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP);
1682                 }
1683                 /* Update tx_put */
1684                 cy_writel(&buf_ctrl->tx_put, tx_put);
1685         }
1686 }
1687
1688 static void cyz_handle_cmd(struct cyclades_card *cinfo)
1689 {
1690         struct tty_struct *tty;
1691         struct cyclades_port *info;
1692         static struct FIRM_ID __iomem *firm_id;
1693         static struct ZFW_CTRL __iomem *zfw_ctrl;
1694         static struct BOARD_CTRL __iomem *board_ctrl;
1695         static struct CH_CTRL __iomem *ch_ctrl;
1696         static struct BUF_CTRL __iomem *buf_ctrl;
1697         __u32 channel;
1698         __u8 cmd;
1699         __u32 param;
1700         __u32 hw_ver, fw_ver;
1701         int special_count;
1702         int delta_count;
1703
1704         firm_id = cinfo->base_addr + ID_ADDRESS;
1705         zfw_ctrl = cinfo->base_addr + (readl(&firm_id->zfwctrl_addr) & 0xfffff);
1706         board_ctrl = &zfw_ctrl->board_ctrl;
1707         fw_ver = readl(&board_ctrl->fw_version);
1708         hw_ver = readl(&((struct RUNTIME_9060 __iomem *)(cinfo->ctl_addr))->
1709                         mail_box_0);
1710
1711         while (cyz_fetch_msg(cinfo, &channel, &cmd, &param) == 1) {
1712                 special_count = 0;
1713                 delta_count = 0;
1714                 info = &cinfo->ports[channel];
1715                 if ((tty = info->tty) == NULL)
1716                         continue;
1717
1718                 ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]);
1719                 buf_ctrl = &(zfw_ctrl->buf_ctrl[channel]);
1720
1721                 switch (cmd) {
1722                 case C_CM_PR_ERROR:
1723                         tty_insert_flip_char(tty, 0, TTY_PARITY);
1724                         info->icount.rx++;
1725                         special_count++;
1726                         break;
1727                 case C_CM_FR_ERROR:
1728                         tty_insert_flip_char(tty, 0, TTY_FRAME);
1729                         info->icount.rx++;
1730                         special_count++;
1731                         break;
1732                 case C_CM_RXBRK:
1733                         tty_insert_flip_char(tty, 0, TTY_BREAK);
1734                         info->icount.rx++;
1735                         special_count++;
1736                         break;
1737                 case C_CM_MDCD:
1738                         info->icount.dcd++;
1739                         delta_count++;
1740                         if (info->flags & ASYNC_CHECK_CD) {
1741                                 if ((fw_ver > 241 ? ((u_long) param) :
1742                                                 readl(&ch_ctrl->rs_status)) &
1743                                                 C_RS_DCD) {
1744                                         cy_sched_event(info,
1745                                                         Cy_EVENT_OPEN_WAKEUP);
1746                                 } else {
1747                                         cy_sched_event(info, Cy_EVENT_HANGUP);
1748                                 }
1749                         }
1750                         break;
1751                 case C_CM_MCTS:
1752                         info->icount.cts++;
1753                         delta_count++;
1754                         break;
1755                 case C_CM_MRI:
1756                         info->icount.rng++;
1757                         delta_count++;
1758                         break;
1759                 case C_CM_MDSR:
1760                         info->icount.dsr++;
1761                         delta_count++;
1762                         break;
1763 #ifdef Z_WAKE
1764                 case C_CM_IOCTLW:
1765                         cy_sched_event(info, Cy_EVENT_SHUTDOWN_WAKEUP);
1766                         break;
1767 #endif
1768 #ifdef CONFIG_CYZ_INTR
1769                 case C_CM_RXHIWM:
1770                 case C_CM_RXNNDT:
1771                 case C_CM_INTBACK2:
1772                         /* Reception Interrupt */
1773 #ifdef CY_DEBUG_INTERRUPTS
1774                         printk(KERN_DEBUG "cyz_interrupt: rcvd intr, card %d, "
1775                                         "port %ld\n", info->card, channel);
1776 #endif
1777                         cyz_handle_rx(info, ch_ctrl, buf_ctrl);
1778                         break;
1779                 case C_CM_TXBEMPTY:
1780                 case C_CM_TXLOWWM:
1781                 case C_CM_INTBACK:
1782                         /* Transmission Interrupt */
1783 #ifdef CY_DEBUG_INTERRUPTS
1784                         printk(KERN_DEBUG "cyz_interrupt: xmit intr, card %d, "
1785                                         "port %ld\n", info->card, channel);
1786 #endif
1787                         cyz_handle_tx(info, ch_ctrl, buf_ctrl);
1788                         break;
1789 #endif                          /* CONFIG_CYZ_INTR */
1790                 case C_CM_FATAL:
1791                         /* should do something with this !!! */
1792                         break;
1793                 default:
1794                         break;
1795                 }
1796                 if (delta_count)
1797                         cy_sched_event(info, Cy_EVENT_DELTA_WAKEUP);
1798                 if (special_count)
1799                         tty_schedule_flip(tty);
1800         }
1801 }
1802
1803 #ifdef CONFIG_CYZ_INTR
1804 static irqreturn_t cyz_interrupt(int irq, void *dev_id)
1805 {
1806         struct cyclades_card *cinfo = dev_id;
1807
1808         if (unlikely(cinfo == NULL)) {
1809 #ifdef CY_DEBUG_INTERRUPTS
1810                 printk(KERN_DEBUG "cyz_interrupt: spurious interrupt %d\n",irq);
1811 #endif
1812                 return IRQ_NONE;        /* spurious interrupt */
1813         }
1814
1815         if (unlikely(!ISZLOADED(*cinfo))) {
1816 #ifdef CY_DEBUG_INTERRUPTS
1817                 printk(KERN_DEBUG "cyz_interrupt: board not yet loaded "
1818                                 "(IRQ%d).\n", irq);
1819 #endif
1820                 return IRQ_NONE;
1821         }
1822
1823         /* Handle the interrupts */
1824         cyz_handle_cmd(cinfo);
1825
1826         return IRQ_HANDLED;
1827 }                               /* cyz_interrupt */
1828
1829 static void cyz_rx_restart(unsigned long arg)
1830 {
1831         struct cyclades_port *info = (struct cyclades_port *)arg;
1832         struct cyclades_card *card = info->card;
1833         int retval;
1834         __u32 channel = info->line - card->first_line;
1835         unsigned long flags;
1836
1837         spin_lock_irqsave(&card->card_lock, flags);
1838         retval = cyz_issue_cmd(card, channel, C_CM_INTBACK2, 0L);
1839         if (retval != 0) {
1840                 printk(KERN_ERR "cyc:cyz_rx_restart retval on ttyC%d was %x\n",
1841                         info->line, retval);
1842         }
1843         spin_unlock_irqrestore(&card->card_lock, flags);
1844 }
1845
1846 #else                           /* CONFIG_CYZ_INTR */
1847
1848 static void cyz_poll(unsigned long arg)
1849 {
1850         struct cyclades_card *cinfo;
1851         struct cyclades_port *info;
1852         struct tty_struct *tty;
1853         static struct FIRM_ID *firm_id;
1854         static struct ZFW_CTRL *zfw_ctrl;
1855         static struct BOARD_CTRL *board_ctrl;
1856         static struct CH_CTRL *ch_ctrl;
1857         static struct BUF_CTRL *buf_ctrl;
1858         unsigned long expires = jiffies + HZ;
1859         int card, port;
1860
1861         for (card = 0; card < NR_CARDS; card++) {
1862                 cinfo = &cy_card[card];
1863
1864                 if (!IS_CYC_Z(*cinfo))
1865                         continue;
1866                 if (!ISZLOADED(*cinfo))
1867                         continue;
1868
1869                 firm_id = cinfo->base_addr + ID_ADDRESS;
1870                 zfw_ctrl = cinfo->base_addr +
1871                                 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
1872                 board_ctrl = &(zfw_ctrl->board_ctrl);
1873
1874         /* Skip first polling cycle to avoid racing conditions with the FW */
1875                 if (!cinfo->intr_enabled) {
1876                         cinfo->nports = (int)readl(&board_ctrl->n_channel);
1877                         cinfo->intr_enabled = 1;
1878                         continue;
1879                 }
1880
1881                 cyz_handle_cmd(cinfo);
1882
1883                 for (port = 0; port < cinfo->nports; port++) {
1884                         info = &cinfo->ports[port];
1885                         tty = info->tty;
1886                         ch_ctrl = &(zfw_ctrl->ch_ctrl[port]);
1887                         buf_ctrl = &(zfw_ctrl->buf_ctrl[port]);
1888
1889                         if (!info->throttle)
1890                                 cyz_handle_rx(info, ch_ctrl, buf_ctrl);
1891                         cyz_handle_tx(info, ch_ctrl, buf_ctrl);
1892                 }
1893                 /* poll every 'cyz_polling_cycle' period */
1894                 expires = jiffies + cyz_polling_cycle;
1895         }
1896         mod_timer(&cyz_timerlist, expires);
1897 }                               /* cyz_poll */
1898
1899 #endif                          /* CONFIG_CYZ_INTR */
1900
1901 /********** End of block of Cyclades-Z specific code *********/
1902 /***********************************************************/
1903
1904 /* This is called whenever a port becomes active;
1905    interrupts are enabled and DTR & RTS are turned on.
1906  */
1907 static int startup(struct cyclades_port *info)
1908 {
1909         struct cyclades_card *card;
1910         unsigned long flags;
1911         int retval = 0;
1912         void __iomem *base_addr;
1913         int chip, channel, index;
1914         unsigned long page;
1915
1916         card = info->card;
1917         channel = info->line - card->first_line;
1918
1919         page = get_zeroed_page(GFP_KERNEL);
1920         if (!page)
1921                 return -ENOMEM;
1922
1923         spin_lock_irqsave(&card->card_lock, flags);
1924
1925         if (info->flags & ASYNC_INITIALIZED) {
1926                 free_page(page);
1927                 goto errout;
1928         }
1929
1930         if (!info->type) {
1931                 if (info->tty) {
1932                         set_bit(TTY_IO_ERROR, &info->tty->flags);
1933                 }
1934                 free_page(page);
1935                 goto errout;
1936         }
1937
1938         if (info->xmit_buf)
1939                 free_page(page);
1940         else
1941                 info->xmit_buf = (unsigned char *)page;
1942
1943         spin_unlock_irqrestore(&card->card_lock, flags);
1944
1945         set_line_char(info);
1946
1947         if (!IS_CYC_Z(*card)) {
1948                 chip = channel >> 2;
1949                 channel &= 0x03;
1950                 index = card->bus_index;
1951                 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
1952
1953 #ifdef CY_DEBUG_OPEN
1954                 printk(KERN_DEBUG "cyc startup card %d, chip %d, channel %d, "
1955                                 "base_addr %p\n",
1956                                 card, chip, channel, base_addr);
1957 #endif
1958                 spin_lock_irqsave(&card->card_lock, flags);
1959
1960                 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
1961
1962                 cy_writeb(base_addr + (CyRTPR << index),
1963                         (info->default_timeout ? info->default_timeout : 0x02));
1964                 /* 10ms rx timeout */
1965
1966                 cyy_issue_cmd(base_addr, CyCHAN_CTL | CyENB_RCVR | CyENB_XMTR,
1967                                 index);
1968
1969                 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
1970                 cy_writeb(base_addr + (CyMSVR1 << index), CyRTS);
1971                 cy_writeb(base_addr + (CyMSVR2 << index), CyDTR);
1972
1973 #ifdef CY_DEBUG_DTR
1974                 printk(KERN_DEBUG "cyc:startup raising DTR\n");
1975                 printk(KERN_DEBUG "     status: 0x%x, 0x%x\n",
1976                         readb(base_addr + (CyMSVR1 << index)),
1977                         readb(base_addr + (CyMSVR2 << index)));
1978 #endif
1979
1980                 cy_writeb(base_addr + (CySRER << index),
1981                         readb(base_addr + (CySRER << index)) | CyRxData);
1982                 info->flags |= ASYNC_INITIALIZED;
1983
1984                 if (info->tty) {
1985                         clear_bit(TTY_IO_ERROR, &info->tty->flags);
1986                 }
1987                 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
1988                 info->breakon = info->breakoff = 0;
1989                 memset((char *)&info->idle_stats, 0, sizeof(info->idle_stats));
1990                 info->idle_stats.in_use =
1991                 info->idle_stats.recv_idle =
1992                 info->idle_stats.xmit_idle = jiffies;
1993
1994                 spin_unlock_irqrestore(&card->card_lock, flags);
1995
1996         } else {
1997                 struct FIRM_ID __iomem *firm_id;
1998                 struct ZFW_CTRL __iomem *zfw_ctrl;
1999                 struct BOARD_CTRL __iomem *board_ctrl;
2000                 struct CH_CTRL __iomem *ch_ctrl;
2001                 int retval;
2002
2003                 base_addr = card->base_addr;
2004
2005                 firm_id = base_addr + ID_ADDRESS;
2006                 if (!ISZLOADED(*card)) {
2007                         return -ENODEV;
2008                 }
2009
2010                 zfw_ctrl = card->base_addr +
2011                                 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
2012                 board_ctrl = &zfw_ctrl->board_ctrl;
2013                 ch_ctrl = zfw_ctrl->ch_ctrl;
2014
2015 #ifdef CY_DEBUG_OPEN
2016                 printk(KERN_DEBUG "cyc startup Z card %d, channel %d, "
2017                         "base_addr %p\n", card, channel, base_addr);
2018 #endif
2019                 spin_lock_irqsave(&card->card_lock, flags);
2020
2021                 cy_writel(&ch_ctrl[channel].op_mode, C_CH_ENABLE);
2022 #ifdef Z_WAKE
2023 #ifdef CONFIG_CYZ_INTR
2024                 cy_writel(&ch_ctrl[channel].intr_enable,
2025                           C_IN_TXBEMPTY | C_IN_TXLOWWM | C_IN_RXHIWM |
2026                           C_IN_RXNNDT | C_IN_IOCTLW | C_IN_MDCD);
2027 #else
2028                 cy_writel(&ch_ctrl[channel].intr_enable,
2029                           C_IN_IOCTLW | C_IN_MDCD);
2030 #endif                          /* CONFIG_CYZ_INTR */
2031 #else
2032 #ifdef CONFIG_CYZ_INTR
2033                 cy_writel(&ch_ctrl[channel].intr_enable,
2034                           C_IN_TXBEMPTY | C_IN_TXLOWWM | C_IN_RXHIWM |
2035                           C_IN_RXNNDT | C_IN_MDCD);
2036 #else
2037                 cy_writel(&ch_ctrl[channel].intr_enable, C_IN_MDCD);
2038 #endif                          /* CONFIG_CYZ_INTR */
2039 #endif                          /* Z_WAKE */
2040
2041                 retval = cyz_issue_cmd(card, channel, C_CM_IOCTL, 0L);
2042                 if (retval != 0) {
2043                         printk(KERN_ERR "cyc:startup(1) retval on ttyC%d was "
2044                                 "%x\n", info->line, retval);
2045                 }
2046
2047                 /* Flush RX buffers before raising DTR and RTS */
2048                 retval = cyz_issue_cmd(card, channel, C_CM_FLUSH_RX, 0L);
2049                 if (retval != 0) {
2050                         printk(KERN_ERR "cyc:startup(2) retval on ttyC%d was "
2051                                 "%x\n", info->line, retval);
2052                 }
2053
2054                 /* set timeout !!! */
2055                 /* set RTS and DTR !!! */
2056                 cy_writel(&ch_ctrl[channel].rs_control,
2057                         readl(&ch_ctrl[channel].rs_control) | C_RS_RTS |
2058                         C_RS_DTR);
2059                 retval = cyz_issue_cmd(card, channel, C_CM_IOCTLM, 0L);
2060                 if (retval != 0) {
2061                         printk(KERN_ERR "cyc:startup(3) retval on ttyC%d was "
2062                                 "%x\n", info->line, retval);
2063                 }
2064 #ifdef CY_DEBUG_DTR
2065                 printk(KERN_DEBUG "cyc:startup raising Z DTR\n");
2066 #endif
2067
2068                 /* enable send, recv, modem !!! */
2069
2070                 info->flags |= ASYNC_INITIALIZED;
2071                 if (info->tty) {
2072                         clear_bit(TTY_IO_ERROR, &info->tty->flags);
2073                 }
2074                 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
2075                 info->breakon = info->breakoff = 0;
2076                 memset((char *)&info->idle_stats, 0, sizeof(info->idle_stats));
2077                 info->idle_stats.in_use =
2078                 info->idle_stats.recv_idle =
2079                 info->idle_stats.xmit_idle = jiffies;
2080
2081                 spin_unlock_irqrestore(&card->card_lock, flags);
2082         }
2083
2084 #ifdef CY_DEBUG_OPEN
2085         printk(KERN_DEBUG "cyc startup done\n");
2086 #endif
2087         return 0;
2088
2089 errout:
2090         spin_unlock_irqrestore(&card->card_lock, flags);
2091         return retval;
2092 }                               /* startup */
2093
2094 static void start_xmit(struct cyclades_port *info)
2095 {
2096         struct cyclades_card *card;
2097         unsigned long flags;
2098         void __iomem *base_addr;
2099         int chip, channel, index;
2100
2101         card = info->card;
2102         channel = info->line - card->first_line;
2103         if (!IS_CYC_Z(*card)) {
2104                 chip = channel >> 2;
2105                 channel &= 0x03;
2106                 index = card->bus_index;
2107                 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
2108
2109                 spin_lock_irqsave(&card->card_lock, flags);
2110                 cy_writeb(base_addr + (CyCAR << index), channel);
2111                 cy_writeb(base_addr + (CySRER << index),
2112                         readb(base_addr + (CySRER << index)) | CyTxRdy);
2113                 spin_unlock_irqrestore(&card->card_lock, flags);
2114         } else {
2115 #ifdef CONFIG_CYZ_INTR
2116                 int retval;
2117
2118                 spin_lock_irqsave(&card->card_lock, flags);
2119                 retval = cyz_issue_cmd(card, channel, C_CM_INTBACK, 0L);
2120                 if (retval != 0) {
2121                         printk(KERN_ERR "cyc:start_xmit retval on ttyC%d was "
2122                                 "%x\n", info->line, retval);
2123                 }
2124                 spin_unlock_irqrestore(&card->card_lock, flags);
2125 #else                           /* CONFIG_CYZ_INTR */
2126                 /* Don't have to do anything at this time */
2127 #endif                          /* CONFIG_CYZ_INTR */
2128         }
2129 }                               /* start_xmit */
2130
2131 /*
2132  * This routine shuts down a serial port; interrupts are disabled,
2133  * and DTR is dropped if the hangup on close termio flag is on.
2134  */
2135 static void shutdown(struct cyclades_port *info)
2136 {
2137         struct cyclades_card *card;
2138         unsigned long flags;
2139         void __iomem *base_addr;
2140         int chip, channel, index;
2141
2142         if (!(info->flags & ASYNC_INITIALIZED)) {
2143                 return;
2144         }
2145
2146         card = info->card;
2147         channel = info->line - card->first_line;
2148         if (!IS_CYC_Z(*card)) {
2149                 chip = channel >> 2;
2150                 channel &= 0x03;
2151                 index = card->bus_index;
2152                 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
2153
2154 #ifdef CY_DEBUG_OPEN
2155                 printk(KERN_DEBUG "cyc shutdown Y card %d, chip %d, "
2156                                 "channel %d, base_addr %p\n",
2157                                 card, chip, channel, base_addr);
2158 #endif
2159
2160                 spin_lock_irqsave(&card->card_lock, flags);
2161
2162                 /* Clear delta_msr_wait queue to avoid mem leaks. */
2163                 wake_up_interruptible(&info->delta_msr_wait);
2164
2165                 if (info->xmit_buf) {
2166                         unsigned char *temp;
2167                         temp = info->xmit_buf;
2168                         info->xmit_buf = NULL;
2169                         free_page((unsigned long)temp);
2170                 }
2171                 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
2172                 if (!info->tty || (info->tty->termios->c_cflag & HUPCL)) {
2173                         cy_writeb(base_addr + (CyMSVR1 << index), ~CyRTS);
2174                         cy_writeb(base_addr + (CyMSVR2 << index), ~CyDTR);
2175 #ifdef CY_DEBUG_DTR
2176                         printk(KERN_DEBUG "cyc shutdown dropping DTR\n");
2177                         printk(KERN_DEBUG "     status: 0x%x, 0x%x\n",
2178                                 readb(base_addr + (CyMSVR1 << index)),
2179                                 readb(base_addr + (CyMSVR2 << index)));
2180 #endif
2181                 }
2182                 cyy_issue_cmd(base_addr, CyCHAN_CTL | CyDIS_RCVR, index);
2183                 /* it may be appropriate to clear _XMIT at
2184                    some later date (after testing)!!! */
2185
2186                 if (info->tty) {
2187                         set_bit(TTY_IO_ERROR, &info->tty->flags);
2188                 }
2189                 info->flags &= ~ASYNC_INITIALIZED;
2190                 spin_unlock_irqrestore(&card->card_lock, flags);
2191         } else {
2192                 struct FIRM_ID __iomem *firm_id;
2193                 struct ZFW_CTRL __iomem *zfw_ctrl;
2194                 struct BOARD_CTRL __iomem *board_ctrl;
2195                 struct CH_CTRL __iomem *ch_ctrl;
2196                 int retval;
2197
2198                 base_addr = card->base_addr;
2199 #ifdef CY_DEBUG_OPEN
2200                 printk(KERN_DEBUG "cyc shutdown Z card %d, channel %d, "
2201                         "base_addr %p\n", card, channel, base_addr);
2202 #endif
2203
2204                 firm_id = base_addr + ID_ADDRESS;
2205                 if (!ISZLOADED(*card)) {
2206                         return;
2207                 }
2208
2209                 zfw_ctrl = card->base_addr +
2210                                 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
2211                 board_ctrl = &zfw_ctrl->board_ctrl;
2212                 ch_ctrl = zfw_ctrl->ch_ctrl;
2213
2214                 spin_lock_irqsave(&card->card_lock, flags);
2215
2216                 if (info->xmit_buf) {
2217                         unsigned char *temp;
2218                         temp = info->xmit_buf;
2219                         info->xmit_buf = NULL;
2220                         free_page((unsigned long)temp);
2221                 }
2222
2223                 if (!info->tty || (info->tty->termios->c_cflag & HUPCL)) {
2224                         cy_writel(&ch_ctrl[channel].rs_control,
2225                                 (__u32)(readl(&ch_ctrl[channel].rs_control) &
2226                                         ~(C_RS_RTS | C_RS_DTR)));
2227                         retval = cyz_issue_cmd(info->card, channel,
2228                                         C_CM_IOCTLM, 0L);
2229                         if (retval != 0) {
2230                                 printk(KERN_ERR"cyc:shutdown retval on ttyC%d "
2231                                         "was %x\n", info->line, retval);
2232                         }
2233 #ifdef CY_DEBUG_DTR
2234                         printk(KERN_DEBUG "cyc:shutdown dropping Z DTR\n");
2235 #endif
2236                 }
2237
2238                 if (info->tty) {
2239                         set_bit(TTY_IO_ERROR, &info->tty->flags);
2240                 }
2241                 info->flags &= ~ASYNC_INITIALIZED;
2242
2243                 spin_unlock_irqrestore(&card->card_lock, flags);
2244         }
2245
2246 #ifdef CY_DEBUG_OPEN
2247         printk(KERN_DEBUG "cyc shutdown done\n");
2248 #endif
2249 }                               /* shutdown */
2250
2251 /*
2252  * ------------------------------------------------------------
2253  * cy_open() and friends
2254  * ------------------------------------------------------------
2255  */
2256
2257 static int
2258 block_til_ready(struct tty_struct *tty, struct file *filp,
2259                 struct cyclades_port *info)
2260 {
2261         DECLARE_WAITQUEUE(wait, current);
2262         struct cyclades_card *cinfo;
2263         unsigned long flags;
2264         int chip, channel, index;
2265         int retval;
2266         void __iomem *base_addr;
2267
2268         cinfo = info->card;
2269         channel = info->line - cinfo->first_line;
2270
2271         /*
2272          * If the device is in the middle of being closed, then block
2273          * until it's done, and then try again.
2274          */
2275         if (tty_hung_up_p(filp) || (info->flags & ASYNC_CLOSING)) {
2276                 wait_event_interruptible(info->close_wait,
2277                                 !(info->flags & ASYNC_CLOSING));
2278                 return (info->flags & ASYNC_HUP_NOTIFY) ? -EAGAIN: -ERESTARTSYS;
2279         }
2280
2281         /*
2282          * If non-blocking mode is set, then make the check up front
2283          * and then exit.
2284          */
2285         if ((filp->f_flags & O_NONBLOCK) || (tty->flags & (1 << TTY_IO_ERROR))) {
2286                 info->flags |= ASYNC_NORMAL_ACTIVE;
2287                 return 0;
2288         }
2289
2290         /*
2291          * Block waiting for the carrier detect and the line to become
2292          * free (i.e., not in use by the callout).  While we are in
2293          * this loop, info->count is dropped by one, so that
2294          * cy_close() knows when to free things.  We restore it upon
2295          * exit, either normal or abnormal.
2296          */
2297         retval = 0;
2298         add_wait_queue(&info->open_wait, &wait);
2299 #ifdef CY_DEBUG_OPEN
2300         printk(KERN_DEBUG "cyc block_til_ready before block: ttyC%d, "
2301                 "count = %d\n", info->line, info->count);
2302 #endif
2303         spin_lock_irqsave(&cinfo->card_lock, flags);
2304         if (!tty_hung_up_p(filp))
2305                 info->count--;
2306         spin_unlock_irqrestore(&cinfo->card_lock, flags);
2307 #ifdef CY_DEBUG_COUNT
2308         printk(KERN_DEBUG "cyc block_til_ready: (%d): decrementing count to "
2309                 "%d\n", current->pid, info->count);
2310 #endif
2311         info->blocked_open++;
2312
2313         if (!IS_CYC_Z(*cinfo)) {
2314                 chip = channel >> 2;
2315                 channel &= 0x03;
2316                 index = cinfo->bus_index;
2317                 base_addr = cinfo->base_addr + (cy_chip_offset[chip] << index);
2318
2319                 while (1) {
2320                         spin_lock_irqsave(&cinfo->card_lock, flags);
2321                         if ((tty->termios->c_cflag & CBAUD)) {
2322                                 cy_writeb(base_addr + (CyCAR << index),
2323                                           (u_char) channel);
2324                                 cy_writeb(base_addr + (CyMSVR1 << index),
2325                                           CyRTS);
2326                                 cy_writeb(base_addr + (CyMSVR2 << index),
2327                                           CyDTR);
2328 #ifdef CY_DEBUG_DTR
2329                                 printk(KERN_DEBUG "cyc:block_til_ready raising "
2330                                         "DTR\n");
2331                                 printk(KERN_DEBUG "     status: 0x%x, 0x%x\n",
2332                                         readb(base_addr + (CyMSVR1 << index)),
2333                                         readb(base_addr + (CyMSVR2 << index)));
2334 #endif
2335                         }
2336                         spin_unlock_irqrestore(&cinfo->card_lock, flags);
2337
2338                         set_current_state(TASK_INTERRUPTIBLE);
2339                         if (tty_hung_up_p(filp) ||
2340                                         !(info->flags & ASYNC_INITIALIZED)) {
2341                                 retval = ((info->flags & ASYNC_HUP_NOTIFY) ?
2342                                           -EAGAIN : -ERESTARTSYS);
2343                                 break;
2344                         }
2345
2346                         spin_lock_irqsave(&cinfo->card_lock, flags);
2347                         cy_writeb(base_addr + (CyCAR << index),
2348                                   (u_char) channel);
2349                         if (!(info->flags & ASYNC_CLOSING) && (C_CLOCAL(tty) ||
2350                                         (readb(base_addr +
2351                                                 (CyMSVR1 << index)) & CyDCD))) {
2352                                 spin_unlock_irqrestore(&cinfo->card_lock, flags);
2353                                 break;
2354                         }
2355                         spin_unlock_irqrestore(&cinfo->card_lock, flags);
2356
2357                         if (signal_pending(current)) {
2358                                 retval = -ERESTARTSYS;
2359                                 break;
2360                         }
2361 #ifdef CY_DEBUG_OPEN
2362                         printk(KERN_DEBUG "cyc block_til_ready blocking: "
2363                                 "ttyC%d, count = %d\n",
2364                                 info->line, info->count);
2365 #endif
2366                         schedule();
2367                 }
2368         } else {
2369                 struct FIRM_ID __iomem *firm_id;
2370                 struct ZFW_CTRL __iomem *zfw_ctrl;
2371                 struct BOARD_CTRL __iomem *board_ctrl;
2372                 struct CH_CTRL __iomem *ch_ctrl;
2373                 int retval;
2374
2375                 base_addr = cinfo->base_addr;
2376                 firm_id = base_addr + ID_ADDRESS;
2377                 if (!ISZLOADED(*cinfo)) {
2378                         __set_current_state(TASK_RUNNING);
2379                         remove_wait_queue(&info->open_wait, &wait);
2380                         return -EINVAL;
2381                 }
2382
2383                 zfw_ctrl = base_addr + (readl(&firm_id->zfwctrl_addr)& 0xfffff);
2384                 board_ctrl = &zfw_ctrl->board_ctrl;
2385                 ch_ctrl = zfw_ctrl->ch_ctrl;
2386
2387                 while (1) {
2388                         if ((tty->termios->c_cflag & CBAUD)) {
2389                                 cy_writel(&ch_ctrl[channel].rs_control,
2390                                         readl(&ch_ctrl[channel].rs_control) |
2391                                         C_RS_RTS | C_RS_DTR);
2392                                 retval = cyz_issue_cmd(cinfo,
2393                                         channel, C_CM_IOCTLM, 0L);
2394                                 if (retval != 0) {
2395                                         printk(KERN_ERR "cyc:block_til_ready "
2396                                                 "retval on ttyC%d was %x\n",
2397                                                 info->line, retval);
2398                                 }
2399 #ifdef CY_DEBUG_DTR
2400                                 printk(KERN_DEBUG "cyc:block_til_ready raising "
2401                                         "Z DTR\n");
2402 #endif
2403                         }
2404
2405                         set_current_state(TASK_INTERRUPTIBLE);
2406                         if (tty_hung_up_p(filp) ||
2407                                         !(info->flags & ASYNC_INITIALIZED)) {
2408                                 retval = ((info->flags & ASYNC_HUP_NOTIFY) ?
2409                                           -EAGAIN : -ERESTARTSYS);
2410                                 break;
2411                         }
2412                         if (!(info->flags & ASYNC_CLOSING) && (C_CLOCAL(tty) ||
2413                                         (readl(&ch_ctrl[channel].rs_status) &
2414                                                 C_RS_DCD))) {
2415                                 break;
2416                         }
2417                         if (signal_pending(current)) {
2418                                 retval = -ERESTARTSYS;
2419                                 break;
2420                         }
2421 #ifdef CY_DEBUG_OPEN
2422                         printk(KERN_DEBUG "cyc block_til_ready blocking: "
2423                                 "ttyC%d, count = %d\n",
2424                                 info->line, info->count);
2425 #endif
2426                         schedule();
2427                 }
2428         }
2429         __set_current_state(TASK_RUNNING);
2430         remove_wait_queue(&info->open_wait, &wait);
2431         if (!tty_hung_up_p(filp)) {
2432                 info->count++;
2433 #ifdef CY_DEBUG_COUNT
2434                 printk(KERN_DEBUG "cyc:block_til_ready (%d): incrementing "
2435                         "count to %d\n", current->pid, info->count);
2436 #endif
2437         }
2438         info->blocked_open--;
2439 #ifdef CY_DEBUG_OPEN
2440         printk(KERN_DEBUG "cyc:block_til_ready after blocking: ttyC%d, "
2441                 "count = %d\n", info->line, info->count);
2442 #endif
2443         if (retval)
2444                 return retval;
2445         info->flags |= ASYNC_NORMAL_ACTIVE;
2446         return 0;
2447 }                               /* block_til_ready */
2448
2449 /*
2450  * This routine is called whenever a serial port is opened.  It
2451  * performs the serial-specific initialization for the tty structure.
2452  */
2453 static int cy_open(struct tty_struct *tty, struct file *filp)
2454 {
2455         struct cyclades_port *info;
2456         unsigned int i;
2457         int retval, line;
2458
2459         line = tty->index;
2460         if ((line < 0) || (NR_PORTS <= line)) {
2461                 return -ENODEV;
2462         }
2463         for (i = 0; i < NR_CARDS; i++)
2464                 if (line < cy_card[i].first_line + cy_card[i].nports &&
2465                                 line >= cy_card[i].first_line)
2466                         break;
2467         if (i >= NR_CARDS)
2468                 return -ENODEV;
2469         info = &cy_card[i].ports[line - cy_card[i].first_line];
2470         if (info->line < 0) {
2471                 return -ENODEV;
2472         }
2473
2474         /* If the card's firmware hasn't been loaded,
2475            treat it as absent from the system.  This
2476            will make the user pay attention.
2477          */
2478         if (IS_CYC_Z(*info->card)) {
2479                 struct cyclades_card *cinfo = info->card;
2480                 struct FIRM_ID __iomem *firm_id = cinfo->base_addr + ID_ADDRESS;
2481
2482                 if (!ISZLOADED(*cinfo)) {
2483                         if (((ZE_V1 == readl(&((struct RUNTIME_9060 __iomem *)
2484                                          (cinfo->ctl_addr))->mail_box_0)) &&
2485                                         Z_FPGA_CHECK(*cinfo)) &&
2486                                         (ZFIRM_HLT == readl(
2487                                                 &firm_id->signature))) {
2488                                 printk(KERN_ERR "cyc:Cyclades-Z Error: you "
2489                                         "need an external power supply for "
2490                                         "this number of ports.\nFirmware "
2491                                         "halted.\n");
2492                         } else {
2493                                 printk(KERN_ERR "cyc:Cyclades-Z firmware not "
2494                                         "yet loaded\n");
2495                         }
2496                         return -ENODEV;
2497                 }
2498 #ifdef CONFIG_CYZ_INTR
2499                 else {
2500                 /* In case this Z board is operating in interrupt mode, its
2501                    interrupts should be enabled as soon as the first open
2502                    happens to one of its ports. */
2503                         if (!cinfo->intr_enabled) {
2504                                 struct ZFW_CTRL __iomem *zfw_ctrl;
2505                                 struct BOARD_CTRL __iomem *board_ctrl;
2506
2507                                 zfw_ctrl = cinfo->base_addr +
2508                                         (readl(&firm_id->zfwctrl_addr) &
2509                                          0xfffff);
2510
2511                                 board_ctrl = &zfw_ctrl->board_ctrl;
2512
2513                                 /* Enable interrupts on the PLX chip */
2514                                 cy_writew(cinfo->ctl_addr + 0x68,
2515                                         readw(cinfo->ctl_addr + 0x68) | 0x0900);
2516                                 /* Enable interrupts on the FW */
2517                                 retval = cyz_issue_cmd(cinfo, 0,
2518                                                 C_CM_IRQ_ENBL, 0L);
2519                                 if (retval != 0) {
2520                                         printk(KERN_ERR "cyc:IRQ enable retval "
2521                                                 "was %x\n", retval);
2522                                 }
2523                                 cinfo->nports =
2524                                         (int)readl(&board_ctrl->n_channel);
2525                                 cinfo->intr_enabled = 1;
2526                         }
2527                 }
2528 #endif                          /* CONFIG_CYZ_INTR */
2529                 /* Make sure this Z port really exists in hardware */
2530                 if (info->line > (cinfo->first_line + cinfo->nports - 1))
2531                         return -ENODEV;
2532         }
2533 #ifdef CY_DEBUG_OTHER
2534         printk(KERN_DEBUG "cyc:cy_open ttyC%d\n", info->line);
2535 #endif
2536         tty->driver_data = info;
2537         info->tty = tty;
2538         if (serial_paranoia_check(info, tty->name, "cy_open")) {
2539                 return -ENODEV;
2540         }
2541 #ifdef CY_DEBUG_OPEN
2542         printk(KERN_DEBUG "cyc:cy_open ttyC%d, count = %d\n", info->line,
2543                         info->count);
2544 #endif
2545         info->count++;
2546 #ifdef CY_DEBUG_COUNT
2547         printk(KERN_DEBUG "cyc:cy_open (%d): incrementing count to %d\n",
2548                 current->pid, info->count);
2549 #endif
2550
2551         /*
2552          * If the port is the middle of closing, bail out now
2553          */
2554         if (tty_hung_up_p(filp) || (info->flags & ASYNC_CLOSING)) {
2555                 wait_event_interruptible(info->close_wait,
2556                                 !(info->flags & ASYNC_CLOSING));
2557                 return (info->flags & ASYNC_HUP_NOTIFY) ? -EAGAIN: -ERESTARTSYS;
2558         }
2559
2560         /*
2561          * Start up serial port
2562          */
2563         retval = startup(info);
2564         if (retval) {
2565                 return retval;
2566         }
2567
2568         retval = block_til_ready(tty, filp, info);
2569         if (retval) {
2570 #ifdef CY_DEBUG_OPEN
2571                 printk(KERN_DEBUG "cyc:cy_open returning after block_til_ready "
2572                         "with %d\n", retval);
2573 #endif
2574                 return retval;
2575         }
2576
2577         info->throttle = 0;
2578
2579 #ifdef CY_DEBUG_OPEN
2580         printk(KERN_DEBUG "cyc:cy_open done\n");
2581 #endif
2582         return 0;
2583 }                               /* cy_open */
2584
2585 /*
2586  * cy_wait_until_sent() --- wait until the transmitter is empty
2587  */
2588 static void cy_wait_until_sent(struct tty_struct *tty, int timeout)
2589 {
2590         struct cyclades_card *card;
2591         struct cyclades_port *info = tty->driver_data;
2592         void __iomem *base_addr;
2593         int chip, channel, index;
2594         unsigned long orig_jiffies;
2595         int char_time;
2596
2597         if (serial_paranoia_check(info, tty->name, "cy_wait_until_sent"))
2598                 return;
2599
2600         if (info->xmit_fifo_size == 0)
2601                 return;         /* Just in case.... */
2602
2603         orig_jiffies = jiffies;
2604         /*
2605          * Set the check interval to be 1/5 of the estimated time to
2606          * send a single character, and make it at least 1.  The check
2607          * interval should also be less than the timeout.
2608          *
2609          * Note: we have to use pretty tight timings here to satisfy
2610          * the NIST-PCTS.
2611          */
2612         char_time = (info->timeout - HZ / 50) / info->xmit_fifo_size;
2613         char_time = char_time / 5;
2614         if (char_time <= 0)
2615                 char_time = 1;
2616         if (timeout < 0)
2617                 timeout = 0;
2618         if (timeout)
2619                 char_time = min(char_time, timeout);
2620         /*
2621          * If the transmitter hasn't cleared in twice the approximate
2622          * amount of time to send the entire FIFO, it probably won't
2623          * ever clear.  This assumes the UART isn't doing flow
2624          * control, which is currently the case.  Hence, if it ever
2625          * takes longer than info->timeout, this is probably due to a
2626          * UART bug of some kind.  So, we clamp the timeout parameter at
2627          * 2*info->timeout.
2628          */
2629         if (!timeout || timeout > 2 * info->timeout)
2630                 timeout = 2 * info->timeout;
2631 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
2632         printk(KERN_DEBUG "In cy_wait_until_sent(%d) check=%d, jiff=%lu...",
2633                 timeout, char_time, jiffies);
2634 #endif
2635         card = info->card;
2636         channel = (info->line) - (card->first_line);
2637         if (!IS_CYC_Z(*card)) {
2638                 chip = channel >> 2;
2639                 channel &= 0x03;
2640                 index = card->bus_index;
2641                 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
2642                 while (readb(base_addr + (CySRER << index)) & CyTxRdy) {
2643 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
2644                         printk(KERN_DEBUG "Not clean (jiff=%lu)...", jiffies);
2645 #endif
2646                         if (msleep_interruptible(jiffies_to_msecs(char_time)))
2647                                 break;
2648                         if (timeout && time_after(jiffies, orig_jiffies +
2649                                         timeout))
2650                                 break;
2651                 }
2652         }
2653         /* Run one more char cycle */
2654         msleep_interruptible(jiffies_to_msecs(char_time * 5));
2655 #ifdef CY_DEBUG_WAIT_UNTIL_SENT
2656         printk(KERN_DEBUG "Clean (jiff=%lu)...done\n", jiffies);
2657 #endif
2658 }
2659
2660 /*
2661  * This routine is called when a particular tty device is closed.
2662  */
2663 static void cy_close(struct tty_struct *tty, struct file *filp)
2664 {
2665         struct cyclades_port *info = tty->driver_data;
2666         struct cyclades_card *card;
2667         unsigned long flags;
2668
2669 #ifdef CY_DEBUG_OTHER
2670         printk(KERN_DEBUG "cyc:cy_close ttyC%d\n", info->line);
2671 #endif
2672
2673         if (!info || serial_paranoia_check(info, tty->name, "cy_close")) {
2674                 return;
2675         }
2676
2677         card = info->card;
2678
2679         spin_lock_irqsave(&card->card_lock, flags);
2680         /* If the TTY is being hung up, nothing to do */
2681         if (tty_hung_up_p(filp)) {
2682                 spin_unlock_irqrestore(&card->card_lock, flags);
2683                 return;
2684         }
2685 #ifdef CY_DEBUG_OPEN
2686         printk(KERN_DEBUG "cyc:cy_close ttyC%d, count = %d\n", info->line,
2687                 info->count);
2688 #endif
2689         if ((tty->count == 1) && (info->count != 1)) {
2690                 /*
2691                  * Uh, oh.  tty->count is 1, which means that the tty
2692                  * structure will be freed.  Info->count should always
2693                  * be one in these conditions.  If it's greater than
2694                  * one, we've got real problems, since it means the
2695                  * serial port won't be shutdown.
2696                  */
2697                 printk(KERN_ERR "cyc:cy_close: bad serial port count; "
2698                         "tty->count is 1, info->count is %d\n", info->count);
2699                 info->count = 1;
2700         }
2701 #ifdef CY_DEBUG_COUNT
2702         printk(KERN_DEBUG  "cyc:cy_close at (%d): decrementing count to %d\n",
2703                 current->pid, info->count - 1);
2704 #endif
2705         if (--info->count < 0) {
2706 #ifdef CY_DEBUG_COUNT
2707                 printk(KERN_DEBUG "cyc:cyc_close setting count to 0\n");
2708 #endif
2709                 info->count = 0;
2710         }
2711         if (info->count) {
2712                 spin_unlock_irqrestore(&card->card_lock, flags);
2713                 return;
2714         }
2715         info->flags |= ASYNC_CLOSING;
2716
2717         /*
2718          * Now we wait for the transmit buffer to clear; and we notify
2719          * the line discipline to only process XON/XOFF characters.
2720          */
2721         tty->closing = 1;
2722         spin_unlock_irqrestore(&card->card_lock, flags);
2723         if (info->closing_wait != CY_CLOSING_WAIT_NONE) {
2724                 tty_wait_until_sent(tty, info->closing_wait);
2725         }
2726         spin_lock_irqsave(&card->card_lock, flags);
2727
2728         if (!IS_CYC_Z(*card)) {
2729                 int channel = info->line - card->first_line;
2730                 int index = card->bus_index;
2731                 void __iomem *base_addr = card->base_addr +
2732                         (cy_chip_offset[channel >> 2] << index);
2733                 /* Stop accepting input */
2734                 channel &= 0x03;
2735                 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
2736                 cy_writeb(base_addr + (CySRER << index),
2737                           readb(base_addr + (CySRER << index)) & ~CyRxData);
2738                 if (info->flags & ASYNC_INITIALIZED) {
2739                         /* Waiting for on-board buffers to be empty before closing
2740                            the port */
2741                         spin_unlock_irqrestore(&card->card_lock, flags);
2742                         cy_wait_until_sent(tty, info->timeout);
2743                         spin_lock_irqsave(&card->card_lock, flags);
2744                 }
2745         } else {
2746 #ifdef Z_WAKE
2747                 /* Waiting for on-board buffers to be empty before closing the port */
2748                 void __iomem *base_addr = card->base_addr;
2749                 struct FIRM_ID __iomem *firm_id = base_addr + ID_ADDRESS;
2750                 struct ZFW_CTRL __iomem *zfw_ctrl =
2751                     base_addr + (readl(&firm_id->zfwctrl_addr) & 0xfffff);
2752                 struct CH_CTRL __iomem *ch_ctrl = zfw_ctrl->ch_ctrl;
2753                 int channel = info->line - card->first_line;
2754                 int retval;
2755
2756                 if (readl(&ch_ctrl[channel].flow_status) != C_FS_TXIDLE) {
2757                         retval = cyz_issue_cmd(card, channel, C_CM_IOCTLW, 0L);
2758                         if (retval != 0) {
2759                                 printk(KERN_DEBUG "cyc:cy_close retval on "
2760                                         "ttyC%d was %x\n", info->line, retval);
2761                         }
2762                         spin_unlock_irqrestore(&card->card_lock, flags);
2763                         wait_for_completion_interruptible(&info->shutdown_wait);
2764                         spin_lock_irqsave(&card->card_lock, flags);
2765                 }
2766 #endif
2767         }
2768
2769         spin_unlock_irqrestore(&card->card_lock, flags);
2770         shutdown(info);
2771         if (tty->driver->flush_buffer)
2772                 tty->driver->flush_buffer(tty);
2773         tty_ldisc_flush(tty);
2774         spin_lock_irqsave(&card->card_lock, flags);
2775
2776         tty->closing = 0;
2777         info->event = 0;
2778         info->tty = NULL;
2779         if (info->blocked_open) {
2780                 spin_unlock_irqrestore(&card->card_lock, flags);
2781                 if (info->close_delay) {
2782                         msleep_interruptible(jiffies_to_msecs
2783                                                 (info->close_delay));
2784                 }
2785                 wake_up_interruptible(&info->open_wait);
2786                 spin_lock_irqsave(&card->card_lock, flags);
2787         }
2788         info->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
2789         wake_up_interruptible(&info->close_wait);
2790
2791 #ifdef CY_DEBUG_OTHER
2792         printk(KERN_DEBUG "cyc:cy_close done\n");
2793 #endif
2794
2795         spin_unlock_irqrestore(&card->card_lock, flags);
2796 }                               /* cy_close */
2797
2798 /* This routine gets called when tty_write has put something into
2799  * the write_queue.  The characters may come from user space or
2800  * kernel space.
2801  *
2802  * This routine will return the number of characters actually
2803  * accepted for writing.
2804  *
2805  * If the port is not already transmitting stuff, start it off by
2806  * enabling interrupts.  The interrupt service routine will then
2807  * ensure that the characters are sent.
2808  * If the port is already active, there is no need to kick it.
2809  *
2810  */
2811 static int cy_write(struct tty_struct *tty, const unsigned char *buf, int count)
2812 {
2813         struct cyclades_port *info = tty->driver_data;
2814         unsigned long flags;
2815         int c, ret = 0;
2816
2817 #ifdef CY_DEBUG_IO
2818         printk(KERN_DEBUG "cyc:cy_write ttyC%d\n", info->line);
2819 #endif
2820
2821         if (serial_paranoia_check(info, tty->name, "cy_write")) {
2822                 return 0;
2823         }
2824
2825         if (!info->xmit_buf)
2826                 return 0;
2827
2828         spin_lock_irqsave(&info->card->card_lock, flags);
2829         while (1) {
2830                 c = min(count, min((int)(SERIAL_XMIT_SIZE - info->xmit_cnt - 1),
2831                                    (int)(SERIAL_XMIT_SIZE - info->xmit_head)));
2832
2833                 if (c <= 0)
2834                         break;
2835
2836                 memcpy(info->xmit_buf + info->xmit_head, buf, c);
2837                 info->xmit_head = (info->xmit_head + c) &
2838                         (SERIAL_XMIT_SIZE - 1);
2839                 info->xmit_cnt += c;
2840                 buf += c;
2841                 count -= c;
2842                 ret += c;
2843         }
2844         spin_unlock_irqrestore(&info->card->card_lock, flags);
2845
2846         info->idle_stats.xmit_bytes += ret;
2847         info->idle_stats.xmit_idle = jiffies;
2848
2849         if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) {
2850                 start_xmit(info);
2851         }
2852         return ret;
2853 }                               /* cy_write */
2854
2855 /*
2856  * This routine is called by the kernel to write a single
2857  * character to the tty device.  If the kernel uses this routine,
2858  * it must call the flush_chars() routine (if defined) when it is
2859  * done stuffing characters into the driver.  If there is no room
2860  * in the queue, the character is ignored.
2861  */
2862 static void cy_put_char(struct tty_struct *tty, unsigned char ch)
2863 {
2864         struct cyclades_port *info = tty->driver_data;
2865         unsigned long flags;
2866
2867 #ifdef CY_DEBUG_IO
2868         printk(KERN_DEBUG "cyc:cy_put_char ttyC%d\n", info->line);
2869 #endif
2870
2871         if (serial_paranoia_check(info, tty->name, "cy_put_char"))
2872                 return;
2873
2874         if (!info->xmit_buf)
2875                 return;
2876
2877         spin_lock_irqsave(&info->card->card_lock, flags);
2878         if (info->xmit_cnt >= (int)(SERIAL_XMIT_SIZE - 1)) {
2879                 spin_unlock_irqrestore(&info->card->card_lock, flags);
2880                 return;
2881         }
2882
2883         info->xmit_buf[info->xmit_head++] = ch;
2884         info->xmit_head &= SERIAL_XMIT_SIZE - 1;
2885         info->xmit_cnt++;
2886         info->idle_stats.xmit_bytes++;
2887         info->idle_stats.xmit_idle = jiffies;
2888         spin_unlock_irqrestore(&info->card->card_lock, flags);
2889 }                               /* cy_put_char */
2890
2891 /*
2892  * This routine is called by the kernel after it has written a
2893  * series of characters to the tty device using put_char().  
2894  */
2895 static void cy_flush_chars(struct tty_struct *tty)
2896 {
2897         struct cyclades_port *info = tty->driver_data;
2898
2899 #ifdef CY_DEBUG_IO
2900         printk(KERN_DEBUG "cyc:cy_flush_chars ttyC%d\n", info->line);
2901 #endif
2902
2903         if (serial_paranoia_check(info, tty->name, "cy_flush_chars"))
2904                 return;
2905
2906         if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
2907                         !info->xmit_buf)
2908                 return;
2909
2910         start_xmit(info);
2911 }                               /* cy_flush_chars */
2912
2913 /*
2914  * This routine returns the numbers of characters the tty driver
2915  * will accept for queuing to be written.  This number is subject
2916  * to change as output buffers get emptied, or if the output flow
2917  * control is activated.
2918  */
2919 static int cy_write_room(struct tty_struct *tty)
2920 {
2921         struct cyclades_port *info = tty->driver_data;
2922         int ret;
2923
2924 #ifdef CY_DEBUG_IO
2925         printk(KERN_DEBUG "cyc:cy_write_room ttyC%d\n", info->line);
2926 #endif
2927
2928         if (serial_paranoia_check(info, tty->name, "cy_write_room"))
2929                 return 0;
2930         ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;
2931         if (ret < 0)
2932                 ret = 0;
2933         return ret;
2934 }                               /* cy_write_room */
2935
2936 static int cy_chars_in_buffer(struct tty_struct *tty)
2937 {
2938         struct cyclades_card *card;
2939         struct cyclades_port *info = tty->driver_data;
2940         int channel;
2941
2942         if (serial_paranoia_check(info, tty->name, "cy_chars_in_buffer"))
2943                 return 0;
2944
2945         card = info->card;
2946         channel = (info->line) - (card->first_line);
2947
2948 #ifdef Z_EXT_CHARS_IN_BUFFER
2949         if (!IS_CYC_Z(cy_card[card])) {
2950 #endif                          /* Z_EXT_CHARS_IN_BUFFER */
2951 #ifdef CY_DEBUG_IO
2952                 printk(KERN_DEBUG "cyc:cy_chars_in_buffer ttyC%d %d\n",
2953                         info->line, info->xmit_cnt);
2954 #endif
2955                 return info->xmit_cnt;
2956 #ifdef Z_EXT_CHARS_IN_BUFFER
2957         } else {
2958                 static struct FIRM_ID *firm_id;
2959                 static struct ZFW_CTRL *zfw_ctrl;
2960                 static struct CH_CTRL *ch_ctrl;
2961                 static struct BUF_CTRL *buf_ctrl;
2962                 int char_count;
2963                 __u32 tx_put, tx_get, tx_bufsize;
2964
2965                 firm_id = card->base_addr + ID_ADDRESS;
2966                 zfw_ctrl = card->base_addr +
2967                         (readl(&firm_id->zfwctrl_addr) & 0xfffff);
2968                 ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]);
2969                 buf_ctrl = &(zfw_ctrl->buf_ctrl[channel]);
2970
2971                 tx_get = readl(&buf_ctrl->tx_get);
2972                 tx_put = readl(&buf_ctrl->tx_put);
2973                 tx_bufsize = readl(&buf_ctrl->tx_bufsize);
2974                 if (tx_put >= tx_get)
2975                         char_count = tx_put - tx_get;
2976                 else
2977                         char_count = tx_put - tx_get + tx_bufsize;
2978 #ifdef CY_DEBUG_IO
2979                 printk(KERN_DEBUG "cyc:cy_chars_in_buffer ttyC%d %d\n",
2980                         info->line, info->xmit_cnt + char_count);
2981 #endif
2982                 return info->xmit_cnt + char_count;
2983         }
2984 #endif                          /* Z_EXT_CHARS_IN_BUFFER */
2985 }                               /* cy_chars_in_buffer */
2986
2987 /*
2988  * ------------------------------------------------------------
2989  * cy_ioctl() and friends
2990  * ------------------------------------------------------------
2991  */
2992
2993 static void cyy_baud_calc(struct cyclades_port *info, __u32 baud)
2994 {
2995         int co, co_val, bpr;
2996         __u32 cy_clock = ((info->chip_rev >= CD1400_REV_J) ? 60000000 :
2997                         25000000);
2998
2999         if (baud == 0) {
3000                 info->tbpr = info->tco = info->rbpr = info->rco = 0;
3001                 return;
3002         }
3003
3004         /* determine which prescaler to use */
3005         for (co = 4, co_val = 2048; co; co--, co_val >>= 2) {
3006                 if (cy_clock / co_val / baud > 63)
3007                         break;
3008         }
3009
3010         bpr = (cy_clock / co_val * 2 / baud + 1) / 2;
3011         if (bpr > 255)
3012                 bpr = 255;
3013
3014         info->tbpr = info->rbpr = bpr;
3015         info->tco = info->rco = co;
3016 }
3017
3018 /*
3019  * This routine finds or computes the various line characteristics.
3020  * It used to be called config_setup
3021  */
3022 static void set_line_char(struct cyclades_port *info)
3023 {
3024         struct cyclades_card *card;
3025         unsigned long flags;
3026         void __iomem *base_addr;
3027         int chip, channel, index;
3028         unsigned cflag, iflag;
3029         unsigned short chip_number;
3030         int baud, baud_rate = 0;
3031         int i;
3032
3033         if (!info->tty || !info->tty->termios) {
3034                 return;
3035         }
3036         if (info->line == -1) {
3037                 return;
3038         }
3039         cflag = info->tty->termios->c_cflag;
3040         iflag = info->tty->termios->c_iflag;
3041
3042         /*
3043          * Set up the tty->alt_speed kludge
3044          */
3045         if (info->tty) {
3046                 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
3047                         info->tty->alt_speed = 57600;
3048                 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
3049                         info->tty->alt_speed = 115200;
3050                 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
3051                         info->tty->alt_speed = 230400;
3052                 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
3053                         info->tty->alt_speed = 460800;
3054         }
3055
3056         card = info->card;
3057         channel = info->line - card->first_line;
3058         chip_number = channel / 4;
3059
3060         if (!IS_CYC_Z(*card)) {
3061
3062                 index = card->bus_index;
3063
3064                 /* baud rate */
3065                 baud = tty_get_baud_rate(info->tty);
3066                 if (baud == 38400 && (info->flags & ASYNC_SPD_MASK) ==
3067                                 ASYNC_SPD_CUST) {
3068                         if (info->custom_divisor)
3069                                 baud_rate = info->baud / info->custom_divisor;
3070                         else
3071                                 baud_rate = info->baud;
3072                 } else if (baud > CD1400_MAX_SPEED) {
3073                         baud = CD1400_MAX_SPEED;
3074                 }
3075                 /* find the baud index */
3076                 for (i = 0; i < 20; i++) {
3077                         if (baud == baud_table[i]) {
3078                                 break;
3079                         }
3080                 }
3081                 if (i == 20) {
3082                         i = 19; /* CD1400_MAX_SPEED */
3083                 }
3084
3085                 if (baud == 38400 && (info->flags & ASYNC_SPD_MASK) ==
3086                                 ASYNC_SPD_CUST) {
3087                         cyy_baud_calc(info, baud_rate);
3088                 } else {
3089                         if (info->chip_rev >= CD1400_REV_J) {
3090                                 /* It is a CD1400 rev. J or later */
3091                                 info->tbpr = baud_bpr_60[i];    /* Tx BPR */
3092                                 info->tco = baud_co_60[i];      /* Tx CO */
3093                                 info->rbpr = baud_bpr_60[i];    /* Rx BPR */
3094                                 info->rco = baud_co_60[i];      /* Rx CO */
3095                         } else {
3096                                 info->tbpr = baud_bpr_25[i];    /* Tx BPR */
3097                                 info->tco = baud_co_25[i];      /* Tx CO */
3098                                 info->rbpr = baud_bpr_25[i];    /* Rx BPR */
3099                                 info->rco = baud_co_25[i];      /* Rx CO */
3100                         }
3101                 }
3102                 if (baud_table[i] == 134) {
3103                         /* get it right for 134.5 baud */
3104                         info->timeout = (info->xmit_fifo_size * HZ * 30 / 269) +
3105                                         2;
3106                 } else if (baud == 38400 && (info->flags & ASYNC_SPD_MASK) ==
3107                                 ASYNC_SPD_CUST) {
3108                         info->timeout = (info->xmit_fifo_size * HZ * 15 /
3109                                         baud_rate) + 2;
3110                 } else if (baud_table[i]) {
3111                         info->timeout = (info->xmit_fifo_size * HZ * 15 /
3112                                         baud_table[i]) + 2;
3113                         /* this needs to be propagated into the card info */
3114                 } else {
3115                         info->timeout = 0;
3116                 }
3117                 /* By tradition (is it a standard?) a baud rate of zero
3118                    implies the line should be/has been closed.  A bit
3119                    later in this routine such a test is performed. */
3120
3121                 /* byte size and parity */
3122                 info->cor5 = 0;
3123                 info->cor4 = 0;
3124                 /* receive threshold */
3125                 info->cor3 = (info->default_threshold ?
3126                                 info->default_threshold : baud_cor3[i]);
3127                 info->cor2 = CyETC;
3128                 switch (cflag & CSIZE) {
3129                 case CS5:
3130                         info->cor1 = Cy_5_BITS;
3131                         break;
3132                 case CS6:
3133                         info->cor1 = Cy_6_BITS;
3134                         break;
3135                 case CS7:
3136                         info->cor1 = Cy_7_BITS;
3137                         break;
3138                 case CS8:
3139                         info->cor1 = Cy_8_BITS;
3140                         break;
3141                 }
3142                 if (cflag & CSTOPB) {
3143                         info->cor1 |= Cy_2_STOP;
3144                 }
3145                 if (cflag & PARENB) {
3146                         if (cflag & PARODD) {
3147                                 info->cor1 |= CyPARITY_O;
3148                         } else {
3149                                 info->cor1 |= CyPARITY_E;
3150                         }
3151                 } else {
3152                         info->cor1 |= CyPARITY_NONE;
3153                 }
3154
3155                 /* CTS flow control flag */
3156                 if (cflag & CRTSCTS) {
3157                         info->flags |= ASYNC_CTS_FLOW;
3158                         info->cor2 |= CyCtsAE;
3159                 } else {
3160                         info->flags &= ~ASYNC_CTS_FLOW;
3161                         info->cor2 &= ~CyCtsAE;
3162                 }
3163                 if (cflag & CLOCAL)
3164                         info->flags &= ~ASYNC_CHECK_CD;
3165                 else
3166                         info->flags |= ASYNC_CHECK_CD;
3167
3168          /***********************************************
3169             The hardware option, CyRtsAO, presents RTS when
3170             the chip has characters to send.  Since most modems
3171             use RTS as reverse (inbound) flow control, this
3172             option is not used.  If inbound flow control is
3173             necessary, DTR can be programmed to provide the
3174             appropriate signals for use with a non-standard
3175             cable.  Contact Marcio Saito for details.
3176          ***********************************************/
3177
3178                 chip = channel >> 2;
3179                 channel &= 0x03;
3180                 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3181
3182                 spin_lock_irqsave(&card->card_lock, flags);
3183                 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
3184
3185                 /* tx and rx baud rate */
3186
3187                 cy_writeb(base_addr + (CyTCOR << index), info->tco);
3188                 cy_writeb(base_addr + (CyTBPR << index), info->tbpr);
3189                 cy_writeb(base_addr + (CyRCOR << index), info->rco);
3190                 cy_writeb(base_addr + (CyRBPR << index), info->rbpr);
3191
3192                 /* set line characteristics  according configuration */
3193
3194                 cy_writeb(base_addr + (CySCHR1 << index),
3195                           START_CHAR(info->tty));
3196                 cy_writeb(base_addr + (CySCHR2 << index), STOP_CHAR(info->tty));
3197                 cy_writeb(base_addr + (CyCOR1 << index), info->cor1);
3198                 cy_writeb(base_addr + (CyCOR2 << index), info->cor2);
3199                 cy_writeb(base_addr + (CyCOR3 << index), info->cor3);
3200                 cy_writeb(base_addr + (CyCOR4 << index), info->cor4);
3201                 cy_writeb(base_addr + (CyCOR5 << index), info->cor5);
3202
3203                 cyy_issue_cmd(base_addr, CyCOR_CHANGE | CyCOR1ch | CyCOR2ch |
3204                                 CyCOR3ch, index);
3205
3206                 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);      /* !!! Is this needed? */
3207                 cy_writeb(base_addr + (CyRTPR << index),
3208                         (info->default_timeout ? info->default_timeout : 0x02));
3209                 /* 10ms rx timeout */
3210
3211                 if (C_CLOCAL(info->tty)) {
3212                         /* without modem intr */
3213                         cy_writeb(base_addr + (CySRER << index),
3214                                 readb(base_addr + (CySRER << index)) | CyMdmCh);
3215                         /* act on 1->0 modem transitions */
3216                         if ((cflag & CRTSCTS) && info->rflow) {
3217                                 cy_writeb(base_addr + (CyMCOR1 << index),
3218                                           (CyCTS | rflow_thr[i]));
3219                         } else {
3220                                 cy_writeb(base_addr + (CyMCOR1 << index),
3221                                           CyCTS);
3222                         }
3223                         /* act on 0->1 modem transitions */
3224                         cy_writeb(base_addr + (CyMCOR2 << index), CyCTS);
3225                 } else {
3226                         /* without modem intr */
3227                         cy_writeb(base_addr + (CySRER << index),
3228                                   readb(base_addr +
3229                                            (CySRER << index)) | CyMdmCh);
3230                         /* act on 1->0 modem transitions */
3231                         if ((cflag & CRTSCTS) && info->rflow) {
3232                                 cy_writeb(base_addr + (CyMCOR1 << index),
3233                                           (CyDSR | CyCTS | CyRI | CyDCD |
3234                                            rflow_thr[i]));
3235                         } else {
3236                                 cy_writeb(base_addr + (CyMCOR1 << index),
3237                                           CyDSR | CyCTS | CyRI | CyDCD);
3238                         }
3239                         /* act on 0->1 modem transitions */
3240                         cy_writeb(base_addr + (CyMCOR2 << index),
3241                                   CyDSR | CyCTS | CyRI | CyDCD);
3242                 }
3243
3244                 if (i == 0) {   /* baud rate is zero, turn off line */
3245                         if (info->rtsdtr_inv) {
3246                                 cy_writeb(base_addr + (CyMSVR1 << index),
3247                                           ~CyRTS);
3248                         } else {
3249                                 cy_writeb(base_addr + (CyMSVR2 << index),
3250                                           ~CyDTR);
3251                         }
3252 #ifdef CY_DEBUG_DTR
3253                         printk(KERN_DEBUG "cyc:set_line_char dropping DTR\n");
3254                         printk(KERN_DEBUG "     status: 0x%x, 0x%x\n",
3255                                 readb(base_addr + (CyMSVR1 << index)),
3256                                 readb(base_addr + (CyMSVR2 << index)));
3257 #endif
3258                 } else {
3259                         if (info->rtsdtr_inv) {
3260                                 cy_writeb(base_addr + (CyMSVR1 << index),
3261                                           CyRTS);
3262                         } else {
3263                                 cy_writeb(base_addr + (CyMSVR2 << index),
3264                                           CyDTR);
3265                         }
3266 #ifdef CY_DEBUG_DTR
3267                         printk(KERN_DEBUG "cyc:set_line_char raising DTR\n");
3268                         printk(KERN_DEBUG "     status: 0x%x, 0x%x\n",
3269                                 readb(base_addr + (CyMSVR1 << index)),
3270                                 readb(base_addr + (CyMSVR2 << index)));
3271 #endif
3272                 }
3273
3274                 if (info->tty) {
3275                         clear_bit(TTY_IO_ERROR, &info->tty->flags);
3276                 }
3277                 spin_unlock_irqrestore(&card->card_lock, flags);
3278
3279         } else {
3280                 struct FIRM_ID __iomem *firm_id;
3281                 struct ZFW_CTRL __iomem *zfw_ctrl;
3282                 struct BOARD_CTRL __iomem *board_ctrl;
3283                 struct CH_CTRL __iomem *ch_ctrl;
3284                 struct BUF_CTRL __iomem *buf_ctrl;
3285                 __u32 sw_flow;
3286                 int retval;
3287
3288                 firm_id = card->base_addr + ID_ADDRESS;
3289                 if (!ISZLOADED(*card)) {
3290                         return;
3291                 }
3292
3293                 zfw_ctrl = card->base_addr +
3294                         (readl(&firm_id->zfwctrl_addr) & 0xfffff);
3295                 board_ctrl = &zfw_ctrl->board_ctrl;
3296                 ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]);
3297                 buf_ctrl = &zfw_ctrl->buf_ctrl[channel];
3298
3299                 /* baud rate */
3300                 baud = tty_get_baud_rate(info->tty);
3301                 if (baud == 38400 && (info->flags & ASYNC_SPD_MASK) ==
3302                                 ASYNC_SPD_CUST) {
3303                         if (info->custom_divisor)
3304                                 baud_rate = info->baud / info->custom_divisor;
3305                         else
3306                                 baud_rate = info->baud;
3307                 } else if (baud > CYZ_MAX_SPEED) {
3308                         baud = CYZ_MAX_SPEED;
3309                 }
3310                 cy_writel(&ch_ctrl->comm_baud, baud);
3311
3312                 if (baud == 134) {
3313                         /* get it right for 134.5 baud */
3314                         info->timeout = (info->xmit_fifo_size * HZ * 30 / 269) +
3315                                         2;
3316                 } else if (baud == 38400 && (info->flags & ASYNC_SPD_MASK) ==
3317                                 ASYNC_SPD_CUST) {
3318                         info->timeout = (info->xmit_fifo_size * HZ * 15 /
3319                                         baud_rate) + 2;
3320                 } else if (baud) {
3321                         info->timeout = (info->xmit_fifo_size * HZ * 15 /
3322                                         baud) + 2;
3323                         /* this needs to be propagated into the card info */
3324                 } else {
3325                         info->timeout = 0;
3326                 }
3327
3328                 /* byte size and parity */
3329                 switch (cflag & CSIZE) {
3330                 case CS5:
3331                         cy_writel(&ch_ctrl->comm_data_l, C_DL_CS5);
3332                         break;
3333                 case CS6:
3334                         cy_writel(&ch_ctrl->comm_data_l, C_DL_CS6);
3335                         break;
3336                 case CS7:
3337                         cy_writel(&ch_ctrl->comm_data_l, C_DL_CS7);
3338                         break;
3339                 case CS8:
3340                         cy_writel(&ch_ctrl->comm_data_l, C_DL_CS8);
3341                         break;
3342                 }
3343                 if (cflag & CSTOPB) {
3344                         cy_writel(&ch_ctrl->comm_data_l,
3345                                   readl(&ch_ctrl->comm_data_l) | C_DL_2STOP);
3346                 } else {
3347                         cy_writel(&ch_ctrl->comm_data_l,
3348                                   readl(&ch_ctrl->comm_data_l) | C_DL_1STOP);
3349                 }
3350                 if (cflag & PARENB) {
3351                         if (cflag & PARODD) {
3352                                 cy_writel(&ch_ctrl->comm_parity, C_PR_ODD);
3353                         } else {
3354                                 cy_writel(&ch_ctrl->comm_parity, C_PR_EVEN);
3355                         }
3356                 } else {
3357                         cy_writel(&ch_ctrl->comm_parity, C_PR_NONE);
3358                 }
3359
3360                 /* CTS flow control flag */
3361                 if (cflag & CRTSCTS) {
3362                         cy_writel(&ch_ctrl->hw_flow,
3363                                 readl(&ch_ctrl->hw_flow) | C_RS_CTS | C_RS_RTS);
3364                 } else {
3365                         cy_writel(&ch_ctrl->hw_flow, readl(&ch_ctrl->hw_flow) &
3366                                         ~(C_RS_CTS | C_RS_RTS));
3367                 }
3368                 /* As the HW flow control is done in firmware, the driver
3369                    doesn't need to care about it */
3370                 info->flags &= ~ASYNC_CTS_FLOW;
3371
3372                 /* XON/XOFF/XANY flow control flags */
3373                 sw_flow = 0;
3374                 if (iflag & IXON) {
3375                         sw_flow |= C_FL_OXX;
3376                         if (iflag & IXANY)
3377                                 sw_flow |= C_FL_OIXANY;
3378                 }
3379                 cy_writel(&ch_ctrl->sw_flow, sw_flow);
3380
3381                 retval = cyz_issue_cmd(card, channel, C_CM_IOCTL, 0L);
3382                 if (retval != 0) {
3383                         printk(KERN_ERR "cyc:set_line_char retval on ttyC%d "
3384                                 "was %x\n", info->line, retval);
3385                 }
3386
3387                 /* CD sensitivity */
3388                 if (cflag & CLOCAL) {
3389                         info->flags &= ~ASYNC_CHECK_CD;
3390                 } else {
3391                         info->flags |= ASYNC_CHECK_CD;
3392                 }
3393
3394                 if (baud == 0) {        /* baud rate is zero, turn off line */
3395                         cy_writel(&ch_ctrl->rs_control,
3396                                   readl(&ch_ctrl->rs_control) & ~C_RS_DTR);
3397 #ifdef CY_DEBUG_DTR
3398                         printk(KERN_DEBUG "cyc:set_line_char dropping Z DTR\n");
3399 #endif
3400                 } else {
3401                         cy_writel(&ch_ctrl->rs_control,
3402                                   readl(&ch_ctrl->rs_control) | C_RS_DTR);
3403 #ifdef CY_DEBUG_DTR
3404                         printk(KERN_DEBUG "cyc:set_line_char raising Z DTR\n");
3405 #endif
3406                 }
3407
3408                 retval = cyz_issue_cmd(card, channel, C_CM_IOCTLM,0L);
3409                 if (retval != 0) {
3410                         printk(KERN_ERR "cyc:set_line_char(2) retval on ttyC%d "
3411                                 "was %x\n", info->line, retval);
3412                 }
3413
3414                 if (info->tty) {
3415                         clear_bit(TTY_IO_ERROR, &info->tty->flags);
3416                 }
3417         }
3418 }                               /* set_line_char */
3419
3420 static int
3421 get_serial_info(struct cyclades_port *info,
3422                 struct serial_struct __user * retinfo)
3423 {
3424         struct serial_struct tmp;
3425         struct cyclades_card *cinfo = info->card;
3426
3427         if (!retinfo)
3428                 return -EFAULT;
3429         memset(&tmp, 0, sizeof(tmp));
3430         tmp.type = info->type;
3431         tmp.line = info->line;
3432         tmp.port = (info->card - cy_card) * 0x100 + info->line -
3433                 cinfo->first_line;
3434         tmp.irq = cinfo->irq;
3435         tmp.flags = info->flags;
3436         tmp.close_delay = info->close_delay;
3437         tmp.closing_wait = info->closing_wait;
3438         tmp.baud_base = info->baud;
3439         tmp.custom_divisor = info->custom_divisor;
3440         tmp.hub6 = 0;           /*!!! */
3441         return copy_to_user(retinfo, &tmp, sizeof(*retinfo)) ? -EFAULT : 0;
3442 }                               /* get_serial_info */
3443
3444 static int
3445 set_serial_info(struct cyclades_port *info,
3446                 struct serial_struct __user * new_info)
3447 {
3448         struct serial_struct new_serial;
3449         struct cyclades_port old_info;
3450
3451         if (copy_from_user(&new_serial, new_info, sizeof(new_serial)))
3452                 return -EFAULT;
3453         old_info = *info;
3454
3455         if (!capable(CAP_SYS_ADMIN)) {
3456                 if (new_serial.close_delay != info->close_delay ||
3457                                 new_serial.baud_base != info->baud ||
3458                                 (new_serial.flags & ASYNC_FLAGS &
3459                                         ~ASYNC_USR_MASK) !=
3460                                 (info->flags & ASYNC_FLAGS & ~ASYNC_USR_MASK))
3461                         return -EPERM;
3462                 info->flags = (info->flags & ~ASYNC_USR_MASK) |
3463                                 (new_serial.flags & ASYNC_USR_MASK);
3464                 info->baud = new_serial.baud_base;
3465                 info->custom_divisor = new_serial.custom_divisor;
3466                 goto check_and_exit;
3467         }
3468
3469         /*
3470          * OK, past this point, all the error checking has been done.
3471          * At this point, we start making changes.....
3472          */
3473
3474         info->baud = new_serial.baud_base;
3475         info->custom_divisor = new_serial.custom_divisor;
3476         info->flags = (info->flags & ~ASYNC_FLAGS) |
3477                         (new_serial.flags & ASYNC_FLAGS);
3478         info->close_delay = new_serial.close_delay * HZ / 100;
3479         info->closing_wait = new_serial.closing_wait * HZ / 100;
3480
3481 check_and_exit:
3482         if (info->flags & ASYNC_INITIALIZED) {
3483                 set_line_char(info);
3484                 return 0;
3485         } else {
3486                 return startup(info);
3487         }
3488 }                               /* set_serial_info */
3489
3490 /*
3491  * get_lsr_info - get line status register info
3492  *
3493  * Purpose: Let user call ioctl() to get info when the UART physically
3494  *          is emptied.  On bus types like RS485, the transmitter must
3495  *          release the bus after transmitting. This must be done when
3496  *          the transmit shift register is empty, not be done when the
3497  *          transmit holding register is empty.  This functionality
3498  *          allows an RS485 driver to be written in user space.
3499  */
3500 static int get_lsr_info(struct cyclades_port *info, unsigned int __user * value)
3501 {
3502         struct cyclades_card *card;
3503         int chip, channel, index;
3504         unsigned char status;
3505         unsigned int result;
3506         unsigned long flags;
3507         void __iomem *base_addr;
3508
3509         card = info->card;
3510         channel = (info->line) - (card->first_line);
3511         if (!IS_CYC_Z(*card)) {
3512                 chip = channel >> 2;
3513                 channel &= 0x03;
3514                 index = card->bus_index;
3515                 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3516
3517                 spin_lock_irqsave(&card->card_lock, flags);
3518                 status = readb(base_addr + (CySRER << index)) &
3519                                 (CyTxRdy | CyTxMpty);
3520                 spin_unlock_irqrestore(&card->card_lock, flags);
3521                 result = (status ? 0 : TIOCSER_TEMT);
3522         } else {
3523                 /* Not supported yet */
3524                 return -EINVAL;
3525         }
3526         return put_user(result, (unsigned long __user *)value);
3527 }
3528
3529 static int cy_tiocmget(struct tty_struct *tty, struct file *file)
3530 {
3531         struct cyclades_port *info = tty->driver_data;
3532         struct cyclades_card *card;
3533         int chip, channel, index;
3534         void __iomem *base_addr;
3535         unsigned long flags;
3536         unsigned char status;
3537         unsigned long lstatus;
3538         unsigned int result;
3539         struct FIRM_ID __iomem *firm_id;
3540         struct ZFW_CTRL __iomem *zfw_ctrl;
3541         struct BOARD_CTRL __iomem *board_ctrl;
3542         struct CH_CTRL __iomem *ch_ctrl;
3543
3544         if (serial_paranoia_check(info, tty->name, __FUNCTION__))
3545                 return -ENODEV;
3546
3547         card = info->card;
3548         channel = info->line - card->first_line;
3549         if (!IS_CYC_Z(*card)) {
3550                 chip = channel >> 2;
3551                 channel &= 0x03;
3552                 index = card->bus_index;
3553                 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3554
3555                 spin_lock_irqsave(&card->card_lock, flags);
3556                 cy_writeb(base_addr + (CyCAR << index), (u_char) channel);
3557                 status = readb(base_addr + (CyMSVR1 << index));
3558                 status |= readb(base_addr + (CyMSVR2 << index));
3559                 spin_unlock_irqrestore(&card->card_lock, flags);
3560
3561                 if (info->rtsdtr_inv) {
3562                         result = ((status & CyRTS) ? TIOCM_DTR : 0) |
3563                                 ((status & CyDTR) ? TIOCM_RTS : 0);
3564                 } else {
3565                         result = ((status & CyRTS) ? TIOCM_RTS : 0) |
3566                                 ((status & CyDTR) ? TIOCM_DTR : 0);
3567                 }
3568                 result |= ((status & CyDCD) ? TIOCM_CAR : 0) |
3569                         ((status & CyRI) ? TIOCM_RNG : 0) |
3570                         ((status & CyDSR) ? TIOCM_DSR : 0) |
3571                         ((status & CyCTS) ? TIOCM_CTS : 0);
3572         } else {
3573                 base_addr = card->base_addr;
3574                 firm_id = card->base_addr + ID_ADDRESS;
3575                 if (ISZLOADED(*card)) {
3576                         zfw_ctrl = card->base_addr +
3577                                 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
3578                         board_ctrl = &zfw_ctrl->board_ctrl;
3579                         ch_ctrl = zfw_ctrl->ch_ctrl;
3580                         lstatus = readl(&ch_ctrl[channel].rs_status);
3581                         result = ((lstatus & C_RS_RTS) ? TIOCM_RTS : 0) |
3582                                 ((lstatus & C_RS_DTR) ? TIOCM_DTR : 0) |
3583                                 ((lstatus & C_RS_DCD) ? TIOCM_CAR : 0) |
3584                                 ((lstatus & C_RS_RI) ? TIOCM_RNG : 0) |
3585                                 ((lstatus & C_RS_DSR) ? TIOCM_DSR : 0) |
3586                                 ((lstatus & C_RS_CTS) ? TIOCM_CTS : 0);
3587                 } else {
3588                         result = 0;
3589                         return -ENODEV;
3590                 }
3591
3592         }
3593         return result;
3594 }                               /* cy_tiomget */
3595
3596 static int
3597 cy_tiocmset(struct tty_struct *tty, struct file *file,
3598                 unsigned int set, unsigned int clear)
3599 {
3600         struct cyclades_port *info = tty->driver_data;
3601         struct cyclades_card *card;
3602         int chip, channel, index;
3603         void __iomem *base_addr;
3604         unsigned long flags;
3605         struct FIRM_ID __iomem *firm_id;
3606         struct ZFW_CTRL __iomem *zfw_ctrl;
3607         struct BOARD_CTRL __iomem *board_ctrl;
3608         struct CH_CTRL __iomem *ch_ctrl;
3609         int retval;
3610
3611         if (serial_paranoia_check(info, tty->name, __FUNCTION__))
3612                 return -ENODEV;
3613
3614         card = info->card;
3615         channel = (info->line) - (card->first_line);
3616         if (!IS_CYC_Z(*card)) {
3617                 chip = channel >> 2;
3618                 channel &= 0x03;
3619                 index = card->bus_index;
3620                 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3621
3622                 if (set & TIOCM_RTS) {
3623                         spin_lock_irqsave(&card->card_lock, flags);
3624                         cy_writeb(base_addr + (CyCAR << index),
3625                                   (u_char) channel);
3626                         if (info->rtsdtr_inv) {
3627                                 cy_writeb(base_addr + (CyMSVR2 << index),
3628                                           CyDTR);
3629                         } else {
3630                                 cy_writeb(base_addr + (CyMSVR1 << index),
3631                                           CyRTS);
3632                         }
3633                         spin_unlock_irqrestore(&card->card_lock, flags);
3634                 }
3635                 if (clear & TIOCM_RTS) {
3636                         spin_lock_irqsave(&card->card_lock, flags);
3637                         cy_writeb(base_addr + (CyCAR << index),
3638                                   (u_char) channel);
3639                         if (info->rtsdtr_inv) {
3640                                 cy_writeb(base_addr + (CyMSVR2 << index),
3641                                           ~CyDTR);
3642                         } else {
3643                                 cy_writeb(base_addr + (CyMSVR1 << index),
3644                                           ~CyRTS);
3645                         }
3646                         spin_unlock_irqrestore(&card->card_lock, flags);
3647                 }
3648                 if (set & TIOCM_DTR) {
3649                         spin_lock_irqsave(&card->card_lock, flags);
3650                         cy_writeb(base_addr + (CyCAR << index),
3651                                   (u_char) channel);
3652                         if (info->rtsdtr_inv) {
3653                                 cy_writeb(base_addr + (CyMSVR1 << index),
3654                                           CyRTS);
3655                         } else {
3656                                 cy_writeb(base_addr + (CyMSVR2 << index),
3657                                           CyDTR);
3658                         }
3659 #ifdef CY_DEBUG_DTR
3660                         printk(KERN_DEBUG "cyc:set_modem_info raising DTR\n");
3661                         printk(KERN_DEBUG "     status: 0x%x, 0x%x\n",
3662                                 readb(base_addr + (CyMSVR1 << index)),
3663                                 readb(base_addr + (CyMSVR2 << index)));
3664 #endif
3665                         spin_unlock_irqrestore(&card->card_lock, flags);
3666                 }
3667                 if (clear & TIOCM_DTR) {
3668                         spin_lock_irqsave(&card->card_lock, flags);
3669                         cy_writeb(base_addr + (CyCAR << index),
3670                                   (u_char) channel);
3671                         if (info->rtsdtr_inv) {
3672                                 cy_writeb(base_addr + (CyMSVR1 << index),
3673                                           ~CyRTS);
3674                         } else {
3675                                 cy_writeb(base_addr + (CyMSVR2 << index),
3676                                           ~CyDTR);
3677                         }
3678
3679 #ifdef CY_DEBUG_DTR
3680                         printk(KERN_DEBUG "cyc:set_modem_info dropping DTR\n");
3681                         printk(KERN_DEBUG "     status: 0x%x, 0x%x\n",
3682                                 readb(base_addr + (CyMSVR1 << index)),
3683                                 readb(base_addr + (CyMSVR2 << index)));
3684 #endif
3685                         spin_unlock_irqrestore(&card->card_lock, flags);
3686                 }
3687         } else {
3688                 base_addr = card->base_addr;
3689
3690                 firm_id = card->base_addr + ID_ADDRESS;
3691                 if (ISZLOADED(*card)) {
3692                         zfw_ctrl = card->base_addr +
3693                                 (readl(&firm_id->zfwctrl_addr) & 0xfffff);
3694                         board_ctrl = &zfw_ctrl->board_ctrl;
3695                         ch_ctrl = zfw_ctrl->ch_ctrl;
3696
3697                         if (set & TIOCM_RTS) {
3698                                 spin_lock_irqsave(&card->card_lock, flags);
3699                                 cy_writel(&ch_ctrl[channel].rs_control,
3700                                         readl(&ch_ctrl[channel].rs_control) |
3701                                         C_RS_RTS);
3702                                 spin_unlock_irqrestore(&card->card_lock, flags);
3703                         }
3704                         if (clear & TIOCM_RTS) {
3705                                 spin_lock_irqsave(&card->card_lock, flags);
3706                                 cy_writel(&ch_ctrl[channel].rs_control,
3707                                         readl(&ch_ctrl[channel].rs_control) &
3708                                         ~C_RS_RTS);
3709                                 spin_unlock_irqrestore(&card->card_lock, flags);
3710                         }
3711                         if (set & TIOCM_DTR) {
3712                                 spin_lock_irqsave(&card->card_lock, flags);
3713                                 cy_writel(&ch_ctrl[channel].rs_control,
3714                                         readl(&ch_ctrl[channel].rs_control) |
3715                                         C_RS_DTR);
3716 #ifdef CY_DEBUG_DTR
3717                                 printk(KERN_DEBUG "cyc:set_modem_info raising "
3718                                         "Z DTR\n");
3719 #endif
3720                                 spin_unlock_irqrestore(&card->card_lock, flags);
3721                         }
3722                         if (clear & TIOCM_DTR) {
3723                                 spin_lock_irqsave(&card->card_lock, flags);
3724                                 cy_writel(&ch_ctrl[channel].rs_control,
3725                                         readl(&ch_ctrl[channel].rs_control) &
3726                                         ~C_RS_DTR);
3727 #ifdef CY_DEBUG_DTR
3728                                 printk(KERN_DEBUG "cyc:set_modem_info clearing "
3729                                         "Z DTR\n");
3730 #endif
3731                                 spin_unlock_irqrestore(&card->card_lock, flags);
3732                         }
3733                 } else {
3734                         return -ENODEV;
3735                 }
3736                 spin_lock_irqsave(&card->card_lock, flags);
3737                 retval = cyz_issue_cmd(card, channel, C_CM_IOCTLM, 0L);
3738                 if (retval != 0) {
3739                         printk(KERN_ERR "cyc:set_modem_info retval on ttyC%d "
3740                                 "was %x\n", info->line, retval);
3741                 }
3742                 spin_unlock_irqrestore(&card->card_lock, flags);
3743         }
3744         return 0;
3745 }                               /* cy_tiocmset */
3746
3747 /*
3748  * cy_break() --- routine which turns the break handling on or off
3749  */
3750 static void cy_break(struct tty_struct *tty, int break_state)
3751 {
3752         struct cyclades_port *info = tty->driver_data;
3753         struct cyclades_card *card;
3754         unsigned long flags;
3755
3756         if (serial_paranoia_check(info, tty->name, "cy_break"))
3757                 return;
3758
3759         card = info->card;
3760
3761         spin_lock_irqsave(&card->card_lock, flags);
3762         if (!IS_CYC_Z(*card)) {
3763                 /* Let the transmit ISR take care of this (since it
3764                    requires stuffing characters into the output stream).
3765                  */
3766                 if (break_state == -1) {
3767                         if (!info->breakon) {
3768                                 info->breakon = 1;
3769                                 if (!info->xmit_cnt) {
3770                                         spin_unlock_irqrestore(&card->card_lock, flags);
3771                                         start_xmit(info);
3772                                         spin_lock_irqsave(&card->card_lock, flags);
3773                                 }
3774                         }
3775                 } else {
3776                         if (!info->breakoff) {
3777                                 info->breakoff = 1;
3778                                 if (!info->xmit_cnt) {
3779                                         spin_unlock_irqrestore(&card->card_lock, flags);
3780                                         start_xmit(info);
3781                                         spin_lock_irqsave(&card->card_lock, flags);
3782                                 }
3783                         }
3784                 }
3785         } else {
3786                 int retval;
3787
3788                 if (break_state == -1) {
3789                         retval = cyz_issue_cmd(card,
3790                                 info->line - card->first_line,
3791                                 C_CM_SET_BREAK, 0L);
3792                         if (retval != 0) {
3793                                 printk(KERN_ERR "cyc:cy_break (set) retval on "
3794                                         "ttyC%d was %x\n", info->line, retval);
3795                         }
3796                 } else {
3797                         retval = cyz_issue_cmd(card,
3798                                 info->line - card->first_line,
3799                                 C_CM_CLR_BREAK, 0L);
3800                         if (retval != 0) {
3801                                 printk(KERN_DEBUG "cyc:cy_break (clr) retval "
3802                                         "on ttyC%d was %x\n", info->line,
3803                                         retval);
3804                         }
3805                 }
3806         }
3807         spin_unlock_irqrestore(&card->card_lock, flags);
3808 }                               /* cy_break */
3809
3810 static int
3811 get_mon_info(struct cyclades_port *info, struct cyclades_monitor __user * mon)
3812 {
3813
3814         if (copy_to_user(mon, &info->mon, sizeof(struct cyclades_monitor)))
3815                 return -EFAULT;
3816         info->mon.int_count = 0;
3817         info->mon.char_count = 0;
3818         info->mon.char_max = 0;
3819         info->mon.char_last = 0;
3820         return 0;
3821 }                               /* get_mon_info */
3822
3823 static int set_threshold(struct cyclades_port *info, unsigned long value)
3824 {
3825         struct cyclades_card *card;
3826         void __iomem *base_addr;
3827         int channel, chip, index;
3828         unsigned long flags;
3829
3830         card = info->card;
3831         channel = info->line - card->first_line;
3832         if (!IS_CYC_Z(*card)) {
3833                 chip = channel >> 2;
3834                 channel &= 0x03;
3835                 index = card->bus_index;
3836                 base_addr =
3837                     card->base_addr + (cy_chip_offset[chip] << index);
3838
3839                 info->cor3 &= ~CyREC_FIFO;
3840                 info->cor3 |= value & CyREC_FIFO;
3841
3842                 spin_lock_irqsave(&card->card_lock, flags);
3843                 cy_writeb(base_addr + (CyCOR3 << index), info->cor3);
3844                 cyy_issue_cmd(base_addr, CyCOR_CHANGE | CyCOR3ch, index);
3845                 spin_unlock_irqrestore(&card->card_lock, flags);
3846         }
3847         return 0;
3848 }                               /* set_threshold */
3849
3850 static int
3851 get_threshold(struct cyclades_port *info, unsigned long __user * value)
3852 {
3853         struct cyclades_card *card;
3854         void __iomem *base_addr;
3855         int channel, chip, index;
3856         unsigned long tmp;
3857
3858         card = info->card;
3859         channel = info->line - card->first_line;
3860         if (!IS_CYC_Z(*card)) {
3861                 chip = channel >> 2;
3862                 channel &= 0x03;
3863                 index = card->bus_index;
3864                 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3865
3866                 tmp = readb(base_addr + (CyCOR3 << index)) & CyREC_FIFO;
3867                 return put_user(tmp, value);
3868         }
3869         return 0;
3870 }                               /* get_threshold */
3871
3872 static int
3873 set_default_threshold(struct cyclades_port *info, unsigned long value)
3874 {
3875         info->default_threshold = value & 0x0f;
3876         return 0;
3877 }                               /* set_default_threshold */
3878
3879 static int
3880 get_default_threshold(struct cyclades_port *info, unsigned long __user * value)
3881 {
3882         return put_user(info->default_threshold, value);
3883 }                               /* get_default_threshold */
3884
3885 static int set_timeout(struct cyclades_port *info, unsigned long value)
3886 {
3887         struct cyclades_card *card;
3888         void __iomem *base_addr;
3889         int channel, chip, index;
3890         unsigned long flags;
3891
3892         card = info->card;
3893         channel = info->line - card->first_line;
3894         if (!IS_CYC_Z(*card)) {
3895                 chip = channel >> 2;
3896                 channel &= 0x03;
3897                 index = card->bus_index;
3898                 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3899
3900                 spin_lock_irqsave(&card->card_lock, flags);
3901                 cy_writeb(base_addr + (CyRTPR << index), value & 0xff);
3902                 spin_unlock_irqrestore(&card->card_lock, flags);
3903         }
3904         return 0;
3905 }                               /* set_timeout */
3906
3907 static int get_timeout(struct cyclades_port *info, unsigned long __user * value)
3908 {
3909         struct cyclades_card *card;
3910         void __iomem *base_addr;
3911         int channel, chip, index;
3912         unsigned long tmp;
3913
3914         card = info->card;
3915         channel = info->line - card->first_line;
3916         if (!IS_CYC_Z(*card)) {
3917                 chip = channel >> 2;
3918                 channel &= 0x03;
3919                 index = card->bus_index;
3920                 base_addr = card->base_addr + (cy_chip_offset[chip] << index);
3921
3922                 tmp = readb(base_addr + (CyRTPR << index));
3923                 return put_user(tmp, value);
3924         }
3925         return 0;
3926 }                               /* get_timeout */
3927
3928 static int set_default_timeout(struct cyclades_port *info, unsigned long value)
3929 {
3930         info->default_timeout = value & 0xff;
3931         return 0;
3932 }                               /* set_default_timeout */
3933
3934 static int
3935 get_default_timeout(struct cyclades_port *info, unsigned long __user * value)
3936 {
3937         return put_user(info->default_timeout, value);
3938 }                               /* get_default_timeout */
3939
3940 /*
3941  * This routine allows the tty driver to implement device-
3942  * specific ioctl's.  If the ioctl number passed in cmd is
3943  * not recognized by the driver, it should return ENOIOCTLCMD.
3944  */
3945 static int
3946 cy_ioctl(struct tty_struct *tty, struct file *file,
3947          unsigned int cmd, unsigned long arg)
3948 {
3949         struct cyclades_port *info = tty->driver_data;
3950         struct cyclades_icount cprev, cnow;     /* kernel counter temps */
3951         struct serial_icounter_struct __user *p_cuser;  /* user space */
3952         int ret_val = 0;
3953         unsigned long flags;
3954         void __user *argp = (void __user *)arg;
3955
3956         if (serial_paranoia_check(info, tty->name, "cy_ioctl"))
3957                 return -ENODEV;
3958
3959 #ifdef CY_DEBUG_OTHER
3960         printk(KERN_DEBUG "cyc:cy_ioctl ttyC%d, cmd = %x arg = %lx\n",
3961                 info->line, cmd, arg);
3962 #endif
3963
3964         switch (cmd) {
3965         case CYGETMON:
3966                 ret_val = get_mon_info(info, argp);
3967                 break;
3968         case CYGETTHRESH:
3969                 ret_val = get_threshold(info, argp);
3970                 break;
3971         case CYSETTHRESH:
3972                 ret_val = set_threshold(info, arg);
3973                 break;
3974         case CYGETDEFTHRESH:
3975                 ret_val = get_default_threshold(info, argp);
3976                 break;
3977         case CYSETDEFTHRESH:
3978                 ret_val = set_default_threshold(info, arg);
3979                 break;
3980         case CYGETTIMEOUT:
3981                 ret_val = get_timeout(info, argp);
3982                 break;
3983         case CYSETTIMEOUT:
3984                 ret_val = set_timeout(info, arg);
3985                 break;
3986         case CYGETDEFTIMEOUT:
3987                 ret_val = get_default_timeout(info, argp);
3988                 break;
3989         case CYSETDEFTIMEOUT:
3990                 ret_val = set_default_timeout(info, arg);
3991                 break;
3992         case CYSETRFLOW:
3993                 info->rflow = (int)arg;
3994                 ret_val = 0;
3995                 break;
3996         case CYGETRFLOW:
3997                 ret_val = info->rflow;
3998                 break;
3999         case CYSETRTSDTR_INV:
4000                 info->rtsdtr_inv = (int)arg;
4001                 ret_val = 0;
4002                 break;
4003         case CYGETRTSDTR_INV:
4004                 ret_val = info->rtsdtr_inv;
4005                 break;
4006         case CYGETCD1400VER:
4007                 ret_val = info->chip_rev;
4008                 break;
4009 #ifndef CONFIG_CYZ_INTR
4010         case CYZSETPOLLCYCLE:
4011                 cyz_polling_cycle = (arg * HZ) / 1000;
4012                 ret_val = 0;
4013                 break;
4014         case CYZGETPOLLCYCLE:
4015                 ret_val = (cyz_polling_cycle * 1000) / HZ;
4016                 break;
4017 #endif                          /* CONFIG_CYZ_INTR */
4018         case CYSETWAIT:
4019                 info->closing_wait = (unsigned short)arg *HZ / 100;
4020                 ret_val = 0;
4021                 break;
4022         case CYGETWAIT:
4023                 ret_val = info->closing_wait / (HZ / 100);
4024                 break;
4025         case TIOCGSERIAL:
4026                 ret_val = get_serial_info(info, argp);
4027                 break;
4028         case TIOCSSERIAL:
4029                 ret_val = set_serial_info(info, argp);
4030                 break;
4031         case TIOCSERGETLSR:     /* Get line status register */
4032                 ret_val = get_lsr_info(info, argp);
4033                 break;
4034                 /*
4035                  * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
4036                  * - mask passed in arg for lines of interest
4037                  *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
4038                  * Caller should use TIOCGICOUNT to see which one it was
4039                  */
4040         case TIOCMIWAIT:
4041                 spin_lock_irqsave(&info->card->card_lock, flags);
4042                 /* note the counters on entry */
4043                 cnow = info->icount;
4044                 spin_unlock_irqrestore(&info->card->card_lock, flags);
4045                 ret_val = wait_event_interruptible(info->delta_msr_wait, ({
4046                         cprev = cnow;
4047                         spin_lock_irqsave(&info->card->card_lock, flags);
4048                         cnow = info->icount;    /* atomic copy */
4049                         spin_unlock_irqrestore(&info->card->card_lock, flags);
4050
4051                         ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
4052                         ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
4053                         ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd)) ||
4054                         ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts));
4055                 }));
4056                 break;
4057
4058                 /*
4059                  * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
4060                  * Return: write counters to the user passed counter struct
4061                  * NB: both 1->0 and 0->1 transitions are counted except for
4062                  *     RI where only 0->1 is counted.
4063                  */
4064         case TIOCGICOUNT:
4065                 spin_lock_irqsave(&info->card->card_lock, flags);
4066                 cnow = info->icount;
4067                 spin_unlock_irqrestore(&info->card->card_lock, flags);
4068                 p_cuser = argp;
4069                 ret_val = put_user(cnow.cts, &p_cuser->cts);
4070                 if (ret_val)
4071                         return ret_val;
4072                 ret_val = put_user(cnow.dsr, &p_cuser->dsr);
4073                 if (ret_val)
4074                         return ret_val;
4075                 ret_val = put_user(cnow.rng, &p_cuser->rng);
4076                 if (ret_val)
4077                         return ret_val;
4078                 ret_val = put_user(cnow.dcd, &p_cuser->dcd);
4079                 if (ret_val)
4080                         return ret_val;
4081                 ret_val = put_user(cnow.rx, &p_cuser->rx);
4082                 if (ret_val)
4083                         return ret_val;
4084                 ret_val = put_user(cnow.tx, &p_cuser->tx);
4085                 if (ret_val)
4086                         return ret_val;
4087                 ret_val = put_user(cnow.frame, &p_cuser->frame);
4088                 if (ret_val)
4089                         return ret_val;
4090                 ret_val = put_user(cnow.overrun, &p_cuser->overrun);
4091                 if (ret_val)
4092                         return ret_val;
4093                 ret_val = put_user(cnow.parity, &p_cuser->parity);
4094                 if (ret_val)
4095                         return ret_val;
4096                 ret_val = put_user(cnow.brk, &p_cuser->brk);
4097                 if (ret_val)
4098                         return ret_val;
4099                 ret_val = put_user(cnow.buf_overrun, &p_cuser->buf_overrun);
4100                 if (ret_val)
4101                         return ret_val;
4102                 ret_val = 0;
4103                 break;
4104         default:
4105                 ret_val = -ENOIOCTLCMD;
4106         }
4107
4108 #ifdef CY_DEBUG_OTHER
4109         printk(KERN_DEBUG "cyc:cy_ioctl done\n");
4110 #endif
4111
4112         return ret_val;
4113 }                               /* cy_ioctl */
4114
4115 /*
4116  * This routine allows the tty driver to be notified when
4117  * device's termios settings have changed.  Note that a
4118  * well-designed tty driver should be prepared to accept the case
4119  * where old == NULL, and try to do something rational.
4120  */
4121 static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
4122 {
4123         struct cyclades_port *info = tty->driver_data;
4124
4125 #ifdef CY_DEBUG_OTHER
4126         printk(KERN_DEBUG "cyc:cy_set_termios ttyC%d\n", info->line);
4127 #endif
4128
4129         if (tty->termios->c_cflag == old_termios->c_cflag &&
4130                         (tty->termios->c_iflag & (IXON | IXANY)) ==
4131                         (old_termios->c_iflag & (IXON | IXANY)))
4132                 return;
4133         set_line_char(info);
4134
4135         if ((old_termios->c_cflag & CRTSCTS) &&
4136                         !(tty->termios->c_cflag & CRTSCTS)) {
4137                 tty->hw_stopped = 0;
4138                 cy_start(tty);
4139         }
4140 #if 0
4141         /*
4142          * No need to wake up processes in open wait, since they
4143          * sample the CLOCAL flag once, and don't recheck it.
4144          * XXX  It's not clear whether the current behavior is correct
4145          * or not.  Hence, this may change.....
4146          */
4147         if (!(old_termios->c_cflag & CLOCAL) &&
4148             (tty->termios->c_cflag & CLOCAL))
4149                 wake_up_interruptible(&info->open_wait);
4150 #endif
4151 }                               /* cy_set_termios */
4152
4153 /* This function is used to send a high-priority XON/XOFF character to
4154    the device.
4155 */
4156 static void cy_send_xchar(struct tty_struct *tty, char ch)
4157 {
4158         struct cyclades_port *info = tty->driver_data;
4159         struct cyclades_card *card;
4160         int channel;
4161
4162         if (serial_paranoia_check(info, tty->name, "cy_send_xchar"))
4163                 return;
4164
4165         info->x_char = ch;
4166
4167         if (ch)
4168                 cy_start(tty);
4169
4170         card = info->card;
4171         channel = info->line - card->first_line;
4172
4173         if (IS_CYC_Z(*card)) {
4174                 if (ch == STOP_CHAR(tty))
4175                         cyz_issue_cmd(card, channel, C_CM_SENDXOFF, 0L);
4176                 else if (ch == START_CHAR(tty))
4177                         cyz_issue_cmd(card, channel, C_CM_SENDXON, 0L);
4178         }
4179 }
4180
4181 /* This routine is called by the upper-layer tty layer to signal
4182    that incoming characters should be throttled because the input
4183    buffers are close to full.
4184  */
4185 static void cy_throttle(struct tty_struct *tty)
4186 {
4187         struct cyclades_port *info = tty->driver_data;
4188         struct cyclades_card *card;
4189         unsigned long flags;
4190         void __iomem *base_addr;
4191         int chip, channel, index;
4192
4193 #ifdef CY_DEBUG_THROTTLE
4194         char buf[64];
4195
4196         printk(KERN_DEBUG "cyc:throttle %s: %ld...ttyC%d\n", tty_name(tty, buf),
4197                         tty->ldisc.chars_in_buffer(tty), info->line);
4198 #endif
4199
4200         if (serial_paranoia_check(info, tty->name, "cy_throttle")) {
4201                 return;
4202         }
4203
4204         card = info->card;
4205
4206         if (I_IXOFF(tty)) {
4207                 if (!IS_CYC_Z(*card))
4208                         cy_send_xchar(tty, STOP_CHAR(tty));
4209                 else
4210                         info->throttle = 1;
4211         }
4212
4213         if (tty->termios->c_cflag & CRTSCTS) {
4214                 channel = info->line - card->first_line;
4215                 if (!IS_CYC_Z(*card)) {
4216                         chip = channel >> 2;
4217                         channel &= 0x03;
4218                         index = card->bus_index;
4219                         base_addr = card->base_addr +
4220                                 (cy_chip_offset[chip] << index);
4221
4222                         spin_lock_irqsave(&card->card_lock, flags);
4223                         cy_writeb(base_addr + (CyCAR << index),
4224                                   (u_char) channel);
4225                         if (info->rtsdtr_inv) {
4226                                 cy_writeb(base_addr + (CyMSVR2 << index),
4227                                           ~CyDTR);
4228                         } else {
4229                                 cy_writeb(base_addr + (CyMSVR1 << index),
4230                                           ~CyRTS);
4231                         }
4232                         spin_unlock_irqrestore(&card->card_lock, flags);
4233                 } else {
4234                         info->throttle = 1;
4235                 }
4236         }
4237 }                               /* cy_throttle */
4238
4239 /*
4240  * This routine notifies the tty driver that it should signal
4241  * that characters can now be sent to the tty without fear of
4242  * overrunning the input buffers of the line disciplines.
4243  */
4244 static void cy_unthrottle(struct tty_struct *tty)
4245 {
4246         struct cyclades_port *info = tty->driver_data;
4247         struct cyclades_card *card;
4248         unsigned long flags;
4249         void __iomem *base_addr;
4250         int chip, channel, index;
4251
4252 #ifdef CY_DEBUG_THROTTLE
4253         char buf[64];
4254
4255         printk(KERN_DEBUG "cyc:unthrottle %s: %ld...ttyC%d\n",
4256                 tty_name(tty, buf), tty->ldisc.chars_in_buffer(tty),info->line);
4257 #endif
4258
4259         if (serial_paranoia_check(info, tty->name, "cy_unthrottle")) {
4260                 return;
4261         }
4262
4263         if (I_IXOFF(tty)) {
4264                 if (info->x_char)
4265                         info->x_char = 0;
4266                 else
4267                         cy_send_xchar(tty, START_CHAR(tty));
4268         }
4269
4270         if (tty->termios->c_cflag & CRTSCTS) {
4271                 card = info->card;
4272                 channel = info->line - card->first_line;
4273                 if (!IS_CYC_Z(*card)) {
4274                         chip = channel >> 2;
4275                         channel &= 0x03;
4276                         index = card->bus_index;
4277                         base_addr = card->base_addr +
4278                                 (cy_chip_offset[chip] << index);
4279
4280                         spin_lock_irqsave(&card->card_lock, flags);
4281                         cy_writeb(base_addr + (CyCAR << index),
4282                                   (u_char) channel);
4283                         if (info->rtsdtr_inv) {
4284                                 cy_writeb(base_addr + (CyMSVR2 << index),
4285                                           CyDTR);
4286                         } else {
4287                                 cy_writeb(base_addr + (CyMSVR1 << index),
4288                                           CyRTS);
4289                         }
4290                         spin_unlock_irqrestore(&card->card_lock, flags);
4291                 } else {
4292                         info->throttle = 0;
4293                 }
4294         }
4295 }                               /* cy_unthrottle */
4296
4297 /* cy_start and cy_stop provide software output flow control as a
4298    function of XON/XOFF, software CTS, and other such stuff.
4299 */
4300 static void cy_stop(struct tty_struct *tty)
4301 {
4302         struct cyclades_card *cinfo;
4303         struct cyclades_port *info = tty->driver_data;
4304         void __iomem *base_addr;
4305         int chip, channel, index;
4306         unsigned long flags;
4307
4308 #ifdef CY_DEBUG_OTHER
4309         printk(KERN_DEBUG "cyc:cy_stop ttyC%d\n", info->line);
4310 #endif
4311
4312         if (serial_paranoia_check(info, tty->name, "cy_stop"))
4313                 return;
4314
4315         cinfo = info->card;
4316         channel = info->line - cinfo->first_line;
4317         if (!IS_CYC_Z(*cinfo)) {
4318                 index = cinfo->bus_index;
4319                 chip = channel >> 2;
4320                 channel &= 0x03;
4321                 base_addr = cinfo->base_addr + (cy_chip_offset[chip] << index);
4322
4323                 spin_lock_irqsave(&cinfo->card_lock, flags);
4324                 cy_writeb(base_addr + (CyCAR << index),
4325                         (u_char)(channel & 0x0003)); /* index channel */
4326                 cy_writeb(base_addr + (CySRER << index),
4327                           readb(base_addr + (CySRER << index)) & ~CyTxRdy);
4328                 spin_unlock_irqrestore(&cinfo->card_lock, flags);
4329         }
4330 }                               /* cy_stop */
4331
4332 static void cy_start(struct tty_struct *tty)
4333 {
4334         struct cyclades_card *cinfo;
4335         struct cyclades_port *info = tty->driver_data;
4336         void __iomem *base_addr;
4337         int chip, channel, index;
4338         unsigned long flags;
4339
4340 #ifdef CY_DEBUG_OTHER
4341         printk(KERN_DEBUG "cyc:cy_start ttyC%d\n", info->line);
4342 #endif
4343
4344         if (serial_paranoia_check(info, tty->name, "cy_start"))
4345                 return;
4346
4347         cinfo = info->card;
4348         channel = info->line - cinfo->first_line;
4349         index = cinfo->bus_index;
4350         if (!IS_CYC_Z(*cinfo)) {
4351                 chip = channel >> 2;
4352                 channel &= 0x03;
4353                 base_addr = cinfo->base_addr + (cy_chip_offset[chip] << index);
4354
4355                 spin_lock_irqsave(&cinfo->card_lock, flags);
4356                 cy_writeb(base_addr + (CyCAR << index), (u_char) (channel & 0x0003));   /* index channel */
4357                 cy_writeb(base_addr + (CySRER << index),
4358                           readb(base_addr + (CySRER << index)) | CyTxRdy);
4359                 spin_unlock_irqrestore(&cinfo->card_lock, flags);
4360         }
4361 }                               /* cy_start */
4362
4363 static void cy_flush_buffer(struct tty_struct *tty)
4364 {
4365         struct cyclades_port *info = tty->driver_data;
4366         struct cyclades_card *card;
4367         int channel, retval;
4368         unsigned long flags;
4369
4370 #ifdef CY_DEBUG_IO
4371         printk(KERN_DEBUG "cyc:cy_flush_buffer ttyC%d\n", info->line);
4372 #endif
4373
4374         if (serial_paranoia_check(info, tty->name, "cy_flush_buffer"))
4375                 return;
4376
4377         card = info->card;
4378         channel = info->line - card->first_line;
4379
4380         spin_lock_irqsave(&card->card_lock, flags);
4381         info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
4382         spin_unlock_irqrestore(&card->card_lock, flags);
4383
4384         if (IS_CYC_Z(*card)) {  /* If it is a Z card, flush the on-board
4385                                            buffers as well */
4386                 spin_lock_irqsave(&card->card_lock, flags);
4387                 retval = cyz_issue_cmd(card, channel, C_CM_FLUSH_TX, 0L);
4388                 if (retval != 0) {
4389                         printk(KERN_ERR "cyc: flush_buffer retval on ttyC%d "
4390                                 "was %x\n", info->line, retval);
4391                 }
4392                 spin_unlock_irqrestore(&card->card_lock, flags);
4393         }
4394         tty_wakeup(tty);
4395 }                               /* cy_flush_buffer */
4396
4397 /*
4398  * cy_hangup() --- called by tty_hangup() when a hangup is signaled.
4399  */
4400 static void cy_hangup(struct tty_struct *tty)
4401 {
4402         struct cyclades_port *info = tty->driver_data;
4403
4404 #ifdef CY_DEBUG_OTHER
4405         printk(KERN_DEBUG "cyc:cy_hangup ttyC%d\n", info->line);
4406 #endif
4407
4408         if (serial_paranoia_check(info, tty->name, "cy_hangup"))
4409                 return;
4410
4411         cy_flush_buffer(tty);
4412         shutdown(info);
4413         info->event = 0;
4414         info->count = 0;
4415 #ifdef CY_DEBUG_COUNT
4416         printk(KERN_DEBUG "cyc:cy_hangup (%d): setting count to 0\n",
4417                 current->pid);
4418 #endif
4419         info->tty = NULL;
4420         info->flags &= ~ASYNC_NORMAL_ACTIVE;
4421         wake_up_interruptible(&info->open_wait);
4422 }                               /* cy_hangup */
4423
4424 /*
4425  * ---------------------------------------------------------------------
4426  * cy_init() and friends
4427  *
4428  * cy_init() is called at boot-time to initialize the serial driver.
4429  * ---------------------------------------------------------------------
4430  */
4431
4432 static int __devinit cy_init_card(struct cyclades_card *cinfo)
4433 {
4434         struct cyclades_port *info;
4435         u32 mailbox;
4436         unsigned int nports;
4437         unsigned short chip_number;
4438         int index, port;
4439
4440         spin_lock_init(&cinfo->card_lock);
4441
4442         if (IS_CYC_Z(*cinfo)) { /* Cyclades-Z */
4443                 mailbox = readl(&((struct RUNTIME_9060 __iomem *)
4444                                      cinfo->ctl_addr)->mail_box_0);
4445                 nports = (mailbox == ZE_V1) ? ZE_V1_NPORTS : 8;
4446                 cinfo->intr_enabled = 0;
4447                 cinfo->nports = 0;      /* Will be correctly set later, after
4448                                            Z FW is loaded */
4449         } else {
4450                 index = cinfo->bus_index;
4451                 nports = cinfo->nports = CyPORTS_PER_CHIP * cinfo->num_chips;
4452         }
4453
4454         cinfo->ports = kzalloc(sizeof(*cinfo->ports) * nports, GFP_KERNEL);
4455         if (cinfo->ports == NULL) {
4456                 printk(KERN_ERR "Cyclades: cannot allocate ports\n");
4457                 cinfo->nports = 0;
4458                 return -ENOMEM;
4459         }
4460
4461         for (port = cinfo->first_line; port < cinfo->first_line + nports;
4462                         port++) {
4463                 info = &cinfo->ports[port - cinfo->first_line];
4464                 info->magic = CYCLADES_MAGIC;
4465                 info->card = cinfo;
4466                 info->line = port;
4467                 info->flags = STD_COM_FLAGS;
4468                 info->closing_wait = CLOSING_WAIT_DELAY;
4469                 info->close_delay = 5 * HZ / 10;
4470
4471                 INIT_WORK(&info->tqueue, do_softint);
4472                 init_waitqueue_head(&info->open_wait);
4473                 init_waitqueue_head(&info->close_wait);
4474                 init_completion(&info->shutdown_wait);
4475                 init_waitqueue_head(&info->delta_msr_wait);
4476
4477                 if (IS_CYC_Z(*cinfo)) {
4478                         info->type = PORT_STARTECH;
4479                         if (mailbox == ZO_V1)
4480                                 info->xmit_fifo_size = CYZ_FIFO_SIZE;
4481                         else
4482                                 info->xmit_fifo_size = 4 * CYZ_FIFO_SIZE;
4483 #ifdef CONFIG_CYZ_INTR
4484                         setup_timer(&cyz_rx_full_timer[port],
4485                                 cyz_rx_restart, (unsigned long)info);
4486 #endif
4487                 } else {
4488                         info->type = PORT_CIRRUS;
4489                         info->xmit_fifo_size = CyMAX_CHAR_FIFO;
4490                         info->cor1 = CyPARITY_NONE | Cy_1_STOP | Cy_8_BITS;
4491                         info->cor2 = CyETC;
4492                         info->cor3 = 0x08;      /* _very_ small rcv threshold */
4493
4494                         chip_number = (port - cinfo->first_line) / 4;
4495                         if ((info->chip_rev = readb(cinfo->base_addr +
4496                                       (cy_chip_offset[chip_number] <<
4497                                        index) + (CyGFRCR << index))) >=
4498                             CD1400_REV_J) {
4499                                 /* It is a CD1400 rev. J or later */
4500                                 info->tbpr = baud_bpr_60[13];   /* Tx BPR */
4501                                 info->tco = baud_co_60[13];     /* Tx CO */
4502                                 info->rbpr = baud_bpr_60[13];   /* Rx BPR */
4503                                 info->rco = baud_co_60[13];     /* Rx CO */
4504                                 info->rtsdtr_inv = 1;
4505                         } else {
4506                                 info->tbpr = baud_bpr_25[13];   /* Tx BPR */
4507                                 info->tco = baud_co_25[13];     /* Tx CO */
4508                                 info->rbpr = baud_bpr_25[13];   /* Rx BPR */
4509                                 info->rco = baud_co_25[13];     /* Rx CO */
4510                                 info->rtsdtr_inv = 0;
4511                         }
4512                         info->read_status_mask = CyTIMEOUT | CySPECHAR |
4513                                 CyBREAK | CyPARITY | CyFRAME | CyOVERRUN;
4514                 }
4515
4516         }
4517
4518 #ifndef CONFIG_CYZ_INTR
4519         if (IS_CYC_Z(*cinfo) && !timer_pending(&cyz_timerlist)) {
4520                 mod_timer(&cyz_timerlist, jiffies + 1);
4521 #ifdef CY_PCI_DEBUG
4522                 printk(KERN_DEBUG "Cyclades-Z polling initialized\n");
4523 #endif
4524         }
4525 #endif
4526         return 0;
4527 }
4528
4529 /* initialize chips on Cyclom-Y card -- return number of valid
4530    chips (which is number of ports/4) */
4531 static unsigned short __devinit cyy_init_card(void __iomem *true_base_addr,
4532                 int index)
4533 {
4534         unsigned int chip_number;
4535         void __iomem *base_addr;
4536
4537         cy_writeb(true_base_addr + (Cy_HwReset << index), 0);
4538         /* Cy_HwReset is 0x1400 */
4539         cy_writeb(true_base_addr + (Cy_ClrIntr << index), 0);
4540         /* Cy_ClrIntr is 0x1800 */
4541         udelay(500L);
4542
4543         for (chip_number = 0; chip_number < CyMAX_CHIPS_PER_CARD; chip_number++) {
4544                 base_addr =
4545                     true_base_addr + (cy_chip_offset[chip_number] << index);
4546                 mdelay(1);
4547                 if (readb(base_addr + (CyCCR << index)) != 0x00) {
4548                         /*************
4549                         printk(" chip #%d at %#6lx is never idle (CCR != 0)\n",
4550                         chip_number, (unsigned long)base_addr);
4551                         *************/
4552                         return chip_number;
4553                 }
4554
4555                 cy_writeb(base_addr + (CyGFRCR << index), 0);
4556                 udelay(10L);
4557
4558                 /* The Cyclom-16Y does not decode address bit 9 and therefore
4559                    cannot distinguish between references to chip 0 and a non-
4560                    existent chip 4.  If the preceding clearing of the supposed
4561                    chip 4 GFRCR register appears at chip 0, there is no chip 4
4562                    and this must be a Cyclom-16Y, not a Cyclom-32Ye.
4563                  */
4564                 if (chip_number == 4 && readb(true_base_addr +
4565                                 (cy_chip_offset[0] << index) +
4566                                 (CyGFRCR << index)) == 0) {
4567                         return chip_number;
4568                 }
4569
4570                 cy_writeb(base_addr + (CyCCR << index), CyCHIP_RESET);
4571                 mdelay(1);
4572
4573                 if (readb(base_addr + (CyGFRCR << index)) == 0x00) {
4574                         /*
4575                            printk(" chip #%d at %#6lx is not responding ",
4576                            chip_number, (unsigned long)base_addr);
4577                            printk("(GFRCR stayed 0)\n",
4578                          */
4579                         return chip_number;
4580                 }
4581                 if ((0xf0 & (readb(base_addr + (CyGFRCR << index)))) !=
4582                                 0x40) {
4583                         /*
4584                         printk(" chip #%d at %#6lx is not valid (GFRCR == "
4585                                         "%#2x)\n",
4586                                         chip_number, (unsigned long)base_addr,
4587                                         base_addr[CyGFRCR<<index]);
4588                          */
4589                         return chip_number;
4590                 }
4591                 cy_writeb(base_addr + (CyGCR << index), CyCH0_SERIAL);
4592                 if (readb(base_addr + (CyGFRCR << index)) >= CD1400_REV_J) {
4593                         /* It is a CD1400 rev. J or later */
4594                         /* Impossible to reach 5ms with this chip.
4595                            Changed to 2ms instead (f = 500 Hz). */
4596                         cy_writeb(base_addr + (CyPPR << index), CyCLOCK_60_2MS);
4597                 } else {
4598                         /* f = 200 Hz */
4599                         cy_writeb(base_addr + (CyPPR << index), CyCLOCK_25_5MS);
4600                 }
4601
4602                 /*
4603                    printk(" chip #%d at %#6lx is rev 0x%2x\n",
4604                    chip_number, (unsigned long)base_addr,
4605                    readb(base_addr+(CyGFRCR<<index)));
4606                  */
4607         }
4608         return chip_number;
4609 }                               /* cyy_init_card */
4610
4611 /*
4612  * ---------------------------------------------------------------------
4613  * cy_detect_isa() - Probe for Cyclom-Y/ISA boards.
4614  * sets global variables and return the number of ISA boards found.
4615  * ---------------------------------------------------------------------
4616  */
4617 static int __init cy_detect_isa(void)
4618 {
4619 #ifdef CONFIG_ISA
4620         unsigned short cy_isa_irq, nboard;
4621         void __iomem *cy_isa_address;
4622         unsigned short i, j, cy_isa_nchan;
4623 #ifdef MODULE
4624         int isparam = 0;
4625 #endif
4626
4627         nboard = 0;
4628
4629 #ifdef MODULE
4630         /* Check for module parameters */
4631         for (i = 0; i < NR_CARDS; i++) {
4632                 if (maddr[i] || i) {
4633                         isparam = 1;
4634                         cy_isa_addresses[i] = maddr[i];
4635                 }
4636                 if (!maddr[i])
4637                         break;
4638         }
4639 #endif
4640
4641         /* scan the address table probing for Cyclom-Y/ISA boards */
4642         for (i = 0; i < NR_ISA_ADDRS; i++) {
4643                 unsigned int isa_address = cy_isa_addresses[i];
4644                 if (isa_address == 0x0000) {
4645                         return nboard;
4646                 }
4647
4648                 /* probe for CD1400... */
4649                 cy_isa_address = ioremap(isa_address, CyISA_Ywin);
4650                 if (cy_isa_address == NULL) {
4651                         printk(KERN_ERR "Cyclom-Y/ISA: can't remap base "
4652                                         "address\n");
4653                         continue;
4654                 }
4655                 cy_isa_nchan = CyPORTS_PER_CHIP *
4656                         cyy_init_card(cy_isa_address, 0);
4657                 if (cy_isa_nchan == 0) {
4658                         iounmap(cy_isa_address);
4659                         continue;
4660                 }
4661 #ifdef MODULE
4662                 if (isparam && irq[i])
4663                         cy_isa_irq = irq[i];
4664                 else
4665 #endif
4666                         /* find out the board's irq by probing */
4667                         cy_isa_irq = detect_isa_irq(cy_isa_address);
4668                 if (cy_isa_irq == 0) {
4669                         printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but the "
4670                                 "IRQ could not be detected.\n",
4671                                 (unsigned long)cy_isa_address);
4672                         iounmap(cy_isa_address);
4673                         continue;
4674                 }
4675
4676                 if ((cy_next_channel + cy_isa_nchan) > NR_PORTS) {
4677                         printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but no "
4678                                 "more channels are available. Change NR_PORTS "
4679                                 "in cyclades.c and recompile kernel.\n",
4680                                 (unsigned long)cy_isa_address);
4681                         iounmap(cy_isa_address);
4682                         return nboard;
4683                 }
4684                 /* fill the next cy_card structure available */
4685                 for (j = 0; j < NR_CARDS; j++) {
4686                         if (cy_card[j].base_addr == NULL)
4687                                 break;
4688                 }
4689                 if (j == NR_CARDS) {    /* no more cy_cards available */
4690                         printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but no "
4691                                 "more cards can be used. Change NR_CARDS in "
4692                                 "cyclades.c and recompile kernel.\n",
4693                                 (unsigned long)cy_isa_address);
4694                         iounmap(cy_isa_address);
4695                         return nboard;
4696                 }
4697
4698                 /* allocate IRQ */
4699                 if (request_irq(cy_isa_irq, cyy_interrupt,
4700                                 IRQF_DISABLED, "Cyclom-Y", &cy_card[j])) {
4701                         printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but "
4702                                 "could not allocate IRQ#%d.\n",
4703                                 (unsigned long)cy_isa_address, cy_isa_irq);
4704                         iounmap(cy_isa_address);
4705                         return nboard;
4706                 }
4707
4708                 /* set cy_card */
4709                 cy_card[j].base_addr = cy_isa_address;
4710                 cy_card[j].ctl_addr = NULL;
4711                 cy_card[j].irq = (int)cy_isa_irq;
4712                 cy_card[j].bus_index = 0;
4713                 cy_card[j].first_line = cy_next_channel;
4714                 cy_card[j].num_chips = cy_isa_nchan / 4;
4715                 if (cy_init_card(&cy_card[j])) {
4716                         cy_card[j].base_addr = NULL;
4717                         free_irq(cy_isa_irq, &cy_card[j]);
4718                         iounmap(cy_isa_address);
4719                         continue;
4720                 }
4721                 nboard++;
4722
4723                 printk(KERN_INFO "Cyclom-Y/ISA #%d: 0x%lx-0x%lx, IRQ%d found: "
4724                         "%d channels starting from port %d\n",
4725                         j + 1, (unsigned long)cy_isa_address,
4726                         (unsigned long)(cy_isa_address + (CyISA_Ywin - 1)),
4727                         cy_isa_irq, cy_isa_nchan, cy_next_channel);
4728
4729                 for (j = cy_next_channel;
4730                                 j < cy_next_channel + cy_isa_nchan; j++)
4731                         tty_register_device(cy_serial_driver, j, NULL);
4732                 cy_next_channel += cy_isa_nchan;
4733         }
4734         return nboard;
4735 #else
4736         return 0;
4737 #endif                          /* CONFIG_ISA */
4738 }                               /* cy_detect_isa */
4739
4740 #ifdef CONFIG_PCI
4741 static void __devinit plx_init(void __iomem * addr, __u32 initctl)
4742 {
4743         /* Reset PLX */
4744         cy_writel(addr + initctl, readl(addr + initctl) | 0x40000000);
4745         udelay(100L);
4746         cy_writel(addr + initctl, readl(addr + initctl) & ~0x40000000);
4747
4748         /* Reload Config. Registers from EEPROM */
4749         cy_writel(addr + initctl, readl(addr + initctl) | 0x20000000);
4750         udelay(100L);
4751         cy_writel(addr + initctl, readl(addr + initctl) & ~0x20000000);
4752 }
4753
4754 static int __devinit cy_pci_probe(struct pci_dev *pdev,
4755                 const struct pci_device_id *ent)
4756 {
4757         void __iomem *addr0 = NULL, *addr2 = NULL;
4758         char *card_name = NULL;
4759         u32 mailbox;
4760         unsigned int device_id, nchan = 0, card_no, i;
4761         unsigned char plx_ver;
4762         int retval, irq;
4763
4764         retval = pci_enable_device(pdev);
4765         if (retval) {
4766                 dev_err(&pdev->dev, "cannot enable device\n");
4767                 goto err;
4768         }
4769
4770         /* read PCI configuration area */
4771         irq = pdev->irq;
4772         device_id = pdev->device & ~PCI_DEVICE_ID_MASK;
4773
4774 #if defined(__alpha__)
4775         if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo) {   /* below 1M? */
4776                 dev_err(&pdev->dev, "Cyclom-Y/PCI not supported for low "
4777                         "addresses on Alpha systems.\n");
4778                 retval = -EIO;
4779                 goto err_dis;
4780         }
4781 #endif
4782         if (device_id == PCI_DEVICE_ID_CYCLOM_Z_Lo) {
4783                 dev_err(&pdev->dev, "Cyclades-Z/PCI not supported for low "
4784                         "addresses\n");
4785                 retval = -EIO;
4786                 goto err_dis;
4787         }
4788
4789         if (pci_resource_flags(pdev, 2) & IORESOURCE_IO) {
4790                 dev_warn(&pdev->dev, "PCI I/O bit incorrectly set. Ignoring "
4791                                 "it...\n");
4792                 pdev->resource[2].flags &= ~IORESOURCE_IO;
4793         }
4794
4795         retval = pci_request_regions(pdev, "cyclades");
4796         if (retval) {
4797                 dev_err(&pdev->dev, "failed to reserve resources\n");
4798                 goto err_dis;
4799         }
4800
4801         retval = -EIO;
4802         if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo ||
4803                         device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
4804                 card_name = "Cyclom-Y";
4805
4806                 addr0 = pci_iomap(pdev, 0, CyPCI_Yctl);
4807                 if (addr0 == NULL) {
4808                         dev_err(&pdev->dev, "can't remap ctl region\n");
4809                         goto err_reg;
4810                 }
4811                 addr2 = pci_iomap(pdev, 2, CyPCI_Ywin);
4812                 if (addr2 == NULL) {
4813                         dev_err(&pdev->dev, "can't remap base region\n");
4814                         goto err_unmap;
4815                 }
4816
4817                 nchan = CyPORTS_PER_CHIP * cyy_init_card(addr2, 1);
4818                 if (nchan == 0) {
4819                         dev_err(&pdev->dev, "Cyclom-Y PCI host card with no "
4820                                         "Serial-Modules\n");
4821                         return -EIO;
4822                 }
4823         } else if (device_id == PCI_DEVICE_ID_CYCLOM_Z_Hi) {
4824                 struct RUNTIME_9060 __iomem *ctl_addr;
4825
4826                 ctl_addr = addr0 = pci_iomap(pdev, 0, CyPCI_Zctl);
4827                 if (addr0 == NULL) {
4828                         dev_err(&pdev->dev, "can't remap ctl region\n");
4829                         goto err_reg;
4830                 }
4831
4832                 /* Disable interrupts on the PLX before resetting it */
4833                 cy_writew(addr0 + 0x68,
4834                         readw(addr0 + 0x68) & ~0x0900);
4835
4836                 plx_init(addr0, 0x6c);
4837                 /* For some yet unknown reason, once the PLX9060 reloads
4838                    the EEPROM, the IRQ is lost and, thus, we have to
4839                    re-write it to the PCI config. registers.
4840                    This will remain here until we find a permanent
4841                    fix. */
4842                 pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, irq);
4843
4844                 mailbox = (u32)readl(&ctl_addr->mail_box_0);
4845
4846                 addr2 = pci_iomap(pdev, 2, mailbox == ZE_V1 ?
4847                                 CyPCI_Ze_win : CyPCI_Zwin);
4848                 if (addr2 == NULL) {
4849                         dev_err(&pdev->dev, "can't remap base region\n");
4850                         goto err_unmap;
4851                 }
4852
4853                 if (mailbox == ZE_V1) {
4854                         card_name = "Cyclades-Ze";
4855
4856                         readl(&ctl_addr->mail_box_0);
4857                         nchan = ZE_V1_NPORTS;
4858                 } else {
4859                         card_name = "Cyclades-8Zo";
4860
4861 #ifdef CY_PCI_DEBUG
4862                         if (mailbox == ZO_V1) {
4863                                 cy_writel(&ctl_addr->loc_addr_base, WIN_CREG);
4864                                 dev_info(&pdev->dev, "Cyclades-8Zo/PCI: FPGA "
4865                                         "id %lx, ver %lx\n", (ulong)(0xff &
4866                                         readl(&((struct CUSTOM_REG *)addr2)->
4867                                                 fpga_id)), (ulong)(0xff &
4868                                         readl(&((struct CUSTOM_REG *)addr2)->
4869                                                 fpga_version)));
4870                                 cy_writel(&ctl_addr->loc_addr_base, WIN_RAM);
4871                         } else {
4872                                 dev_info(&pdev->dev, "Cyclades-Z/PCI: New "
4873                                         "Cyclades-Z board.  FPGA not loaded\n");
4874                         }
4875 #endif
4876                         /* The following clears the firmware id word.  This
4877                            ensures that the driver will not attempt to talk to
4878                            the board until it has been properly initialized.
4879                          */
4880                         if ((mailbox == ZO_V1) || (mailbox == ZO_V2))
4881                                 cy_writel(addr2 + ID_ADDRESS, 0L);
4882
4883                         /* This must be a Cyclades-8Zo/PCI.  The extendable
4884                            version will have a different device_id and will
4885                            be allocated its maximum number of ports. */
4886                         nchan = 8;
4887                 }
4888         }
4889
4890         if ((cy_next_channel + nchan) > NR_PORTS) {
4891                 dev_err(&pdev->dev, "Cyclades-8Zo/PCI found, but no "
4892                         "channels are available. Change NR_PORTS in "
4893                         "cyclades.c and recompile kernel.\n");
4894                 goto err_unmap;
4895         }
4896         /* fill the next cy_card structure available */
4897         for (card_no = 0; card_no < NR_CARDS; card_no++) {
4898                 if (cy_card[card_no].base_addr == NULL)
4899                         break;
4900         }
4901         if (card_no == NR_CARDS) {      /* no more cy_cards available */
4902                 dev_err(&pdev->dev, "Cyclades-8Zo/PCI found, but no "
4903                         "more cards can be used. Change NR_CARDS in "
4904                         "cyclades.c and recompile kernel.\n");
4905                 goto err_unmap;
4906         }
4907
4908         if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo ||
4909                         device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
4910                 /* allocate IRQ */
4911                 retval = request_irq(irq, cyy_interrupt,
4912                                 IRQF_SHARED, "Cyclom-Y", &cy_card[card_no]);
4913                 if (retval) {
4914                         dev_err(&pdev->dev, "could not allocate IRQ\n");
4915                         goto err_unmap;
4916                 }
4917                 cy_card[card_no].num_chips = nchan / 4;
4918         } else {
4919 #ifdef CONFIG_CYZ_INTR
4920                 /* allocate IRQ only if board has an IRQ */
4921                 if (irq != 0 && irq != 255) {
4922                         retval = request_irq(irq, cyz_interrupt,
4923                                         IRQF_SHARED, "Cyclades-Z",
4924                                         &cy_card[card_no]);
4925                         if (retval) {
4926                                 dev_err(&pdev->dev, "could not allocate IRQ\n");
4927                                 goto err_unmap;
4928                         }
4929                 }
4930 #endif                          /* CONFIG_CYZ_INTR */
4931                 cy_card[card_no].num_chips = -1;
4932         }
4933
4934         /* set cy_card */
4935         cy_card[card_no].base_addr = addr2;
4936         cy_card[card_no].ctl_addr = addr0;
4937         cy_card[card_no].irq = irq;
4938         cy_card[card_no].bus_index = 1;
4939         cy_card[card_no].first_line = cy_next_channel;
4940         retval = cy_init_card(&cy_card[card_no]);
4941         if (retval)
4942                 goto err_null;
4943
4944         pci_set_drvdata(pdev, &cy_card[card_no]);
4945
4946         if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo ||
4947                         device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
4948                 /* enable interrupts in the PCI interface */
4949                 plx_ver = readb(addr2 + CyPLX_VER) & 0x0f;
4950                 switch (plx_ver) {
4951                 case PLX_9050:
4952
4953                         cy_writeb(addr0 + 0x4c, 0x43);
4954                         break;
4955
4956                 case PLX_9060:
4957                 case PLX_9080:
4958                 default:        /* Old boards, use PLX_9060 */
4959
4960                         plx_init(addr0, 0x6c);
4961                 /* For some yet unknown reason, once the PLX9060 reloads
4962                    the EEPROM, the IRQ is lost and, thus, we have to
4963                    re-write it to the PCI config. registers.
4964                    This will remain here until we find a permanent
4965                    fix. */
4966                         pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, irq);
4967
4968                         cy_writew(addr0 + 0x68, readw(addr0 + 0x68) | 0x0900);
4969                         break;
4970                 }
4971         }
4972
4973         dev_info(&pdev->dev, "%s/PCI #%d found: %d channels starting from "
4974                 "port %d.\n", card_name, card_no + 1, nchan, cy_next_channel);
4975         for (i = cy_next_channel; i < cy_next_channel + nchan; i++)
4976                 tty_register_device(cy_serial_driver, i, &pdev->dev);
4977         cy_next_channel += nchan;
4978
4979         return 0;
4980 err_null:
4981         cy_card[card_no].base_addr = NULL;
4982         free_irq(irq, &cy_card[card_no]);
4983 err_unmap:
4984         pci_iounmap(pdev, addr0);
4985         if (addr2)
4986                 pci_iounmap(pdev, addr2);
4987 err_reg:
4988         pci_release_regions(pdev);
4989 err_dis:
4990         pci_disable_device(pdev);
4991 err:
4992         return retval;
4993 }
4994
4995 static void __devexit cy_pci_remove(struct pci_dev *pdev)
4996 {
4997         struct cyclades_card *cinfo = pci_get_drvdata(pdev);
4998         unsigned int i;
4999
5000         /* non-Z with old PLX */
5001         if (!IS_CYC_Z(*cinfo) && (readb(cinfo->base_addr + CyPLX_VER) & 0x0f) ==
5002                         PLX_9050)
5003                 cy_writeb(cinfo->ctl_addr + 0x4c, 0);
5004         else
5005 #ifndef CONFIG_CYZ_INTR
5006                 if (!IS_CYC_Z(*cinfo))
5007 #endif
5008                 cy_writew(cinfo->ctl_addr + 0x68,
5009                                 readw(cinfo->ctl_addr + 0x68) & ~0x0900);
5010
5011         pci_iounmap(pdev, cinfo->base_addr);
5012         if (cinfo->ctl_addr)
5013                 pci_iounmap(pdev, cinfo->ctl_addr);
5014         if (cinfo->irq
5015 #ifndef CONFIG_CYZ_INTR
5016                 && !IS_CYC_Z(*cinfo)
5017 #endif /* CONFIG_CYZ_INTR */
5018                 )
5019                 free_irq(cinfo->irq, cinfo);
5020         pci_release_regions(pdev);
5021
5022         cinfo->base_addr = NULL;
5023         for (i = cinfo->first_line; i < cinfo->first_line +
5024                         cinfo->nports; i++)
5025                 tty_unregister_device(cy_serial_driver, i);
5026         cinfo->nports = 0;
5027         kfree(cinfo->ports);
5028 }
5029
5030 static struct pci_driver cy_pci_driver = {
5031         .name = "cyclades",
5032         .id_table = cy_pci_dev_id,
5033         .probe = cy_pci_probe,
5034         .remove = __devexit_p(cy_pci_remove)
5035 };
5036 #endif
5037
5038 static int
5039 cyclades_get_proc_info(char *buf, char **start, off_t offset, int length,
5040                 int *eof, void *data)
5041 {
5042         struct cyclades_port *info;
5043         unsigned int i, j;
5044         int len = 0;
5045         off_t begin = 0;
5046         off_t pos = 0;
5047         int size;
5048         __u32 cur_jifs = jiffies;
5049
5050         size = sprintf(buf, "Dev TimeOpen   BytesOut  IdleOut    BytesIn   "
5051                         "IdleIn  Overruns  Ldisc\n");
5052
5053         pos += size;
5054         len += size;
5055
5056         /* Output one line for each known port */
5057         for (i = 0; i < NR_CARDS; i++)
5058                 for (j = 0; j < cy_card[i].nports; j++) {
5059                         info = &cy_card[i].ports[j];
5060
5061                         if (info->count)
5062                                 size = sprintf(buf + len, "%3d %8lu %10lu %8lu "
5063                                         "%10lu %8lu %9lu %6ld\n", info->line,
5064                                         (cur_jifs - info->idle_stats.in_use) /
5065                                         HZ, info->idle_stats.xmit_bytes,
5066                                         (cur_jifs - info->idle_stats.xmit_idle)/
5067                                         HZ, info->idle_stats.recv_bytes,
5068                                         (cur_jifs - info->idle_stats.recv_idle)/
5069                                         HZ, info->idle_stats.overruns,
5070                                         (long)info->tty->ldisc.num);
5071                         else
5072                                 size = sprintf(buf + len, "%3d %8lu %10lu %8lu "
5073                                         "%10lu %8lu %9lu %6ld\n",
5074                                         info->line, 0L, 0L, 0L, 0L, 0L, 0L, 0L);
5075                         len += size;
5076                         pos = begin + len;
5077
5078                         if (pos < offset) {
5079                                 len = 0;
5080                                 begin = pos;
5081                         }
5082                         if (pos > offset + length)
5083                                 goto done;
5084                 }
5085         *eof = 1;
5086 done:
5087         *start = buf + (offset - begin);        /* Start of wanted data */
5088         len -= (offset - begin);        /* Start slop */
5089         if (len > length)
5090                 len = length;   /* Ending slop */
5091         if (len < 0)
5092                 len = 0;
5093         return len;
5094 }
5095
5096 /* The serial driver boot-time initialization code!
5097     Hardware I/O ports are mapped to character special devices on a
5098     first found, first allocated manner.  That is, this code searches
5099     for Cyclom cards in the system.  As each is found, it is probed
5100     to discover how many chips (and thus how many ports) are present.
5101     These ports are mapped to the tty ports 32 and upward in monotonic
5102     fashion.  If an 8-port card is replaced with a 16-port card, the
5103     port mapping on a following card will shift.
5104
5105     This approach is different from what is used in the other serial
5106     device driver because the Cyclom is more properly a multiplexer,
5107     not just an aggregation of serial ports on one card.
5108
5109     If there are more cards with more ports than have been
5110     statically allocated above, a warning is printed and the
5111     extra ports are ignored.
5112  */
5113
5114 static const struct tty_operations cy_ops = {
5115         .open = cy_open,
5116         .close = cy_close,
5117         .write = cy_write,
5118         .put_char = cy_put_char,
5119         .flush_chars = cy_flush_chars,
5120         .write_room = cy_write_room,
5121         .chars_in_buffer = cy_chars_in_buffer,
5122         .flush_buffer = cy_flush_buffer,
5123         .ioctl = cy_ioctl,
5124         .throttle = cy_throttle,
5125         .unthrottle = cy_unthrottle,
5126         .set_termios = cy_set_termios,
5127         .stop = cy_stop,
5128         .start = cy_start,
5129         .hangup = cy_hangup,
5130         .break_ctl = cy_break,
5131         .wait_until_sent = cy_wait_until_sent,
5132         .read_proc = cyclades_get_proc_info,
5133         .tiocmget = cy_tiocmget,
5134         .tiocmset = cy_tiocmset,
5135 };
5136
5137 static int __init cy_init(void)
5138 {
5139         unsigned int nboards;
5140         int retval = -ENOMEM;
5141
5142         cy_serial_driver = alloc_tty_driver(NR_PORTS);
5143         if (!cy_serial_driver)
5144                 goto err;
5145
5146         printk(KERN_INFO "Cyclades driver " CY_VERSION " (built %s %s)\n",
5147                         __DATE__, __TIME__);
5148
5149         /* Initialize the tty_driver structure */
5150
5151         cy_serial_driver->owner = THIS_MODULE;
5152         cy_serial_driver->driver_name = "cyclades";
5153         cy_serial_driver->name = "ttyC";
5154         cy_serial_driver->major = CYCLADES_MAJOR;
5155         cy_serial_driver->minor_start = 0;
5156         cy_serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
5157         cy_serial_driver->subtype = SERIAL_TYPE_NORMAL;
5158         cy_serial_driver->init_termios = tty_std_termios;
5159         cy_serial_driver->init_termios.c_cflag =
5160             B9600 | CS8 | CREAD | HUPCL | CLOCAL;
5161         cy_serial_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
5162         tty_set_operations(cy_serial_driver, &cy_ops);
5163
5164         retval = tty_register_driver(cy_serial_driver);
5165         if (retval) {
5166                 printk(KERN_ERR "Couldn't register Cyclades serial driver\n");
5167                 goto err_frtty;
5168         }
5169
5170         /* the code below is responsible to find the boards. Each different
5171            type of board has its own detection routine. If a board is found,
5172            the next cy_card structure available is set by the detection
5173            routine. These functions are responsible for checking the
5174            availability of cy_card and cy_port data structures and updating
5175            the cy_next_channel. */
5176
5177         /* look for isa boards */
5178         nboards = cy_detect_isa();
5179
5180 #ifdef CONFIG_PCI
5181         /* look for pci boards */
5182         retval = pci_register_driver(&cy_pci_driver);
5183         if (retval && !nboards)
5184                 goto err_unr;
5185 #endif
5186
5187         return 0;
5188 err_unr:
5189         tty_unregister_driver(cy_serial_driver);
5190 err_frtty:
5191         put_tty_driver(cy_serial_driver);
5192 err:
5193         return retval;
5194 }                               /* cy_init */
5195
5196 static void __exit cy_cleanup_module(void)
5197 {
5198         struct cyclades_card *card;
5199         int i, e1;
5200
5201 #ifndef CONFIG_CYZ_INTR
5202         del_timer_sync(&cyz_timerlist);
5203 #endif /* CONFIG_CYZ_INTR */
5204
5205         if ((e1 = tty_unregister_driver(cy_serial_driver)))
5206                 printk(KERN_ERR "failed to unregister Cyclades serial "
5207                                 "driver(%d)\n", e1);
5208
5209 #ifdef CONFIG_PCI
5210         pci_unregister_driver(&cy_pci_driver);
5211 #endif
5212
5213         for (i = 0; i < NR_CARDS; i++) {
5214                 card = &cy_card[i];
5215                 if (card->base_addr) {
5216                         /* clear interrupt */
5217                         cy_writeb(card->base_addr + Cy_ClrIntr, 0);
5218                         iounmap(card->base_addr);
5219                         if (card->ctl_addr)
5220                                 iounmap(card->ctl_addr);
5221                         if (card->irq
5222 #ifndef CONFIG_CYZ_INTR
5223                                 && !IS_CYC_Z(*card)
5224 #endif /* CONFIG_CYZ_INTR */
5225                                 )
5226                                 free_irq(card->irq, card);
5227                         for (e1 = card->first_line;
5228                                         e1 < card->first_line +
5229                                         card->nports; e1++)
5230                                 tty_unregister_device(cy_serial_driver, e1);
5231                         kfree(card->ports);
5232                 }
5233         }
5234
5235         put_tty_driver(cy_serial_driver);
5236 } /* cy_cleanup_module */
5237
5238 module_init(cy_init);
5239 module_exit(cy_cleanup_module);
5240
5241 MODULE_LICENSE("GPL");
5242 MODULE_VERSION(CY_VERSION);