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

« back to all changes in this revision

Viewing changes to drivers/staging/tty/istallion.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
/*****************************************************************************/
 
2
 
 
3
/*
 
4
 *      istallion.c  -- stallion intelligent multiport serial driver.
 
5
 *
 
6
 *      Copyright (C) 1996-1999  Stallion Technologies
 
7
 *      Copyright (C) 1994-1996  Greg Ungerer.
 
8
 *
 
9
 *      This code is loosely based on the Linux serial driver, written by
 
10
 *      Linus Torvalds, Theodore T'so and others.
 
11
 *
 
12
 *      This program is free software; you can redistribute it and/or modify
 
13
 *      it under the terms of the GNU General Public License as published by
 
14
 *      the Free Software Foundation; either version 2 of the License, or
 
15
 *      (at your option) any later version.
 
16
 *
 
17
 */
 
18
 
 
19
/*****************************************************************************/
 
20
 
 
21
#include <linux/module.h>
 
22
#include <linux/sched.h>
 
23
#include <linux/slab.h>
 
24
#include <linux/interrupt.h>
 
25
#include <linux/tty.h>
 
26
#include <linux/tty_flip.h>
 
27
#include <linux/serial.h>
 
28
#include <linux/seq_file.h>
 
29
#include <linux/cdk.h>
 
30
#include <linux/comstats.h>
 
31
#include <linux/istallion.h>
 
32
#include <linux/ioport.h>
 
33
#include <linux/delay.h>
 
34
#include <linux/init.h>
 
35
#include <linux/device.h>
 
36
#include <linux/wait.h>
 
37
#include <linux/eisa.h>
 
38
#include <linux/ctype.h>
 
39
 
 
40
#include <asm/io.h>
 
41
#include <asm/uaccess.h>
 
42
 
 
43
#include <linux/pci.h>
 
44
 
 
45
/*****************************************************************************/
 
46
 
 
47
/*
 
48
 *      Define different board types. Not all of the following board types
 
49
 *      are supported by this driver. But I will use the standard "assigned"
 
50
 *      board numbers. Currently supported boards are abbreviated as:
 
51
 *      ECP = EasyConnection 8/64, ONB = ONboard, BBY = Brumby and
 
52
 *      STAL = Stallion.
 
53
 */
 
54
#define BRD_UNKNOWN     0
 
55
#define BRD_STALLION    1
 
56
#define BRD_BRUMBY4     2
 
57
#define BRD_ONBOARD2    3
 
58
#define BRD_ONBOARD     4
 
59
#define BRD_ONBOARDE    7
 
60
#define BRD_ECP         23
 
61
#define BRD_ECPE        24
 
62
#define BRD_ECPMC       25
 
63
#define BRD_ECPPCI      29
 
64
 
 
65
#define BRD_BRUMBY      BRD_BRUMBY4
 
66
 
 
67
/*
 
68
 *      Define a configuration structure to hold the board configuration.
 
69
 *      Need to set this up in the code (for now) with the boards that are
 
70
 *      to be configured into the system. This is what needs to be modified
 
71
 *      when adding/removing/modifying boards. Each line entry in the
 
72
 *      stli_brdconf[] array is a board. Each line contains io/irq/memory
 
73
 *      ranges for that board (as well as what type of board it is).
 
74
 *      Some examples:
 
75
 *              { BRD_ECP, 0x2a0, 0, 0xcc000, 0, 0 },
 
76
 *      This line will configure an EasyConnection 8/64 at io address 2a0,
 
77
 *      and shared memory address of cc000. Multiple EasyConnection 8/64
 
78
 *      boards can share the same shared memory address space. No interrupt
 
79
 *      is required for this board type.
 
80
 *      Another example:
 
81
 *              { BRD_ECPE, 0x5000, 0, 0x80000000, 0, 0 },
 
82
 *      This line will configure an EasyConnection 8/64 EISA in slot 5 and
 
83
 *      shared memory address of 0x80000000 (2 GByte). Multiple
 
84
 *      EasyConnection 8/64 EISA boards can share the same shared memory
 
85
 *      address space. No interrupt is required for this board type.
 
86
 *      Another example:
 
87
 *              { BRD_ONBOARD, 0x240, 0, 0xd0000, 0, 0 },
 
88
 *      This line will configure an ONboard (ISA type) at io address 240,
 
89
 *      and shared memory address of d0000. Multiple ONboards can share
 
90
 *      the same shared memory address space. No interrupt required.
 
91
 *      Another example:
 
92
 *              { BRD_BRUMBY4, 0x360, 0, 0xc8000, 0, 0 },
 
93
 *      This line will configure a Brumby board (any number of ports!) at
 
94
 *      io address 360 and shared memory address of c8000. All Brumby boards
 
95
 *      configured into a system must have their own separate io and memory
 
96
 *      addresses. No interrupt is required.
 
97
 *      Another example:
 
98
 *              { BRD_STALLION, 0x330, 0, 0xd0000, 0, 0 },
 
99
 *      This line will configure an original Stallion board at io address 330
 
100
 *      and shared memory address d0000 (this would only be valid for a "V4.0"
 
101
 *      or Rev.O Stallion board). All Stallion boards configured into the
 
102
 *      system must have their own separate io and memory addresses. No
 
103
 *      interrupt is required.
 
104
 */
 
105
 
 
106
struct stlconf {
 
107
        int             brdtype;
 
108
        int             ioaddr1;
 
109
        int             ioaddr2;
 
110
        unsigned long   memaddr;
 
111
        int             irq;
 
112
        int             irqtype;
 
113
};
 
114
 
 
115
static unsigned int stli_nrbrds;
 
116
 
 
117
/* stli_lock must NOT be taken holding brd_lock */
 
118
static spinlock_t stli_lock;    /* TTY logic lock */
 
119
static spinlock_t brd_lock;     /* Board logic lock */
 
120
 
 
121
/*
 
122
 *      There is some experimental EISA board detection code in this driver.
 
123
 *      By default it is disabled, but for those that want to try it out,
 
124
 *      then set the define below to be 1.
 
125
 */
 
126
#define STLI_EISAPROBE  0
 
127
 
 
128
/*****************************************************************************/
 
129
 
 
130
/*
 
131
 *      Define some important driver characteristics. Device major numbers
 
132
 *      allocated as per Linux Device Registry.
 
133
 */
 
134
#ifndef STL_SIOMEMMAJOR
 
135
#define STL_SIOMEMMAJOR         28
 
136
#endif
 
137
#ifndef STL_SERIALMAJOR
 
138
#define STL_SERIALMAJOR         24
 
139
#endif
 
140
#ifndef STL_CALLOUTMAJOR
 
141
#define STL_CALLOUTMAJOR        25
 
142
#endif
 
143
 
 
144
/*****************************************************************************/
 
145
 
 
146
/*
 
147
 *      Define our local driver identity first. Set up stuff to deal with
 
148
 *      all the local structures required by a serial tty driver.
 
149
 */
 
150
static char     *stli_drvtitle = "Stallion Intelligent Multiport Serial Driver";
 
151
static char     *stli_drvname = "istallion";
 
152
static char     *stli_drvversion = "5.6.0";
 
153
static char     *stli_serialname = "ttyE";
 
154
 
 
155
static struct tty_driver        *stli_serial;
 
156
static const struct tty_port_operations stli_port_ops;
 
157
 
 
158
#define STLI_TXBUFSIZE          4096
 
159
 
 
160
/*
 
161
 *      Use a fast local buffer for cooked characters. Typically a whole
 
162
 *      bunch of cooked characters come in for a port, 1 at a time. So we
 
163
 *      save those up into a local buffer, then write out the whole lot
 
164
 *      with a large memcpy. Just use 1 buffer for all ports, since its
 
165
 *      use it is only need for short periods of time by each port.
 
166
 */
 
167
static char                     *stli_txcookbuf;
 
168
static int                      stli_txcooksize;
 
169
static int                      stli_txcookrealsize;
 
170
static struct tty_struct        *stli_txcooktty;
 
171
 
 
172
/*
 
173
 *      Define a local default termios struct. All ports will be created
 
174
 *      with this termios initially. Basically all it defines is a raw port
 
175
 *      at 9600 baud, 8 data bits, no parity, 1 stop bit.
 
176
 */
 
177
static struct ktermios          stli_deftermios = {
 
178
        .c_cflag        = (B9600 | CS8 | CREAD | HUPCL | CLOCAL),
 
179
        .c_cc           = INIT_C_CC,
 
180
        .c_ispeed       = 9600,
 
181
        .c_ospeed       = 9600,
 
182
};
 
183
 
 
184
/*
 
185
 *      Define global stats structures. Not used often, and can be
 
186
 *      re-used for each stats call.
 
187
 */
 
188
static comstats_t       stli_comstats;
 
189
static struct asystats  stli_cdkstats;
 
190
 
 
191
/*****************************************************************************/
 
192
 
 
193
static DEFINE_MUTEX(stli_brdslock);
 
194
static struct stlibrd   *stli_brds[STL_MAXBRDS];
 
195
 
 
196
static int              stli_shared;
 
197
 
 
198
/*
 
199
 *      Per board state flags. Used with the state field of the board struct.
 
200
 *      Not really much here... All we need to do is keep track of whether
 
201
 *      the board has been detected, and whether it is actually running a slave
 
202
 *      or not.
 
203
 */
 
204
#define BST_FOUND       0
 
205
#define BST_STARTED     1
 
206
#define BST_PROBED      2
 
207
 
 
208
/*
 
209
 *      Define the set of port state flags. These are marked for internal
 
210
 *      state purposes only, usually to do with the state of communications
 
211
 *      with the slave. Most of them need to be updated atomically, so always
 
212
 *      use the bit setting operations (unless protected by cli/sti).
 
213
 */
 
214
#define ST_OPENING      2
 
215
#define ST_CLOSING      3
 
216
#define ST_CMDING       4
 
217
#define ST_TXBUSY       5
 
218
#define ST_RXING        6
 
219
#define ST_DOFLUSHRX    7
 
220
#define ST_DOFLUSHTX    8
 
221
#define ST_DOSIGS       9
 
222
#define ST_RXSTOP       10
 
223
#define ST_GETSIGS      11
 
224
 
 
225
/*
 
226
 *      Define an array of board names as printable strings. Handy for
 
227
 *      referencing boards when printing trace and stuff.
 
228
 */
 
229
static char     *stli_brdnames[] = {
 
230
        "Unknown",
 
231
        "Stallion",
 
232
        "Brumby",
 
233
        "ONboard-MC",
 
234
        "ONboard",
 
235
        "Brumby",
 
236
        "Brumby",
 
237
        "ONboard-EI",
 
238
        NULL,
 
239
        "ONboard",
 
240
        "ONboard-MC",
 
241
        "ONboard-MC",
 
242
        NULL,
 
243
        NULL,
 
244
        NULL,
 
245
        NULL,
 
246
        NULL,
 
247
        NULL,
 
248
        NULL,
 
249
        NULL,
 
250
        "EasyIO",
 
251
        "EC8/32-AT",
 
252
        "EC8/32-MC",
 
253
        "EC8/64-AT",
 
254
        "EC8/64-EI",
 
255
        "EC8/64-MC",
 
256
        "EC8/32-PCI",
 
257
        "EC8/64-PCI",
 
258
        "EasyIO-PCI",
 
259
        "EC/RA-PCI",
 
260
};
 
261
 
 
262
/*****************************************************************************/
 
263
 
 
264
/*
 
265
 *      Define some string labels for arguments passed from the module
 
266
 *      load line. These allow for easy board definitions, and easy
 
267
 *      modification of the io, memory and irq resoucres.
 
268
 */
 
269
 
 
270
static char     *board0[8];
 
271
static char     *board1[8];
 
272
static char     *board2[8];
 
273
static char     *board3[8];
 
274
 
 
275
static char     **stli_brdsp[] = {
 
276
        (char **) &board0,
 
277
        (char **) &board1,
 
278
        (char **) &board2,
 
279
        (char **) &board3
 
280
};
 
281
 
 
282
/*
 
283
 *      Define a set of common board names, and types. This is used to
 
284
 *      parse any module arguments.
 
285
 */
 
286
 
 
287
static struct stlibrdtype {
 
288
        char    *name;
 
289
        int     type;
 
290
} stli_brdstr[] = {
 
291
        { "stallion", BRD_STALLION },
 
292
        { "1", BRD_STALLION },
 
293
        { "brumby", BRD_BRUMBY },
 
294
        { "brumby4", BRD_BRUMBY },
 
295
        { "brumby/4", BRD_BRUMBY },
 
296
        { "brumby-4", BRD_BRUMBY },
 
297
        { "brumby8", BRD_BRUMBY },
 
298
        { "brumby/8", BRD_BRUMBY },
 
299
        { "brumby-8", BRD_BRUMBY },
 
300
        { "brumby16", BRD_BRUMBY },
 
301
        { "brumby/16", BRD_BRUMBY },
 
302
        { "brumby-16", BRD_BRUMBY },
 
303
        { "2", BRD_BRUMBY },
 
304
        { "onboard2", BRD_ONBOARD2 },
 
305
        { "onboard-2", BRD_ONBOARD2 },
 
306
        { "onboard/2", BRD_ONBOARD2 },
 
307
        { "onboard-mc", BRD_ONBOARD2 },
 
308
        { "onboard/mc", BRD_ONBOARD2 },
 
309
        { "onboard-mca", BRD_ONBOARD2 },
 
310
        { "onboard/mca", BRD_ONBOARD2 },
 
311
        { "3", BRD_ONBOARD2 },
 
312
        { "onboard", BRD_ONBOARD },
 
313
        { "onboardat", BRD_ONBOARD },
 
314
        { "4", BRD_ONBOARD },
 
315
        { "onboarde", BRD_ONBOARDE },
 
316
        { "onboard-e", BRD_ONBOARDE },
 
317
        { "onboard/e", BRD_ONBOARDE },
 
318
        { "onboard-ei", BRD_ONBOARDE },
 
319
        { "onboard/ei", BRD_ONBOARDE },
 
320
        { "7", BRD_ONBOARDE },
 
321
        { "ecp", BRD_ECP },
 
322
        { "ecpat", BRD_ECP },
 
323
        { "ec8/64", BRD_ECP },
 
324
        { "ec8/64-at", BRD_ECP },
 
325
        { "ec8/64-isa", BRD_ECP },
 
326
        { "23", BRD_ECP },
 
327
        { "ecpe", BRD_ECPE },
 
328
        { "ecpei", BRD_ECPE },
 
329
        { "ec8/64-e", BRD_ECPE },
 
330
        { "ec8/64-ei", BRD_ECPE },
 
331
        { "24", BRD_ECPE },
 
332
        { "ecpmc", BRD_ECPMC },
 
333
        { "ec8/64-mc", BRD_ECPMC },
 
334
        { "ec8/64-mca", BRD_ECPMC },
 
335
        { "25", BRD_ECPMC },
 
336
        { "ecppci", BRD_ECPPCI },
 
337
        { "ec/ra", BRD_ECPPCI },
 
338
        { "ec/ra-pc", BRD_ECPPCI },
 
339
        { "ec/ra-pci", BRD_ECPPCI },
 
340
        { "29", BRD_ECPPCI },
 
341
};
 
342
 
 
343
/*
 
344
 *      Define the module agruments.
 
345
 */
 
346
MODULE_AUTHOR("Greg Ungerer");
 
347
MODULE_DESCRIPTION("Stallion Intelligent Multiport Serial Driver");
 
348
MODULE_LICENSE("GPL");
 
349
 
 
350
 
 
351
module_param_array(board0, charp, NULL, 0);
 
352
MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,memaddr]");
 
353
module_param_array(board1, charp, NULL, 0);
 
354
MODULE_PARM_DESC(board1, "Board 1 config -> name[,ioaddr[,memaddr]");
 
355
module_param_array(board2, charp, NULL, 0);
 
356
MODULE_PARM_DESC(board2, "Board 2 config -> name[,ioaddr[,memaddr]");
 
357
module_param_array(board3, charp, NULL, 0);
 
358
MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,memaddr]");
 
359
 
 
360
#if STLI_EISAPROBE != 0
 
361
/*
 
362
 *      Set up a default memory address table for EISA board probing.
 
363
 *      The default addresses are all bellow 1Mbyte, which has to be the
 
364
 *      case anyway. They should be safe, since we only read values from
 
365
 *      them, and interrupts are disabled while we do it. If the higher
 
366
 *      memory support is compiled in then we also try probing around
 
367
 *      the 1Gb, 2Gb and 3Gb areas as well...
 
368
 */
 
369
static unsigned long    stli_eisamemprobeaddrs[] = {
 
370
        0xc0000,    0xd0000,    0xe0000,    0xf0000,
 
371
        0x80000000, 0x80010000, 0x80020000, 0x80030000,
 
372
        0x40000000, 0x40010000, 0x40020000, 0x40030000,
 
373
        0xc0000000, 0xc0010000, 0xc0020000, 0xc0030000,
 
374
        0xff000000, 0xff010000, 0xff020000, 0xff030000,
 
375
};
 
376
 
 
377
static int      stli_eisamempsize = ARRAY_SIZE(stli_eisamemprobeaddrs);
 
378
#endif
 
379
 
 
380
/*
 
381
 *      Define the Stallion PCI vendor and device IDs.
 
382
 */
 
383
#ifndef PCI_DEVICE_ID_ECRA
 
384
#define PCI_DEVICE_ID_ECRA              0x0004
 
385
#endif
 
386
 
 
387
static struct pci_device_id istallion_pci_tbl[] = {
 
388
        { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECRA), },
 
389
        { 0 }
 
390
};
 
391
MODULE_DEVICE_TABLE(pci, istallion_pci_tbl);
 
392
 
 
393
static struct pci_driver stli_pcidriver;
 
394
 
 
395
/*****************************************************************************/
 
396
 
 
397
/*
 
398
 *      Hardware configuration info for ECP boards. These defines apply
 
399
 *      to the directly accessible io ports of the ECP. There is a set of
 
400
 *      defines for each ECP board type, ISA, EISA, MCA and PCI.
 
401
 */
 
402
#define ECP_IOSIZE      4
 
403
 
 
404
#define ECP_MEMSIZE     (128 * 1024)
 
405
#define ECP_PCIMEMSIZE  (256 * 1024)
 
406
 
 
407
#define ECP_ATPAGESIZE  (4 * 1024)
 
408
#define ECP_MCPAGESIZE  (4 * 1024)
 
409
#define ECP_EIPAGESIZE  (64 * 1024)
 
410
#define ECP_PCIPAGESIZE (64 * 1024)
 
411
 
 
412
#define STL_EISAID      0x8c4e
 
413
 
 
414
/*
 
415
 *      Important defines for the ISA class of ECP board.
 
416
 */
 
417
#define ECP_ATIREG      0
 
418
#define ECP_ATCONFR     1
 
419
#define ECP_ATMEMAR     2
 
420
#define ECP_ATMEMPR     3
 
421
#define ECP_ATSTOP      0x1
 
422
#define ECP_ATINTENAB   0x10
 
423
#define ECP_ATENABLE    0x20
 
424
#define ECP_ATDISABLE   0x00
 
425
#define ECP_ATADDRMASK  0x3f000
 
426
#define ECP_ATADDRSHFT  12
 
427
 
 
428
/*
 
429
 *      Important defines for the EISA class of ECP board.
 
430
 */
 
431
#define ECP_EIIREG      0
 
432
#define ECP_EIMEMARL    1
 
433
#define ECP_EICONFR     2
 
434
#define ECP_EIMEMARH    3
 
435
#define ECP_EIENABLE    0x1
 
436
#define ECP_EIDISABLE   0x0
 
437
#define ECP_EISTOP      0x4
 
438
#define ECP_EIEDGE      0x00
 
439
#define ECP_EILEVEL     0x80
 
440
#define ECP_EIADDRMASKL 0x00ff0000
 
441
#define ECP_EIADDRSHFTL 16
 
442
#define ECP_EIADDRMASKH 0xff000000
 
443
#define ECP_EIADDRSHFTH 24
 
444
#define ECP_EIBRDENAB   0xc84
 
445
 
 
446
#define ECP_EISAID      0x4
 
447
 
 
448
/*
 
449
 *      Important defines for the Micro-channel class of ECP board.
 
450
 *      (It has a lot in common with the ISA boards.)
 
451
 */
 
452
#define ECP_MCIREG      0
 
453
#define ECP_MCCONFR     1
 
454
#define ECP_MCSTOP      0x20
 
455
#define ECP_MCENABLE    0x80
 
456
#define ECP_MCDISABLE   0x00
 
457
 
 
458
/*
 
459
 *      Important defines for the PCI class of ECP board.
 
460
 *      (It has a lot in common with the other ECP boards.)
 
461
 */
 
462
#define ECP_PCIIREG     0
 
463
#define ECP_PCICONFR    1
 
464
#define ECP_PCISTOP     0x01
 
465
 
 
466
/*
 
467
 *      Hardware configuration info for ONboard and Brumby boards. These
 
468
 *      defines apply to the directly accessible io ports of these boards.
 
469
 */
 
470
#define ONB_IOSIZE      16
 
471
#define ONB_MEMSIZE     (64 * 1024)
 
472
#define ONB_ATPAGESIZE  (64 * 1024)
 
473
#define ONB_MCPAGESIZE  (64 * 1024)
 
474
#define ONB_EIMEMSIZE   (128 * 1024)
 
475
#define ONB_EIPAGESIZE  (64 * 1024)
 
476
 
 
477
/*
 
478
 *      Important defines for the ISA class of ONboard board.
 
479
 */
 
480
#define ONB_ATIREG      0
 
481
#define ONB_ATMEMAR     1
 
482
#define ONB_ATCONFR     2
 
483
#define ONB_ATSTOP      0x4
 
484
#define ONB_ATENABLE    0x01
 
485
#define ONB_ATDISABLE   0x00
 
486
#define ONB_ATADDRMASK  0xff0000
 
487
#define ONB_ATADDRSHFT  16
 
488
 
 
489
#define ONB_MEMENABLO   0
 
490
#define ONB_MEMENABHI   0x02
 
491
 
 
492
/*
 
493
 *      Important defines for the EISA class of ONboard board.
 
494
 */
 
495
#define ONB_EIIREG      0
 
496
#define ONB_EIMEMARL    1
 
497
#define ONB_EICONFR     2
 
498
#define ONB_EIMEMARH    3
 
499
#define ONB_EIENABLE    0x1
 
500
#define ONB_EIDISABLE   0x0
 
501
#define ONB_EISTOP      0x4
 
502
#define ONB_EIEDGE      0x00
 
503
#define ONB_EILEVEL     0x80
 
504
#define ONB_EIADDRMASKL 0x00ff0000
 
505
#define ONB_EIADDRSHFTL 16
 
506
#define ONB_EIADDRMASKH 0xff000000
 
507
#define ONB_EIADDRSHFTH 24
 
508
#define ONB_EIBRDENAB   0xc84
 
509
 
 
510
#define ONB_EISAID      0x1
 
511
 
 
512
/*
 
513
 *      Important defines for the Brumby boards. They are pretty simple,
 
514
 *      there is not much that is programmably configurable.
 
515
 */
 
516
#define BBY_IOSIZE      16
 
517
#define BBY_MEMSIZE     (64 * 1024)
 
518
#define BBY_PAGESIZE    (16 * 1024)
 
519
 
 
520
#define BBY_ATIREG      0
 
521
#define BBY_ATCONFR     1
 
522
#define BBY_ATSTOP      0x4
 
523
 
 
524
/*
 
525
 *      Important defines for the Stallion boards. They are pretty simple,
 
526
 *      there is not much that is programmably configurable.
 
527
 */
 
528
#define STAL_IOSIZE     16
 
529
#define STAL_MEMSIZE    (64 * 1024)
 
530
#define STAL_PAGESIZE   (64 * 1024)
 
531
 
 
532
/*
 
533
 *      Define the set of status register values for EasyConnection panels.
 
534
 *      The signature will return with the status value for each panel. From
 
535
 *      this we can determine what is attached to the board - before we have
 
536
 *      actually down loaded any code to it.
 
537
 */
 
538
#define ECH_PNLSTATUS   2
 
539
#define ECH_PNL16PORT   0x20
 
540
#define ECH_PNLIDMASK   0x07
 
541
#define ECH_PNLXPID     0x40
 
542
#define ECH_PNLINTRPEND 0x80
 
