~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to drivers/char/sx.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

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