hvc_console: Call free_irq() only if request_irq() was successful
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / char / sx.c
CommitLineData
1da177e4
LT
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:
1da177e4
LT
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
11c83877 200#define SX_VERSION 1.33
1da177e4 201
1da177e4 202#include <linux/module.h>
1da177e4
LT
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>
18f813ee 216#include <linux/eisa.h>
1da177e4
LT
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
1da177e4
LT
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
1da177e4
LT
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
1da177e4
LT
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
1da177e4
LT
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
15b611f6 275#endif
1da177e4
LT
276
277/* Function prototypes */
15b611f6
JS
278static void sx_disable_tx_interrupts(void *ptr);
279static void sx_enable_tx_interrupts(void *ptr);
280static void sx_disable_rx_interrupts(void *ptr);
281static void sx_enable_rx_interrupts(void *ptr);
31f35939 282static int sx_carrier_raised(struct tty_port *port);
15b611f6
JS
283static void sx_shutdown_port(void *ptr);
284static int sx_set_real_termios(void *ptr);
285static void sx_close(void *ptr);
286static int sx_chars_in_buffer(void *ptr);
287static int sx_init_board(struct sx_board *board);
288static int sx_init_portstructs(int nboards, int nports);
11af7478
AC
289static long sx_fw_ioctl(struct file *filp, unsigned int cmd,
290 unsigned long arg);
1da177e4
LT
291static int sx_init_drivers(void);
292
1da177e4
LT
293static struct tty_driver *sx_driver;
294
42f6384f 295static DEFINE_MUTEX(sx_boards_lock);
1da177e4
LT
296static struct sx_board boards[SX_NBOARDS];
297static struct sx_port *sx_ports;
298static int sx_initialized;
299static int sx_nports;
300static int sx_debug;
301
1da177e4
LT
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 */
310static int sx_poll = 1;
311static 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
318static int sx_maxints = 100;
319
927a6f9d
JS
320#ifdef CONFIG_ISA
321
1da177e4
LT
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*/
15b611f6
JS
326static int sx_probe_addrs[] = {
327 0xc0000, 0xd0000, 0xe0000,
328 0xc8000, 0xd8000, 0xe8000
329};
330static int si_probe_addrs[] = {
331 0xc0000, 0xd0000, 0xe0000,
332 0xc8000, 0xd8000, 0xe8000, 0xa0000
333};
334static int si1_probe_addrs[] = {
335 0xd0000
336};
1da177e4 337
fe971071
TK
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)
1da177e4 341
927a6f9d
JS
342module_param_array(sx_probe_addrs, int, NULL, 0);
343module_param_array(si_probe_addrs, int, NULL, 0);
344#endif
1da177e4
LT
345
346/* Set the mask to all-ones. This alas, only supports 32 interrupts.
347 Some architectures may need more. */
348static int sx_irqmask = -1;
349
1da177e4
LT
350module_param(sx_poll, int, 0);
351module_param(sx_slowpoll, int, 0);
352module_param(sx_maxints, int, 0);
353module_param(sx_debug, int, 0);
354module_param(sx_irqmask, int, 0);
355
356MODULE_LICENSE("GPL");
357
358static 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,
15b611f6
JS
363 sx_shutdown_port,
364 sx_set_real_termios,
1da177e4
LT
365 sx_chars_in_buffer,
366 sx_close,
367};
368
1da177e4
LT
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
1da177e4 379#ifdef DEBUG
15b611f6 380#define sx_dprintk(f, str...) if (sx_debug & f) printk (str)
1da177e4 381#else
15b611f6 382#define sx_dprintk(f, str...) /* nothing */
1da177e4
LT
383#endif
384
bf9d8929
HH
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__)
1da177e4 387
15b611f6 388#define func_enter2() sx_dprintk(SX_DEBUG_FLOW, "sx: enter %s (port %d)\n", \
bf9d8929 389 __func__, port->line)
1da177e4
LT
390
391/*
392 * Firmware loader driver specific routines
393 *
394 */
395
62322d25 396static const struct file_operations sx_fw_fops = {
15b611f6 397 .owner = THIS_MODULE,
11af7478 398 .unlocked_ioctl = sx_fw_ioctl,
1da177e4
LT
399};
400
401static struct miscdevice sx_fw_device = {
402 SXCTL_MISC_MINOR, "sxctl", &sx_fw_fops
403};
404
1da177e4
LT
405#ifdef SX_PARANOIA_CHECK
406
407/* This doesn't work. Who's paranoid around here? Not me! */
408
15b611f6 409static inline int sx_paranoia_check(struct sx_port const *port,
1da177e4
LT
410 char *name, const char *routine)
411{
15b611f6
JS
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";
1da177e4 416
1da177e4
LT
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
1da177e4
LT
439#ifdef DEBUG
440static void my_hd_io(void __iomem *p, int len)
441{
442 int i, j, ch;
443 unsigned char __iomem *addr = p;
444
15b611f6
JS
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) ? " " : "");
1da177e4 450 }
15b611f6
JS
451 for (j = 0; j < 16; j++) {
452 ch = readb(addr + j + i);
453 printk("%c", (ch < 0x20) ? '.' :
454 ((ch > 0x7f) ? '.' : ch));
1da177e4 455 }
15b611f6 456 printk("\n");
1da177e4
LT
457 }
458}
459static void my_hd(void *p, int len)
460{
461 int i, j, ch;
462 unsigned char *addr = p;
463
15b611f6
JS
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) ? " " : "");
1da177e4 468 }
15b611f6
JS
469 for (j = 0; j < 16; j++) {
470 ch = addr[j + i];
471 printk("%c", (ch < 0x20) ? '.' :
472 ((ch > 0x7f) ? '.' : ch));
1da177e4 473 }
15b611f6 474 printk("\n");
1da177e4
LT
475 }
476}
477#endif
478
1da177e4
LT
479/* This needs redoing for Alpha -- REW -- Done. */
480
15b611f6 481static inline void write_sx_byte(struct sx_board *board, int offset, u8 byte)
1da177e4 482{
15b611f6 483 writeb(byte, board->base + offset);
1da177e4
LT
484}
485
15b611f6 486static inline u8 read_sx_byte(struct sx_board *board, int offset)
1da177e4 487{
15b611f6 488 return readb(board->base + offset);
1da177e4
LT
489}
490
15b611f6 491static inline void write_sx_word(struct sx_board *board, int offset, u16 word)
1da177e4 492{
15b611f6 493 writew(word, board->base + offset);
1da177e4
LT
494}
495
15b611f6 496static inline u16 read_sx_word(struct sx_board *board, int offset)
1da177e4 497{
15b611f6 498 return readw(board->base + offset);
1da177e4
LT
499}
500
15b611f6
JS
501static int sx_busy_wait_eq(struct sx_board *board,
502 int offset, int mask, int correctval)
1da177e4
LT
503{
504 int i;
505
15b611f6 506 func_enter();
1da177e4 507
15b611f6
JS
508 for (i = 0; i < TIMEOUT_1; i++)
509 if ((read_sx_byte(board, offset) & mask) == correctval) {
510 func_exit();
1da177e4
LT
511 return 1;
512 }
513
15b611f6
JS
514 for (i = 0; i < TIMEOUT_2; i++) {
515 if ((read_sx_byte(board, offset) & mask) == correctval) {
516 func_exit();
1da177e4
LT
517 return 1;
518 }
15b611f6 519 udelay(1);
1da177e4
LT
520 }
521
15b611f6 522 func_exit();
1da177e4
LT
523 return 0;
524}
525
15b611f6
JS
526static int sx_busy_wait_neq(struct sx_board *board,
527 int offset, int mask, int badval)
1da177e4
LT
528{
529 int i;
530
15b611f6 531 func_enter();
1da177e4 532
15b611f6
JS
533 for (i = 0; i < TIMEOUT_1; i++)
534 if ((read_sx_byte(board, offset) & mask) != badval) {
535 func_exit();
1da177e4
LT
536 return 1;
537 }
538
15b611f6
JS
539 for (i = 0; i < TIMEOUT_2; i++) {
540 if ((read_sx_byte(board, offset) & mask) != badval) {
541 func_exit();
1da177e4
LT
542 return 1;
543 }
15b611f6 544 udelay(1);
1da177e4
LT
545 }
546
15b611f6 547 func_exit();
1da177e4
LT
548 return 0;
549}
550
1da177e4 551/* 5.6.4 of 6210028 r2.3 */
15b611f6 552static int sx_reset(struct sx_board *board)
1da177e4 553{
15b611f6 554 func_enter();
1da177e4 555
15b611f6 556 if (IS_SX_BOARD(board)) {
1da177e4 557
15b611f6
JS
558 write_sx_byte(board, SX_CONFIG, 0);
559 write_sx_byte(board, SX_RESET, 1); /* Value doesn't matter */
1da177e4 560
15b611f6
JS
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");
1da177e4
LT
564 return 0;
565 }
566 } else if (IS_EISA_BOARD(board)) {
15b611f6 567 outb(board->irq << 4, board->eisa_base + 0xc02);
1da177e4 568 } else if (IS_SI1_BOARD(board)) {
15b611f6 569 write_sx_byte(board, SI1_ISA_RESET, 0); /*value doesn't matter*/
1da177e4
LT
570 } else {
571 /* Gory details of the SI/ISA board */
15b611f6
JS
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);
1da177e4
LT
578 }
579
15b611f6 580 func_exit();
1da177e4
LT
581 return 1;
582}
583
1da177e4
LT
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 :-) */
15b611f6 589#define OFFSETOF(strct, elem) ((long)&(((struct strct *)NULL)->elem))
1da177e4 590
15b611f6
JS
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))
1da177e4
LT
594
595#define sx_write_channel_byte(port, elem, val) \
15b611f6 596 write_sx_byte (port->board, CHAN_OFFSET (port, elem), val)
1da177e4
LT
597
598#define sx_read_channel_byte(port, elem) \
15b611f6 599 read_sx_byte (port->board, CHAN_OFFSET (port, elem))
1da177e4
LT
600
601#define sx_write_channel_word(port, elem, val) \
15b611f6 602 write_sx_word (port->board, CHAN_OFFSET (port, elem), val)
1da177e4
LT
603
604#define sx_read_channel_word(port, elem) \
15b611f6 605 read_sx_word (port->board, CHAN_OFFSET (port, elem))
1da177e4
LT
606
607#define sx_write_module_byte(board, addr, elem, val) \
15b611f6 608 write_sx_byte (board, MODU_OFFSET (board, addr, elem), val)
1da177e4
LT
609
610#define sx_read_module_byte(board, addr, elem) \
15b611f6 611 read_sx_byte (board, MODU_OFFSET (board, addr, elem))
1da177e4
LT
612
613#define sx_write_module_word(board, addr, elem, val) \
15b611f6 614 write_sx_word (board, MODU_OFFSET (board, addr, elem), val)
1da177e4
LT
615
616#define sx_read_module_word(board, addr, elem) \
15b611f6 617 read_sx_word (board, MODU_OFFSET (board, addr, elem))
1da177e4
LT
618
619#define sx_write_board_byte(board, elem, val) \
15b611f6 620 write_sx_byte (board, BRD_OFFSET (board, elem), val)
1da177e4
LT
621
622#define sx_read_board_byte(board, elem) \
15b611f6 623 read_sx_byte (board, BRD_OFFSET (board, elem))
1da177e4
LT
624
625#define sx_write_board_word(board, elem, val) \
15b611f6 626 write_sx_word (board, BRD_OFFSET (board, elem), val)
1da177e4
LT
627
628#define sx_read_board_word(board, elem) \
15b611f6 629 read_sx_word (board, BRD_OFFSET (board, elem))
1da177e4 630
15b611f6 631static int sx_start_board(struct sx_board *board)
1da177e4 632{
15b611f6
JS
633 if (IS_SX_BOARD(board)) {
634 write_sx_byte(board, SX_CONFIG, SX_CONF_BUSEN);
1da177e4
LT
635 } else if (IS_EISA_BOARD(board)) {
636 write_sx_byte(board, SI2_EISA_OFF, SI2_EISA_VAL);
15b611f6 637 outb((board->irq << 4) | 4, board->eisa_base + 0xc02);
1da177e4 638 } else if (IS_SI1_BOARD(board)) {
15b611f6
JS
639 write_sx_byte(board, SI1_ISA_RESET_CLEAR, 0);
640 write_sx_byte(board, SI1_ISA_INTCL, 0);
1da177e4
LT
641 } else {
642 /* Don't bug me about the clear_set.
643 I haven't the foggiest idea what it's about -- REW */
15b611f6
JS
644 write_sx_byte(board, SI2_ISA_RESET, SI2_ISA_RESET_CLEAR);
645 write_sx_byte(board, SI2_ISA_INTCLEAR, SI2_ISA_INTCLEAR_SET);
1da177e4
LT
646 }
647 return 1;
648}
649
650#define SX_IRQ_REG_VAL(board) \
15b611f6 651 ((board->flags & SX_ISA_BOARD) ? (board->irq << 4) : 0)
1da177e4
LT
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... */
15b611f6 655static int sx_start_interrupts(struct sx_board *board)
1da177e4
LT
656{
657
658 /* Don't call this with board->irq == 0 */
659
660 if (IS_SX_BOARD(board)) {
15b611f6
JS
661 write_sx_byte(board, SX_CONFIG, SX_IRQ_REG_VAL(board) |
662 SX_CONF_BUSEN | SX_CONF_HOSTIRQ);
1da177e4 663 } else if (IS_EISA_BOARD(board)) {
15b611f6 664 inb(board->eisa_base + 0xc03);
1da177e4 665 } else if (IS_SI1_BOARD(board)) {
15b611f6
JS
666 write_sx_byte(board, SI1_ISA_INTCL, 0);
667 write_sx_byte(board, SI1_ISA_INTCL_CLEAR, 0);
1da177e4
LT
668 } else {
669 switch (board->irq) {
15b611f6
JS
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;
1da177e4 683 }
15b611f6 684 write_sx_byte(board, SI2_ISA_INTCLEAR, SI2_ISA_INTCLEAR_SET);
1da177e4
LT
685 }
686
687 return 1;
688}
689
15b611f6
JS
690static int sx_send_command(struct sx_port *port,
691 int command, int mask, int newstat)
1da177e4 692{
15b611f6
JS
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);
1da177e4
LT
698}
699
15b611f6 700static char *mod_type_s(int module_type)
1da177e4
LT
701{
702 switch (module_type) {
15b611f6
JS
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";
1da177e4
LT
717 }
718}
719
15b611f6 720static char *pan_type_s(int pan_type)
1da177e4
LT
721{
722 switch (pan_type) {
15b611f6
JS
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";
1da177e4
LT
745 }
746}
747
15b611f6 748static int mod_compat_type(int module_type)
1da177e4
LT
749{
750 return module_type >> 4;
751}
752
753static void sx_reconfigure_port(struct sx_port *port)
754{
15b611f6
JS
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");
1da177e4
LT
759 }
760 } else {
15b611f6
JS
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 }
1da177e4
LT
765}
766
15b611f6 767static void sx_setsignals(struct sx_port *port, int dtr, int rts)
1da177e4
LT
768{
769 int t;
15b611f6 770 func_enter2();
1da177e4 771
15b611f6
JS
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);
1da177e4 779
15b611f6 780 func_exit();
1da177e4
LT
781}
782
15b611f6 783static int sx_getsignals(struct sx_port *port)
1da177e4 784{
15b611f6
JS
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,
31f35939 793 port->c_dcd, tty_port_carrier_raised(&port->gs.port),
15b611f6
JS
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));
1da177e4
LT
803}
804
15b611f6 805static void sx_set_baud(struct sx_port *port)
1da177e4
LT
806{
807 int t;
808
809 if (port->board->ta_type == MOD_SXDC) {
810 switch (port->gs.baud) {
15b611f6
JS
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;
1da177e4
LT
848 default:
849 /* Can I return "invalid"? */
850 t = BAUD_9600;
15b611f6
JS
851 printk(KERN_INFO "sx: unsupported baud rate: %d.\n",
852 port->gs.baud);
1da177e4
LT
853 break;
854 }
855#undef e
856 if (t > 0) {
15b611f6
JS
857/* The baud rate is not set to 0, so we're enabeling DTR... -- REW */
858 sx_setsignals(port, 1, -1);
1da177e4 859 /* XXX This is not TA & MTA compatible */
15b611f6 860 sx_write_channel_byte(port, hi_csr, 0xff);
1da177e4 861
15b611f6
JS
862 sx_write_channel_byte(port, hi_txbaud, t);
863 sx_write_channel_byte(port, hi_rxbaud, t);
1da177e4 864 } else {
15b611f6 865 sx_setsignals(port, 0, -1);
1da177e4
LT
866 }
867 } else {
868 switch (port->gs.baud) {
15b611f6
JS
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:
1da177e4
LT
884 if (port->board->ta_type == MOD_TA) {
885 t = CSR_110;
886 break;
887 } else {
888 t = CSR_9600;
15b611f6
JS
889 printk(KERN_INFO "sx: Unsupported baud rate: "
890 "%d.\n", port->gs.baud);
1da177e4
LT
891 break;
892 }
15b611f6 893 case 115200:
1da177e4
LT
894 if (port->board->ta_type == MOD_TA) {
895 t = CSR_9600;
15b611f6
JS
896 printk(KERN_INFO "sx: Unsupported baud rate: "
897 "%d.\n", port->gs.baud);
1da177e4
LT
898 break;
899 } else {
900 t = CSR_110;
901 break;
902 }
15b611f6
JS
903 case 0:
904 t = -1;
905 break;
1da177e4
LT
906 default:
907 t = CSR_9600;
15b611f6
JS
908 printk(KERN_INFO "sx: Unsupported baud rate: %d.\n",
909 port->gs.baud);
1da177e4
LT
910 break;
911 }
912#undef e
913 if (t >= 0) {
15b611f6
JS
914 sx_setsignals(port, 1, -1);
915 sx_write_channel_byte(port, hi_csr, t * 0x11);
1da177e4 916 } else {
15b611f6 917 sx_setsignals(port, 0, -1);
1da177e4
LT
918 }
919 }
920}
921
1da177e4
LT
922/* Simon Allen's version of this routine was 225 lines long. 85 is a lot
923 better. -- REW */
924
15b611f6 925static int sx_set_real_termios(void *ptr)
1da177e4
LT
926{
927 struct sx_port *port = ptr;
928
929 func_enter2();
930
b5391e29 931 if (!port->gs.port.tty)
1da177e4
LT
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
15b611f6 940 sx_set_baud(port);
1da177e4 941
b5391e29 942#define CFLAG port->gs.port.tty->termios->c_cflag
15b611f6 943 sx_write_channel_byte(port, hi_mr1,
b5391e29
AC
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) |
15b611f6
JS
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,
b5391e29
AC
953 (C_CRTSCTS(port->gs.port.tty) ? MR2_CTS_TXFLOW : 0) |
954 (C_CSTOPB(port->gs.port.tty) ? MR2_2_STOP :
15b611f6 955 MR2_1_STOP));
1da177e4
LT
956
957 switch (CFLAG & CSIZE) {
15b611f6
JS
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;
1da177e4 970 default:
32fb3ca8
AM
971 printk(KERN_INFO "sx: Invalid wordsize: %u\n",
972 (unsigned int)CFLAG & CSIZE);
1da177e4
LT
973 break;
974 }
975
15b611f6 976 sx_write_channel_byte(port, hi_prtcl,
b5391e29
AC
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);
1da177e4 980
15b611f6 981 sx_write_channel_byte(port, hi_break,
b5391e29
AC
982 (I_IGNBRK(port->gs.port.tty) ? BR_IGN : 0 |
983 I_BRKINT(port->gs.port.tty) ? BR_INT : 0));
1da177e4 984
b5391e29
AC
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));
1da177e4
LT
989
990 sx_reconfigure_port(port);
991
992 /* Tell line discipline whether we will do input cooking */
b5391e29
AC
993 if (I_OTHER(port->gs.port.tty)) {
994 clear_bit(TTY_HW_COOK_IN, &port->gs.port.tty->flags);
1da177e4 995 } else {
b5391e29 996 set_bit(TTY_HW_COOK_IN, &port->gs.port.tty->flags);
1da177e4 997 }
15b611f6 998 sx_dprintk(SX_DEBUG_TERMIOS, "iflags: %x(%d) ",
b5391e29
AC
999 (unsigned int)port->gs.port.tty->termios->c_iflag,
1000 I_OTHER(port->gs.port.tty));
1da177e4
LT
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 */
b5391e29
AC
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);
1da177e4 1009 } else {
b5391e29 1010 clear_bit(TTY_HW_COOK_OUT, &port->gs.port.tty->flags);
1da177e4 1011 }
15b611f6 1012 sx_dprintk(SX_DEBUG_TERMIOS, "oflags: %x(%d)\n",
b5391e29
AC
1013 (unsigned int)port->gs.port.tty->termios->c_oflag,
1014 O_OTHER(port->gs.port.tty));
1da177e4 1015 /* port->c_dcd = sx_get_CD (port); */
15b611f6 1016 func_exit();
1da177e4
LT
1017 return 0;
1018}
1019
1da177e4
LT
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
15b611f6 1035static void sx_transmit_chars(struct sx_port *port)
1da177e4
LT
1036{
1037 int c;
1038 int tx_ip;
1039 int txroom;
1040
15b611f6
JS
1041 func_enter2();
1042 sx_dprintk(SX_DEBUG_TRANSMIT, "Port %p: transmit %d chars\n",
1043 port, port->gs.xmit_cnt);
1da177e4 1044
15b611f6 1045 if (test_and_set_bit(SX_PORT_TRANSMIT_LOCK, &port->locks)) {
1da177e4
LT
1046 return;
1047 }
1048
1049 while (1) {
1050 c = port->gs.xmit_cnt;
1051
15b611f6
JS
1052 sx_dprintk(SX_DEBUG_TRANSMIT, "Copying %d ", c);
1053 tx_ip = sx_read_channel_byte(port, hi_txipos);
1da177e4
LT
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 */
15b611f6
JS
1057 txroom = (sx_read_channel_byte(port, hi_txopos) - tx_ip - 1) &
1058 0xff;
1da177e4
LT
1059
1060 /* Don't copy more bytes than there is room for in the buffer */
1061 if (c > txroom)
1062 c = txroom;
15b611f6 1063 sx_dprintk(SX_DEBUG_TRANSMIT, " %d(%d) ", c, txroom);
1da177e4
LT
1064
1065 /* Don't copy past the end of the hardware transmit buffer */
15b611f6 1066 if (c > 0x100 - tx_ip)
1da177e4
LT
1067 c = 0x100 - tx_ip;
1068
15b611f6 1069 sx_dprintk(SX_DEBUG_TRANSMIT, " %d(%d) ", c, 0x100 - tx_ip);
1da177e4
LT
1070
1071 /* Don't copy pas the end of the source buffer */
15b611f6 1072 if (c > SERIAL_XMIT_SIZE - port->gs.xmit_tail)
1da177e4
LT
1073 c = SERIAL_XMIT_SIZE - port->gs.xmit_tail;
1074
15b611f6
JS
1075 sx_dprintk(SX_DEBUG_TRANSMIT, " %d(%ld) \n",
1076 c, SERIAL_XMIT_SIZE - port->gs.xmit_tail);
1da177e4 1077
15b611f6
JS
1078 /* If for one reason or another, we can't copy more data, we're
1079 done! */
1080 if (c == 0)
1081 break;
1da177e4 1082
15b611f6
JS
1083 memcpy_toio(port->board->base + CHAN_OFFSET(port, hi_txbuf) +
1084 tx_ip, port->gs.xmit_buf + port->gs.xmit_tail, c);
1da177e4
LT
1085
1086 /* Update the pointer in the card */
15b611f6 1087 sx_write_channel_byte(port, hi_txipos, (tx_ip + c) & 0xff);
1da177e4
LT
1088
1089 /* Update the kernel buffer end */
15b611f6
JS
1090 port->gs.xmit_tail = (port->gs.xmit_tail + c) &
1091 (SERIAL_XMIT_SIZE - 1);
1da177e4
LT
1092
1093 /* This one last. (this is essential)
15b611f6
JS
1094 It would allow others to start putting more data into the
1095 buffer! */
1da177e4
LT
1096 port->gs.xmit_cnt -= c;
1097 }
1098
1099 if (port->gs.xmit_cnt == 0) {
15b611f6 1100 sx_disable_tx_interrupts(port);
1da177e4
LT
1101 }
1102
b5391e29
AC
1103 if ((port->gs.xmit_cnt <= port->gs.wakeup_chars) && port->gs.port.tty) {
1104 tty_wakeup(port->gs.port.tty);
15b611f6
JS
1105 sx_dprintk(SX_DEBUG_TRANSMIT, "Waking up.... ldisc (%d)....\n",
1106 port->gs.wakeup_chars);
1da177e4
LT
1107 }
1108
15b611f6
JS
1109 clear_bit(SX_PORT_TRANSMIT_LOCK, &port->locks);
1110 func_exit();
1da177e4
LT
1111}
1112
1da177e4
LT
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 */
15b611f6 1118static inline void sx_receive_chars(struct sx_port *port)
1da177e4
LT
1119{
1120 int c;
1121 int rx_op;
1122 struct tty_struct *tty;
15b611f6 1123 int copied = 0;
33f0f88f 1124 unsigned char *rp;
1da177e4 1125
15b611f6 1126 func_enter2();
b5391e29 1127 tty = port->gs.port.tty;
1da177e4 1128 while (1) {
15b611f6
JS
1129 rx_op = sx_read_channel_byte(port, hi_rxopos);
1130 c = (sx_read_channel_byte(port, hi_rxipos) - rx_op) & 0xff;
1da177e4 1131
15b611f6 1132 sx_dprintk(SX_DEBUG_RECEIVE, "rxop=%d, c = %d.\n", rx_op, c);
1da177e4 1133
d904ffd6 1134 /* Don't copy past the end of the hardware receive buffer */
15b611f6
JS
1135 if (rx_op + c > 0x100)
1136 c = 0x100 - rx_op;
d904ffd6 1137
15b611f6 1138 sx_dprintk(SX_DEBUG_RECEIVE, "c = %d.\n", c);
d904ffd6 1139
1da177e4 1140 /* Don't copy more bytes than there is room for in the buffer */
33f0f88f
AC
1141
1142 c = tty_prepare_flip_string(tty, &rp, c);
1da177e4 1143
15b611f6 1144 sx_dprintk(SX_DEBUG_RECEIVE, "c = %d.\n", c);
1da177e4 1145
1da177e4 1146 /* If for one reason or another, we can't copy more data, we're done! */
15b611f6
JS
1147 if (c == 0)
1148 break;
1da177e4 1149
15b611f6
JS
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);
1da177e4
LT
1156
1157 /* This one last. ( Not essential.)
15b611f6
JS
1158 It allows the card to start putting more data into the
1159 buffer!
1da177e4 1160 Update the pointer in the card */
15b611f6 1161 sx_write_channel_byte(port, hi_rxopos, (rx_op + c) & 0xff);
1da177e4
LT
1162
1163 copied += c;
1164 }
1165 if (copied) {
1166 struct timeval tv;
1167
15b611f6
JS
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);
1da177e4 1173
15b611f6
JS
1174 /* Tell the rest of the system the news. Great news. New
1175 characters! */
1176 tty_flip_buffer_push(tty);
1da177e4
LT
1177 /* tty_schedule_flip (tty); */
1178 }
1179
15b611f6 1180 func_exit();
1da177e4
LT
1181}
1182
1183/* Inlined: it is called only once. Remove the inline if you add another
1184 call */
15b611f6 1185static inline void sx_check_modem_signals(struct sx_port *port)
1da177e4
LT
1186{
1187 int hi_state;
1188 int c_dcd;
1189
15b611f6
JS
1190 hi_state = sx_read_channel_byte(port, hi_state);
1191 sx_dprintk(SX_DEBUG_MODEMSIGNALS, "Checking modem signals (%d/%d)\n",
31f35939 1192 port->c_dcd, tty_port_carrier_raised(&port->gs.port));
1da177e4
LT
1193
1194 if (hi_state & ST_BREAK) {
1195 hi_state &= ~ST_BREAK;
15b611f6
JS
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);
1da177e4
LT
1199 }
1200 if (hi_state & ST_DCD) {
1201 hi_state &= ~ST_DCD;
15b611f6
JS
1202 sx_dprintk(SX_DEBUG_MODEMSIGNALS, "got a DCD change.\n");
1203 sx_write_channel_byte(port, hi_state, hi_state);
31f35939 1204 c_dcd = tty_port_carrier_raised(&port->gs.port);
15b611f6 1205 sx_dprintk(SX_DEBUG_MODEMSIGNALS, "DCD is now %d\n", c_dcd);
1da177e4
LT
1206 if (c_dcd != port->c_dcd) {
1207 port->c_dcd = c_dcd;
31f35939 1208 if (tty_port_carrier_raised(&port->gs.port)) {
1da177e4 1209 /* DCD went UP */
15b611f6
JS
1210 if ((sx_read_channel_byte(port, hi_hstat) !=
1211 HS_IDLE_CLOSED) &&
b5391e29 1212 !(port->gs.port.tty->termios->
15b611f6
JS
1213 c_cflag & CLOCAL)) {
1214 /* Are we blocking in open? */
1215 sx_dprintk(SX_DEBUG_MODEMSIGNALS, "DCD "
1216 "active, unblocking open\n");
b5391e29 1217 wake_up_interruptible(&port->gs.port.
15b611f6 1218 open_wait);
1da177e4 1219 } else {
15b611f6
JS
1220 sx_dprintk(SX_DEBUG_MODEMSIGNALS, "DCD "
1221 "raised. Ignoring.\n");
1da177e4
LT
1222 }
1223 } else {
1224 /* DCD went down! */
b5391e29 1225 if (!(port->gs.port.tty->termios->c_cflag & CLOCAL)){
15b611f6
JS
1226 sx_dprintk(SX_DEBUG_MODEMSIGNALS, "DCD "
1227 "dropped. hanging up....\n");
b5391e29 1228 tty_hangup(port->gs.port.tty);
1da177e4 1229 } else {
15b611f6
JS
1230 sx_dprintk(SX_DEBUG_MODEMSIGNALS, "DCD "
1231 "dropped. ignoring.\n");
1da177e4
LT
1232 }
1233 }
1234 } else {
15b611f6
JS
1235 sx_dprintk(SX_DEBUG_MODEMSIGNALS, "Hmmm. card told us "
1236 "DCD changed, but it didn't.\n");
1da177e4
LT
1237 }
1238 }
1239}
1240
1da177e4
LT
1241/* This is what an interrupt routine should look like.
1242 * Small, elegant, clear.
1243 */
1244
15b611f6 1245static irqreturn_t sx_interrupt(int irq, void *ptr)
1da177e4
LT
1246{
1247 struct sx_board *board = ptr;
1248 struct sx_port *port;
1249 int i;
1250
15b611f6
JS
1251 func_enter();
1252 sx_dprintk(SX_DEBUG_FLOW, "sx: enter sx_interrupt (%d/%d)\n", irq,
1253 board->irq);
1da177e4
LT
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
15b611f6 1259 recursive calls will hang the machine in the interrupt routine.
1da177e4
LT
1260
1261 - hardware twiddling goes before "recursive". Otherwise when we
15b611f6
JS
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).
1da177e4
LT
1265
1266 - Rate limit goes before hardware twiddling. Otherwise we won't
15b611f6 1267 catch a card that has gone bonkers.
1da177e4
LT
1268
1269 - The "initialized" test goes after the hardware twiddling. Otherwise
15b611f6 1270 the card will stick us in the interrupt routine again.
1da177e4
LT
1271
1272 - The initialized test goes before recursive.
15b611f6 1273 */
1da177e4
LT
1274
1275#ifdef IRQ_RATE_LIMIT
1276 /* Aaargh! I'm ashamed. This costs more lines-of-code than the
15b611f6
JS
1277 actual interrupt routine!. (Well, used to when I wrote that
1278 comment) */
1da177e4
LT
1279 {
1280 static int lastjif;
15b611f6 1281 static int nintr = 0;
1da177e4
LT
1282
1283 if (lastjif == jiffies) {
1284 if (++nintr > IRQ_RATE_LIMIT) {
15b611f6
JS
1285 free_irq(board->irq, board);
1286 printk(KERN_ERR "sx: Too many interrupts. "
1287 "Turning off interrupt %d.\n",
1288 board->irq);
1da177e4
LT
1289 }
1290 } else {
1291 lastjif = jiffies;
1292 nintr = 0;
1293 }
1294 }
1295#endif
1296
1da177e4
LT
1297 if (board->irq == irq) {
1298 /* Tell the card we've noticed the interrupt. */
1299
15b611f6
JS
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);
1da177e4 1303 } else if (IS_EISA_BOARD(board)) {
15b611f6
JS
1304 inb(board->eisa_base + 0xc03);
1305 write_sx_word(board, 8, 0);
1da177e4 1306 } else {
15b611f6
JS
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);
1da177e4
LT
1311 }
1312 }
1313
1314 if (!sx_initialized)
1315 return IRQ_HANDLED;
1316 if (!(board->flags & SX_BOARD_INITIALIZED))
1317 return IRQ_HANDLED;
1318
15b611f6
JS
1319 if (test_and_set_bit(SX_BOARD_INTR_LOCK, &board->locks)) {
1320 printk(KERN_ERR "Recursive interrupt! (%d)\n", board->irq);
1da177e4
LT
1321 return IRQ_HANDLED;
1322 }
1323
15b611f6 1324 for (i = 0; i < board->nports; i++) {
1da177e4 1325 port = &board->ports[i];
b5391e29 1326 if (port->gs.port.flags & GS_ACTIVE) {
15b611f6
JS
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);
1da177e4
LT
1331 }
1332 if (port->gs.xmit_cnt) {
15b611f6 1333 sx_transmit_chars(port);
1da177e4 1334 }
b5391e29 1335 if (!(port->gs.port.flags & SX_RX_THROTTLE)) {
15b611f6 1336 sx_receive_chars(port);
1da177e4
LT
1337 }
1338 }
1339 }
1340
15b611f6 1341 clear_bit(SX_BOARD_INTR_LOCK, &board->locks);
1da177e4 1342
15b611f6
JS
1343 sx_dprintk(SX_DEBUG_FLOW, "sx: exit sx_interrupt (%d/%d)\n", irq,
1344 board->irq);
1345 func_exit();
1da177e4
LT
1346 return IRQ_HANDLED;
1347}
1348
15b611f6 1349static void sx_pollfunc(unsigned long data)
1da177e4 1350{
15b611f6 1351 struct sx_board *board = (struct sx_board *)data;
1da177e4 1352
15b611f6 1353 func_enter();
1da177e4 1354
15b611f6 1355 sx_interrupt(0, board);
1da177e4 1356
c9594643 1357 mod_timer(&board->timer, jiffies + sx_poll);
15b611f6 1358 func_exit();
1da177e4
LT
1359}
1360
1da177e4
LT
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
15b611f6 1369static void sx_disable_tx_interrupts(void *ptr)
1da177e4 1370{
15b611f6 1371 struct sx_port *port = ptr;
1da177e4
LT
1372 func_enter2();
1373
b5391e29 1374 port->gs.port.flags &= ~GS_TX_INTEN;
1da177e4
LT
1375
1376 func_exit();
1377}
1378
15b611f6 1379static void sx_enable_tx_interrupts(void *ptr)
1da177e4 1380{
15b611f6 1381 struct sx_port *port = ptr;
1da177e4
LT
1382 int data_in_buffer;
1383 func_enter2();
1384
1385 /* First transmit the characters that we're supposed to */
15b611f6 1386 sx_transmit_chars(port);
1da177e4
LT
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. */
15b611f6
JS
1390 data_in_buffer = (sx_read_channel_byte(port, hi_txipos) -
1391 sx_read_channel_byte(port, hi_txopos)) & 0xff;
1da177e4
LT
1392
1393 /* XXX Must be "HIGH_WATER" for SI card according to doc. */
15b611f6 1394 if (data_in_buffer < LOW_WATER)
b5391e29 1395 port->gs.port.flags &= ~GS_TX_INTEN;
1da177e4
LT
1396
1397 func_exit();
1398}
1399
15b611f6 1400static void sx_disable_rx_interrupts(void *ptr)
1da177e4
LT
1401{
1402 /* struct sx_port *port = ptr; */
1403 func_enter();
1404
1405 func_exit();
1406}
1407
15b611f6 1408static void sx_enable_rx_interrupts(void *ptr)
1da177e4
LT
1409{
1410 /* struct sx_port *port = ptr; */
1411 func_enter();
1412
1413 func_exit();
1414}
1415
1da177e4 1416/* Jeez. Isn't this simple? */
31f35939 1417static int sx_carrier_raised(struct tty_port *port)
1da177e4 1418{
31f35939
AC
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);
1da177e4
LT
1421}
1422
1da177e4 1423/* Jeez. Isn't this simple? */
15b611f6 1424static int sx_chars_in_buffer(void *ptr)
1da177e4
LT
1425{
1426 struct sx_port *port = ptr;
1427 func_enter2();
1428
1429 func_exit();
15b611f6
JS
1430 return ((sx_read_channel_byte(port, hi_txipos) -
1431 sx_read_channel_byte(port, hi_txopos)) & 0xff);
1da177e4
LT
1432}
1433
15b611f6 1434static void sx_shutdown_port(void *ptr)
1da177e4 1435{
15b611f6 1436 struct sx_port *port = ptr;
1da177e4
LT
1437
1438 func_enter();
1439
b5391e29
AC
1440 port->gs.port.flags &= ~GS_ACTIVE;
1441 if (port->gs.port.tty && (port->gs.port.tty->termios->c_cflag & HUPCL)) {
15b611f6 1442 sx_setsignals(port, 0, 0);
1da177e4
LT
1443 sx_reconfigure_port(port);
1444 }
1445
1446 func_exit();
1447}
1448
1da177e4
LT
1449/* ********************************************************************** *
1450 * Here are the routines that actually *
1451 * interface with the rest of the system *
1452 * ********************************************************************** */
1453
15b611f6 1454static int sx_open(struct tty_struct *tty, struct file *filp)
1da177e4
LT
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;
15b611f6 1467 sx_dprintk(SX_DEBUG_OPEN, "%d: opening line %d. tty=%p ctty=%p, "
ba25f9dc 1468 "np=%d)\n", task_pid_nr(current), line, tty,
15b611f6 1469 current->signal->tty, sx_nports);
1da177e4
LT
1470
1471 if ((line < 0) || (line >= SX_NPORTS) || (line >= sx_nports))
1472 return -ENODEV;
1473
15b611f6 1474 port = &sx_ports[line];
1da177e4 1475 port->c_dcd = 0; /* Make sure that the first interrupt doesn't detect a
15b611f6 1476 1 -> 0 transition. */
1da177e4 1477
15b611f6 1478 sx_dprintk(SX_DEBUG_OPEN, "port = %p c_dcd = %d\n", port, port->c_dcd);
1da177e4
LT
1479
1480 spin_lock_irqsave(&port->gs.driver_lock, flags);
1481
1482 tty->driver_data = port;
b5391e29
AC
1483 port->gs.port.tty = tty;
1484 port->gs.port.count++;
1da177e4
LT
1485 spin_unlock_irqrestore(&port->gs.driver_lock, flags);
1486
15b611f6 1487 sx_dprintk(SX_DEBUG_OPEN, "starting port\n");
1da177e4
LT
1488
1489 /*
1490 * Start up serial port
1491 */
1492 retval = gs_init_port(&port->gs);
15b611f6 1493 sx_dprintk(SX_DEBUG_OPEN, "done gs_init\n");
1da177e4 1494 if (retval) {
b5391e29 1495 port->gs.port.count--;
1da177e4
LT
1496 return retval;
1497 }
1498
b5391e29
AC
1499 port->gs.port.flags |= GS_ACTIVE;
1500 if (port->gs.port.count <= 1)
15b611f6 1501 sx_setsignals(port, 1, 1);
1da177e4
LT
1502
1503#if 0
1504 if (sx_debug & SX_DEBUG_OPEN)
15b611f6 1505 my_hd(port, sizeof(*port));
1da177e4
LT
1506#else
1507 if (sx_debug & SX_DEBUG_OPEN)
15b611f6 1508 my_hd_io(port->board->base + port->ch_base, sizeof(*port));
1da177e4
LT
1509#endif
1510
b5391e29 1511 if (port->gs.port.count <= 1) {
15b611f6
JS
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");
1da177e4 1515 spin_lock_irqsave(&port->gs.driver_lock, flags);
b5391e29 1516 port->gs.port.count--;
1da177e4
LT
1517 spin_unlock_irqrestore(&port->gs.driver_lock, flags);
1518 return -EIO;
1519 }
1520 }
1521
1522 retval = gs_block_til_ready(port, filp);
15b611f6 1523 sx_dprintk(SX_DEBUG_OPEN, "Block til ready returned %d. Count=%d\n",
b5391e29 1524 retval, port->gs.port.count);
1da177e4
LT
1525
1526 if (retval) {
15b611f6 1527/*
b5391e29 1528 * Don't lower gs.port.count here because sx_close() will be called later
15b611f6 1529 */
1da177e4
LT
1530
1531 return retval;
1532 }
1533 /* tty->low_latency = 1; */
1534
31f35939 1535 port->c_dcd = sx_carrier_raised(&port->gs.port);
15b611f6 1536 sx_dprintk(SX_DEBUG_OPEN, "at open: cd=%d\n", port->c_dcd);
1da177e4
LT
1537
1538 func_exit();
1539 return 0;
1540
1541}
1542
15b611f6 1543static void sx_close(void *ptr)
1da177e4 1544{
15b611f6 1545 struct sx_port *port = ptr;
1da177e4 1546 /* Give the port 5 seconds to close down. */
15b611f6 1547 int to = 5 * HZ;
1da177e4 1548
15b611f6 1549 func_enter();
1da177e4 1550
15b611f6
JS
1551 sx_setsignals(port, 0, 0);
1552 sx_reconfigure_port(port);
1553 sx_send_command(port, HS_CLOSE, 0, 0);
1da177e4 1554
15b611f6 1555 while (to-- && (sx_read_channel_byte(port, hi_hstat) != HS_IDLE_CLOSED))
1da177e4
LT
1556 if (msleep_interruptible(10))
1557 break;
15b611f6
JS
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");
1da177e4 1563 } else
15b611f6
JS
1564 sx_dprintk(SX_DEBUG_CLOSE, "sent the force_close "
1565 "command.\n");
1da177e4
LT
1566 }
1567
15b611f6 1568 sx_dprintk(SX_DEBUG_CLOSE, "waited %d jiffies for close. count=%d\n",
b5391e29 1569 5 * HZ - to - 1, port->gs.port.count);
1da177e4 1570
b5391e29 1571 if (port->gs.port.count) {
15b611f6 1572 sx_dprintk(SX_DEBUG_CLOSE, "WARNING port count:%d\n",
b5391e29 1573 port->gs.port.count);
15b611f6 1574 /*printk("%s SETTING port count to zero: %p count: %d\n",
b5391e29
AC
1575 __func__, port, port->gs.port.count);
1576 port->gs.port.count = 0;*/
1da177e4
LT
1577 }
1578
15b611f6 1579 func_exit();
1da177e4
LT
1580}
1581
1da177e4 1582/* This is relatively thorough. But then again it is only 20 lines. */
15b611f6
JS
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
1da177e4
LT
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. */
15b611f6 1592static int do_memtest(struct sx_board *board, int min, int max)
1da177e4
LT
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.) */
15b611f6
JS
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 }
1da177e4
LT
1628
1629 return 0;
1630}
1631
1da177e4
LT
1632#undef MARCHUP
1633#undef MARCHDOWN
1634#undef W0
1635#undef W1
1636#undef R0
1637#undef R1
1638
15b611f6
JS
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
1da177e4
LT
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. */
15b611f6 1649static int do_memtest_w(struct sx_board *board, int min, int max)
1da177e4
LT
1650{
1651 int i;
1652
15b611f6
JS
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 }
1da177e4
LT
1680
1681 return 0;
1682}
1683#endif
1684
11af7478
AC
1685static long sx_fw_ioctl(struct file *filp, unsigned int cmd,
1686 unsigned long arg)
1da177e4 1687{
11af7478 1688 long rc = 0;
1da177e4
LT
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
11af7478 1698 if (!capable(CAP_SYS_RAWIO))
1da177e4 1699 return -EPERM;
11af7478
AC
1700
1701 lock_kernel();
1da177e4 1702
15b611f6 1703 sx_dprintk(SX_DEBUG_FIRMWARE, "IOCTL %x: %lx\n", cmd, arg);
1da177e4 1704
15b611f6
JS
1705 if (!board)
1706 board = &boards[0];
1da177e4 1707 if (board->flags & SX_BOARD_PRESENT) {
15b611f6
JS
1708 sx_dprintk(SX_DEBUG_FIRMWARE, "Board present! (%x)\n",
1709 board->flags);
1da177e4 1710 } else {
15b611f6
JS
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");
11af7478 1716 unlock_kernel();
1da177e4
LT
1717 return -EIO;
1718 }
1719
1720 switch (cmd) {
1721 case SXIO_SET_BOARD:
15b611f6 1722 sx_dprintk(SX_DEBUG_FIRMWARE, "set board to %ld\n", arg);
11af7478 1723 rc = -EIO;
15b611f6 1724 if (arg >= SX_NBOARDS)
11af7478 1725 break;
15b611f6
JS
1726 sx_dprintk(SX_DEBUG_FIRMWARE, "not out of range\n");
1727 if (!(boards[arg].flags & SX_BOARD_PRESENT))
11af7478 1728 break;
15b611f6 1729 sx_dprintk(SX_DEBUG_FIRMWARE, ".. and present!\n");
1da177e4 1730 board = &boards[arg];
11af7478
AC
1731 rc = 0;
1732 /* FIXME: And this does ... nothing?? */
1da177e4
LT
1733 break;
1734 case SXIO_GET_TYPE:
15b611f6
JS
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;
11af7478 1746 sx_dprintk(SX_DEBUG_FIRMWARE, "returning type= %ld\n", rc);
1da177e4
LT
1747 break;
1748 case SXIO_DO_RAMTEST:
15b611f6 1749 if (sx_initialized) /* Already initialized: better not ramtest the board. */
1da177e4 1750 return -EPERM;
15b611f6
JS
1751 if (IS_SX_BOARD(board)) {
1752 rc = do_memtest(board, 0, 0x7000);
1753 if (!rc)
1754 rc = do_memtest(board, 0, 0x7000);
1755 /*if (!rc) rc = do_memtest_w (board, 0, 0x7000); */
1da177e4 1756 } else {
15b611f6 1757 rc = do_memtest(board, 0, 0x7ff8);
1da177e4
LT
1758 /* if (!rc) rc = do_memtest_w (board, 0, 0x7ff8); */
1759 }
11af7478
AC
1760 sx_dprintk(SX_DEBUG_FIRMWARE,
1761 "returning memtest result= %ld\n", rc);
1da177e4
LT
1762 break;
1763 case SXIO_DOWNLOAD:
11af7478
AC
1764 if (sx_initialized) {/* Already initialized */
1765 rc = -EEXIST;
1766 break;
1767 }
1768 if (!sx_reset(board)) {
1769 rc = -EIO;
1770 break;
1771 }
15b611f6
JS
1772 sx_dprintk(SX_DEBUG_INIT, "reset the board...\n");
1773
1774 tmp = kmalloc(SX_CHUNK_SIZE, GFP_USER);
11af7478
AC
1775 if (!tmp) {
1776 rc = -ENOMEM;
1777 break;
1778 }
1779 /* FIXME: check returns */
15b611f6
JS
1780 get_user(nbytes, descr++);
1781 get_user(offset, descr++);
1782 get_user(data, descr++);
1da177e4 1783 while (nbytes && data) {
15b611f6
JS
1784 for (i = 0; i < nbytes; i += SX_CHUNK_SIZE) {
1785 if (copy_from_user(tmp, (char __user *)data + i,
1786 (i + SX_CHUNK_SIZE > nbytes) ?
1787 nbytes - i : SX_CHUNK_SIZE)) {
1788 kfree(tmp);
11af7478
AC
1789 rc = -EFAULT;
1790 break;
1da177e4 1791 }
15b611f6
JS
1792 memcpy_toio(board->base2 + offset + i, tmp,
1793 (i + SX_CHUNK_SIZE > nbytes) ?
1794 nbytes - i : SX_CHUNK_SIZE);
1da177e4
LT
1795 }
1796
15b611f6
JS
1797 get_user(nbytes, descr++);
1798 get_user(offset, descr++);
1799 get_user(data, descr++);
1da177e4 1800 }
15b611f6
JS
1801 kfree(tmp);
1802 sx_nports += sx_init_board(board);
1da177e4
LT
1803 rc = sx_nports;
1804 break;
1805 case SXIO_INIT:
11af7478
AC
1806 if (sx_initialized) { /* Already initialized */
1807 rc = -EEXIST;
1808 break;
1809 }
1da177e4 1810 /* This is not allowed until all boards are initialized... */
15b611f6
JS
1811 for (i = 0; i < SX_NBOARDS; i++) {
1812 if ((boards[i].flags & SX_BOARD_PRESENT) &&
11af7478
AC
1813 !(boards[i].flags & SX_BOARD_INITIALIZED)) {
1814 rc = -EIO;
1815 break;
1816 }
1da177e4 1817 }
15b611f6
JS
1818 for (i = 0; i < SX_NBOARDS; i++)
1819 if (!(boards[i].flags & SX_BOARD_PRESENT))
1820 break;
1821
1822 sx_dprintk(SX_DEBUG_FIRMWARE, "initing portstructs, %d boards, "
1823 "%d channels, first board: %d ports\n",
1824 i, sx_nports, boards[0].nports);
1825 rc = sx_init_portstructs(i, sx_nports);
1826 sx_init_drivers();
1827 if (rc >= 0)
1da177e4
LT
1828 sx_initialized++;
1829 break;
1830 case SXIO_SETDEBUG:
1831 sx_debug = arg;
1832 break;
1833 case SXIO_GETDEBUG:
1834 rc = sx_debug;
1835 break;
1836 case SXIO_GETGSDEBUG:
1837 case SXIO_SETGSDEBUG:
1838 rc = -EINVAL;
1839 break;
1840 case SXIO_GETNPORTS:
1841 rc = sx_nports;
1842 break;
1843 default:
11af7478 1844 rc = -ENOTTY;
1da177e4
LT
1845 break;
1846 }
11af7478 1847 unlock_kernel();
15b611f6 1848 func_exit();
1da177e4
LT
1849 return rc;
1850}
1851
9e98966c 1852static int sx_break(struct tty_struct *tty, int flag)
1da177e4
LT
1853{
1854 struct sx_port *port = tty->driver_data;
1855 int rv;
1856
15b611f6 1857 func_enter();
341339e7 1858 lock_kernel();
1da177e4 1859
15b611f6
JS
1860 if (flag)
1861 rv = sx_send_command(port, HS_START, -1, HS_IDLE_BREAK);
1862 else
1863 rv = sx_send_command(port, HS_STOP, -1, HS_IDLE_OPEN);
1864 if (rv != 1)
1865 printk(KERN_ERR "sx: couldn't send break (%x).\n",
1866 read_sx_byte(port->board, CHAN_OFFSET(port, hi_hstat)));
341339e7 1867 unlock_kernel();
15b611f6 1868 func_exit();
9e98966c 1869 return 0;
1da177e4
LT
1870}
1871
1da177e4
LT
1872static int sx_tiocmget(struct tty_struct *tty, struct file *file)
1873{
1874 struct sx_port *port = tty->driver_data;
1875 return sx_getsignals(port);
1876}
1877
1878static int sx_tiocmset(struct tty_struct *tty, struct file *file,
15b611f6 1879 unsigned int set, unsigned int clear)
1da177e4
LT
1880{
1881 struct sx_port *port = tty->driver_data;
1882 int rts = -1, dtr = -1;
1883
1884 if (set & TIOCM_RTS)
1885 rts = 1;
1886 if (set & TIOCM_DTR)
1887 dtr = 1;
1888 if (clear & TIOCM_RTS)
1889 rts = 0;
1890 if (clear & TIOCM_DTR)
1891 dtr = 0;
1892
1893 sx_setsignals(port, dtr, rts);
1894 sx_reconfigure_port(port);
1895 return 0;
1896}
1897
15b611f6
JS
1898static int sx_ioctl(struct tty_struct *tty, struct file *filp,
1899 unsigned int cmd, unsigned long arg)
1da177e4
LT
1900{
1901 int rc;
1902 struct sx_port *port = tty->driver_data;
1903 void __user *argp = (void __user *)arg;
1da177e4
LT
1904
1905 /* func_enter2(); */
1906
1907 rc = 0;
341339e7 1908 lock_kernel();
1da177e4 1909 switch (cmd) {
1da177e4
LT
1910 case TIOCGSERIAL:
1911 rc = gs_getserial(&port->gs, argp);
1912 break;
1913 case TIOCSSERIAL:
1914 rc = gs_setserial(&port->gs, argp);
1915 break;
1916 default:
1917 rc = -ENOIOCTLCMD;
1918 break;
1919 }
341339e7 1920 unlock_kernel();
1da177e4
LT
1921
1922 /* func_exit(); */
1923 return rc;
1924}
1925
1da177e4
LT
1926/* The throttle/unthrottle scheme for the Specialix card is different
1927 * from other drivers and deserves some explanation.
1928 * The Specialix hardware takes care of XON/XOFF
1929 * and CTS/RTS flow control itself. This means that all we have to
1930 * do when signalled by the upper tty layer to throttle/unthrottle is
1931 * to make a note of it here. When we come to read characters from the
1932 * rx buffers on the card (sx_receive_chars()) we look to see if the
1933 * upper layer can accept more (as noted here in sx_rx_throt[]).
1934 * If it can't we simply don't remove chars from the cards buffer.
1935 * When the tty layer can accept chars, we again note that here and when
1936 * sx_receive_chars() is called it will remove them from the cards buffer.
1937 * The card will notice that a ports buffer has drained below some low
1938 * water mark and will unflow control the line itself, using whatever
1939 * flow control scheme is in use for that port. -- Simon Allen
1940 */
1941
15b611f6 1942static void sx_throttle(struct tty_struct *tty)
1da177e4 1943{
c9f19e96 1944 struct sx_port *port = tty->driver_data;
1da177e4
LT
1945
1946 func_enter2();
1947 /* If the port is using any type of input flow
1948 * control then throttle the port.
1949 */
15b611f6 1950 if ((tty->termios->c_cflag & CRTSCTS) || (I_IXOFF(tty))) {
b5391e29 1951 port->gs.port.flags |= SX_RX_THROTTLE;
1da177e4
LT
1952 }
1953 func_exit();
1954}
1955
15b611f6 1956static void sx_unthrottle(struct tty_struct *tty)
1da177e4 1957{
c9f19e96 1958 struct sx_port *port = tty->driver_data;
1da177e4
LT
1959
1960 func_enter2();
1961 /* Always unthrottle even if flow control is not enabled on
1962 * this port in case we disabled flow control while the port
1963 * was throttled
1964 */
b5391e29 1965 port->gs.port.flags &= ~SX_RX_THROTTLE;
1da177e4
LT
1966 func_exit();
1967 return;
1968}
1969
1da177e4
LT
1970/* ********************************************************************** *
1971 * Here are the initialization routines. *
1972 * ********************************************************************** */
1973
15b611f6 1974static int sx_init_board(struct sx_board *board)
1da177e4
LT
1975{
1976 int addr;
1977 int chans;
1978 int type;
1979
1980 func_enter();
1981
1982 /* This is preceded by downloading the download code. */
1983
1984 board->flags |= SX_BOARD_INITIALIZED;
1985
15b611f6 1986 if (read_sx_byte(board, 0))
1da177e4 1987 /* CF boards may need this. */
15b611f6 1988 write_sx_byte(board, 0, 0);
1da177e4
LT
1989
1990 /* This resets the processor again, to make sure it didn't do any
1991 foolish things while we were downloading the image */
15b611f6 1992 if (!sx_reset(board))
1da177e4
LT
1993 return 0;
1994
15b611f6
JS
1995 sx_start_board(board);
1996 udelay(10);
1997 if (!sx_busy_wait_neq(board, 0, 0xff, 0)) {
1998 printk(KERN_ERR "sx: Ooops. Board won't initialize.\n");
1da177e4
LT
1999 return 0;
2000 }
2001
2002 /* Ok. So now the processor on the card is running. It gathered
2003 some info for us... */
15b611f6
JS
2004 sx_dprintk(SX_DEBUG_INIT, "The sxcard structure:\n");
2005 if (sx_debug & SX_DEBUG_INIT)
2006 my_hd_io(board->base, 0x10);
2007 sx_dprintk(SX_DEBUG_INIT, "the first sx_module structure:\n");
2008 if (sx_debug & SX_DEBUG_INIT)
2009 my_hd_io(board->base + 0x80, 0x30);
2010
2011 sx_dprintk(SX_DEBUG_INIT, "init_status: %x, %dk memory, firmware "
2012 "V%x.%02x,\n",
2013 read_sx_byte(board, 0), read_sx_byte(board, 1),
2014 read_sx_byte(board, 5), read_sx_byte(board, 4));
2015
2016 if (read_sx_byte(board, 0) == 0xff) {
2017 printk(KERN_INFO "sx: No modules found. Sorry.\n");
1da177e4
LT
2018 board->nports = 0;
2019 return 0;
2020 }
2021
2022 chans = 0;
2023
2024 if (IS_SX_BOARD(board)) {
15b611f6 2025 sx_write_board_word(board, cc_int_count, sx_maxints);
1da177e4
LT
2026 } else {
2027 if (sx_maxints)
15b611f6
JS
2028 sx_write_board_word(board, cc_int_count,
2029 SI_PROCESSOR_CLOCK / 8 / sx_maxints);
1da177e4
LT
2030 }
2031
2032 /* grab the first module type... */
15b611f6
JS
2033 /* board->ta_type = mod_compat_type (read_sx_byte (board, 0x80 + 0x08)); */
2034 board->ta_type = mod_compat_type(sx_read_module_byte(board, 0x80,
2035 mc_chip));
1da177e4
LT
2036
2037 /* XXX byteorder */
15b611f6
JS
2038 for (addr = 0x80; addr != 0; addr = read_sx_word(board, addr) & 0x7fff){
2039 type = sx_read_module_byte(board, addr, mc_chip);
2040 sx_dprintk(SX_DEBUG_INIT, "Module at %x: %d channels\n",
2041 addr, read_sx_byte(board, addr + 2));
2042
2043 chans += sx_read_module_byte(board, addr, mc_type);
2044
2045 sx_dprintk(SX_DEBUG_INIT, "module is an %s, which has %s/%s "
2046 "panels\n",
2047 mod_type_s(type),
2048 pan_type_s(sx_read_module_byte(board, addr,
2049 mc_mods) & 0xf),
2050 pan_type_s(sx_read_module_byte(board, addr,
2051 mc_mods) >> 4));
2052
2053 sx_dprintk(SX_DEBUG_INIT, "CD1400 versions: %x/%x, ASIC "
2054 "version: %x\n",
2055 sx_read_module_byte(board, addr, mc_rev1),
2056 sx_read_module_byte(board, addr, mc_rev2),
2057 sx_read_module_byte(board, addr, mc_mtaasic_rev));
1da177e4
LT
2058
2059 /* The following combinations are illegal: It should theoretically
2060 work, but timing problems make the bus HANG. */
2061
15b611f6
JS
2062 if (mod_compat_type(type) != board->ta_type) {
2063 printk(KERN_ERR "sx: This is an invalid "
2064 "configuration.\nDon't mix TA/MTA/SXDC on the "
2065 "same hostadapter.\n");
2066 chans = 0;
1da177e4
LT
2067 break;
2068 }
15b611f6
JS
2069 if ((IS_EISA_BOARD(board) ||
2070 IS_SI_BOARD(board)) &&
2071 (mod_compat_type(type) == 4)) {
2072 printk(KERN_ERR "sx: This is an invalid "
2073 "configuration.\nDon't use SXDCs on an SI/XIO "
2074 "adapter.\n");
2075 chans = 0;
1da177e4
LT
2076 break;
2077 }
15b611f6 2078#if 0 /* Problem fixed: firmware 3.05 */
1da177e4
LT
2079 if (IS_SX_BOARD(board) && (type == TA8)) {
2080 /* There are some issues with the firmware and the DCD/RTS
2081 lines. It might work if you tie them together or something.
15b611f6 2082 It might also work if you get a newer sx_firmware. Therefore
1da177e4 2083 this is just a warning. */
15b611f6
JS
2084 printk(KERN_WARNING
2085 "sx: The SX host doesn't work too well "
2086 "with the TA8 adapters.\nSpecialix is working on it.\n");
1da177e4
LT
2087 }
2088#endif
2089 }
2090
2091 if (chans) {
15b611f6 2092 if (board->irq > 0) {
1da177e4 2093 /* fixed irq, probably PCI */
15b611f6
JS
2094 if (sx_irqmask & (1 << board->irq)) { /* may we use this irq? */
2095 if (request_irq(board->irq, sx_interrupt,
2096 IRQF_SHARED | IRQF_DISABLED,
2097 "sx", board)) {
2098 printk(KERN_ERR "sx: Cannot allocate "
2099 "irq %d.\n", board->irq);
1da177e4
LT
2100 board->irq = 0;
2101 }
2102 } else
2103 board->irq = 0;
15b611f6 2104 } else if (board->irq < 0 && sx_irqmask) {
1da177e4
LT
2105 /* auto-allocate irq */
2106 int irqnr;
15b611f6
JS
2107 int irqmask = sx_irqmask & (IS_SX_BOARD(board) ?
2108 SX_ISA_IRQ_MASK : SI2_ISA_IRQ_MASK);
2109 for (irqnr = 15; irqnr > 0; irqnr--)
2110 if (irqmask & (1 << irqnr))
2111 if (!request_irq(irqnr, sx_interrupt,
2112 IRQF_SHARED | IRQF_DISABLED,
2113 "sx", board))
1da177e4 2114 break;
15b611f6 2115 if (!irqnr)
1da177e4
LT
2116 printk(KERN_ERR "sx: Cannot allocate IRQ.\n");
2117 board->irq = irqnr;
2118 } else
2119 board->irq = 0;
2120
2121 if (board->irq) {
2122 /* Found a valid interrupt, start up interrupts! */
15b611f6
JS
2123 sx_dprintk(SX_DEBUG_INIT, "Using irq %d.\n",
2124 board->irq);
2125 sx_start_interrupts(board);
1da177e4
LT
2126 board->poll = sx_slowpoll;
2127 board->flags |= SX_IRQ_ALLOCATED;
2128 } else {
2129 /* no irq: setup board for polled operation */
2130 board->poll = sx_poll;
15b611f6
JS
2131 sx_dprintk(SX_DEBUG_INIT, "Using poll-interval %d.\n",
2132 board->poll);
1da177e4
LT
2133 }
2134
15b611f6
JS
2135 /* The timer should be initialized anyway: That way we can
2136 safely del_timer it when the module is unloaded. */
c9594643 2137 setup_timer(&board->timer, sx_pollfunc, (unsigned long)board);
1da177e4 2138
c9594643
JS
2139 if (board->poll)
2140 mod_timer(&board->timer, jiffies + board->poll);
1da177e4
LT
2141 } else {
2142 board->irq = 0;
2143 }
2144
2145 board->nports = chans;
15b611f6 2146 sx_dprintk(SX_DEBUG_INIT, "returning %d ports.", board->nports);
1da177e4
LT
2147
2148 func_exit();
2149 return chans;
2150}
2151
cda5265e 2152static void __devinit printheader(void)
1da177e4
LT
2153{
2154 static int header_printed;
2155
2156 if (!header_printed) {
15b611f6
JS
2157 printk(KERN_INFO "Specialix SX driver "
2158 "(C) 1998/1999 R.E.Wolff@BitWizard.nl\n");
2159 printk(KERN_INFO "sx: version " __stringify(SX_VERSION) "\n");
1da177e4
LT
2160 header_printed = 1;
2161 }
2162}
2163
15b611f6 2164static int __devinit probe_sx(struct sx_board *board)
1da177e4
LT
2165{
2166 struct vpd_prom vpdp;
2167 char *p;
2168 int i;
2169
2170 func_enter();
2171
15b611f6
JS
2172 if (!IS_CF_BOARD(board)) {
2173 sx_dprintk(SX_DEBUG_PROBE, "Going to verify vpd prom at %p.\n",
2174 board->base + SX_VPD_ROM);
1da177e4
LT
2175
2176 if (sx_debug & SX_DEBUG_PROBE)
2177 my_hd_io(board->base + SX_VPD_ROM, 0x40);
2178
15b611f6
JS
2179 p = (char *)&vpdp;
2180 for (i = 0; i < sizeof(struct vpd_prom); i++)
2181 *p++ = read_sx_byte(board, SX_VPD_ROM + i * 2);
1da177e4
LT
2182
2183 if (sx_debug & SX_DEBUG_PROBE)
15b611f6 2184 my_hd(&vpdp, 0x20);
1da177e4 2185
15b611f6 2186 sx_dprintk(SX_DEBUG_PROBE, "checking identifier...\n");
1da177e4 2187
15b611f6
JS
2188 if (strncmp(vpdp.identifier, SX_VPD_IDENT_STRING, 16) != 0) {
2189 sx_dprintk(SX_DEBUG_PROBE, "Got non-SX identifier: "
2190 "'%s'\n", vpdp.identifier);
1da177e4
LT
2191 return 0;
2192 }
2193 }
2194
15b611f6 2195 printheader();
1da177e4 2196
15b611f6
JS
2197 if (!IS_CF_BOARD(board)) {
2198 printk(KERN_DEBUG "sx: Found an SX board at %lx\n",
2199 board->hw_base);
2200 printk(KERN_DEBUG "sx: hw_rev: %d, assembly level: %d, "
2201 "uniq ID:%08x, ",
2202 vpdp.hwrev, vpdp.hwass, vpdp.uniqid);
2203 printk("Manufactured: %d/%d\n", 1970 + vpdp.myear, vpdp.mweek);
1da177e4 2204
15b611f6
JS
2205 if ((((vpdp.uniqid >> 24) & SX_UNIQUEID_MASK) !=
2206 SX_PCI_UNIQUEID1) && (((vpdp.uniqid >> 24) &
2207 SX_UNIQUEID_MASK) != SX_ISA_UNIQUEID1)) {
2208 /* This might be a bit harsh. This was the primary
2209 reason the SX/ISA card didn't work at first... */
2210 printk(KERN_ERR "sx: Hmm. Not an SX/PCI or SX/ISA "
2211 "card. Sorry: giving up.\n");
1da177e4
LT
2212 return (0);
2213 }
2214
15b611f6
JS
2215 if (((vpdp.uniqid >> 24) & SX_UNIQUEID_MASK) ==
2216 SX_ISA_UNIQUEID1) {
1da177e4 2217 if (((unsigned long)board->hw_base) & 0x8000) {
15b611f6
JS
2218 printk(KERN_WARNING "sx: Warning: There may be "
2219 "hardware problems with the card at "
2220 "%lx.\n", board->hw_base);
2221 printk(KERN_WARNING "sx: Read sx.txt for more "
2222 "info.\n");
1da177e4
LT
2223 }
2224 }
2225 }
2226
2227 board->nports = -1;
2228
2229 /* This resets the processor, and keeps it off the bus. */
15b611f6 2230 if (!sx_reset(board))
1da177e4 2231 return 0;
15b611f6 2232 sx_dprintk(SX_DEBUG_INIT, "reset the board...\n");
1da177e4 2233
1da177e4
LT
2234 func_exit();
2235 return 1;
2236}
2237
927a6f9d 2238#if defined(CONFIG_ISA) || defined(CONFIG_EISA)
1da177e4
LT
2239
2240/* Specialix probes for this card at 32k increments from 640k to 16M.
2241 I consider machines with less than 16M unlikely nowadays, so I'm
2242 not probing above 1Mb. Also, 0xa0000, 0xb0000, are taken by the VGA
2243 card. 0xe0000 and 0xf0000 are taken by the BIOS. That only leaves
2244 0xc0000, 0xc8000, 0xd0000 and 0xd8000 . */
2245
15b611f6 2246static int __devinit probe_si(struct sx_board *board)
1da177e4
LT
2247{
2248 int i;
2249
2250 func_enter();
15b611f6
JS
2251 sx_dprintk(SX_DEBUG_PROBE, "Going to verify SI signature hw %lx at "
2252 "%p.\n", board->hw_base, board->base + SI2_ISA_ID_BASE);
1da177e4
LT
2253
2254 if (sx_debug & SX_DEBUG_PROBE)
2255 my_hd_io(board->base + SI2_ISA_ID_BASE, 0x8);
2256
2257 if (!IS_EISA_BOARD(board)) {
15b611f6
JS
2258 if (IS_SI1_BOARD(board)) {
2259 for (i = 0; i < 8; i++) {
2260 write_sx_byte(board, SI2_ISA_ID_BASE + 7 - i,i);
2261 }
1da177e4 2262 }
15b611f6
JS
2263 for (i = 0; i < 8; i++) {
2264 if ((read_sx_byte(board, SI2_ISA_ID_BASE + 7 - i) & 7)
2265 != i) {
2266 func_exit();
1da177e4
LT
2267 return 0;
2268 }
2269 }
2270 }
2271
2272 /* Now we're pretty much convinced that there is an SI board here,
2273 but to prevent trouble, we'd better double check that we don't
2274 have an SI1 board when we're probing for an SI2 board.... */
2275
15b611f6
JS
2276 write_sx_byte(board, SI2_ISA_ID_BASE, 0x10);
2277 if (IS_SI1_BOARD(board)) {
1da177e4
LT
2278 /* This should be an SI1 board, which has this
2279 location writable... */
15b611f6
JS
2280 if (read_sx_byte(board, SI2_ISA_ID_BASE) != 0x10) {
2281 func_exit();
2282 return 0;
04a3d311 2283 }
1da177e4
LT
2284 } else {
2285 /* This should be an SI2 board, which has the bottom
2286 3 bits non-writable... */
15b611f6
JS
2287 if (read_sx_byte(board, SI2_ISA_ID_BASE) == 0x10) {
2288 func_exit();
2289 return 0;
04a3d311 2290 }
1da177e4
LT
2291 }
2292
2293 /* Now we're pretty much convinced that there is an SI board here,
2294 but to prevent trouble, we'd better double check that we don't
2295 have an SI1 board when we're probing for an SI2 board.... */
2296
15b611f6
JS
2297 write_sx_byte(board, SI2_ISA_ID_BASE, 0x10);
2298 if (IS_SI1_BOARD(board)) {
1da177e4
LT
2299 /* This should be an SI1 board, which has this
2300 location writable... */
15b611f6 2301 if (read_sx_byte(board, SI2_ISA_ID_BASE) != 0x10) {
1da177e4 2302 func_exit();
15b611f6 2303 return 0;
04a3d311 2304 }
1da177e4
LT
2305 } else {
2306 /* This should be an SI2 board, which has the bottom
2307 3 bits non-writable... */
15b611f6
JS
2308 if (read_sx_byte(board, SI2_ISA_ID_BASE) == 0x10) {
2309 func_exit();
2310 return 0;
04a3d311 2311 }
1da177e4
LT
2312 }
2313
15b611f6 2314 printheader();
1da177e4 2315
15b611f6 2316 printk(KERN_DEBUG "sx: Found an SI board at %lx\n", board->hw_base);
1da177e4 2317 /* Compared to the SX boards, it is a complete guess as to what
15b611f6 2318 this card is up to... */
1da177e4
LT
2319
2320 board->nports = -1;
2321
2322 /* This resets the processor, and keeps it off the bus. */
15b611f6 2323 if (!sx_reset(board))
1da177e4 2324 return 0;
15b611f6 2325 sx_dprintk(SX_DEBUG_INIT, "reset the board...\n");
1da177e4 2326
1da177e4
LT
2327 func_exit();
2328 return 1;
2329}
927a6f9d 2330#endif
1da177e4 2331
b68e31d0 2332static const struct tty_operations sx_ops = {
1da177e4 2333 .break_ctl = sx_break,
15b611f6 2334 .open = sx_open,
1da177e4
LT
2335 .close = gs_close,
2336 .write = gs_write,
2337 .put_char = gs_put_char,
2338 .flush_chars = gs_flush_chars,
2339 .write_room = gs_write_room,
2340 .chars_in_buffer = gs_chars_in_buffer,
2341 .flush_buffer = gs_flush_buffer,
2342 .ioctl = sx_ioctl,
2343 .throttle = sx_throttle,
2344 .unthrottle = sx_unthrottle,
2345 .set_termios = gs_set_termios,
2346 .stop = gs_stop,
2347 .start = gs_start,
2348 .hangup = gs_hangup,
2349 .tiocmget = sx_tiocmget,
2350 .tiocmset = sx_tiocmset,
2351};
2352
31f35939
AC
2353static const struct tty_port_operations sx_port_ops = {
2354 .carrier_raised = sx_carrier_raised,
2355};
2356
1da177e4
LT
2357static int sx_init_drivers(void)
2358{
2359 int error;
2360
2361 func_enter();
2362
2363 sx_driver = alloc_tty_driver(sx_nports);
2364 if (!sx_driver)
2365 return 1;
2366 sx_driver->owner = THIS_MODULE;
2367 sx_driver->driver_name = "specialix_sx";
2368 sx_driver->name = "ttyX";
2369 sx_driver->major = SX_NORMAL_MAJOR;
2370 sx_driver->type = TTY_DRIVER_TYPE_SERIAL;
2371 sx_driver->subtype = SERIAL_TYPE_NORMAL;
2372 sx_driver->init_termios = tty_std_termios;
15b611f6 2373 sx_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
606d099c
AC
2374 sx_driver->init_termios.c_ispeed = 9600;
2375 sx_driver->init_termios.c_ospeed = 9600;
1da177e4
LT
2376 sx_driver->flags = TTY_DRIVER_REAL_RAW;
2377 tty_set_operations(sx_driver, &sx_ops);
2378
2379 if ((error = tty_register_driver(sx_driver))) {
2380 put_tty_driver(sx_driver);
2381 printk(KERN_ERR "sx: Couldn't register sx driver, error = %d\n",
15b611f6 2382 error);
1da177e4
LT
2383 return 1;
2384 }
2385 func_exit();
2386 return 0;
2387}
2388
15b611f6 2389static int sx_init_portstructs(int nboards, int nports)
1da177e4
LT
2390{
2391 struct sx_board *board;
2392 struct sx_port *port;
2393 int i, j;
2394 int addr, chans;
2395 int portno;
2396
2397 func_enter();
2398
2399 /* Many drivers statically allocate the maximum number of ports
15b611f6
JS
2400 There is no reason not to allocate them dynamically.
2401 Is there? -- REW */
4a7cb69b 2402 sx_ports = kcalloc(nports, sizeof(struct sx_port), GFP_KERNEL);
1da177e4
LT
2403 if (!sx_ports)
2404 return -ENOMEM;
2405
2406 port = sx_ports;
2407 for (i = 0; i < nboards; i++) {
2408 board = &boards[i];
2409 board->ports = port;
15b611f6
JS
2410 for (j = 0; j < boards[i].nports; j++) {
2411 sx_dprintk(SX_DEBUG_INIT, "initing port %d\n", j);
44b7d1b3 2412 tty_port_init(&port->gs.port);
31f35939 2413 port->gs.port.ops = &sx_port_ops;
1da177e4 2414 port->gs.magic = SX_MAGIC;
15b611f6 2415 port->gs.close_delay = HZ / 2;
1da177e4
LT
2416 port->gs.closing_wait = 30 * HZ;
2417 port->board = board;
2418 port->gs.rd = &sx_real_driver;
2419#ifdef NEW_WRITE_LOCKING
81861d78 2420 port->gs.port_write_mutex = MUTEX;
1da177e4 2421#endif
34af946a 2422 spin_lock_init(&port->gs.driver_lock);
1da177e4
LT
2423 /*
2424 * Initializing wait queue
2425 */
1da177e4
LT
2426 port++;
2427 }
2428 }
2429
2430 port = sx_ports;
2431 portno = 0;
2432 for (i = 0; i < nboards; i++) {
2433 board = &boards[i];
2434 board->port_base = portno;
2435 /* Possibly the configuration was rejected. */
15b611f6
JS
2436 sx_dprintk(SX_DEBUG_PROBE, "Board has %d channels\n",
2437 board->nports);
2438 if (board->nports <= 0)
2439 continue;
1da177e4 2440 /* XXX byteorder ?? */
15b611f6
JS
2441 for (addr = 0x80; addr != 0;
2442 addr = read_sx_word(board, addr) & 0x7fff) {
2443 chans = sx_read_module_byte(board, addr, mc_type);
2444 sx_dprintk(SX_DEBUG_PROBE, "Module at %x: %d "
2445 "channels\n", addr, chans);
2446 sx_dprintk(SX_DEBUG_PROBE, "Port at");
2447 for (j = 0; j < chans; j++) {
2448 /* The "sx-way" is the way it SHOULD be done.
2449 That way in the future, the firmware may for
2450 example pack the structures a bit more
2451 efficient. Neil tells me it isn't going to
2452 happen anytime soon though. */
1da177e4 2453 if (IS_SX_BOARD(board))
15b611f6
JS
2454 port->ch_base = sx_read_module_word(
2455 board, addr + j * 2,
2456 mc_chan_pointer);
1da177e4 2457 else
15b611f6 2458 port->ch_base = addr + 0x100 + 0x300 *j;
1da177e4 2459
15b611f6
JS
2460 sx_dprintk(SX_DEBUG_PROBE, " %x",
2461 port->ch_base);
1da177e4
LT
2462 port->line = portno++;
2463 port++;
2464 }
15b611f6 2465 sx_dprintk(SX_DEBUG_PROBE, "\n");
1da177e4
LT
2466 }
2467 /* This has to be done earlier. */
2468 /* board->flags |= SX_BOARD_INITIALIZED; */
2469 }
2470
2471 func_exit();
2472 return 0;
2473}
2474
18f813ee
JS
2475static unsigned int sx_find_free_board(void)
2476{
2477 unsigned int i;
2478
15b611f6 2479 for (i = 0; i < SX_NBOARDS; i++)
18f813ee
JS
2480 if (!(boards[i].flags & SX_BOARD_PRESENT))
2481 break;
2482
2483 return i;
2484}
2485
1da177e4
LT
2486static void __exit sx_release_drivers(void)
2487{
2488 func_enter();
2489 tty_unregister_driver(sx_driver);
2490 put_tty_driver(sx_driver);
2491 func_exit();
2492}
2493
39103494
JS
2494static void __devexit sx_remove_card(struct sx_board *board,
2495 struct pci_dev *pdev)
18f813ee
JS
2496{
2497 if (board->flags & SX_BOARD_INITIALIZED) {
2498 /* The board should stop messing with us. (actually I mean the
2499 interrupt) */
2500 sx_reset(board);
2501 if ((board->irq) && (board->flags & SX_IRQ_ALLOCATED))
2502 free_irq(board->irq, board);
2503
2504 /* It is safe/allowed to del_timer a non-active timer */
2505 del_timer(&board->timer);
30f4218f 2506 if (pdev) {
3468a33e 2507#ifdef CONFIG_PCI
da1cfe1a 2508 iounmap(board->base2);
30f4218f 2509 pci_release_region(pdev, IS_CF_BOARD(board) ? 3 : 2);
3468a33e 2510#endif
30f4218f 2511 } else {
39103494 2512 iounmap(board->base);
30f4218f
JS
2513 release_region(board->hw_base, board->hw_len);
2514 }
18f813ee 2515
15b611f6 2516 board->flags &= ~(SX_BOARD_INITIALIZED | SX_BOARD_PRESENT);
18f813ee
JS
2517 }
2518}
2519
2520#ifdef CONFIG_EISA
2521
2522static int __devinit sx_eisa_probe(struct device *dev)
2523{
2524 struct eisa_device *edev = to_eisa_device(dev);
2525 struct sx_board *board;
2526 unsigned long eisa_slot = edev->base_addr;
2527 unsigned int i;
2528 int retval = -EIO;
2529
42f6384f 2530 mutex_lock(&sx_boards_lock);
18f813ee 2531 i = sx_find_free_board();
42f6384f
JS
2532 if (i == SX_NBOARDS) {
2533 mutex_unlock(&sx_boards_lock);
18f813ee 2534 goto err;
42f6384f
JS
2535 }
2536 board = &boards[i];
2537 board->flags |= SX_BOARD_PRESENT;
2538 mutex_unlock(&sx_boards_lock);
18f813ee
JS
2539
2540 dev_info(dev, "XIO : Signature found in EISA slot %lu, "
15b611f6
JS
2541 "Product %d Rev %d (REPORT THIS TO LKLM)\n",
2542 eisa_slot >> 12,
2543 inb(eisa_slot + EISA_VENDOR_ID_OFFSET + 2),
2544 inb(eisa_slot + EISA_VENDOR_ID_OFFSET + 3));
18f813ee 2545
18f813ee
JS
2546 board->eisa_base = eisa_slot;
2547 board->flags &= ~SX_BOARD_TYPE;
2548 board->flags |= SI_EISA_BOARD;
2549
2550 board->hw_base = ((inb(eisa_slot + 0xc01) << 8) +
15b611f6 2551 inb(eisa_slot + 0xc00)) << 16;
30f4218f
JS
2552 board->hw_len = SI2_EISA_WINDOW_LEN;
2553 if (!request_region(board->hw_base, board->hw_len, "sx")) {
2554 dev_err(dev, "can't request region\n");
2555 goto err_flag;
2556 }
18f813ee 2557 board->base2 =
24cb2335 2558 board->base = ioremap_nocache(board->hw_base, SI2_EISA_WINDOW_LEN);
30f4218f
JS
2559 if (!board->base) {
2560 dev_err(dev, "can't remap memory\n");
2561 goto err_reg;
2562 }
18f813ee
JS
2563
2564 sx_dprintk(SX_DEBUG_PROBE, "IO hw_base address: %lx\n", board->hw_base);
2565 sx_dprintk(SX_DEBUG_PROBE, "base: %p\n", board->base);
2566 board->irq = inb(eisa_slot + 0xc02) >> 4;
2567 sx_dprintk(SX_DEBUG_PROBE, "IRQ: %d\n", board->irq);
2568
2569 if (!probe_si(board))
2570 goto err_unmap;
2571
2572 dev_set_drvdata(dev, board);
2573
2574 return 0;
2575err_unmap:
2576 iounmap(board->base);
30f4218f
JS
2577err_reg:
2578 release_region(board->hw_base, board->hw_len);
2579err_flag:
42f6384f 2580 board->flags &= ~SX_BOARD_PRESENT;
18f813ee
JS
2581err:
2582 return retval;
2583}
2584
2585static int __devexit sx_eisa_remove(struct device *dev)
2586{
2587 struct sx_board *board = dev_get_drvdata(dev);
2588
39103494 2589 sx_remove_card(board, NULL);
18f813ee
JS
2590
2591 return 0;
2592}
2593
2594static struct eisa_device_id sx_eisa_tbl[] = {
2595 { "SLX" },
2596 { "" }
2597};
15b611f6 2598
18f813ee
JS
2599MODULE_DEVICE_TABLE(eisa, sx_eisa_tbl);
2600
2601static struct eisa_driver sx_eisadriver = {
2602 .id_table = sx_eisa_tbl,
2603 .driver = {
2604 .name = "sx",
2605 .probe = sx_eisa_probe,
2606 .remove = __devexit_p(sx_eisa_remove),
2607 }
2608};
2609
2610#endif
2611
3468a33e 2612#ifdef CONFIG_PCI
1da177e4
LT
2613 /********************************************************
2614 * Setting bit 17 in the CNTRL register of the PLX 9050 *
2615 * chip forces a retry on writes while a read is pending.*
2616 * This is to prevent the card locking up on Intel Xeon *
2617 * multiprocessor systems with the NX chipset. -- NV *
2618 ********************************************************/
2619
2620/* Newer cards are produced with this bit set from the configuration
2621 EEprom. As the bit is read/write for the CPU, we can fix it here,
2622 if we detect that it isn't set correctly. -- REW */
2623
cda5265e 2624static void __devinit fix_sx_pci(struct pci_dev *pdev, struct sx_board *board)
1da177e4
LT
2625{
2626 unsigned int hwbase;
2627 void __iomem *rebase;
2628 unsigned int t;
2629
15b611f6
JS
2630#define CNTRL_REG_OFFSET 0x50
2631#define CNTRL_REG_GOODVALUE 0x18260000
1da177e4
LT
2632
2633 pci_read_config_dword(pdev, PCI_BASE_ADDRESS_0, &hwbase);
2634 hwbase &= PCI_BASE_ADDRESS_MEM_MASK;
24cb2335 2635 rebase = ioremap_nocache(hwbase, 0x80);
15b611f6 2636 t = readl(rebase + CNTRL_REG_OFFSET);
1da177e4 2637 if (t != CNTRL_REG_GOODVALUE) {
15b611f6
JS
2638 printk(KERN_DEBUG "sx: performing cntrl reg fix: %08x -> "
2639 "%08x\n", t, CNTRL_REG_GOODVALUE);
2640 writel(CNTRL_REG_GOODVALUE, rebase + CNTRL_REG_OFFSET);
1da177e4
LT
2641 }
2642 iounmap(rebase);
2643}
3468a33e 2644#endif
1da177e4 2645
5572e103 2646static int __devinit sx_pci_probe(struct pci_dev *pdev,
15b611f6 2647 const struct pci_device_id *ent)
5572e103 2648{
3468a33e 2649#ifdef CONFIG_PCI
5572e103 2650 struct sx_board *board;
39103494 2651 unsigned int i, reg;
5572e103
JS
2652 int retval = -EIO;
2653
42f6384f 2654 mutex_lock(&sx_boards_lock);
18f813ee 2655 i = sx_find_free_board();
42f6384f
JS
2656 if (i == SX_NBOARDS) {
2657 mutex_unlock(&sx_boards_lock);
5572e103 2658 goto err;
42f6384f
JS
2659 }
2660 board = &boards[i];
2661 board->flags |= SX_BOARD_PRESENT;
2662 mutex_unlock(&sx_boards_lock);
5572e103
JS
2663
2664 retval = pci_enable_device(pdev);
2665 if (retval)
42f6384f 2666 goto err_flag;
5572e103
JS
2667
2668 board->flags &= ~SX_BOARD_TYPE;
2669 board->flags |= (pdev->subsystem_vendor == 0x200) ? SX_PCI_BOARD :
15b611f6 2670 SX_CFPCI_BOARD;
5572e103
JS
2671
2672 /* CF boards use base address 3.... */
39103494 2673 reg = IS_CF_BOARD(board) ? 3 : 2;
30f4218f
JS
2674 retval = pci_request_region(pdev, reg, "sx");
2675 if (retval) {
2676 dev_err(&pdev->dev, "can't request region\n");
2677 goto err_flag;
2678 }
39103494 2679 board->hw_base = pci_resource_start(pdev, reg);
5572e103 2680 board->base2 =
da1cfe1a 2681 board->base = ioremap_nocache(board->hw_base, WINDOW_LEN(board));
5572e103
JS
2682 if (!board->base) {
2683 dev_err(&pdev->dev, "ioremap failed\n");
30f4218f 2684 goto err_reg;
5572e103
JS
2685 }
2686
2687 /* Most of the stuff on the CF board is offset by 0x18000 .... */
15b611f6 2688 if (IS_CF_BOARD(board))
5572e103
JS
2689 board->base += 0x18000;
2690
2691 board->irq = pdev->irq;
2692
2693 dev_info(&pdev->dev, "Got a specialix card: %p(%d) %x.\n", board->base,
15b611f6 2694 board->irq, board->flags);
5572e103
JS
2695
2696 if (!probe_sx(board)) {
2697 retval = -EIO;
2698 goto err_unmap;
2699 }
2700
2701 fix_sx_pci(pdev, board);
2702
2703 pci_set_drvdata(pdev, board);
2704
2705 return 0;
2706err_unmap:
da1cfe1a 2707 iounmap(board->base2);
30f4218f
JS
2708err_reg:
2709 pci_release_region(pdev, reg);
42f6384f
JS
2710err_flag:
2711 board->flags &= ~SX_BOARD_PRESENT;
5572e103
JS
2712err:
2713 return retval;
3468a33e
JS
2714#else
2715 return -ENODEV;
2716#endif
5572e103
JS
2717}
2718
2719static void __devexit sx_pci_remove(struct pci_dev *pdev)
2720{
2721 struct sx_board *board = pci_get_drvdata(pdev);
2722
39103494 2723 sx_remove_card(board, pdev);
5572e103
JS
2724}
2725
2726/* Specialix has a whole bunch of cards with 0x2000 as the device ID. They say
2727 its because the standard requires it. So check for SUBVENDOR_ID. */
2728static struct pci_device_id sx_pci_tbl[] = {
2729 { PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8,
c14d444b 2730 .subvendor = PCI_ANY_ID, .subdevice = 0x0200 },
5572e103 2731 { PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8,
c14d444b 2732 .subvendor = PCI_ANY_ID, .subdevice = 0x0300 },
5572e103
JS
2733 { 0 }
2734};
15b611f6 2735
5572e103
JS
2736MODULE_DEVICE_TABLE(pci, sx_pci_tbl);
2737
2738static struct pci_driver sx_pcidriver = {
2739 .name = "sx",
2740 .id_table = sx_pci_tbl,
2741 .probe = sx_pci_probe,
2742 .remove = __devexit_p(sx_pci_remove)
2743};
1da177e4 2744
15b611f6 2745static int __init sx_init(void)
1da177e4 2746{
18f813ee
JS
2747#ifdef CONFIG_EISA
2748 int retval1;
2749#endif
927a6f9d 2750#ifdef CONFIG_ISA
1da177e4 2751 struct sx_board *board;
927a6f9d
JS
2752 unsigned int i;
2753#endif
2754 unsigned int found = 0;
2755 int retval;
1da177e4 2756
1da177e4 2757 func_enter();
15b611f6
JS
2758 sx_dprintk(SX_DEBUG_INIT, "Initing sx module... (sx_debug=%d)\n",
2759 sx_debug);
2760 if (abs((long)(&sx_debug) - sx_debug) < 0x10000) {
2761 printk(KERN_WARNING "sx: sx_debug is an address, instead of a "
2762 "value. Assuming -1.\n(%p)\n", &sx_debug);
2763 sx_debug = -1;
1da177e4
LT
2764 }
2765
2766 if (misc_register(&sx_fw_device) < 0) {
15b611f6
JS
2767 printk(KERN_ERR "SX: Unable to register firmware loader "
2768 "driver.\n");
1da177e4
LT
2769 return -EIO;
2770 }
927a6f9d 2771#ifdef CONFIG_ISA
15b611f6 2772 for (i = 0; i < NR_SX_ADDRS; i++) {
1da177e4
LT
2773 board = &boards[found];
2774 board->hw_base = sx_probe_addrs[i];
30f4218f
JS
2775 board->hw_len = SX_WINDOW_LEN;
2776 if (!request_region(board->hw_base, board->hw_len, "sx"))
2777 continue;
1da177e4 2778 board->base2 =
24cb2335 2779 board->base = ioremap_nocache(board->hw_base, board->hw_len);
30f4218f
JS
2780 if (!board->base)
2781 goto err_sx_reg;
1da177e4 2782 board->flags &= ~SX_BOARD_TYPE;
15b611f6
JS
2783 board->flags |= SX_ISA_BOARD;
2784 board->irq = sx_irqmask ? -1 : 0;
1da177e4 2785
15b611f6 2786 if (probe_sx(board)) {
42f6384f 2787 board->flags |= SX_BOARD_PRESENT;
1da177e4
LT
2788 found++;
2789 } else {
2790 iounmap(board->base);
30f4218f
JS
2791err_sx_reg:
2792 release_region(board->hw_base, board->hw_len);
1da177e4
LT
2793 }
2794 }
2795
15b611f6 2796 for (i = 0; i < NR_SI_ADDRS; i++) {
1da177e4
LT
2797 board = &boards[found];
2798 board->hw_base = si_probe_addrs[i];
30f4218f
JS
2799 board->hw_len = SI2_ISA_WINDOW_LEN;
2800 if (!request_region(board->hw_base, board->hw_len, "sx"))
2801 continue;
1da177e4 2802 board->base2 =
24cb2335 2803 board->base = ioremap_nocache(board->hw_base, board->hw_len);
30f4218f
JS
2804 if (!board->base)
2805 goto err_si_reg;
1da177e4 2806 board->flags &= ~SX_BOARD_TYPE;
15b611f6
JS
2807 board->flags |= SI_ISA_BOARD;
2808 board->irq = sx_irqmask ? -1 : 0;
1da177e4 2809
15b611f6 2810 if (probe_si(board)) {
42f6384f 2811 board->flags |= SX_BOARD_PRESENT;
1da177e4
LT
2812 found++;
2813 } else {
15b611f6 2814 iounmap(board->base);
30f4218f
JS
2815err_si_reg:
2816 release_region(board->hw_base, board->hw_len);
1da177e4
LT
2817 }
2818 }
15b611f6 2819 for (i = 0; i < NR_SI1_ADDRS; i++) {
1da177e4
LT
2820 board = &boards[found];
2821 board->hw_base = si1_probe_addrs[i];
30f4218f
JS
2822 board->hw_len = SI1_ISA_WINDOW_LEN;
2823 if (!request_region(board->hw_base, board->hw_len, "sx"))
2824 continue;
1da177e4 2825 board->base2 =
24cb2335 2826 board->base = ioremap_nocache(board->hw_base, board->hw_len);
30f4218f
JS
2827 if (!board->base)
2828 goto err_si1_reg;
1da177e4 2829 board->flags &= ~SX_BOARD_TYPE;
15b611f6
JS
2830 board->flags |= SI1_ISA_BOARD;
2831 board->irq = sx_irqmask ? -1 : 0;
1da177e4 2832
15b611f6 2833 if (probe_si(board)) {
42f6384f 2834 board->flags |= SX_BOARD_PRESENT;
1da177e4
LT
2835 found++;
2836 } else {
15b611f6 2837 iounmap(board->base);
30f4218f
JS
2838err_si1_reg:
2839 release_region(board->hw_base, board->hw_len);
1da177e4
LT
2840 }
2841 }
927a6f9d 2842#endif
18f813ee
JS
2843#ifdef CONFIG_EISA
2844 retval1 = eisa_driver_register(&sx_eisadriver);
2845#endif
5572e103
JS
2846 retval = pci_register_driver(&sx_pcidriver);
2847
1da177e4 2848 if (found) {
15b611f6 2849 printk(KERN_INFO "sx: total of %d boards detected.\n", found);
5572e103
JS
2850 retval = 0;
2851 } else if (retval) {
18f813ee 2852#ifdef CONFIG_EISA
7eb9976f 2853 retval = retval1;
18f813ee
JS
2854 if (retval1)
2855#endif
15b611f6 2856 misc_deregister(&sx_fw_device);
1da177e4
LT
2857 }
2858
2859 func_exit();
5572e103 2860 return retval;
1da177e4
LT
2861}
2862
15b611f6 2863static void __exit sx_exit(void)
1da177e4 2864{
15b611f6 2865 int i;
1da177e4
LT
2866
2867 func_enter();
18f813ee
JS
2868#ifdef CONFIG_EISA
2869 eisa_driver_unregister(&sx_eisadriver);
2870#endif
5572e103 2871 pci_unregister_driver(&sx_pcidriver);
1da177e4 2872
55e7071a 2873 for (i = 0; i < SX_NBOARDS; i++)
39103494 2874 sx_remove_card(&boards[i], NULL);
55e7071a 2875
1da177e4 2876 if (misc_deregister(&sx_fw_device) < 0) {
15b611f6
JS
2877 printk(KERN_INFO "sx: couldn't deregister firmware loader "
2878 "device\n");
1da177e4 2879 }
15b611f6
JS
2880 sx_dprintk(SX_DEBUG_CLEANUP, "Cleaning up drivers (%d)\n",
2881 sx_initialized);
1da177e4 2882 if (sx_initialized)
15b611f6 2883 sx_release_drivers();
1da177e4 2884
15b611f6 2885 kfree(sx_ports);
1da177e4
LT
2886 func_exit();
2887}
2888
2889module_init(sx_init);
2890module_exit(sx_exit);