543
 
 
544
/*
 
545
 *      Define some macros to do things to the board. Even those these boards
 
546
 *      are somewhat related there is often significantly different ways of
 
547
 *      doing some operation on it (like enable, paging, reset, etc). So each
 
548
 *      board class has a set of functions which do the commonly required
 
549
 *      operations. The macros below basically just call these functions,
 
550
 *      generally checking for a NULL function - which means that the board
 
551
 *      needs nothing done to it to achieve this operation!
 
552
 */
 
553
#define EBRDINIT(brdp)                                          \
 
554
        if (brdp->init != NULL)                                 \
 
555
                (* brdp->init)(brdp)
 
556
 
 
557
#define EBRDENABLE(brdp)                                        \
 
558
        if (brdp->enable != NULL)                               \
 
559
                (* brdp->enable)(brdp);
 
560
 
 
561
#define EBRDDISABLE(brdp)                                       \
 
562
        if (brdp->disable != NULL)                              \
 
563
                (* brdp->disable)(brdp);
 
564
 
 
565
#define EBRDINTR(brdp)                                          \
 
566
        if (brdp->intr != NULL)                                 \
 
567
                (* brdp->intr)(brdp);
 
568
 
 
569
#define EBRDRESET(brdp)                                         \
 
570
        if (brdp->reset != NULL)                                \
 
571
                (* brdp->reset)(brdp);
 
572
 
 
573
#define EBRDGETMEMPTR(brdp,offset)                              \
 
574
        (* brdp->getmemptr)(brdp, offset, __LINE__)
 
575
 
 
576
/*
 
577
 *      Define the maximal baud rate, and the default baud base for ports.
 
578
 */
 
579
#define STL_MAXBAUD     460800
 
580
#define STL_BAUDBASE    115200
 
581
#define STL_CLOSEDELAY  (5 * HZ / 10)
 
582
 
 
583
/*****************************************************************************/
 
584
 
 
585
/*
 
586
 *      Define macros to extract a brd or port number from a minor number.
 
587
 */
 
588
#define MINOR2BRD(min)          (((min) & 0xc0) >> 6)
 
589
#define MINOR2PORT(min)         ((min) & 0x3f)
 
590
 
 
591
/*****************************************************************************/
 
592
 
 
593
/*
 
594
 *      Prototype all functions in this driver!
 
595
 */
 
596
 
 
597
static int      stli_parsebrd(struct stlconf *confp, char **argp);
 
598
static int      stli_open(struct tty_struct *tty, struct file *filp);
 
599
static void     stli_close(struct tty_struct *tty, struct file *filp);
 
600
static int      stli_write(struct tty_struct *tty, const unsigned char *buf, int count);
 
601
static int      stli_putchar(struct tty_struct *tty, unsigned char ch);
 
602
static void     stli_flushchars(struct tty_struct *tty);
 
603
static int      stli_writeroom(struct tty_struct *tty);
 
604
static int      stli_charsinbuffer(struct tty_struct *tty);
 
605
static int      stli_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg);
 
606
static void     stli_settermios(struct tty_struct *tty, struct ktermios *old);
 
607
static void     stli_throttle(struct tty_struct *tty);
 
608
static void     stli_unthrottle(struct tty_struct *tty);
 
609
static void     stli_stop(struct tty_struct *tty);
 
610
static void     stli_start(struct tty_struct *tty);
 
611
static void     stli_flushbuffer(struct tty_struct *tty);
 
612
static int      stli_breakctl(struct tty_struct *tty, int state);
 
613
static void     stli_waituntilsent(struct tty_struct *tty, int timeout);
 
614
static void     stli_sendxchar(struct tty_struct *tty, char ch);
 
615
static void     stli_hangup(struct tty_struct *tty);
 
616
 
 
617
static int      stli_brdinit(struct stlibrd *brdp);
 
618
static int      stli_startbrd(struct stlibrd *brdp);
 
619
static ssize_t  stli_memread(struct file *fp, char __user *buf, size_t count, loff_t *offp);
 
620
static ssize_t  stli_memwrite(struct file *fp, const char __user *buf, size_t count, loff_t *offp);
 
621
static long     stli_memioctl(struct file *fp, unsigned int cmd, unsigned long arg);
 
622
static void     stli_brdpoll(struct stlibrd *brdp, cdkhdr_t __iomem *hdrp);
 
623
static void     stli_poll(unsigned long arg);
 
624
static int      stli_hostcmd(struct stlibrd *brdp, struct stliport *portp);
 
625
static int      stli_initopen(struct tty_struct *tty, struct stlibrd *brdp, struct stliport *portp);
 
626
static int      stli_rawopen(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait);
 
627
static int      stli_rawclose(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait);
 
628
static int      stli_setport(struct tty_struct *tty);
 
629
static int      stli_cmdwait(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback);
 
630
static void     stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback);
 
631
static void     __stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback);
 
632
static void     stli_dodelaycmd(struct stliport *portp, cdkctrl_t __iomem *cp);
 
633
static void     stli_mkasyport(struct tty_struct *tty, struct stliport *portp, asyport_t *pp, struct ktermios *tiosp);
 
634
static void     stli_mkasysigs(asysigs_t *sp, int dtr, int rts);
 
635
static long     stli_mktiocm(unsigned long sigvalue);
 
636
static void     stli_read(struct stlibrd *brdp, struct stliport *portp);
 
637
static int      stli_getserial(struct stliport *portp, struct serial_struct __user *sp);
 
638
static int      stli_setserial(struct tty_struct *tty, struct serial_struct __user *sp);
 
639
static int      stli_getbrdstats(combrd_t __user *bp);
 
640
static int      stli_getportstats(struct tty_struct *tty, struct stliport *portp, comstats_t __user *cp);
 
641
static int      stli_portcmdstats(struct tty_struct *tty, struct stliport *portp);
 
642
static int      stli_clrportstats(struct stliport *portp, comstats_t __user *cp);
 
643
static int      stli_getportstruct(struct stliport __user *arg);
 
644
static int      stli_getbrdstruct(struct stlibrd __user *arg);
 
645
static struct stlibrd *stli_allocbrd(void);
 
646
 
 
647
static void     stli_ecpinit(struct stlibrd *brdp);
 
648
static void     stli_ecpenable(struct stlibrd *brdp);
 
649
static void     stli_ecpdisable(struct stlibrd *brdp);
 
650
static void __iomem *stli_ecpgetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
 
651
static void     stli_ecpreset(struct stlibrd *brdp);
 
652
static void     stli_ecpintr(struct stlibrd *brdp);
 
653
static void     stli_ecpeiinit(struct stlibrd *brdp);
 
654
static void     stli_ecpeienable(struct stlibrd *brdp);
 
655
static void     stli_ecpeidisable(struct stlibrd *brdp);
 
656
static void __iomem *stli_ecpeigetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
 
657
static void     stli_ecpeireset(struct stlibrd *brdp);
 
658
static void     stli_ecpmcenable(struct stlibrd *brdp);
 
659
static void     stli_ecpmcdisable(struct stlibrd *brdp);
 
660
static void __iomem *stli_ecpmcgetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
 
661
static void     stli_ecpmcreset(struct stlibrd *brdp);
 
662
static void     stli_ecppciinit(struct stlibrd *brdp);
 
663
static void __iomem *stli_ecppcigetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
 
664
static void     stli_ecppcireset(struct stlibrd *brdp);
 
665
 
 
666
static void     stli_onbinit(struct stlibrd *brdp);
 
667
static void     stli_onbenable(struct stlibrd *brdp);
 
668
static void     stli_onbdisable(struct stlibrd *brdp);
 
669
static void __iomem *stli_onbgetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
 
670
static void     stli_onbreset(struct stlibrd *brdp);
 
671
static void     stli_onbeinit(struct stlibrd *brdp);
 
672
static void     stli_onbeenable(struct stlibrd *brdp);
 
673
static void     stli_onbedisable(struct stlibrd *brdp);
 
674
static void __iomem *stli_onbegetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
 
675
static void     stli_onbereset(struct stlibrd *brdp);
 
676
static void     stli_bbyinit(struct stlibrd *brdp);
 
677
static void __iomem *stli_bbygetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
 
678
static void     stli_bbyreset(struct stlibrd *brdp);
 
679
static void     stli_stalinit(struct stlibrd *brdp);
 
680
static void __iomem *stli_stalgetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
 
681
static void     stli_stalreset(struct stlibrd *brdp);
 
682
 
 
683
static struct stliport *stli_getport(unsigned int brdnr, unsigned int panelnr, unsigned int portnr);
 
684
 
 
685
static int      stli_initecp(struct stlibrd *brdp);
 
686
static int      stli_initonb(struct stlibrd *brdp);
 
687
#if STLI_EISAPROBE != 0
 
688
static int      stli_eisamemprobe(struct stlibrd *brdp);
 
689
#endif
 
690
static int      stli_initports(struct stlibrd *brdp);
 
691
 
 
692
/*****************************************************************************/
 
693
 
 
694
/*
 
695
 *      Define the driver info for a user level shared memory device. This
 
696
 *      device will work sort of like the /dev/kmem device - except that it
 
697
 *      will give access to the shared memory on the Stallion intelligent
 
698
 *      board. This is also a very useful debugging tool.
 
699
 */
 
700
static const struct file_operations     stli_fsiomem = {
 
701
        .owner          = THIS_MODULE,
 
702
        .read           = stli_memread,
 
703
        .write          = stli_memwrite,
 
704
        .unlocked_ioctl = stli_memioctl,
 
705
        .llseek         = default_llseek,
 
706
};
 
707
 
 
708
/*****************************************************************************/
 
709
 
 
710
/*
 
711
 *      Define a timer_list entry for our poll routine. The slave board
 
712
 *      is polled every so often to see if anything needs doing. This is
 
713
 *      much cheaper on host cpu than using interrupts. It turns out to
 
714
 *      not increase character latency by much either...
 
715
 */
 
716
static DEFINE_TIMER(stli_timerlist, stli_poll, 0, 0);
 
717
 
 
718
static int      stli_timeron;
 
719
 
 
720
/*
 
721
 *      Define the calculation for the timeout routine.
 
722
 */
 
723
#define STLI_TIMEOUT    (jiffies + 1)
 
724
 
 
725
/*****************************************************************************/
 
726
 
 
727
static struct class *istallion_class;
 
728
 
 
729
static void stli_cleanup_ports(struct stlibrd *brdp)
 
730
{
 
731
        struct stliport *portp;
 
732
        unsigned int j;
 
733
        struct tty_struct *tty;
 
734
 
 
735
        for (j = 0; j < STL_MAXPORTS; j++) {
 
736
                portp = brdp->ports[j];
 
737
                if (portp != NULL) {
 
738
                        tty = tty_port_tty_get(&portp->port);
 
739
                        if (tty != NULL) {
 
740
                                tty_hangup(tty);
 
741
                                tty_kref_put(tty);
 
742
                        }
 
743
                        kfree(portp);
 
744
                }
 
745
        }
 
746
}
 
747
 
 
748
/*****************************************************************************/
 
749
 
 
750
/*
 
751
 *      Parse the supplied argument string, into the board conf struct.
 
752
 */
 
753
 
 
754
static int stli_parsebrd(struct stlconf *confp, char **argp)
 
755
{
 
756
        unsigned int i;
 
757
        char *sp;
 
758
 
 
759
        if (argp[0] == NULL || *argp[0] == 0)
 
760
                return 0;
 
761
 
 
762
        for (sp = argp[0], i = 0; ((*sp != 0) && (i < 25)); sp++, i++)
 
763
                *sp = tolower(*sp);
 
764
 
 
765
        for (i = 0; i < ARRAY_SIZE(stli_brdstr); i++) {
 
766
                if (strcmp(stli_brdstr[i].name, argp[0]) == 0)
 
767
                        break;
 
768
        }
 
769
        if (i == ARRAY_SIZE(stli_brdstr)) {
 
770
                printk(KERN_WARNING "istallion: unknown board name, %s?\n", argp[0]);
 
771
                return 0;
 
772
        }
 
773
 
 
774
        confp->brdtype = stli_brdstr[i].type;
 
775
        if (argp[1] != NULL && *argp[1] != 0)
 
776
                confp->ioaddr1 = simple_strtoul(argp[1], NULL, 0);
 
777
        if (argp[2] !=  NULL && *argp[2] != 0)
 
778
                confp->memaddr = simple_strtoul(argp[2], NULL, 0);
 
779
        return(1);
 
780
}
 
781
 
 
782
/*****************************************************************************/
 
783
 
 
784
/*
 
785
 *      On the first open of the device setup the port hardware, and
 
786
 *      initialize the per port data structure. Since initializing the port
 
787
 *      requires several commands to the board we will need to wait for any
 
788
 *      other open that is already initializing the port.
 
789
 *
 
790
 *      Locking: protected by the port mutex.
 
791
 */
 
792
 
 
793
static int stli_activate(struct tty_port *port, struct tty_struct *tty)
 
794
{
 
795
        struct stliport *portp = container_of(port, struct stliport, port);
 
796
        struct stlibrd *brdp = stli_brds[portp->brdnr];
 
797
        int rc;
 
798
 
 
799
        if ((rc = stli_initopen(tty, brdp, portp)) >= 0)
 
800
                clear_bit(TTY_IO_ERROR, &tty->flags);
 
801
        wake_up_interruptible(&portp->raw_wait);
 
802
        return rc;
 
803
}
 
804
 
 
805
static int stli_open(struct tty_struct *tty, struct file *filp)
 
806
{
 
807
        struct stlibrd *brdp;
 
808
        struct stliport *portp;
 
809
        unsigned int minordev, brdnr, portnr;
 
810
 
 
811
        minordev = tty->index;
 
812
        brdnr = MINOR2BRD(minordev);
 
813
        if (brdnr >= stli_nrbrds)
 
814
                return -ENODEV;
 
815
        brdp = stli_brds[brdnr];
 
816
        if (brdp == NULL)
 
817
                return -ENODEV;
 
818
        if (!test_bit(BST_STARTED, &brdp->state))
 
819
                return -ENODEV;
 
820
        portnr = MINOR2PORT(minordev);
 
821
        if (portnr > brdp->nrports)
 
822
                return -ENODEV;
 
823
 
 
824
        portp = brdp->ports[portnr];
 
825
        if (portp == NULL)
 
826
                return -ENODEV;
 
827
        if (portp->devnr < 1)
 
828
                return -ENODEV;
 
829
 
 
830
        tty->driver_data = portp;
 
831
        return tty_port_open(&portp->port, tty, filp);
 
832
}
 
833
 
 
834
 
 
835
/*****************************************************************************/
 
836
 
 
837
static void stli_shutdown(struct tty_port *port)
 
838
{
 
839
        struct stlibrd *brdp;
 
840
        unsigned long ftype;
 
841
        unsigned long flags;
 
842
        struct stliport *portp = container_of(port, struct stliport, port);
 
843
 
 
844
        if (portp->brdnr >= stli_nrbrds)
 
845
                return;
 
846
        brdp = stli_brds[portp->brdnr];
 
847
        if (brdp == NULL)
 
848
                return;
 
849
 
 
850
        /*
 
851
         *      May want to wait for data to drain before closing. The BUSY
 
852
         *      flag keeps track of whether we are still transmitting or not.
 
853
         *      It is updated by messages from the slave - indicating when all
 
854
         *      chars really have drained.
 
855
         */
 
856
 
 
857
        if (!test_bit(ST_CLOSING, &portp->state))
 
858
                stli_rawclose(brdp, portp, 0, 0);
 
859
 
 
860
        spin_lock_irqsave(&stli_lock, flags);
 
861
        clear_bit(ST_TXBUSY, &portp->state);
 
862
        clear_bit(ST_RXSTOP, &portp->state);
 
863
        spin_unlock_irqrestore(&stli_lock, flags);
 
864
 
 
865
        ftype = FLUSHTX | FLUSHRX;
 
866
        stli_cmdwait(brdp, portp, A_FLUSH, &ftype, sizeof(u32), 0);
 
867
}
 
868
 
 
869
static void stli_close(struct tty_struct *tty, struct file *filp)
 
870
{
 
871
        struct stliport *portp = tty->driver_data;
 
872
        unsigned long flags;
 
873
        if (portp == NULL)
 
874
                return;
 
875
        spin_lock_irqsave(&stli_lock, flags);
 
876
        /*      Flush any internal buffering out first */
 
877
        if (tty == stli_txcooktty)
 
878
                stli_flushchars(tty);
 
879
        spin_unlock_irqrestore(&stli_lock, flags);
 
880
        tty_port_close(&portp->port, tty, filp);
 
881
}
 
882
 
 
883
/*****************************************************************************/
 
884
 
 
885
/*
 
886
 *      Carry out first open operations on a port. This involves a number of
 
887
 *      commands to be sent to the slave. We need to open the port, set the
 
888
 *      notification events, set the initial port settings, get and set the
 
889
 *      initial signal values. We sleep and wait in between each one. But
 
890
 *      this still all happens pretty quickly.
 
891
 */
 
892
 
 
893
static int stli_initopen(struct tty_struct *tty,
 
894
                                struct stlibrd *brdp, struct stliport *portp)
 
895
{
 
896
        asynotify_t nt;
 
897
        asyport_t aport;
 
898
        int rc;
 
899
 
 
900
        if ((rc = stli_rawopen(brdp, portp, 0, 1)) < 0)
 
901
                return rc;
 
902
 
 
903
        memset(&nt, 0, sizeof(asynotify_t));
 
904
        nt.data = (DT_TXLOW | DT_TXEMPTY | DT_RXBUSY | DT_RXBREAK);
 
905
        nt.signal = SG_DCD;
 
906
        if ((rc = stli_cmdwait(brdp, portp, A_SETNOTIFY, &nt,
 
907
            sizeof(asynotify_t), 0)) < 0)
 
908
                return rc;
 
909
 
 
910
        stli_mkasyport(tty, portp, &aport, tty->termios);
 
911
        if ((rc = stli_cmdwait(brdp, portp, A_SETPORT, &aport,
 
912
            sizeof(asyport_t), 0)) < 0)
 
913
                return rc;
 
914
 
 
915
        set_bit(ST_GETSIGS, &portp->state);
 
916
        if ((rc = stli_cmdwait(brdp, portp, A_GETSIGNALS, &portp->asig,
 
917
            sizeof(asysigs_t), 1)) < 0)
 
918
                return rc;
 
919
        if (test_and_clear_bit(ST_GETSIGS, &portp->state))
 
920
                portp->sigs = stli_mktiocm(portp->asig.sigvalue);
 
921
        stli_mkasysigs(&portp->asig, 1, 1);
 
922
        if ((rc = stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig,
 
923
            sizeof(asysigs_t), 0)) < 0)
 
924
                return rc;
 
925
 
 
926
        return 0;
 
927
}
 
928
 
 
929
/*****************************************************************************/
 
930
 
 
931
/*
 
932
 *      Send an open message to the slave. This will sleep waiting for the
 
933
 *      acknowledgement, so must have user context. We need to co-ordinate
 
934
 *      with close events here, since we don't want open and close events
 
935
 *      to overlap.
 
936
 */
 
937
 
 
938
static int stli_rawopen(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait)
 
939
{
 
940
        cdkhdr_t __iomem *hdrp;
 
941
        cdkctrl_t __iomem *cp;
 
942
        unsigned char __iomem *bits;
 
943
        unsigned long flags;
 
944
        int rc;
 
945
 
 
946
/*
 
947
 *      Send a message to the slave to open this port.
 
948
 */
 
949
 
 
950
/*
 
951
 *      Slave is already closing this port. This can happen if a hangup
 
952
 *      occurs on this port. So we must wait until it is complete. The
 
953
 *      order of opens and closes may not be preserved across shared
 
954
 *      memory, so we must wait until it is complete.
 
955
 */
 
956
        wait_event_interruptible_tty(portp->raw_wait,
 
957
                        !test_bit(ST_CLOSING, &portp->state));
 
958
        if (signal_pending(current)) {
 
959
                return -ERESTARTSYS;
 
960
        }
 
961
 
 
962
/*
 
963
 *      Everything is ready now, so write the open message into shared
 
964
 *      memory. Once the message is in set the service bits to say that
 
965
 *      this port wants service.
 
966
 */
 
967
        spin_lock_irqsave(&brd_lock, flags);
 
968
        EBRDENABLE(brdp);
 
969
        cp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl;
 
970
        writel(arg, &cp->openarg);
 
971
        writeb(1, &cp->open);
 
972
        hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
 
973
        bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset +
 
974
                portp->portidx;
 
975
        writeb(readb(bits) | portp->portbit, bits);
 
976
        EBRDDISABLE(brdp);
 
977
 
 
978
        if (wait == 0) {
 
979
                spin_unlock_irqrestore(&brd_lock, flags);
 
980
                return 0;
 
981
        }
 
982
 
 
983
/*
 
984
 *      Slave is in action, so now we must wait for the open acknowledgment
 
985
 *      to come back.
 
986
 */
 
987
        rc = 0;
 
988
        set_bit(ST_OPENING, &portp->state);
 
989
        spin_unlock_irqrestore(&brd_lock, flags);
 
990
 
 
991
        wait_event_interruptible_tty(portp->raw_wait,
 
992
                        !test_bit(ST_OPENING, &portp->state));
 
993
        if (signal_pending(current))
 
994
                rc = -ERESTARTSYS;
 
995
 
 
996
        if ((rc == 0) && (portp->rc != 0))
 
997
                rc = -EIO;
 
998
        return rc;
 
999
}
 
1000
 
 
1001
/*****************************************************************************/
 
1002
 
 
1003
/*
 
1004
 *      Send a close message to the slave. Normally this will sleep waiting
 
1005
 *      for the acknowledgement, but if wait parameter is 0 it will not. If
 
1006
 *      wait is true then must have user context (to sleep).
 
1007
 */
 
1008
 
 
1009
static int stli_rawclose(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait)
 
1010
{
 
1011
        cdkhdr_t __iomem *hdrp;
 
1012
        cdkctrl_t __iomem *cp;
 
1013
        unsigned char __iomem *bits;
 
1014
        unsigned long flags;
 
1015
        int rc;
 
1016
 
 
1017
/*
 
1018
 *      Slave is already closing this port. This can happen if a hangup
 
1019
 *      occurs on this port.
 
1020
 */
 
1021
        if (wait) {
 
1022
                wait_event_interruptible_tty(portp->raw_wait,
 
1023
                                !test_bit(ST_CLOSING, &portp->state));
 
1024
                if (signal_pending(current)) {
 
1025
                        return -ERESTARTSYS;
 
1026
                }
 
1027
        }
 
1028
 
 
1029
/*
 
1030
 *      Write the close command into shared memory.
 
1031
 */
 
1032
        spin_lock_irqsave(&brd_lock, flags);
 
1033
        EBRDENABLE(brdp);
 
1034
        cp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl;
 
1035
        writel(arg, &cp->closearg);
 
1036
        writeb(1, &cp->close);
 
1037
        hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
 
1038
        bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset +
 
1039
                portp->portidx;
 
1040
        writeb(readb(bits) |portp->portbit, bits);
 
1041
        EBRDDISABLE(brdp);
 
1042
 
 
1043
        set_bit(ST_CLOSING, &portp->state);
 
1044
        spin_unlock_irqrestore(&brd_lock, flags);
 
1045
 
 
1046
        if (wait == 0)
 
1047
                return 0;
 
1048
 
 
1049
/*
 
1050
 *      Slave is in action, so now we must wait for the open acknowledgment
 
1051
 *      to come back.
 
1052
 */
 
1053
        rc = 0;
 
1054
        wait_event_interruptible_tty(portp->raw_wait,
 
1055
                        !test_bit(ST_CLOSING, &portp->state));
 
1056
        if (signal_pending(current))
 
1057
                rc = -ERESTARTSYS;
 
1058
 
 
1059
        if ((rc == 0) && (portp->rc != 0))
 
1060
                rc = -EIO;
 
1061
        return rc;
 
1062
}
 
1063
 
 
1064
/*****************************************************************************/
 
1065
 
 
1066
/*
 
1067
 *      Send a command to the slave and wait for the response. This must
 
1068
 *      have user context (it sleeps). This routine is generic in that it
 
1069
 *      can send any type of command. Its purpose is to wait for that command
 
1070
 *      to complete (as opposed to initiating the command then returning).
 
1071
 */
 
1072
 
 
1073
static int stli_cmdwait(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback)
 
