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