Merge commit 'v2.6.29-rc4' into x86/cleanups
[linux-2.6] / drivers / char / sx.c
1 /* sx.c -- driver for the Specialix SX series cards. 
2  *
3  *  This driver will also support the older SI, and XIO cards.
4  *
5  *
6  *   (C) 1998 - 2004  R.E.Wolff@BitWizard.nl
7  *
8  *  Simon Allen (simonallen@cix.compulink.co.uk) wrote a previous
9  *  version of this driver. Some fragments may have been copied. (none
10  *  yet :-)
11  *
12  * Specialix pays for the development and support of this driver.
13  * Please DO contact support@specialix.co.uk if you require
14  * support. But please read the documentation (sx.txt) first.
15  *
16  *
17  *
18  *      This program is free software; you can redistribute it and/or
19  *      modify it under the terms of the GNU General Public License as
20  *      published by the Free Software Foundation; either version 2 of
21  *      the License, or (at your option) any later version.
22  *
23  *      This program is distributed in the hope that it will be
24  *      useful, but WITHOUT ANY WARRANTY; without even the implied
25  *      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
26  *      PURPOSE.  See the GNU General Public License for more details.
27  *
28  *      You should have received a copy of the GNU General Public
29  *      License along with this program; if not, write to the Free
30  *      Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
31  *      USA.
32  *
33  * Revision history:
34  * Revision 1.33  2000/03/09 10:00:00  pvdl,wolff
35  * - Fixed module and port counting
36  * - Fixed signal handling
37  * - Fixed an Ooops
38  * 
39  * Revision 1.32  2000/03/07 09:00:00  wolff,pvdl
40  * - Fixed some sx_dprintk typos
41  * - added detection for an invalid board/module configuration
42  *
43  * Revision 1.31  2000/03/06 12:00:00  wolff,pvdl
44  * - Added support for EISA
45  *
46  * Revision 1.30  2000/01/21 17:43:06  wolff
47  * - Added support for SX+
48  *
49  * Revision 1.26  1999/08/05 15:22:14  wolff
50  * - Port to 2.3.x
51  * - Reformatted to Linus' liking.
52  *
53  * Revision 1.25  1999/07/30 14:24:08  wolff
54  * Had accidentally left "gs_debug" set to "-1" instead of "off" (=0).
55  *
56  * Revision 1.24  1999/07/28 09:41:52  wolff
57  * - I noticed the remark about use-count straying in sx.txt. I checked
58  *   sx_open, and found a few places where that could happen. I hope it's
59  *   fixed now.
60  *
61  * Revision 1.23  1999/07/28 08:56:06  wolff
62  * - Fixed crash when sx_firmware run twice.
63  * - Added sx_slowpoll as a module parameter (I guess nobody really wanted
64  *   to change it from the default... )
65  * - Fixed a stupid editing problem I introduced in 1.22.
66  * - Fixed dropping characters on a termios change.
67  *
68  * Revision 1.22  1999/07/26 21:01:43  wolff
69  * Russell Brown noticed that I had overlooked 4 out of six modem control
70  * signals in sx_getsignals. Ooops.
71  *
72  * Revision 1.21  1999/07/23 09:11:33  wolff
73  * I forgot to free dynamically allocated memory when the driver is unloaded.
74  *
75  * Revision 1.20  1999/07/20 06:25:26  wolff
76  * The "closing wait" wasn't honoured. Thanks to James Griffiths for
77  * reporting this.
78  *
79  * Revision 1.19  1999/07/11 08:59:59  wolff
80  * Fixed an oops in close, when an open was pending. Changed the memtest
81  * a bit. Should also test the board in word-mode, however my card fails the
82  * memtest then. I still have to figure out what is wrong...
83  *
84  * Revision 1.18  1999/06/10 09:38:42  wolff
85  * Changed the format of the firmware revision from %04x to %x.%02x .
86  *
87  * Revision 1.17  1999/06/04 09:44:35  wolff
88  * fixed problem: reference to pci stuff when config_pci was off...
89  * Thanks to Jorge Novo for noticing this.
90  *
91  * Revision 1.16  1999/06/02 08:30:15  wolff
92  * added/removed the workaround for the DCD bug in the Firmware.
93  * A bit more debugging code to locate that...
94  *
95  * Revision 1.15  1999/06/01 11:35:30  wolff
96  * when DCD is left low (floating?), on TA's the firmware first tells us
97  * that DCD is high, but after a short while suddenly comes to the
98  * conclusion that it is low. All this would be fine, if it weren't that
99  * Unix requires us to send a "hangup" signal in that case. This usually
100  * all happens BEFORE the program has had a chance to ioctl the device
101  * into clocal mode..
102  *
103  * Revision 1.14  1999/05/25 11:18:59  wolff
104  * Added PCI-fix.
105  * Added checks for return code of sx_sendcommand.
106  * Don't issue "reconfig" if port isn't open yet. (bit us on TA modules...)
107  *
108  * Revision 1.13  1999/04/29 15:18:01  wolff
109  * Fixed an "oops" that showed on SuSE 6.0 systems.
110  * Activate DTR again after stty 0.
111  *
112  * Revision 1.12  1999/04/29 07:49:52  wolff
113  * Improved "stty 0" handling a bit. (used to change baud to 9600 assuming
114  *     the connection would be dropped anyway. That is not always the case,
115  *     and confuses people).
116  * Told the card to always monitor the modem signals.
117  * Added support for dynamic  gs_debug adjustments.
118  * Now tells the rest of the system the number of ports.
119  *
120  * Revision 1.11  1999/04/24 11:11:30  wolff
121  * Fixed two stupid typos in the memory test.
122  *
123  * Revision 1.10  1999/04/24 10:53:39  wolff
124  * Added some of Christian's suggestions.
125  * Fixed an HW_COOK_IN bug (ISIG was not in I_OTHER. We used to trust the
126  * card to send the signal to the process.....)
127  *
128  * Revision 1.9  1999/04/23 07:26:38  wolff
129  * Included Christian Lademann's 2.0 compile-warning fixes and interrupt
130  *    assignment redesign.
131  * Cleanup of some other stuff.
132  *
133  * Revision 1.8  1999/04/16 13:05:30  wolff
134  * fixed a DCD change unnoticed bug.
135  *
136  * Revision 1.7  1999/04/14 22:19:51  wolff
137  * Fixed typo that showed up in 2.0.x builds (get_user instead of Get_user!)
138  *
139  * Revision 1.6  1999/04/13 18:40:20  wolff
140  * changed misc-minor to 161, as assigned by HPA.
141  *
142  * Revision 1.5  1999/04/13 15:12:25  wolff
143  * Fixed use-count leak when "hangup" occurred.
144  * Added workaround for a stupid-PCIBIOS bug.
145  *
146  *
147  * Revision 1.4  1999/04/01 22:47:40  wolff
148  * Fixed < 1M linux-2.0 problem.
149  * (vremap isn't compatible with ioremap in that case)
150  *
151  * Revision 1.3  1999/03/31 13:45:45  wolff
152  * Firmware loading is now done through a separate IOCTL.
153  *
154  * Revision 1.2  1999/03/28 12:22:29  wolff
155  * rcs cleanup
156  *
157  * Revision 1.1  1999/03/28 12:10:34  wolff
158  * Readying for release on 2.0.x (sorry David, 1.01 becomes 1.1 for RCS). 
159  *
160  * Revision 0.12  1999/03/28 09:20:10  wolff
161  * Fixed problem in 0.11, continueing cleanup.
162  *
163  * Revision 0.11  1999/03/28 08:46:44  wolff
164  * cleanup. Not good.
165  *
166  * Revision 0.10  1999/03/28 08:09:43  wolff
167  * Fixed loosing characters on close.
168  *
169  * Revision 0.9  1999/03/21 22:52:01  wolff
170  * Ported back to 2.2.... (minor things)
171  *
172  * Revision 0.8  1999/03/21 22:40:33  wolff
173  * Port to 2.0
174  *
175  * Revision 0.7  1999/03/21 19:06:34  wolff
176  * Fixed hangup processing.
177  *
178  * Revision 0.6  1999/02/05 08:45:14  wolff
179  * fixed real_raw problems. Inclusion into kernel imminent.
180  *
181  * Revision 0.5  1998/12/21 23:51:06  wolff
182  * Snatched a nasty bug: sx_transmit_chars was getting re-entered, and it
183  * shouldn't have. THATs why I want to have transmit interrupts even when
184  * the buffer is empty.
185  *
186  * Revision 0.4  1998/12/17 09:34:46  wolff
187  * PPP works. ioctl works. Basically works!
188  *
189  * Revision 0.3  1998/12/15 13:05:18  wolff
190  * It works! Wow! Gotta start implementing IOCTL and stuff....
191  *
192  * Revision 0.2  1998/12/01 08:33:53  wolff
193  * moved over to 2.1.130
194  *
195  * Revision 0.1  1998/11/03 21:23:51  wolff
196  * Initial revision. Detects SX card.
197  *
198  * */
199
200 #define SX_VERSION      1.33
201
202 #include <linux/module.h>
203 #include <linux/kdev_t.h>
204 #include <linux/kernel.h>
205 #include <linux/sched.h>
206 #include <linux/ioport.h>
207 #include <linux/interrupt.h>
208 #include <linux/errno.h>
209 #include <linux/tty.h>
210 #include <linux/tty_flip.h>
211 #include <linux/mm.h>
212 #include <linux/serial.h>
213 #include <linux/fcntl.h>
214 #include <linux/major.h>
215 #include <linux/delay.h>
216 #include <linux/eisa.h>
217 #include <linux/pci.h>
218 #include <linux/slab.h>
219 #include <linux/init.h>
220 #include <linux/miscdevice.h>
221 #include <linux/bitops.h>
222
223 #include <asm/io.h>
224 #include <asm/uaccess.h>
225
226 /* The 3.0.0 version of sxboards/sxwindow.h  uses BYTE and WORD.... */
227 #define BYTE u8
228 #define WORD u16
229
230 /* .... but the 3.0.4 version uses _u8 and _u16. */
231 #define _u8 u8
232 #define _u16 u16
233
234 #include "sxboards.h"
235 #include "sxwindow.h"
236
237 #include <linux/generic_serial.h>
238 #include "sx.h"
239
240 /* I don't think that this driver can handle more than 256 ports on
241    one machine. You'll have to increase the number of boards in sx.h
242    if you want more than 4 boards.  */
243
244 #ifndef PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8
245 #define PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8 0x2000
246 #endif
247
248 /* Configurable options: 
249    (Don't be too sure that it'll work if you toggle them) */
250
251 /* Am I paranoid or not ? ;-) */
252 #undef SX_PARANOIA_CHECK
253
254 /* 20 -> 2000 per second. The card should rate-limit interrupts at 100
255    Hz, but it is user configurable. I don't recommend going above 1000
256    Hz. The interrupt ratelimit might trigger if the interrupt is
257    shared with a very active other device. */
258 #define IRQ_RATE_LIMIT 20
259
260 /* Sharing interrupts is possible now. If the other device wants more
261    than 2000 interrupts per second, we'd gracefully decline further
262    interrupts. That's not what we want. On the other hand, if the
263    other device interrupts 2000 times a second, don't use the SX
264    interrupt. Use polling. */
265 #undef IRQ_RATE_LIMIT
266
267 #if 0
268 /* Not implemented */
269 /* 
270  * The following defines are mostly for testing purposes. But if you need
271  * some nice reporting in your syslog, you can define them also.
272  */
273 #define SX_REPORT_FIFO
274 #define SX_REPORT_OVERRUN
275 #endif
276
277 /* Function prototypes */
278 static void sx_disable_tx_interrupts(void *ptr);
279 static void sx_enable_tx_interrupts(void *ptr);
280 static void sx_disable_rx_interrupts(void *ptr);
281 static void sx_enable_rx_interrupts(void *ptr);
282 static int sx_carrier_raised(struct tty_port *port);
283 static void sx_shutdown_port(void *ptr);
284 static int sx_set_real_termios(void *ptr);
285 static void sx_close(void *ptr);
286 static int sx_chars_in_buffer(void *ptr);
287 static int sx_init_board(struct sx_board *board);
288 static int sx_init_portstructs(int nboards, int nports);
289 static long sx_fw_ioctl(struct file *filp, unsigned int cmd,
290                                                 unsigned long arg);
291 static int sx_init_drivers(void);
292
293 static struct tty_driver *sx_driver;
294
295 static DEFINE_MUTEX(sx_boards_lock);
296 static struct sx_board boards[SX_NBOARDS];
297 static struct sx_port *sx_ports;
298 static int sx_initialized;
299 static int sx_nports;
300 static int sx_debug;
301
302 /* You can have the driver poll your card. 
303     - Set sx_poll to 1 to poll every timer tick (10ms on Intel). 
304       This is used when the card cannot use an interrupt for some reason.
305
306     - set sx_slowpoll to 100 to do an extra poll once a second (on Intel). If 
307       the driver misses an interrupt (report this if it DOES happen to you!)
308       everything will continue to work.... 
309  */
310 static int sx_poll = 1;
311 static int sx_slowpoll;
312
313 /* The card limits the number of interrupts per second. 
314    At 115k2 "100" should be sufficient. 
315    If you're using higher baudrates, you can increase this...
316  */
317
318 static int sx_maxints = 100;
319
320 #ifdef CONFIG_ISA
321
322 /* These are the only open spaces in my computer. Yours may have more
323    or less.... -- REW 
324    duh: Card at 0xa0000 is possible on HP Netserver?? -- pvdl
325 */
326 static int sx_probe_addrs[] = {
327         0xc0000, 0xd0000, 0xe0000,
328         0xc8000, 0xd8000, 0xe8000
329 };
330 static int si_probe_addrs[] = {
331         0xc0000, 0xd0000, 0xe0000,
332         0xc8000, 0xd8000, 0xe8000, 0xa0000
333 };
334 static int si1_probe_addrs[] = {
335         0xd0000
336 };
337
338 #define NR_SX_ADDRS ARRAY_SIZE(sx_probe_addrs)
339 #define NR_SI_ADDRS ARRAY_SIZE(si_probe_addrs)
340 #define NR_SI1_ADDRS ARRAY_SIZE(si1_probe_addrs)
341
342 module_param_array(sx_probe_addrs, int, NULL, 0);
343 module_param_array(si_probe_addrs, int, NULL, 0);
344 #endif
345
346 /* Set the mask to all-ones. This alas, only supports 32 interrupts. 
347    Some architectures may need more. */
348 static int sx_irqmask = -1;
349
350 module_param(sx_poll, int, 0);
351 module_param(sx_slowpoll, int, 0);
352 module_param(sx_maxints, int, 0);
353 module_param(sx_debug, int, 0);
354 module_param(sx_irqmask, int, 0);
355
356 MODULE_LICENSE("GPL");
357
358 static struct real_driver sx_real_driver = {
359         sx_disable_tx_interrupts,
360         sx_enable_tx_interrupts,
361         sx_disable_rx_interrupts,
362         sx_enable_rx_interrupts,
363         sx_shutdown_port,
364         sx_set_real_termios,
365         sx_chars_in_buffer,
366         sx_close,
367 };
368
369 /* 
370    This driver can spew a whole lot of debugging output at you. If you
371    need maximum performance, you should disable the DEBUG define. To
372    aid in debugging in the field, I'm leaving the compile-time debug
373    features enabled, and disable them "runtime". That allows me to
374    instruct people with problems to enable debugging without requiring
375    them to recompile... 
376 */
377 #define DEBUG
378
379 #ifdef DEBUG
380 #define sx_dprintk(f, str...)   if (sx_debug & f) printk (str)
381 #else
382 #define sx_dprintk(f, str...)   /* nothing */
383 #endif
384
385 #define func_enter()    sx_dprintk(SX_DEBUG_FLOW, "sx: enter %s\n",__func__)
386 #define func_exit()     sx_dprintk(SX_DEBUG_FLOW, "sx: exit  %s\n",__func__)
387
388 #define func_enter2()   sx_dprintk(SX_DEBUG_FLOW, "sx: enter %s (port %d)\n", \
389                                 __func__, port->line)
390
391 /* 
392  *  Firmware loader driver specific routines
393  *
394  */
395
396 static const struct file_operations sx_fw_fops = {
397         .owner = THIS_MODULE,
398         .unlocked_ioctl = sx_fw_ioctl,
399 };
400
401 static struct miscdevice sx_fw_device = {
402         SXCTL_MISC_MINOR, "sxctl", &sx_fw_fops
403 };
404
405 #ifdef SX_PARANOIA_CHECK
406
407 /* This doesn't work. Who's paranoid around here? Not me! */
408
409 static inline int sx_paranoia_check(struct sx_port const *port,
410                                     char *name, const char *routine)
411 {
412         static const char *badmagic = KERN_ERR "sx: Warning: bad sx port magic "
413                         "number for device %s in %s\n";
414         static const char *badinfo = KERN_ERR "sx: Warning: null sx port for "
415                         "device %s in %s\n";
416
417         if (!port) {
418                 printk(badinfo, name, routine);
419                 return 1;
420         }
421         if (port->magic != SX_MAGIC) {
422                 printk(badmagic, name, routine);
423                 return 1;
424         }
425
426         return 0;
427 }
428 #else
429 #define sx_paranoia_check(a,b,c) 0
430 #endif
431
432 /* The timeouts. First try 30 times as fast as possible. Then give
433    the card some time to breathe between accesses. (Otherwise the
434    processor on the card might not be able to access its OWN bus... */
435
436 #define TIMEOUT_1 30
437 #define TIMEOUT_2 1000000
438
439 #ifdef DEBUG
440 static void my_hd_io(void __iomem *p, int len)
441 {
442         int i, j, ch;
443         unsigned char __iomem *addr = p;
444
445         for (i = 0; i < len; i += 16) {
446                 printk("%p ", addr + i);
447                 for (j = 0; j < 16; j++) {
448                         printk("%02x %s", readb(addr + j + i),
449                                         (j == 7) ? " " : "");
450                 }
451                 for (j = 0; j < 16; j++) {
452                         ch = readb(addr + j + i);
453                         printk("%c", (ch < 0x20) ? '.' :
454                                         ((ch > 0x7f) ? '.' : ch));
455                 }
456                 printk("\n");
457         }
458 }
459 static void my_hd(void *p, int len)
460 {
461         int i, j, ch;
462         unsigned char *addr = p;
463
464         for (i = 0; i < len; i += 16) {
465                 printk("%p ", addr + i);
466                 for (j = 0; j < 16; j++) {
467                         printk("%02x %s", addr[j + i], (j == 7) ? " " : "");
468                 }
469                 for (j = 0; j < 16; j++) {
470                         ch = addr[j + i];
471                         printk("%c", (ch < 0x20) ? '.' :
472                                         ((ch > 0x7f) ? '.' : ch));
473                 }
474                 printk("\n");
475         }
476 }
477 #endif
478
479 /* This needs redoing for Alpha -- REW -- Done. */
480
481 static inline void write_sx_byte(struct sx_board *board, int offset, u8 byte)
482 {
483         writeb(byte, board->base + offset);
484 }
485
486 static inline u8 read_sx_byte(struct sx_board *board, int offset)
487 {
488         return readb(board->base + offset);
489 }
490
491 static inline void write_sx_word(struct sx_board *board, int offset, u16 word)
492 {
493         writew(word, board->base + offset);
494 }
495
496 static inline u16 read_sx_word(struct sx_board *board, int offset)
497 {
498         return readw(board->base + offset);
499 }
500
501 static int sx_busy_wait_eq(struct sx_board *board,
502                 int offset, int mask, int correctval)
503 {
504         int i;
505
506         func_enter();
507
508         for (i = 0; i < TIMEOUT_1; i++)
509                 if ((read_sx_byte(board, offset) & mask) == correctval) {
510                         func_exit();
511                         return 1;
512                 }
513
514         for (i = 0; i < TIMEOUT_2; i++) {
515                 if ((read_sx_byte(board, offset) & mask) == correctval) {
516                         func_exit();
517                         return 1;
518                 }
519                 udelay(1);
520         }
521
522         func_exit();
523         return 0;
524 }
525
526 static int sx_busy_wait_neq(struct sx_board *board,
527                 int offset, int mask, int badval)
528 {
529         int i;
530
531         func_enter();
532
533         for (i = 0; i < TIMEOUT_1; i++)
534                 if ((read_sx_byte(board, offset) & mask) != badval) {
535                         func_exit();
536                         return 1;
537                 }
538
539         for (i = 0; i < TIMEOUT_2; i++) {
540                 if ((read_sx_byte(board, offset) & mask) != badval) {
541                         func_exit();
542                         return 1;
543                 }
544                 udelay(1);
545         }
546
547         func_exit();
548         return 0;
549 }
550
551 /* 5.6.4 of 6210028 r2.3 */
552 static int sx_reset(struct sx_board *board)
553 {
554         func_enter();
555
556         if (IS_SX_BOARD(board)) {
557
558                 write_sx_byte(board, SX_CONFIG, 0);
559                 write_sx_byte(board, SX_RESET, 1); /* Value doesn't matter */
560
561                 if (!sx_busy_wait_eq(board, SX_RESET_STATUS, 1, 0)) {
562                         printk(KERN_INFO "sx: Card doesn't respond to "
563                                         "reset...\n");
564                         return 0;
565                 }
566         } else if (IS_EISA_BOARD(board)) {
567                 outb(board->irq << 4, board->eisa_base + 0xc02);
568         } else if (IS_SI1_BOARD(board)) {
569                 write_sx_byte(board, SI1_ISA_RESET, 0); /*value doesn't matter*/
570         } else {
571                 /* Gory details of the SI/ISA board */
572                 write_sx_byte(board, SI2_ISA_RESET, SI2_ISA_RESET_SET);
573                 write_sx_byte(board, SI2_ISA_IRQ11, SI2_ISA_IRQ11_CLEAR);
574                 write_sx_byte(board, SI2_ISA_IRQ12, SI2_ISA_IRQ12_CLEAR);
575                 write_sx_byte(board, SI2_ISA_IRQ15, SI2_ISA_IRQ15_CLEAR);
576                 write_sx_byte(board, SI2_ISA_INTCLEAR, SI2_ISA_INTCLEAR_CLEAR);
577                 write_sx_byte(board, SI2_ISA_IRQSET, SI2_ISA_IRQSET_CLEAR);
578         }
579
580         func_exit();
581         return 1;
582 }
583
584 /* This doesn't work on machines where "NULL" isn't 0 */
585 /* If you have one of those, someone will need to write 
586    the equivalent of this, which will amount to about 3 lines. I don't
587    want to complicate this right now. -- REW
588    (See, I do write comments every now and then :-) */
589 #define OFFSETOF(strct, elem)   ((long)&(((struct strct *)NULL)->elem))
590
591 #define CHAN_OFFSET(port,elem)  (port->ch_base + OFFSETOF (_SXCHANNEL, elem))
592 #define MODU_OFFSET(board,addr,elem)    (addr + OFFSETOF (_SXMODULE, elem))
593 #define  BRD_OFFSET(board,elem) (OFFSETOF (_SXCARD, elem))
594
595 #define sx_write_channel_byte(port, elem, val) \
596         write_sx_byte (port->board, CHAN_OFFSET (port, elem), val)
597
598 #define sx_read_channel_byte(port, elem) \
599         read_sx_byte (port->board, CHAN_OFFSET (port, elem))
600
601 #define sx_write_channel_word(port, elem, val) \
602         write_sx_word (port->board, CHAN_OFFSET (port, elem), val)
603
604 #define sx_read_channel_word(port, elem) \
605         read_sx_word (port->board, CHAN_OFFSET (port, elem))
606
607 #define sx_write_module_byte(board, addr, elem, val) \
608         write_sx_byte (board, MODU_OFFSET (board, addr, elem), val)
609
610 #define sx_read_module_byte(board, addr, elem) \
611         read_sx_byte (board, MODU_OFFSET (board, addr, elem))
612
613 #define sx_write_module_word(board, addr, elem, val) \
614         write_sx_word (board, MODU_OFFSET (board, addr, elem), val)
615
616 #define sx_read_module_word(board, addr, elem) \
617         read_sx_word (board, MODU_OFFSET (board, addr, elem))
618
619 #define sx_write_board_byte(board, elem, val) \
620         write_sx_byte (board, BRD_OFFSET (board, elem), val)
621
622 #define sx_read_board_byte(board, elem) \
623         read_sx_byte (board, BRD_OFFSET (board, elem))
624
625 #define sx_write_board_word(board, elem, val) \
626         write_sx_word (board, BRD_OFFSET (board, elem), val)
627
628 #define sx_read_board_word(board, elem) \
629         read_sx_word (board, BRD_OFFSET (board, elem))
630
631 static int sx_start_board(struct sx_board *board)
632 {
633         if (IS_SX_BOARD(board)) {
634                 write_sx_byte(board, SX_CONFIG, SX_CONF_BUSEN);
635         } else if (IS_EISA_BOARD(board)) {
636                 write_sx_byte(board, SI2_EISA_OFF, SI2_EISA_VAL);
637                 outb((board->irq << 4) | 4, board->eisa_base + 0xc02);
638         } else if (IS_SI1_BOARD(board)) {
639                 write_sx_byte(board, SI1_ISA_RESET_CLEAR, 0);
640                 write_sx_byte(board, SI1_ISA_INTCL, 0);
641         } else {
642                 /* Don't bug me about the clear_set. 
643                    I haven't the foggiest idea what it's about -- REW */
644                 write_sx_byte(board, SI2_ISA_RESET, SI2_ISA_RESET_CLEAR);
645                 write_sx_byte(board, SI2_ISA_INTCLEAR, SI2_ISA_INTCLEAR_SET);
646         }
647         return 1;
648 }
649
650 #define SX_IRQ_REG_VAL(board) \
651         ((board->flags & SX_ISA_BOARD) ? (board->irq << 4) : 0)
652
653 /* Note. The SX register is write-only. Therefore, we have to enable the
654    bus too. This is a no-op, if you don't mess with this driver... */
655 static int sx_start_interrupts(struct sx_board *board)
656 {
657
658         /* Don't call this with board->irq == 0 */
659
660         if (IS_SX_BOARD(board)) {
661                 write_sx_byte(board, SX_CONFIG, SX_IRQ_REG_VAL(board) |
662                                 SX_CONF_BUSEN | SX_CONF_HOSTIRQ);
663         } else if (IS_EISA_BOARD(board)) {
664                 inb(board->eisa_base + 0xc03);
665         } else if (IS_SI1_BOARD(board)) {
666                 write_sx_byte(board, SI1_ISA_INTCL, 0);
667                 write_sx_byte(board, SI1_ISA_INTCL_CLEAR, 0);
668         } else {
669                 switch (board->irq) {
670                 case 11:
671                         write_sx_byte(board, SI2_ISA_IRQ11, SI2_ISA_IRQ11_SET);
672                         break;
673                 case 12:
674                         write_sx_byte(board, SI2_ISA_IRQ12, SI2_ISA_IRQ12_SET);
675                         break;
676                 case 15:
677                         write_sx_byte(board, SI2_ISA_IRQ15, SI2_ISA_IRQ15_SET);
678                         break;
679                 default:
680                         printk(KERN_INFO "sx: SI/XIO card doesn't support "
681                                         "interrupt %d.\n", board->irq);
682                         return 0;
683                 }
684                 write_sx_byte(board, SI2_ISA_INTCLEAR, SI2_ISA_INTCLEAR_SET);
685         }
686
687         return 1;
688 }
689
690 static int sx_send_command(struct sx_port *port,
691                 int command, int mask, int newstat)
692 {
693         func_enter2();
694         write_sx_byte(port->board, CHAN_OFFSET(port, hi_hstat), command);
695         func_exit();
696         return sx_busy_wait_eq(port->board, CHAN_OFFSET(port, hi_hstat), mask,
697                         newstat);
698 }
699
700 static char *mod_type_s(int module_type)
701 {
702         switch (module_type) {
703         case TA4:
704                 return "TA4";
705         case TA8:
706                 return "TA8";
707         case TA4_ASIC:
708                 return "TA4_ASIC";
709         case TA8_ASIC:
710                 return "TA8_ASIC";
711         case MTA_CD1400:
712                 return "MTA_CD1400";
713         case SXDC:
714                 return "SXDC";
715         default:
716                 return "Unknown/invalid";
717         }
718 }
719
720 static char *pan_type_s(int pan_type)
721 {
722         switch (pan_type) {
723         case MOD_RS232DB25:
724                 return "MOD_RS232DB25";
725         case MOD_RS232RJ45:
726                 return "MOD_RS232RJ45";
727         case MOD_RS422DB25:
728                 return "MOD_RS422DB25";
729         case MOD_PARALLEL:
730                 return "MOD_PARALLEL";
731         case MOD_2_RS232DB25:
732                 return "MOD_2_RS232DB25";
733         case MOD_2_RS232RJ45:
734                 return "MOD_2_RS232RJ45";
735         case MOD_2_RS422DB25:
736                 return "MOD_2_RS422DB25";
737         case MOD_RS232DB25MALE:
738                 return "MOD_RS232DB25MALE";
739         case MOD_2_PARALLEL:
740                 return "MOD_2_PARALLEL";
741         case MOD_BLANK:
742                 return "empty";
743         default:
744                 return "invalid";
745         }
746 }
747
748 static int mod_compat_type(int module_type)
749 {
750         return module_type >> 4;
751 }
752
753 static void sx_reconfigure_port(struct sx_port *port)
754 {
755         if (sx_read_channel_byte(port, hi_hstat) == HS_IDLE_OPEN) {
756                 if (sx_send_command(port, HS_CONFIG, -1, HS_IDLE_OPEN) != 1) {
757                         printk(KERN_WARNING "sx: Sent reconfigure command, but "
758                                         "card didn't react.\n");
759                 }
760         } else {
761                 sx_dprintk(SX_DEBUG_TERMIOS, "sx: Not sending reconfigure: "
762                                 "port isn't open (%02x).\n",
763                                 sx_read_channel_byte(port, hi_hstat));
764         }
765 }
766
767 static void sx_setsignals(struct sx_port *port, int dtr, int rts)
768 {
769         int t;
770         func_enter2();
771
772         t = sx_read_channel_byte(port, hi_op);
773         if (dtr >= 0)
774                 t = dtr ? (t | OP_DTR) : (t & ~OP_DTR);
775         if (rts >= 0)
776                 t = rts ? (t | OP_RTS) : (t & ~OP_RTS);
777         sx_write_channel_byte(port, hi_op, t);
778         sx_dprintk(SX_DEBUG_MODEMSIGNALS, "setsignals: %d/%d\n", dtr, rts);
779
780         func_exit();
781 }
782
783 static int sx_getsignals(struct sx_port *port)
784 {
785         int i_stat, o_stat;
786
787         o_stat = sx_read_channel_byte(port, hi_op);
788         i_stat = sx_read_channel_byte(port, hi_ip);
789
790         sx_dprintk(SX_DEBUG_MODEMSIGNALS, "getsignals: %d/%d  (%d/%d) "
791                         "%02x/%02x\n",
792                         (o_stat & OP_DTR) != 0, (o_stat & OP_RTS) != 0,
793                         port->c_dcd, tty_port_carrier_raised(&port->gs.port),
794                         sx_read_channel_byte(port, hi_ip),
795                         sx_read_channel_byte(port, hi_state));
796
797         return (((o_stat & OP_DTR) ? TIOCM_DTR : 0) |
798                 ((o_stat & OP_RTS) ? TIOCM_RTS : 0) |
799                 ((i_stat & IP_CTS) ? TIOCM_CTS : 0) |
800                 ((i_stat & IP_DCD) ? TIOCM_CAR : 0) |
801                 ((i_stat & IP_DSR) ? TIOCM_DSR : 0) |
802                 ((i_stat & IP_RI) ? TIOCM_RNG : 0));
803 }
804
805 static void sx_set_baud(struct sx_port *port)
806 {
807         int t;
808
809         if (port->board->ta_type == MOD_SXDC) {
810                 switch (port->gs.baud) {
811                         /* Save some typing work... */
812 #define e(x) case x: t = BAUD_ ## x; break
813                         e(50);
814                         e(75);
815                         e(110);
816                         e(150);
817                         e(200);
818                         e(300);
819                         e(600);
820                         e(1200);
821                         e(1800);
822                         e(2000);
823                         e(2400);
824                         e(4800);
825                         e(7200);
826                         e(9600);
827                         e(14400);
828                         e(19200);
829                         e(28800);
830                         e(38400);
831                         e(56000);
832                         e(57600);
833                         e(64000);
834                         e(76800);
835                         e(115200);
836                         e(128000);
837                         e(150000);
838                         e(230400);
839                         e(256000);
840                         e(460800);
841                         e(921600);
842                 case 134:
843                         t = BAUD_134_5;
844                         break;
845                 case 0:
846                         t = -1;
847                         break;
848                 default:
849                         /* Can I return "invalid"? */
850                         t = BAUD_9600;
851                         printk(KERN_INFO "sx: unsupported baud rate: %d.\n",
852                                         port->gs.baud);
853                         break;
854                 }
855 #undef e
856                 if (t > 0) {
857 /* The baud rate is not set to 0, so we're enabeling DTR... -- REW */
858                         sx_setsignals(port, 1, -1);
859                         /* XXX This is not TA & MTA compatible */
860                         sx_write_channel_byte(port, hi_csr, 0xff);
861
862                         sx_write_channel_byte(port, hi_txbaud, t);
863                         sx_write_channel_byte(port, hi_rxbaud, t);
864                 } else {
865                         sx_setsignals(port, 0, -1);
866                 }
867         } else {
868                 switch (port->gs.baud) {
869 #define e(x) case x: t = CSR_ ## x; break
870                         e(75);
871                         e(150);
872                         e(300);
873                         e(600);
874                         e(1200);
875                         e(2400);
876                         e(4800);
877                         e(1800);
878                         e(9600);
879                         e(19200);
880                         e(57600);
881                         e(38400);
882 /* TA supports 110, but not 115200, MTA supports 115200, but not 110 */
883                 case 110:
884                         if (port->board->ta_type == MOD_TA) {
885                                 t = CSR_110;
886                                 break;
887                         } else {
888                                 t = CSR_9600;
889                                 printk(KERN_INFO "sx: Unsupported baud rate: "
890                                                 "%d.\n", port->gs.baud);
891                                 break;
892                         }
893                 case 115200:
894                         if (port->board->ta_type == MOD_TA) {
895                                 t = CSR_9600;
896                                 printk(KERN_INFO "sx: Unsupported baud rate: "
897                                                 "%d.\n", port->gs.baud);
898                                 break;
899                         } else {
900                                 t = CSR_110;
901                                 break;
902                         }
903                 case 0:
904                         t = -1;
905                         break;
906                 default:
907                         t = CSR_9600;
908                         printk(KERN_INFO "sx: Unsupported baud rate: %d.\n",
909                                         port->gs.baud);
910                         break;
911                 }
912 #undef e
913                 if (t >= 0) {
914                         sx_setsignals(port, 1, -1);
915                         sx_write_channel_byte(port, hi_csr, t * 0x11);
916                 } else {
917                         sx_setsignals(port, 0, -1);
918                 }
919         }
920 }
921
922 /* Simon Allen's version of this routine was 225 lines long. 85 is a lot
923    better. -- REW */
924
925 static int sx_set_real_termios(void *ptr)
926 {
927         struct sx_port *port = ptr;
928
929         func_enter2();
930
931         if (!port->gs.port.tty)
932                 return 0;
933
934         /* What is this doing here? -- REW
935            Ha! figured it out. It is to allow you to get DTR active again
936            if you've dropped it with stty 0. Moved to set_baud, where it
937            belongs (next to the drop dtr if baud == 0) -- REW */
938         /* sx_setsignals (port, 1, -1); */
939
940         sx_set_baud(port);
941
942 #define CFLAG port->gs.port.tty->termios->c_cflag
943         sx_write_channel_byte(port, hi_mr1,
944                         (C_PARENB(port->gs.port.tty) ? MR1_WITH : MR1_NONE) |
945                         (C_PARODD(port->gs.port.tty) ? MR1_ODD : MR1_EVEN) |
946                         (C_CRTSCTS(port->gs.port.tty) ? MR1_RTS_RXFLOW : 0) |
947                         (((CFLAG & CSIZE) == CS8) ? MR1_8_BITS : 0) |
948                         (((CFLAG & CSIZE) == CS7) ? MR1_7_BITS : 0) |
949                         (((CFLAG & CSIZE) == CS6) ? MR1_6_BITS : 0) |
950                         (((CFLAG & CSIZE) == CS5) ? MR1_5_BITS : 0));
951
952         sx_write_channel_byte(port, hi_mr2,
953                         (C_CRTSCTS(port->gs.port.tty) ? MR2_CTS_TXFLOW : 0) |
954                         (C_CSTOPB(port->gs.port.tty) ? MR2_2_STOP :
955                         MR2_1_STOP));
956
957         switch (CFLAG & CSIZE) {
958         case CS8:
959                 sx_write_channel_byte(port, hi_mask, 0xff);
960                 break;
961         case CS7:
962                 sx_write_channel_byte(port, hi_mask, 0x7f);
963                 break;
964         case CS6:
965                 sx_write_channel_byte(port, hi_mask, 0x3f);
966                 break;
967         case CS5:
968                 sx_write_channel_byte(port, hi_mask, 0x1f);
969                 break;
970         default:
971                 printk(KERN_INFO "sx: Invalid wordsize: %u\n",
972                         (unsigned int)CFLAG & CSIZE);
973                 break;
974         }
975
976         sx_write_channel_byte(port, hi_prtcl,
977                         (I_IXON(port->gs.port.tty) ? SP_TXEN : 0) |
978                         (I_IXOFF(port->gs.port.tty) ? SP_RXEN : 0) |
979                         (I_IXANY(port->gs.port.tty) ? SP_TANY : 0) | SP_DCEN);
980
981         sx_write_channel_byte(port, hi_break,
982                         (I_IGNBRK(port->gs.port.tty) ? BR_IGN : 0 |
983                         I_BRKINT(port->gs.port.tty) ? BR_INT : 0));
984
985         sx_write_channel_byte(port, hi_txon, START_CHAR(port->gs.port.tty));
986         sx_write_channel_byte(port, hi_rxon, START_CHAR(port->gs.port.tty));
987         sx_write_channel_byte(port, hi_txoff, STOP_CHAR(port->gs.port.tty));
988         sx_write_channel_byte(port, hi_rxoff, STOP_CHAR(port->gs.port.tty));
989
990         sx_reconfigure_port(port);
991
992         /* Tell line discipline whether we will do input cooking */
993         if (I_OTHER(port->gs.port.tty)) {
994                 clear_bit(TTY_HW_COOK_IN, &port->gs.port.tty->flags);
995         } else {
996                 set_bit(TTY_HW_COOK_IN, &port->gs.port.tty->flags);
997         }
998         sx_dprintk(SX_DEBUG_TERMIOS, "iflags: %x(%d) ",
999                         (unsigned int)port->gs.port.tty->termios->c_iflag,
1000                         I_OTHER(port->gs.port.tty));
1001
1002 /* Tell line discipline whether we will do output cooking.
1003  * If OPOST is set and no other output flags are set then we can do output
1004  * processing.  Even if only *one* other flag in the O_OTHER group is set
1005  * we do cooking in software.
1006  */
1007         if (O_OPOST(port->gs.port.tty) && !O_OTHER(port->gs.port.tty)) {
1008                 set_bit(TTY_HW_COOK_OUT, &port->gs.port.tty->flags);
1009         } else {
1010                 clear_bit(TTY_HW_COOK_OUT, &port->gs.port.tty->flags);
1011         }
1012         sx_dprintk(SX_DEBUG_TERMIOS, "oflags: %x(%d)\n",
1013                         (unsigned int)port->gs.port.tty->termios->c_oflag,
1014                         O_OTHER(port->gs.port.tty));
1015         /* port->c_dcd = sx_get_CD (port); */
1016         func_exit();
1017         return 0;
1018 }
1019
1020 /* ********************************************************************** *
1021  *                   the interrupt related routines                       *
1022  * ********************************************************************** */
1023
1024 /* Note:
1025    Other drivers use the macro "MIN" to calculate how much to copy.
1026    This has the disadvantage that it will evaluate parts twice. That's
1027    expensive when it's IO (and the compiler cannot optimize those away!).
1028    Moreover, I'm not sure that you're race-free. 
1029
1030    I assign a value, and then only allow the value to decrease. This
1031    is always safe. This makes the code a few lines longer, and you
1032    know I'm dead against that, but I think it is required in this
1033    case.  */
1034
1035 static void sx_transmit_chars(struct sx_port *port)
1036 {
1037         int c;
1038         int tx_ip;
1039         int txroom;
1040
1041         func_enter2();
1042         sx_dprintk(SX_DEBUG_TRANSMIT, "Port %p: transmit %d chars\n",
1043                         port, port->gs.xmit_cnt);
1044
1045         if (test_and_set_bit(SX_PORT_TRANSMIT_LOCK, &port->locks)) {
1046                 return;
1047         }
1048
1049         while (1) {
1050                 c = port->gs.xmit_cnt;
1051
1052                 sx_dprintk(SX_DEBUG_TRANSMIT, "Copying %d ", c);
1053                 tx_ip = sx_read_channel_byte(port, hi_txipos);
1054
1055                 /* Took me 5 minutes to deduce this formula. 
1056                    Luckily it is literally in the manual in section 6.5.4.3.5 */
1057                 txroom = (sx_read_channel_byte(port, hi_txopos) - tx_ip - 1) &
1058                                 0xff;
1059
1060                 /* Don't copy more bytes than there is room for in the buffer */
1061                 if (c > txroom)
1062                         c = txroom;
1063                 sx_dprintk(SX_DEBUG_TRANSMIT, " %d(%d) ", c, txroom);
1064
1065                 /* Don't copy past the end of the hardware transmit buffer */
1066                 if (c > 0x100 - tx_ip)
1067                         c = 0x100 - tx_ip;
1068
1069                 sx_dprintk(SX_DEBUG_TRANSMIT, " %d(%d) ", c, 0x100 - tx_ip);
1070
1071                 /* Don't copy pas the end of the source buffer */
1072                 if (c > SERIAL_XMIT_SIZE - port->gs.xmit_tail)
1073                         c = SERIAL_XMIT_SIZE - port->gs.xmit_tail;
1074
1075                 sx_dprintk(SX_DEBUG_TRANSMIT, " %d(%ld) \n",
1076                                 c, SERIAL_XMIT_SIZE - port->gs.xmit_tail);
1077
1078                 /* If for one reason or another, we can't copy more data, we're
1079                    done! */
1080                 if (c == 0)
1081                         break;
1082
1083                 memcpy_toio(port->board->base + CHAN_OFFSET(port, hi_txbuf) +
1084                         tx_ip, port->gs.xmit_buf + port->gs.xmit_tail, c);
1085
1086                 /* Update the pointer in the card */
1087                 sx_write_channel_byte(port, hi_txipos, (tx_ip + c) & 0xff);
1088
1089                 /* Update the kernel buffer end */
1090                 port->gs.xmit_tail = (port->gs.xmit_tail + c) &
1091                                 (SERIAL_XMIT_SIZE - 1);
1092
1093                 /* This one last. (this is essential)
1094                    It would allow others to start putting more data into the
1095                    buffer! */
1096                 port->gs.xmit_cnt -= c;
1097         }
1098
1099         if (port->gs.xmit_cnt == 0) {
1100                 sx_disable_tx_interrupts(port);
1101         }
1102
1103         if ((port->gs.xmit_cnt <= port->gs.wakeup_chars) && port->gs.port.tty) {
1104                 tty_wakeup(port->gs.port.tty);
1105                 sx_dprintk(SX_DEBUG_TRANSMIT, "Waking up.... ldisc (%d)....\n",
1106                                 port->gs.wakeup_chars);
1107         }
1108
1109         clear_bit(SX_PORT_TRANSMIT_LOCK, &port->locks);
1110         func_exit();
1111 }
1112
1113 /* Note the symmetry between receiving chars and transmitting them!
1114    Note: The kernel should have implemented both a receive buffer and
1115    a transmit buffer. */
1116
1117 /* Inlined: Called only once. Remove the inline when you add another call */
1118 static inline void sx_receive_chars(struct sx_port *port)
1119 {
1120         int c;
1121         int rx_op;
1122         struct tty_struct *tty;
1123         int copied = 0;
1124         unsigned char *rp;
1125
1126         func_enter2();
1127         tty = port->gs.port.tty;
1128         while (1) {
1129                 rx_op = sx_read_channel_byte(port, hi_rxopos);
1130                 c = (sx_read_channel_byte(port, hi_rxipos) - rx_op) & 0xff;
1131
1132                 sx_dprintk(SX_DEBUG_RECEIVE, "rxop=%d, c = %d.\n", rx_op, c);
1133
1134                 /* Don't copy past the end of the hardware receive buffer */
1135                 if (rx_op + c > 0x100)
1136                         c = 0x100 - rx_op;
1137
1138                 sx_dprintk(SX_DEBUG_RECEIVE, "c = %d.\n", c);
1139
1140                 /* Don't copy more bytes than there is room for in the buffer */
1141
1142                 c = tty_prepare_flip_string(tty, &rp, c);
1143
1144                 sx_dprintk(SX_DEBUG_RECEIVE, "c = %d.\n", c);
1145
1146                 /* If for one reason or another, we can't copy more data, we're done! */
1147                 if (c == 0)
1148                         break;
1149
1150                 sx_dprintk(SX_DEBUG_RECEIVE, "Copying over %d chars. First is "
1151                                 "%d at %lx\n", c, read_sx_byte(port->board,
1152                                         CHAN_OFFSET(port, hi_rxbuf) + rx_op),
1153                                 CHAN_OFFSET(port, hi_rxbuf));
1154                 memcpy_fromio(rp, port->board->base +
1155                                 CHAN_OFFSET(port, hi_rxbuf) + rx_op, c);
1156
1157                 /* This one last. ( Not essential.)
1158                    It allows the card to start putting more data into the
1159                    buffer!
1160                    Update the pointer in the card */
1161                 sx_write_channel_byte(port, hi_rxopos, (rx_op + c) & 0xff);
1162
1163                 copied += c;
1164         }
1165         if (copied) {
1166                 struct timeval tv;
1167
1168                 do_gettimeofday(&tv);
1169                 sx_dprintk(SX_DEBUG_RECEIVE, "pushing flipq port %d (%3d "
1170                                 "chars): %d.%06d  (%d/%d)\n", port->line,
1171                                 copied, (int)(tv.tv_sec % 60), (int)tv.tv_usec,
1172                                 tty->raw, tty->real_raw);
1173
1174                 /* Tell the rest of the system the news. Great news. New
1175                    characters! */
1176                 tty_flip_buffer_push(tty);
1177                 /*    tty_schedule_flip (tty); */
1178         }
1179
1180         func_exit();
1181 }
1182
1183 /* Inlined: it is called only once. Remove the inline if you add another 
1184    call */
1185 static inline void sx_check_modem_signals(struct sx_port *port)
1186 {
1187         int hi_state;
1188         int c_dcd;
1189
1190         hi_state = sx_read_channel_byte(port, hi_state);
1191         sx_dprintk(SX_DEBUG_MODEMSIGNALS, "Checking modem signals (%d/%d)\n",
1192                         port->c_dcd, tty_port_carrier_raised(&port->gs.port));
1193
1194         if (hi_state & ST_BREAK) {
1195                 hi_state &= ~ST_BREAK;
1196                 sx_dprintk(SX_DEBUG_MODEMSIGNALS, "got a break.\n");
1197                 sx_write_channel_byte(port, hi_state, hi_state);
1198                 gs_got_break(&port->gs);
1199         }
1200         if (hi_state & ST_DCD) {
1201                 hi_state &= ~ST_DCD;
1202                 sx_dprintk(SX_DEBUG_MODEMSIGNALS, "got a DCD change.\n");
1203                 sx_write_channel_byte(port, hi_state, hi_state);
1204                 c_dcd = tty_port_carrier_raised(&port->gs.port);
1205                 sx_dprintk(SX_DEBUG_MODEMSIGNALS, "DCD is now %d\n", c_dcd);
1206                 if (c_dcd != port->c_dcd) {
1207                         port->c_dcd = c_dcd;
1208                         if (tty_port_carrier_raised(&port->gs.port)) {
1209                                 /* DCD went UP */
1210                                 if ((sx_read_channel_byte(port, hi_hstat) !=
1211                                                 HS_IDLE_CLOSED) &&
1212                                                 !(port->gs.port.tty->termios->
1213                                                         c_cflag & CLOCAL)) {
1214                                         /* Are we blocking in open? */
1215                                         sx_dprintk(SX_DEBUG_MODEMSIGNALS, "DCD "
1216                                                 "active, unblocking open\n");
1217                                         wake_up_interruptible(&port->gs.port.
1218                                                         open_wait);
1219                                 } else {
1220                                         sx_dprintk(SX_DEBUG_MODEMSIGNALS, "DCD "
1221                                                 "raised. Ignoring.\n");
1222                                 }
1223                         } else {
1224                                 /* DCD went down! */
1225                                 if (!(port->gs.port.tty->termios->c_cflag & CLOCAL)){
1226                                         sx_dprintk(SX_DEBUG_MODEMSIGNALS, "DCD "
1227                                                 "dropped. hanging up....\n");
1228                                         tty_hangup(port->gs.port.tty);
1229                                 } else {
1230                                         sx_dprintk(SX_DEBUG_MODEMSIGNALS, "DCD "
1231                                                 "dropped. ignoring.\n");
1232                                 }
1233                         }
1234                 } else {
1235                         sx_dprintk(SX_DEBUG_MODEMSIGNALS, "Hmmm. card told us "
1236                                 "DCD changed, but it didn't.\n");
1237                 }
1238         }
1239 }
1240
1241 /* This is what an interrupt routine should look like. 
1242  * Small, elegant, clear.
1243  */
1244
1245 static irqreturn_t sx_interrupt(int irq, void *ptr)
1246 {
1247         struct sx_board *board = ptr;
1248         struct sx_port *port;
1249         int i;
1250
1251         func_enter();
1252         sx_dprintk(SX_DEBUG_FLOW, "sx: enter sx_interrupt (%d/%d)\n", irq,
1253                         board->irq);
1254
1255         /* AAargh! The order in which to do these things is essential and
1256            not trivial. 
1257
1258            - Rate limit goes before "recursive". Otherwise a series of
1259            recursive calls will hang the machine in the interrupt routine.
1260
1261            - hardware twiddling goes before "recursive". Otherwise when we
1262            poll the card, and a recursive interrupt happens, we won't
1263            ack the card, so it might keep on interrupting us. (especially
1264            level sensitive interrupt systems like PCI).
1265
1266            - Rate limit goes before hardware twiddling. Otherwise we won't
1267            catch a card that has gone bonkers.
1268
1269            - The "initialized" test goes after the hardware twiddling. Otherwise
1270            the card will stick us in the interrupt routine again.
1271
1272            - The initialized test goes before recursive. 
1273          */
1274
1275 #ifdef IRQ_RATE_LIMIT
1276         /* Aaargh! I'm ashamed. This costs more lines-of-code than the
1277            actual interrupt routine!. (Well, used to when I wrote that
1278            comment) */
1279         {
1280                 static int lastjif;
1281                 static int nintr = 0;
1282
1283                 if (lastjif == jiffies) {
1284                         if (++nintr > IRQ_RATE_LIMIT) {
1285                                 free_irq(board->irq, board);
1286                                 printk(KERN_ERR "sx: Too many interrupts. "
1287                                                 "Turning off interrupt %d.\n",
1288                                                 board->irq);
1289                         }
1290                 } else {
1291                         lastjif = jiffies;
1292                         nintr = 0;
1293                 }
1294         }
1295 #endif
1296
1297         if (board->irq == irq) {
1298                 /* Tell the card we've noticed the interrupt. */
1299
1300                 sx_write_board_word(board, cc_int_pending, 0);
1301                 if (IS_SX_BOARD(board)) {
1302                         write_sx_byte(board, SX_RESET_IRQ, 1);
1303                 } else if (IS_EISA_BOARD(board)) {
1304                         inb(board->eisa_base + 0xc03);
1305                         write_sx_word(board, 8, 0);
1306                 } else {
1307                         write_sx_byte(board, SI2_ISA_INTCLEAR,
1308                                         SI2_ISA_INTCLEAR_CLEAR);
1309                         write_sx_byte(board, SI2_ISA_INTCLEAR,
1310                                         SI2_ISA_INTCLEAR_SET);
1311                 }
1312         }
1313
1314         if (!sx_initialized)
1315                 return IRQ_HANDLED;
1316         if (!(board->flags & SX_BOARD_INITIALIZED))
1317                 return IRQ_HANDLED;
1318
1319         if (test_and_set_bit(SX_BOARD_INTR_LOCK, &board->locks)) {
1320                 printk(KERN_ERR "Recursive interrupt! (%d)\n", board->irq);
1321                 return IRQ_HANDLED;
1322         }
1323
1324         for (i = 0; i < board->nports; i++) {
1325                 port = &board->ports[i];
1326                 if (port->gs.port.flags & GS_ACTIVE) {
1327                         if (sx_read_channel_byte(port, hi_state)) {
1328                                 sx_dprintk(SX_DEBUG_INTERRUPTS, "Port %d: "
1329                                                 "modem signal change?... \n",i);
1330                                 sx_check_modem_signals(port);
1331                         }
1332                         if (port->gs.xmit_cnt) {
1333                                 sx_transmit_chars(port);
1334                         }
1335                         if (!(port->gs.port.flags & SX_RX_THROTTLE)) {
1336                                 sx_receive_chars(port);
1337                         }
1338                 }
1339         }
1340
1341         clear_bit(SX_BOARD_INTR_LOCK, &board->locks);
1342
1343         sx_dprintk(SX_DEBUG_FLOW, "sx: exit sx_interrupt (%d/%d)\n", irq,
1344                         board->irq);
1345         func_exit();
1346         return IRQ_HANDLED;
1347 }
1348
1349 static void sx_pollfunc(unsigned long data)
1350 {
1351         struct sx_board *board = (struct sx_board *)data;
1352
1353         func_enter();
1354
1355         sx_interrupt(0, board);
1356
1357         mod_timer(&board->timer, jiffies + sx_poll);
1358         func_exit();
1359 }
1360
1361 /* ********************************************************************** *
1362  *                Here are the routines that actually                     *
1363  *              interface with the generic_serial driver                  *
1364  * ********************************************************************** */
1365
1366 /* Ehhm. I don't know how to fiddle with interrupts on the SX card. --REW */
1367 /* Hmm. Ok I figured it out. You don't.  */
1368
1369 static void sx_disable_tx_interrupts(void *ptr)
1370 {
1371         struct sx_port *port = ptr;
1372         func_enter2();
1373
1374         port->gs.port.flags &= ~GS_TX_INTEN;
1375
1376         func_exit();
1377 }
1378
1379 static void sx_enable_tx_interrupts(void *ptr)
1380 {
1381         struct sx_port *port = ptr;
1382         int data_in_buffer;
1383         func_enter2();
1384
1385         /* First transmit the characters that we're supposed to */
1386         sx_transmit_chars(port);
1387
1388         /* The sx card will never interrupt us if we don't fill the buffer
1389            past 25%. So we keep considering interrupts off if that's the case. */
1390         data_in_buffer = (sx_read_channel_byte(port, hi_txipos) -
1391                           sx_read_channel_byte(port, hi_txopos)) & 0xff;
1392
1393         /* XXX Must be "HIGH_WATER" for SI card according to doc. */
1394         if (data_in_buffer < LOW_WATER)
1395                 port->gs.port.flags &= ~GS_TX_INTEN;
1396
1397         func_exit();
1398 }
1399
1400 static void sx_disable_rx_interrupts(void *ptr)
1401 {
1402         /*  struct sx_port *port = ptr; */
1403         func_enter();
1404
1405         func_exit();
1406 }
1407
1408 static void sx_enable_rx_interrupts(void *ptr)
1409 {
1410         /*  struct sx_port *port = ptr; */
1411         func_enter();
1412
1413         func_exit();
1414 }
1415
1416 /* Jeez. Isn't this simple? */
1417 static int sx_carrier_raised(struct tty_port *port)
1418 {
1419         struct sx_port *sp = container_of(port, struct sx_port, gs.port);
1420         return ((sx_read_channel_byte(sp, hi_ip) & IP_DCD) != 0);
1421 }
1422
1423 /* Jeez. Isn't this simple? */
1424 static int sx_chars_in_buffer(void *ptr)
1425 {
1426         struct sx_port *port = ptr;
1427         func_enter2();
1428
1429         func_exit();
1430         return ((sx_read_channel_byte(port, hi_txipos) -
1431                  sx_read_channel_byte(port, hi_txopos)) & 0xff);
1432 }
1433
1434 static void sx_shutdown_port(void *ptr)
1435 {
1436         struct sx_port *port = ptr;
1437
1438         func_enter();
1439
1440         port->gs.port.flags &= ~GS_ACTIVE;
1441         if (port->gs.port.tty && (port->gs.port.tty->termios->c_cflag & HUPCL)) {
1442                 sx_setsignals(port, 0, 0);
1443                 sx_reconfigure_port(port);
1444         }
1445
1446         func_exit();
1447 }
1448
1449 /* ********************************************************************** *
1450  *                Here are the routines that actually                     *
1451  *               interface with the rest of the system                    *
1452  * ********************************************************************** */
1453
1454 static int sx_open(struct tty_struct *tty, struct file *filp)
1455 {
1456         struct sx_port *port;
1457         int retval, line;
1458         unsigned long flags;
1459
1460         func_enter();
1461
1462         if (!sx_initialized) {
1463                 return -EIO;
1464         }
1465
1466         line = tty->index;
1467         sx_dprintk(SX_DEBUG_OPEN, "%d: opening line %d. tty=%p ctty=%p, "
1468                         "np=%d)\n", task_pid_nr(current), line, tty,
1469                         current->signal->tty, sx_nports);
1470
1471         if ((line < 0) || (line >= SX_NPORTS) || (line >= sx_nports))
1472                 return -ENODEV;
1473
1474         port = &sx_ports[line];
1475         port->c_dcd = 0; /* Make sure that the first interrupt doesn't detect a
1476                             1 -> 0 transition. */
1477
1478         sx_dprintk(SX_DEBUG_OPEN, "port = %p c_dcd = %d\n", port, port->c_dcd);
1479
1480         spin_lock_irqsave(&port->gs.driver_lock, flags);
1481
1482         tty->driver_data = port;
1483         port->gs.port.tty = tty;
1484         port->gs.port.count++;
1485         spin_unlock_irqrestore(&port->gs.driver_lock, flags);
1486
1487         sx_dprintk(SX_DEBUG_OPEN, "starting port\n");
1488
1489         /*
1490          * Start up serial port
1491          */
1492         retval = gs_init_port(&port->gs);
1493         sx_dprintk(SX_DEBUG_OPEN, "done gs_init\n");
1494         if (retval) {
1495                 port->gs.port.count--;
1496                 return retval;
1497         }
1498
1499         port->gs.port.flags |= GS_ACTIVE;
1500         if (port->gs.port.count <= 1)
1501                 sx_setsignals(port, 1, 1);
1502
1503 #if 0
1504         if (sx_debug & SX_DEBUG_OPEN)
1505                 my_hd(port, sizeof(*port));
1506 #else
1507         if (sx_debug & SX_DEBUG_OPEN)
1508                 my_hd_io(port->board->base + port->ch_base, sizeof(*port));
1509 #endif
1510
1511         if (port->gs.port.count <= 1) {
1512                 if (sx_send_command(port, HS_LOPEN, -1, HS_IDLE_OPEN) != 1) {
1513                         printk(KERN_ERR "sx: Card didn't respond to LOPEN "
1514                                         "command.\n");
1515                         spin_lock_irqsave(&port->gs.driver_lock, flags);
1516                         port->gs.port.count--;
1517                         spin_unlock_irqrestore(&port->gs.driver_lock, flags);
1518                         return -EIO;
1519                 }
1520         }
1521
1522         retval = gs_block_til_ready(port, filp);
1523         sx_dprintk(SX_DEBUG_OPEN, "Block til ready returned %d. Count=%d\n",
1524                         retval, port->gs.port.count);
1525
1526         if (retval) {
1527 /*
1528  * Don't lower gs.port.count here because sx_close() will be called later
1529  */
1530
1531                 return retval;
1532         }
1533         /* tty->low_latency = 1; */
1534
1535         port->c_dcd = sx_carrier_raised(&port->gs.port);
1536         sx_dprintk(SX_DEBUG_OPEN, "at open: cd=%d\n", port->c_dcd);
1537
1538         func_exit();
1539         return 0;
1540
1541 }
1542
1543 static void sx_close(void *ptr)
1544 {
1545         struct sx_port *port = ptr;
1546         /* Give the port 5 seconds to close down. */
1547         int to = 5 * HZ;
1548
1549         func_enter();
1550
1551         sx_setsignals(port, 0, 0);
1552         sx_reconfigure_port(port);
1553         sx_send_command(port, HS_CLOSE, 0, 0);
1554
1555         while (to-- && (sx_read_channel_byte(port, hi_hstat) != HS_IDLE_CLOSED))
1556                 if (msleep_interruptible(10))
1557                         break;
1558         if (sx_read_channel_byte(port, hi_hstat) != HS_IDLE_CLOSED) {
1559                 if (sx_send_command(port, HS_FORCE_CLOSED, -1, HS_IDLE_CLOSED)
1560                                 != 1) {
1561                         printk(KERN_ERR "sx: sent the force_close command, but "
1562                                         "card didn't react\n");
1563                 } else
1564                         sx_dprintk(SX_DEBUG_CLOSE, "sent the force_close "
1565                                         "command.\n");
1566         }
1567
1568         sx_dprintk(SX_DEBUG_CLOSE, "waited %d jiffies for close. count=%d\n",
1569                         5 * HZ - to - 1, port->gs.port.count);
1570
1571         if (port->gs.port.count) {
1572                 sx_dprintk(SX_DEBUG_CLOSE, "WARNING port count:%d\n",
1573                                 port->gs.port.count);
1574                 /*printk("%s SETTING port count to zero: %p count: %d\n",
1575                                 __func__, port, port->gs.port.count);
1576                 port->gs.port.count = 0;*/
1577         }
1578
1579         func_exit();
1580 }
1581
1582 /* This is relatively thorough. But then again it is only 20 lines. */
1583 #define MARCHUP         for (i = min; i < max; i++)
1584 #define MARCHDOWN       for (i = max - 1; i >= min; i--)
1585 #define W0              write_sx_byte(board, i, 0x55)
1586 #define W1              write_sx_byte(board, i, 0xaa)
1587 #define R0              if (read_sx_byte(board, i) != 0x55) return 1
1588 #define R1              if (read_sx_byte(board, i) != 0xaa) return 1
1589
1590 /* This memtest takes a human-noticable time. You normally only do it
1591    once a boot, so I guess that it is worth it. */
1592 static int do_memtest(struct sx_board *board, int min, int max)
1593 {
1594         int i;
1595
1596         /* This is a marchb. Theoretically, marchb catches much more than
1597            simpler tests. In practise, the longer test just catches more
1598            intermittent errors. -- REW
1599            (For the theory behind memory testing see: 
1600            Testing Semiconductor Memories by A.J. van de Goor.) */
1601         MARCHUP {
1602                 W0;
1603         }
1604         MARCHUP {
1605                 R0;
1606                 W1;
1607                 R1;
1608                 W0;
1609                 R0;
1610                 W1;
1611         }
1612         MARCHUP {
1613                 R1;
1614                 W0;
1615                 W1;
1616         }
1617         MARCHDOWN {
1618                 R1;
1619                 W0;
1620                 W1;
1621                 W0;
1622         }
1623         MARCHDOWN {
1624                 R0;
1625                 W1;
1626                 W0;
1627         }
1628
1629         return 0;
1630 }
1631
1632 #undef MARCHUP
1633 #undef MARCHDOWN
1634 #undef W0
1635 #undef W1
1636 #undef R0
1637 #undef R1
1638
1639 #define MARCHUP         for (i = min; i < max; i += 2)
1640 #define MARCHDOWN       for (i = max - 1; i >= min; i -= 2)
1641 #define W0              write_sx_word(board, i, 0x55aa)
1642 #define W1              write_sx_word(board, i, 0xaa55)
1643 #define R0              if (read_sx_word(board, i) != 0x55aa) return 1
1644 #define R1              if (read_sx_word(board, i) != 0xaa55) return 1
1645
1646 #if 0
1647 /* This memtest takes a human-noticable time. You normally only do it
1648    once a boot, so I guess that it is worth it. */
1649 static int do_memtest_w(struct sx_board *board, int min, int max)
1650 {
1651         int i;
1652
1653         MARCHUP {
1654                 W0;
1655         }
1656         MARCHUP {
1657                 R0;
1658                 W1;
1659                 R1;
1660                 W0;
1661                 R0;
1662                 W1;
1663         }
1664         MARCHUP {
1665                 R1;
1666                 W0;
1667                 W1;
1668         }
1669         MARCHDOWN {
1670                 R1;
1671                 W0;
1672                 W1;
1673                 W0;
1674         }
1675         MARCHDOWN {
1676                 R0;
1677                 W1;
1678                 W0;
1679         }
1680
1681         return 0;
1682 }
1683 #endif
1684
1685 static long sx_fw_ioctl(struct file *filp, unsigned int cmd,
1686                                                         unsigned long arg)
1687 {
1688         long rc = 0;
1689         int __user *descr = (int __user *)arg;
1690         int i;
1691         static struct sx_board *board = NULL;
1692         int nbytes, offset;
1693         unsigned long data;
1694         char *tmp;
1695
1696         func_enter();
1697
1698         if (!capable(CAP_SYS_RAWIO))
1699                 return -EPERM;
1700
1701         lock_kernel();
1702
1703         sx_dprintk(SX_DEBUG_FIRMWARE, "IOCTL %x: %lx\n", cmd, arg);
1704
1705         if (!board)
1706                 board = &boards[0];
1707         if (board->flags & SX_BOARD_PRESENT) {
1708                 sx_dprintk(SX_DEBUG_FIRMWARE, "Board present! (%x)\n",
1709                                 board->flags);
1710         } else {
1711                 sx_dprintk(SX_DEBUG_FIRMWARE, "Board not present! (%x) all:",
1712                                 board->flags);
1713                 for (i = 0; i < SX_NBOARDS; i++)
1714                         sx_dprintk(SX_DEBUG_FIRMWARE, "<%x> ", boards[i].flags);
1715                 sx_dprintk(SX_DEBUG_FIRMWARE, "\n");
1716                 rc = -EIO;
1717                 goto out;
1718         }
1719
1720         switch (cmd) {
1721         case SXIO_SET_BOARD:
1722                 sx_dprintk(SX_DEBUG_FIRMWARE, "set board to %ld\n", arg);
1723                 rc = -EIO;
1724                 if (arg >= SX_NBOARDS)
1725                         break;
1726                 sx_dprintk(SX_DEBUG_FIRMWARE, "not out of range\n");
1727                 if (!(boards[arg].flags & SX_BOARD_PRESENT))
1728                         break;
1729                 sx_dprintk(SX_DEBUG_FIRMWARE, ".. and present!\n");
1730                 board = &boards[arg];
1731                 rc = 0;
1732                 /* FIXME: And this does ... nothing?? */
1733                 break;
1734         case SXIO_GET_TYPE:
1735                 rc = -ENOENT;   /* If we manage to miss one, return error. */
1736                 if (IS_SX_BOARD(board))
1737                         rc = SX_TYPE_SX;
1738                 if (IS_CF_BOARD(board))
1739                         rc = SX_TYPE_CF;
1740                 if (IS_SI_BOARD(board))
1741                         rc = SX_TYPE_SI;
1742                 if (IS_SI1_BOARD(board))
1743                         rc = SX_TYPE_SI;
1744                 if (IS_EISA_BOARD(board))
1745                         rc = SX_TYPE_SI;
1746                 sx_dprintk(SX_DEBUG_FIRMWARE, "returning type= %ld\n", rc);
1747                 break;
1748         case SXIO_DO_RAMTEST:
1749                 if (sx_initialized)     /* Already initialized: better not ramtest the board.  */
1750                         rc = -EPERM;
1751                         break;
1752                 if (IS_SX_BOARD(board)) {
1753                         rc = do_memtest(board, 0, 0x7000);
1754                         if (!rc)
1755                                 rc = do_memtest(board, 0, 0x7000);
1756                         /*if (!rc) rc = do_memtest_w (board, 0, 0x7000); */
1757                 } else {
1758                         rc = do_memtest(board, 0, 0x7ff8);
1759                         /* if (!rc) rc = do_memtest_w (board, 0, 0x7ff8); */
1760                 }
1761                 sx_dprintk(SX_DEBUG_FIRMWARE,
1762                                 "returning memtest result= %ld\n", rc);
1763                 break;
1764         case SXIO_DOWNLOAD:
1765                 if (sx_initialized) {/* Already initialized */
1766                         rc = -EEXIST;
1767                         break;
1768                 }
1769                 if (!sx_reset(board)) {
1770                         rc = -EIO;
1771                         break;
1772                 }
1773                 sx_dprintk(SX_DEBUG_INIT, "reset the board...\n");
1774
1775                 tmp = kmalloc(SX_CHUNK_SIZE, GFP_USER);
1776                 if (!tmp) {
1777                         rc = -ENOMEM;
1778                         break;
1779                 }
1780                 /* FIXME: check returns */
1781                 get_user(nbytes, descr++);
1782                 get_user(offset, descr++);
1783                 get_user(data, descr++);
1784                 while (nbytes && data) {
1785                         for (i = 0; i < nbytes; i += SX_CHUNK_SIZE) {
1786                                 if (copy_from_user(tmp, (char __user *)data + i,
1787                                                 (i + SX_CHUNK_SIZE > nbytes) ?
1788                                                 nbytes - i : SX_CHUNK_SIZE)) {
1789                                         kfree(tmp);
1790                                         rc = -EFAULT;
1791                                         break;
1792                                 }
1793                                 memcpy_toio(board->base2 + offset + i, tmp,
1794                                                 (i + SX_CHUNK_SIZE > nbytes) ?
1795                                                 nbytes - i : SX_CHUNK_SIZE);
1796                         }
1797
1798                         get_user(nbytes, descr++);
1799                         get_user(offset, descr++);
1800                         get_user(data, descr++);
1801                 }
1802                 kfree(tmp);
1803                 sx_nports += sx_init_board(board);
1804                 rc = sx_nports;
1805                 break;
1806         case SXIO_INIT:
1807                 if (sx_initialized) {   /* Already initialized */
1808                         rc = -EEXIST;
1809                         break;
1810                 }
1811                 /* This is not allowed until all boards are initialized... */
1812                 for (i = 0; i < SX_NBOARDS; i++) {
1813                         if ((boards[i].flags & SX_BOARD_PRESENT) &&
1814                                 !(boards[i].flags & SX_BOARD_INITIALIZED)) {
1815                                 rc = -EIO;
1816                                 break;
1817                         }
1818                 }
1819                 for (i = 0; i < SX_NBOARDS; i++)
1820                         if (!(boards[i].flags & SX_BOARD_PRESENT))
1821                                 break;
1822
1823                 sx_dprintk(SX_DEBUG_FIRMWARE, "initing portstructs, %d boards, "
1824                                 "%d channels, first board: %d ports\n",
1825                                 i, sx_nports, boards[0].nports);
1826                 rc = sx_init_portstructs(i, sx_nports);
1827                 sx_init_drivers();
1828                 if (rc >= 0)
1829                         sx_initialized++;
1830                 break;
1831         case SXIO_SETDEBUG:
1832                 sx_debug = arg;
1833                 break;
1834         case SXIO_GETDEBUG:
1835                 rc = sx_debug;
1836                 break;
1837         case SXIO_GETGSDEBUG:
1838         case SXIO_SETGSDEBUG:
1839                 rc = -EINVAL;
1840                 break;
1841         case SXIO_GETNPORTS:
1842                 rc = sx_nports;
1843                 break;
1844         default:
1845                 rc = -ENOTTY;
1846                 break;
1847         }
1848 out:
1849         unlock_kernel();
1850         func_exit();
1851         return rc;
1852 }
1853
1854 static int sx_break(struct tty_struct *tty, int flag)
1855 {
1856         struct sx_port *port = tty->driver_data;
1857         int rv;
1858
1859         func_enter();
1860         lock_kernel();
1861
1862         if (flag)
1863                 rv = sx_send_command(port, HS_START, -1, HS_IDLE_BREAK);
1864         else
1865                 rv = sx_send_command(port, HS_STOP, -1, HS_IDLE_OPEN);
1866         if (rv != 1)
1867                 printk(KERN_ERR "sx: couldn't send break (%x).\n",
1868                         read_sx_byte(port->board, CHAN_OFFSET(port, hi_hstat)));
1869         unlock_kernel();
1870         func_exit();
1871         return 0;
1872 }
1873
1874 static int sx_tiocmget(struct tty_struct *tty, struct file *file)
1875 {
1876         struct sx_port *port = tty->driver_data;
1877         return sx_getsignals(port);
1878 }
1879
1880 static int sx_tiocmset(struct tty_struct *tty, struct file *file,
1881                 unsigned int set, unsigned int clear)
1882 {
1883         struct sx_port *port = tty->driver_data;
1884         int rts = -1, dtr = -1;
1885
1886         if (set & TIOCM_RTS)
1887                 rts = 1;
1888         if (set & TIOCM_DTR)
1889                 dtr = 1;
1890         if (clear & TIOCM_RTS)
1891                 rts = 0;
1892         if (clear & TIOCM_DTR)
1893                 dtr = 0;
1894
1895         sx_setsignals(port, dtr, rts);
1896         sx_reconfigure_port(port);
1897         return 0;
1898 }
1899
1900 static int sx_ioctl(struct tty_struct *tty, struct file *filp,
1901                 unsigned int cmd, unsigned long arg)
1902 {
1903         int rc;
1904         struct sx_port *port = tty->driver_data;
1905         void __user *argp = (void __user *)arg;
1906
1907         /* func_enter2(); */
1908
1909         rc = 0;
1910         lock_kernel();
1911         switch (cmd) {
1912         case TIOCGSERIAL:
1913                 rc = gs_getserial(&port->gs, argp);
1914                 break;
1915         case TIOCSSERIAL:
1916                 rc = gs_setserial(&port->gs, argp);
1917                 break;
1918         default:
1919                 rc = -ENOIOCTLCMD;
1920                 break;
1921         }
1922         unlock_kernel();
1923
1924         /* func_exit(); */
1925         return rc;
1926 }
1927
1928 /* The throttle/unthrottle scheme for the Specialix card is different
1929  * from other drivers and deserves some explanation. 
1930  * The Specialix hardware takes care of XON/XOFF
1931  * and CTS/RTS flow control itself.  This means that all we have to
1932  * do when signalled by the upper tty layer to throttle/unthrottle is
1933  * to make a note of it here.  When we come to read characters from the
1934  * rx buffers on the card (sx_receive_chars()) we look to see if the
1935  * upper layer can accept more (as noted here in sx_rx_throt[]). 
1936  * If it can't we simply don't remove chars from the cards buffer. 
1937  * When the tty layer can accept chars, we again note that here and when
1938  * sx_receive_chars() is called it will remove them from the cards buffer.
1939  * The card will notice that a ports buffer has drained below some low
1940  * water mark and will unflow control the line itself, using whatever
1941  * flow control scheme is in use for that port. -- Simon Allen
1942  */
1943
1944 static void sx_throttle(struct tty_struct *tty)
1945 {
1946         struct sx_port *port = tty->driver_data;
1947
1948         func_enter2();
1949         /* If the port is using any type of input flow
1950          * control then throttle the port.
1951          */
1952         if ((tty->termios->c_cflag & CRTSCTS) || (I_IXOFF(tty))) {
1953                 port->gs.port.flags |= SX_RX_THROTTLE;
1954         }
1955         func_exit();
1956 }
1957
1958 static void sx_unthrottle(struct tty_struct *tty)
1959 {
1960         struct sx_port *port = tty->driver_data;
1961
1962         func_enter2();
1963         /* Always unthrottle even if flow control is not enabled on
1964          * this port in case we disabled flow control while the port
1965          * was throttled
1966          */
1967         port->gs.port.flags &= ~SX_RX_THROTTLE;
1968         func_exit();
1969         return;
1970 }
1971
1972 /* ********************************************************************** *
1973  *                    Here are the initialization routines.               *
1974  * ********************************************************************** */
1975
1976 static int sx_init_board(struct sx_board *board)
1977 {
1978         int addr;
1979         int chans;
1980         int type;
1981
1982         func_enter();
1983
1984         /* This is preceded by downloading the download code. */
1985
1986         board->flags |= SX_BOARD_INITIALIZED;
1987
1988         if (read_sx_byte(board, 0))
1989                 /* CF boards may need this. */
1990                 write_sx_byte(board, 0, 0);
1991
1992         /* This resets the processor again, to make sure it didn't do any
1993            foolish things while we were downloading the image */
1994         if (!sx_reset(board))
1995                 return 0;
1996
1997         sx_start_board(board);
1998         udelay(10);
1999         if (!sx_busy_wait_neq(board, 0, 0xff, 0)) {
2000                 printk(KERN_ERR "sx: Ooops. Board won't initialize.\n");
2001                 return 0;
2002         }
2003
2004         /* Ok. So now the processor on the card is running. It gathered
2005            some info for us... */
2006         sx_dprintk(SX_DEBUG_INIT, "The sxcard structure:\n");
2007         if (sx_debug & SX_DEBUG_INIT)
2008                 my_hd_io(board->base, 0x10);
2009         sx_dprintk(SX_DEBUG_INIT, "the first sx_module structure:\n");
2010         if (sx_debug & SX_DEBUG_INIT)
2011                 my_hd_io(board->base + 0x80, 0x30);
2012
2013         sx_dprintk(SX_DEBUG_INIT, "init_status: %x, %dk memory, firmware "
2014                         "V%x.%02x,\n",
2015                         read_sx_byte(board, 0), read_sx_byte(board, 1),
2016                         read_sx_byte(board, 5), read_sx_byte(board, 4));
2017
2018         if (read_sx_byte(board, 0) == 0xff) {
2019                 printk(KERN_INFO "sx: No modules found. Sorry.\n");
2020                 board->nports = 0;
2021                 return 0;
2022         }
2023
2024         chans = 0;
2025
2026         if (IS_SX_BOARD(board)) {
2027                 sx_write_board_word(board, cc_int_count, sx_maxints);
2028         } else {
2029                 if (sx_maxints)
2030                         sx_write_board_word(board, cc_int_count,
2031                                         SI_PROCESSOR_CLOCK / 8 / sx_maxints);
2032         }
2033
2034         /* grab the first module type... */
2035         /* board->ta_type = mod_compat_type (read_sx_byte (board, 0x80 + 0x08)); */
2036         board->ta_type = mod_compat_type(sx_read_module_byte(board, 0x80,
2037                                 mc_chip));
2038
2039         /* XXX byteorder */
2040         for (addr = 0x80; addr != 0; addr = read_sx_word(board, addr) & 0x7fff){
2041                 type = sx_read_module_byte(board, addr, mc_chip);
2042                 sx_dprintk(SX_DEBUG_INIT, "Module at %x: %d channels\n",
2043                                 addr, read_sx_byte(board, addr + 2));
2044
2045                 chans += sx_read_module_byte(board, addr, mc_type);
2046
2047                 sx_dprintk(SX_DEBUG_INIT, "module is an %s, which has %s/%s "
2048                                 "panels\n",
2049                                 mod_type_s(type),
2050                                 pan_type_s(sx_read_module_byte(board, addr,
2051                                                 mc_mods) & 0xf),
2052                                 pan_type_s(sx_read_module_byte(board, addr,
2053                                                 mc_mods) >> 4));
2054
2055                 sx_dprintk(SX_DEBUG_INIT, "CD1400 versions: %x/%x, ASIC "
2056                         "version: %x\n",
2057                         sx_read_module_byte(board, addr, mc_rev1),
2058                         sx_read_module_byte(board, addr, mc_rev2),
2059                         sx_read_module_byte(board, addr, mc_mtaasic_rev));
2060
2061                 /* The following combinations are illegal: It should theoretically
2062                    work, but timing problems make the bus HANG. */
2063
2064                 if (mod_compat_type(type) != board->ta_type) {
2065                         printk(KERN_ERR "sx: This is an invalid "
2066                                 "configuration.\nDon't mix TA/MTA/SXDC on the "
2067                                 "same hostadapter.\n");
2068                         chans = 0;
2069                         break;
2070                 }
2071                 if ((IS_EISA_BOARD(board) ||
2072                                 IS_SI_BOARD(board)) &&
2073                                 (mod_compat_type(type) == 4)) {
2074                         printk(KERN_ERR "sx: This is an invalid "
2075                                 "configuration.\nDon't use SXDCs on an SI/XIO "
2076                                 "adapter.\n");
2077                         chans = 0;
2078                         break;
2079                 }
2080 #if 0                           /* Problem fixed: firmware 3.05 */
2081                 if (IS_SX_BOARD(board) && (type == TA8)) {
2082                         /* There are some issues with the firmware and the DCD/RTS
2083                            lines. It might work if you tie them together or something.
2084                            It might also work if you get a newer sx_firmware.   Therefore
2085                            this is just a warning. */
2086                         printk(KERN_WARNING
2087                                "sx: The SX host doesn't work too well "
2088                                "with the TA8 adapters.\nSpecialix is working on it.\n");
2089                 }
2090 #endif
2091         }
2092
2093         if (chans) {
2094                 if (board->irq > 0) {
2095                         /* fixed irq, probably PCI */
2096                         if (sx_irqmask & (1 << board->irq)) {   /* may we use this irq? */
2097                                 if (request_irq(board->irq, sx_interrupt,
2098                                                 IRQF_SHARED | IRQF_DISABLED,
2099                                                 "sx", board)) {
2100                                         printk(KERN_ERR "sx: Cannot allocate "
2101                                                 "irq %d.\n", board->irq);
2102                                         board->irq = 0;
2103                                 }
2104                         } else
2105                                 board->irq = 0;
2106                 } else if (board->irq < 0 && sx_irqmask) {
2107                         /* auto-allocate irq */
2108                         int irqnr;
2109                         int irqmask = sx_irqmask & (IS_SX_BOARD(board) ?
2110                                         SX_ISA_IRQ_MASK : SI2_ISA_IRQ_MASK);
2111                         for (irqnr = 15; irqnr > 0; irqnr--)
2112                                 if (irqmask & (1 << irqnr))
2113                                         if (!request_irq(irqnr, sx_interrupt,
2114                                                 IRQF_SHARED | IRQF_DISABLED,
2115                                                 "sx", board))
2116                                                 break;
2117                         if (!irqnr)
2118                                 printk(KERN_ERR "sx: Cannot allocate IRQ.\n");
2119                         board->irq = irqnr;
2120                 } else
2121                         board->irq = 0;
2122
2123                 if (board->irq) {
2124                         /* Found a valid interrupt, start up interrupts! */
2125                         sx_dprintk(SX_DEBUG_INIT, "Using irq %d.\n",
2126                                         board->irq);
2127                         sx_start_interrupts(board);
2128                         board->poll = sx_slowpoll;
2129                         board->flags |= SX_IRQ_ALLOCATED;
2130                 } else {
2131                         /* no irq: setup board for polled operation */
2132                         board->poll = sx_poll;
2133                         sx_dprintk(SX_DEBUG_INIT, "Using poll-interval %d.\n",
2134                                         board->poll);
2135                 }
2136
2137                 /* The timer should be initialized anyway: That way we can
2138                    safely del_timer it when the module is unloaded. */
2139                 setup_timer(&board->timer, sx_pollfunc, (unsigned long)board);
2140
2141                 if (board->poll)
2142                         mod_timer(&board->timer, jiffies + board->poll);
2143         } else {
2144                 board->irq = 0;
2145         }
2146
2147         board->nports = chans;
2148         sx_dprintk(SX_DEBUG_INIT, "returning %d ports.", board->nports);
2149
2150         func_exit();
2151         return chans;
2152 }
2153
2154 static void __devinit printheader(void)
2155 {
2156         static int header_printed;
2157
2158         if (!header_printed) {
2159                 printk(KERN_INFO "Specialix SX driver "
2160                         "(C) 1998/1999 R.E.Wolff@BitWizard.nl\n");
2161                 printk(KERN_INFO "sx: version " __stringify(SX_VERSION) "\n");
2162                 header_printed = 1;
2163         }
2164 }
2165
2166 static int __devinit probe_sx(struct sx_board *board)
2167 {
2168         struct vpd_prom vpdp;
2169         char *p;
2170         int i;
2171
2172         func_enter();
2173
2174         if (!IS_CF_BOARD(board)) {
2175                 sx_dprintk(SX_DEBUG_PROBE, "Going to verify vpd prom at %p.\n",
2176                                 board->base + SX_VPD_ROM);
2177
2178                 if (sx_debug & SX_DEBUG_PROBE)
2179                         my_hd_io(board->base + SX_VPD_ROM, 0x40);
2180
2181                 p = (char *)&vpdp;
2182                 for (i = 0; i < sizeof(struct vpd_prom); i++)
2183                         *p++ = read_sx_byte(board, SX_VPD_ROM + i * 2);
2184
2185                 if (sx_debug & SX_DEBUG_PROBE)
2186                         my_hd(&vpdp, 0x20);
2187
2188                 sx_dprintk(SX_DEBUG_PROBE, "checking identifier...\n");
2189
2190                 if (strncmp(vpdp.identifier, SX_VPD_IDENT_STRING, 16) != 0) {
2191                         sx_dprintk(SX_DEBUG_PROBE, "Got non-SX identifier: "
2192                                         "'%s'\n", vpdp.identifier);
2193                         return 0;
2194                 }
2195         }
2196
2197         printheader();
2198
2199         if (!IS_CF_BOARD(board)) {
2200                 printk(KERN_DEBUG "sx: Found an SX board at %lx\n",
2201                         board->hw_base);
2202                 printk(KERN_DEBUG "sx: hw_rev: %d, assembly level: %d, "
2203                                 "uniq ID:%08x, ",
2204                                 vpdp.hwrev, vpdp.hwass, vpdp.uniqid);
2205                 printk("Manufactured: %d/%d\n", 1970 + vpdp.myear, vpdp.mweek);
2206
2207                 if ((((vpdp.uniqid >> 24) & SX_UNIQUEID_MASK) !=
2208                                 SX_PCI_UNIQUEID1) && (((vpdp.uniqid >> 24) &
2209                                 SX_UNIQUEID_MASK) != SX_ISA_UNIQUEID1)) {
2210                         /* This might be a bit harsh. This was the primary
2211                            reason the SX/ISA card didn't work at first... */
2212                         printk(KERN_ERR "sx: Hmm. Not an SX/PCI or SX/ISA "
2213                                         "card. Sorry: giving up.\n");
2214                         return (0);
2215                 }
2216
2217                 if (((vpdp.uniqid >> 24) & SX_UNIQUEID_MASK) ==
2218                                 SX_ISA_UNIQUEID1) {
2219                         if (((unsigned long)board->hw_base) & 0x8000) {
2220                                 printk(KERN_WARNING "sx: Warning: There may be "
2221                                         "hardware problems with the card at "
2222                                         "%lx.\n", board->hw_base);
2223                                 printk(KERN_WARNING "sx: Read sx.txt for more "
2224                                                 "info.\n");
2225                         }
2226                 }
2227         }
2228
2229         board->nports = -1;
2230
2231         /* This resets the processor, and keeps it off the bus. */
2232         if (!sx_reset(board))
2233                 return 0;
2234         sx_dprintk(SX_DEBUG_INIT, "reset the board...\n");
2235
2236         func_exit();
2237         return 1;
2238 }
2239
2240 #if defined(CONFIG_ISA) || defined(CONFIG_EISA)
2241
2242 /* Specialix probes for this card at 32k increments from 640k to 16M.
2243    I consider machines with less than 16M unlikely nowadays, so I'm
2244    not probing above 1Mb. Also, 0xa0000, 0xb0000, are taken by the VGA
2245    card. 0xe0000 and 0xf0000 are taken by the BIOS. That only leaves 
2246    0xc0000, 0xc8000, 0xd0000 and 0xd8000 . */
2247
2248 static int __devinit probe_si(struct sx_board *board)
2249 {
2250         int i;
2251
2252         func_enter();
2253         sx_dprintk(SX_DEBUG_PROBE, "Going to verify SI signature hw %lx at "
2254                 "%p.\n", board->hw_base, board->base + SI2_ISA_ID_BASE);
2255
2256         if (sx_debug & SX_DEBUG_PROBE)
2257                 my_hd_io(board->base + SI2_ISA_ID_BASE, 0x8);
2258
2259         if (!IS_EISA_BOARD(board)) {
2260                 if (IS_SI1_BOARD(board)) {
2261                         for (i = 0; i < 8; i++) {
2262                                 write_sx_byte(board, SI2_ISA_ID_BASE + 7 - i,i);
2263                         }
2264                 }
2265                 for (i = 0; i < 8; i++) {
2266                         if ((read_sx_byte(board, SI2_ISA_ID_BASE + 7 - i) & 7)
2267                                         != i) {
2268                                 func_exit();
2269                                 return 0;
2270                         }
2271                 }
2272         }
2273
2274         /* Now we're pretty much convinced that there is an SI board here, 
2275            but to prevent trouble, we'd better double check that we don't
2276            have an SI1 board when we're probing for an SI2 board.... */
2277
2278         write_sx_byte(board, SI2_ISA_ID_BASE, 0x10);
2279         if (IS_SI1_BOARD(board)) {
2280                 /* This should be an SI1 board, which has this
2281                    location writable... */
2282                 if (read_sx_byte(board, SI2_ISA_ID_BASE) != 0x10) {
2283                         func_exit();
2284                         return 0;
2285                 }
2286         } else {
2287                 /* This should be an SI2 board, which has the bottom
2288                    3 bits non-writable... */
2289                 if (read_sx_byte(board, SI2_ISA_ID_BASE) == 0x10) {
2290                         func_exit();
2291                         return 0;
2292                 }
2293         }
2294
2295         /* Now we're pretty much convinced that there is an SI board here, 
2296            but to prevent trouble, we'd better double check that we don't
2297            have an SI1 board when we're probing for an SI2 board.... */
2298
2299         write_sx_byte(board, SI2_ISA_ID_BASE, 0x10);
2300         if (IS_SI1_BOARD(board)) {
2301                 /* This should be an SI1 board, which has this
2302                    location writable... */
2303                 if (read_sx_byte(board, SI2_ISA_ID_BASE) != 0x10) {
2304                         func_exit();
2305                         return 0;
2306                 }
2307         } else {
2308                 /* This should be an SI2 board, which has the bottom
2309                    3 bits non-writable... */
2310                 if (read_sx_byte(board, SI2_ISA_ID_BASE) == 0x10) {
2311                         func_exit();
2312                         return 0;
2313                 }
2314         }
2315
2316         printheader();
2317
2318         printk(KERN_DEBUG "sx: Found an SI board at %lx\n", board->hw_base);
2319         /* Compared to the SX boards, it is a complete guess as to what
2320            this card is up to... */
2321
2322         board->nports = -1;
2323
2324         /* This resets the processor, and keeps it off the bus. */
2325         if (!sx_reset(board))
2326                 return 0;
2327         sx_dprintk(SX_DEBUG_INIT, "reset the board...\n");
2328
2329         func_exit();
2330         return 1;
2331 }
2332 #endif
2333
2334 static const struct tty_operations sx_ops = {
2335         .break_ctl = sx_break,
2336         .open = sx_open,
2337         .close = gs_close,
2338         .write = gs_write,
2339         .put_char = gs_put_char,
2340         .flush_chars = gs_flush_chars,
2341         .write_room = gs_write_room,
2342         .chars_in_buffer = gs_chars_in_buffer,
2343         .flush_buffer = gs_flush_buffer,
2344         .ioctl = sx_ioctl,
2345         .throttle = sx_throttle,
2346         .unthrottle = sx_unthrottle,
2347         .set_termios = gs_set_termios,
2348         .stop = gs_stop,
2349         .start = gs_start,
2350         .hangup = gs_hangup,
2351         .tiocmget = sx_tiocmget,
2352         .tiocmset = sx_tiocmset,
2353 };
2354
2355 static const struct tty_port_operations sx_port_ops = {
2356         .carrier_raised = sx_carrier_raised,
2357 };
2358
2359 static int sx_init_drivers(void)
2360 {
2361         int error;
2362
2363         func_enter();
2364
2365         sx_driver = alloc_tty_driver(sx_nports);
2366         if (!sx_driver)
2367                 return 1;
2368         sx_driver->owner = THIS_MODULE;
2369         sx_driver->driver_name = "specialix_sx";
2370         sx_driver->name = "ttyX";
2371         sx_driver->major = SX_NORMAL_MAJOR;
2372         sx_driver->type = TTY_DRIVER_TYPE_SERIAL;
2373         sx_driver->subtype = SERIAL_TYPE_NORMAL;
2374         sx_driver->init_termios = tty_std_termios;
2375         sx_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
2376         sx_driver->init_termios.c_ispeed = 9600;
2377         sx_driver->init_termios.c_ospeed = 9600;
2378         sx_driver->flags = TTY_DRIVER_REAL_RAW;
2379         tty_set_operations(sx_driver, &sx_ops);
2380
2381         if ((error = tty_register_driver(sx_driver))) {
2382                 put_tty_driver(sx_driver);
2383                 printk(KERN_ERR "sx: Couldn't register sx driver, error = %d\n",
2384                         error);
2385                 return 1;
2386         }
2387         func_exit();
2388         return 0;
2389 }
2390
2391 static int sx_init_portstructs(int nboards, int nports)
2392 {
2393         struct sx_board *board;
2394         struct sx_port *port;
2395         int i, j;
2396         int addr, chans;
2397         int portno;
2398
2399         func_enter();
2400
2401         /* Many drivers statically allocate the maximum number of ports
2402            There is no reason not to allocate them dynamically.
2403            Is there? -- REW */
2404         sx_ports = kcalloc(nports, sizeof(struct sx_port), GFP_KERNEL);
2405         if (!sx_ports)
2406                 return -ENOMEM;
2407
2408         port = sx_ports;
2409         for (i = 0; i < nboards; i++) {
2410                 board = &boards[i];
2411                 board->ports = port;
2412                 for (j = 0; j < boards[i].nports; j++) {
2413                         sx_dprintk(SX_DEBUG_INIT, "initing port %d\n", j);
2414                         tty_port_init(&port->gs.port);
2415                         port->gs.port.ops = &sx_port_ops;
2416                         port->gs.magic = SX_MAGIC;
2417                         port->gs.close_delay = HZ / 2;
2418                         port->gs.closing_wait = 30 * HZ;
2419                         port->board = board;
2420                         port->gs.rd = &sx_real_driver;
2421 #ifdef NEW_WRITE_LOCKING
2422                         port->gs.port_write_mutex = MUTEX;
2423 #endif
2424                         spin_lock_init(&port->gs.driver_lock);
2425                         /*
2426                          * Initializing wait queue
2427                          */
2428                         port++;
2429                 }
2430         }
2431
2432         port = sx_ports;
2433         portno = 0;
2434         for (i = 0; i < nboards; i++) {
2435                 board = &boards[i];
2436                 board->port_base = portno;
2437                 /* Possibly the configuration was rejected. */
2438                 sx_dprintk(SX_DEBUG_PROBE, "Board has %d channels\n",
2439                                 board->nports);
2440                 if (board->nports <= 0)
2441                         continue;
2442                 /* XXX byteorder ?? */
2443                 for (addr = 0x80; addr != 0;
2444                                 addr = read_sx_word(board, addr) & 0x7fff) {
2445                         chans = sx_read_module_byte(board, addr, mc_type);
2446                         sx_dprintk(SX_DEBUG_PROBE, "Module at %x: %d "
2447                                         "channels\n", addr, chans);
2448                         sx_dprintk(SX_DEBUG_PROBE, "Port at");
2449                         for (j = 0; j < chans; j++) {
2450                                 /* The "sx-way" is the way it SHOULD be done.
2451                                    That way in the future, the firmware may for
2452                                    example pack the structures a bit more
2453                                    efficient. Neil tells me it isn't going to
2454                                    happen anytime soon though. */
2455                                 if (IS_SX_BOARD(board))
2456                                         port->ch_base = sx_read_module_word(
2457                                                         board, addr + j * 2,
2458                                                         mc_chan_pointer);
2459                                 else
2460                                         port->ch_base = addr + 0x100 + 0x300 *j;
2461
2462                                 sx_dprintk(SX_DEBUG_PROBE, " %x",
2463                                                 port->ch_base);
2464                                 port->line = portno++;
2465                                 port++;
2466                         }
2467                         sx_dprintk(SX_DEBUG_PROBE, "\n");
2468                 }
2469                 /* This has to be done earlier. */
2470                 /* board->flags |= SX_BOARD_INITIALIZED; */
2471         }
2472
2473         func_exit();
2474         return 0;
2475 }
2476
2477 static unsigned int sx_find_free_board(void)
2478 {
2479         unsigned int i;
2480
2481         for (i = 0; i < SX_NBOARDS; i++)
2482                 if (!(boards[i].flags & SX_BOARD_PRESENT))
2483                         break;
2484
2485         return i;
2486 }
2487
2488 static void __exit sx_release_drivers(void)
2489 {
2490         func_enter();
2491         tty_unregister_driver(sx_driver);
2492         put_tty_driver(sx_driver);
2493         func_exit();
2494 }
2495
2496 static void __devexit sx_remove_card(struct sx_board *board,
2497                 struct pci_dev *pdev)
2498 {
2499         if (board->flags & SX_BOARD_INITIALIZED) {
2500                 /* The board should stop messing with us. (actually I mean the
2501                    interrupt) */
2502                 sx_reset(board);
2503                 if ((board->irq) && (board->flags & SX_IRQ_ALLOCATED))
2504                         free_irq(board->irq, board);
2505
2506                 /* It is safe/allowed to del_timer a non-active timer */
2507                 del_timer(&board->timer);
2508                 if (pdev) {
2509 #ifdef CONFIG_PCI
2510                         iounmap(board->base2);
2511                         pci_release_region(pdev, IS_CF_BOARD(board) ? 3 : 2);
2512 #endif
2513                 } else {
2514                         iounmap(board->base);
2515                         release_region(board->hw_base, board->hw_len);
2516                 }
2517
2518                 board->flags &= ~(SX_BOARD_INITIALIZED | SX_BOARD_PRESENT);
2519         }
2520 }
2521
2522 #ifdef CONFIG_EISA
2523
2524 static int __devinit sx_eisa_probe(struct device *dev)
2525 {
2526         struct eisa_device *edev = to_eisa_device(dev);
2527         struct sx_board *board;
2528         unsigned long eisa_slot = edev->base_addr;
2529         unsigned int i;
2530         int retval = -EIO;
2531
2532         mutex_lock(&sx_boards_lock);
2533         i = sx_find_free_board();
2534         if (i == SX_NBOARDS) {
2535                 mutex_unlock(&sx_boards_lock);
2536                 goto err;
2537         }
2538         board = &boards[i];
2539         board->flags |= SX_BOARD_PRESENT;
2540         mutex_unlock(&sx_boards_lock);
2541
2542         dev_info(dev, "XIO : Signature found in EISA slot %lu, "
2543                  "Product %d Rev %d (REPORT THIS TO LKLM)\n",
2544                  eisa_slot >> 12,
2545                  inb(eisa_slot + EISA_VENDOR_ID_OFFSET + 2),
2546                  inb(eisa_slot + EISA_VENDOR_ID_OFFSET + 3));
2547
2548         board->eisa_base = eisa_slot;
2549         board->flags &= ~SX_BOARD_TYPE;
2550         board->flags |= SI_EISA_BOARD;
2551
2552         board->hw_base = ((inb(eisa_slot + 0xc01) << 8) +
2553                           inb(eisa_slot + 0xc00)) << 16;
2554         board->hw_len = SI2_EISA_WINDOW_LEN;
2555         if (!request_region(board->hw_base, board->hw_len, "sx")) {
2556                 dev_err(dev, "can't request region\n");
2557                 goto err_flag;
2558         }
2559         board->base2 =
2560         board->base = ioremap_nocache(board->hw_base, SI2_EISA_WINDOW_LEN);
2561         if (!board->base) {
2562                 dev_err(dev, "can't remap memory\n");
2563                 goto err_reg;
2564         }
2565
2566         sx_dprintk(SX_DEBUG_PROBE, "IO hw_base address: %lx\n", board->hw_base);
2567         sx_dprintk(SX_DEBUG_PROBE, "base: %p\n", board->base);
2568         board->irq = inb(eisa_slot + 0xc02) >> 4;
2569         sx_dprintk(SX_DEBUG_PROBE, "IRQ: %d\n", board->irq);
2570
2571         if (!probe_si(board))
2572                 goto err_unmap;
2573
2574         dev_set_drvdata(dev, board);
2575
2576         return 0;
2577 err_unmap:
2578         iounmap(board->base);
2579 err_reg:
2580         release_region(board->hw_base, board->hw_len);
2581 err_flag:
2582         board->flags &= ~SX_BOARD_PRESENT;
2583 err:
2584         return retval;
2585 }
2586
2587 static int __devexit sx_eisa_remove(struct device *dev)
2588 {
2589         struct sx_board *board = dev_get_drvdata(dev);
2590
2591         sx_remove_card(board, NULL);
2592
2593         return 0;
2594 }
2595
2596 static struct eisa_device_id sx_eisa_tbl[] = {
2597         { "SLX" },
2598         { "" }
2599 };
2600
2601 MODULE_DEVICE_TABLE(eisa, sx_eisa_tbl);
2602
2603 static struct eisa_driver sx_eisadriver = {
2604         .id_table = sx_eisa_tbl,
2605         .driver = {
2606                 .name = "sx",
2607                 .probe = sx_eisa_probe,
2608                 .remove = __devexit_p(sx_eisa_remove),
2609         }
2610 };
2611
2612 #endif
2613
2614 #ifdef CONFIG_PCI
2615  /******************************************************** 
2616  * Setting bit 17 in the CNTRL register of the PLX 9050  * 
2617  * chip forces a retry on writes while a read is pending.*
2618  * This is to prevent the card locking up on Intel Xeon  *
2619  * multiprocessor systems with the NX chipset.    -- NV  *
2620  ********************************************************/
2621
2622 /* Newer cards are produced with this bit set from the configuration
2623    EEprom.  As the bit is read/write for the CPU, we can fix it here,
2624    if we detect that it isn't set correctly. -- REW */
2625
2626 static void __devinit fix_sx_pci(struct pci_dev *pdev, struct sx_board *board)
2627 {
2628         unsigned int hwbase;
2629         void __iomem *rebase;
2630         unsigned int t;
2631
2632 #define CNTRL_REG_OFFSET        0x50
2633 #define CNTRL_REG_GOODVALUE     0x18260000
2634
2635         pci_read_config_dword(pdev, PCI_BASE_ADDRESS_0, &hwbase);
2636         hwbase &= PCI_BASE_ADDRESS_MEM_MASK;
2637         rebase = ioremap_nocache(hwbase, 0x80);
2638         t = readl(rebase + CNTRL_REG_OFFSET);
2639         if (t != CNTRL_REG_GOODVALUE) {
2640                 printk(KERN_DEBUG "sx: performing cntrl reg fix: %08x -> "
2641                         "%08x\n", t, CNTRL_REG_GOODVALUE);
2642                 writel(CNTRL_REG_GOODVALUE, rebase + CNTRL_REG_OFFSET);
2643         }
2644         iounmap(rebase);
2645 }
2646 #endif
2647
2648 static int __devinit sx_pci_probe(struct pci_dev *pdev,
2649                                   const struct pci_device_id *ent)
2650 {
2651 #ifdef CONFIG_PCI
2652         struct sx_board *board;
2653         unsigned int i, reg;
2654         int retval = -EIO;
2655
2656         mutex_lock(&sx_boards_lock);
2657         i = sx_find_free_board();
2658         if (i == SX_NBOARDS) {
2659                 mutex_unlock(&sx_boards_lock);
2660                 goto err;
2661         }
2662         board = &boards[i];
2663         board->flags |= SX_BOARD_PRESENT;
2664         mutex_unlock(&sx_boards_lock);
2665
2666         retval = pci_enable_device(pdev);
2667         if (retval)
2668                 goto err_flag;
2669
2670         board->flags &= ~SX_BOARD_TYPE;
2671         board->flags |= (pdev->subsystem_vendor == 0x200) ? SX_PCI_BOARD :
2672                 SX_CFPCI_BOARD;
2673
2674         /* CF boards use base address 3.... */
2675         reg = IS_CF_BOARD(board) ? 3 : 2;
2676         retval = pci_request_region(pdev, reg, "sx");
2677         if (retval) {
2678                 dev_err(&pdev->dev, "can't request region\n");
2679                 goto err_flag;
2680         }
2681         board->hw_base = pci_resource_start(pdev, reg);
2682         board->base2 =
2683         board->base = ioremap_nocache(board->hw_base, WINDOW_LEN(board));
2684         if (!board->base) {
2685                 dev_err(&pdev->dev, "ioremap failed\n");
2686                 goto err_reg;
2687         }
2688
2689         /* Most of the stuff on the CF board is offset by 0x18000 ....  */
2690         if (IS_CF_BOARD(board))
2691                 board->base += 0x18000;
2692
2693         board->irq = pdev->irq;
2694
2695         dev_info(&pdev->dev, "Got a specialix card: %p(%d) %x.\n", board->base,
2696                  board->irq, board->flags);
2697
2698         if (!probe_sx(board)) {
2699                 retval = -EIO;
2700                 goto err_unmap;
2701         }
2702
2703         fix_sx_pci(pdev, board);
2704
2705         pci_set_drvdata(pdev, board);
2706
2707         return 0;
2708 err_unmap:
2709         iounmap(board->base2);
2710 err_reg:
2711         pci_release_region(pdev, reg);
2712 err_flag:
2713         board->flags &= ~SX_BOARD_PRESENT;
2714 err:
2715         return retval;
2716 #else
2717         return -ENODEV;
2718 #endif
2719 }
2720
2721 static void __devexit sx_pci_remove(struct pci_dev *pdev)
2722 {
2723         struct sx_board *board = pci_get_drvdata(pdev);
2724
2725         sx_remove_card(board, pdev);
2726 }
2727
2728 /* Specialix has a whole bunch of cards with 0x2000 as the device ID. They say
2729    its because the standard requires it. So check for SUBVENDOR_ID. */
2730 static struct pci_device_id sx_pci_tbl[] = {
2731         { PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8,
2732                 .subvendor = PCI_ANY_ID, .subdevice = 0x0200 },
2733         { PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8,
2734                 .subvendor = PCI_ANY_ID, .subdevice = 0x0300 },
2735         { 0 }
2736 };
2737
2738 MODULE_DEVICE_TABLE(pci, sx_pci_tbl);
2739
2740 static struct pci_driver sx_pcidriver = {
2741         .name = "sx",
2742         .id_table = sx_pci_tbl,
2743         .probe = sx_pci_probe,
2744         .remove = __devexit_p(sx_pci_remove)
2745 };
2746
2747 static int __init sx_init(void)
2748 {
2749 #ifdef CONFIG_EISA
2750         int retval1;
2751 #endif
2752 #ifdef CONFIG_ISA
2753         struct sx_board *board;
2754         unsigned int i;
2755 #endif
2756         unsigned int found = 0;
2757         int retval;
2758
2759         func_enter();
2760         sx_dprintk(SX_DEBUG_INIT, "Initing sx module... (sx_debug=%d)\n",
2761                         sx_debug);
2762         if (abs((long)(&sx_debug) - sx_debug) < 0x10000) {
2763                 printk(KERN_WARNING "sx: sx_debug is an address, instead of a "
2764                                 "value. Assuming -1.\n(%p)\n", &sx_debug);
2765                 sx_debug = -1;
2766         }
2767
2768         if (misc_register(&sx_fw_device) < 0) {
2769                 printk(KERN_ERR "SX: Unable to register firmware loader "
2770                                 "driver.\n");
2771                 return -EIO;
2772         }
2773 #ifdef CONFIG_ISA
2774         for (i = 0; i < NR_SX_ADDRS; i++) {
2775                 board = &boards[found];
2776                 board->hw_base = sx_probe_addrs[i];
2777                 board->hw_len = SX_WINDOW_LEN;
2778                 if (!request_region(board->hw_base, board->hw_len, "sx"))
2779                         continue;
2780                 board->base2 =
2781                 board->base = ioremap_nocache(board->hw_base, board->hw_len);
2782                 if (!board->base)
2783                         goto err_sx_reg;
2784                 board->flags &= ~SX_BOARD_TYPE;
2785                 board->flags |= SX_ISA_BOARD;
2786                 board->irq = sx_irqmask ? -1 : 0;
2787
2788                 if (probe_sx(board)) {
2789                         board->flags |= SX_BOARD_PRESENT;
2790                         found++;
2791                 } else {
2792                         iounmap(board->base);
2793 err_sx_reg:
2794                         release_region(board->hw_base, board->hw_len);
2795                 }
2796         }
2797
2798         for (i = 0; i < NR_SI_ADDRS; i++) {
2799                 board = &boards[found];
2800                 board->hw_base = si_probe_addrs[i];
2801                 board->hw_len = SI2_ISA_WINDOW_LEN;
2802                 if (!request_region(board->hw_base, board->hw_len, "sx"))
2803                         continue;
2804                 board->base2 =
2805                 board->base = ioremap_nocache(board->hw_base, board->hw_len);
2806                 if (!board->base)
2807                         goto err_si_reg;
2808                 board->flags &= ~SX_BOARD_TYPE;
2809                 board->flags |= SI_ISA_BOARD;
2810                 board->irq = sx_irqmask ? -1 : 0;
2811
2812                 if (probe_si(board)) {
2813                         board->flags |= SX_BOARD_PRESENT;
2814                         found++;
2815                 } else {
2816                         iounmap(board->base);
2817 err_si_reg:
2818                         release_region(board->hw_base, board->hw_len);
2819                 }
2820         }
2821         for (i = 0; i < NR_SI1_ADDRS; i++) {
2822                 board = &boards[found];
2823                 board->hw_base = si1_probe_addrs[i];
2824                 board->hw_len = SI1_ISA_WINDOW_LEN;
2825                 if (!request_region(board->hw_base, board->hw_len, "sx"))
2826                         continue;
2827                 board->base2 =
2828                 board->base = ioremap_nocache(board->hw_base, board->hw_len);
2829                 if (!board->base)
2830                         goto err_si1_reg;
2831                 board->flags &= ~SX_BOARD_TYPE;
2832                 board->flags |= SI1_ISA_BOARD;
2833                 board->irq = sx_irqmask ? -1 : 0;
2834
2835                 if (probe_si(board)) {
2836                         board->flags |= SX_BOARD_PRESENT;
2837                         found++;
2838                 } else {
2839                         iounmap(board->base);
2840 err_si1_reg:
2841                         release_region(board->hw_base, board->hw_len);
2842                 }
2843         }
2844 #endif
2845 #ifdef CONFIG_EISA
2846         retval1 = eisa_driver_register(&sx_eisadriver);
2847 #endif
2848         retval = pci_register_driver(&sx_pcidriver);
2849
2850         if (found) {
2851                 printk(KERN_INFO "sx: total of %d boards detected.\n", found);
2852                 retval = 0;
2853         } else if (retval) {
2854 #ifdef CONFIG_EISA
2855                 retval = retval1;
2856                 if (retval1)
2857 #endif
2858                         misc_deregister(&sx_fw_device);
2859         }
2860
2861         func_exit();
2862         return retval;
2863 }
2864
2865 static void __exit sx_exit(void)
2866 {
2867         int i;
2868
2869         func_enter();
2870 #ifdef CONFIG_EISA
2871         eisa_driver_unregister(&sx_eisadriver);
2872 #endif
2873         pci_unregister_driver(&sx_pcidriver);
2874
2875         for (i = 0; i < SX_NBOARDS; i++)
2876                 sx_remove_card(&boards[i], NULL);
2877
2878         if (misc_deregister(&sx_fw_device) < 0) {
2879                 printk(KERN_INFO "sx: couldn't deregister firmware loader "
2880                                 "device\n");
2881         }
2882         sx_dprintk(SX_DEBUG_CLEANUP, "Cleaning up drivers (%d)\n",
2883                         sx_initialized);
2884         if (sx_initialized)
2885                 sx_release_drivers();
2886
2887         kfree(sx_ports);
2888         func_exit();
2889 }
2890
2891 module_init(sx_init);
2892 module_exit(sx_exit);