1074
{
 
1075
        /*
 
1076
         * no need for wait_event_tty because clearing ST_CMDING cannot block
 
1077
         * on BTM
 
1078
         */
 
1079
        wait_event_interruptible(portp->raw_wait,
 
1080
                        !test_bit(ST_CMDING, &portp->state));
 
1081
        if (signal_pending(current))
 
1082
                return -ERESTARTSYS;
 
1083
 
 
1084
        stli_sendcmd(brdp, portp, cmd, arg, size, copyback);
 
1085
 
 
1086
        wait_event_interruptible(portp->raw_wait,
 
1087
                        !test_bit(ST_CMDING, &portp->state));
 
1088
        if (signal_pending(current))
 
1089
                return -ERESTARTSYS;
 
1090
 
 
1091
        if (portp->rc != 0)
 
1092
                return -EIO;
 
1093
        return 0;
 
1094
}
 
1095
 
 
1096
/*****************************************************************************/
 
1097
 
 
1098
/*
 
1099
 *      Send the termios settings for this port to the slave. This sleeps
 
1100
 *      waiting for the command to complete - so must have user context.
 
1101
 */
 
1102
 
 
1103
static int stli_setport(struct tty_struct *tty)
 
1104
{
 
1105
        struct stliport *portp = tty->driver_data;
 
1106
        struct stlibrd *brdp;
 
1107
        asyport_t aport;
 
1108
 
 
1109
        if (portp == NULL)
 
1110
                return -ENODEV;
 
1111
        if (portp->brdnr >= stli_nrbrds)
 
1112
                return -ENODEV;
 
1113
        brdp = stli_brds[portp->brdnr];
 
1114
        if (brdp == NULL)
 
1115
                return -ENODEV;
 
1116
 
 
1117
        stli_mkasyport(tty, portp, &aport, tty->termios);
 
1118
        return(stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0));
 
1119
}
 
1120
 
 
1121
/*****************************************************************************/
 
1122
 
 
1123
static int stli_carrier_raised(struct tty_port *port)
 
1124
{
 
1125
        struct stliport *portp = container_of(port, struct stliport, port);
 
1126
        return (portp->sigs & TIOCM_CD) ? 1 : 0;
 
1127
}
 
1128
 
 
1129
static void stli_dtr_rts(struct tty_port *port, int on)
 
1130
{
 
1131
        struct stliport *portp = container_of(port, struct stliport, port);
 
1132
        struct stlibrd *brdp = stli_brds[portp->brdnr];
 
1133
        stli_mkasysigs(&portp->asig, on, on);
 
1134
        if (stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig,
 
1135
                sizeof(asysigs_t), 0) < 0)
 
1136
                        printk(KERN_WARNING "istallion: dtr set failed.\n");
 
1137
}
 
1138
 
 
1139
 
 
1140
/*****************************************************************************/
 
1141
 
 
1142
/*
 
1143
 *      Write routine. Take the data and put it in the shared memory ring
 
1144
 *      queue. If port is not already sending chars then need to mark the
 
1145
 *      service bits for this port.
 
1146
 */
 
1147
 
 
1148
static int stli_write(struct tty_struct *tty, const unsigned char *buf, int count)
 
1149
{
 
1150
        cdkasy_t __iomem *ap;
 
1151
        cdkhdr_t __iomem *hdrp;
 
1152
        unsigned char __iomem *bits;
 
1153
        unsigned char __iomem *shbuf;
 
1154
        unsigned char *chbuf;
 
1155
        struct stliport *portp;
 
1156
        struct stlibrd *brdp;
 
1157
        unsigned int len, stlen, head, tail, size;
 
1158
        unsigned long flags;
 
1159
 
 
1160
        if (tty == stli_txcooktty)
 
1161
                stli_flushchars(tty);
 
1162
        portp = tty->driver_data;
 
1163
        if (portp == NULL)
 
1164
                return 0;
 
1165
        if (portp->brdnr >= stli_nrbrds)
 
1166
                return 0;
 
1167
        brdp = stli_brds[portp->brdnr];
 
1168
        if (brdp == NULL)
 
1169
                return 0;
 
1170
        chbuf = (unsigned char *) buf;
 
1171
 
 
1172
/*
 
1173
 *      All data is now local, shove as much as possible into shared memory.
 
1174
 */
 
1175
        spin_lock_irqsave(&brd_lock, flags);
 
1176
        EBRDENABLE(brdp);
 
1177
        ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
 
1178
        head = (unsigned int) readw(&ap->txq.head);
 
1179
        tail = (unsigned int) readw(&ap->txq.tail);
 
1180
        if (tail != ((unsigned int) readw(&ap->txq.tail)))
 
1181
                tail = (unsigned int) readw(&ap->txq.tail);
 
1182
        size = portp->txsize;
 
1183
        if (head >= tail) {
 
1184
                len = size - (head - tail) - 1;
 
1185
                stlen = size - head;
 
1186
        } else {
 
1187
                len = tail - head - 1;
 
1188
                stlen = len;
 
1189
        }
 
1190
 
 
1191
        len = min(len, (unsigned int)count);
 
1192
        count = 0;
 
1193
        shbuf = (char __iomem *) EBRDGETMEMPTR(brdp, portp->txoffset);
 
1194
 
 
1195
        while (len > 0) {
 
1196
                stlen = min(len, stlen);
 
1197
                memcpy_toio(shbuf + head, chbuf, stlen);
 
1198
                chbuf += stlen;
 
1199
                len -= stlen;
 
1200
                count += stlen;
 
1201
                head += stlen;
 
1202
                if (head >= size) {
 
1203
                        head = 0;
 
1204
                        stlen = tail;
 
1205
                }
 
1206
        }
 
1207
 
 
1208
        ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
 
1209
        writew(head, &ap->txq.head);
 
1210
        if (test_bit(ST_TXBUSY, &portp->state)) {
 
1211
                if (readl(&ap->changed.data) & DT_TXEMPTY)
 
1212
                        writel(readl(&ap->changed.data) & ~DT_TXEMPTY, &ap->changed.data);
 
1213
        }
 
1214
        hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
 
1215
        bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset +
 
1216
                portp->portidx;
 
1217
        writeb(readb(bits) | portp->portbit, bits);
 
1218
        set_bit(ST_TXBUSY, &portp->state);
 
1219
        EBRDDISABLE(brdp);
 
1220
        spin_unlock_irqrestore(&brd_lock, flags);
 
1221
 
 
1222
        return(count);
 
1223
}
 
1224
 
 
1225
/*****************************************************************************/
 
1226
 
 
1227
/*
 
1228
 *      Output a single character. We put it into a temporary local buffer
 
1229
 *      (for speed) then write out that buffer when the flushchars routine
 
1230
 *      is called. There is a safety catch here so that if some other port
 
1231
 *      writes chars before the current buffer has been, then we write them
 
1232
 *      first them do the new ports.
 
1233
 */
 
1234
 
 
1235
static int stli_putchar(struct tty_struct *tty, unsigned char ch)
 
1236
{
 
1237
        if (tty != stli_txcooktty) {
 
1238
                if (stli_txcooktty != NULL)
 
1239
                        stli_flushchars(stli_txcooktty);
 
1240
                stli_txcooktty = tty;
 
1241
        }
 
1242
 
 
1243
        stli_txcookbuf[stli_txcooksize++] = ch;
 
1244
        return 0;
 
1245
}
 
1246
 
 
1247
/*****************************************************************************/
 
1248
 
 
1249
/*
 
1250
 *      Transfer characters from the local TX cooking buffer to the board.
 
1251
 *      We sort of ignore the tty that gets passed in here. We rely on the
 
1252
 *      info stored with the TX cook buffer to tell us which port to flush
 
1253
 *      the data on. In any case we clean out the TX cook buffer, for re-use
 
1254
 *      by someone else.
 
1255
 */
 
1256
 
 
1257
static void stli_flushchars(struct tty_struct *tty)
 
1258
{
 
1259
        cdkhdr_t __iomem *hdrp;
 
1260
        unsigned char __iomem *bits;
 
1261
        cdkasy_t __iomem *ap;
 
1262
        struct tty_struct *cooktty;
 
1263
        struct stliport *portp;
 
1264
        struct stlibrd *brdp;
 
1265
        unsigned int len, stlen, head, tail, size, count, cooksize;
 
1266
        unsigned char *buf;
 
1267
        unsigned char __iomem *shbuf;
 
1268
        unsigned long flags;
 
1269
 
 
1270
        cooksize = stli_txcooksize;
 
1271
        cooktty = stli_txcooktty;
 
1272
        stli_txcooksize = 0;
 
1273
        stli_txcookrealsize = 0;
 
1274
        stli_txcooktty = NULL;
 
1275
 
 
1276
        if (cooktty == NULL)
 
1277
                return;
 
1278
        if (tty != cooktty)
 
1279
                tty = cooktty;
 
1280
        if (cooksize == 0)
 
1281
                return;
 
1282
 
 
1283
        portp = tty->driver_data;
 
1284
        if (portp == NULL)
 
1285
                return;
 
1286
        if (portp->brdnr >= stli_nrbrds)
 
1287
                return;
 
1288
        brdp = stli_brds[portp->brdnr];
 
1289
        if (brdp == NULL)
 
1290
                return;
 
1291
 
 
1292
        spin_lock_irqsave(&brd_lock, flags);
 
1293
        EBRDENABLE(brdp);
 
1294
 
 
1295
        ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
 
1296
        head = (unsigned int) readw(&ap->txq.head);
 
1297
        tail = (unsigned int) readw(&ap->txq.tail);
 
1298
        if (tail != ((unsigned int) readw(&ap->txq.tail)))
 
1299
                tail = (unsigned int) readw(&ap->txq.tail);
 
1300
        size = portp->txsize;
 
1301
        if (head >= tail) {
 
1302
                len = size - (head - tail) - 1;
 
1303
                stlen = size - head;
 
1304
        } else {
 
1305
                len = tail - head - 1;
 
1306
                stlen = len;
 
1307
        }
 
1308
 
 
1309
        len = min(len, cooksize);
 
1310
        count = 0;
 
1311
        shbuf = EBRDGETMEMPTR(brdp, portp->txoffset);
 
1312
        buf = stli_txcookbuf;
 
1313
 
 
1314
        while (len > 0) {
 
1315
                stlen = min(len, stlen);
 
1316
                memcpy_toio(shbuf + head, buf, stlen);
 
1317
                buf += stlen;
 
1318
                len -= stlen;
 
1319
                count += stlen;
 
1320
                head += stlen;
 
1321
                if (head >= size) {
 
1322
                        head = 0;
 
1323
                        stlen = tail;
 
1324
                }
 
1325
        }
 
1326
 
 
1327
        ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
 
1328
        writew(head, &ap->txq.head);
 
1329
 
 
1330
        if (test_bit(ST_TXBUSY, &portp->state)) {
 
1331
                if (readl(&ap->changed.data) & DT_TXEMPTY)
 
1332
                        writel(readl(&ap->changed.data) & ~DT_TXEMPTY, &ap->changed.data);
 
1333
        }
 
1334
        hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
 
1335
        bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset +
 
1336
                portp->portidx;
 
1337
        writeb(readb(bits) | portp->portbit, bits);
 
1338
        set_bit(ST_TXBUSY, &portp->state);
 
1339
 
 
1340
        EBRDDISABLE(brdp);
 
1341
        spin_unlock_irqrestore(&brd_lock, flags);
 
1342
}
 
1343
 
 
1344
/*****************************************************************************/
 
1345
 
 
1346
static int stli_writeroom(struct tty_struct *tty)
 
1347
{
 
1348
        cdkasyrq_t __iomem *rp;
 
1349
        struct stliport *portp;
 
1350
        struct stlibrd *brdp;
 
1351
        unsigned int head, tail, len;
 
1352
        unsigned long flags;
 
1353
 
 
1354
        if (tty == stli_txcooktty) {
 
1355
                if (stli_txcookrealsize != 0) {
 
1356
                        len = stli_txcookrealsize - stli_txcooksize;
 
1357
                        return len;
 
1358
                }
 
1359
        }
 
1360
 
 
1361
        portp = tty->driver_data;
 
1362
        if (portp == NULL)
 
1363
                return 0;
 
1364
        if (portp->brdnr >= stli_nrbrds)
 
1365
                return 0;
 
1366
        brdp = stli_brds[portp->brdnr];
 
1367
        if (brdp == NULL)
 
1368
                return 0;
 
1369
 
 
1370
        spin_lock_irqsave(&brd_lock, flags);
 
1371
        EBRDENABLE(brdp);
 
1372
        rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->txq;
 
1373
        head = (unsigned int) readw(&rp->head);
 
1374
        tail = (unsigned int) readw(&rp->tail);
 
1375
        if (tail != ((unsigned int) readw(&rp->tail)))
 
1376
                tail = (unsigned int) readw(&rp->tail);
 
1377
        len = (head >= tail) ? (portp->txsize - (head - tail)) : (tail - head);
 
1378
        len--;
 
1379
        EBRDDISABLE(brdp);
 
1380
        spin_unlock_irqrestore(&brd_lock, flags);
 
1381
 
 
1382
        if (tty == stli_txcooktty) {
 
1383
                stli_txcookrealsize = len;
 
1384
                len -= stli_txcooksize;
 
1385
        }
 
1386
        return len;
 
1387
}
 
1388
 
 
1389
/*****************************************************************************/
 
1390
 
 
1391
/*
 
1392
 *      Return the number of characters in the transmit buffer. Normally we
 
1393
 *      will return the number of chars in the shared memory ring queue.
 
1394
 *      We need to kludge around the case where the shared memory buffer is
 
1395
 *      empty but not all characters have drained yet, for this case just
 
1396
 *      return that there is 1 character in the buffer!
 
1397
 */
 
1398
 
 
1399
static int stli_charsinbuffer(struct tty_struct *tty)
 
1400
{
 
1401
        cdkasyrq_t __iomem *rp;
 
1402
        struct stliport *portp;
 
1403
        struct stlibrd *brdp;
 
1404
        unsigned int head, tail, len;
 
1405
        unsigned long flags;
 
1406
 
 
1407
        if (tty == stli_txcooktty)
 
1408
                stli_flushchars(tty);
 
1409
        portp = tty->driver_data;
 
1410
        if (portp == NULL)
 
1411
                return 0;
 
1412
        if (portp->brdnr >= stli_nrbrds)
 
1413
                return 0;
 
1414
        brdp = stli_brds[portp->brdnr];
 
1415
        if (brdp == NULL)
 
1416
                return 0;
 
1417
 
 
1418
        spin_lock_irqsave(&brd_lock, flags);
 
1419
        EBRDENABLE(brdp);
 
1420
        rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->txq;
 
1421
        head = (unsigned int) readw(&rp->head);
 
1422
        tail = (unsigned int) readw(&rp->tail);
 
1423
        if (tail != ((unsigned int) readw(&rp->tail)))
 
1424
                tail = (unsigned int) readw(&rp->tail);
 
1425
        len = (head >= tail) ? (head - tail) : (portp->txsize - (tail - head));
 
1426
        if ((len == 0) && test_bit(ST_TXBUSY, &portp->state))
 
1427
                len = 1;
 
1428
        EBRDDISABLE(brdp);
 
1429
        spin_unlock_irqrestore(&brd_lock, flags);
 
1430
 
 
1431
        return len;
 
1432
}
 
1433
 
 
1434
/*****************************************************************************/
 
1435
 
 
1436
/*
 
1437
 *      Generate the serial struct info.
 
1438
 */
 
1439
 
 
1440
static int stli_getserial(struct stliport *portp, struct serial_struct __user *sp)
 
1441
{
 
1442
        struct serial_struct sio;
 
1443
        struct stlibrd *brdp;
 
1444
 
 
1445
        memset(&sio, 0, sizeof(struct serial_struct));
 
1446
        sio.type = PORT_UNKNOWN;
 
1447
        sio.line = portp->portnr;
 
1448
        sio.irq = 0;
 
1449
        sio.flags = portp->port.flags;
 
1450
        sio.baud_base = portp->baud_base;
 
1451
        sio.close_delay = portp->port.close_delay;
 
1452
        sio.closing_wait = portp->closing_wait;
 
1453
        sio.custom_divisor = portp->custom_divisor;
 
1454
        sio.xmit_fifo_size = 0;
 
1455
        sio.hub6 = 0;
 
1456
 
 
1457
        brdp = stli_brds[portp->brdnr];
 
1458
        if (brdp != NULL)
 
1459
                sio.port = brdp->iobase;
 
1460
                
 
1461
        return copy_to_user(sp, &sio, sizeof(struct serial_struct)) ?
 
1462
                        -EFAULT : 0;
 
1463
}
 
1464
 
 
1465
/*****************************************************************************/
 
1466
 
 
1467
/*
 
1468
 *      Set port according to the serial struct info.
 
1469
 *      At this point we do not do any auto-configure stuff, so we will
 
1470
 *      just quietly ignore any requests to change irq, etc.
 
1471
 */
 
1472
 
 
1473
static int stli_setserial(struct tty_struct *tty, struct serial_struct __user *sp)
 
1474
{
 
1475
        struct serial_struct sio;
 
1476
        int rc;
 
1477
        struct stliport *portp = tty->driver_data;
 
1478
 
 
1479
        if (copy_from_user(&sio, sp, sizeof(struct serial_struct)))
 
1480
                return -EFAULT;
 
1481
        if (!capable(CAP_SYS_ADMIN)) {
 
1482
                if ((sio.baud_base != portp->baud_base) ||
 
1483
                    (sio.close_delay != portp->port.close_delay) ||
 
1484
                    ((sio.flags & ~ASYNC_USR_MASK) !=
 
1485
                    (portp->port.flags & ~ASYNC_USR_MASK)))
 
1486
                        return -EPERM;
 
1487
        } 
 
1488
 
 
1489
        portp->port.flags = (portp->port.flags & ~ASYNC_USR_MASK) |
 
1490
                (sio.flags & ASYNC_USR_MASK);
 
1491
        portp->baud_base = sio.baud_base;
 
1492
        portp->port.close_delay = sio.close_delay;
 
1493
        portp->closing_wait = sio.closing_wait;
 
1494
        portp->custom_divisor = sio.custom_divisor;
 
1495
 
 
1496
        if ((rc = stli_setport(tty)) < 0)
 
1497
                return rc;
 
1498
        return 0;
 
1499
}
 
1500
 
 
1501
/*****************************************************************************/
 
1502
 
 
1503
static int stli_tiocmget(struct tty_struct *tty)
 
1504
{
 
1505
        struct stliport *portp = tty->driver_data;
 
1506
        struct stlibrd *brdp;
 
1507
        int rc;
 
1508
 
 
1509
        if (portp == NULL)
 
1510
                return -ENODEV;
 
1511
        if (portp->brdnr >= stli_nrbrds)
 
1512
                return 0;
 
1513
        brdp = stli_brds[portp->brdnr];
 
1514
        if (brdp == NULL)
 
1515
                return 0;
 
1516
        if (tty->flags & (1 << TTY_IO_ERROR))
 
1517
                return -EIO;
 
1518
 
 
1519
        if ((rc = stli_cmdwait(brdp, portp, A_GETSIGNALS,
 
1520
                               &portp->asig, sizeof(asysigs_t), 1)) < 0)
 
1521
                return rc;
 
1522
 
 
1523
        return stli_mktiocm(portp->asig.sigvalue);
 
1524
}
 
1525
 
 
1526
static int stli_tiocmset(struct tty_struct *tty,
 
1527
                         unsigned int set, unsigned int clear)
 
1528
{
 
1529
        struct stliport *portp = tty->driver_data;
 
1530
        struct stlibrd *brdp;
 
1531
        int rts = -1, dtr = -1;
 
1532
 
 
1533
        if (portp == NULL)
 
1534
                return -ENODEV;
 
1535
        if (portp->brdnr >= stli_nrbrds)
 
1536
                return 0;
 
1537
        brdp = stli_brds[portp->brdnr];
 
1538
        if (brdp == NULL)
 
1539
                return 0;
 
1540
        if (tty->flags & (1 << TTY_IO_ERROR))
 
1541
                return -EIO;
 
1542
 
 
1543
        if (set & TIOCM_RTS)
 
1544
                rts = 1;
 
1545
        if (set & TIOCM_DTR)
 
1546
                dtr = 1;
 
1547
        if (clear & TIOCM_RTS)
 
1548
                rts = 0;
 
1549
        if (clear & TIOCM_DTR)
 
1550
                dtr = 0;
 
1551
 
 
1552
        stli_mkasysigs(&portp->asig, dtr, rts);
 
1553
 
 
1554
        return stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig,
 
1555
                            sizeof(asysigs_t), 0);
 
1556
}
 
1557
 
 
1558
static int stli_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
 
1559
{
 
1560
        struct stliport *portp;
 
1561
        struct stlibrd *brdp;
 
1562
        int rc;
 
1563
        void __user *argp = (void __user *)arg;
 
1564
 
 
1565
        portp = tty->driver_data;
 
1566
        if (portp == NULL)
 
1567
                return -ENODEV;
 
1568
        if (portp->brdnr >= stli_nrbrds)
 
1569
                return 0;
 
1570
        brdp = stli_brds[portp->brdnr];
 
1571
        if (brdp == NULL)
 
1572
                return 0;
 
1573
 
 
1574
        if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
 
1575
            (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS)) {
 
1576
                if (tty->flags & (1 << TTY_IO_ERROR))
 
1577
                        return -EIO;
 
1578
        }
 
1579
 
 
1580
        rc = 0;
 
1581
 
 
1582
        switch (cmd) {
 
1583
        case TIOCGSERIAL:
 
1584
                rc = stli_getserial(portp, argp);
 
1585
                break;
 
1586
        case TIOCSSERIAL:
 
1587
                rc = stli_setserial(tty, argp);
 
1588
                break;
 
1589
        case STL_GETPFLAG:
 
1590
                rc = put_user(portp->pflag, (unsigned __user *)argp);
 
1591
                break;
 
1592
        case STL_SETPFLAG:
 
1593
                if ((rc = get_user(portp->pflag, (unsigned __user *)argp)) == 0)
 
1594
                        stli_setport(tty);
 
1595
                break;
 
1596
        case COM_GETPORTSTATS:
 
1597
                rc = stli_getportstats(tty, portp, argp);
 
1598
                break;
 
1599
        case COM_CLRPORTSTATS:
 
1600
                rc = stli_clrportstats(portp, argp);
 
1601
                break;
 
1602
        case TIOCSERCONFIG:
 
1603
        case TIOCSERGWILD:
 
1604
        case TIOCSERSWILD:
 
1605
        case TIOCSERGETLSR:
 
1606
        case TIOCSERGSTRUCT:
 
1607
        case TIOCSERGETMULTI:
 
1608
        case TIOCSERSETMULTI:
 
1609
        default:
 
1610
                rc = -ENOIOCTLCMD;
 
1611
                break;
 
1612
        }
 
1613
 
 
1614
        return rc;
 
1615
}
 
1616
 
 
1617
/*****************************************************************************/
 
1618
 
 
1619
/*
 
1620
 *      This routine assumes that we have user context and can sleep.
 
1621
 *      Looks like it is true for the current ttys implementation..!!
 
1622
 */
 
1623
 
 
1624
static void stli_settermios(struct tty_struct *tty, struct ktermios *old)
 
1625
{
 
1626
        struct stliport *portp;
 
1627
        struct stlibrd *brdp;
 
1628
        struct ktermios *tiosp;
 
1629
        asyport_t aport;
 
1630
 
 
1631
        portp = tty->driver_data;
 
1632
        if (portp == NULL)
 
1633
                return;
 
1634
        if (portp->brdnr >= stli_nrbrds)
 
1635
                return;
 
1636
        brdp = stli_brds[portp->brdnr];
 
1637
        if (brdp == NULL)
 
1638
                return;
 
1639
 
 
1640
        tiosp = tty->termios;
 
1641
 
 
1642
        stli_mkasyport(tty, portp, &aport, tiosp);
 
1643
        stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0);
 
1644
        stli_mkasysigs(&portp->asig, ((tiosp->c_cflag & CBAUD) ? 1 : 0), -1);
 
1645
        stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig,
 
1646
                sizeof(asysigs_t), 0);
 
1647
        if ((old->c_cflag & CRTSCTS) && ((tiosp->c_cflag & CRTSCTS) == 0))
 
1648
                tty->hw_stopped = 0;
 
1649
        if (((old->c_cflag & CLOCAL) == 0) && (tiosp->c_cflag & CLOCAL))
 
1650
                wake_up_interruptible(&portp->port.open_wait);
 
1651
}
 
1652
 
 
1653
/*****************************************************************************/
 
1654
 
 
1655
/*
 
1656
 *      Attempt to flow control who ever is sending us data. We won't really
 
1657
 *      do any flow control action here. We can't directly, and even if we
 
1658
 *      wanted to we would have to send a command to the slave. The slave
 
1659
 *      knows how to flow control, and will do so when its buffers reach its
 
1660
 *      internal high water marks. So what we will do is set a local state
 
1661
 *      bit that will stop us sending any RX data up from the poll routine
 
1662
 *      (which is the place where RX data from the slave is handled).
 
1663
 */
 
1664
 
 
1665
static void stli_throttle(struct tty_struct *tty)
 
1666
{
 
1667
        struct stliport *portp = tty->driver_data;
 
1668
        if (portp == NULL)
 
1669
                return;
 
1670
        set_bit(ST_RXSTOP, &portp->state);
 
1671
}
 
1672
 
 
1673
/*****************************************************************************/
 
1674
 
 
1675
/*
 
1676
 *      Unflow control the device sending us data... That means that all
 
1677
 *      we have to do is clear the RXSTOP state bit. The next poll call
 
1678
 *      will then be able to pass the RX data back up.
 
1679
 */
 
1680
 
 
1681
static void stli_unthrottle(struct tty_struct *tty)
 
1682
{
 
1683
        struct stliport *portp = tty->driver_data;
 
1684
        if (portp == NULL)
 
1685
                return;
 
1686
        clear_bit(ST_RXSTOP, &portp->state);
 
1687
}
 
1688
 
 
1689
/*****************************************************************************/
 
1690
 
 
1691
/*
 
1692
 *      Stop the transmitter.
 
1693
 */
 
1694
 
 
1695
static void stli_stop(struct tty_struct *tty)
 
1696
{
 
1697
}
 
1698
 
 
1699
/*****************************************************************************/
 
1700
 
 
1701
/*
 
1702
 *      Start the transmitter again.
 
1703
 */
 
1704
 
 
1705
static void stli_start(struct tty_struct *tty)
 
1706
{
 
1707
}
 
1708
 
 
1709
/*****************************************************************************/
 
1710
 
 
1711
 
 
1712
/*
 
1713
 *      Hangup this port. This is pretty much like closing the port, only
 
1714
 *      a little more brutal. No waiting for data to drain. Shutdown the
 
1715
 *      port and maybe drop signals. This is rather tricky really. We want
 
1716
 *      to close the port as well.
 
1717
 */
 
1718
 
 
1719
static void stli_hangup(struct tty_struct *tty)
 
1720
{
 
1721
        struct stliport *portp = tty->driver_data;
 
1722
        tty_port_hangup(&portp->port);
 
1723
}
 
1724
 
 
1725
/*****************************************************************************/
 
1726
 
 
1727
/*
 
1728
 *      Flush characters from the lower buffer. We may not have user context
 
1729
 *      so we cannot sleep waiting for it to complete. Also we need to check
 
1730
 *      if there is chars for this port in the TX cook buffer, and flush them
 
1731
 *      as well.
 
1732
 */
 
1733
 
 
1734
static void stli_flushbuffer(struct tty_struct *tty)
 
1735
{
 
1736
        struct stliport *portp;
 
1737
        struct stlibrd *brdp;
 
1738
        unsigned long ftype, flags;
 
1739
 
 
1740
        portp = tty->driver_data;
 
1741
        if (portp == NULL)
 
1742
                return;
 
1743
        if (portp->brdnr >= stli_nrbrds)
 
1744
                return;
 
1745
        brdp = stli_brds[portp->brdnr];
 
1746
        if (brdp == NULL)
 
1747
                return;
 
1748
 
 
1749
        spin_lock_irqsave(&brd_lock, flags);
 
1750
        if (tty == stli_txcooktty) {
 
1751
                stli_txcooktty = NULL;
 
1752
                stli_txcooksize = 0;
 
1753
                stli_txcookrealsize = 0;
 
1754
        }
 
1755
        if (test_bit(ST_CMDING, &portp->state)) {
 
1756
                set_bit(ST_DOFLUSHTX, &portp->state);
 
1757
        } else {
 
1758
                ftype = FLUSHTX;
 
1759
                if (test_bit(ST_DOFLUSHRX, &portp->state)) {
 
1760
                        ftype |= FLUSHRX;
 
1761
                        clear_bit(ST_DOFLUSHRX, &portp->state);
 
1762
                }
 
1763
                __stli_sendcmd(brdp, portp, A_FLUSH, &ftype, sizeof(u32), 0);
 
1764
        }
 
1765
        spin_unlock_irqrestore(&brd_lock, flags);
 
1766
        tty_wakeup(tty);
 
1767
}
 
1768
 
 
1769
/*****************************************************************************/
 
1770
 
 
1771
static int stli_breakctl(struct tty_struct *tty, int state)
 
1772
{
 
1773
        struct stlibrd  *brdp;
 
1774
        struct stliport *portp;
 
1775
        long            arg;
 
1776
 
 
1777
        portp = tty->driver_data;
 
1778
        if (portp == NULL)
 
1779
                return -EINVAL;
 
1780
        if (portp->brdnr >= stli_nrbrds)
 
1781
                return -EINVAL;
 
1782
        brdp = stli_brds[portp->brdnr];
 
1783
        if (brdp == NULL)
 
1784
                return -EINVAL;
 
1785
 
 
1786
        arg = (state == -1) ? BREAKON : BREAKOFF;
 
1787
        stli_cmdwait(brdp, portp, A_BREAK, &arg, sizeof(long), 0);
 
1788
        return 0;
 
1789
}
 
1790
 
 
1791
/*****************************************************************************/
 
1792
 
 
1793
static void stli_waituntilsent(struct tty_struct *tty, int timeout)
 
1794
{
 
1795
        struct stliport *portp;
 
1796
        unsigned long tend;
 
1797
 
 
1798
        portp = tty->driver_data;
 
1799
        if (portp == NULL)
 
1800
                return;
 
1801
 
 
1802
        if (timeout == 0)
 
1803
                timeout = HZ;
 
1804
        tend = jiffies + timeout;
 
1805
 
 
1806
        while (test_bit(ST_TXBUSY, &portp->state)) {
 
1807
                if (signal_pending(current))
 
1808
                        break;
 
1809
                msleep_interruptible(20);
 
1810
                if (time_after_eq(jiffies, tend))
 
1811
                        break;
 
1812
        }
 
1813
}
 
1814
 
 
1815
/*****************************************************************************/
 
1816
 
 
1817
static void stli_sendxchar(struct tty_struct *tty, char ch)
 
1818
{
 
1819
        struct stlibrd  *brdp;
 
1820
        struct stliport *portp;
 
1821
        asyctrl_t       actrl;
 
1822
 
 
1823
        portp = tty->driver_data;
 
1824
        if (portp == NULL)
 
1825
                return;
 
1826
        if (portp->brdnr >= stli_nrbrds)
 
1827
                return;
 
1828
        brdp = stli_brds[portp->brdnr];
 
1829
        if (brdp == NULL)
 
1830
                return;
 
1831
 
 
1832
        memset(&actrl, 0, sizeof(asyctrl_t));
 
1833
        if (ch == STOP_CHAR(tty)) {
 
1834
                actrl.rxctrl = CT_STOPFLOW;
 
1835
        } else if (ch == START_CHAR(tty)) {
 
1836
                actrl.rxctrl = CT_STARTFLOW;
 
1837
        } else {
 
1838
                actrl.txctrl = CT_SENDCHR;
 
1839
                actrl.tximdch = ch;
 
1840
        }
 
1841
        stli_cmdwait(brdp, portp, A_PORTCTRL, &actrl, sizeof(asyctrl_t), 0);
 
1842
}
 
1843
 
 
1844
static void stli_portinfo(struct seq_file *m, struct stlibrd *brdp, struct stliport *portp, int portnr)
 
1845
{
 
1846
        char *uart;
 
1847
        int rc;
 
1848
 
 
1849
        rc = stli_portcmdstats(NULL, portp);
 
1850
 
 
1851
        uart = "UNKNOWN";
 
1852
        if (test_bit(BST_STARTED, &brdp->state)) {
 
1853
                switch (stli_comstats.hwid) {
 
1854
                case 0: uart = "2681"; break;
 
1855
                case 1: uart = "SC26198"; break;
 
1856
                default:uart = "CD1400"; break;
 
1857
                }
 
1858
        }
 
1859
        seq_printf(m, "%d: uart:%s ", portnr, uart);
 
1860
 
 
1861
        if (test_bit(BST_STARTED, &brdp->state) && rc >= 0) {
 
1862
                char sep;
 
1863
 
 
1864
                seq_printf(m, "tx:%d rx:%d", (int) stli_comstats.txtotal,
 
1865
                        (int) stli_comstats.rxtotal);
 
1866
 
 
1867
                if (stli_comstats.rxframing)
 
1868
                        seq_printf(m, " fe:%d",
 
1869
                                (int) stli_comstats.rxframing);
 
1870
                if (stli_comstats.rxparity)
 
1871
                        seq_printf(m, " pe:%d",
 
1872
                                (int) stli_comstats.rxparity);
 
1873
                if (stli_comstats.rxbreaks)
 
1874
                        seq_printf(m, " brk:%d",
 
1875
                                (int) stli_comstats.rxbreaks);
 
1876
                if (stli_comstats.rxoverrun)
 
1877
                        seq_printf(m, " oe:%d",
 
1878
                                (int) stli_comstats.rxoverrun);
 
1879
 
 
1880
                sep = ' ';
 
1881
                if (stli_comstats.signals & TIOCM_RTS) {
 
1882
                        seq_printf(m, "%c%s", sep, "RTS");
 
1883
                        sep = '|';
 
1884
                }
 
1885
                if (stli_comstats.signals & TIOCM_CTS) {
 
1886
                        seq_printf(m, "%c%s", sep, "CTS");
 
1887
                        sep = '|';
 
1888
                }
 
1889
                if (stli_comstats.signals & TIOCM_DTR) {
 
1890
                        seq_printf(m, "%c%s", sep, "DTR");
 
1891
                        sep = '|';
 
1892
                }
 
1893
                if (stli_comstats.signals & TIOCM_CD) {
 
1894
                        seq_printf(m, "%c%s", sep, "DCD");
 
1895
                        sep = '|';
 
1896
                }
 
1897
                if (stli_comstats.signals & TIOCM_DSR) {
 
1898
                        seq_printf(m, "%c%s", sep, "DSR");
 
1899
                        sep = '|';
 
1900
                }
 
1901
        }
 
1902
        seq_putc(m, '\n');
 
1903
}
 
1904
 
 
1905
/*****************************************************************************/
 
1906
 
 
1907
/*
 
1908
 *      Port info, read from the /proc file system.
 
1909
 */
 
1910
 
 
1911
static int stli_proc_show(struct seq_file *m, void *v)
 
1912
{
 
1913
        struct stlibrd *brdp;
 
1914
        struct stliport *portp;
 
1915
        unsigned int brdnr, portnr, totalport;
 
1916
 
 
1917
        totalport = 0;
 
1918
 
 
1919
        seq_printf(m, "%s: version %s\n", stli_drvtitle, stli_drvversion);
 
1920
 
 
1921
/*
 
1922
 *      We scan through for each board, panel and port. The offset is
 
1923
 *      calculated on the fly, and irrelevant ports are skipped.
 
1924
 */
 
1925
        for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) {
 
1926
                brdp = stli_brds[brdnr];
 
1927
                if (brdp == NULL)
 
1928
                        continue;
 
1929
                if (brdp->state == 0)
 
1930
                        continue;
 
1931
 
 
1932
                totalport = brdnr * STL_MAXPORTS;
 
1933
                for (portnr = 0; (portnr < brdp->nrports); portnr++,
 
1934
                    totalport++) {
 
1935
                        portp = brdp->ports[portnr];
 
1936
                        if (portp == NULL)
 
1937
                                continue;
 
1938
                        stli_portinfo(m, brdp, portp, totalport);
 
1939
                }
 
1940
        }
 
1941
        return 0;
 
1942
}
 
1943
 
 
1944
static int stli_proc_open(struct inode *inode, struct file *file)
 
1945
{
 
1946
        return single_open(file, stli_proc_show, NULL);
 
1947
}
 
1948
 
 
1949
static const struct file_operations stli_proc_fops = {
 
1950
        .owner          = THIS_MODULE,
 
1951
        .open           = stli_proc_open,
 
1952
        .read           = seq_read,
 
1953
        .llseek         = seq_lseek,
 
1954
        .release        = single_release,
 
1955
};
 
1956
 
 
1957
/*****************************************************************************/
 
1958
 
 
1959
/*
 
1960
 *      Generic send command routine. This will send a message to the slave,
 
1961
 *      of the specified type with the specified argument. Must be very
 
1962
 *      careful of data that will be copied out from shared memory -
 
1963
 *      containing command results. The command completion is all done from
 
1964
 *      a poll routine that does not have user context. Therefore you cannot
 
1965
 *      copy back directly into user space, or to the kernel stack of a
 
1966
 *      process. This routine does not sleep, so can be called from anywhere.
 
1967
 *
 
1968
 *      The caller must hold the brd_lock (see also stli_sendcmd the usual
 
1969
 *      entry point)
 
1970
 */
 
1971
 
 
1972
static void __stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback)
 
1973
{
 
1974
        cdkhdr_t __iomem *hdrp;
 
1975
        cdkctrl_t __iomem *cp;
 
1976
        unsigned char __iomem *bits;
 
1977
 
 
1978
        if (test_bit(ST_CMDING, &portp->state)) {
 
1979
                printk(KERN_ERR "istallion: command already busy, cmd=%x!\n",
 
1980
                                (int) cmd);
 
1981
                return;
 
1982
        }
 
1983
 
 
1984
        EBRDENABLE(brdp);
 
1985
        cp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl;
 
1986
        if (size > 0) {
 
1987
                memcpy_toio((void __iomem *) &(cp->args[0]), arg, size);
 
1988
                if (copyback) {
 
1989
                        portp->argp = arg;
 
1990
                        portp->argsize = size;
 
1991
                }
 
1992
        }
 
1993
        writel(0, &cp->status);
 
1994
        writel(cmd, &cp->cmd);
 
1995
        hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
 
1996
        bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset +
 
1997
                portp->portidx;
 
1998
        writeb(readb(bits) | portp->portbit, bits);
 
1999
        set_bit(ST_CMDING, &portp->state);
 
2000
        EBRDDISABLE(brdp);
 
2001
}
 
2002
 
 
2003
static void stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback)
 
2004
{
 
2005
        unsigned long           flags;
 
2006
 
 
2007
        spin_lock_irqsave(&brd_lock, flags);
 
2008
        __stli_sendcmd(brdp, portp, cmd, arg, size, copyback);
 
2009
        spin_unlock_irqrestore(&brd_lock, flags);
 
2010
}
 
2011
 
 
2012
/*****************************************************************************/
 
2013
 
 
2014
/*
 
2015
 *      Read data from shared memory. This assumes that the shared memory
 
2016
 *      is enabled and that interrupts are off. Basically we just empty out
 
2017
 *      the shared memory buffer into the tty buffer. Must be careful to
 
2018
 *      handle the case where we fill up the tty buffer, but still have
 
2019
 *      more chars to unload.
 
2020
 */
 
2021
 
 
2022
static void stli_read(struct stlibrd *brdp, struct stliport *portp)
 
2023
{
 
2024
        cdkasyrq_t __iomem *rp;
 
2025
        char __iomem *shbuf;
 
2026
        struct tty_struct       *tty;
 
2027
        unsigned int head, tail, size;
 
2028
        unsigned int len, stlen;
 
2029
 
 
2030
        if (test_bit(ST_RXSTOP, &portp->state))
 
2031
                return;
 
2032
        tty = tty_port_tty_get(&portp->port);
 
2033
        if (tty == NULL)
 
2034
                return;
 
2035
 
 
2036
        rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->rxq;
 
2037
        head = (unsigned int) readw(&rp->head);
 
2038
        if (head != ((unsigned int) readw(&rp->head)))
 
2039
                head = (unsigned int) readw(&rp->head);
 
2040
        tail = (unsigned int) readw(&rp->tail);
 
2041
        size = portp->rxsize;
 
2042
        if (head >= tail) {
 
2043
                len = head - tail;
 
2044
                stlen = len;
 
2045
        } else {
 
2046
                len = size - (tail - head);
 
2047
                stlen = size - tail;
 
2048
        }
 
2049
 
 
2050
        len = tty_buffer_request_room(tty, len);
 
2051
 
 
2052
        shbuf = (char __iomem *) EBRDGETMEMPTR(brdp, portp->rxoffset);
 
2053
 
 
2054
        while (len > 0) {
 
2055
                unsigned char *cptr;
 
2056
 
 
2057
                stlen = min(len, stlen);
 
2058
                tty_prepare_flip_string(tty, &cptr, stlen);
 
2059
                memcpy_fromio(cptr, shbuf + tail, stlen);
 
2060
                len -= stlen;
 
2061
                tail += stlen;
 
2062
                if (tail >= size) {
 
2063
                        tail = 0;
 
2064
                        stlen = head;
 
2065
                }
 
2066
        }
 
2067
        rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->rxq;
 
2068
        writew(tail, &rp->tail);
 
2069
 
 
2070
        if (head != tail)
 
2071
                set_bit(ST_RXING, &portp->state);
 
2072
 
 
2073
        tty_schedule_flip(tty);
 
2074
        tty_kref_put(tty);
 
2075
}
 
2076
 
 
2077
/*****************************************************************************/
 
2078
 
 
2079
/*
 
2080
 *      Set up and carry out any delayed commands. There is only a small set
 
2081
 *      of slave commands that can be done "off-level". So it is not too
 
2082
 *      difficult to deal with them here.
 
2083
 */
 
2084
 
 
2085
static void stli_dodelaycmd(struct stliport *portp, cdkctrl_t __iomem *cp)
 
2086
{
 
2087
        int cmd;
 
2088
 
 
2089
        if (test_bit(ST_DOSIGS, &portp->state)) {
 
2090
                if (test_bit(ST_DOFLUSHTX, &portp->state) &&
 
2091
                    test_bit(ST_DOFLUSHRX, &portp->state))
 
2092
                        cmd = A_SETSIGNALSF;
 
2093
                else if (test_bit(ST_DOFLUSHTX, &portp->state))
 
2094
                        cmd = A_SETSIGNALSFTX;
 
2095
                else if (test_bit(ST_DOFLUSHRX, &portp->state))
 
2096
                        cmd = A_SETSIGNALSFRX;
 
2097
                else
 
2098
                        cmd = A_SETSIGNALS;
 
2099
                clear_bit(ST_DOFLUSHTX, &portp->state);
 
2100
                clear_bit(ST_DOFLUSHRX, &portp->state);
 
2101
                clear_bit(ST_DOSIGS, &portp->state);
 
2102
                memcpy_toio((void __iomem *) &(cp->args[0]), (void *) &portp->asig,
 
2103
                        sizeof(asysigs_t));
 
2104
                writel(0, &cp->status);
 
2105
                writel(cmd, &cp->cmd);
 
2106
                set_bit(ST_CMDING, &portp->state);
 
2107
        } else if (test_bit(ST_DOFLUSHTX, &portp->state) ||
 
2108
            test_bit(ST_DOFLUSHRX, &portp->state)) {
 
2109
                cmd = ((test_bit(ST_DOFLUSHTX, &portp->state)) ? FLUSHTX : 0);
 
2110
                cmd |= ((test_bit(ST_DOFLUSHRX, &portp->state)) ? FLUSHRX : 0);
 
2111
                clear_bit(ST_DOFLUSHTX, &portp->state);
 
2112
                clear_bit(ST_DOFLUSHRX, &portp->state);
 
2113
                memcpy_toio((void __iomem *) &(cp->args[0]), (void *) &cmd, sizeof(int));
 
2114
                writel(0, &cp->status);
 
2115
                writel(A_FLUSH, &cp->cmd);
 
2116
                set_bit(ST_CMDING, &portp->state);
 
2117
        }
 
2118
}
 
2119
 
 
2120
/*****************************************************************************/
 
2121
 
 
2122
/*
 
2123
 *      Host command service checking. This handles commands or messages
 
2124
 *      coming from the slave to the host. Must have board shared memory
 
2125
 *      enabled and interrupts off when called. Notice that by servicing the
 
2126
 *      read data last we don't need to change the shared memory pointer
 
2127
 *      during processing (which is a slow IO operation).
 
2128
 *      Return value indicates if this port is still awaiting actions from
 
2129
 *      the slave (like open, command, or even TX data being sent). If 0
 
2130
 *      then port is still busy, otherwise no longer busy.
 
2131
 */
 
2132
 
 
2133
static int stli_hostcmd(struct stlibrd *brdp, struct stliport *portp)
 
2134
{
 
2135
        cdkasy_t __iomem *ap;
 
2136
        cdkctrl_t __iomem *cp;
 
2137
        struct tty_struct *tty;
 
2138
        asynotify_t nt;
 
2139
        unsigned long oldsigs;
 
2140
        int rc, donerx;
 
2141
 
 
2142
        ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
 
2143
        cp = &ap->ctrl;
 
2144
 
 
2145
/*
 
2146
 *      Check if we are waiting for an open completion message.
 
2147
 */
 
2148
        if (test_bit(ST_OPENING, &portp->state)) {
 
2149
                rc = readl(&cp->openarg);
 
2150
                if (readb(&cp->open) == 0 && rc != 0) {
 
2151
                        if (rc > 0)
 
2152
                                rc--;
 
2153
                        writel(0, &cp->openarg);
 
2154
                        portp->rc = rc;
 
2155
                        clear_bit(ST_OPENING, &portp->state);
 
2156
                        wake_up_interruptible(&portp->raw_wait);
 
2157
                }
 
2158
        }
 
2159
 
 
2160
/*
 
2161
 *      Check if we are waiting for a close completion message.
 
2162
 */
 
2163
        if (test_bit(ST_CLOSING, &portp->state)) {
 
2164
                rc = (int) readl(&cp->closearg);
 
2165
                if (readb(&cp->close) == 0 && rc != 0) {
 
2166
                        if (rc > 0)
 
2167
                                rc--;
 
2168
                        writel(0, &cp->closearg);
 
2169
                        portp->rc = rc;
 
2170
                        clear_bit(ST_CLOSING, &portp->state);
 
2171
                        wake_up_interruptible(&portp->raw_wait);
 
2172
                }
 
2173
        }
 
2174
 
 
2175
/*
 
2176
 *      Check if we are waiting for a command completion message. We may
 
2177
 *      need to copy out the command results associated with this command.
 
2178
 */
 
2179
        if (test_bit(ST_CMDING, &portp->state)) {
 
2180
                rc = readl(&cp->status);
 
2181
                if (readl(&cp->cmd) == 0 && rc != 0) {
 
2182
                        if (rc > 0)
 
2183
                                rc--;
 
2184
                        if (portp->argp != NULL) {
 
2185
                                memcpy_fromio(portp->argp, (void __iomem *) &(cp->args[0]),
 
2186
                                        portp->argsize);
 
2187
                                portp->argp = NULL;
 
2188
                        }
 
2189
                        writel(0, &cp->status);
 
2190
                        portp->rc = rc;
 
2191
                        clear_bit(ST_CMDING, &portp->state);
 
2192
                        stli_dodelaycmd(portp, cp);
 
2193
                        wake_up_interruptible(&portp->raw_wait);
 
2194
                }
 
2195
        }
 
2196
 
 
2197
/*
 
2198
 *      Check for any notification messages ready. This includes lots of
 
2199
 *      different types of events - RX chars ready, RX break received,
 
2200
 *      TX data low or empty in the slave, modem signals changed state.
 
2201
 */
 
2202
        donerx = 0;
 
2203
 
 
2204
        if (ap->notify) {
 
2205
                nt = ap->changed;
 
2206
                ap->notify = 0;
 
2207
                tty = tty_port_tty_get(&portp->port);
 
2208
 
 
2209
                if (nt.signal & SG_DCD) {
 
2210
                        oldsigs = portp->sigs;
 
2211
                        portp->sigs = stli_mktiocm(nt.sigvalue);
 
2212
                        clear_bit(ST_GETSIGS, &portp->state);
 
2213
                        if ((portp->sigs & TIOCM_CD) &&
 
2214
                            ((oldsigs & TIOCM_CD) == 0))
 
2215
                                wake_up_interruptible(&portp->port.open_wait);
 
2216
                        if ((oldsigs & TIOCM_CD) &&
 
2217
                            ((portp->sigs & TIOCM_CD) == 0)) {
 
2218
                                if (portp->port.flags & ASYNC_CHECK_CD) {
 
2219
                                        if (tty)
 
2220
                                                tty_hangup(tty);
 
2221
                                }
 
2222
                        }
 
2223
                }
 
2224
 
 
2225
                if (nt.data & DT_TXEMPTY)
 
2226
                        clear_bit(ST_TXBUSY, &portp->state);
 
2227
                if (nt.data & (DT_TXEMPTY | DT_TXLOW)) {
 
2228
                        if (tty != NULL) {
 
2229
                                tty_wakeup(tty);
 
2230
                                EBRDENABLE(brdp);
 
2231
                        }
 
2232
                }
 
2233
 
 
2234
                if ((nt.data & DT_RXBREAK) && (portp->rxmarkmsk & BRKINT)) {
 
2235
                        if (tty != NULL) {
 
2236
                                tty_insert_flip_char(tty, 0, TTY_BREAK);
 
2237
                                if (portp->port.flags & ASYNC_SAK) {
 
2238
                                        do_SAK(tty);
 
2239
                                        EBRDENABLE(brdp);
 
2240
                                }
 
2241
                                tty_schedule_flip(tty);
 
2242
                        }
 
2243
                }
 
2244
                tty_kref_put(tty);
 
2245
 
 
2246
                if (nt.data & DT_RXBUSY) {
 
2247
                        donerx++;
 
2248
                        stli_read(brdp, portp);
 
2249
                }
 
2250
        }
 
2251
 
 
2252
/*
 
2253
 *      It might seem odd that we are checking for more RX chars here.
 
2254
 *      But, we need to handle the case where the tty buffer was previously
 
2255
 *      filled, but we had more characters to pass up. The slave will not
 
2256
 *      send any more RX notify messages until the RX buffer has been emptied.
 
2257
 *      But it will leave the service bits on (since the buffer is not empty).
 
2258
 *      So from here we can try to process more RX chars.
 
2259
 */
 
2260
        if ((!donerx) && test_bit(ST_RXING, &portp->state)) {
 
2261
                clear_bit(ST_RXING, &portp->state);
 
2262
                stli_read(brdp, portp);
 
2263
        }
 
2264
 
 
2265
        return((test_bit(ST_OPENING, &portp->state) ||
 
2266
                test_bit(ST_CLOSING, &portp->state) ||
 
2267
                test_bit(ST_CMDING, &portp->state) ||
 
2268
                test_bit(ST_TXBUSY, &portp->state) ||
 
2269
                test_bit(ST_RXING, &portp->state)) ? 0 : 1);
 
2270
}
 
2271
 
 
2272
/*****************************************************************************/
 
2273
 
 
2274
/*
 
2275
 *      Service all ports on a particular board. Assumes that the boards
 
2276
 *      shared memory is enabled, and that the page pointer is pointed
 
2277
 *      at the cdk header structure.
 
2278
 */
 
2279
 
 
2280
static void stli_brdpoll(struct stlibrd *brdp, cdkhdr_t __iomem *hdrp)
 
2281
{
 
2282
        struct stliport *portp;
 
2283
        unsigned char hostbits[(STL_MAXCHANS / 8) + 1];
 
2284
        unsigned char slavebits[(STL_MAXCHANS / 8) + 1];
 
2285
        unsigned char __iomem *slavep;
 
2286
        int bitpos, bitat, bitsize;
 
2287
        int channr, nrdevs, slavebitchange;
 
2288
 
 
2289
        bitsize = brdp->bitsize;
 
2290
        nrdevs = brdp->nrdevs;
 
2291
 
 
2292
/*
 
2293
 *      Check if slave wants any service. Basically we try to do as
 
2294
 *      little work as possible here. There are 2 levels of service
 
2295
 *      bits. So if there is nothing to do we bail early. We check
 
2296
 *      8 service bits at a time in the inner loop, so we can bypass
 
2297
 *      the lot if none of them want service.
 
2298
 */
 
2299
        memcpy_fromio(&hostbits[0], (((unsigned char __iomem *) hdrp) + brdp->hostoffset),
 
2300
                bitsize);
 
2301
 
 
2302
        memset(&slavebits[0], 0, bitsize);
 
2303
        slavebitchange = 0;
 
2304
 
 
2305
        for (bitpos = 0; (bitpos < bitsize); bitpos++) {
 
2306
                if (hostbits[bitpos] == 0)
 
2307
                        continue;
 
2308
                channr = bitpos * 8;
 
2309
                for (bitat = 0x1; (channr < nrdevs); channr++, bitat <<= 1) {
 
2310
                        if (hostbits[bitpos] & bitat) {
 
2311
                                portp = brdp->ports[(channr - 1)];
 
2312
                                if (stli_hostcmd(brdp, portp)) {
 
2313
                                        slavebitchange++;
 
2314
                                        slavebits[bitpos] |= bitat;
 
2315
                                }
 
2316
                        }
 
2317
                }
 
2318
        }
 
2319
 
 
2320
/*
 
2321
 *      If any of the ports are no longer busy then update them in the
 
2322
 *      slave request bits. We need to do this after, since a host port
 
2323
 *      service may initiate more slave requests.
 
2324
 */
 
2325
        if (slavebitchange) {
 
2326
                hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
 
2327
                slavep = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset;
 
2328
                for (bitpos = 0; (bitpos < bitsize); bitpos++) {
 
2329
                        if (readb(slavebits + bitpos))
 
2330
                                writeb(readb(slavep + bitpos) & ~slavebits[bitpos], slavebits + bitpos);
 
2331
                }
 
2332
        }
 
2333
}
 
2334
 
 
2335
/*****************************************************************************/
 
2336
 
 
2337
/*
 
2338
 *      Driver poll routine. This routine polls the boards in use and passes
 
2339
 *      messages back up to host when necessary. This is actually very
 
2340
 *      CPU efficient, since we will always have the kernel poll clock, it
 
2341
 *      adds only a few cycles when idle (since board service can be
 
2342
 *      determined very easily), but when loaded generates no interrupts
 
2343
 *      (with their expensive associated context change).
 
2344
 */
 
2345
 
 
2346
static void stli_poll(unsigned long arg)
 
2347
{
 
2348
        cdkhdr_t __iomem *hdrp;
 
2349
        struct stlibrd *brdp;
 
2350
        unsigned int brdnr;
 
2351
 
 
2352
        mod_timer(&stli_timerlist, STLI_TIMEOUT);
 
2353
 
 
2354
/*
 
2355
 *      Check each board and do any servicing required.
 
2356
 */
 
2357
        for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) {
 
2358
                brdp = stli_brds[brdnr];
 
2359
                if (brdp == NULL)
 
2360
                        continue;
 
2361
                if (!test_bit(BST_STARTED, &brdp->state))
 
2362
                        continue;
 
2363
 
 
2364
                spin_lock(&brd_lock);
 
2365
                EBRDENABLE(brdp);
 
2366
                hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
 
2367
                if (readb(&hdrp->hostreq))
 
2368
                        stli_brdpoll(brdp, hdrp);
 
2369
                EBRDDISABLE(brdp);
 
2370
                spin_unlock(&brd_lock);
 
2371
        }
 
2372
}
 
2373
 
 
2374
/*****************************************************************************/
 
2375
 
 
2376
/*
 
2377
 *      Translate the termios settings into the port setting structure of
 
2378
 *      the slave.
 
2379
 */
 
2380
 
 
2381
static void stli_mkasyport(struct tty_struct *tty, struct stliport *portp,
 
2382
                                asyport_t *pp, struct ktermios *tiosp)
 
2383
{
 
2384
        memset(pp, 0, sizeof(asyport_t));
 
2385
 
 
2386
/*
 
2387
 *      Start of by setting the baud, char size, parity and stop bit info.
 
2388
 */
 
2389
        pp->baudout = tty_get_baud_rate(tty);
 
2390
        if ((tiosp->c_cflag & CBAUD) == B38400) {
 
2391
                if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
 
2392
                        pp->baudout = 57600;
 
2393
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
 
2394
                        pp->baudout = 115200;
 
2395
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
 
2396
                        pp->baudout = 230400;
 
2397
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
 
2398
                        pp->baudout = 460800;
 
2399
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
 
2400
                        pp->baudout = (portp->baud_base / portp->custom_divisor);
 
2401
        }
 
2402
        if (pp->baudout > STL_MAXBAUD)
 
2403
                pp->baudout = STL_MAXBAUD;
 
2404
        pp->baudin = pp->baudout;
 
2405
 
 
2406
        switch (tiosp->c_cflag & CSIZE) {
 
2407
        case CS5:
 
2408
                pp->csize = 5;
 
2409
                break;
 
2410
        case CS6:
 
2411
                pp->csize = 6;
 
2412
                break;
 
2413
        case CS7:
 
2414
                pp->csize = 7;
 
2415
                break;
 
2416
        default:
 
2417
                pp->csize = 8;
 
2418
                break;
 
2419
        }
 
2420
 
 
2421
        if (tiosp->c_cflag & CSTOPB)
 
2422
                pp->stopbs = PT_STOP2;
 
2423
        else
 
2424
                pp->stopbs = PT_STOP1;
 
2425
 
 
2426
        if (tiosp->c_cflag & PARENB) {
 
2427
                if (tiosp->c_cflag & PARODD)
 
2428
                        pp->parity = PT_ODDPARITY;
 
2429
                else
 
2430
                        pp->parity = PT_EVENPARITY;
 
2431
        } else {
 
2432
                pp->parity = PT_NOPARITY;
 
2433
        }
 
2434
 
 
2435
/*
 
2436
 *      Set up any flow control options enabled.
 
2437
 */
 
2438
        if (tiosp->c_iflag & IXON) {
 
2439
                pp->flow |= F_IXON;
 
2440
                if (tiosp->c_iflag & IXANY)
 
2441
                        pp->flow |= F_IXANY;
 
2442
        }
 
2443
        if (tiosp->c_cflag & CRTSCTS)
 
2444
                pp->flow |= (F_RTSFLOW | F_CTSFLOW);
 
2445
 
 
2446
        pp->startin = tiosp->c_cc[VSTART];
 
2447
        pp->stopin = tiosp->c_cc[VSTOP];
 
2448
        pp->startout = tiosp->c_cc[VSTART];
 
2449
        pp->stopout = tiosp->c_cc[VSTOP];
 
2450
 
 
2451
/*
 
2452
 *      Set up the RX char marking mask with those RX error types we must
 
2453
 *      catch. We can get the slave to help us out a little here, it will
 
2454
 *      ignore parity errors and breaks for us, and mark parity errors in
 
2455
 *      the data stream.
 
2456
 */
 
2457
        if (tiosp->c_iflag & IGNPAR)
 
2458
                pp->iflag |= FI_IGNRXERRS;
 
2459
        if (tiosp->c_iflag & IGNBRK)
 
2460
                pp->iflag |= FI_IGNBREAK;
 
2461
 
 
2462
        portp->rxmarkmsk = 0;
 
2463
        if (tiosp->c_iflag & (INPCK | PARMRK))
 
2464
                pp->iflag |= FI_1MARKRXERRS;
 
2465
        if (tiosp->c_iflag & BRKINT)
 
2466
                portp->rxmarkmsk |= BRKINT;
 
2467
 
 
2468
/*
 
2469
 *      Set up clocal processing as required.
 
2470
 */
 
2471
        if (tiosp->c_cflag & CLOCAL)
 
2472
                portp->port.flags &= ~ASYNC_CHECK_CD;
 
2473
        else
 
2474
                portp->port.flags |= ASYNC_CHECK_CD;
 
2475
 
 
2476
/*
 
2477
 *      Transfer any persistent flags into the asyport structure.
 
2478
 */
 
2479
        pp->pflag = (portp->pflag & 0xffff);
 
2480
        pp->vmin = (portp->pflag & P_RXIMIN) ? 1 : 0;
 
2481
        pp->vtime = (portp->pflag & P_RXITIME) ? 1 : 0;
 
2482
        pp->cc[1] = (portp->pflag & P_RXTHOLD) ? 1 : 0;
 
2483
}
 
2484
 
 
2485
/*****************************************************************************/
 
2486
 
 
2487
/*
 
2488
 *      Construct a slave signals structure for setting the DTR and RTS
 
2489
 *      signals as specified.
 
2490
 */
 
2491
 
 
2492
static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts)
 
2493
{
 
2494
        memset(sp, 0, sizeof(asysigs_t));
 
2495
        if (dtr >= 0) {
 
2496
                sp->signal |= SG_DTR;
 
2497
                sp->sigvalue |= ((dtr > 0) ? SG_DTR : 0);
 
2498
        }
 
2499
        if (rts >= 0) {
 
2500
                sp->signal |= SG_RTS;
 
2501
                sp->sigvalue |= ((rts > 0) ? SG_RTS : 0);
 
2502
        }
 
2503
}
 
2504
 
 
2505
/*****************************************************************************/
 
2506
 
 
2507
/*
 
2508
 *      Convert the signals returned from the slave into a local TIOCM type
 
2509
 *      signals value. We keep them locally in TIOCM format.
 
2510
 */
 
2511
 
 
2512
static long stli_mktiocm(unsigned long sigvalue)
 
2513
{
 
2514
        long    tiocm = 0;
 
2515
        tiocm |= ((sigvalue & SG_DCD) ? TIOCM_CD : 0);
 
2516
        tiocm |= ((sigvalue & SG_CTS) ? TIOCM_CTS : 0);
 
2517
        tiocm |= ((sigvalue & SG_RI) ? TIOCM_RI : 0);
 
2518
        tiocm |= ((sigvalue & SG_DSR) ? TIOCM_DSR : 0);
 
2519
        tiocm |= ((sigvalue & SG_DTR) ? TIOCM_DTR : 0);
 
2520
        tiocm |= ((sigvalue & SG_RTS) ? TIOCM_RTS : 0);
 
2521
        return(tiocm);
 
2522
}
 
2523
 
 
2524
/*****************************************************************************/
 
2525
 
 
2526
/*
 
2527
 *      All panels and ports actually attached have been worked out. All
 
2528
 *      we need to do here is set up the appropriate per port data structures.
 
2529
 */
 
2530
 
 
2531
static int stli_initports(struct stlibrd *brdp)
 
2532
{
 
2533
        struct stliport *portp;
 
2534
        unsigned int i, panelnr, panelport;
 
2535
 
 
2536
        for (i = 0, panelnr = 0, panelport = 0; (i < brdp->nrports); i++) {
 
2537
                portp = kzalloc(sizeof(struct stliport), GFP_KERNEL);
 
2538
                if (!portp) {
 
2539
                        printk(KERN_WARNING "istallion: failed to allocate port structure\n");
 
2540
                        continue;
 
2541
                }
 
2542
                tty_port_init(&portp->port);
 
2543
                portp->port.ops = &stli_port_ops;
 
2544
                portp->magic = STLI_PORTMAGIC;
 
2545
                portp->portnr = i;
 
2546
                portp->brdnr = brdp->brdnr;
 
2547
                portp->panelnr = panelnr;
 
2548
                portp->baud_base = STL_BAUDBASE;
 
2549
                portp->port.close_delay = STL_CLOSEDELAY;
 
2550
                portp->closing_wait = 30 * HZ;
 
2551
                init_waitqueue_head(&portp->port.open_wait);
 
2552
                init_waitqueue_head(&portp->port.close_wait);
 
2553
                init_waitqueue_head(&portp->raw_wait);
 
2554
                panelport++;
 
2555
                if (panelport >= brdp->panels[panelnr]) {
 
2556
                        panelport = 0;
 
2557
                        panelnr++;
 
2558
                }
 
2559
                brdp->ports[i] = portp;
 
2560
        }
 
2561
 
 
2562
        return 0;
 
2563
}
 
2564
 
 
2565
/*****************************************************************************/
 
2566
 
 
2567
/*
 
2568
 *      All the following routines are board specific hardware operations.
 
2569
 */
 
2570
 
 
2571
static void stli_ecpinit(struct stlibrd *brdp)
 
2572
{
 
2573
        unsigned long   memconf;
 
2574
 
 
2575
        outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR));
 
2576
        udelay(10);
 
2577
        outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR));
 
2578
        udelay(100);
 
2579
 
 
2580
        memconf = (brdp->memaddr & ECP_ATADDRMASK) >> ECP_ATADDRSHFT;
 
2581
        outb(memconf, (brdp->iobase + ECP_ATMEMAR));
 
2582
}
 
2583
 
 
2584
/*****************************************************************************/
 
2585
 
 
2586
static void stli_ecpenable(struct stlibrd *brdp)
 
2587
{       
 
2588
        outb(ECP_ATENABLE, (brdp->iobase + ECP_ATCONFR));
 
2589
}
 
2590
 
 
2591
/*****************************************************************************/
 
2592
 
 
2593
static void stli_ecpdisable(struct stlibrd *brdp)
 
2594
{       
 
2595
        outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR));
 
2596
}
 
2597
 
 
2598
/*****************************************************************************/
 
2599
 
 
2600
static void __iomem *stli_ecpgetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
 
2601
{       
 
2602
        void __iomem *ptr;
 
2603
        unsigned char val;
 
2604
 
 
2605
        if (offset > brdp->memsize) {
 
2606
                printk(KERN_ERR "istallion: shared memory pointer=%x out of "
 
2607
                                "range at line=%d(%d), brd=%d\n",
 
2608
                        (int) offset, line, __LINE__, brdp->brdnr);
 
2609
                ptr = NULL;
 
2610
                val = 0;
 
2611
        } else {
 
2612
                ptr = brdp->membase + (offset % ECP_ATPAGESIZE);
 
2613
                val = (unsigned char) (offset / ECP_ATPAGESIZE);
 
2614
        }
 
2615
        outb(val, (brdp->iobase + ECP_ATMEMPR));
 
2616
        return(ptr);
 
2617
}
 
2618
 
 
2619
/*****************************************************************************/
 
2620
 
 
2621
static void stli_ecpreset(struct stlibrd *brdp)
 
2622
{       
 
2623
        outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR));
 
2624
        udelay(10);
 
2625
        outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR));
 
2626
        udelay(500);
 
2627
}
 
2628
 
 
2629
/*****************************************************************************/
 
2630
 
 
2631
static void stli_ecpintr(struct stlibrd *brdp)
 
2632
{       
 
2633
        outb(0x1, brdp->iobase);
 
2634
}
 
2635
 
 
2636
/*****************************************************************************/
 
2637
 
 
2638
/*
 
2639
 *      The following set of functions act on ECP EISA boards.
 
2640
 */
 
2641
 
 
2642
static void stli_ecpeiinit(struct stlibrd *brdp)
 
2643
{
 
2644
        unsigned long   memconf;
 
2645
 
 
2646
        outb(0x1, (brdp->iobase + ECP_EIBRDENAB));
 
2647
        outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR));
 
2648
        udelay(10);
 
2649
        outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
 
2650
        udelay(500);
 
2651
 
 
2652
        memconf = (brdp->memaddr & ECP_EIADDRMASKL) >> ECP_EIADDRSHFTL;
 
2653
        outb(memconf, (brdp->iobase + ECP_EIMEMARL));
 
2654
        memconf = (brdp->memaddr & ECP_EIADDRMASKH) >> ECP_EIADDRSHFTH;
 
2655
        outb(memconf, (brdp->iobase + ECP_EIMEMARH));
 
2656
}
 
2657
 
 
2658
/*****************************************************************************/
 
2659
 
 
2660
static void stli_ecpeienable(struct stlibrd *brdp)
 
2661
{       
 
2662
        outb(ECP_EIENABLE, (brdp->iobase + ECP_EICONFR));
 
2663
}
 
2664
 
 
2665
/*****************************************************************************/
 
2666
 
 
2667
static void stli_ecpeidisable(struct stlibrd *brdp)
 
2668
{       
 
2669
        outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
 
2670
}
 
2671
 
 
2672
/*****************************************************************************/
 
2673
 
 
2674
static void __iomem *stli_ecpeigetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
 
2675
{       
 
2676
        void __iomem *ptr;
 
2677
        unsigned char   val;
 
2678
 
 
2679
        if (offset > brdp->memsize) {
 
2680
                printk(KERN_ERR "istallion: shared memory pointer=%x out of "
 
2681
                                "range at line=%d(%d), brd=%d\n",
 
2682
                        (int) offset, line, __LINE__, brdp->brdnr);
 
2683
                ptr = NULL;
 
2684
                val = 0;
 
2685
        } else {
 
2686
                ptr = brdp->membase + (offset % ECP_EIPAGESIZE);
 
2687
                if (offset < ECP_EIPAGESIZE)
 
2688
                        val = ECP_EIENABLE;
 
2689
                else
 
2690
                        val = ECP_EIENABLE | 0x40;
 
2691
        }
 
2692
        outb(val, (brdp->iobase + ECP_EICONFR));
 
2693
        return(ptr);
 
2694
}
 
2695
 
 
2696
/*****************************************************************************/
 
2697
 
 
2698
static void stli_ecpeireset(struct stlibrd *brdp)
 
2699
{       
 
2700
        outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR));
 
2701
        udelay(10);
 
2702
        outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
 
2703
        udelay(500);
 
2704
}
 
2705
 
 
2706
/*****************************************************************************/
 
2707
 
 
2708
/*
 
2709
 *      The following set of functions act on ECP MCA boards.
 
2710
 */
 
2711
 
 
2712
static void stli_ecpmcenable(struct stlibrd *brdp)
 
2713
{       
 
2714
        outb(ECP_MCENABLE, (brdp->iobase + ECP_MCCONFR));
 
2715
}
 
2716
 
 
2717
/*****************************************************************************/
 
2718
 
 
2719
static void stli_ecpmcdisable(struct stlibrd *brdp)
 
2720
{       
 
2721
        outb(ECP_MCDISABLE, (brdp->iobase + ECP_MCCONFR));
 
2722
}
 
2723
 
 
2724
/*****************************************************************************/
 
2725
 
 
2726
static void __iomem *stli_ecpmcgetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
 
2727
{       
 
2728
        void __iomem *ptr;
 
2729
        unsigned char val;
 
2730
 
 
2731
        if (offset > brdp->memsize) {
 
2732
                printk(KERN_ERR "istallion: shared memory pointer=%x out of "
 
2733
                                "range at line=%d(%d), brd=%d\n",
 
2734
                        (int) offset, line, __LINE__, brdp->brdnr);
 
2735
                ptr = NULL;
 
2736
                val = 0;
 
2737
        } else {
 
2738
                ptr = brdp->membase + (offset % ECP_MCPAGESIZE);
 
2739
                val = ((unsigned char) (offset / ECP_MCPAGESIZE)) | ECP_MCENABLE;
 
2740
        }
 
2741
        outb(val, (brdp->iobase + ECP_MCCONFR));
 
2742
        return(ptr);
 
2743
}
 
2744
 
 
2745
/*****************************************************************************/
 
2746
 
 
2747
static void stli_ecpmcreset(struct stlibrd *brdp)
 
2748
{       
 
2749
        outb(ECP_MCSTOP, (brdp->iobase + ECP_MCCONFR));
 
2750
        udelay(10);
 
2751
        outb(ECP_MCDISABLE, (brdp->iobase + ECP_MCCONFR));
 
2752
        udelay(500);
 
2753
}
 
2754
 
 
2755
/*****************************************************************************/
 
2756
 
 
2757
/*
 
2758
 *      The following set of functions act on ECP PCI boards.
 
2759
 */
 
2760
 
 
2761
static void stli_ecppciinit(struct stlibrd *brdp)
 
2762
{
 
2763
        outb(ECP_PCISTOP, (brdp->iobase + ECP_PCICONFR));
 
2764
        udelay(10);
 
2765
        outb(0, (brdp->iobase + ECP_PCICONFR));
 
2766
        udelay(500);
 
2767
}
 
2768
 
 
2769
/*****************************************************************************/
 
2770
 
 
2771
static void __iomem *stli_ecppcigetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
 
2772
{       
 
2773
        void __iomem *ptr;
 
2774
        unsigned char   val;
 
2775
 
 
2776
        if (offset > brdp->memsize) {
 
2777
                printk(KERN_ERR "istallion: shared memory pointer=%x out of "
 
2778
                                "range at line=%d(%d), board=%d\n",
 
2779
                                (int) offset, line, __LINE__, brdp->brdnr);
 
2780
                ptr = NULL;
 
2781
                val = 0;
 
2782
        } else {
 
2783
                ptr = brdp->membase + (offset % ECP_PCIPAGESIZE);
 
2784
                val = (offset / ECP_PCIPAGESIZE) << 1;
 
2785
        }
 
2786
        outb(val, (brdp->iobase + ECP_PCICONFR));
 
2787
        return(ptr);
 
2788
}
 
2789
 
 
2790
/*****************************************************************************/
 
2791
 
 
2792
static void stli_ecppcireset(struct stlibrd *brdp)
 
2793
{       
 
2794
        outb(ECP_PCISTOP, (brdp->iobase + ECP_PCICONFR));
 
2795
        udelay(10);
 
2796
        outb(0, (brdp->iobase + ECP_PCICONFR));
 
2797
        udelay(500);
 
2798
}
 
2799
 
 
2800
/*****************************************************************************/
 
2801
 
 
2802
/*
 
2803
 *      The following routines act on ONboards.
 
2804
 */
 
2805
 
 
2806
static void stli_onbinit(struct stlibrd *brdp)
 
2807
{
 
2808
        unsigned long   memconf;
 
2809
 
 
2810
        outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR));
 
2811
        udelay(10);
 
2812
        outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR));
 
2813
        mdelay(1000);
 
2814
 
 
2815
        memconf = (brdp->memaddr & ONB_ATADDRMASK) >> ONB_ATADDRSHFT;
 
2816
        outb(memconf, (brdp->iobase + ONB_ATMEMAR));
 
2817
        outb(0x1, brdp->iobase);
 
2818
        mdelay(1);
 
2819
}
 
2820
 
 
2821
/*****************************************************************************/
 
2822
 
 
2823
static void stli_onbenable(struct stlibrd *brdp)
 
2824
{       
 
2825
        outb((brdp->enabval | ONB_ATENABLE), (brdp->iobase + ONB_ATCONFR));
 
2826
}
 
2827
 
 
2828
/*****************************************************************************/
 
2829
 
 
2830
static void stli_onbdisable(struct stlibrd *brdp)
 
2831
{       
 
2832
        outb((brdp->enabval | ONB_ATDISABLE), (brdp->iobase + ONB_ATCONFR));
 
2833
}
 
2834
 
 
2835
/*****************************************************************************/
 
2836
 
 
2837
static void __iomem *stli_onbgetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
 
2838
{       
 
2839
        void __iomem *ptr;
 
2840
 
 
2841
        if (offset > brdp->memsize) {
 
2842
                printk(KERN_ERR "istallion: shared memory pointer=%x out of "
 
2843
                                "range at line=%d(%d), brd=%d\n",
 
2844
                                (int) offset, line, __LINE__, brdp->brdnr);
 
2845
                ptr = NULL;
 
2846
        } else {
 
2847
                ptr = brdp->membase + (offset % ONB_ATPAGESIZE);
 
2848
        }
 
2849
        return(ptr);
 
2850
}
 
2851
 
 
2852
/*****************************************************************************/
 
2853
 
 
2854
static void stli_onbreset(struct stlibrd *brdp)
 
2855
{       
 
2856
        outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR));
 
2857
        udelay(10);
 
2858
        outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR));
 
2859
        mdelay(1000);
 
2860
}
 
2861
 
 
2862
/*****************************************************************************/
 
2863
 
 
2864
/*
 
2865
 *      The following routines act on ONboard EISA.
 
2866
 */
 
2867
 
 
2868
static void stli_onbeinit(struct stlibrd *brdp)
 
2869
{
 
2870
        unsigned long   memconf;
 
2871
 
 
2872
        outb(0x1, (brdp->iobase + ONB_EIBRDENAB));
 
2873
        outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR));
 
2874
        udelay(10);
 
2875
        outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
 
2876
        mdelay(1000);
 
2877
 
 
2878
        memconf = (brdp->memaddr & ONB_EIADDRMASKL) >> ONB_EIADDRSHFTL;
 
2879
        outb(memconf, (brdp->iobase + ONB_EIMEMARL));
 
2880
        memconf = (brdp->memaddr & ONB_EIADDRMASKH) >> ONB_EIADDRSHFTH;
 
2881
        outb(memconf, (brdp->iobase + ONB_EIMEMARH));
 
2882
        outb(0x1, brdp->iobase);
 
2883
        mdelay(1);
 
2884
}
 
2885
 
 
2886
/*****************************************************************************/
 
2887
 
 
2888
static void stli_onbeenable(struct stlibrd *brdp)
 
2889
{       
 
2890
        outb(ONB_EIENABLE, (brdp->iobase + ONB_EICONFR));
 
2891
}
 
2892
 
 
2893
/*****************************************************************************/
 
2894
 
 
2895
static void stli_onbedisable(struct stlibrd *brdp)
 
2896
{       
 
2897
        outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
 
2898
}
 
2899
 
 
2900
/*****************************************************************************/
 
2901
 
 
2902
static void __iomem *stli_onbegetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
 
2903
{       
 
2904
        void __iomem *ptr;
 
2905
        unsigned char val;
 
2906
 
 
2907
        if (offset > brdp->memsize) {
 
2908
                printk(KERN_ERR "istallion: shared memory pointer=%x out of "
 
2909
                                "range at line=%d(%d), brd=%d\n",
 
2910
                        (int) offset, line, __LINE__, brdp->brdnr);
 
2911
                ptr = NULL;
 
2912
                val = 0;
 
2913
        } else {
 
2914
                ptr = brdp->membase + (offset % ONB_EIPAGESIZE);
 
2915
                if (offset < ONB_EIPAGESIZE)
 
2916
                        val = ONB_EIENABLE;
 
2917
                else
 
2918
                        val = ONB_EIENABLE | 0x40;
 
2919
        }
 
2920
        outb(val, (brdp->iobase + ONB_EICONFR));
 
2921
        return(ptr);
 
2922
}
 
2923
 
 
2924
/*****************************************************************************/
 
2925
 
 
2926
static void stli_onbereset(struct stlibrd *brdp)
 
2927
{       
 
2928
        outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR));
 
2929
        udelay(10);
 
2930
        outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
 
2931
        mdelay(1000);
 
2932
}
 
2933
 
 
2934
/*****************************************************************************/
 
2935
 
 
2936
/*
 
2937
 *      The following routines act on Brumby boards.
 
2938
 */
 
2939
 
 
2940
static void stli_bbyinit(struct stlibrd *brdp)
 
2941
{
 
2942
        outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR));
 
2943
        udelay(10);
 
2944
        outb(0, (brdp->iobase + BBY_ATCONFR));
 
2945
        mdelay(1000);
 
2946
        outb(0x1, brdp->iobase);
 
2947
        mdelay(1);
 
2948
}
 
2949
 
 
2950
/*****************************************************************************/
 
2951
 
 
2952
static void __iomem *stli_bbygetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
 
2953
{       
 
2954
        void __iomem *ptr;
 
2955
        unsigned char val;
 
2956
 
 
2957
        BUG_ON(offset > brdp->memsize);
 
2958
 
 
2959
        ptr = brdp->membase + (offset % BBY_PAGESIZE);
 
2960
        val = (unsigned char) (offset / BBY_PAGESIZE);
 
2961
        outb(val, (brdp->iobase + BBY_ATCONFR));
 
2962
        return(ptr);
 
2963
}
 
2964
 
 
2965
/*****************************************************************************/
 
2966
 
 
2967
static void stli_bbyreset(struct stlibrd *brdp)
 
2968
{       
 
2969
        outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR));
 
2970
        udelay(10);
 
2971
        outb(0, (brdp->iobase + BBY_ATCONFR));
 
2972
        mdelay(1000);
 
2973
}
 
2974
 
 
2975
/*****************************************************************************/
 
2976
 
 
2977
/*
 
2978
 *      The following routines act on original old Stallion boards.
 
2979
 */
 
2980
 
 
2981
static void stli_stalinit(struct stlibrd *brdp)
 
2982
{
 
2983
        outb(0x1, brdp->iobase);
 
2984
        mdelay(1000);
 
2985
}
 
2986
 
 
2987
/*****************************************************************************/
 
2988
 
 
2989
static void __iomem *stli_stalgetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
 
2990
{       
 
2991
        BUG_ON(offset > brdp->memsize);
 
2992
        return brdp->membase + (offset % STAL_PAGESIZE);
 
2993
}
 
2994
 
 
2995
/*****************************************************************************/
 
2996
 
 
2997
static void stli_stalreset(struct stlibrd *brdp)
 
2998
{       
 
2999
        u32 __iomem *vecp;
 
3000
 
 
3001
        vecp = (u32 __iomem *) (brdp->membase + 0x30);
 
3002
        writel(0xffff0000, vecp);
 
3003
        outb(0, brdp->iobase);
 
3004
        mdelay(1000);
 
3005
}
 
3006
 
 
3007
/*****************************************************************************/
 
3008
 
 
3009
/*
 
3010
 *      Try to find an ECP board and initialize it. This handles only ECP
 
3011
 *      board types.
 
3012
 */
 
3013
 
 
3014
static int stli_initecp(struct stlibrd *brdp)
 
3015
{
 
3016
        cdkecpsig_t sig;
 
3017
        cdkecpsig_t __iomem *sigsp;
 
3018
        unsigned int status, nxtid;
 
3019
        char *name;
 
3020
        int retval, panelnr, nrports;
 
3021
 
 
3022
        if ((brdp->iobase == 0) || (brdp->memaddr == 0)) {
 
3023
                retval = -ENODEV;
 
3024
                goto err;
 
3025
        }
 
3026
 
 
3027
        brdp->iosize = ECP_IOSIZE;
 
3028
 
 
3029
        if (!request_region(brdp->iobase, brdp->iosize, "istallion")) {
 
3030
                retval = -EIO;
 
3031
                goto err;
 
3032
        }
 
3033
 
 
3034
/*
 
3035
 *      Based on the specific board type setup the common vars to access
 
3036
 *      and enable shared memory. Set all board specific information now
 
3037
 *      as well.
 
3038
 */
 
3039
        switch (brdp->brdtype) {
 
3040
        case BRD_ECP:
 
3041
                brdp->memsize = ECP_MEMSIZE;
 
3042
                brdp->pagesize = ECP_ATPAGESIZE;
 
3043
                brdp->init = stli_ecpinit;
 
3044
                brdp->enable = stli_ecpenable;
 
3045
                brdp->reenable = stli_ecpenable;
 
3046
                brdp->disable = stli_ecpdisable;
 
3047
                brdp->getmemptr = stli_ecpgetmemptr;
 
3048
                brdp->intr = stli_ecpintr;
 
3049
                brdp->reset = stli_ecpreset;
 
3050
                name = "serial(EC8/64)";
 
3051
                break;
 
3052
 
 
3053
        case BRD_ECPE:
 
3054
                brdp->memsize = ECP_MEMSIZE;
 
3055
                brdp->pagesize = ECP_EIPAGESIZE;
 
3056
                brdp->init = stli_ecpeiinit;
 
3057
                brdp->enable = stli_ecpeienable;
 
3058
                brdp->reenable = stli_ecpeienable;
 
3059
                brdp->disable = stli_ecpeidisable;
 
3060
                brdp->getmemptr = stli_ecpeigetmemptr;
 
3061
                brdp->intr = stli_ecpintr;
 
3062
                brdp->reset = stli_ecpeireset;
 
3063
                name = "serial(EC8/64-EI)";
 
3064
                break;
 
3065
 
 
3066
        case BRD_ECPMC:
 
3067
                brdp->memsize = ECP_MEMSIZE;
 
3068
                brdp->pagesize = ECP_MCPAGESIZE;
 
3069
                brdp->init = NULL;
 
3070
                brdp->enable = stli_ecpmcenable;
 
3071
                brdp->reenable = stli_ecpmcenable;
 
3072
                brdp->disable = stli_ecpmcdisable;
 
3073
                brdp->getmemptr = stli_ecpmcgetmemptr;
 
3074
                brdp->intr = stli_ecpintr;
 
3075
                brdp->reset = stli_ecpmcreset;
 
3076
                name = "serial(EC8/64-MCA)";
 
3077
                break;
 
3078
 
 
3079
        case BRD_ECPPCI:
 
3080
                brdp->memsize = ECP_PCIMEMSIZE;
 
3081
                brdp->pagesize = ECP_PCIPAGESIZE;
 
3082
                brdp->init = stli_ecppciinit;
 
3083
                brdp->enable = NULL;
 
3084
                brdp->reenable = NULL;
 
3085
                brdp->disable = NULL;
 
3086
                brdp->getmemptr = stli_ecppcigetmemptr;
 
3087
                brdp->intr = stli_ecpintr;
 
3088
                brdp->reset = stli_ecppcireset;
 
3089
                name = "serial(EC/RA-PCI)";
 
3090
                break;
 
3091
 
 
3092
        default:
 
3093
                retval = -EINVAL;
 
3094
                goto err_reg;
 
3095
        }
 
3096
 
 
3097
/*
 
3098
 *      The per-board operations structure is all set up, so now let's go
 
3099
 *      and get the board operational. Firstly initialize board configuration
 
3100
 *      registers. Set the memory mapping info so we can get at the boards
 
3101
 *      shared memory.
 
3102
 */
 
3103
        EBRDINIT(brdp);
 
3104
 
 
3105
        brdp->membase = ioremap_nocache(brdp->memaddr, brdp->memsize);
 
3106
        if (brdp->membase == NULL) {
 
3107
                retval = -ENOMEM;
 
3108
                goto err_reg;
 
3109
        }
 
3110
 
 
3111
/*
 
3112
 *      Now that all specific code is set up, enable the shared memory and
 
3113
 *      look for the a signature area that will tell us exactly what board
 
3114
 *      this is, and what it is connected to it.
 
3115
 */
 
3116
        EBRDENABLE(brdp);
 
3117
        sigsp = (cdkecpsig_t __iomem *) EBRDGETMEMPTR(brdp, CDK_SIGADDR);
 
3118
        memcpy_fromio(&sig, sigsp, sizeof(cdkecpsig_t));
 
3119
        EBRDDISABLE(brdp);
 
3120
 
 
3121
        if (sig.magic != cpu_to_le32(ECP_MAGIC)) {
 
3122
                retval = -ENODEV;
 
3123
                goto err_unmap;
 
3124
        }
 
3125
 
 
3126
/*
 
3127
 *      Scan through the signature looking at the panels connected to the
 
3128
 *      board. Calculate the total number of ports as we go.
 
3129
 */
 
3130
        for (panelnr = 0, nxtid = 0; (panelnr < STL_MAXPANELS); panelnr++) {
 
3131
                status = sig.panelid[nxtid];
 
3132
                if ((status & ECH_PNLIDMASK) != nxtid)
 
3133
                        break;
 
3134
 
 
3135
                brdp->panelids[panelnr] = status;
 
3136
                nrports = (status & ECH_PNL16PORT) ? 16 : 8;
 
3137
                if ((nrports == 16) && ((status & ECH_PNLXPID) == 0))
 
3138
                        nxtid++;
 
3139
                brdp->panels[panelnr] = nrports;
 
3140
                brdp->nrports += nrports;
 
3141
                nxtid++;
 
3142
                brdp->nrpanels++;
 
3143
        }
 
3144
 
 
3145
 
 
3146
        set_bit(BST_FOUND, &brdp->state);
 
3147
        return 0;
 
3148
err_unmap:
 
3149
        iounmap(brdp->membase);
 
3150
        brdp->membase = NULL;
 
3151
err_reg:
 
3152
        release_region(brdp->iobase, brdp->iosize);
 
3153
err:
 
3154
        return retval;
 
3155
}
 
3156
 
 
3157
/*****************************************************************************/
 
3158
 
 
3159
/*
 
3160
 *      Try to find an ONboard, Brumby or Stallion board and initialize it.
 
3161
 *      This handles only these board types.
 
3162
 */
 
3163
 
 
3164
static int stli_initonb(struct stlibrd *brdp)
 
3165
{
 
3166
        cdkonbsig_t sig;
 
3167
        cdkonbsig_t __iomem *sigsp;
 
3168
        char *name;
 
3169
        int i, retval;
 
3170
 
 
3171
/*
 
3172
 *      Do a basic sanity check on the IO and memory addresses.
 
3173
 */
 
3174
        if (brdp->iobase == 0 || brdp->memaddr == 0) {
 
3175
                retval = -ENODEV;
 
3176
                goto err;
 
3177
        }
 
3178
 
 
3179
        brdp->iosize = ONB_IOSIZE;
 
3180
        
 
3181
        if (!request_region(brdp->iobase, brdp->iosize, "istallion")) {
 
3182
                retval = -EIO;
 
3183
                goto err;
 
3184
        }
 
3185
 
 
3186
/*
 
3187
 *      Based on the specific board type setup the common vars to access
 
3188
 *      and enable shared memory. Set all board specific information now
 
3189
 *      as well.
 
3190
 */
 
3191
        switch (brdp->brdtype) {
 
3192
        case BRD_ONBOARD:
 
3193
        case BRD_ONBOARD2:
 
3194
                brdp->memsize = ONB_MEMSIZE;
 
3195
                brdp->pagesize = ONB_ATPAGESIZE;
 
3196
                brdp->init = stli_onbinit;
 
3197
                brdp->enable = stli_onbenable;
 
3198
                brdp->reenable = stli_onbenable;
 
3199
                brdp->disable = stli_onbdisable;
 
3200
                brdp->getmemptr = stli_onbgetmemptr;
 
3201
                brdp->intr = stli_ecpintr;
 
3202
                brdp->reset = stli_onbreset;
 
3203
                if (brdp->memaddr > 0x100000)
 
3204
                        brdp->enabval = ONB_MEMENABHI;
 
3205
                else
 
3206
                        brdp->enabval = ONB_MEMENABLO;
 
3207
                name = "serial(ONBoard)";
 
3208
                break;
 
3209
 
 
3210
        case BRD_ONBOARDE:
 
3211
                brdp->memsize = ONB_EIMEMSIZE;
 
3212
                brdp->pagesize = ONB_EIPAGESIZE;
 
3213
                brdp->init = stli_onbeinit;
 
3214
                brdp->enable = stli_onbeenable;
 
3215
                brdp->reenable = stli_onbeenable;
 
3216
                brdp->disable = stli_onbedisable;
 
3217
                brdp->getmemptr = stli_onbegetmemptr;
 
3218
                brdp->intr = stli_ecpintr;
 
3219
                brdp->reset = stli_onbereset;
 
3220
                name = "serial(ONBoard/E)";
 
3221
                break;
 
3222
 
 
3223
        case BRD_BRUMBY4:
 
3224
                brdp->memsize = BBY_MEMSIZE;
 
3225
                brdp->pagesize = BBY_PAGESIZE;
 
3226
                brdp->init = stli_bbyinit;
 
3227
                brdp->enable = NULL;
 
3228
                brdp->reenable = NULL;
 
3229
                brdp->disable = NULL;
 
3230
                brdp->getmemptr = stli_bbygetmemptr;
 
3231
                brdp->intr = stli_ecpintr;
 
3232
                brdp->reset = stli_bbyreset;
 
3233
                name = "serial(Brumby)";
 
3234
                break;
 
3235
 
 
3236
        case BRD_STALLION:
 
3237
                brdp->memsize = STAL_MEMSIZE;
 
3238
                brdp->pagesize = STAL_PAGESIZE;
 
3239
                brdp->init = stli_stalinit;
 
3240
                brdp->enable = NULL;
 
3241
                brdp->reenable = NULL;
 
3242
                brdp->disable = NULL;
 
3243
                brdp->getmemptr = stli_stalgetmemptr;
 
3244
                brdp->intr = stli_ecpintr;
 
3245
                brdp->reset = stli_stalreset;
 
3246
                name = "serial(Stallion)";
 
3247
                break;
 
3248
 
 
3249
        default:
 
3250
                retval = -EINVAL;
 
3251
                goto err_reg;
 
3252
        }
 
3253
 
 
3254
/*
 
3255
 *      The per-board operations structure is all set up, so now let's go
 
3256
 *      and get the board operational. Firstly initialize board configuration
 
3257
 *      registers. Set the memory mapping info so we can get at the boards
 
3258
 *      shared memory.
 
3259
 */
 
3260
        EBRDINIT(brdp);
 
3261
 
 
3262
        brdp->membase = ioremap_nocache(brdp->memaddr, brdp->memsize);
 
3263
        if (brdp->membase == NULL) {
 
3264
                retval = -ENOMEM;
 
3265
                goto err_reg;
 
3266
        }
 
3267
 
 
3268
/*
 
3269
 *      Now that all specific code is set up, enable the shared memory and
 
3270
 *      look for the a signature area that will tell us exactly what board
 
3271
 *      this is, and how many ports.
 
3272
 */
 
3273
        EBRDENABLE(brdp);
 
3274
        sigsp = (cdkonbsig_t __iomem *) EBRDGETMEMPTR(brdp, CDK_SIGADDR);
 
3275
        memcpy_fromio(&sig, sigsp, sizeof(cdkonbsig_t));
 
3276
        EBRDDISABLE(brdp);
 
3277
 
 
3278
        if (sig.magic0 != cpu_to_le16(ONB_MAGIC0) ||
 
3279
            sig.magic1 != cpu_to_le16(ONB_MAGIC1) ||
 
3280
            sig.magic2 != cpu_to_le16(ONB_MAGIC2) ||
 
3281
            sig.magic3 != cpu_to_le16(ONB_MAGIC3)) {
 
3282
                retval = -ENODEV;
 
3283
                goto err_unmap;
 
3284
        }
 
3285
 
 
3286
/*
 
3287
 *      Scan through the signature alive mask and calculate how many ports
 
3288
 *      there are on this board.
 
3289
 */
 
3290
        brdp->nrpanels = 1;
 
3291
        if (sig.amask1) {
 
3292
                brdp->nrports = 32;
 
3293
        } else {
 
3294
                for (i = 0; (i < 16); i++) {
 
3295
                        if (((sig.amask0 << i) & 0x8000) == 0)
 
3296
                                break;
 
3297
                }
 
3298
                brdp->nrports = i;
 
3299
        }
 
3300
        brdp->panels[0] = brdp->nrports;
 
3301
 
 
3302
 
 
3303
        set_bit(BST_FOUND, &brdp->state);
 
3304
        return 0;
 
3305
err_unmap:
 
3306
        iounmap(brdp->membase);
 
3307
        brdp->membase = NULL;
 
3308
err_reg:
 
3309
        release_region(brdp->iobase, brdp->iosize);
 
3310
err:
 
3311
        return retval;
 
3312
}
 
3313
 
 
3314
/*****************************************************************************/
 
3315
 
 
3316
/*
 
3317
 *      Start up a running board. This routine is only called after the
 
3318
 *      code has been down loaded to the board and is operational. It will
 
3319
 *      read in the memory map, and get the show on the road...
 
3320
 */
 
3321
 
 
3322
static int stli_startbrd(struct stlibrd *brdp)
 
3323
{
 
3324
        cdkhdr_t __iomem *hdrp;
 
3325
        cdkmem_t __iomem *memp;
 
3326
        cdkasy_t __iomem *ap;
 
3327
        unsigned long flags;
 
3328
        unsigned int portnr, nrdevs, i;
 
3329
        struct stliport *portp;
 
3330
        int rc = 0;
 
3331
        u32 memoff;
 
3332
 
 
3333
        spin_lock_irqsave(&brd_lock, flags);
 
3334
        EBRDENABLE(brdp);
 
3335
        hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
 
3336
        nrdevs = hdrp->nrdevs;
 
3337
 
 
3338
#if 0
 
3339
        printk("%s(%d): CDK version %d.%d.%d --> "
 
3340
                "nrdevs=%d memp=%x hostp=%x slavep=%x\n",
 
3341
                 __FILE__, __LINE__, readb(&hdrp->ver_release), readb(&hdrp->ver_modification),
 
3342
                 readb(&hdrp->ver_fix), nrdevs, (int) readl(&hdrp->memp), readl(&hdrp->hostp),
 
3343
                 readl(&hdrp->slavep));
 
3344
#endif
 
3345
 
 
3346
        if (nrdevs < (brdp->nrports + 1)) {
 
3347
                printk(KERN_ERR "istallion: slave failed to allocate memory for "
 
3348
                                "all devices, devices=%d\n", nrdevs);
 
3349
                brdp->nrports = nrdevs - 1;
 
3350
        }
 
3351
        brdp->nrdevs = nrdevs;
 
3352
        brdp->hostoffset = hdrp->hostp - CDK_CDKADDR;
 
3353
        brdp->slaveoffset = hdrp->slavep - CDK_CDKADDR;
 
3354
        brdp->bitsize = (nrdevs + 7) / 8;
 
3355
        memoff = readl(&hdrp->memp);
 
3356
        if (memoff > brdp->memsize) {
 
3357
                printk(KERN_ERR "istallion: corrupted shared memory region?\n");
 
3358
                rc = -EIO;
 
3359
                goto stli_donestartup;
 
3360
        }
 
3361
        memp = (cdkmem_t __iomem *) EBRDGETMEMPTR(brdp, memoff);
 
3362
        if (readw(&memp->dtype) != TYP_ASYNCTRL) {
 
3363
                printk(KERN_ERR "istallion: no slave control device found\n");
 
3364
                goto stli_donestartup;
 
3365
        }
 
3366
        memp++;
 
3367
 
 
3368
/*
 
3369
 *      Cycle through memory allocation of each port. We are guaranteed to
 
3370
 *      have all ports inside the first page of slave window, so no need to
 
3371
 *      change pages while reading memory map.
 
3372
 */
 
3373
        for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++, memp++) {
 
3374
                if (readw(&memp->dtype) != TYP_ASYNC)
 
3375
                        break;
 
3376
                portp = brdp->ports[portnr];
 
3377
                if (portp == NULL)
 
3378
                        break;
 
3379
                portp->devnr = i;
 
3380
                portp->addr = readl(&memp->offset);
 
3381
                portp->reqbit = (unsigned char) (0x1 << (i * 8 / nrdevs));
 
3382
                portp->portidx = (unsigned char) (i / 8);
 
3383
                portp->portbit = (unsigned char) (0x1 << (i % 8));
 
3384
        }
 
3385
 
 
3386
        writeb(0xff, &hdrp->slavereq);
 
3387
 
 
3388
/*
 
3389
 *      For each port setup a local copy of the RX and TX buffer offsets
 
3390
 *      and sizes. We do this separate from the above, because we need to
 
3391
 *      move the shared memory page...
 
3392
 */
 
3393
        for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++) {
 
3394
                portp = brdp->ports[portnr];
 
3395
                if (portp == NULL)
 
3396
                        break;
 
3397
                if (portp->addr == 0)
 
3398
                        break;
 
3399
                ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
 
3400
                if (ap != NULL) {
 
3401
                        portp->rxsize = readw(&ap->rxq.size);
 
3402
                        portp->txsize = readw(&ap->txq.size);
 
3403
                        portp->rxoffset = readl(&ap->rxq.offset);
 
3404
                        portp->txoffset = readl(&ap->txq.offset);
 
3405
                }
 
3406
        }
 
3407
 
 
3408
stli_donestartup:
 
3409
        EBRDDISABLE(brdp);
 
3410
        spin_unlock_irqrestore(&brd_lock, flags);
 
3411
 
 
3412
        if (rc == 0)
 
3413
                set_bit(BST_STARTED, &brdp->state);
 
3414
 
 
3415
        if (! stli_timeron) {
 
3416
                stli_timeron++;
 
3417
                mod_timer(&stli_timerlist, STLI_TIMEOUT);
 
3418
        }
 
3419
 
 
3420
        return rc;
 
3421
}
 
3422
 
 
3423
/*****************************************************************************/
 
3424
 
 
3425
/*
 
3426
 *      Probe and initialize the specified board.
 
3427
 */
 
3428
 
 
3429
static int __devinit stli_brdinit(struct stlibrd *brdp)
 
3430
{
 
3431
        int retval;
 
3432
 
 
3433
        switch (brdp->brdtype) {
 
3434
        case BRD_ECP:
 
3435
        case BRD_ECPE:
 
3436
        case BRD_ECPMC:
 
3437
        case BRD_ECPPCI:
 
3438
                retval = stli_initecp(brdp);
 
3439
                break;
 
3440
        case BRD_ONBOARD:
 
3441
        case BRD_ONBOARDE:
 
3442
        case BRD_ONBOARD2:
 
3443
        case BRD_BRUMBY4:
 
3444
        case BRD_STALLION:
 
3445
                retval = stli_initonb(brdp);
 
3446
                break;
 
3447
        default:
 
3448
                printk(KERN_ERR "istallion: board=%d is unknown board "
 
3449
                                "type=%d\n", brdp->brdnr, brdp->brdtype);
 
3450
                retval = -ENODEV;
 
3451
        }
 
3452
 
 
3453
        if (retval)
 
3454
                return retval;
 
3455
 
 
3456
        stli_initports(brdp);
 
3457
        printk(KERN_INFO "istallion: %s found, board=%d io=%x mem=%x "
 
3458
                "nrpanels=%d nrports=%d\n", stli_brdnames[brdp->brdtype],
 
3459
                brdp->brdnr, brdp->iobase, (int) brdp->memaddr,
 
3460
                brdp->nrpanels, brdp->nrports);
 
3461
        return 0;
 
3462
}
 
3463
 
 
3464
#if STLI_EISAPROBE != 0
 
3465
/*****************************************************************************/
 
3466
 
 
3467
/*
 
3468
 *      Probe around trying to find where the EISA boards shared memory
 
3469
 *      might be. This is a bit if hack, but it is the best we can do.
 
3470
 */
 
3471
 
 
3472
static int stli_eisamemprobe(struct stlibrd *brdp)
 
3473
{
 
3474
        cdkecpsig_t     ecpsig, __iomem *ecpsigp;
 
3475
        cdkonbsig_t     onbsig, __iomem *onbsigp;
 
3476
        int             i, foundit;
 
3477
 
 
3478
/*
 
3479
 *      First up we reset the board, to get it into a known state. There
 
3480
 *      is only 2 board types here we need to worry about. Don;t use the
 
3481
 *      standard board init routine here, it programs up the shared
 
3482
 *      memory address, and we don't know it yet...
 
3483
 */
 
3484
        if (brdp->brdtype == BRD_ECPE) {
 
3485
                outb(0x1, (brdp->iobase + ECP_EIBRDENAB));
 
3486
                outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR));
 
3487
                udelay(10);
 
3488
                outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
 
3489
                udelay(500);
 
3490
                stli_ecpeienable(brdp);
 
3491
        } else if (brdp->brdtype == BRD_ONBOARDE) {
 
3492
                outb(0x1, (brdp->iobase + ONB_EIBRDENAB));
 
3493
                outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR));
 
3494
                udelay(10);
 
3495
                outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
 
3496
                mdelay(100);
 
3497
                outb(0x1, brdp->iobase);
 
3498
                mdelay(1);
 
3499
                stli_onbeenable(brdp);
 
3500
        } else {
 
3501
                return -ENODEV;
 
3502
        }
 
3503
 
 
3504
        foundit = 0;
 
3505
        brdp->memsize = ECP_MEMSIZE;
 
3506
 
 
3507
/*
 
3508
 *      Board shared memory is enabled, so now we have a poke around and
 
3509
 *      see if we can find it.
 
3510
 */
 
3511
        for (i = 0; (i < stli_eisamempsize); i++) {
 
3512
                brdp->memaddr = stli_eisamemprobeaddrs[i];
 
3513
                brdp->membase = ioremap_nocache(brdp->memaddr, brdp->memsize);
 
3514
                if (brdp->membase == NULL)
 
3515
                        continue;
 
3516
 
 
3517
                if (brdp->brdtype == BRD_ECPE) {
 
3518
                        ecpsigp = stli_ecpeigetmemptr(brdp,
 
3519
                                CDK_SIGADDR, __LINE__);
 
3520
                        memcpy_fromio(&ecpsig, ecpsigp, sizeof(cdkecpsig_t));
 
3521
                        if (ecpsig.magic == cpu_to_le32(ECP_MAGIC))
 
3522
                                foundit = 1;
 
3523
                } else {
 
3524
                        onbsigp = (cdkonbsig_t __iomem *) stli_onbegetmemptr(brdp,
 
3525
                                CDK_SIGADDR, __LINE__);
 
3526
                        memcpy_fromio(&onbsig, onbsigp, sizeof(cdkonbsig_t));
 
3527
                        if ((onbsig.magic0 == cpu_to_le16(ONB_MAGIC0)) &&
 
3528
                            (onbsig.magic1 == cpu_to_le16(ONB_MAGIC1)) &&
 
3529
                            (onbsig.magic2 == cpu_to_le16(ONB_MAGIC2)) &&
 
3530
                            (onbsig.magic3 == cpu_to_le16(ONB_MAGIC3)))
 
3531
                                foundit = 1;
 
3532
                }
 
3533
 
 
3534
                iounmap(brdp->membase);
 
3535
                if (foundit)
 
3536
                        break;
 
3537
        }
 
3538
 
 
3539
/*
 
3540
 *      Regardless of whether we found the shared memory or not we must
 
3541
 *      disable the region. After that return success or failure.
 
3542
 */
 
3543
        if (brdp->brdtype == BRD_ECPE)
 
3544
                stli_ecpeidisable(brdp);
 
3545
        else
 
3546
                stli_onbedisable(brdp);
 
3547
 
 
3548
        if (! foundit) {
 
3549
                brdp->memaddr = 0;
 
3550
                brdp->membase = NULL;
 
3551
                printk(KERN_ERR "istallion: failed to probe shared memory "
 
3552
                                "region for %s in EISA slot=%d\n",
 
3553
                        stli_brdnames[brdp->brdtype], (brdp->iobase >> 12));
 
3554
                return -ENODEV;
 
3555
        }
 
3556
        return 0;
 
3557
}
 
3558
#endif
 
3559
 
 
3560
static int stli_getbrdnr(void)
 
3561
{
 
3562
        unsigned int i;
 
3563
 
 
3564
        for (i = 0; i < STL_MAXBRDS; i++) {
 
3565
                if (!stli_brds[i]) {
 
3566
                        if (i >= stli_nrbrds)
 
3567
                                stli_nrbrds = i + 1;
 
3568
                        return i;
 
3569
                }
 
3570
        }
 
3571
        return -1;
 
3572
}
 
3573
 
 
3574
#if STLI_EISAPROBE != 0
 
3575
/*****************************************************************************/
 
3576
 
 
3577
/*
 
3578
 *      Probe around and try to find any EISA boards in system. The biggest
 
3579
 *      problem here is finding out what memory address is associated with
 
3580
 *      an EISA board after it is found. The registers of the ECPE and
 
3581
 *      ONboardE are not readable - so we can't read them from there. We
 
3582
 *      don't have access to the EISA CMOS (or EISA BIOS) so we don't
 
3583
 *      actually have any way to find out the real value. The best we can
 
3584
 *      do is go probing around in the usual places hoping we can find it.
 
3585
 */
 
3586
 
 
3587
static int __init stli_findeisabrds(void)
 
3588
{
 
3589
        struct stlibrd *brdp;
 
3590
        unsigned int iobase, eid, i;
 
3591
        int brdnr, found = 0;
 
3592
 
 
3593
/*
 
3594
 *      Firstly check if this is an EISA system.  If this is not an EISA system then
 
3595
 *      don't bother going any further!
 
3596
 */
 
3597
        if (EISA_bus)
 
3598
                return 0;
 
3599
 
 
3600
/*
 
3601
 *      Looks like an EISA system, so go searching for EISA boards.
 
3602
 */
 
3603
        for (iobase = 0x1000; (iobase <= 0xc000); iobase += 0x1000) {
 
3604
                outb(0xff, (iobase + 0xc80));
 
3605
                eid = inb(iobase + 0xc80);
 
3606
                eid |= inb(iobase + 0xc81) << 8;
 
3607
                if (eid != STL_EISAID)
 
3608
                        continue;
 
3609
 
 
3610
/*
 
3611
 *              We have found a board. Need to check if this board was
 
3612
 *              statically configured already (just in case!).
 
3613
 */
 
3614
                for (i = 0; (i < STL_MAXBRDS); i++) {
 
3615
                        brdp = stli_brds[i];
 
3616
                        if (brdp == NULL)
 
3617
                                continue;
 
3618
                        if (brdp->iobase == iobase)
 
3619
                                break;
 
3620
                }
 
3621
                if (i < STL_MAXBRDS)
 
3622
                        continue;
 
3623
 
 
3624
/*
 
3625
 *              We have found a Stallion board and it is not configured already.
 
3626
 *              Allocate a board structure and initialize it.
 
3627
 */
 
3628
                if ((brdp = stli_allocbrd()) == NULL)
 
3629
                        return found ? : -ENOMEM;
 
3630
                brdnr = stli_getbrdnr();
 
3631
                if (brdnr < 0)
 
3632
                        return found ? : -ENOMEM;
 
3633
                brdp->brdnr = (unsigned int)brdnr;
 
3634
                eid = inb(iobase + 0xc82);
 
3635
                if (eid == ECP_EISAID)
 
3636
                        brdp->brdtype = BRD_ECPE;
 
3637
                else if (eid == ONB_EISAID)
 
3638
                        brdp->brdtype = BRD_ONBOARDE;
 
3639
                else
 
3640
                        brdp->brdtype = BRD_UNKNOWN;
 
3641
                brdp->iobase = iobase;
 
3642
                outb(0x1, (iobase + 0xc84));
 
3643
                if (stli_eisamemprobe(brdp))
 
3644
                        outb(0, (iobase + 0xc84));
 
3645
                if (stli_brdinit(brdp) < 0) {
 
3646
                        kfree(brdp);
 
3647
                        continue;
 
3648
                }
 
3649
 
 
3650
                stli_brds[brdp->brdnr] = brdp;
 
3651
                found++;
 
3652
 
 
3653
                for (i = 0; i < brdp->nrports; i++)
 
3654
                        tty_register_device(stli_serial,
 
3655
                                        brdp->brdnr * STL_MAXPORTS + i, NULL);
 
3656
        }
 
3657
 
 
3658
        return found;
 
3659
}
 
3660
#else
 
3661
static inline int stli_findeisabrds(void) { return 0; }
 
3662
#endif
 
3663
 
 
3664
/*****************************************************************************/
 
3665
 
 
3666
/*
 
3667
 *      Find the next available board number that is free.
 
3668
 */
 
3669
 
 
3670
/*****************************************************************************/
 
3671
 
 
3672
/*
 
3673
 *      We have a Stallion board. Allocate a board structure and
 
3674
 *      initialize it. Read its IO and MEMORY resources from PCI
 
3675
 *      configuration space.
 
3676
 */
 
3677
 
 
3678
static int __devinit stli_pciprobe(struct pci_dev *pdev,
 
3679
                const struct pci_device_id *ent)
 
3680
{
 
3681
        struct stlibrd *brdp;
 
3682
        unsigned int i;
 
3683
        int brdnr, retval = -EIO;
 
3684
 
 
3685
        retval = pci_enable_device(pdev);
 
3686
        if (retval)
 
3687
                goto err;
 
3688
        brdp = stli_allocbrd();
 
3689
        if (brdp == NULL) {
 
3690
                retval = -ENOMEM;
 
3691
                goto err;
 
3692
        }
 
3693
        mutex_lock(&stli_brdslock);
 
3694
        brdnr = stli_getbrdnr();
 
3695
        if (brdnr < 0) {
 
3696
                printk(KERN_INFO "istallion: too many boards found, "
 
3697
                        "maximum supported %d\n", STL_MAXBRDS);
 
3698
                mutex_unlock(&stli_brdslock);
 
3699
                retval = -EIO;
 
3700
                goto err_fr;
 
3701
        }
 
3702
        brdp->brdnr = (unsigned int)brdnr;
 
3703
        stli_brds[brdp->brdnr] = brdp;
 
3704
        mutex_unlock(&stli_brdslock);
 
3705
        brdp->brdtype = BRD_ECPPCI;
 
3706
/*
 
3707
 *      We have all resources from the board, so lets setup the actual
 
3708
 *      board structure now.
 
3709
 */
 
3710
        brdp->iobase = pci_resource_start(pdev, 3);
 
3711
        brdp->memaddr = pci_resource_start(pdev, 2);
 
3712
        retval = stli_brdinit(brdp);
 
3713
        if (retval)
 
3714
                goto err_null;
 
3715
 
 
3716
        set_bit(BST_PROBED, &brdp->state);
 
3717
        pci_set_drvdata(pdev, brdp);
 
3718
 
 
3719
        EBRDENABLE(brdp);
 
3720
        brdp->enable = NULL;
 
3721
        brdp->disable = NULL;
 
3722
 
 
3723
        for (i = 0; i < brdp->nrports; i++)
 
3724
                tty_register_device(stli_serial, brdp->brdnr * STL_MAXPORTS + i,
 
3725
                                &pdev->dev);
 
3726
 
 
3727
        return 0;
 
3728
err_null:
 
3729
        stli_brds[brdp->brdnr] = NULL;
 
3730
err_fr:
 
3731
        kfree(brdp);
 
3732
err:
 
3733
        return retval;
 
3734
}
 
3735
 
 
3736
static void __devexit stli_pciremove(struct pci_dev *pdev)
 
3737
{
 
3738
        struct stlibrd *brdp = pci_get_drvdata(pdev);
 
3739
 
 
3740
        stli_cleanup_ports(brdp);
 
3741
 
 
3742
        iounmap(brdp->membase);
 
3743
        if (brdp->iosize > 0)
 
3744
                release_region(brdp->iobase, brdp->iosize);
 
3745
 
 
3746
        stli_brds[brdp->brdnr] = NULL;
 
3747
        kfree(brdp);
 
3748
}
 
3749
 
 
3750
static struct pci_driver stli_pcidriver = {
 
3751
        .name = "istallion",
 
3752
        .id_table = istallion_pci_tbl,
 
3753
        .probe = stli_pciprobe,
 
3754
        .remove = __devexit_p(stli_pciremove)
 
3755
};
 
3756
/*****************************************************************************/
 
3757
 
 
3758
/*
 
3759
 *      Allocate a new board structure. Fill out the basic info in it.
 
3760
 */
 
3761
 
 
3762
static struct stlibrd *stli_allocbrd(void)
 
3763
{
 
3764
        struct stlibrd *brdp;
 
3765
 
 
3766
        brdp = kzalloc(sizeof(struct stlibrd), GFP_KERNEL);
 
3767
        if (!brdp) {
 
3768
                printk(KERN_ERR "istallion: failed to allocate memory "
 
3769
                                "(size=%Zd)\n", sizeof(struct stlibrd));
 
3770
                return NULL;
 
3771
        }
 
3772
        brdp->magic = STLI_BOARDMAGIC;
 
3773
        return brdp;
 
3774
}
 
3775
 
 
3776
/*****************************************************************************/
 
3777
 
 
3778
/*
 
3779
 *      Scan through all the boards in the configuration and see what we
 
3780
 *      can find.
 
3781
 */
 
3782
 
 
3783
static int __init stli_initbrds(void)
 
3784
{
 
3785
        struct stlibrd *brdp, *nxtbrdp;
 
3786
        struct stlconf conf;
 
3787
        unsigned int i, j, found = 0;
 
3788
        int retval;
 
3789
 
 
3790
        for (stli_nrbrds = 0; stli_nrbrds < ARRAY_SIZE(stli_brdsp);
 
3791
                        stli_nrbrds++) {
 
3792
                memset(&conf, 0, sizeof(conf));
 
3793
                if (stli_parsebrd(&conf, stli_brdsp[stli_nrbrds]) == 0)
 
3794
                        continue;
 
3795
                if ((brdp = stli_allocbrd()) == NULL)
 
3796
                        continue;
 
3797
                brdp->brdnr = stli_nrbrds;
 
3798
                brdp->brdtype = conf.brdtype;
 
3799
                brdp->iobase = conf.ioaddr1;
 
3800
                brdp->memaddr = conf.memaddr;
 
3801
                if (stli_brdinit(brdp) < 0) {
 
3802
                        kfree(brdp);
 
3803
                        continue;
 
3804
                }
 
3805
                stli_brds[brdp->brdnr] = brdp;
 
3806
                found++;
 
3807
 
 
3808
                for (i = 0; i < brdp->nrports; i++)
 
3809
                        tty_register_device(stli_serial,
 
3810
                                        brdp->brdnr * STL_MAXPORTS + i, NULL);
 
3811
        }
 
3812
 
 
3813
        retval = stli_findeisabrds();
 
3814
        if (retval > 0)
 
3815
                found += retval;
 
3816
 
 
3817
/*
 
3818
 *      All found boards are initialized. Now for a little optimization, if
 
3819
 *      no boards are sharing the "shared memory" regions then we can just
 
3820
 *      leave them all enabled. This is in fact the usual case.
 
3821
 */
 
3822
        stli_shared = 0;
 
3823
        if (stli_nrbrds > 1) {
 
3824
                for (i = 0; (i < stli_nrbrds); i++) {
 
3825
                        brdp = stli_brds[i];
 
3826
                        if (brdp == NULL)
 
3827
                                continue;
 
3828
                        for (j = i + 1; (j < stli_nrbrds); j++) {
 
3829
                                nxtbrdp = stli_brds[j];
 
3830
                                if (nxtbrdp == NULL)
 
3831
                                        continue;
 
3832
                                if ((brdp->membase >= nxtbrdp->membase) &&
 
3833
                                    (brdp->membase <= (nxtbrdp->membase +
 
3834
                                    nxtbrdp->memsize - 1))) {
 
3835
                                        stli_shared++;
 
3836
                                        break;
 
3837
                                }
 
3838
                        }
 
3839
                }
 
3840
        }
 
3841
 
 
3842
        if (stli_shared == 0) {
 
3843
                for (i = 0; (i < stli_nrbrds); i++) {
 
3844
                        brdp = stli_brds[i];
 
3845
                        if (brdp == NULL)
 
3846
                                continue;
 
3847
                        if (test_bit(BST_FOUND, &brdp->state)) {
 
3848
                                EBRDENABLE(brdp);
 
3849
                                brdp->enable = NULL;
 
3850
                                brdp->disable = NULL;
 
3851
                        }
 
3852
                }
 
3853
        }
 
3854
 
 
3855
        retval = pci_register_driver(&stli_pcidriver);
 
3856
        if (retval && found == 0) {
 
3857
                printk(KERN_ERR "Neither isa nor eisa cards found nor pci "
 
3858
                                "driver can be registered!\n");
 
3859
                goto err;
 
3860
        }
 
3861
 
 
3862
        return 0;
 
3863
err:
 
3864
        return retval;
 
3865
}
 
3866
 
 
3867
/*****************************************************************************/
 
3868
 
 
3869
/*
 
3870
 *      Code to handle an "staliomem" read operation. This device is the 
 
3871
 *      contents of the board shared memory. It is used for down loading
 
3872
 *      the slave image (and debugging :-)
 
3873
 */
 
3874
 
 
3875
static ssize_t stli_memread(struct file *fp, char __user *buf, size_t count, loff_t *offp)
 
3876
{
 
3877
        unsigned long flags;
 
3878
        void __iomem *memptr;
 
3879
        struct stlibrd *brdp;
 
3880
        unsigned int brdnr;
 
3881
        int size, n;
 
3882
        void *p;
 
3883
        loff_t off = *offp;
 
3884
 
 
3885
        brdnr = iminor(fp->f_path.dentry->d_inode);
 
3886
        if (brdnr >= stli_nrbrds)
 
3887
                return -ENODEV;
 
3888
        brdp = stli_brds[brdnr];
 
3889
        if (brdp == NULL)
 
3890
                return -ENODEV;
 
3891
        if (brdp->state == 0)
 
3892
                return -ENODEV;
 
3893
        if (off >= brdp->memsize || off + count < off)
 
3894
                return 0;
 
3895
 
 
3896
        size = min(count, (size_t)(brdp->memsize - off));
 
3897
 
 
3898
        /*
 
3899
         *      Copy the data a page at a time
 
3900
         */
 
3901
 
 
3902
        p = (void *)__get_free_page(GFP_KERNEL);
 
3903
        if(p == NULL)
 
3904
                return -ENOMEM;
 
3905
 
 
3906
        while (size > 0) {
 
3907
                spin_lock_irqsave(&brd_lock, flags);
 
3908
                EBRDENABLE(brdp);
 
3909
                memptr = EBRDGETMEMPTR(brdp, off);
 
3910
                n = min(size, (int)(brdp->pagesize - (((unsigned long) off) % brdp->pagesize)));
 
3911
                n = min(n, (int)PAGE_SIZE);
 
3912
                memcpy_fromio(p, memptr, n);
 
3913
                EBRDDISABLE(brdp);
 
3914
                spin_unlock_irqrestore(&brd_lock, flags);
 
3915
                if (copy_to_user(buf, p, n)) {
 
3916
                        count = -EFAULT;
 
3917
                        goto out;
 
3918
                }
 
3919
                off += n;
 
3920
                buf += n;
 
3921
                size -= n;
 
3922
        }
 
3923
out:
 
3924
        *offp = off;
 
3925
        free_page((unsigned long)p);
 
3926
        return count;
 
3927
}
 
3928
 
 
3929
/*****************************************************************************/
 
3930
 
 
3931
/*
 
3932
 *      Code to handle an "staliomem" write operation. This device is the 
 
3933
 *      contents of the board shared memory. It is used for down loading
 
3934
 *      the slave image (and debugging :-)
 
3935
 *
 
3936
 *      FIXME: copy under lock
 
3937
 */
 
3938
 
 
3939
static ssize_t stli_memwrite(struct file *fp, const char __user *buf, size_t count, loff_t *offp)
 
3940
{
 
3941
        unsigned long flags;
 
3942
        void __iomem *memptr;
 
3943
        struct stlibrd *brdp;
 
3944
        char __user *chbuf;
 
3945
        unsigned int brdnr;
 
3946
        int size, n;
 
3947
        void *p;
 
3948
        loff_t off = *offp;
 
3949
 
 
3950
        brdnr = iminor(fp->f_path.dentry->d_inode);
 
3951
 
 
3952
        if (brdnr >= stli_nrbrds)
 
3953
                return -ENODEV;
 
3954
        brdp = stli_brds[brdnr];
 
3955
        if (brdp == NULL)
 
3956
                return -ENODEV;
 
3957
        if (brdp->state == 0)
 
3958
                return -ENODEV;
 
3959
        if (off >= brdp->memsize || off + count < off)
 
3960
                return 0;
 
3961
 
 
3962
        chbuf = (char __user *) buf;
 
3963
        size = min(count, (size_t)(brdp->memsize - off));
 
3964
 
 
3965
        /*
 
3966
         *      Copy the data a page at a time
 
3967
         */
 
3968
 
 
3969
        p = (void *)__get_free_page(GFP_KERNEL);
 
3970
        if(p == NULL)
 
3971
                return -ENOMEM;
 
3972
 
 
3973
        while (size > 0) {
 
3974
                n = min(size, (int)(brdp->pagesize - (((unsigned long) off) % brdp->pagesize)));
 
3975
                n = min(n, (int)PAGE_SIZE);
 
3976
                if (copy_from_user(p, chbuf, n)) {
 
3977
                        if (count == 0)
 
3978
                                count = -EFAULT;
 
3979
                        goto out;
 
3980
                }
 
3981
                spin_lock_irqsave(&brd_lock, flags);
 
3982
                EBRDENABLE(brdp);
 
3983
                memptr = EBRDGETMEMPTR(brdp, off);
 
3984
                memcpy_toio(memptr, p, n);
 
3985
                EBRDDISABLE(brdp);
 
3986
                spin_unlock_irqrestore(&brd_lock, flags);
 
3987
                off += n;
 
3988
                chbuf += n;
 
3989
                size -= n;
 
3990
        }
 
3991
out:
 
3992
        free_page((unsigned long) p);
 
3993
        *offp = off;
 
3994
        return count;
 
3995
}
 
3996
 
 
3997
/*****************************************************************************/
 
3998
 
 
3999
/*
 
4000
 *      Return the board stats structure to user app.
 
4001
 */
 
4002
 
 
4003
static int stli_getbrdstats(combrd_t __user *bp)
 
4004
{
 
4005
        struct stlibrd *brdp;
 
4006
        unsigned int i;
 
4007
        combrd_t stli_brdstats;
 
4008
 
 
4009
        if (copy_from_user(&stli_brdstats, bp, sizeof(combrd_t)))
 
4010
                return -EFAULT;
 
4011
        if (stli_brdstats.brd >= STL_MAXBRDS)
 
4012
                return -ENODEV;
 
4013
        brdp = stli_brds[stli_brdstats.brd];
 
4014
        if (brdp == NULL)
 
4015
                return -ENODEV;
 
4016
 
 
4017
        memset(&stli_brdstats, 0, sizeof(combrd_t));
 
4018
 
 
4019
        stli_brdstats.brd = brdp->brdnr;
 
4020
        stli_brdstats.type = brdp->brdtype;
 
4021
        stli_brdstats.hwid = 0;
 
4022
        stli_brdstats.state = brdp->state;
 
4023
        stli_brdstats.ioaddr = brdp->iobase;
 
4024
        stli_brdstats.memaddr = brdp->memaddr;
 
4025
        stli_brdstats.nrpanels = brdp->nrpanels;
 
4026
        stli_brdstats.nrports = brdp->nrports;
 
4027
        for (i = 0; (i < brdp->nrpanels); i++) {
 
4028
                stli_brdstats.panels[i].panel = i;
 
4029
                stli_brdstats.panels[i].hwid = brdp->panelids[i];
 
4030
                stli_brdstats.panels[i].nrports = brdp->panels[i];
 
4031
        }
 
4032
 
 
4033
        if (copy_to_user(bp, &stli_brdstats, sizeof(combrd_t)))
 
4034
                return -EFAULT;
 
4035
        return 0;
 
4036
}
 
4037
 
 
4038
/*****************************************************************************/
 
4039
 
 
4040
/*
 
4041
 *      Resolve the referenced port number into a port struct pointer.
 
4042
 */
 
4043
 
 
4044
static struct stliport *stli_getport(unsigned int brdnr, unsigned int panelnr,
 
4045
                unsigned int portnr)
 
4046
{
 
4047
        struct stlibrd *brdp;
 
4048
        unsigned int i;
 
4049
 
 
4050
        if (brdnr >= STL_MAXBRDS)
 
4051
                return NULL;
 
4052
        brdp = stli_brds[brdnr];
 
4053
        if (brdp == NULL)
 
4054
                return NULL;
 
4055
        for (i = 0; (i < panelnr); i++)
 
4056
                portnr += brdp->panels[i];
 
4057
        if (portnr >= brdp->nrports)
 
4058
                return NULL;
 
4059
        return brdp->ports[portnr];
 
4060
}
 
4061
 
 
4062
/*****************************************************************************/
 
4063
 
 
4064
/*
 
4065
 *      Return the port stats structure to user app. A NULL port struct
 
4066
 *      pointer passed in means that we need to find out from the app
 
4067
 *      what port to get stats for (used through board control device).
 
4068
 */
 
4069
 
 
4070
static int stli_portcmdstats(struct tty_struct *tty, struct stliport *portp)
 
4071
{
 
4072
        unsigned long   flags;
 
4073
        struct stlibrd  *brdp;
 
4074
        int             rc;
 
4075
 
 
4076
        memset(&stli_comstats, 0, sizeof(comstats_t));
 
4077
 
 
4078
        if (portp == NULL)
 
4079
                return -ENODEV;
 
4080
        brdp = stli_brds[portp->brdnr];
 
4081
        if (brdp == NULL)
 
4082
                return -ENODEV;
 
4083
 
 
4084
        mutex_lock(&portp->port.mutex);
 
4085
        if (test_bit(BST_STARTED, &brdp->state)) {
 
4086
                if ((rc = stli_cmdwait(brdp, portp, A_GETSTATS,
 
4087
                    &stli_cdkstats, sizeof(asystats_t), 1)) < 0) {
 
4088
                        mutex_unlock(&portp->port.mutex);
 
4089
                        return rc;
 
4090
                }
 
4091
        } else {
 
4092
                memset(&stli_cdkstats, 0, sizeof(asystats_t));
 
4093
        }
 
4094
 
 
4095
        stli_comstats.brd = portp->brdnr;
 
4096
        stli_comstats.panel = portp->panelnr;
 
4097
        stli_comstats.port = portp->portnr;
 
4098
        stli_comstats.state = portp->state;
 
4099
        stli_comstats.flags = portp->port.flags;
 
4100
 
 
4101
        spin_lock_irqsave(&brd_lock, flags);
 
4102
        if (tty != NULL) {
 
4103
                if (portp->port.tty == tty) {
 
4104
                        stli_comstats.ttystate = tty->flags;
 
4105
                        stli_comstats.rxbuffered = -1;
 
4106
                        if (tty->termios != NULL) {
 
4107
                                stli_comstats.cflags = tty->termios->c_cflag;
 
4108
                                stli_comstats.iflags = tty->termios->c_iflag;
 
4109
                                stli_comstats.oflags = tty->termios->c_oflag;
 
4110
                                stli_comstats.lflags = tty->termios->c_lflag;
 
4111
                        }
 
4112
                }
 
4113
        }
 
4114
        spin_unlock_irqrestore(&brd_lock, flags);
 
4115
 
 
4116
        stli_comstats.txtotal = stli_cdkstats.txchars;
 
4117
        stli_comstats.rxtotal = stli_cdkstats.rxchars + stli_cdkstats.ringover;
 
4118
        stli_comstats.txbuffered = stli_cdkstats.txringq;
 
4119
        stli_comstats.rxbuffered += stli_cdkstats.rxringq;
 
4120
        stli_comstats.rxoverrun = stli_cdkstats.overruns;
 
4121
        stli_comstats.rxparity = stli_cdkstats.parity;
 
4122
        stli_comstats.rxframing = stli_cdkstats.framing;
 
4123
        stli_comstats.rxlost = stli_cdkstats.ringover;
 
4124
        stli_comstats.rxbreaks = stli_cdkstats.rxbreaks;
 
4125
        stli_comstats.txbreaks = stli_cdkstats.txbreaks;
 
4126
        stli_comstats.txxon = stli_cdkstats.txstart;
 
4127
        stli_comstats.txxoff = stli_cdkstats.txstop;
 
4128
        stli_comstats.rxxon = stli_cdkstats.rxstart;
 
4129
        stli_comstats.rxxoff = stli_cdkstats.rxstop;
 
4130
        stli_comstats.rxrtsoff = stli_cdkstats.rtscnt / 2;
 
4131
        stli_comstats.rxrtson = stli_cdkstats.rtscnt - stli_comstats.rxrtsoff;
 
4132
        stli_comstats.modem = stli_cdkstats.dcdcnt;
 
4133
        stli_comstats.hwid = stli_cdkstats.hwid;
 
4134
        stli_comstats.signals = stli_mktiocm(stli_cdkstats.signals);
 
4135
        mutex_unlock(&portp->port.mutex);
 
4136
 
 
4137
        return 0;
 
4138
}
 
4139
 
 
4140
/*****************************************************************************/
 
4141
 
 
4142
/*
 
4143
 *      Return the port stats structure to user app. A NULL port struct
 
4144
 *      pointer passed in means that we need to find out from the app
 
4145
 *      what port to get stats for (used through board control device).
 
4146
 */
 
4147
 
 
4148
static int stli_getportstats(struct tty_struct *tty, struct stliport *portp,
 
4149
                                                        comstats_t __user *cp)
 
4150
{
 
4151
        struct stlibrd *brdp;
 
4152
        int rc;
 
4153
 
 
4154
        if (!portp) {
 
4155
                if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t)))
 
4156
                        return -EFAULT;
 
4157
                portp = stli_getport(stli_comstats.brd, stli_comstats.panel,
 
4158
                        stli_comstats.port);
 
4159
                if (!portp)
 
4160
                        return -ENODEV;
 
4161
        }
 
4162
 
 
4163
        brdp = stli_brds[portp->brdnr];
 
4164
        if (!brdp)
 
4165
                return -ENODEV;
 
4166
 
 
4167
        if ((rc = stli_portcmdstats(tty, portp)) < 0)
 
4168
                return rc;
 
4169
 
 
4170
        return copy_to_user(cp, &stli_comstats, sizeof(comstats_t)) ?
 
4171
                        -EFAULT : 0;
 
4172
}
 
4173
 
 
4174
/*****************************************************************************/
 
4175
 
 
4176
/*
 
4177
 *      Clear the port stats structure. We also return it zeroed out...
 
4178
 */
 
4179
 
 
4180
static int stli_clrportstats(struct stliport *portp, comstats_t __user *cp)
 
4181
{
 
4182
        struct stlibrd *brdp;
 
4183
        int rc;
 
4184
 
 
4185
        if (!portp) {
 
4186
                if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t)))
 
4187
                        return -EFAULT;
 
4188
                portp = stli_getport(stli_comstats.brd, stli_comstats.panel,
 
4189
                        stli_comstats.port);
 
4190
                if (!portp)
 
4191
                        return -ENODEV;
 
4192
        }
 
4193
 
 
4194
        brdp = stli_brds[portp->brdnr];
 
4195
        if (!brdp)
 
4196
                return -ENODEV;
 
4197
 
 
4198
        mutex_lock(&portp->port.mutex);
 
4199
 
 
4200
        if (test_bit(BST_STARTED, &brdp->state)) {
 
4201
                if ((rc = stli_cmdwait(brdp, portp, A_CLEARSTATS, NULL, 0, 0)) < 0) {
 
4202
                        mutex_unlock(&portp->port.mutex);
 
4203
                        return rc;
 
4204
                }
 
4205
        }
 
4206
 
 
4207
        memset(&stli_comstats, 0, sizeof(comstats_t));
 
4208
        stli_comstats.brd = portp->brdnr;
 
4209
        stli_comstats.panel = portp->panelnr;
 
4210
        stli_comstats.port = portp->portnr;
 
4211
        mutex_unlock(&portp->port.mutex);
 
4212
 
 
4213
        if (copy_to_user(cp, &stli_comstats, sizeof(comstats_t)))
 
4214
                return -EFAULT;
 
4215
        return 0;
 
4216
}
 
4217
 
 
4218
/*****************************************************************************/
 
4219
 
 
4220
/*
 
4221
 *      Return the entire driver ports structure to a user app.
 
4222
 */
 
4223
 
 
4224
static int stli_getportstruct(struct stliport __user *arg)
 
4225
{
 
4226
        struct stliport stli_dummyport;
 
4227
        struct stliport *portp;
 
4228
 
 
4229
        if (copy_from_user(&stli_dummyport, arg, sizeof(struct stliport)))
 
4230
                return -EFAULT;
 
4231
        portp = stli_getport(stli_dummyport.brdnr, stli_dummyport.panelnr,
 
4232
                 stli_dummyport.portnr);
 
4233
        if (!portp)
 
4234
                return -ENODEV;
 
4235
        if (copy_to_user(arg, portp, sizeof(struct stliport)))
 
4236
                return -EFAULT;
 
4237
        return 0;
 
4238
}
 
4239
 
 
4240
/*****************************************************************************/
 
4241
 
 
4242
/*
 
4243
 *      Return the entire driver board structure to a user app.
 
4244
 */
 
4245
 
 
4246
static int stli_getbrdstruct(struct stlibrd __user *arg)
 
4247
{
 
4248
        struct stlibrd stli_dummybrd;
 
4249
        struct stlibrd *brdp;
 
4250
 
 
4251
        if (copy_from_user(&stli_dummybrd, arg, sizeof(struct stlibrd)))
 
4252
                return -EFAULT;
 
4253
        if (stli_dummybrd.brdnr >= STL_MAXBRDS)
 
4254
                return -ENODEV;
 
4255
        brdp = stli_brds[stli_dummybrd.brdnr];
 
4256
        if (!brdp)
 
4257
                return -ENODEV;
 
4258
        if (copy_to_user(arg, brdp, sizeof(struct stlibrd)))
 
4259
                return -EFAULT;
 
4260
        return 0;
 
4261
}
 
4262
 
 
4263
/*****************************************************************************/
 
4264
 
 
4265
/*
 
4266
 *      The "staliomem" device is also required to do some special operations on
 
4267
 *      the board. We need to be able to send an interrupt to the board,
 
4268
 *      reset it, and start/stop it.
 
4269
 */
 
4270
 
 
4271
static long stli_memioctl(struct file *fp, unsigned int cmd, unsigned long arg)
 
4272
{
 
4273
        struct stlibrd *brdp;
 
4274
        int brdnr, rc, done;
 
4275
        void __user *argp = (void __user *)arg;
 
4276
 
 
4277
/*
 
4278
 *      First up handle the board independent ioctls.
 
4279
 */
 
4280
        done = 0;
 
4281
        rc = 0;
 
4282
 
 
4283
        switch (cmd) {
 
4284
        case COM_GETPORTSTATS:
 
4285
                rc = stli_getportstats(NULL, NULL, argp);
 
4286
                done++;
 
4287
                break;
 
4288
        case COM_CLRPORTSTATS:
 
4289
                rc = stli_clrportstats(NULL, argp);
 
4290
                done++;
 
4291
                break;
 
4292
        case COM_GETBRDSTATS:
 
4293
                rc = stli_getbrdstats(argp);
 
4294
                done++;
 
4295
                break;
 
4296
        case COM_READPORT:
 
4297
                rc = stli_getportstruct(argp);
 
4298
                done++;
 
4299
                break;
 
4300
        case COM_READBOARD:
 
4301
                rc = stli_getbrdstruct(argp);
 
4302
                done++;
 
4303
                break;
 
4304
        }
 
4305
        if (done)
 
4306
                return rc;
 
4307
 
 
4308
/*
 
4309
 *      Now handle the board specific ioctls. These all depend on the
 
4310
 *      minor number of the device they were called from.
 
4311
 */
 
4312
        brdnr = iminor(fp->f_dentry->d_inode);
 
4313
        if (brdnr >= STL_MAXBRDS)
 
4314
                return -ENODEV;
 
4315
        brdp = stli_brds[brdnr];
 
4316
        if (!brdp)
 
4317
                return -ENODEV;
 
4318
        if (brdp->state == 0)
 
4319
                return -ENODEV;
 
4320
 
 
4321
        switch (cmd) {
 
4322
        case STL_BINTR:
 
4323
                EBRDINTR(brdp);
 
4324
                break;
 
4325
        case STL_BSTART:
 
4326
                rc = stli_startbrd(brdp);
 
4327
                break;
 
4328
        case STL_BSTOP:
 
4329
                clear_bit(BST_STARTED, &brdp->state);
 
4330
                break;
 
4331
        case STL_BRESET:
 
4332
                clear_bit(BST_STARTED, &brdp->state);
 
4333
                EBRDRESET(brdp);
 
4334
                if (stli_shared == 0) {
 
4335
                        if (brdp->reenable != NULL)
 
4336
                                (* brdp->reenable)(brdp);
 
4337
                }
 
4338
                break;
 
4339
        default:
 
4340
                rc = -ENOIOCTLCMD;
 
4341
                break;
 
4342
        }
 
4343
        return rc;
 
4344
}
 
4345
 
 
4346
static const struct tty_operations stli_ops = {
 
4347
        .open = stli_open,
 
4348
        .close = stli_close,
 
4349
        .write = stli_write,
 
4350
        .put_char = stli_putchar,
 
4351
        .flush_chars = stli_flushchars,
 
4352
        .write_room = stli_writeroom,
 
4353
        .chars_in_buffer = stli_charsinbuffer,
 
4354
        .ioctl = stli_ioctl,
 
4355
        .set_termios = stli_settermios,
 
4356
        .throttle = stli_throttle,
 
4357
        .unthrottle = stli_unthrottle,
 
4358
        .stop = stli_stop,
 
4359
        .start = stli_start,
 
4360
        .hangup = stli_hangup,
 
4361
        .flush_buffer = stli_flushbuffer,
 
4362
        .break_ctl = stli_breakctl,
 
4363
        .wait_until_sent = stli_waituntilsent,
 
4364
        .send_xchar = stli_sendxchar,
 
4365
        .tiocmget = stli_tiocmget,
 
4366
        .tiocmset = stli_tiocmset,
 
4367
        .proc_fops = &stli_proc_fops,
 
4368
};
 
4369
 
 
4370
static const struct tty_port_operations stli_port_ops = {
 
4371
        .carrier_raised = stli_carrier_raised,
 
4372
        .dtr_rts = stli_dtr_rts,
 
4373
        .activate = stli_activate,
 
4374
        .shutdown = stli_shutdown,
 
4375
};
 
4376
 
 
4377
/*****************************************************************************/
 
4378
/*
 
4379
 *      Loadable module initialization stuff.
 
4380
 */
 
4381
 
 
4382
static void istallion_cleanup_isa(void)
 
4383
{
 
4384
        struct stlibrd  *brdp;
 
4385
        unsigned int j;
 
4386
 
 
4387
        for (j = 0; (j < stli_nrbrds); j++) {
 
4388
                if ((brdp = stli_brds[j]) == NULL ||
 
4389
                                test_bit(BST_PROBED, &brdp->state))
 
4390
                        continue;
 
4391
 
 
4392
                stli_cleanup_ports(brdp);
 
4393
 
 
4394
                iounmap(brdp->membase);
 
4395
                if (brdp->iosize > 0)
 
4396
                        release_region(brdp->iobase, brdp->iosize);
 
4397
                kfree(brdp);
 
4398
                stli_brds[j] = NULL;
 
4399
        }
 
4400
}
 
4401
 
 
4402
static int __init istallion_module_init(void)
 
4403
{
 
4404
        unsigned int i;
 
4405
        int retval;
 
4406
 
 
4407
        printk(KERN_INFO "%s: version %s\n", stli_drvtitle, stli_drvversion);
 
4408
 
 
4409
        spin_lock_init(&stli_lock);
 
4410
        spin_lock_init(&brd_lock);
 
4411
 
 
4412
        stli_txcookbuf = kmalloc(STLI_TXBUFSIZE, GFP_KERNEL);
 
4413
        if (!stli_txcookbuf) {
 
4414
                printk(KERN_ERR "istallion: failed to allocate memory "
 
4415
                                "(size=%d)\n", STLI_TXBUFSIZE);
 
4416
                retval = -ENOMEM;
 
4417
                goto err;
 
4418
        }
 
4419
 
 
4420
        stli_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS);
 
4421
        if (!stli_serial) {
 
4422
                retval = -ENOMEM;
 
4423
                goto err_free;
 
4424
        }
 
4425
 
 
4426
        stli_serial->owner = THIS_MODULE;
 
4427
        stli_serial->driver_name = stli_drvname;
 
4428
        stli_serial->name = stli_serialname;
 
4429
        stli_serial->major = STL_SERIALMAJOR;
 
4430
        stli_serial->minor_start = 0;
 
4431
        stli_serial->type = TTY_DRIVER_TYPE_SERIAL;
 
4432
        stli_serial->subtype = SERIAL_TYPE_NORMAL;
 
4433
        stli_serial->init_termios = stli_deftermios;
 
4434
        stli_serial->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
 
4435
        tty_set_operations(stli_serial, &stli_ops);
 
4436
 
 
4437
        retval = tty_register_driver(stli_serial);
 
4438
        if (retval) {
 
4439
                printk(KERN_ERR "istallion: failed to register serial driver\n");
 
4440
                goto err_ttyput;
 
4441
        }
 
4442
 
 
4443
        retval = stli_initbrds();
 
4444
        if (retval)
 
4445
                goto err_ttyunr;
 
4446
 
 
4447
/*
 
4448
 *      Set up a character driver for the shared memory region. We need this
 
4449
 *      to down load the slave code image. Also it is a useful debugging tool.
 
4450
 */
 
4451
        retval = register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stli_fsiomem);
 
4452
        if (retval) {
 
4453
                printk(KERN_ERR "istallion: failed to register serial memory "
 
4454
                                "device\n");
 
4455
                goto err_deinit;
 
4456
        }
 
4457
 
 
4458
        istallion_class = class_create(THIS_MODULE, "staliomem");
 
4459
        for (i = 0; i < 4; i++)
 
4460
                device_create(istallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i),
 
4461
                              NULL, "staliomem%d", i);
 
4462
 
 
4463
        return 0;
 
4464
err_deinit:
 
4465
        pci_unregister_driver(&stli_pcidriver);
 
4466
        istallion_cleanup_isa();
 
4467
err_ttyunr:
 
4468
        tty_unregister_driver(stli_serial);
 
4469
err_ttyput:
 
4470
        put_tty_driver(stli_serial);
 
4471
err_free:
 
4472
        kfree(stli_txcookbuf);
 
4473
err:
 
4474
        return retval;
 
4475
}
 
4476
 
 
4477
/*****************************************************************************/
 
4478
 
 
4479
static void __exit istallion_module_exit(void)
 
4480
{
 
4481
        unsigned int j;
 
4482
 
 
4483
        printk(KERN_INFO "Unloading %s: version %s\n", stli_drvtitle,
 
4484
                stli_drvversion);
 
4485
 
 
4486
        if (stli_timeron) {
 
4487
                stli_timeron = 0;
 
4488
                del_timer_sync(&stli_timerlist);
 
4489
        }
 
4490
 
 
4491
        unregister_chrdev(STL_SIOMEMMAJOR, "staliomem");
 
4492
 
 
4493
        for (j = 0; j < 4; j++)
 
4494
                device_destroy(istallion_class, MKDEV(STL_SIOMEMMAJOR, j));
 
4495
        class_destroy(istallion_class);
 
4496
 
 
4497
        pci_unregister_driver(&stli_pcidriver);
 
4498
        istallion_cleanup_isa();
 
4499
 
 
4500
        tty_unregister_driver(stli_serial);
 
4501
        put_tty_driver(stli_serial);
 
4502
 
 
4503
        kfree(stli_txcookbuf);
 
4504
}
 
4505
 
 
4506
module_init(istallion_module_init);
 
4507
module_exit(istallion_module_exit);