~ubuntu-branches/debian/wheezy/linux-2.6/wheezy

« back to all changes in this revision

Viewing changes to drivers/staging/tty/stallion.c

  • Committer: Bazaar Package Importer
  • Author(s): Ben Hutchings, Ben Hutchings, Aurelien Jarno
  • Date: 2011-06-07 12:14:05 UTC
  • mfrom: (43.1.9 sid)
  • Revision ID: james.westby@ubuntu.com-20110607121405-i3h1rd7nrnd2b73h
Tags: 2.6.39-2
[ Ben Hutchings ]
* [x86] Enable BACKLIGHT_APPLE, replacing BACKLIGHT_MBP_NVIDIA
  (Closes: #627492)
* cgroups: Disable memory resource controller by default. Allow it
  to be enabled using kernel parameter 'cgroup_enable=memory'.
* rt2800usb: Enable support for more USB devices including
  Linksys WUSB600N (Closes: #596626) (this change was accidentally
  omitted from 2.6.39-1)
* [x86] Remove Celeron from list of processors supporting PAE. Most
  'Celeron M' models do not.
* Update debconf template translations:
  - Swedish (Martin Bagge) (Closes: #628932)
  - French (David Prévot) (Closes: #628191)
* aufs: Update for 2.6.39 (Closes: #627837)
* Add stable 2.6.39.1, including:
  - ext4: dont set PageUptodate in ext4_end_bio()
  - pata_cmd64x: fix boot crash on parisc (Closes: #622997, #622745)
  - ext3: Fix fs corruption when make_indexed_dir() fails
  - netfilter: nf_ct_sip: validate Content-Length in TCP SIP messages
  - sctp: fix race between sctp_bind_addr_free() and
    sctp_bind_addr_conflict()
  - sctp: fix memory leak of the ASCONF queue when free asoc
  - md/bitmap: fix saving of events_cleared and other state
  - cdc_acm: Fix oops when Droids MuIn LCD is connected
  - cx88: Fix conversion from BKL to fine-grained locks (Closes: #619827)
  - keys: Set cred->user_ns in key_replace_session_keyring (CVE-2011-2184)
  - tmpfs: fix race between truncate and writepage
  - nfs41: Correct offset for LAYOUTCOMMIT
  - xen/mmu: fix a race window causing leave_mm BUG()
  - ext4: fix possible use-after-free in ext4_remove_li_request()
  For the complete list of changes, see:
   http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.39.1
* Bump ABI to 2
* netfilter: Enable IP_SET, IP_SET_BITMAP_IP, IP_SET_BITMAP_IPMAC,
  IP_SET_BITMAP_PORT, IP_SET_HASH_IP, IP_SET_HASH_IPPORT,
  IP_SET_HASH_IPPORTIP, IP_SET_HASH_IPPORTNET, IP_SET_HASH_NET,
  IP_SET_HASH_NETPORT, IP_SET_LIST_SET, NETFILTER_XT_SET as modules
  (Closes: #629401)

[ Aurelien Jarno ]
* [mipsel/loongson-2f] Disable_SCSI_LPFC to workaround GCC ICE.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*****************************************************************************/
 
2
 
 
3
/*
 
4
 *      stallion.c  -- stallion 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
 *      This program is distributed in the hope that it will be useful,
 
18
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 
19
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
20
 *      GNU General Public License for more details.
 
21
 *
 
22
 *      You should have received a copy of the GNU General Public License
 
23
 *      along with this program; if not, write to the Free Software
 
24
 *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
25
 */
 
26
 
 
27
/*****************************************************************************/
 
28
 
 
29
#include <linux/module.h>
 
30
#include <linux/sched.h>
 
31
#include <linux/slab.h>
 
32
#include <linux/interrupt.h>
 
33
#include <linux/tty.h>
 
34
#include <linux/tty_flip.h>
 
35
#include <linux/serial.h>
 
36
#include <linux/seq_file.h>
 
37
#include <linux/cd1400.h>
 
38
#include <linux/sc26198.h>
 
39
#include <linux/comstats.h>
 
40
#include <linux/stallion.h>
 
41
#include <linux/ioport.h>
 
42
#include <linux/init.h>
 
43
#include <linux/device.h>
 
44
#include <linux/delay.h>
 
45
#include <linux/ctype.h>
 
46
 
 
47
#include <asm/io.h>
 
48
#include <asm/uaccess.h>
 
49
 
 
50
#include <linux/pci.h>
 
51
 
 
52
/*****************************************************************************/
 
53
 
 
54
/*
 
55
 *      Define different board types. Use the standard Stallion "assigned"
 
56
 *      board numbers. Boards supported in this driver are abbreviated as
 
57
 *      EIO = EasyIO and ECH = EasyConnection 8/32.
 
58
 */
 
59
#define BRD_EASYIO      20
 
60
#define BRD_ECH         21
 
61
#define BRD_ECHMC       22
 
62
#define BRD_ECHPCI      26
 
63
#define BRD_ECH64PCI    27
 
64
#define BRD_EASYIOPCI   28
 
65
 
 
66
struct stlconf {
 
67
        unsigned int    brdtype;
 
68
        int             ioaddr1;
 
69
        int             ioaddr2;
 
70
        unsigned long   memaddr;
 
71
        int             irq;
 
72
        int             irqtype;
 
73
};
 
74
 
 
75
static unsigned int stl_nrbrds;
 
76
 
 
77
/*****************************************************************************/
 
78
 
 
79
/*
 
80
 *      Define some important driver characteristics. Device major numbers
 
81
 *      allocated as per Linux Device Registry.
 
82
 */
 
83
#ifndef STL_SIOMEMMAJOR
 
84
#define STL_SIOMEMMAJOR         28
 
85
#endif
 
86
#ifndef STL_SERIALMAJOR
 
87
#define STL_SERIALMAJOR         24
 
88
#endif
 
89
#ifndef STL_CALLOUTMAJOR
 
90
#define STL_CALLOUTMAJOR        25
 
91
#endif
 
92
 
 
93
/*
 
94
 *      Set the TX buffer size. Bigger is better, but we don't want
 
95
 *      to chew too much memory with buffers!
 
96
 */
 
97
#define STL_TXBUFLOW            512
 
98
#define STL_TXBUFSIZE           4096
 
99
 
 
100
/*****************************************************************************/
 
101
 
 
102
/*
 
103
 *      Define our local driver identity first. Set up stuff to deal with
 
104
 *      all the local structures required by a serial tty driver.
 
105
 */
 
106
static char     *stl_drvtitle = "Stallion Multiport Serial Driver";
 
107
static char     *stl_drvname = "stallion";
 
108
static char     *stl_drvversion = "5.6.0";
 
109
 
 
110
static struct tty_driver        *stl_serial;
 
111
 
 
112
/*
 
113
 *      Define a local default termios struct. All ports will be created
 
114
 *      with this termios initially. Basically all it defines is a raw port
 
115
 *      at 9600, 8 data bits, 1 stop bit.
 
116
 */
 
117
static struct ktermios          stl_deftermios = {
 
118
        .c_cflag        = (B9600 | CS8 | CREAD | HUPCL | CLOCAL),
 
119
        .c_cc           = INIT_C_CC,
 
120
        .c_ispeed       = 9600,
 
121
        .c_ospeed       = 9600,
 
122
};
 
123
 
 
124
/*
 
125
 *      Define global place to put buffer overflow characters.
 
126
 */
 
127
static char             stl_unwanted[SC26198_RXFIFOSIZE];
 
128
 
 
129
/*****************************************************************************/
 
130
 
 
131
static DEFINE_MUTEX(stl_brdslock);
 
132
static struct stlbrd            *stl_brds[STL_MAXBRDS];
 
133
 
 
134
static const struct tty_port_operations stl_port_ops;
 
135
 
 
136
/*
 
137
 *      Per board state flags. Used with the state field of the board struct.
 
138
 *      Not really much here!
 
139
 */
 
140
#define BRD_FOUND       0x1
 
141
#define STL_PROBED      0x2
 
142
 
 
143
 
 
144
/*
 
145
 *      Define the port structure istate flags. These set of flags are
 
146
 *      modified at interrupt time - so setting and reseting them needs
 
147
 *      to be atomic. Use the bit clear/setting routines for this.
 
148
 */
 
149
#define ASYI_TXBUSY     1
 
150
#define ASYI_TXLOW      2
 
151
#define ASYI_TXFLOWED   3
 
152
 
 
153
/*
 
154
 *      Define an array of board names as printable strings. Handy for
 
155
 *      referencing boards when printing trace and stuff.
 
156
 */
 
157
static char     *stl_brdnames[] = {
 
158
        NULL,
 
159
        NULL,
 
160
        NULL,
 
161
        NULL,
 
162
        NULL,
 
163
        NULL,
 
164
        NULL,
 
165
        NULL,
 
166
        NULL,
 
167
        NULL,
 
168
        NULL,
 
169
        NULL,
 
170
        NULL,
 
171
        NULL,
 
172
        NULL,
 
173
        NULL,
 
174
        NULL,
 
175
        NULL,
 
176
        NULL,
 
177
        NULL,
 
178
        "EasyIO",
 
179
        "EC8/32-AT",
 
180
        "EC8/32-MC",
 
181
        NULL,
 
182
        NULL,
 
183
        NULL,
 
184
        "EC8/32-PCI",
 
185
        "EC8/64-PCI",
 
186
        "EasyIO-PCI",
 
187
};
 
188
 
 
189
/*****************************************************************************/
 
190
 
 
191
/*
 
192
 *      Define some string labels for arguments passed from the module
 
193
 *      load line. These allow for easy board definitions, and easy
 
194
 *      modification of the io, memory and irq resoucres.
 
195
 */
 
196
static unsigned int stl_nargs;
 
197
static char     *board0[4];
 
198
static char     *board1[4];
 
199
static char     *board2[4];
 
200
static char     *board3[4];
 
201
 
 
202
static char     **stl_brdsp[] = {
 
203
        (char **) &board0,
 
204
        (char **) &board1,
 
205
        (char **) &board2,
 
206
        (char **) &board3
 
207
};
 
208
 
 
209
/*
 
210
 *      Define a set of common board names, and types. This is used to
 
211
 *      parse any module arguments.
 
212
 */
 
213
 
 
214
static struct {
 
215
        char    *name;
 
216
        int     type;
 
217
} stl_brdstr[] = {
 
218
        { "easyio", BRD_EASYIO },
 
219
        { "eio", BRD_EASYIO },
 
220
        { "20", BRD_EASYIO },
 
221
        { "ec8/32", BRD_ECH },
 
222
        { "ec8/32-at", BRD_ECH },
 
223
        { "ec8/32-isa", BRD_ECH },
 
224
        { "ech", BRD_ECH },
 
225
        { "echat", BRD_ECH },
 
226
        { "21", BRD_ECH },
 
227
        { "ec8/32-mc", BRD_ECHMC },
 
228
        { "ec8/32-mca", BRD_ECHMC },
 
229
        { "echmc", BRD_ECHMC },
 
230
        { "echmca", BRD_ECHMC },
 
231
        { "22", BRD_ECHMC },
 
232
        { "ec8/32-pc", BRD_ECHPCI },
 
233
        { "ec8/32-pci", BRD_ECHPCI },
 
234
        { "26", BRD_ECHPCI },
 
235
        { "ec8/64-pc", BRD_ECH64PCI },
 
236
        { "ec8/64-pci", BRD_ECH64PCI },
 
237
        { "ech-pci", BRD_ECH64PCI },
 
238
        { "echpci", BRD_ECH64PCI },
 
239
        { "echpc", BRD_ECH64PCI },
 
240
        { "27", BRD_ECH64PCI },
 
241
        { "easyio-pc", BRD_EASYIOPCI },
 
242
        { "easyio-pci", BRD_EASYIOPCI },
 
243
        { "eio-pci", BRD_EASYIOPCI },
 
244
        { "eiopci", BRD_EASYIOPCI },
 
245
        { "28", BRD_EASYIOPCI },
 
246
};
 
247
 
 
248
/*
 
249
 *      Define the module agruments.
 
250
 */
 
251
 
 
252
module_param_array(board0, charp, &stl_nargs, 0);
 
253
MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,ioaddr2][,irq]]");
 
254
module_param_array(board1, charp, &stl_nargs, 0);
 
255
MODULE_PARM_DESC(board1, "Board 1 config -> name[,ioaddr[,ioaddr2][,irq]]");
 
256
module_param_array(board2, charp, &stl_nargs, 0);
 
257
MODULE_PARM_DESC(board2, "Board 2 config -> name[,ioaddr[,ioaddr2][,irq]]");
 
258
module_param_array(board3, charp, &stl_nargs, 0);
 
259
MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,ioaddr2][,irq]]");
 
260
 
 
261
/*****************************************************************************/
 
262
 
 
263
/*
 
264
 *      Hardware ID bits for the EasyIO and ECH boards. These defines apply
 
265
 *      to the directly accessible io ports of these boards (not the uarts -
 
266
 *      they are in cd1400.h and sc26198.h).
 
267
 */
 
268
#define EIO_8PORTRS     0x04
 
269
#define EIO_4PORTRS     0x05
 
270
#define EIO_8PORTDI     0x00
 
271
#define EIO_8PORTM      0x06
 
272
#define EIO_MK3         0x03
 
273
#define EIO_IDBITMASK   0x07
 
274
 
 
275
#define EIO_BRDMASK     0xf0
 
276
#define ID_BRD4         0x10
 
277
#define ID_BRD8         0x20
 
278
#define ID_BRD16        0x30
 
279
 
 
280
#define EIO_INTRPEND    0x08
 
281
#define EIO_INTEDGE     0x00
 
282
#define EIO_INTLEVEL    0x08
 
283
#define EIO_0WS         0x10
 
284
 
 
285
#define ECH_ID          0xa0
 
286
#define ECH_IDBITMASK   0xe0
 
287
#define ECH_BRDENABLE   0x08
 
288
#define ECH_BRDDISABLE  0x00
 
289
#define ECH_INTENABLE   0x01
 
290
#define ECH_INTDISABLE  0x00
 
291
#define ECH_INTLEVEL    0x02
 
292
#define ECH_INTEDGE     0x00
 
293
#define ECH_INTRPEND    0x01
 
294
#define ECH_BRDRESET    0x01
 
295
 
 
296
#define ECHMC_INTENABLE 0x01
 
297
#define ECHMC_BRDRESET  0x02
 
298
 
 
299
#define ECH_PNLSTATUS   2
 
300
#define ECH_PNL16PORT   0x20
 
301
#define ECH_PNLIDMASK   0x07
 
302
#define ECH_PNLXPID     0x40
 
303
#define ECH_PNLINTRPEND 0x80
 
304
 
 
305
#define ECH_ADDR2MASK   0x1e0
 
306
 
 
307
/*
 
308
 *      Define the vector mapping bits for the programmable interrupt board
 
309
 *      hardware. These bits encode the interrupt for the board to use - it
 
310
 *      is software selectable (except the EIO-8M).
 
311
 */
 
312
static unsigned char    stl_vecmap[] = {
 
313
        0xff, 0xff, 0xff, 0x04, 0x06, 0x05, 0xff, 0x07,
 
314
        0xff, 0xff, 0x00, 0x02, 0x01, 0xff, 0xff, 0x03
 
315
};
 
316
 
 
317
/*
 
318
 *      Lock ordering is that you may not take stallion_lock holding
 
319
 *      brd_lock.
 
320
 */
 
321
 
 
322
static spinlock_t brd_lock;             /* Guard the board mapping */
 
323
static spinlock_t stallion_lock;        /* Guard the tty driver */
 
324
 
 
325
/*
 
326
 *      Set up enable and disable macros for the ECH boards. They require
 
327
 *      the secondary io address space to be activated and deactivated.
 
328
 *      This way all ECH boards can share their secondary io region.
 
329
 *      If this is an ECH-PCI board then also need to set the page pointer
 
330
 *      to point to the correct page.
 
331
 */
 
332
#define BRDENABLE(brdnr,pagenr)                                         \
 
333
        if (stl_brds[(brdnr)]->brdtype == BRD_ECH)                      \
 
334
                outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDENABLE),    \
 
335
                        stl_brds[(brdnr)]->ioctrl);                     \
 
336
        else if (stl_brds[(brdnr)]->brdtype == BRD_ECHPCI)              \
 
337
                outb((pagenr), stl_brds[(brdnr)]->ioctrl);
 
338
 
 
339
#define BRDDISABLE(brdnr)                                               \
 
340
        if (stl_brds[(brdnr)]->brdtype == BRD_ECH)                      \
 
341
                outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDDISABLE),   \
 
342
                        stl_brds[(brdnr)]->ioctrl);
 
343
 
 
344
#define STL_CD1400MAXBAUD       230400
 
345
#define STL_SC26198MAXBAUD      460800
 
346
 
 
347
#define STL_BAUDBASE            115200
 
348
#define STL_CLOSEDELAY          (5 * HZ / 10)
 
349
 
 
350
/*****************************************************************************/
 
351
 
 
352
/*
 
353
 *      Define the Stallion PCI vendor and device IDs.
 
354
 */
 
355
#ifndef PCI_VENDOR_ID_STALLION
 
356
#define PCI_VENDOR_ID_STALLION          0x124d
 
357
#endif
 
358
#ifndef PCI_DEVICE_ID_ECHPCI832
 
359
#define PCI_DEVICE_ID_ECHPCI832         0x0000
 
360
#endif
 
361
#ifndef PCI_DEVICE_ID_ECHPCI864
 
362
#define PCI_DEVICE_ID_ECHPCI864         0x0002
 
363
#endif
 
364
#ifndef PCI_DEVICE_ID_EIOPCI
 
365
#define PCI_DEVICE_ID_EIOPCI            0x0003
 
366
#endif
 
367
 
 
368
/*
 
369
 *      Define structure to hold all Stallion PCI boards.
 
370
 */
 
371
 
 
372
static struct pci_device_id stl_pcibrds[] = {
 
373
        { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI864),
 
374
                .driver_data = BRD_ECH64PCI },
 
375
        { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_EIOPCI),
 
376
                .driver_data = BRD_EASYIOPCI },
 
377
        { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI832),
 
378
                .driver_data = BRD_ECHPCI },
 
379
        { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87410),
 
380
                .driver_data = BRD_ECHPCI },
 
381
        { }
 
382
};
 
383
MODULE_DEVICE_TABLE(pci, stl_pcibrds);
 
384
 
 
385
/*****************************************************************************/
 
386
 
 
387
/*
 
388
 *      Define macros to extract a brd/port number from a minor number.
 
389
 */
 
390
#define MINOR2BRD(min)          (((min) & 0xc0) >> 6)
 
391
#define MINOR2PORT(min)         ((min) & 0x3f)
 
392
 
 
393
/*
 
394
 *      Define a baud rate table that converts termios baud rate selector
 
395
 *      into the actual baud rate value. All baud rate calculations are
 
396
 *      based on the actual baud rate required.
 
397
 */
 
398
static unsigned int     stl_baudrates[] = {
 
399
        0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
 
400
        9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600
 
401
};
 
402
 
 
403
/*****************************************************************************/
 
404
 
 
405
/*
 
406
 *      Declare all those functions in this driver!
 
407
 */
 
408
 
 
409
static long     stl_memioctl(struct file *fp, unsigned int cmd, unsigned long arg);
 
410
static int      stl_brdinit(struct stlbrd *brdp);
 
411
static int      stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp);
 
412
static int      stl_clrportstats(struct stlport *portp, comstats_t __user *cp);
 
413
 
 
414
/*
 
415
 *      CD1400 uart specific handling functions.
 
416
 */
 
417
static void     stl_cd1400setreg(struct stlport *portp, int regnr, int value);
 
418
static int      stl_cd1400getreg(struct stlport *portp, int regnr);
 
419
static int      stl_cd1400updatereg(struct stlport *portp, int regnr, int value);
 
420
static int      stl_cd1400panelinit(struct stlbrd *brdp, struct stlpanel *panelp);
 
421
static void     stl_cd1400portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
 
422
static void     stl_cd1400setport(struct stlport *portp, struct ktermios *tiosp);
 
423
static int      stl_cd1400getsignals(struct stlport *portp);
 
424
static void     stl_cd1400setsignals(struct stlport *portp, int dtr, int rts);
 
425
static void     stl_cd1400ccrwait(struct stlport *portp);
 
426
static void     stl_cd1400enablerxtx(struct stlport *portp, int rx, int tx);
 
427
static void     stl_cd1400startrxtx(struct stlport *portp, int rx, int tx);
 
428
static void     stl_cd1400disableintrs(struct stlport *portp);
 
429
static void     stl_cd1400sendbreak(struct stlport *portp, int len);
 
430
static void     stl_cd1400flowctrl(struct stlport *portp, int state);
 
431
static void     stl_cd1400sendflow(struct stlport *portp, int state);
 
432
static void     stl_cd1400flush(struct stlport *portp);
 
433
static int      stl_cd1400datastate(struct stlport *portp);
 
434
static void     stl_cd1400eiointr(struct stlpanel *panelp, unsigned int iobase);
 
435
static void     stl_cd1400echintr(struct stlpanel *panelp, unsigned int iobase);
 
436
static void     stl_cd1400txisr(struct stlpanel *panelp, int ioaddr);
 
437
static void     stl_cd1400rxisr(struct stlpanel *panelp, int ioaddr);
 
438
static void     stl_cd1400mdmisr(struct stlpanel *panelp, int ioaddr);
 
439
 
 
440
static inline int       stl_cd1400breakisr(struct stlport *portp, int ioaddr);
 
441
 
 
442
/*
 
443
 *      SC26198 uart specific handling functions.
 
444
 */
 
445
static void     stl_sc26198setreg(struct stlport *portp, int regnr, int value);
 
446
static int      stl_sc26198getreg(struct stlport *portp, int regnr);
 
447
static int      stl_sc26198updatereg(struct stlport *portp, int regnr, int value);
 
448
static int      stl_sc26198getglobreg(struct stlport *portp, int regnr);
 
449
static int      stl_sc26198panelinit(struct stlbrd *brdp, struct stlpanel *panelp);
 
450
static void     stl_sc26198portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
 
451
static void     stl_sc26198setport(struct stlport *portp, struct ktermios *tiosp);
 
452
static int      stl_sc26198getsignals(struct stlport *portp);
 
453
static void     stl_sc26198setsignals(struct stlport *portp, int dtr, int rts);
 
454
static void     stl_sc26198enablerxtx(struct stlport *portp, int rx, int tx);
 
455
static void     stl_sc26198startrxtx(struct stlport *portp, int rx, int tx);
 
456
static void     stl_sc26198disableintrs(struct stlport *portp);
 
457
static void     stl_sc26198sendbreak(struct stlport *portp, int len);
 
458
static void     stl_sc26198flowctrl(struct stlport *portp, int state);
 
459
static void     stl_sc26198sendflow(struct stlport *portp, int state);
 
460
static void     stl_sc26198flush(struct stlport *portp);
 
461
static int      stl_sc26198datastate(struct stlport *portp);
 
462
static void     stl_sc26198wait(struct stlport *portp);
 
463
static void     stl_sc26198txunflow(struct stlport *portp, struct tty_struct *tty);
 
464
static void     stl_sc26198intr(struct stlpanel *panelp, unsigned int iobase);
 
465
static void     stl_sc26198txisr(struct stlport *port);
 
466
static void     stl_sc26198rxisr(struct stlport *port, unsigned int iack);
 
467
static void     stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char ch);
 
468
static void     stl_sc26198rxbadchars(struct stlport *portp);
 
469
static void     stl_sc26198otherisr(struct stlport *port, unsigned int iack);
 
470
 
 
471
/*****************************************************************************/
 
472
 
 
473
/*
 
474
 *      Generic UART support structure.
 
475
 */
 
476
typedef struct uart {
 
477
        int     (*panelinit)(struct stlbrd *brdp, struct stlpanel *panelp);
 
478
        void    (*portinit)(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
 
479
        void    (*setport)(struct stlport *portp, struct ktermios *tiosp);
 
480
        int     (*getsignals)(struct stlport *portp);
 
481
        void    (*setsignals)(struct stlport *portp, int dtr, int rts);
 
482
        void    (*enablerxtx)(struct stlport *portp, int rx, int tx);
 
483
        void    (*startrxtx)(struct stlport *portp, int rx, int tx);
 
484
        void    (*disableintrs)(struct stlport *portp);
 
485
        void    (*sendbreak)(struct stlport *portp, int len);
 
486
        void    (*flowctrl)(struct stlport *portp, int state);
 
487
        void    (*sendflow)(struct stlport *portp, int state);
 
488
        void    (*flush)(struct stlport *portp);
 
489
        int     (*datastate)(struct stlport *portp);
 
490
        void    (*intr)(struct stlpanel *panelp, unsigned int iobase);
 
491
} uart_t;
 
492
 
 
493
/*
 
494
 *      Define some macros to make calling these functions nice and clean.
 
495
 */
 
496
#define stl_panelinit           (* ((uart_t *) panelp->uartp)->panelinit)
 
497
#define stl_portinit            (* ((uart_t *) portp->uartp)->portinit)
 
498
#define stl_setport             (* ((uart_t *) portp->uartp)->setport)
 
499
#define stl_getsignals          (* ((uart_t *) portp->uartp)->getsignals)
 
500
#define stl_setsignals          (* ((uart_t *) portp->uartp)->setsignals)
 
501
#define stl_enablerxtx          (* ((uart_t *) portp->uartp)->enablerxtx)
 
502
#define stl_startrxtx           (* ((uart_t *) portp->uartp)->startrxtx)
 
503
#define stl_disableintrs        (* ((uart_t *) portp->uartp)->disableintrs)
 
504
#define stl_sendbreak           (* ((uart_t *) portp->uartp)->sendbreak)
 
505
#define stl_flowctrl            (* ((uart_t *) portp->uartp)->flowctrl)
 
506
#define stl_sendflow            (* ((uart_t *) portp->uartp)->sendflow)
 
507
#define stl_flush               (* ((uart_t *) portp->uartp)->flush)
 
508
#define stl_datastate           (* ((uart_t *) portp->uartp)->datastate)
 
509
 
 
510
/*****************************************************************************/
 
511
 
 
512
/*
 
513
 *      CD1400 UART specific data initialization.
 
514
 */
 
515
static uart_t stl_cd1400uart = {
 
516
        stl_cd1400panelinit,
 
517
        stl_cd1400portinit,
 
518
        stl_cd1400setport,
 
519
        stl_cd1400getsignals,
 
520
        stl_cd1400setsignals,
 
521
        stl_cd1400enablerxtx,
 
522
        stl_cd1400startrxtx,
 
523
        stl_cd1400disableintrs,
 
524
        stl_cd1400sendbreak,
 
525
        stl_cd1400flowctrl,
 
526
        stl_cd1400sendflow,
 
527
        stl_cd1400flush,
 
528
        stl_cd1400datastate,
 
529
        stl_cd1400eiointr
 
530
};
 
531
 
 
532
/*
 
533
 *      Define the offsets within the register bank of a cd1400 based panel.
 
534
 *      These io address offsets are common to the EasyIO board as well.
 
535
 */
 
536
#define EREG_ADDR       0
 
537
#define EREG_DATA       4
 
538
#define EREG_RXACK      5
 
539
#define EREG_TXACK      6
 
540
#define EREG_MDACK      7
 
541
 
 
542
#define EREG_BANKSIZE   8
 
543
 
 
544
#define CD1400_CLK      25000000
 
545
#define CD1400_CLK8M    20000000
 
546
 
 
547
/*
 
548
 *      Define the cd1400 baud rate clocks. These are used when calculating
 
549
 *      what clock and divisor to use for the required baud rate. Also
 
550
 *      define the maximum baud rate allowed, and the default base baud.
 
551
 */
 
552
static int      stl_cd1400clkdivs[] = {
 
553
        CD1400_CLK0, CD1400_CLK1, CD1400_CLK2, CD1400_CLK3, CD1400_CLK4
 
554
};
 
555
 
 
556
/*****************************************************************************/
 
557
 
 
558
/*
 
559
 *      SC26198 UART specific data initization.
 
560
 */
 
561
static uart_t stl_sc26198uart = {
 
562
        stl_sc26198panelinit,
 
563
        stl_sc26198portinit,
 
564
        stl_sc26198setport,
 
565
        stl_sc26198getsignals,
 
566
        stl_sc26198setsignals,
 
567
        stl_sc26198enablerxtx,
 
568
        stl_sc26198startrxtx,
 
569
        stl_sc26198disableintrs,
 
570
        stl_sc26198sendbreak,
 
571
        stl_sc26198flowctrl,
 
572
        stl_sc26198sendflow,
 
573
        stl_sc26198flush,
 
574
        stl_sc26198datastate,
 
575
        stl_sc26198intr
 
576
};
 
577
 
 
578
/*
 
579
 *      Define the offsets within the register bank of a sc26198 based panel.
 
580
 */
 
581
#define XP_DATA         0
 
582
#define XP_ADDR         1
 
583
#define XP_MODID        2
 
584
#define XP_STATUS       2
 
585
#define XP_IACK         3
 
586
 
 
587
#define XP_BANKSIZE     4
 
588
 
 
589
/*
 
590
 *      Define the sc26198 baud rate table. Offsets within the table
 
591
 *      represent the actual baud rate selector of sc26198 registers.
 
592
 */
 
593
static unsigned int     sc26198_baudtable[] = {
 
594
        50, 75, 150, 200, 300, 450, 600, 900, 1200, 1800, 2400, 3600,
 
595
        4800, 7200, 9600, 14400, 19200, 28800, 38400, 57600, 115200,
 
596
        230400, 460800, 921600
 
597
};
 
598
 
 
599
#define SC26198_NRBAUDS         ARRAY_SIZE(sc26198_baudtable)
 
600
 
 
601
/*****************************************************************************/
 
602
 
 
603
/*
 
604
 *      Define the driver info for a user level control device. Used mainly
 
605
 *      to get at port stats - only not using the port device itself.
 
606
 */
 
607
static const struct file_operations     stl_fsiomem = {
 
608
        .owner          = THIS_MODULE,
 
609
        .unlocked_ioctl = stl_memioctl,
 
610
        .llseek         = noop_llseek,
 
611
};
 
612
 
 
613
static struct class *stallion_class;
 
614
 
 
615
static void stl_cd_change(struct stlport *portp)
 
616
{
 
617
        unsigned int oldsigs = portp->sigs;
 
618
        struct tty_struct *tty = tty_port_tty_get(&portp->port);
 
619
 
 
620
        if (!tty)
 
621
                return;
 
622
 
 
623
        portp->sigs = stl_getsignals(portp);
 
624
 
 
625
        if ((portp->sigs & TIOCM_CD) && ((oldsigs & TIOCM_CD) == 0))
 
626
                wake_up_interruptible(&portp->port.open_wait);
 
627
 
 
628
        if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0))
 
629
                if (portp->port.flags & ASYNC_CHECK_CD)
 
630
                        tty_hangup(tty);
 
631
        tty_kref_put(tty);
 
632
}
 
633
 
 
634
/*
 
635
 *      Check for any arguments passed in on the module load command line.
 
636
 */
 
637
 
 
638
/*****************************************************************************/
 
639
 
 
640
/*
 
641
 *      Parse the supplied argument string, into the board conf struct.
 
642
 */
 
643
 
 
644
static int __init stl_parsebrd(struct stlconf *confp, char **argp)
 
645
{
 
646
        char    *sp;
 
647
        unsigned int i;
 
648
 
 
649
        pr_debug("stl_parsebrd(confp=%p,argp=%p)\n", confp, argp);
 
650
 
 
651
        if ((argp[0] == NULL) || (*argp[0] == 0))
 
652
                return 0;
 
653
 
 
654
        for (sp = argp[0], i = 0; (*sp != 0) && (i < 25); sp++, i++)
 
655
                *sp = tolower(*sp);
 
656
 
 
657
        for (i = 0; i < ARRAY_SIZE(stl_brdstr); i++)
 
658
                if (strcmp(stl_brdstr[i].name, argp[0]) == 0)
 
659
                        break;
 
660
 
 
661
        if (i == ARRAY_SIZE(stl_brdstr)) {
 
662
                printk("STALLION: unknown board name, %s?\n", argp[0]);
 
663
                return 0;
 
664
        }
 
665
 
 
666
        confp->brdtype = stl_brdstr[i].type;
 
667
 
 
668
        i = 1;
 
669
        if ((argp[i] != NULL) && (*argp[i] != 0))
 
670
                confp->ioaddr1 = simple_strtoul(argp[i], NULL, 0);
 
671
        i++;
 
672
        if (confp->brdtype == BRD_ECH) {
 
673
                if ((argp[i] != NULL) && (*argp[i] != 0))
 
674
                        confp->ioaddr2 = simple_strtoul(argp[i], NULL, 0);
 
675
                i++;
 
676
        }
 
677
        if ((argp[i] != NULL) && (*argp[i] != 0))
 
678
                confp->irq = simple_strtoul(argp[i], NULL, 0);
 
679
        return 1;
 
680
}
 
681
 
 
682
/*****************************************************************************/
 
683
 
 
684
/*
 
685
 *      Allocate a new board structure. Fill out the basic info in it.
 
686
 */
 
687
 
 
688
static struct stlbrd *stl_allocbrd(void)
 
689
{
 
690
        struct stlbrd   *brdp;
 
691
 
 
692
        brdp = kzalloc(sizeof(struct stlbrd), GFP_KERNEL);
 
693
        if (!brdp) {
 
694
                printk("STALLION: failed to allocate memory (size=%Zd)\n",
 
695
                        sizeof(struct stlbrd));
 
696
                return NULL;
 
697
        }
 
698
 
 
699
        brdp->magic = STL_BOARDMAGIC;
 
700
        return brdp;
 
701
}
 
702
 
 
703
/*****************************************************************************/
 
704
 
 
705
static int stl_activate(struct tty_port *port, struct tty_struct *tty)
 
706
{
 
707
        struct stlport *portp = container_of(port, struct stlport, port);
 
708
        if (!portp->tx.buf) {
 
709
                portp->tx.buf = kmalloc(STL_TXBUFSIZE, GFP_KERNEL);
 
710
                if (!portp->tx.buf)
 
711
                        return -ENOMEM;
 
712
                portp->tx.head = portp->tx.buf;
 
713
                portp->tx.tail = portp->tx.buf;
 
714
        }
 
715
        stl_setport(portp, tty->termios);
 
716
        portp->sigs = stl_getsignals(portp);
 
717
        stl_setsignals(portp, 1, 1);
 
718
        stl_enablerxtx(portp, 1, 1);
 
719
        stl_startrxtx(portp, 1, 0);
 
720
        return 0;
 
721
}
 
722
 
 
723
static int stl_open(struct tty_struct *tty, struct file *filp)
 
724
{
 
725
        struct stlport  *portp;
 
726
        struct stlbrd   *brdp;
 
727
        unsigned int    minordev, brdnr, panelnr;
 
728
        int             portnr;
 
729
 
 
730
        pr_debug("stl_open(tty=%p,filp=%p): device=%s\n", tty, filp, tty->name);
 
731
 
 
732
        minordev = tty->index;
 
733
        brdnr = MINOR2BRD(minordev);
 
734
        if (brdnr >= stl_nrbrds)
 
735
                return -ENODEV;
 
736
        brdp = stl_brds[brdnr];
 
737
        if (brdp == NULL)
 
738
                return -ENODEV;
 
739
 
 
740
        minordev = MINOR2PORT(minordev);
 
741
        for (portnr = -1, panelnr = 0; panelnr < STL_MAXPANELS; panelnr++) {
 
742
                if (brdp->panels[panelnr] == NULL)
 
743
                        break;
 
744
                if (minordev < brdp->panels[panelnr]->nrports) {
 
745
                        portnr = minordev;
 
746
                        break;
 
747
                }
 
748
                minordev -= brdp->panels[panelnr]->nrports;
 
749
        }
 
750
        if (portnr < 0)
 
751
                return -ENODEV;
 
752
 
 
753
        portp = brdp->panels[panelnr]->ports[portnr];
 
754
        if (portp == NULL)
 
755
                return -ENODEV;
 
756
 
 
757
        tty->driver_data = portp;
 
758
        return tty_port_open(&portp->port, tty, filp);
 
759
 
 
760
}
 
761
 
 
762
/*****************************************************************************/
 
763
 
 
764
static int stl_carrier_raised(struct tty_port *port)
 
765
{
 
766
        struct stlport *portp = container_of(port, struct stlport, port);
 
767
        return (portp->sigs & TIOCM_CD) ? 1 : 0;
 
768
}
 
769
 
 
770
static void stl_dtr_rts(struct tty_port *port, int on)
 
771
{
 
772
        struct stlport *portp = container_of(port, struct stlport, port);
 
773
        /* Takes brd_lock internally */
 
774
        stl_setsignals(portp, on, on);
 
775
}
 
776
 
 
777
/*****************************************************************************/
 
778
 
 
779
static void stl_flushbuffer(struct tty_struct *tty)
 
780
{
 
781
        struct stlport  *portp;
 
782
 
 
783
        pr_debug("stl_flushbuffer(tty=%p)\n", tty);
 
784
 
 
785
        portp = tty->driver_data;
 
786
        if (portp == NULL)
 
787
                return;
 
788
 
 
789
        stl_flush(portp);
 
790
        tty_wakeup(tty);
 
791
}
 
792
 
 
793
/*****************************************************************************/
 
794
 
 
795
static void stl_waituntilsent(struct tty_struct *tty, int timeout)
 
796
{
 
797
        struct stlport  *portp;
 
798
        unsigned long   tend;
 
799
 
 
800
        pr_debug("stl_waituntilsent(tty=%p,timeout=%d)\n", tty, timeout);
 
801
 
 
802
        portp = tty->driver_data;
 
803
        if (portp == NULL)
 
804
                return;
 
805
 
 
806
        if (timeout == 0)
 
807
                timeout = HZ;
 
808
        tend = jiffies + timeout;
 
809
 
 
810
        while (stl_datastate(portp)) {
 
811
                if (signal_pending(current))
 
812
                        break;
 
813
                msleep_interruptible(20);
 
814
                if (time_after_eq(jiffies, tend))
 
815
                        break;
 
816
        }
 
817
}
 
818
 
 
819
/*****************************************************************************/
 
820
 
 
821
static void stl_shutdown(struct tty_port *port)
 
822
{
 
823
        struct stlport *portp = container_of(port, struct stlport, port);
 
824
        stl_disableintrs(portp);
 
825
        stl_enablerxtx(portp, 0, 0);
 
826
        stl_flush(portp);
 
827
        portp->istate = 0;
 
828
        if (portp->tx.buf != NULL) {
 
829
                kfree(portp->tx.buf);
 
830
                portp->tx.buf = NULL;
 
831
                portp->tx.head = NULL;
 
832
                portp->tx.tail = NULL;
 
833
        }
 
834
}
 
835
 
 
836
static void stl_close(struct tty_struct *tty, struct file *filp)
 
837
{
 
838
        struct stlport*portp;
 
839
        pr_debug("stl_close(tty=%p,filp=%p)\n", tty, filp);
 
840
 
 
841
        portp = tty->driver_data;
 
842
        if(portp == NULL)
 
843
                return;
 
844
        tty_port_close(&portp->port, tty, filp);
 
845
}
 
846
 
 
847
/*****************************************************************************/
 
848
 
 
849
/*
 
850
 *      Write routine. Take data and stuff it in to the TX ring queue.
 
851
 *      If transmit interrupts are not running then start them.
 
852
 */
 
853
 
 
854
static int stl_write(struct tty_struct *tty, const unsigned char *buf, int count)
 
855
{
 
856
        struct stlport  *portp;
 
857
        unsigned int    len, stlen;
 
858
        unsigned char   *chbuf;
 
859
        char            *head, *tail;
 
860
 
 
861
        pr_debug("stl_write(tty=%p,buf=%p,count=%d)\n", tty, buf, count);
 
862
 
 
863
        portp = tty->driver_data;
 
864
        if (portp == NULL)
 
865
                return 0;
 
866
        if (portp->tx.buf == NULL)
 
867
                return 0;
 
868
 
 
869
/*
 
870
 *      If copying direct from user space we must cater for page faults,
 
871
 *      causing us to "sleep" here for a while. To handle this copy in all
 
872
 *      the data we need now, into a local buffer. Then when we got it all
 
873
 *      copy it into the TX buffer.
 
874
 */
 
875
        chbuf = (unsigned char *) buf;
 
876
 
 
877
        head = portp->tx.head;
 
878
        tail = portp->tx.tail;
 
879
        if (head >= tail) {
 
880
                len = STL_TXBUFSIZE - (head - tail) - 1;
 
881
                stlen = STL_TXBUFSIZE - (head - portp->tx.buf);
 
882
        } else {
 
883
                len = tail - head - 1;
 
884
                stlen = len;
 
885
        }
 
886
 
 
887
        len = min(len, (unsigned int)count);
 
888
        count = 0;
 
889
        while (len > 0) {
 
890
                stlen = min(len, stlen);
 
891
                memcpy(head, chbuf, stlen);
 
892
                len -= stlen;
 
893
                chbuf += stlen;
 
894
                count += stlen;
 
895
                head += stlen;
 
896
                if (head >= (portp->tx.buf + STL_TXBUFSIZE)) {
 
897
                        head = portp->tx.buf;
 
898
                        stlen = tail - head;
 
899
                }
 
900
        }
 
901
        portp->tx.head = head;
 
902
 
 
903
        clear_bit(ASYI_TXLOW, &portp->istate);
 
904
        stl_startrxtx(portp, -1, 1);
 
905
 
 
906
        return count;
 
907
}
 
908
 
 
909
/*****************************************************************************/
 
910
 
 
911
static int stl_putchar(struct tty_struct *tty, unsigned char ch)
 
912
{
 
913
        struct stlport  *portp;
 
914
        unsigned int    len;
 
915
        char            *head, *tail;
 
916
 
 
917
        pr_debug("stl_putchar(tty=%p,ch=%x)\n", tty, ch);
 
918
 
 
919
        portp = tty->driver_data;
 
920
        if (portp == NULL)
 
921
                return -EINVAL;
 
922
        if (portp->tx.buf == NULL)
 
923
                return -EINVAL;
 
924
 
 
925
        head = portp->tx.head;
 
926
        tail = portp->tx.tail;
 
927
 
 
928
        len = (head >= tail) ? (STL_TXBUFSIZE - (head - tail)) : (tail - head);
 
929
        len--;
 
930
 
 
931
        if (len > 0) {
 
932
                *head++ = ch;
 
933
                if (head >= (portp->tx.buf + STL_TXBUFSIZE))
 
934
                        head = portp->tx.buf;
 
935
        }       
 
936
        portp->tx.head = head;
 
937
        return 0;
 
938
}
 
939
 
 
940
/*****************************************************************************/
 
941
 
 
942
/*
 
943
 *      If there are any characters in the buffer then make sure that TX
 
944
 *      interrupts are on and get'em out. Normally used after the putchar
 
945
 *      routine has been called.
 
946
 */
 
947
 
 
948
static void stl_flushchars(struct tty_struct *tty)
 
949
{
 
950
        struct stlport  *portp;
 
951
 
 
952
        pr_debug("stl_flushchars(tty=%p)\n", tty);
 
953
 
 
954
        portp = tty->driver_data;
 
955
        if (portp == NULL)
 
956
                return;
 
957
        if (portp->tx.buf == NULL)
 
958
                return;
 
959
 
 
960
        stl_startrxtx(portp, -1, 1);
 
961
}
 
962
 
 
963
/*****************************************************************************/
 
964
 
 
965
static int stl_writeroom(struct tty_struct *tty)
 
966
{
 
967
        struct stlport  *portp;
 
968
        char            *head, *tail;
 
969
 
 
970
        pr_debug("stl_writeroom(tty=%p)\n", tty);
 
971
 
 
972
        portp = tty->driver_data;
 
973
        if (portp == NULL)
 
974
                return 0;
 
975
        if (portp->tx.buf == NULL)
 
976
                return 0;
 
977
 
 
978
        head = portp->tx.head;
 
979
        tail = portp->tx.tail;
 
980
        return (head >= tail) ? (STL_TXBUFSIZE - (head - tail) - 1) : (tail - head - 1);
 
981
}
 
982
 
 
983
/*****************************************************************************/
 
984
 
 
985
/*
 
986
 *      Return number of chars in the TX buffer. Normally we would just
 
987
 *      calculate the number of chars in the buffer and return that, but if
 
988
 *      the buffer is empty and TX interrupts are still on then we return
 
989
 *      that the buffer still has 1 char in it. This way whoever called us
 
990
 *      will not think that ALL chars have drained - since the UART still
 
991
 *      must have some chars in it (we are busy after all).
 
992
 */
 
993
 
 
994
static int stl_charsinbuffer(struct tty_struct *tty)
 
995
{
 
996
        struct stlport  *portp;
 
997
        unsigned int    size;
 
998
        char            *head, *tail;
 
999
 
 
1000
        pr_debug("stl_charsinbuffer(tty=%p)\n", tty);
 
1001
 
 
1002
        portp = tty->driver_data;
 
1003
        if (portp == NULL)
 
1004
                return 0;
 
1005
        if (portp->tx.buf == NULL)
 
1006
                return 0;
 
1007
 
 
1008
        head = portp->tx.head;
 
1009
        tail = portp->tx.tail;
 
1010
        size = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
 
1011
        if ((size == 0) && test_bit(ASYI_TXBUSY, &portp->istate))
 
1012
                size = 1;
 
1013
        return size;
 
1014
}
 
1015
 
 
1016
/*****************************************************************************/
 
1017
 
 
1018
/*
 
1019
 *      Generate the serial struct info.
 
1020
 */
 
1021
 
 
1022
static int stl_getserial(struct stlport *portp, struct serial_struct __user *sp)
 
1023
{
 
1024
        struct serial_struct    sio;
 
1025
        struct stlbrd           *brdp;
 
1026
 
 
1027
        pr_debug("stl_getserial(portp=%p,sp=%p)\n", portp, sp);
 
1028
 
 
1029
        memset(&sio, 0, sizeof(struct serial_struct));
 
1030
 
 
1031
        mutex_lock(&portp->port.mutex);
 
1032
        sio.line = portp->portnr;
 
1033
        sio.port = portp->ioaddr;
 
1034
        sio.flags = portp->port.flags;
 
1035
        sio.baud_base = portp->baud_base;
 
1036
        sio.close_delay = portp->close_delay;
 
1037
        sio.closing_wait = portp->closing_wait;
 
1038
        sio.custom_divisor = portp->custom_divisor;
 
1039
        sio.hub6 = 0;
 
1040
        if (portp->uartp == &stl_cd1400uart) {
 
1041
                sio.type = PORT_CIRRUS;
 
1042
                sio.xmit_fifo_size = CD1400_TXFIFOSIZE;
 
1043
        } else {
 
1044
                sio.type = PORT_UNKNOWN;
 
1045
                sio.xmit_fifo_size = SC26198_TXFIFOSIZE;
 
1046
        }
 
1047
 
 
1048
        brdp = stl_brds[portp->brdnr];
 
1049
        if (brdp != NULL)
 
1050
                sio.irq = brdp->irq;
 
1051
        mutex_unlock(&portp->port.mutex);
 
1052
 
 
1053
        return copy_to_user(sp, &sio, sizeof(struct serial_struct)) ? -EFAULT : 0;
 
1054
}
 
1055
 
 
1056
/*****************************************************************************/
 
1057
 
 
1058
/*
 
1059
 *      Set port according to the serial struct info.
 
1060
 *      At this point we do not do any auto-configure stuff, so we will
 
1061
 *      just quietly ignore any requests to change irq, etc.
 
1062
 */
 
1063
 
 
1064
static int stl_setserial(struct tty_struct *tty, struct serial_struct __user *sp)
 
1065
{
 
1066
        struct stlport *        portp = tty->driver_data;
 
1067
        struct serial_struct    sio;
 
1068
 
 
1069
        pr_debug("stl_setserial(portp=%p,sp=%p)\n", portp, sp);
 
1070
 
 
1071
        if (copy_from_user(&sio, sp, sizeof(struct serial_struct)))
 
1072
                return -EFAULT;
 
1073
        mutex_lock(&portp->port.mutex);
 
1074
        if (!capable(CAP_SYS_ADMIN)) {
 
1075
                if ((sio.baud_base != portp->baud_base) ||
 
1076
                    (sio.close_delay != portp->close_delay) ||
 
1077
                    ((sio.flags & ~ASYNC_USR_MASK) !=
 
1078
                    (portp->port.flags & ~ASYNC_USR_MASK))) {
 
1079
                        mutex_unlock(&portp->port.mutex);
 
1080
                        return -EPERM;
 
1081
                }
 
1082
        } 
 
1083
 
 
1084
        portp->port.flags = (portp->port.flags & ~ASYNC_USR_MASK) |
 
1085
                (sio.flags & ASYNC_USR_MASK);
 
1086
        portp->baud_base = sio.baud_base;
 
1087
        portp->close_delay = sio.close_delay;
 
1088
        portp->closing_wait = sio.closing_wait;
 
1089
        portp->custom_divisor = sio.custom_divisor;
 
1090
        mutex_unlock(&portp->port.mutex);
 
1091
        stl_setport(portp, tty->termios);
 
1092
        return 0;
 
1093
}
 
1094
 
 
1095
/*****************************************************************************/
 
1096
 
 
1097
static int stl_tiocmget(struct tty_struct *tty)
 
1098
{
 
1099
        struct stlport  *portp;
 
1100
 
 
1101
        portp = tty->driver_data;
 
1102
        if (portp == NULL)
 
1103
                return -ENODEV;
 
1104
        if (tty->flags & (1 << TTY_IO_ERROR))
 
1105
                return -EIO;
 
1106
 
 
1107
        return stl_getsignals(portp);
 
1108
}
 
1109
 
 
1110
static int stl_tiocmset(struct tty_struct *tty,
 
1111
                        unsigned int set, unsigned int clear)
 
1112
{
 
1113
        struct stlport  *portp;
 
1114
        int rts = -1, dtr = -1;
 
1115
 
 
1116
        portp = tty->driver_data;
 
1117
        if (portp == NULL)
 
1118
                return -ENODEV;
 
1119
        if (tty->flags & (1 << TTY_IO_ERROR))
 
1120
                return -EIO;
 
1121
 
 
1122
        if (set & TIOCM_RTS)
 
1123
                rts = 1;
 
1124
        if (set & TIOCM_DTR)
 
1125
                dtr = 1;
 
1126
        if (clear & TIOCM_RTS)
 
1127
                rts = 0;
 
1128
        if (clear & TIOCM_DTR)
 
1129
                dtr = 0;
 
1130
 
 
1131
        stl_setsignals(portp, dtr, rts);
 
1132
        return 0;
 
1133
}
 
1134
 
 
1135
static int stl_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
 
1136
{
 
1137
        struct stlport  *portp;
 
1138
        int             rc;
 
1139
        void __user *argp = (void __user *)arg;
 
1140
 
 
1141
        pr_debug("stl_ioctl(tty=%p,cmd=%x,arg=%lx)\n", tty, cmd, arg);
 
1142
 
 
1143
        portp = tty->driver_data;
 
1144
        if (portp == NULL)
 
1145
                return -ENODEV;
 
1146
 
 
1147
        if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
 
1148
            (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS))
 
1149
                if (tty->flags & (1 << TTY_IO_ERROR))
 
1150
                        return -EIO;
 
1151
 
 
1152
        rc = 0;
 
1153
 
 
1154
        switch (cmd) {
 
1155
        case TIOCGSERIAL:
 
1156
                rc = stl_getserial(portp, argp);
 
1157
                break;
 
1158
        case TIOCSSERIAL:
 
1159
                rc = stl_setserial(tty, argp);
 
1160
                break;
 
1161
        case COM_GETPORTSTATS:
 
1162
                rc = stl_getportstats(tty, portp, argp);
 
1163
                break;
 
1164
        case COM_CLRPORTSTATS:
 
1165
                rc = stl_clrportstats(portp, argp);
 
1166
                break;
 
1167
        case TIOCSERCONFIG:
 
1168
        case TIOCSERGWILD:
 
1169
        case TIOCSERSWILD:
 
1170
        case TIOCSERGETLSR:
 
1171
        case TIOCSERGSTRUCT:
 
1172
        case TIOCSERGETMULTI:
 
1173
        case TIOCSERSETMULTI:
 
1174
        default:
 
1175
                rc = -ENOIOCTLCMD;
 
1176
                break;
 
1177
        }
 
1178
        return rc;
 
1179
}
 
1180
 
 
1181
/*****************************************************************************/
 
1182
 
 
1183
/*
 
1184
 *      Start the transmitter again. Just turn TX interrupts back on.
 
1185
 */
 
1186
 
 
1187
static void stl_start(struct tty_struct *tty)
 
1188
{
 
1189
        struct stlport  *portp;
 
1190
 
 
1191
        pr_debug("stl_start(tty=%p)\n", tty);
 
1192
 
 
1193
        portp = tty->driver_data;
 
1194
        if (portp == NULL)
 
1195
                return;
 
1196
        stl_startrxtx(portp, -1, 1);
 
1197
}
 
1198
 
 
1199
/*****************************************************************************/
 
1200
 
 
1201
static void stl_settermios(struct tty_struct *tty, struct ktermios *old)
 
1202
{
 
1203
        struct stlport  *portp;
 
1204
        struct ktermios *tiosp;
 
1205
 
 
1206
        pr_debug("stl_settermios(tty=%p,old=%p)\n", tty, old);
 
1207
 
 
1208
        portp = tty->driver_data;
 
1209
        if (portp == NULL)
 
1210
                return;
 
1211
 
 
1212
        tiosp = tty->termios;
 
1213
        if ((tiosp->c_cflag == old->c_cflag) &&
 
1214
            (tiosp->c_iflag == old->c_iflag))
 
1215
                return;
 
1216
 
 
1217
        stl_setport(portp, tiosp);
 
1218
        stl_setsignals(portp, ((tiosp->c_cflag & (CBAUD & ~CBAUDEX)) ? 1 : 0),
 
1219
                -1);
 
1220
        if ((old->c_cflag & CRTSCTS) && ((tiosp->c_cflag & CRTSCTS) == 0)) {
 
1221
                tty->hw_stopped = 0;
 
1222
                stl_start(tty);
 
1223
        }
 
1224
        if (((old->c_cflag & CLOCAL) == 0) && (tiosp->c_cflag & CLOCAL))
 
1225
                wake_up_interruptible(&portp->port.open_wait);
 
1226
}
 
1227
 
 
1228
/*****************************************************************************/
 
1229
 
 
1230
/*
 
1231
 *      Attempt to flow control who ever is sending us data. Based on termios
 
1232
 *      settings use software or/and hardware flow control.
 
1233
 */
 
1234
 
 
1235
static void stl_throttle(struct tty_struct *tty)
 
1236
{
 
1237
        struct stlport  *portp;
 
1238
 
 
1239
        pr_debug("stl_throttle(tty=%p)\n", tty);
 
1240
 
 
1241
        portp = tty->driver_data;
 
1242
        if (portp == NULL)
 
1243
                return;
 
1244
        stl_flowctrl(portp, 0);
 
1245
}
 
1246
 
 
1247
/*****************************************************************************/
 
1248
 
 
1249
/*
 
1250
 *      Unflow control the device sending us data...
 
1251
 */
 
1252
 
 
1253
static void stl_unthrottle(struct tty_struct *tty)
 
1254
{
 
1255
        struct stlport  *portp;
 
1256
 
 
1257
        pr_debug("stl_unthrottle(tty=%p)\n", tty);
 
1258
 
 
1259
        portp = tty->driver_data;
 
1260
        if (portp == NULL)
 
1261
                return;
 
1262
        stl_flowctrl(portp, 1);
 
1263
}
 
1264
 
 
1265
/*****************************************************************************/
 
1266
 
 
1267
/*
 
1268
 *      Stop the transmitter. Basically to do this we will just turn TX
 
1269
 *      interrupts off.
 
1270
 */
 
1271
 
 
1272
static void stl_stop(struct tty_struct *tty)
 
1273
{
 
1274
        struct stlport  *portp;
 
1275
 
 
1276
        pr_debug("stl_stop(tty=%p)\n", tty);
 
1277
 
 
1278
        portp = tty->driver_data;
 
1279
        if (portp == NULL)
 
1280
                return;
 
1281
        stl_startrxtx(portp, -1, 0);
 
1282
}
 
1283
 
 
1284
/*****************************************************************************/
 
1285
 
 
1286
/*
 
1287
 *      Hangup this port. This is pretty much like closing the port, only
 
1288
 *      a little more brutal. No waiting for data to drain. Shutdown the
 
1289
 *      port and maybe drop signals.
 
1290
 */
 
1291
 
 
1292
static void stl_hangup(struct tty_struct *tty)
 
1293
{
 
1294
        struct stlport  *portp = tty->driver_data;
 
1295
        pr_debug("stl_hangup(tty=%p)\n", tty);
 
1296
 
 
1297
        if (portp == NULL)
 
1298
                return;
 
1299
        tty_port_hangup(&portp->port);
 
1300
}
 
1301
 
 
1302
/*****************************************************************************/
 
1303
 
 
1304
static int stl_breakctl(struct tty_struct *tty, int state)
 
1305
{
 
1306
        struct stlport  *portp;
 
1307
 
 
1308
        pr_debug("stl_breakctl(tty=%p,state=%d)\n", tty, state);
 
1309
 
 
1310
        portp = tty->driver_data;
 
1311
        if (portp == NULL)
 
1312
                return -EINVAL;
 
1313
 
 
1314
        stl_sendbreak(portp, ((state == -1) ? 1 : 2));
 
1315
        return 0;
 
1316
}
 
1317
 
 
1318
/*****************************************************************************/
 
1319
 
 
1320
static void stl_sendxchar(struct tty_struct *tty, char ch)
 
1321
{
 
1322
        struct stlport  *portp;
 
1323
 
 
1324
        pr_debug("stl_sendxchar(tty=%p,ch=%x)\n", tty, ch);
 
1325
 
 
1326
        portp = tty->driver_data;
 
1327
        if (portp == NULL)
 
1328
                return;
 
1329
 
 
1330
        if (ch == STOP_CHAR(tty))
 
1331
                stl_sendflow(portp, 0);
 
1332
        else if (ch == START_CHAR(tty))
 
1333
                stl_sendflow(portp, 1);
 
1334
        else
 
1335
                stl_putchar(tty, ch);
 
1336
}
 
1337
 
 
1338
static void stl_portinfo(struct seq_file *m, struct stlport *portp, int portnr)
 
1339
{
 
1340
        int     sigs;
 
1341
        char sep;
 
1342
 
 
1343
        seq_printf(m, "%d: uart:%s tx:%d rx:%d",
 
1344
                portnr, (portp->hwid == 1) ? "SC26198" : "CD1400",
 
1345
                (int) portp->stats.txtotal, (int) portp->stats.rxtotal);
 
1346
 
 
1347
        if (portp->stats.rxframing)
 
1348
                seq_printf(m, " fe:%d", (int) portp->stats.rxframing);
 
1349
        if (portp->stats.rxparity)
 
1350
                seq_printf(m, " pe:%d", (int) portp->stats.rxparity);
 
1351
        if (portp->stats.rxbreaks)
 
1352
                seq_printf(m, " brk:%d", (int) portp->stats.rxbreaks);
 
1353
        if (portp->stats.rxoverrun)
 
1354
                seq_printf(m, " oe:%d", (int) portp->stats.rxoverrun);
 
1355
 
 
1356
        sigs = stl_getsignals(portp);
 
1357
        sep = ' ';
 
1358
        if (sigs & TIOCM_RTS) {
 
1359
                seq_printf(m, "%c%s", sep, "RTS");
 
1360
                sep = '|';
 
1361
        }
 
1362
        if (sigs & TIOCM_CTS) {
 
1363
                seq_printf(m, "%c%s", sep, "CTS");
 
1364
                sep = '|';
 
1365
        }
 
1366
        if (sigs & TIOCM_DTR) {
 
1367
                seq_printf(m, "%c%s", sep, "DTR");
 
1368
                sep = '|';
 
1369
        }
 
1370
        if (sigs & TIOCM_CD) {
 
1371
                seq_printf(m, "%c%s", sep, "DCD");
 
1372
                sep = '|';
 
1373
        }
 
1374
        if (sigs & TIOCM_DSR) {
 
1375
                seq_printf(m, "%c%s", sep, "DSR");
 
1376
                sep = '|';
 
1377
        }
 
1378
        seq_putc(m, '\n');
 
1379
}
 
1380
 
 
1381
/*****************************************************************************/
 
1382
 
 
1383
/*
 
1384
 *      Port info, read from the /proc file system.
 
1385
 */
 
1386
 
 
1387
static int stl_proc_show(struct seq_file *m, void *v)
 
1388
{
 
1389
        struct stlbrd   *brdp;
 
1390
        struct stlpanel *panelp;
 
1391
        struct stlport  *portp;
 
1392
        unsigned int    brdnr, panelnr, portnr;
 
1393
        int             totalport;
 
1394
 
 
1395
        totalport = 0;
 
1396
 
 
1397
        seq_printf(m, "%s: version %s\n", stl_drvtitle, stl_drvversion);
 
1398
 
 
1399
/*
 
1400
 *      We scan through for each board, panel and port. The offset is
 
1401
 *      calculated on the fly, and irrelevant ports are skipped.
 
1402
 */
 
1403
        for (brdnr = 0; brdnr < stl_nrbrds; brdnr++) {
 
1404
                brdp = stl_brds[brdnr];
 
1405
                if (brdp == NULL)
 
1406
                        continue;
 
1407
                if (brdp->state == 0)
 
1408
                        continue;
 
1409
 
 
1410
                totalport = brdnr * STL_MAXPORTS;
 
1411
                for (panelnr = 0; panelnr < brdp->nrpanels; panelnr++) {
 
1412
                        panelp = brdp->panels[panelnr];
 
1413
                        if (panelp == NULL)
 
1414
                                continue;
 
1415
 
 
1416
                        for (portnr = 0; portnr < panelp->nrports; portnr++,
 
1417
                            totalport++) {
 
1418
                                portp = panelp->ports[portnr];
 
1419
                                if (portp == NULL)
 
1420
                                        continue;
 
1421
                                stl_portinfo(m, portp, totalport);
 
1422
                        }
 
1423
                }
 
1424
        }
 
1425
        return 0;
 
1426
}
 
1427
 
 
1428
static int stl_proc_open(struct inode *inode, struct file *file)
 
1429
{
 
1430
        return single_open(file, stl_proc_show, NULL);
 
1431
}
 
1432
 
 
1433
static const struct file_operations stl_proc_fops = {
 
1434
        .owner          = THIS_MODULE,
 
1435
        .open           = stl_proc_open,
 
1436
        .read           = seq_read,
 
1437
        .llseek         = seq_lseek,
 
1438
        .release        = single_release,
 
1439
};
 
1440
 
 
1441
/*****************************************************************************/
 
1442
 
 
1443
/*
 
1444
 *      All board interrupts are vectored through here first. This code then
 
1445
 *      calls off to the approrpriate board interrupt handlers.
 
1446
 */
 
1447
 
 
1448
static irqreturn_t stl_intr(int irq, void *dev_id)
 
1449
{
 
1450
        struct stlbrd *brdp = dev_id;
 
1451
 
 
1452
        pr_debug("stl_intr(brdp=%p,irq=%d)\n", brdp, brdp->irq);
 
1453
 
 
1454
        return IRQ_RETVAL((* brdp->isr)(brdp));
 
1455
}
 
1456
 
 
1457
/*****************************************************************************/
 
1458
 
 
1459
/*
 
1460
 *      Interrupt service routine for EasyIO board types.
 
1461
 */
 
1462
 
 
1463
static int stl_eiointr(struct stlbrd *brdp)
 
1464
{
 
1465
        struct stlpanel *panelp;
 
1466
        unsigned int    iobase;
 
1467
        int             handled = 0;
 
1468
 
 
1469
        spin_lock(&brd_lock);
 
1470
        panelp = brdp->panels[0];
 
1471
        iobase = panelp->iobase;
 
1472
        while (inb(brdp->iostatus) & EIO_INTRPEND) {
 
1473
                handled = 1;
 
1474
                (* panelp->isr)(panelp, iobase);
 
1475
        }
 
1476
        spin_unlock(&brd_lock);
 
1477
        return handled;
 
1478
}
 
1479
 
 
1480
/*****************************************************************************/
 
1481
 
 
1482
/*
 
1483
 *      Interrupt service routine for ECH-AT board types.
 
1484
 */
 
1485
 
 
1486
static int stl_echatintr(struct stlbrd *brdp)
 
1487
{
 
1488
        struct stlpanel *panelp;
 
1489
        unsigned int    ioaddr, bnknr;
 
1490
        int             handled = 0;
 
1491
 
 
1492
        outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
 
1493
 
 
1494
        while (inb(brdp->iostatus) & ECH_INTRPEND) {
 
1495
                handled = 1;
 
1496
                for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
 
1497
                        ioaddr = brdp->bnkstataddr[bnknr];
 
1498
                        if (inb(ioaddr) & ECH_PNLINTRPEND) {
 
1499
                                panelp = brdp->bnk2panel[bnknr];
 
1500
                                (* panelp->isr)(panelp, (ioaddr & 0xfffc));
 
1501
                        }
 
1502
                }
 
1503
        }
 
1504
 
 
1505
        outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
 
1506
 
 
1507
        return handled;
 
1508
}
 
1509
 
 
1510
/*****************************************************************************/
 
1511
 
 
1512
/*
 
1513
 *      Interrupt service routine for ECH-MCA board types.
 
1514
 */
 
1515
 
 
1516
static int stl_echmcaintr(struct stlbrd *brdp)
 
1517
{
 
1518
        struct stlpanel *panelp;
 
1519
        unsigned int    ioaddr, bnknr;
 
1520
        int             handled = 0;
 
1521
 
 
1522
        while (inb(brdp->iostatus) & ECH_INTRPEND) {
 
1523
                handled = 1;
 
1524
                for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
 
1525
                        ioaddr = brdp->bnkstataddr[bnknr];
 
1526
                        if (inb(ioaddr) & ECH_PNLINTRPEND) {
 
1527
                                panelp = brdp->bnk2panel[bnknr];
 
1528
                                (* panelp->isr)(panelp, (ioaddr & 0xfffc));
 
1529
                        }
 
1530
                }
 
1531
        }
 
1532
        return handled;
 
1533
}
 
1534
 
 
1535
/*****************************************************************************/
 
1536
 
 
1537
/*
 
1538
 *      Interrupt service routine for ECH-PCI board types.
 
1539
 */
 
1540
 
 
1541
static int stl_echpciintr(struct stlbrd *brdp)
 
1542
{
 
1543
        struct stlpanel *panelp;
 
1544
        unsigned int    ioaddr, bnknr, recheck;
 
1545
        int             handled = 0;
 
1546
 
 
1547
        while (1) {
 
1548
                recheck = 0;
 
1549
                for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
 
1550
                        outb(brdp->bnkpageaddr[bnknr], brdp->ioctrl);
 
1551
                        ioaddr = brdp->bnkstataddr[bnknr];
 
1552
                        if (inb(ioaddr) & ECH_PNLINTRPEND) {
 
1553
                                panelp = brdp->bnk2panel[bnknr];
 
1554
                                (* panelp->isr)(panelp, (ioaddr & 0xfffc));
 
1555
                                recheck++;
 
1556
                                handled = 1;
 
1557
                        }
 
1558
                }
 
1559
                if (! recheck)
 
1560
                        break;
 
1561
        }
 
1562
        return handled;
 
1563
}
 
1564
 
 
1565
/*****************************************************************************/
 
1566
 
 
1567
/*
 
1568
 *      Interrupt service routine for ECH-8/64-PCI board types.
 
1569
 */
 
1570
 
 
1571
static int stl_echpci64intr(struct stlbrd *brdp)
 
1572
{
 
1573
        struct stlpanel *panelp;
 
1574
        unsigned int    ioaddr, bnknr;
 
1575
        int             handled = 0;
 
1576
 
 
1577
        while (inb(brdp->ioctrl) & 0x1) {
 
1578
                handled = 1;
 
1579
                for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
 
1580
                        ioaddr = brdp->bnkstataddr[bnknr];
 
1581
                        if (inb(ioaddr) & ECH_PNLINTRPEND) {
 
1582
                                panelp = brdp->bnk2panel[bnknr];
 
1583
                                (* panelp->isr)(panelp, (ioaddr & 0xfffc));
 
1584
                        }
 
1585
                }
 
1586
        }
 
1587
 
 
1588
        return handled;
 
1589
}
 
1590
 
 
1591
/*****************************************************************************/
 
1592
 
 
1593
/*
 
1594
 *      Initialize all the ports on a panel.
 
1595
 */
 
1596
 
 
1597
static int __devinit stl_initports(struct stlbrd *brdp, struct stlpanel *panelp)
 
1598
{
 
1599
        struct stlport *portp;
 
1600
        unsigned int i;
 
1601
        int chipmask;
 
1602
 
 
1603
        pr_debug("stl_initports(brdp=%p,panelp=%p)\n", brdp, panelp);
 
1604
 
 
1605
        chipmask = stl_panelinit(brdp, panelp);
 
1606
 
 
1607
/*
 
1608
 *      All UART's are initialized (if found!). Now go through and setup
 
1609
 *      each ports data structures.
 
1610
 */
 
1611
        for (i = 0; i < panelp->nrports; i++) {
 
1612
                portp = kzalloc(sizeof(struct stlport), GFP_KERNEL);
 
1613
                if (!portp) {
 
1614
                        printk("STALLION: failed to allocate memory "
 
1615
                                "(size=%Zd)\n", sizeof(struct stlport));
 
1616
                        break;
 
1617
                }
 
1618
                tty_port_init(&portp->port);
 
1619
                portp->port.ops = &stl_port_ops;
 
1620
                portp->magic = STL_PORTMAGIC;
 
1621
                portp->portnr = i;
 
1622
                portp->brdnr = panelp->brdnr;
 
1623
                portp->panelnr = panelp->panelnr;
 
1624
                portp->uartp = panelp->uartp;
 
1625
                portp->clk = brdp->clk;
 
1626
                portp->baud_base = STL_BAUDBASE;
 
1627
                portp->close_delay = STL_CLOSEDELAY;
 
1628
                portp->closing_wait = 30 * HZ;
 
1629
                init_waitqueue_head(&portp->port.open_wait);
 
1630
                init_waitqueue_head(&portp->port.close_wait);
 
1631
                portp->stats.brd = portp->brdnr;
 
1632
                portp->stats.panel = portp->panelnr;
 
1633
                portp->stats.port = portp->portnr;
 
1634
                panelp->ports[i] = portp;
 
1635
                stl_portinit(brdp, panelp, portp);
 
1636
        }
 
1637
 
 
1638
        return 0;
 
1639
}
 
1640
 
 
1641
static void stl_cleanup_panels(struct stlbrd *brdp)
 
1642
{
 
1643
        struct stlpanel *panelp;
 
1644
        struct stlport *portp;
 
1645
        unsigned int j, k;
 
1646
        struct tty_struct *tty;
 
1647
 
 
1648
        for (j = 0; j < STL_MAXPANELS; j++) {
 
1649
                panelp = brdp->panels[j];
 
1650
                if (panelp == NULL)
 
1651
                        continue;
 
1652
                for (k = 0; k < STL_PORTSPERPANEL; k++) {
 
1653
                        portp = panelp->ports[k];
 
1654
                        if (portp == NULL)
 
1655
                                continue;
 
1656
                        tty = tty_port_tty_get(&portp->port);
 
1657
                        if (tty != NULL) {
 
1658
                                stl_hangup(tty);
 
1659
                                tty_kref_put(tty);
 
1660
                        }
 
1661
                        kfree(portp->tx.buf);
 
1662
                        kfree(portp);
 
1663
                }
 
1664
                kfree(panelp);
 
1665
        }
 
1666
}
 
1667
 
 
1668
/*****************************************************************************/
 
1669
 
 
1670
/*
 
1671
 *      Try to find and initialize an EasyIO board.
 
1672
 */
 
1673
 
 
1674
static int __devinit stl_initeio(struct stlbrd *brdp)
 
1675
{
 
1676
        struct stlpanel *panelp;
 
1677
        unsigned int    status;
 
1678
        char            *name;
 
1679
        int             retval;
 
1680
 
 
1681
        pr_debug("stl_initeio(brdp=%p)\n", brdp);
 
1682
 
 
1683
        brdp->ioctrl = brdp->ioaddr1 + 1;
 
1684
        brdp->iostatus = brdp->ioaddr1 + 2;
 
1685
 
 
1686
        status = inb(brdp->iostatus);
 
1687
        if ((status & EIO_IDBITMASK) == EIO_MK3)
 
1688
                brdp->ioctrl++;
 
1689
 
 
1690
/*
 
1691
 *      Handle board specific stuff now. The real difference is PCI
 
1692
 *      or not PCI.
 
1693
 */
 
1694
        if (brdp->brdtype == BRD_EASYIOPCI) {
 
1695
                brdp->iosize1 = 0x80;
 
1696
                brdp->iosize2 = 0x80;
 
1697
                name = "serial(EIO-PCI)";
 
1698
                outb(0x41, (brdp->ioaddr2 + 0x4c));
 
1699
        } else {
 
1700
                brdp->iosize1 = 8;
 
1701
                name = "serial(EIO)";
 
1702
                if ((brdp->irq < 0) || (brdp->irq > 15) ||
 
1703
                    (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
 
1704
                        printk("STALLION: invalid irq=%d for brd=%d\n",
 
1705
                                brdp->irq, brdp->brdnr);
 
1706
                        retval = -EINVAL;
 
1707
                        goto err;
 
1708
                }
 
1709
                outb((stl_vecmap[brdp->irq] | EIO_0WS |
 
1710
                        ((brdp->irqtype) ? EIO_INTLEVEL : EIO_INTEDGE)),
 
1711
                        brdp->ioctrl);
 
1712
        }
 
1713
 
 
1714
        retval = -EBUSY;
 
1715
        if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
 
1716
                printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
 
1717
                        "%x conflicts with another device\n", brdp->brdnr, 
 
1718
                        brdp->ioaddr1);
 
1719
                goto err;
 
1720
        }
 
1721
        
 
1722
        if (brdp->iosize2 > 0)
 
1723
                if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
 
1724
                        printk(KERN_WARNING "STALLION: Warning, board %d I/O "
 
1725
                                "address %x conflicts with another device\n",
 
1726
                                brdp->brdnr, brdp->ioaddr2);
 
1727
                        printk(KERN_WARNING "STALLION: Warning, also "
 
1728
                                "releasing board %d I/O address %x \n", 
 
1729
                                brdp->brdnr, brdp->ioaddr1);
 
1730
                        goto err_rel1;
 
1731
                }
 
1732
 
 
1733
/*
 
1734
 *      Everything looks OK, so let's go ahead and probe for the hardware.
 
1735
 */
 
1736
        brdp->clk = CD1400_CLK;
 
1737
        brdp->isr = stl_eiointr;
 
1738
 
 
1739
        retval = -ENODEV;
 
1740
        switch (status & EIO_IDBITMASK) {
 
1741
        case EIO_8PORTM:
 
1742
                brdp->clk = CD1400_CLK8M;
 
1743
                /* fall thru */
 
1744
        case EIO_8PORTRS:
 
1745
        case EIO_8PORTDI:
 
1746
                brdp->nrports = 8;
 
1747
                break;
 
1748
        case EIO_4PORTRS:
 
1749
                brdp->nrports = 4;
 
1750
                break;
 
1751
        case EIO_MK3:
 
1752
                switch (status & EIO_BRDMASK) {
 
1753
                case ID_BRD4:
 
1754
                        brdp->nrports = 4;
 
1755
                        break;
 
1756
                case ID_BRD8:
 
1757
                        brdp->nrports = 8;
 
1758
                        break;
 
1759
                case ID_BRD16:
 
1760
                        brdp->nrports = 16;
 
1761
                        break;
 
1762
                default:
 
1763
                        goto err_rel2;
 
1764
                }
 
1765
                break;
 
1766
        default:
 
1767
                goto err_rel2;
 
1768
        }
 
1769
 
 
1770
/*
 
1771
 *      We have verified that the board is actually present, so now we
 
1772
 *      can complete the setup.
 
1773
 */
 
1774
 
 
1775
        panelp = kzalloc(sizeof(struct stlpanel), GFP_KERNEL);
 
1776
        if (!panelp) {
 
1777
                printk(KERN_WARNING "STALLION: failed to allocate memory "
 
1778
                        "(size=%Zd)\n", sizeof(struct stlpanel));
 
1779
                retval = -ENOMEM;
 
1780
                goto err_rel2;
 
1781
        }
 
1782
 
 
1783
        panelp->magic = STL_PANELMAGIC;
 
1784
        panelp->brdnr = brdp->brdnr;
 
1785
        panelp->panelnr = 0;
 
1786
        panelp->nrports = brdp->nrports;
 
1787
        panelp->iobase = brdp->ioaddr1;
 
1788
        panelp->hwid = status;
 
1789
        if ((status & EIO_IDBITMASK) == EIO_MK3) {
 
1790
                panelp->uartp = &stl_sc26198uart;
 
1791
                panelp->isr = stl_sc26198intr;
 
1792
        } else {
 
1793
                panelp->uartp = &stl_cd1400uart;
 
1794
                panelp->isr = stl_cd1400eiointr;
 
1795
        }
 
1796
 
 
1797
        brdp->panels[0] = panelp;
 
1798
        brdp->nrpanels = 1;
 
1799
        brdp->state |= BRD_FOUND;
 
1800
        brdp->hwid = status;
 
1801
        if (request_irq(brdp->irq, stl_intr, IRQF_SHARED, name, brdp) != 0) {
 
1802
                printk("STALLION: failed to register interrupt "
 
1803
                    "routine for %s irq=%d\n", name, brdp->irq);
 
1804
                retval = -ENODEV;
 
1805
                goto err_fr;
 
1806
        }
 
1807
 
 
1808
        return 0;
 
1809
err_fr:
 
1810
        stl_cleanup_panels(brdp);
 
1811
err_rel2:
 
1812
        if (brdp->iosize2 > 0)
 
1813
                release_region(brdp->ioaddr2, brdp->iosize2);
 
1814
err_rel1:
 
1815
        release_region(brdp->ioaddr1, brdp->iosize1);
 
1816
err:
 
1817
        return retval;
 
1818
}
 
1819
 
 
1820
/*****************************************************************************/
 
1821
 
 
1822
/*
 
1823
 *      Try to find an ECH board and initialize it. This code is capable of
 
1824
 *      dealing with all types of ECH board.
 
1825
 */
 
1826
 
 
1827
static int __devinit stl_initech(struct stlbrd *brdp)
 
1828
{
 
1829
        struct stlpanel *panelp;
 
1830
        unsigned int    status, nxtid, ioaddr, conflict, panelnr, banknr, i;
 
1831
        int             retval;
 
1832
        char            *name;
 
1833
 
 
1834
        pr_debug("stl_initech(brdp=%p)\n", brdp);
 
1835
 
 
1836
        status = 0;
 
1837
        conflict = 0;
 
1838
 
 
1839
/*
 
1840
 *      Set up the initial board register contents for boards. This varies a
 
1841
 *      bit between the different board types. So we need to handle each
 
1842
 *      separately. Also do a check that the supplied IRQ is good.
 
1843
 */
 
1844
        switch (brdp->brdtype) {
 
1845
 
 
1846
        case BRD_ECH:
 
1847
                brdp->isr = stl_echatintr;
 
1848
                brdp->ioctrl = brdp->ioaddr1 + 1;
 
1849
                brdp->iostatus = brdp->ioaddr1 + 1;
 
1850
                status = inb(brdp->iostatus);
 
1851
                if ((status & ECH_IDBITMASK) != ECH_ID) {
 
1852
                        retval = -ENODEV;
 
1853
                        goto err;
 
1854
                }
 
1855
                if ((brdp->irq < 0) || (brdp->irq > 15) ||
 
1856
                    (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
 
1857
                        printk("STALLION: invalid irq=%d for brd=%d\n",
 
1858
                                brdp->irq, brdp->brdnr);
 
1859
                        retval = -EINVAL;
 
1860
                        goto err;
 
1861
                }
 
1862
                status = ((brdp->ioaddr2 & ECH_ADDR2MASK) >> 1);
 
1863
                status |= (stl_vecmap[brdp->irq] << 1);
 
1864
                outb((status | ECH_BRDRESET), brdp->ioaddr1);
 
1865
                brdp->ioctrlval = ECH_INTENABLE |
 
1866
                        ((brdp->irqtype) ? ECH_INTLEVEL : ECH_INTEDGE);
 
1867
                for (i = 0; i < 10; i++)
 
1868
                        outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
 
1869
                brdp->iosize1 = 2;
 
1870
                brdp->iosize2 = 32;
 
1871
                name = "serial(EC8/32)";
 
1872
                outb(status, brdp->ioaddr1);
 
1873
                break;
 
1874
 
 
1875
        case BRD_ECHMC:
 
1876
                brdp->isr = stl_echmcaintr;
 
1877
                brdp->ioctrl = brdp->ioaddr1 + 0x20;
 
1878
                brdp->iostatus = brdp->ioctrl;
 
1879
                status = inb(brdp->iostatus);
 
1880
                if ((status & ECH_IDBITMASK) != ECH_ID) {
 
1881
                        retval = -ENODEV;
 
1882
                        goto err;
 
1883
                }
 
1884
                if ((brdp->irq < 0) || (brdp->irq > 15) ||
 
1885
                    (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
 
1886
                        printk("STALLION: invalid irq=%d for brd=%d\n",
 
1887
                                brdp->irq, brdp->brdnr);
 
1888
                        retval = -EINVAL;
 
1889
                        goto err;
 
1890
                }
 
1891
                outb(ECHMC_BRDRESET, brdp->ioctrl);
 
1892
                outb(ECHMC_INTENABLE, brdp->ioctrl);
 
1893
                brdp->iosize1 = 64;
 
1894
                name = "serial(EC8/32-MC)";
 
1895
                break;
 
1896
 
 
1897
        case BRD_ECHPCI:
 
1898
                brdp->isr = stl_echpciintr;
 
1899
                brdp->ioctrl = brdp->ioaddr1 + 2;
 
1900
                brdp->iosize1 = 4;
 
1901
                brdp->iosize2 = 8;
 
1902
                name = "serial(EC8/32-PCI)";
 
1903
                break;
 
1904
 
 
1905
        case BRD_ECH64PCI:
 
1906
                brdp->isr = stl_echpci64intr;
 
1907
                brdp->ioctrl = brdp->ioaddr2 + 0x40;
 
1908
                outb(0x43, (brdp->ioaddr1 + 0x4c));
 
1909
                brdp->iosize1 = 0x80;
 
1910
                brdp->iosize2 = 0x80;
 
1911
                name = "serial(EC8/64-PCI)";
 
1912
                break;
 
1913
 
 
1914
        default:
 
1915
                printk("STALLION: unknown board type=%d\n", brdp->brdtype);
 
1916
                retval = -EINVAL;
 
1917
                goto err;
 
1918
        }
 
1919
 
 
1920
/*
 
1921
 *      Check boards for possible IO address conflicts and return fail status 
 
1922
 *      if an IO conflict found.
 
1923
 */
 
1924
        retval = -EBUSY;
 
1925
        if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
 
1926
                printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
 
1927
                        "%x conflicts with another device\n", brdp->brdnr, 
 
1928
                        brdp->ioaddr1);
 
1929
                goto err;
 
1930
        }
 
1931
        
 
1932
        if (brdp->iosize2 > 0)
 
1933
                if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
 
1934
                        printk(KERN_WARNING "STALLION: Warning, board %d I/O "
 
1935
                                "address %x conflicts with another device\n",
 
1936
                                brdp->brdnr, brdp->ioaddr2);
 
1937
                        printk(KERN_WARNING "STALLION: Warning, also "
 
1938
                                "releasing board %d I/O address %x \n", 
 
1939
                                brdp->brdnr, brdp->ioaddr1);
 
1940
                        goto err_rel1;
 
1941
                }
 
1942
 
 
1943
/*
 
1944
 *      Scan through the secondary io address space looking for panels.
 
1945
 *      As we find'em allocate and initialize panel structures for each.
 
1946
 */
 
1947
        brdp->clk = CD1400_CLK;
 
1948
        brdp->hwid = status;
 
1949
 
 
1950
        ioaddr = brdp->ioaddr2;
 
1951
        banknr = 0;
 
1952
        panelnr = 0;
 
1953
        nxtid = 0;
 
1954
 
 
1955
        for (i = 0; i < STL_MAXPANELS; i++) {
 
1956
                if (brdp->brdtype == BRD_ECHPCI) {
 
1957
                        outb(nxtid, brdp->ioctrl);
 
1958
                        ioaddr = brdp->ioaddr2;
 
1959
                }
 
1960
                status = inb(ioaddr + ECH_PNLSTATUS);
 
1961
                if ((status & ECH_PNLIDMASK) != nxtid)
 
1962
                        break;
 
1963
                panelp = kzalloc(sizeof(struct stlpanel), GFP_KERNEL);
 
1964
                if (!panelp) {
 
1965
                        printk("STALLION: failed to allocate memory "
 
1966
                                "(size=%Zd)\n", sizeof(struct stlpanel));
 
1967
                        retval = -ENOMEM;
 
1968
                        goto err_fr;
 
1969
                }
 
1970
                panelp->magic = STL_PANELMAGIC;
 
1971
                panelp->brdnr = brdp->brdnr;
 
1972
                panelp->panelnr = panelnr;
 
1973
                panelp->iobase = ioaddr;
 
1974
                panelp->pagenr = nxtid;
 
1975
                panelp->hwid = status;
 
1976
                brdp->bnk2panel[banknr] = panelp;
 
1977
                brdp->bnkpageaddr[banknr] = nxtid;
 
1978
                brdp->bnkstataddr[banknr++] = ioaddr + ECH_PNLSTATUS;
 
1979
 
 
1980
                if (status & ECH_PNLXPID) {
 
1981
                        panelp->uartp = &stl_sc26198uart;
 
1982
                        panelp->isr = stl_sc26198intr;
 
1983
                        if (status & ECH_PNL16PORT) {
 
1984
                                panelp->nrports = 16;
 
1985
                                brdp->bnk2panel[banknr] = panelp;
 
1986
                                brdp->bnkpageaddr[banknr] = nxtid;
 
1987
                                brdp->bnkstataddr[banknr++] = ioaddr + 4 +
 
1988
                                        ECH_PNLSTATUS;
 
1989
                        } else
 
1990
                                panelp->nrports = 8;
 
1991
                } else {
 
1992
                        panelp->uartp = &stl_cd1400uart;
 
1993
                        panelp->isr = stl_cd1400echintr;
 
1994
                        if (status & ECH_PNL16PORT) {
 
1995
                                panelp->nrports = 16;
 
1996
                                panelp->ackmask = 0x80;
 
1997
                                if (brdp->brdtype != BRD_ECHPCI)
 
1998
                                        ioaddr += EREG_BANKSIZE;
 
1999
                                brdp->bnk2panel[banknr] = panelp;
 
2000
                                brdp->bnkpageaddr[banknr] = ++nxtid;
 
2001
                                brdp->bnkstataddr[banknr++] = ioaddr +
 
2002
                                        ECH_PNLSTATUS;
 
2003
                        } else {
 
2004
                                panelp->nrports = 8;
 
2005
                                panelp->ackmask = 0xc0;
 
2006
                        }
 
2007
                }
 
2008
 
 
2009
                nxtid++;
 
2010
                ioaddr += EREG_BANKSIZE;
 
2011
                brdp->nrports += panelp->nrports;
 
2012
                brdp->panels[panelnr++] = panelp;
 
2013
                if ((brdp->brdtype != BRD_ECHPCI) &&
 
2014
                    (ioaddr >= (brdp->ioaddr2 + brdp->iosize2))) {
 
2015
                        retval = -EINVAL;
 
2016
                        goto err_fr;
 
2017
                }
 
2018
        }
 
2019
 
 
2020
        brdp->nrpanels = panelnr;
 
2021
        brdp->nrbnks = banknr;
 
2022
        if (brdp->brdtype == BRD_ECH)
 
2023
                outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
 
2024
 
 
2025
        brdp->state |= BRD_FOUND;
 
2026
        if (request_irq(brdp->irq, stl_intr, IRQF_SHARED, name, brdp) != 0) {
 
2027
                printk("STALLION: failed to register interrupt "
 
2028
                    "routine for %s irq=%d\n", name, brdp->irq);
 
2029
                retval = -ENODEV;
 
2030
                goto err_fr;
 
2031
        }
 
2032
 
 
2033
        return 0;
 
2034
err_fr:
 
2035
        stl_cleanup_panels(brdp);
 
2036
        if (brdp->iosize2 > 0)
 
2037
                release_region(brdp->ioaddr2, brdp->iosize2);
 
2038
err_rel1:
 
2039
        release_region(brdp->ioaddr1, brdp->iosize1);
 
2040
err:
 
2041
        return retval;
 
2042
}
 
2043
 
 
2044
/*****************************************************************************/
 
2045
 
 
2046
/*
 
2047
 *      Initialize and configure the specified board.
 
2048
 *      Scan through all the boards in the configuration and see what we
 
2049
 *      can find. Handle EIO and the ECH boards a little differently here
 
2050
 *      since the initial search and setup is very different.
 
2051
 */
 
2052
 
 
2053
static int __devinit stl_brdinit(struct stlbrd *brdp)
 
2054
{
 
2055
        int i, retval;
 
2056
 
 
2057
        pr_debug("stl_brdinit(brdp=%p)\n", brdp);
 
2058
 
 
2059
        switch (brdp->brdtype) {
 
2060
        case BRD_EASYIO:
 
2061
        case BRD_EASYIOPCI:
 
2062
                retval = stl_initeio(brdp);
 
2063
                if (retval)
 
2064
                        goto err;
 
2065
                break;
 
2066
        case BRD_ECH:
 
2067
        case BRD_ECHMC:
 
2068
        case BRD_ECHPCI:
 
2069
        case BRD_ECH64PCI:
 
2070
                retval = stl_initech(brdp);
 
2071
                if (retval)
 
2072
                        goto err;
 
2073
                break;
 
2074
        default:
 
2075
                printk("STALLION: board=%d is unknown board type=%d\n",
 
2076
                        brdp->brdnr, brdp->brdtype);
 
2077
                retval = -ENODEV;
 
2078
                goto err;
 
2079
        }
 
2080
 
 
2081
        if ((brdp->state & BRD_FOUND) == 0) {
 
2082
                printk("STALLION: %s board not found, board=%d io=%x irq=%d\n",
 
2083
                        stl_brdnames[brdp->brdtype], brdp->brdnr,
 
2084
                        brdp->ioaddr1, brdp->irq);
 
2085
                goto err_free;
 
2086
        }
 
2087
 
 
2088
        for (i = 0; i < STL_MAXPANELS; i++)
 
2089
                if (brdp->panels[i] != NULL)
 
2090
                        stl_initports(brdp, brdp->panels[i]);
 
2091
 
 
2092
        printk("STALLION: %s found, board=%d io=%x irq=%d "
 
2093
                "nrpanels=%d nrports=%d\n", stl_brdnames[brdp->brdtype],
 
2094
                brdp->brdnr, brdp->ioaddr1, brdp->irq, brdp->nrpanels,
 
2095
                brdp->nrports);
 
2096
 
 
2097
        return 0;
 
2098
err_free:
 
2099
        free_irq(brdp->irq, brdp);
 
2100
 
 
2101
        stl_cleanup_panels(brdp);
 
2102
 
 
2103
        release_region(brdp->ioaddr1, brdp->iosize1);
 
2104
        if (brdp->iosize2 > 0)
 
2105
                release_region(brdp->ioaddr2, brdp->iosize2);
 
2106
err:
 
2107
        return retval;
 
2108
}
 
2109
 
 
2110
/*****************************************************************************/
 
2111
 
 
2112
/*
 
2113
 *      Find the next available board number that is free.
 
2114
 */
 
2115
 
 
2116
static int __devinit stl_getbrdnr(void)
 
2117
{
 
2118
        unsigned int i;
 
2119
 
 
2120
        for (i = 0; i < STL_MAXBRDS; i++)
 
2121
                if (stl_brds[i] == NULL) {
 
2122
                        if (i >= stl_nrbrds)
 
2123
                                stl_nrbrds = i + 1;
 
2124
                        return i;
 
2125
                }
 
2126
 
 
2127
        return -1;
 
2128
}
 
2129
 
 
2130
/*****************************************************************************/
 
2131
/*
 
2132
 *      We have a Stallion board. Allocate a board structure and
 
2133
 *      initialize it. Read its IO and IRQ resources from PCI
 
2134
 *      configuration space.
 
2135
 */
 
2136
 
 
2137
static int __devinit stl_pciprobe(struct pci_dev *pdev,
 
2138
                const struct pci_device_id *ent)
 
2139
{
 
2140
        struct stlbrd *brdp;
 
2141
        unsigned int i, brdtype = ent->driver_data;
 
2142
        int brdnr, retval = -ENODEV;
 
2143
 
 
2144
        if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE)
 
2145
                goto err;
 
2146
 
 
2147
        retval = pci_enable_device(pdev);
 
2148
        if (retval)
 
2149
                goto err;
 
2150
        brdp = stl_allocbrd();
 
2151
        if (brdp == NULL) {
 
2152
                retval = -ENOMEM;
 
2153
                goto err;
 
2154
        }
 
2155
        mutex_lock(&stl_brdslock);
 
2156
        brdnr = stl_getbrdnr();
 
2157
        if (brdnr < 0) {
 
2158
                dev_err(&pdev->dev, "too many boards found, "
 
2159
                        "maximum supported %d\n", STL_MAXBRDS);
 
2160
                mutex_unlock(&stl_brdslock);
 
2161
                retval = -ENODEV;
 
2162
                goto err_fr;
 
2163
        }
 
2164
        brdp->brdnr = (unsigned int)brdnr;
 
2165
        stl_brds[brdp->brdnr] = brdp;
 
2166
        mutex_unlock(&stl_brdslock);
 
2167
 
 
2168
        brdp->brdtype = brdtype;
 
2169
        brdp->state |= STL_PROBED;
 
2170
 
 
2171
/*
 
2172
 *      We have all resources from the board, so let's setup the actual
 
2173
 *      board structure now.
 
2174
 */
 
2175
        switch (brdtype) {
 
2176
        case BRD_ECHPCI:
 
2177
                brdp->ioaddr2 = pci_resource_start(pdev, 0);
 
2178
                brdp->ioaddr1 = pci_resource_start(pdev, 1);
 
2179
                break;
 
2180
        case BRD_ECH64PCI:
 
2181
                brdp->ioaddr2 = pci_resource_start(pdev, 2);
 
2182
                brdp->ioaddr1 = pci_resource_start(pdev, 1);
 
2183
                break;
 
2184
        case BRD_EASYIOPCI:
 
2185
                brdp->ioaddr1 = pci_resource_start(pdev, 2);
 
2186
                brdp->ioaddr2 = pci_resource_start(pdev, 1);
 
2187
                break;
 
2188
        default:
 
2189
                dev_err(&pdev->dev, "unknown PCI board type=%u\n", brdtype);
 
2190
                break;
 
2191
        }
 
2192
 
 
2193
        brdp->irq = pdev->irq;
 
2194
        retval = stl_brdinit(brdp);
 
2195
        if (retval)
 
2196
                goto err_null;
 
2197
 
 
2198
        pci_set_drvdata(pdev, brdp);
 
2199
 
 
2200
        for (i = 0; i < brdp->nrports; i++)
 
2201
                tty_register_device(stl_serial,
 
2202
                                brdp->brdnr * STL_MAXPORTS + i, &pdev->dev);
 
2203
 
 
2204
        return 0;
 
2205
err_null:
 
2206
        stl_brds[brdp->brdnr] = NULL;
 
2207
err_fr:
 
2208
        kfree(brdp);
 
2209
err:
 
2210
        return retval;
 
2211
}
 
2212
 
 
2213
static void __devexit stl_pciremove(struct pci_dev *pdev)
 
2214
{
 
2215
        struct stlbrd *brdp = pci_get_drvdata(pdev);
 
2216
        unsigned int i;
 
2217
 
 
2218
        free_irq(brdp->irq, brdp);
 
2219
 
 
2220
        stl_cleanup_panels(brdp);
 
2221
 
 
2222
        release_region(brdp->ioaddr1, brdp->iosize1);
 
2223
        if (brdp->iosize2 > 0)
 
2224
                release_region(brdp->ioaddr2, brdp->iosize2);
 
2225
 
 
2226
        for (i = 0; i < brdp->nrports; i++)
 
2227
                tty_unregister_device(stl_serial,
 
2228
                                brdp->brdnr * STL_MAXPORTS + i);
 
2229
 
 
2230
        stl_brds[brdp->brdnr] = NULL;
 
2231
        kfree(brdp);
 
2232
}
 
2233
 
 
2234
static struct pci_driver stl_pcidriver = {
 
2235
        .name = "stallion",
 
2236
        .id_table = stl_pcibrds,
 
2237
        .probe = stl_pciprobe,
 
2238
        .remove = __devexit_p(stl_pciremove)
 
2239
};
 
2240
 
 
2241
/*****************************************************************************/
 
2242
 
 
2243
/*
 
2244
 *      Return the board stats structure to user app.
 
2245
 */
 
2246
 
 
2247
static int stl_getbrdstats(combrd_t __user *bp)
 
2248
{
 
2249
        combrd_t        stl_brdstats;
 
2250
        struct stlbrd   *brdp;
 
2251
        struct stlpanel *panelp;
 
2252
        unsigned int i;
 
2253
 
 
2254
        if (copy_from_user(&stl_brdstats, bp, sizeof(combrd_t)))
 
2255
                return -EFAULT;
 
2256
        if (stl_brdstats.brd >= STL_MAXBRDS)
 
2257
                return -ENODEV;
 
2258
        brdp = stl_brds[stl_brdstats.brd];
 
2259
        if (brdp == NULL)
 
2260
                return -ENODEV;
 
2261
 
 
2262
        memset(&stl_brdstats, 0, sizeof(combrd_t));
 
2263
        stl_brdstats.brd = brdp->brdnr;
 
2264
        stl_brdstats.type = brdp->brdtype;
 
2265
        stl_brdstats.hwid = brdp->hwid;
 
2266
        stl_brdstats.state = brdp->state;
 
2267
        stl_brdstats.ioaddr = brdp->ioaddr1;
 
2268
        stl_brdstats.ioaddr2 = brdp->ioaddr2;
 
2269
        stl_brdstats.irq = brdp->irq;
 
2270
        stl_brdstats.nrpanels = brdp->nrpanels;
 
2271
        stl_brdstats.nrports = brdp->nrports;
 
2272
        for (i = 0; i < brdp->nrpanels; i++) {
 
2273
                panelp = brdp->panels[i];
 
2274
                stl_brdstats.panels[i].panel = i;
 
2275
                stl_brdstats.panels[i].hwid = panelp->hwid;
 
2276
                stl_brdstats.panels[i].nrports = panelp->nrports;
 
2277
        }
 
2278
 
 
2279
        return copy_to_user(bp, &stl_brdstats, sizeof(combrd_t)) ? -EFAULT : 0;
 
2280
}
 
2281
 
 
2282
/*****************************************************************************/
 
2283
 
 
2284
/*
 
2285
 *      Resolve the referenced port number into a port struct pointer.
 
2286
 */
 
2287
 
 
2288
static struct stlport *stl_getport(int brdnr, int panelnr, int portnr)
 
2289
{
 
2290
        struct stlbrd   *brdp;
 
2291
        struct stlpanel *panelp;
 
2292
 
 
2293
        if (brdnr < 0 || brdnr >= STL_MAXBRDS)
 
2294
                return NULL;
 
2295
        brdp = stl_brds[brdnr];
 
2296
        if (brdp == NULL)
 
2297
                return NULL;
 
2298
        if (panelnr < 0 || (unsigned int)panelnr >= brdp->nrpanels)
 
2299
                return NULL;
 
2300
        panelp = brdp->panels[panelnr];
 
2301
        if (panelp == NULL)
 
2302
                return NULL;
 
2303
        if (portnr < 0 || (unsigned int)portnr >= panelp->nrports)
 
2304
                return NULL;
 
2305
        return panelp->ports[portnr];
 
2306
}
 
2307
 
 
2308
/*****************************************************************************/
 
2309
 
 
2310
/*
 
2311
 *      Return the port stats structure to user app. A NULL port struct
 
2312
 *      pointer passed in means that we need to find out from the app
 
2313
 *      what port to get stats for (used through board control device).
 
2314
 */
 
2315
 
 
2316
static int stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp)
 
2317
{
 
2318
        comstats_t      stl_comstats;
 
2319
        unsigned char   *head, *tail;
 
2320
        unsigned long   flags;
 
2321
 
 
2322
        if (!portp) {
 
2323
                if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t)))
 
2324
                        return -EFAULT;
 
2325
                portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
 
2326
                        stl_comstats.port);
 
2327
                if (portp == NULL)
 
2328
                        return -ENODEV;
 
2329
        }
 
2330
 
 
2331
        mutex_lock(&portp->port.mutex);
 
2332
        portp->stats.state = portp->istate;
 
2333
        portp->stats.flags = portp->port.flags;
 
2334
        portp->stats.hwid = portp->hwid;
 
2335
 
 
2336
        portp->stats.ttystate = 0;
 
2337
        portp->stats.cflags = 0;
 
2338
        portp->stats.iflags = 0;
 
2339
        portp->stats.oflags = 0;
 
2340
        portp->stats.lflags = 0;
 
2341
        portp->stats.rxbuffered = 0;
 
2342
 
 
2343
        spin_lock_irqsave(&stallion_lock, flags);
 
2344
        if (tty != NULL && portp->port.tty == tty) {
 
2345
                portp->stats.ttystate = tty->flags;
 
2346
                /* No longer available as a statistic */
 
2347
                portp->stats.rxbuffered = 1; /*tty->flip.count; */
 
2348
                if (tty->termios != NULL) {
 
2349
                        portp->stats.cflags = tty->termios->c_cflag;
 
2350
                        portp->stats.iflags = tty->termios->c_iflag;
 
2351
                        portp->stats.oflags = tty->termios->c_oflag;
 
2352
                        portp->stats.lflags = tty->termios->c_lflag;
 
2353
                }
 
2354
        }
 
2355
        spin_unlock_irqrestore(&stallion_lock, flags);
 
2356
 
 
2357
        head = portp->tx.head;
 
2358
        tail = portp->tx.tail;
 
2359
        portp->stats.txbuffered = (head >= tail) ? (head - tail) :
 
2360
                (STL_TXBUFSIZE - (tail - head));
 
2361
 
 
2362
        portp->stats.signals = (unsigned long) stl_getsignals(portp);
 
2363
        mutex_unlock(&portp->port.mutex);
 
2364
 
 
2365
        return copy_to_user(cp, &portp->stats,
 
2366
                            sizeof(comstats_t)) ? -EFAULT : 0;
 
2367
}
 
2368
 
 
2369
/*****************************************************************************/
 
2370
 
 
2371
/*
 
2372
 *      Clear the port stats structure. We also return it zeroed out...
 
2373
 */
 
2374
 
 
2375
static int stl_clrportstats(struct stlport *portp, comstats_t __user *cp)
 
2376
{
 
2377
        comstats_t      stl_comstats;
 
2378
 
 
2379
        if (!portp) {
 
2380
                if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t)))
 
2381
                        return -EFAULT;
 
2382
                portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
 
2383
                        stl_comstats.port);
 
2384
                if (portp == NULL)
 
2385
                        return -ENODEV;
 
2386
        }
 
2387
 
 
2388
        mutex_lock(&portp->port.mutex);
 
2389
        memset(&portp->stats, 0, sizeof(comstats_t));
 
2390
        portp->stats.brd = portp->brdnr;
 
2391
        portp->stats.panel = portp->panelnr;
 
2392
        portp->stats.port = portp->portnr;
 
2393
        mutex_unlock(&portp->port.mutex);
 
2394
        return copy_to_user(cp, &portp->stats,
 
2395
                            sizeof(comstats_t)) ? -EFAULT : 0;
 
2396
}
 
2397
 
 
2398
/*****************************************************************************/
 
2399
 
 
2400
/*
 
2401
 *      Return the entire driver ports structure to a user app.
 
2402
 */
 
2403
 
 
2404
static int stl_getportstruct(struct stlport __user *arg)
 
2405
{
 
2406
        struct stlport  stl_dummyport;
 
2407
        struct stlport  *portp;
 
2408
 
 
2409
        if (copy_from_user(&stl_dummyport, arg, sizeof(struct stlport)))
 
2410
                return -EFAULT;
 
2411
        portp = stl_getport(stl_dummyport.brdnr, stl_dummyport.panelnr,
 
2412
                 stl_dummyport.portnr);
 
2413
        if (!portp)
 
2414
                return -ENODEV;
 
2415
        return copy_to_user(arg, portp, sizeof(struct stlport)) ? -EFAULT : 0;
 
2416
}
 
2417
 
 
2418
/*****************************************************************************/
 
2419
 
 
2420
/*
 
2421
 *      Return the entire driver board structure to a user app.
 
2422
 */
 
2423
 
 
2424
static int stl_getbrdstruct(struct stlbrd __user *arg)
 
2425
{
 
2426
        struct stlbrd   stl_dummybrd;
 
2427
        struct stlbrd   *brdp;
 
2428
 
 
2429
        if (copy_from_user(&stl_dummybrd, arg, sizeof(struct stlbrd)))
 
2430
                return -EFAULT;
 
2431
        if (stl_dummybrd.brdnr >= STL_MAXBRDS)
 
2432
                return -ENODEV;
 
2433
        brdp = stl_brds[stl_dummybrd.brdnr];
 
2434
        if (!brdp)
 
2435
                return -ENODEV;
 
2436
        return copy_to_user(arg, brdp, sizeof(struct stlbrd)) ? -EFAULT : 0;
 
2437
}
 
2438
 
 
2439
/*****************************************************************************/
 
2440
 
 
2441
/*
 
2442
 *      The "staliomem" device is also required to do some special operations
 
2443
 *      on the board and/or ports. In this driver it is mostly used for stats
 
2444
 *      collection.
 
2445
 */
 
2446
 
 
2447
static long stl_memioctl(struct file *fp, unsigned int cmd, unsigned long arg)
 
2448
{
 
2449
        int     brdnr, rc;
 
2450
        void __user *argp = (void __user *)arg;
 
2451
 
 
2452
        pr_debug("stl_memioctl(fp=%p,cmd=%x,arg=%lx)\n", fp, cmd,arg);
 
2453
 
 
2454
        brdnr = iminor(fp->f_dentry->d_inode);
 
2455
        if (brdnr >= STL_MAXBRDS)
 
2456
                return -ENODEV;
 
2457
        rc = 0;
 
2458
 
 
2459
        switch (cmd) {
 
2460
        case COM_GETPORTSTATS:
 
2461
                rc = stl_getportstats(NULL, NULL, argp);
 
2462
                break;
 
2463
        case COM_CLRPORTSTATS:
 
2464
                rc = stl_clrportstats(NULL, argp);
 
2465
                break;
 
2466
        case COM_GETBRDSTATS:
 
2467
                rc = stl_getbrdstats(argp);
 
2468
                break;
 
2469
        case COM_READPORT:
 
2470
                rc = stl_getportstruct(argp);
 
2471
                break;
 
2472
        case COM_READBOARD:
 
2473
                rc = stl_getbrdstruct(argp);
 
2474
                break;
 
2475
        default:
 
2476
                rc = -ENOIOCTLCMD;
 
2477
                break;
 
2478
        }
 
2479
        return rc;
 
2480
}
 
2481
 
 
2482
static const struct tty_operations stl_ops = {
 
2483
        .open = stl_open,
 
2484
        .close = stl_close,
 
2485
        .write = stl_write,
 
2486
        .put_char = stl_putchar,
 
2487
        .flush_chars = stl_flushchars,
 
2488
        .write_room = stl_writeroom,
 
2489
        .chars_in_buffer = stl_charsinbuffer,
 
2490
        .ioctl = stl_ioctl,
 
2491
        .set_termios = stl_settermios,
 
2492
        .throttle = stl_throttle,
 
2493
        .unthrottle = stl_unthrottle,
 
2494
        .stop = stl_stop,
 
2495
        .start = stl_start,
 
2496
        .hangup = stl_hangup,
 
2497
        .flush_buffer = stl_flushbuffer,
 
2498
        .break_ctl = stl_breakctl,
 
2499
        .wait_until_sent = stl_waituntilsent,
 
2500
        .send_xchar = stl_sendxchar,
 
2501
        .tiocmget = stl_tiocmget,
 
2502
        .tiocmset = stl_tiocmset,
 
2503
        .proc_fops = &stl_proc_fops,
 
2504
};
 
2505
 
 
2506
static const struct tty_port_operations stl_port_ops = {
 
2507
        .carrier_raised = stl_carrier_raised,
 
2508
        .dtr_rts = stl_dtr_rts,
 
2509
        .activate = stl_activate,
 
2510
        .shutdown = stl_shutdown,
 
2511
};
 
2512
 
 
2513
/*****************************************************************************/
 
2514
/*                       CD1400 HARDWARE FUNCTIONS                           */
 
2515
/*****************************************************************************/
 
2516
 
 
2517
/*
 
2518
 *      These functions get/set/update the registers of the cd1400 UARTs.
 
2519
 *      Access to the cd1400 registers is via an address/data io port pair.
 
2520
 *      (Maybe should make this inline...)
 
2521
 */
 
2522
 
 
2523
static int stl_cd1400getreg(struct stlport *portp, int regnr)
 
2524
{
 
2525
        outb((regnr + portp->uartaddr), portp->ioaddr);
 
2526
        return inb(portp->ioaddr + EREG_DATA);
 
2527
}
 
2528
 
 
2529
static void stl_cd1400setreg(struct stlport *portp, int regnr, int value)
 
2530
{
 
2531
        outb(regnr + portp->uartaddr, portp->ioaddr);
 
2532
        outb(value, portp->ioaddr + EREG_DATA);
 
2533
}
 
2534
 
 
2535
static int stl_cd1400updatereg(struct stlport *portp, int regnr, int value)
 
2536
{
 
2537
        outb(regnr + portp->uartaddr, portp->ioaddr);
 
2538
        if (inb(portp->ioaddr + EREG_DATA) != value) {
 
2539
                outb(value, portp->ioaddr + EREG_DATA);
 
2540
                return 1;
 
2541
        }
 
2542
        return 0;
 
2543
}
 
2544
 
 
2545
/*****************************************************************************/
 
2546
 
 
2547
/*
 
2548
 *      Inbitialize the UARTs in a panel. We don't care what sort of board
 
2549
 *      these ports are on - since the port io registers are almost
 
2550
 *      identical when dealing with ports.
 
2551
 */
 
2552
 
 
2553
static int stl_cd1400panelinit(struct stlbrd *brdp, struct stlpanel *panelp)
 
2554
{
 
2555
        unsigned int    gfrcr;
 
2556
        int             chipmask, i, j;
 
2557
        int             nrchips, uartaddr, ioaddr;
 
2558
        unsigned long   flags;
 
2559
 
 
2560
        pr_debug("stl_panelinit(brdp=%p,panelp=%p)\n", brdp, panelp);
 
2561
 
 
2562
        spin_lock_irqsave(&brd_lock, flags);
 
2563
        BRDENABLE(panelp->brdnr, panelp->pagenr);
 
2564
 
 
2565
/*
 
2566
 *      Check that each chip is present and started up OK.
 
2567
 */
 
2568
        chipmask = 0;
 
2569
        nrchips = panelp->nrports / CD1400_PORTS;
 
2570
        for (i = 0; i < nrchips; i++) {
 
2571
                if (brdp->brdtype == BRD_ECHPCI) {
 
2572
                        outb((panelp->pagenr + (i >> 1)), brdp->ioctrl);
 
2573
                        ioaddr = panelp->iobase;
 
2574
                } else
 
2575
                        ioaddr = panelp->iobase + (EREG_BANKSIZE * (i >> 1));
 
2576
                uartaddr = (i & 0x01) ? 0x080 : 0;
 
2577
                outb((GFRCR + uartaddr), ioaddr);
 
2578
                outb(0, (ioaddr + EREG_DATA));
 
2579
                outb((CCR + uartaddr), ioaddr);
 
2580
                outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
 
2581
                outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
 
2582
                outb((GFRCR + uartaddr), ioaddr);
 
2583
                for (j = 0; j < CCR_MAXWAIT; j++)
 
2584
                        if ((gfrcr = inb(ioaddr + EREG_DATA)) != 0)
 
2585
                                break;
 
2586
 
 
2587
                if ((j >= CCR_MAXWAIT) || (gfrcr < 0x40) || (gfrcr > 0x60)) {
 
2588
                        printk("STALLION: cd1400 not responding, "
 
2589
                                "brd=%d panel=%d chip=%d\n",
 
2590
                                panelp->brdnr, panelp->panelnr, i);
 
2591
                        continue;
 
2592
                }
 
2593
                chipmask |= (0x1 << i);
 
2594
                outb((PPR + uartaddr), ioaddr);
 
2595
                outb(PPR_SCALAR, (ioaddr + EREG_DATA));
 
2596
        }
 
2597
 
 
2598
        BRDDISABLE(panelp->brdnr);
 
2599
        spin_unlock_irqrestore(&brd_lock, flags);
 
2600
        return chipmask;
 
2601
}
 
2602
 
 
2603
/*****************************************************************************/
 
2604
 
 
2605
/*
 
2606
 *      Initialize hardware specific port registers.
 
2607
 */
 
2608
 
 
2609
static void stl_cd1400portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
 
2610
{
 
2611
        unsigned long flags;
 
2612
        pr_debug("stl_cd1400portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
 
2613
                        panelp, portp);
 
2614
 
 
2615
        if ((brdp == NULL) || (panelp == NULL) ||
 
2616
            (portp == NULL))
 
2617
                return;
 
2618
 
 
2619
        spin_lock_irqsave(&brd_lock, flags);
 
2620
        portp->ioaddr = panelp->iobase + (((brdp->brdtype == BRD_ECHPCI) ||
 
2621
                (portp->portnr < 8)) ? 0 : EREG_BANKSIZE);
 
2622
        portp->uartaddr = (portp->portnr & 0x04) << 5;
 
2623
        portp->pagenr = panelp->pagenr + (portp->portnr >> 3);
 
2624
 
 
2625
        BRDENABLE(portp->brdnr, portp->pagenr);
 
2626
        stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
 
2627
        stl_cd1400setreg(portp, LIVR, (portp->portnr << 3));
 
2628
        portp->hwid = stl_cd1400getreg(portp, GFRCR);
 
2629
        BRDDISABLE(portp->brdnr);
 
2630
        spin_unlock_irqrestore(&brd_lock, flags);
 
2631
}
 
2632
 
 
2633
/*****************************************************************************/
 
2634
 
 
2635
/*
 
2636
 *      Wait for the command register to be ready. We will poll this,
 
2637
 *      since it won't usually take too long to be ready.
 
2638
 */
 
2639
 
 
2640
static void stl_cd1400ccrwait(struct stlport *portp)
 
2641
{
 
2642
        int     i;
 
2643
 
 
2644
        for (i = 0; i < CCR_MAXWAIT; i++)
 
2645
                if (stl_cd1400getreg(portp, CCR) == 0)
 
2646
                        return;
 
2647
 
 
2648
        printk("STALLION: cd1400 not responding, port=%d panel=%d brd=%d\n",
 
2649
                portp->portnr, portp->panelnr, portp->brdnr);
 
2650
}
 
2651
 
 
2652
/*****************************************************************************/
 
2653
 
 
2654
/*
 
2655
 *      Set up the cd1400 registers for a port based on the termios port
 
2656
 *      settings.
 
2657
 */
 
2658
 
 
2659
static void stl_cd1400setport(struct stlport *portp, struct ktermios *tiosp)
 
2660
{
 
2661
        struct stlbrd   *brdp;
 
2662
        unsigned long   flags;
 
2663
        unsigned int    clkdiv, baudrate;
 
2664
        unsigned char   cor1, cor2, cor3;
 
2665
        unsigned char   cor4, cor5, ccr;
 
2666
        unsigned char   srer, sreron, sreroff;
 
2667
        unsigned char   mcor1, mcor2, rtpr;
 
2668
        unsigned char   clk, div;
 
2669
 
 
2670
        cor1 = 0;
 
2671
        cor2 = 0;
 
2672
        cor3 = 0;
 
2673
        cor4 = 0;
 
2674
        cor5 = 0;
 
2675
        ccr = 0;
 
2676
        rtpr = 0;
 
2677
        clk = 0;
 
2678
        div = 0;
 
2679
        mcor1 = 0;
 
2680
        mcor2 = 0;
 
2681
        sreron = 0;
 
2682
        sreroff = 0;
 
2683
 
 
2684
        brdp = stl_brds[portp->brdnr];
 
2685
        if (brdp == NULL)
 
2686
                return;
 
2687
 
 
2688
/*
 
2689
 *      Set up the RX char ignore mask with those RX error types we
 
2690
 *      can ignore. We can get the cd1400 to help us out a little here,
 
2691
 *      it will ignore parity errors and breaks for us.
 
2692
 */
 
2693
        portp->rxignoremsk = 0;
 
2694
        if (tiosp->c_iflag & IGNPAR) {
 
2695
                portp->rxignoremsk |= (ST_PARITY | ST_FRAMING | ST_OVERRUN);
 
2696
                cor1 |= COR1_PARIGNORE;
 
2697
        }
 
2698
        if (tiosp->c_iflag & IGNBRK) {
 
2699
                portp->rxignoremsk |= ST_BREAK;
 
2700
                cor4 |= COR4_IGNBRK;
 
2701
        }
 
2702
 
 
2703
        portp->rxmarkmsk = ST_OVERRUN;
 
2704
        if (tiosp->c_iflag & (INPCK | PARMRK))
 
2705
                portp->rxmarkmsk |= (ST_PARITY | ST_FRAMING);
 
2706
        if (tiosp->c_iflag & BRKINT)
 
2707
                portp->rxmarkmsk |= ST_BREAK;
 
2708
 
 
2709
/*
 
2710
 *      Go through the char size, parity and stop bits and set all the
 
2711
 *      option register appropriately.
 
2712
 */
 
2713
        switch (tiosp->c_cflag & CSIZE) {
 
2714
        case CS5:
 
2715
                cor1 |= COR1_CHL5;
 
2716
                break;
 
2717
        case CS6:
 
2718
                cor1 |= COR1_CHL6;
 
2719
                break;
 
2720
        case CS7:
 
2721
                cor1 |= COR1_CHL7;
 
2722
                break;
 
2723
        default:
 
2724
                cor1 |= COR1_CHL8;
 
2725
                break;
 
2726
        }
 
2727
 
 
2728
        if (tiosp->c_cflag & CSTOPB)
 
2729
                cor1 |= COR1_STOP2;
 
2730
        else
 
2731
                cor1 |= COR1_STOP1;
 
2732
 
 
2733
        if (tiosp->c_cflag & PARENB) {
 
2734
                if (tiosp->c_cflag & PARODD)
 
2735
                        cor1 |= (COR1_PARENB | COR1_PARODD);
 
2736
                else
 
2737
                        cor1 |= (COR1_PARENB | COR1_PAREVEN);
 
2738
        } else {
 
2739
                cor1 |= COR1_PARNONE;
 
2740
        }
 
2741
 
 
2742
/*
 
2743
 *      Set the RX FIFO threshold at 6 chars. This gives a bit of breathing
 
2744
 *      space for hardware flow control and the like. This should be set to
 
2745
 *      VMIN. Also here we will set the RX data timeout to 10ms - this should
 
2746
 *      really be based on VTIME.
 
2747
 */
 
2748
        cor3 |= FIFO_RXTHRESHOLD;
 
2749
        rtpr = 2;
 
2750
 
 
2751
/*
 
2752
 *      Calculate the baud rate timers. For now we will just assume that
 
2753
 *      the input and output baud are the same. Could have used a baud
 
2754
 *      table here, but this way we can generate virtually any baud rate
 
2755
 *      we like!
 
2756
 */
 
2757
        baudrate = tiosp->c_cflag & CBAUD;
 
2758
        if (baudrate & CBAUDEX) {
 
2759
                baudrate &= ~CBAUDEX;
 
2760
                if ((baudrate < 1) || (baudrate > 4))
 
2761
                        tiosp->c_cflag &= ~CBAUDEX;
 
2762
                else
 
2763
                        baudrate += 15;
 
2764
        }
 
2765
        baudrate = stl_baudrates[baudrate];
 
2766
        if ((tiosp->c_cflag & CBAUD) == B38400) {
 
2767
                if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
 
2768
                        baudrate = 57600;
 
2769
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
 
2770
                        baudrate = 115200;
 
2771
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
 
2772
                        baudrate = 230400;
 
2773
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
 
2774
                        baudrate = 460800;
 
2775
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
 
2776
                        baudrate = (portp->baud_base / portp->custom_divisor);
 
2777
        }
 
2778
        if (baudrate > STL_CD1400MAXBAUD)
 
2779
                baudrate = STL_CD1400MAXBAUD;
 
2780
 
 
2781
        if (baudrate > 0) {
 
2782
                for (clk = 0; clk < CD1400_NUMCLKS; clk++) {
 
2783
                        clkdiv = (portp->clk / stl_cd1400clkdivs[clk]) / baudrate;
 
2784
                        if (clkdiv < 0x100)
 
2785
                                break;
 
2786
                }
 
2787
                div = (unsigned char) clkdiv;
 
2788
        }
 
2789
 
 
2790
/*
 
2791
 *      Check what form of modem signaling is required and set it up.
 
2792
 */
 
2793
        if ((tiosp->c_cflag & CLOCAL) == 0) {
 
2794
                mcor1 |= MCOR1_DCD;
 
2795
                mcor2 |= MCOR2_DCD;
 
2796
                sreron |= SRER_MODEM;
 
2797
                portp->port.flags |= ASYNC_CHECK_CD;
 
2798
        } else
 
2799
                portp->port.flags &= ~ASYNC_CHECK_CD;
 
2800
 
 
2801
/*
 
2802
 *      Setup cd1400 enhanced modes if we can. In particular we want to
 
2803
 *      handle as much of the flow control as possible automatically. As
 
2804
 *      well as saving a few CPU cycles it will also greatly improve flow
 
2805
 *      control reliability.
 
2806
 */
 
2807
        if (tiosp->c_iflag & IXON) {
 
2808
                cor2 |= COR2_TXIBE;
 
2809
                cor3 |= COR3_SCD12;
 
2810
                if (tiosp->c_iflag & IXANY)
 
2811
                        cor2 |= COR2_IXM;
 
2812
        }
 
2813
 
 
2814
        if (tiosp->c_cflag & CRTSCTS) {
 
2815
                cor2 |= COR2_CTSAE;
 
2816
                mcor1 |= FIFO_RTSTHRESHOLD;
 
2817
        }
 
2818
 
 
2819
/*
 
2820
 *      All cd1400 register values calculated so go through and set
 
2821
 *      them all up.
 
2822
 */
 
2823
 
 
2824
        pr_debug("SETPORT: portnr=%d panelnr=%d brdnr=%d\n",
 
2825
                portp->portnr, portp->panelnr, portp->brdnr);
 
2826
        pr_debug("    cor1=%x cor2=%x cor3=%x cor4=%x cor5=%x\n",
 
2827
                cor1, cor2, cor3, cor4, cor5);
 
2828
        pr_debug("    mcor1=%x mcor2=%x rtpr=%x sreron=%x sreroff=%x\n",
 
2829
                mcor1, mcor2, rtpr, sreron, sreroff);
 
2830
        pr_debug("    tcor=%x tbpr=%x rcor=%x rbpr=%x\n", clk, div, clk, div);
 
2831
        pr_debug("    schr1=%x schr2=%x schr3=%x schr4=%x\n",
 
2832
                tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
 
2833
                tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
 
2834
 
 
2835
        spin_lock_irqsave(&brd_lock, flags);
 
2836
        BRDENABLE(portp->brdnr, portp->pagenr);
 
2837
        stl_cd1400setreg(portp, CAR, (portp->portnr & 0x3));
 
2838
        srer = stl_cd1400getreg(portp, SRER);
 
2839
        stl_cd1400setreg(portp, SRER, 0);
 
2840
        if (stl_cd1400updatereg(portp, COR1, cor1))
 
2841
                ccr = 1;
 
2842
        if (stl_cd1400updatereg(portp, COR2, cor2))
 
2843
                ccr = 1;
 
2844
        if (stl_cd1400updatereg(portp, COR3, cor3))
 
2845
                ccr = 1;
 
2846
        if (ccr) {
 
2847
                stl_cd1400ccrwait(portp);
 
2848
                stl_cd1400setreg(portp, CCR, CCR_CORCHANGE);
 
2849
        }
 
2850
        stl_cd1400setreg(portp, COR4, cor4);
 
2851
        stl_cd1400setreg(portp, COR5, cor5);
 
2852
        stl_cd1400setreg(portp, MCOR1, mcor1);
 
2853
        stl_cd1400setreg(portp, MCOR2, mcor2);
 
2854
        if (baudrate > 0) {
 
2855
                stl_cd1400setreg(portp, TCOR, clk);
 
2856
                stl_cd1400setreg(portp, TBPR, div);
 
2857
                stl_cd1400setreg(portp, RCOR, clk);
 
2858
                stl_cd1400setreg(portp, RBPR, div);
 
2859
        }
 
2860
        stl_cd1400setreg(portp, SCHR1, tiosp->c_cc[VSTART]);
 
2861
        stl_cd1400setreg(portp, SCHR2, tiosp->c_cc[VSTOP]);
 
2862
        stl_cd1400setreg(portp, SCHR3, tiosp->c_cc[VSTART]);
 
2863
        stl_cd1400setreg(portp, SCHR4, tiosp->c_cc[VSTOP]);
 
2864
        stl_cd1400setreg(portp, RTPR, rtpr);
 
2865
        mcor1 = stl_cd1400getreg(portp, MSVR1);
 
2866
        if (mcor1 & MSVR1_DCD)
 
2867
                portp->sigs |= TIOCM_CD;
 
2868
        else
 
2869
                portp->sigs &= ~TIOCM_CD;
 
2870
        stl_cd1400setreg(portp, SRER, ((srer & ~sreroff) | sreron));
 
2871
        BRDDISABLE(portp->brdnr);
 
2872
        spin_unlock_irqrestore(&brd_lock, flags);
 
2873
}
 
2874
 
 
2875
/*****************************************************************************/
 
2876
 
 
2877
/*
 
2878
 *      Set the state of the DTR and RTS signals.
 
2879
 */
 
2880
 
 
2881
static void stl_cd1400setsignals(struct stlport *portp, int dtr, int rts)
 
2882
{
 
2883
        unsigned char   msvr1, msvr2;
 
2884
        unsigned long   flags;
 
2885
 
 
2886
        pr_debug("stl_cd1400setsignals(portp=%p,dtr=%d,rts=%d)\n",
 
2887
                        portp, dtr, rts);
 
2888
 
 
2889
        msvr1 = 0;
 
2890
        msvr2 = 0;
 
2891
        if (dtr > 0)
 
2892
                msvr1 = MSVR1_DTR;
 
2893
        if (rts > 0)
 
2894
                msvr2 = MSVR2_RTS;
 
2895
 
 
2896
        spin_lock_irqsave(&brd_lock, flags);
 
2897
        BRDENABLE(portp->brdnr, portp->pagenr);
 
2898
        stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
 
2899
        if (rts >= 0)
 
2900
                stl_cd1400setreg(portp, MSVR2, msvr2);
 
2901
        if (dtr >= 0)
 
2902
                stl_cd1400setreg(portp, MSVR1, msvr1);
 
2903
        BRDDISABLE(portp->brdnr);
 
2904
        spin_unlock_irqrestore(&brd_lock, flags);
 
2905
}
 
2906
 
 
2907
/*****************************************************************************/
 
2908
 
 
2909
/*
 
2910
 *      Return the state of the signals.
 
2911
 */
 
2912
 
 
2913
static int stl_cd1400getsignals(struct stlport *portp)
 
2914
{
 
2915
        unsigned char   msvr1, msvr2;
 
2916
        unsigned long   flags;
 
2917
        int             sigs;
 
2918
 
 
2919
        pr_debug("stl_cd1400getsignals(portp=%p)\n", portp);
 
2920
 
 
2921
        spin_lock_irqsave(&brd_lock, flags);
 
2922
        BRDENABLE(portp->brdnr, portp->pagenr);
 
2923
        stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
 
2924
        msvr1 = stl_cd1400getreg(portp, MSVR1);
 
2925
        msvr2 = stl_cd1400getreg(portp, MSVR2);
 
2926
        BRDDISABLE(portp->brdnr);
 
2927
        spin_unlock_irqrestore(&brd_lock, flags);
 
2928
 
 
2929
        sigs = 0;
 
2930
        sigs |= (msvr1 & MSVR1_DCD) ? TIOCM_CD : 0;
 
2931
        sigs |= (msvr1 & MSVR1_CTS) ? TIOCM_CTS : 0;
 
2932
        sigs |= (msvr1 & MSVR1_DTR) ? TIOCM_DTR : 0;
 
2933
        sigs |= (msvr2 & MSVR2_RTS) ? TIOCM_RTS : 0;
 
2934
#if 0
 
2935
        sigs |= (msvr1 & MSVR1_RI) ? TIOCM_RI : 0;
 
2936
        sigs |= (msvr1 & MSVR1_DSR) ? TIOCM_DSR : 0;
 
2937
#else
 
2938
        sigs |= TIOCM_DSR;
 
2939
#endif
 
2940
        return sigs;
 
2941
}
 
2942
 
 
2943
/*****************************************************************************/
 
2944
 
 
2945
/*
 
2946
 *      Enable/Disable the Transmitter and/or Receiver.
 
2947
 */
 
2948
 
 
2949
static void stl_cd1400enablerxtx(struct stlport *portp, int rx, int tx)
 
2950
{
 
2951
        unsigned char   ccr;
 
2952
        unsigned long   flags;
 
2953
 
 
2954
        pr_debug("stl_cd1400enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
 
2955
 
 
2956
        ccr = 0;
 
2957
 
 
2958
        if (tx == 0)
 
2959
                ccr |= CCR_TXDISABLE;
 
2960
        else if (tx > 0)
 
2961
                ccr |= CCR_TXENABLE;
 
2962
        if (rx == 0)
 
2963
                ccr |= CCR_RXDISABLE;
 
2964
        else if (rx > 0)
 
2965
                ccr |= CCR_RXENABLE;
 
2966
 
 
2967
        spin_lock_irqsave(&brd_lock, flags);
 
2968
        BRDENABLE(portp->brdnr, portp->pagenr);
 
2969
        stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
 
2970
        stl_cd1400ccrwait(portp);
 
2971
        stl_cd1400setreg(portp, CCR, ccr);
 
2972
        stl_cd1400ccrwait(portp);
 
2973
        BRDDISABLE(portp->brdnr);
 
2974
        spin_unlock_irqrestore(&brd_lock, flags);
 
2975
}
 
2976
 
 
2977
/*****************************************************************************/
 
2978
 
 
2979
/*
 
2980
 *      Start/stop the Transmitter and/or Receiver.
 
2981
 */
 
2982
 
 
2983
static void stl_cd1400startrxtx(struct stlport *portp, int rx, int tx)
 
2984
{
 
2985
        unsigned char   sreron, sreroff;
 
2986
        unsigned long   flags;
 
2987
 
 
2988
        pr_debug("stl_cd1400startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
 
2989
 
 
2990
        sreron = 0;
 
2991
        sreroff = 0;
 
2992
        if (tx == 0)
 
2993
                sreroff |= (SRER_TXDATA | SRER_TXEMPTY);
 
2994
        else if (tx == 1)
 
2995
                sreron |= SRER_TXDATA;
 
2996
        else if (tx >= 2)
 
2997
                sreron |= SRER_TXEMPTY;
 
2998
        if (rx == 0)
 
2999
                sreroff |= SRER_RXDATA;
 
3000
        else if (rx > 0)
 
3001
                sreron |= SRER_RXDATA;
 
3002
 
 
3003
        spin_lock_irqsave(&brd_lock, flags);
 
3004
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3005
        stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
 
3006
        stl_cd1400setreg(portp, SRER,
 
3007
                ((stl_cd1400getreg(portp, SRER) & ~sreroff) | sreron));
 
3008
        BRDDISABLE(portp->brdnr);
 
3009
        if (tx > 0)
 
3010
                set_bit(ASYI_TXBUSY, &portp->istate);
 
3011
        spin_unlock_irqrestore(&brd_lock, flags);
 
3012
}
 
3013
 
 
3014
/*****************************************************************************/
 
3015
 
 
3016
/*
 
3017
 *      Disable all interrupts from this port.
 
3018
 */
 
3019
 
 
3020
static void stl_cd1400disableintrs(struct stlport *portp)
 
3021
{
 
3022
        unsigned long   flags;
 
3023
 
 
3024
        pr_debug("stl_cd1400disableintrs(portp=%p)\n", portp);
 
3025
 
 
3026
        spin_lock_irqsave(&brd_lock, flags);
 
3027
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3028
        stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
 
3029
        stl_cd1400setreg(portp, SRER, 0);
 
3030
        BRDDISABLE(portp->brdnr);
 
3031
        spin_unlock_irqrestore(&brd_lock, flags);
 
3032
}
 
3033
 
 
3034
/*****************************************************************************/
 
3035
 
 
3036
static void stl_cd1400sendbreak(struct stlport *portp, int len)
 
3037
{
 
3038
        unsigned long   flags;
 
3039
 
 
3040
        pr_debug("stl_cd1400sendbreak(portp=%p,len=%d)\n", portp, len);
 
3041
 
 
3042
        spin_lock_irqsave(&brd_lock, flags);
 
3043
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3044
        stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
 
3045
        stl_cd1400setreg(portp, SRER,
 
3046
                ((stl_cd1400getreg(portp, SRER) & ~SRER_TXDATA) |
 
3047
                SRER_TXEMPTY));
 
3048
        BRDDISABLE(portp->brdnr);
 
3049
        portp->brklen = len;
 
3050
        if (len == 1)
 
3051
                portp->stats.txbreaks++;
 
3052
        spin_unlock_irqrestore(&brd_lock, flags);
 
3053
}
 
3054
 
 
3055
/*****************************************************************************/
 
3056
 
 
3057
/*
 
3058
 *      Take flow control actions...
 
3059
 */
 
3060
 
 
3061
static void stl_cd1400flowctrl(struct stlport *portp, int state)
 
3062
{
 
3063
        struct tty_struct       *tty;
 
3064
        unsigned long           flags;
 
3065
 
 
3066
        pr_debug("stl_cd1400flowctrl(portp=%p,state=%x)\n", portp, state);
 
3067
 
 
3068
        if (portp == NULL)
 
3069
                return;
 
3070
        tty = tty_port_tty_get(&portp->port);
 
3071
        if (tty == NULL)
 
3072
                return;
 
3073
 
 
3074
        spin_lock_irqsave(&brd_lock, flags);
 
3075
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3076
        stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
 
3077
 
 
3078
        if (state) {
 
3079
                if (tty->termios->c_iflag & IXOFF) {
 
3080
                        stl_cd1400ccrwait(portp);
 
3081
                        stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
 
3082
                        portp->stats.rxxon++;
 
3083
                        stl_cd1400ccrwait(portp);
 
3084
                }
 
3085
/*
 
3086
 *              Question: should we return RTS to what it was before? It may
 
3087
 *              have been set by an ioctl... Suppose not, since if you have
 
3088
 *              hardware flow control set then it is pretty silly to go and
 
3089
 *              set the RTS line by hand.
 
3090
 */
 
3091
                if (tty->termios->c_cflag & CRTSCTS) {
 
3092
                        stl_cd1400setreg(portp, MCOR1,
 
3093
                                (stl_cd1400getreg(portp, MCOR1) |
 
3094
                                FIFO_RTSTHRESHOLD));
 
3095
                        stl_cd1400setreg(portp, MSVR2, MSVR2_RTS);
 
3096
                        portp->stats.rxrtson++;
 
3097
                }
 
3098
        } else {
 
3099
                if (tty->termios->c_iflag & IXOFF) {
 
3100
                        stl_cd1400ccrwait(portp);
 
3101
                        stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
 
3102
                        portp->stats.rxxoff++;
 
3103
                        stl_cd1400ccrwait(portp);
 
3104
                }
 
3105
                if (tty->termios->c_cflag & CRTSCTS) {
 
3106
                        stl_cd1400setreg(portp, MCOR1,
 
3107
                                (stl_cd1400getreg(portp, MCOR1) & 0xf0));
 
3108
                        stl_cd1400setreg(portp, MSVR2, 0);
 
3109
                        portp->stats.rxrtsoff++;
 
3110
                }
 
3111
        }
 
3112
 
 
3113
        BRDDISABLE(portp->brdnr);
 
3114
        spin_unlock_irqrestore(&brd_lock, flags);
 
3115
        tty_kref_put(tty);
 
3116
}
 
3117
 
 
3118
/*****************************************************************************/
 
3119
 
 
3120
/*
 
3121
 *      Send a flow control character...
 
3122
 */
 
3123
 
 
3124
static void stl_cd1400sendflow(struct stlport *portp, int state)
 
3125
{
 
3126
        struct tty_struct       *tty;
 
3127
        unsigned long           flags;
 
3128
 
 
3129
        pr_debug("stl_cd1400sendflow(portp=%p,state=%x)\n", portp, state);
 
3130
 
 
3131
        if (portp == NULL)
 
3132
                return;
 
3133
        tty = tty_port_tty_get(&portp->port);
 
3134
        if (tty == NULL)
 
3135
                return;
 
3136
 
 
3137
        spin_lock_irqsave(&brd_lock, flags);
 
3138
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3139
        stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
 
3140
        if (state) {
 
3141
                stl_cd1400ccrwait(portp);
 
3142
                stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
 
3143
                portp->stats.rxxon++;
 
3144
                stl_cd1400ccrwait(portp);
 
3145
        } else {
 
3146
                stl_cd1400ccrwait(portp);
 
3147
                stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
 
3148
                portp->stats.rxxoff++;
 
3149
                stl_cd1400ccrwait(portp);
 
3150
        }
 
3151
        BRDDISABLE(portp->brdnr);
 
3152
        spin_unlock_irqrestore(&brd_lock, flags);
 
3153
        tty_kref_put(tty);
 
3154
}
 
3155
 
 
3156
/*****************************************************************************/
 
3157
 
 
3158
static void stl_cd1400flush(struct stlport *portp)
 
3159
{
 
3160
        unsigned long   flags;
 
3161
 
 
3162
        pr_debug("stl_cd1400flush(portp=%p)\n", portp);
 
3163
 
 
3164
        if (portp == NULL)
 
3165
                return;
 
3166
 
 
3167
        spin_lock_irqsave(&brd_lock, flags);
 
3168
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3169
        stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
 
3170
        stl_cd1400ccrwait(portp);
 
3171
        stl_cd1400setreg(portp, CCR, CCR_TXFLUSHFIFO);
 
3172
        stl_cd1400ccrwait(portp);
 
3173
        portp->tx.tail = portp->tx.head;
 
3174
        BRDDISABLE(portp->brdnr);
 
3175
        spin_unlock_irqrestore(&brd_lock, flags);
 
3176
}
 
3177
 
 
3178
/*****************************************************************************/
 
3179
 
 
3180
/*
 
3181
 *      Return the current state of data flow on this port. This is only
 
3182
 *      really interesting when determining if data has fully completed
 
3183
 *      transmission or not... This is easy for the cd1400, it accurately
 
3184
 *      maintains the busy port flag.
 
3185
 */
 
3186
 
 
3187
static int stl_cd1400datastate(struct stlport *portp)
 
3188
{
 
3189
        pr_debug("stl_cd1400datastate(portp=%p)\n", portp);
 
3190
 
 
3191
        if (portp == NULL)
 
3192
                return 0;
 
3193
 
 
3194
        return test_bit(ASYI_TXBUSY, &portp->istate) ? 1 : 0;
 
3195
}
 
3196
 
 
3197
/*****************************************************************************/
 
3198
 
 
3199
/*
 
3200
 *      Interrupt service routine for cd1400 EasyIO boards.
 
3201
 */
 
3202
 
 
3203
static void stl_cd1400eiointr(struct stlpanel *panelp, unsigned int iobase)
 
3204
{
 
3205
        unsigned char   svrtype;
 
3206
 
 
3207
        pr_debug("stl_cd1400eiointr(panelp=%p,iobase=%x)\n", panelp, iobase);
 
3208
 
 
3209
        spin_lock(&brd_lock);
 
3210
        outb(SVRR, iobase);
 
3211
        svrtype = inb(iobase + EREG_DATA);
 
3212
        if (panelp->nrports > 4) {
 
3213
                outb((SVRR + 0x80), iobase);
 
3214
                svrtype |= inb(iobase + EREG_DATA);
 
3215
        }
 
3216
 
 
3217
        if (svrtype & SVRR_RX)
 
3218
                stl_cd1400rxisr(panelp, iobase);
 
3219
        else if (svrtype & SVRR_TX)
 
3220
                stl_cd1400txisr(panelp, iobase);
 
3221
        else if (svrtype & SVRR_MDM)
 
3222
                stl_cd1400mdmisr(panelp, iobase);
 
3223
 
 
3224
        spin_unlock(&brd_lock);
 
3225
}
 
3226
 
 
3227
/*****************************************************************************/
 
3228
 
 
3229
/*
 
3230
 *      Interrupt service routine for cd1400 panels.
 
3231
 */
 
3232
 
 
3233
static void stl_cd1400echintr(struct stlpanel *panelp, unsigned int iobase)
 
3234
{
 
3235
        unsigned char   svrtype;
 
3236
 
 
3237
        pr_debug("stl_cd1400echintr(panelp=%p,iobase=%x)\n", panelp, iobase);
 
3238
 
 
3239
        outb(SVRR, iobase);
 
3240
        svrtype = inb(iobase + EREG_DATA);
 
3241
        outb((SVRR + 0x80), iobase);
 
3242
        svrtype |= inb(iobase + EREG_DATA);
 
3243
        if (svrtype & SVRR_RX)
 
3244
                stl_cd1400rxisr(panelp, iobase);
 
3245
        else if (svrtype & SVRR_TX)
 
3246
                stl_cd1400txisr(panelp, iobase);
 
3247
        else if (svrtype & SVRR_MDM)
 
3248
                stl_cd1400mdmisr(panelp, iobase);
 
3249
}
 
3250
 
 
3251
 
 
3252
/*****************************************************************************/
 
3253
 
 
3254
/*
 
3255
 *      Unfortunately we need to handle breaks in the TX data stream, since
 
3256
 *      this is the only way to generate them on the cd1400.
 
3257
 */
 
3258
 
 
3259
static int stl_cd1400breakisr(struct stlport *portp, int ioaddr)
 
3260
{
 
3261
        if (portp->brklen == 1) {
 
3262
                outb((COR2 + portp->uartaddr), ioaddr);
 
3263
                outb((inb(ioaddr + EREG_DATA) | COR2_ETC),
 
3264
                        (ioaddr + EREG_DATA));
 
3265
                outb((TDR + portp->uartaddr), ioaddr);
 
3266
                outb(ETC_CMD, (ioaddr + EREG_DATA));
 
3267
                outb(ETC_STARTBREAK, (ioaddr + EREG_DATA));
 
3268
                outb((SRER + portp->uartaddr), ioaddr);
 
3269
                outb((inb(ioaddr + EREG_DATA) & ~(SRER_TXDATA | SRER_TXEMPTY)),
 
3270
                        (ioaddr + EREG_DATA));
 
3271
                return 1;
 
3272
        } else if (portp->brklen > 1) {
 
3273
                outb((TDR + portp->uartaddr), ioaddr);
 
3274
                outb(ETC_CMD, (ioaddr + EREG_DATA));
 
3275
                outb(ETC_STOPBREAK, (ioaddr + EREG_DATA));
 
3276
                portp->brklen = -1;
 
3277
                return 1;
 
3278
        } else {
 
3279
                outb((COR2 + portp->uartaddr), ioaddr);
 
3280
                outb((inb(ioaddr + EREG_DATA) & ~COR2_ETC),
 
3281
                        (ioaddr + EREG_DATA));
 
3282
                portp->brklen = 0;
 
3283
        }
 
3284
        return 0;
 
3285
}
 
3286
 
 
3287
/*****************************************************************************/
 
3288
 
 
3289
/*
 
3290
 *      Transmit interrupt handler. This has gotta be fast!  Handling TX
 
3291
 *      chars is pretty simple, stuff as many as possible from the TX buffer
 
3292
 *      into the cd1400 FIFO. Must also handle TX breaks here, since they
 
3293
 *      are embedded as commands in the data stream. Oh no, had to use a goto!
 
3294
 *      This could be optimized more, will do when I get time...
 
3295
 *      In practice it is possible that interrupts are enabled but that the
 
3296
 *      port has been hung up. Need to handle not having any TX buffer here,
 
3297
 *      this is done by using the side effect that head and tail will also
 
3298
 *      be NULL if the buffer has been freed.
 
3299
 */
 
3300
 
 
3301
static void stl_cd1400txisr(struct stlpanel *panelp, int ioaddr)
 
3302
{
 
3303
        struct stlport  *portp;
 
3304
        int             len, stlen;
 
3305
        char            *head, *tail;
 
3306
        unsigned char   ioack, srer;
 
3307
        struct tty_struct *tty;
 
3308
 
 
3309
        pr_debug("stl_cd1400txisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr);
 
3310
 
 
3311
        ioack = inb(ioaddr + EREG_TXACK);
 
3312
        if (((ioack & panelp->ackmask) != 0) ||
 
3313
            ((ioack & ACK_TYPMASK) != ACK_TYPTX)) {
 
3314
                printk("STALLION: bad TX interrupt ack value=%x\n", ioack);
 
3315
                return;
 
3316
        }
 
3317
        portp = panelp->ports[(ioack >> 3)];
 
3318
 
 
3319
/*
 
3320
 *      Unfortunately we need to handle breaks in the data stream, since
 
3321
 *      this is the only way to generate them on the cd1400. Do it now if
 
3322
 *      a break is to be sent.
 
3323
 */
 
3324
        if (portp->brklen != 0)
 
3325
                if (stl_cd1400breakisr(portp, ioaddr))
 
3326
                        goto stl_txalldone;
 
3327
 
 
3328
        head = portp->tx.head;
 
3329
        tail = portp->tx.tail;
 
3330
        len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
 
3331
        if ((len == 0) || ((len < STL_TXBUFLOW) &&
 
3332
            (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
 
3333
                set_bit(ASYI_TXLOW, &portp->istate);
 
3334
                tty = tty_port_tty_get(&portp->port);
 
3335
                if (tty) {
 
3336
                        tty_wakeup(tty);
 
3337
                        tty_kref_put(tty);
 
3338
                }
 
3339
        }
 
3340
 
 
3341
        if (len == 0) {
 
3342
                outb((SRER + portp->uartaddr), ioaddr);
 
3343
                srer = inb(ioaddr + EREG_DATA);
 
3344
                if (srer & SRER_TXDATA) {
 
3345
                        srer = (srer & ~SRER_TXDATA) | SRER_TXEMPTY;
 
3346
                } else {
 
3347
                        srer &= ~(SRER_TXDATA | SRER_TXEMPTY);
 
3348
                        clear_bit(ASYI_TXBUSY, &portp->istate);
 
3349
                }
 
3350
                outb(srer, (ioaddr + EREG_DATA));
 
3351
        } else {
 
3352
                len = min(len, CD1400_TXFIFOSIZE);
 
3353
                portp->stats.txtotal += len;
 
3354
                stlen = min_t(unsigned int, len,
 
3355
                                (portp->tx.buf + STL_TXBUFSIZE) - tail);
 
3356
                outb((TDR + portp->uartaddr), ioaddr);
 
3357
                outsb((ioaddr + EREG_DATA), tail, stlen);
 
3358
                len -= stlen;
 
3359
                tail += stlen;
 
3360
                if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
 
3361
                        tail = portp->tx.buf;
 
3362
                if (len > 0) {
 
3363
                        outsb((ioaddr + EREG_DATA), tail, len);
 
3364
                        tail += len;
 
3365
                }
 
3366
                portp->tx.tail = tail;
 
3367
        }
 
3368
 
 
3369
stl_txalldone:
 
3370
        outb((EOSRR + portp->uartaddr), ioaddr);
 
3371
        outb(0, (ioaddr + EREG_DATA));
 
3372
}
 
3373
 
 
3374
/*****************************************************************************/
 
3375
 
 
3376
/*
 
3377
 *      Receive character interrupt handler. Determine if we have good chars
 
3378
 *      or bad chars and then process appropriately. Good chars are easy
 
3379
 *      just shove the lot into the RX buffer and set all status byte to 0.
 
3380
 *      If a bad RX char then process as required. This routine needs to be
 
3381
 *      fast!  In practice it is possible that we get an interrupt on a port
 
3382
 *      that is closed. This can happen on hangups - since they completely
 
3383
 *      shutdown a port not in user context. Need to handle this case.
 
3384
 */
 
3385
 
 
3386
static void stl_cd1400rxisr(struct stlpanel *panelp, int ioaddr)
 
3387
{
 
3388
        struct stlport          *portp;
 
3389
        struct tty_struct       *tty;
 
3390
        unsigned int            ioack, len, buflen;
 
3391
        unsigned char           status;
 
3392
        char                    ch;
 
3393
 
 
3394
        pr_debug("stl_cd1400rxisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr);
 
3395
 
 
3396
        ioack = inb(ioaddr + EREG_RXACK);
 
3397
        if ((ioack & panelp->ackmask) != 0) {
 
3398
                printk("STALLION: bad RX interrupt ack value=%x\n", ioack);
 
3399
                return;
 
3400
        }
 
3401
        portp = panelp->ports[(ioack >> 3)];
 
3402
        tty = tty_port_tty_get(&portp->port);
 
3403
 
 
3404
        if ((ioack & ACK_TYPMASK) == ACK_TYPRXGOOD) {
 
3405
                outb((RDCR + portp->uartaddr), ioaddr);
 
3406
                len = inb(ioaddr + EREG_DATA);
 
3407
                if (tty == NULL || (buflen = tty_buffer_request_room(tty, len)) == 0) {
 
3408
                        len = min_t(unsigned int, len, sizeof(stl_unwanted));
 
3409
                        outb((RDSR + portp->uartaddr), ioaddr);
 
3410
                        insb((ioaddr + EREG_DATA), &stl_unwanted[0], len);
 
3411
                        portp->stats.rxlost += len;
 
3412
                        portp->stats.rxtotal += len;
 
3413
                } else {
 
3414
                        len = min(len, buflen);
 
3415
                        if (len > 0) {
 
3416
                                unsigned char *ptr;
 
3417
                                outb((RDSR + portp->uartaddr), ioaddr);
 
3418
                                tty_prepare_flip_string(tty, &ptr, len);
 
3419
                                insb((ioaddr + EREG_DATA), ptr, len);
 
3420
                                tty_schedule_flip(tty);
 
3421
                                portp->stats.rxtotal += len;
 
3422
                        }
 
3423
                }
 
3424
        } else if ((ioack & ACK_TYPMASK) == ACK_TYPRXBAD) {
 
3425
                outb((RDSR + portp->uartaddr), ioaddr);
 
3426
                status = inb(ioaddr + EREG_DATA);
 
3427
                ch = inb(ioaddr + EREG_DATA);
 
3428
                if (status & ST_PARITY)
 
3429
                        portp->stats.rxparity++;
 
3430
                if (status & ST_FRAMING)
 
3431
                        portp->stats.rxframing++;
 
3432
                if (status & ST_OVERRUN)
 
3433
                        portp->stats.rxoverrun++;
 
3434
                if (status & ST_BREAK)
 
3435
                        portp->stats.rxbreaks++;
 
3436
                if (status & ST_SCHARMASK) {
 
3437
                        if ((status & ST_SCHARMASK) == ST_SCHAR1)
 
3438
                                portp->stats.txxon++;
 
3439
                        if ((status & ST_SCHARMASK) == ST_SCHAR2)
 
3440
                                portp->stats.txxoff++;
 
3441
                        goto stl_rxalldone;
 
3442
                }
 
3443
                if (tty != NULL && (portp->rxignoremsk & status) == 0) {
 
3444
                        if (portp->rxmarkmsk & status) {
 
3445
                                if (status & ST_BREAK) {
 
3446
                                        status = TTY_BREAK;
 
3447
                                        if (portp->port.flags & ASYNC_SAK) {
 
3448
                                                do_SAK(tty);
 
3449
                                                BRDENABLE(portp->brdnr, portp->pagenr);
 
3450
                                        }
 
3451
                                } else if (status & ST_PARITY)
 
3452
                                        status = TTY_PARITY;
 
3453
                                else if (status & ST_FRAMING)
 
3454
                                        status = TTY_FRAME;
 
3455
                                else if(status & ST_OVERRUN)
 
3456
                                        status = TTY_OVERRUN;
 
3457
                                else
 
3458
                                        status = 0;
 
3459
                        } else
 
3460
                                status = 0;
 
3461
                        tty_insert_flip_char(tty, ch, status);
 
3462
                        tty_schedule_flip(tty);
 
3463
                }
 
3464
        } else {
 
3465
                printk("STALLION: bad RX interrupt ack value=%x\n", ioack);
 
3466
                tty_kref_put(tty);
 
3467
                return;
 
3468
        }
 
3469
 
 
3470
stl_rxalldone:
 
3471
        tty_kref_put(tty);
 
3472
        outb((EOSRR + portp->uartaddr), ioaddr);
 
3473
        outb(0, (ioaddr + EREG_DATA));
 
3474
}
 
3475
 
 
3476
/*****************************************************************************/
 
3477
 
 
3478
/*
 
3479
 *      Modem interrupt handler. The is called when the modem signal line
 
3480
 *      (DCD) has changed state. Leave most of the work to the off-level
 
3481
 *      processing routine.
 
3482
 */
 
3483
 
 
3484
static void stl_cd1400mdmisr(struct stlpanel *panelp, int ioaddr)
 
3485
{
 
3486
        struct stlport  *portp;
 
3487
        unsigned int    ioack;
 
3488
        unsigned char   misr;
 
3489
 
 
3490
        pr_debug("stl_cd1400mdmisr(panelp=%p)\n", panelp);
 
3491
 
 
3492
        ioack = inb(ioaddr + EREG_MDACK);
 
3493
        if (((ioack & panelp->ackmask) != 0) ||
 
3494
            ((ioack & ACK_TYPMASK) != ACK_TYPMDM)) {
 
3495
                printk("STALLION: bad MODEM interrupt ack value=%x\n", ioack);
 
3496
                return;
 
3497
        }
 
3498
        portp = panelp->ports[(ioack >> 3)];
 
3499
 
 
3500
        outb((MISR + portp->uartaddr), ioaddr);
 
3501
        misr = inb(ioaddr + EREG_DATA);
 
3502
        if (misr & MISR_DCD) {
 
3503
                stl_cd_change(portp);
 
3504
                portp->stats.modem++;
 
3505
        }
 
3506
 
 
3507
        outb((EOSRR + portp->uartaddr), ioaddr);
 
3508
        outb(0, (ioaddr + EREG_DATA));
 
3509
}
 
3510
 
 
3511
/*****************************************************************************/
 
3512
/*                      SC26198 HARDWARE FUNCTIONS                           */
 
3513
/*****************************************************************************/
 
3514
 
 
3515
/*
 
3516
 *      These functions get/set/update the registers of the sc26198 UARTs.
 
3517
 *      Access to the sc26198 registers is via an address/data io port pair.
 
3518
 *      (Maybe should make this inline...)
 
3519
 */
 
3520
 
 
3521
static int stl_sc26198getreg(struct stlport *portp, int regnr)
 
3522
{
 
3523
        outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
 
3524
        return inb(portp->ioaddr + XP_DATA);
 
3525
}
 
3526
 
 
3527
static void stl_sc26198setreg(struct stlport *portp, int regnr, int value)
 
3528
{
 
3529
        outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
 
3530
        outb(value, (portp->ioaddr + XP_DATA));
 
3531
}
 
3532
 
 
3533
static int stl_sc26198updatereg(struct stlport *portp, int regnr, int value)
 
3534
{
 
3535
        outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
 
3536
        if (inb(portp->ioaddr + XP_DATA) != value) {
 
3537
                outb(value, (portp->ioaddr + XP_DATA));
 
3538
                return 1;
 
3539
        }
 
3540
        return 0;
 
3541
}
 
3542
 
 
3543
/*****************************************************************************/
 
3544
 
 
3545
/*
 
3546
 *      Functions to get and set the sc26198 global registers.
 
3547
 */
 
3548
 
 
3549
static int stl_sc26198getglobreg(struct stlport *portp, int regnr)
 
3550
{
 
3551
        outb(regnr, (portp->ioaddr + XP_ADDR));
 
3552
        return inb(portp->ioaddr + XP_DATA);
 
3553
}
 
3554
 
 
3555
#if 0
 
3556
static void stl_sc26198setglobreg(struct stlport *portp, int regnr, int value)
 
3557
{
 
3558
        outb(regnr, (portp->ioaddr + XP_ADDR));
 
3559
        outb(value, (portp->ioaddr + XP_DATA));
 
3560
}
 
3561
#endif
 
3562
 
 
3563
/*****************************************************************************/
 
3564
 
 
3565
/*
 
3566
 *      Inbitialize the UARTs in a panel. We don't care what sort of board
 
3567
 *      these ports are on - since the port io registers are almost
 
3568
 *      identical when dealing with ports.
 
3569
 */
 
3570
 
 
3571
static int stl_sc26198panelinit(struct stlbrd *brdp, struct stlpanel *panelp)
 
3572
{
 
3573
        int     chipmask, i;
 
3574
        int     nrchips, ioaddr;
 
3575
 
 
3576
        pr_debug("stl_sc26198panelinit(brdp=%p,panelp=%p)\n", brdp, panelp);
 
3577
 
 
3578
        BRDENABLE(panelp->brdnr, panelp->pagenr);
 
3579
 
 
3580
/*
 
3581
 *      Check that each chip is present and started up OK.
 
3582
 */
 
3583
        chipmask = 0;
 
3584
        nrchips = (panelp->nrports + 4) / SC26198_PORTS;
 
3585
        if (brdp->brdtype == BRD_ECHPCI)
 
3586
                outb(panelp->pagenr, brdp->ioctrl);
 
3587
 
 
3588
        for (i = 0; i < nrchips; i++) {
 
3589
                ioaddr = panelp->iobase + (i * 4); 
 
3590
                outb(SCCR, (ioaddr + XP_ADDR));
 
3591
                outb(CR_RESETALL, (ioaddr + XP_DATA));
 
3592
                outb(TSTR, (ioaddr + XP_ADDR));
 
3593
                if (inb(ioaddr + XP_DATA) != 0) {
 
3594
                        printk("STALLION: sc26198 not responding, "
 
3595
                                "brd=%d panel=%d chip=%d\n",
 
3596
                                panelp->brdnr, panelp->panelnr, i);
 
3597
                        continue;
 
3598
                }
 
3599
                chipmask |= (0x1 << i);
 
3600
                outb(GCCR, (ioaddr + XP_ADDR));
 
3601
                outb(GCCR_IVRTYPCHANACK, (ioaddr + XP_DATA));
 
3602
                outb(WDTRCR, (ioaddr + XP_ADDR));
 
3603
                outb(0xff, (ioaddr + XP_DATA));
 
3604
        }
 
3605
 
 
3606
        BRDDISABLE(panelp->brdnr);
 
3607
        return chipmask;
 
3608
}
 
3609
 
 
3610
/*****************************************************************************/
 
3611
 
 
3612
/*
 
3613
 *      Initialize hardware specific port registers.
 
3614
 */
 
3615
 
 
3616
static void stl_sc26198portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
 
3617
{
 
3618
        pr_debug("stl_sc26198portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
 
3619
                        panelp, portp);
 
3620
 
 
3621
        if ((brdp == NULL) || (panelp == NULL) ||
 
3622
            (portp == NULL))
 
3623
                return;
 
3624
 
 
3625
        portp->ioaddr = panelp->iobase + ((portp->portnr < 8) ? 0 : 4);
 
3626
        portp->uartaddr = (portp->portnr & 0x07) << 4;
 
3627
        portp->pagenr = panelp->pagenr;
 
3628
        portp->hwid = 0x1;
 
3629
 
 
3630
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3631
        stl_sc26198setreg(portp, IOPCR, IOPCR_SETSIGS);
 
3632
        BRDDISABLE(portp->brdnr);
 
3633
}
 
3634
 
 
3635
/*****************************************************************************/
 
3636
 
 
3637
/*
 
3638
 *      Set up the sc26198 registers for a port based on the termios port
 
3639
 *      settings.
 
3640
 */
 
3641
 
 
3642
static void stl_sc26198setport(struct stlport *portp, struct ktermios *tiosp)
 
3643
{
 
3644
        struct stlbrd   *brdp;
 
3645
        unsigned long   flags;
 
3646
        unsigned int    baudrate;
 
3647
        unsigned char   mr0, mr1, mr2, clk;
 
3648
        unsigned char   imron, imroff, iopr, ipr;
 
3649
 
 
3650
        mr0 = 0;
 
3651
        mr1 = 0;
 
3652
        mr2 = 0;
 
3653
        clk = 0;
 
3654
        iopr = 0;
 
3655
        imron = 0;
 
3656
        imroff = 0;
 
3657
 
 
3658
        brdp = stl_brds[portp->brdnr];
 
3659
        if (brdp == NULL)
 
3660
                return;
 
3661
 
 
3662
/*
 
3663
 *      Set up the RX char ignore mask with those RX error types we
 
3664
 *      can ignore.
 
3665
 */
 
3666
        portp->rxignoremsk = 0;
 
3667
        if (tiosp->c_iflag & IGNPAR)
 
3668
                portp->rxignoremsk |= (SR_RXPARITY | SR_RXFRAMING |
 
3669
                        SR_RXOVERRUN);
 
3670
        if (tiosp->c_iflag & IGNBRK)
 
3671
                portp->rxignoremsk |= SR_RXBREAK;
 
3672
 
 
3673
        portp->rxmarkmsk = SR_RXOVERRUN;
 
3674
        if (tiosp->c_iflag & (INPCK | PARMRK))
 
3675
                portp->rxmarkmsk |= (SR_RXPARITY | SR_RXFRAMING);
 
3676
        if (tiosp->c_iflag & BRKINT)
 
3677
                portp->rxmarkmsk |= SR_RXBREAK;
 
3678
 
 
3679
/*
 
3680
 *      Go through the char size, parity and stop bits and set all the
 
3681
 *      option register appropriately.
 
3682
 */
 
3683
        switch (tiosp->c_cflag & CSIZE) {
 
3684
        case CS5:
 
3685
                mr1 |= MR1_CS5;
 
3686
                break;
 
3687
        case CS6:
 
3688
                mr1 |= MR1_CS6;
 
3689
                break;
 
3690
        case CS7:
 
3691
                mr1 |= MR1_CS7;
 
3692
                break;
 
3693
        default:
 
3694
                mr1 |= MR1_CS8;
 
3695
                break;
 
3696
        }
 
3697
 
 
3698
        if (tiosp->c_cflag & CSTOPB)
 
3699
                mr2 |= MR2_STOP2;
 
3700
        else
 
3701
                mr2 |= MR2_STOP1;
 
3702
 
 
3703
        if (tiosp->c_cflag & PARENB) {
 
3704
                if (tiosp->c_cflag & PARODD)
 
3705
                        mr1 |= (MR1_PARENB | MR1_PARODD);
 
3706
                else
 
3707
                        mr1 |= (MR1_PARENB | MR1_PAREVEN);
 
3708
        } else
 
3709
                mr1 |= MR1_PARNONE;
 
3710
 
 
3711
        mr1 |= MR1_ERRBLOCK;
 
3712
 
 
3713
/*
 
3714
 *      Set the RX FIFO threshold at 8 chars. This gives a bit of breathing
 
3715
 *      space for hardware flow control and the like. This should be set to
 
3716
 *      VMIN.
 
3717
 */
 
3718
        mr2 |= MR2_RXFIFOHALF;
 
3719
 
 
3720
/*
 
3721
 *      Calculate the baud rate timers. For now we will just assume that
 
3722
 *      the input and output baud are the same. The sc26198 has a fixed
 
3723
 *      baud rate table, so only discrete baud rates possible.
 
3724
 */
 
3725
        baudrate = tiosp->c_cflag & CBAUD;
 
3726
        if (baudrate & CBAUDEX) {
 
3727
                baudrate &= ~CBAUDEX;
 
3728
                if ((baudrate < 1) || (baudrate > 4))
 
3729
                        tiosp->c_cflag &= ~CBAUDEX;
 
3730
                else
 
3731
                        baudrate += 15;
 
3732
        }
 
3733
        baudrate = stl_baudrates[baudrate];
 
3734
        if ((tiosp->c_cflag & CBAUD) == B38400) {
 
3735
                if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
 
3736
                        baudrate = 57600;
 
3737
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
 
3738
                        baudrate = 115200;
 
3739
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
 
3740
                        baudrate = 230400;
 
3741
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
 
3742
                        baudrate = 460800;
 
3743
                else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
 
3744
                        baudrate = (portp->baud_base / portp->custom_divisor);
 
3745
        }
 
3746
        if (baudrate > STL_SC26198MAXBAUD)
 
3747
                baudrate = STL_SC26198MAXBAUD;
 
3748
 
 
3749
        if (baudrate > 0)
 
3750
                for (clk = 0; clk < SC26198_NRBAUDS; clk++)
 
3751
                        if (baudrate <= sc26198_baudtable[clk])
 
3752
                                break;
 
3753
 
 
3754
/*
 
3755
 *      Check what form of modem signaling is required and set it up.
 
3756
 */
 
3757
        if (tiosp->c_cflag & CLOCAL) {
 
3758
                portp->port.flags &= ~ASYNC_CHECK_CD;
 
3759
        } else {
 
3760
                iopr |= IOPR_DCDCOS;
 
3761
                imron |= IR_IOPORT;
 
3762
                portp->port.flags |= ASYNC_CHECK_CD;
 
3763
        }
 
3764
 
 
3765
/*
 
3766
 *      Setup sc26198 enhanced modes if we can. In particular we want to
 
3767
 *      handle as much of the flow control as possible automatically. As
 
3768
 *      well as saving a few CPU cycles it will also greatly improve flow
 
3769
 *      control reliability.
 
3770
 */
 
3771
        if (tiosp->c_iflag & IXON) {
 
3772
                mr0 |= MR0_SWFTX | MR0_SWFT;
 
3773
                imron |= IR_XONXOFF;
 
3774
        } else
 
3775
                imroff |= IR_XONXOFF;
 
3776
 
 
3777
        if (tiosp->c_iflag & IXOFF)
 
3778
                mr0 |= MR0_SWFRX;
 
3779
 
 
3780
        if (tiosp->c_cflag & CRTSCTS) {
 
3781
                mr2 |= MR2_AUTOCTS;
 
3782
                mr1 |= MR1_AUTORTS;
 
3783
        }
 
3784
 
 
3785
/*
 
3786
 *      All sc26198 register values calculated so go through and set
 
3787
 *      them all up.
 
3788
 */
 
3789
 
 
3790
        pr_debug("SETPORT: portnr=%d panelnr=%d brdnr=%d\n",
 
3791
                portp->portnr, portp->panelnr, portp->brdnr);
 
3792
        pr_debug("    mr0=%x mr1=%x mr2=%x clk=%x\n", mr0, mr1, mr2, clk);
 
3793
        pr_debug("    iopr=%x imron=%x imroff=%x\n", iopr, imron, imroff);
 
3794
        pr_debug("    schr1=%x schr2=%x schr3=%x schr4=%x\n",
 
3795
                tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
 
3796
                tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
 
3797
 
 
3798
        spin_lock_irqsave(&brd_lock, flags);
 
3799
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3800
        stl_sc26198setreg(portp, IMR, 0);
 
3801
        stl_sc26198updatereg(portp, MR0, mr0);
 
3802
        stl_sc26198updatereg(portp, MR1, mr1);
 
3803
        stl_sc26198setreg(portp, SCCR, CR_RXERRBLOCK);
 
3804
        stl_sc26198updatereg(portp, MR2, mr2);
 
3805
        stl_sc26198updatereg(portp, IOPIOR,
 
3806
                ((stl_sc26198getreg(portp, IOPIOR) & ~IPR_CHANGEMASK) | iopr));
 
3807
 
 
3808
        if (baudrate > 0) {
 
3809
                stl_sc26198setreg(portp, TXCSR, clk);
 
3810
                stl_sc26198setreg(portp, RXCSR, clk);
 
3811
        }
 
3812
 
 
3813
        stl_sc26198setreg(portp, XONCR, tiosp->c_cc[VSTART]);
 
3814
        stl_sc26198setreg(portp, XOFFCR, tiosp->c_cc[VSTOP]);
 
3815
 
 
3816
        ipr = stl_sc26198getreg(portp, IPR);
 
3817
        if (ipr & IPR_DCD)
 
3818
                portp->sigs &= ~TIOCM_CD;
 
3819
        else
 
3820
                portp->sigs |= TIOCM_CD;
 
3821
 
 
3822
        portp->imr = (portp->imr & ~imroff) | imron;
 
3823
        stl_sc26198setreg(portp, IMR, portp->imr);
 
3824
        BRDDISABLE(portp->brdnr);
 
3825
        spin_unlock_irqrestore(&brd_lock, flags);
 
3826
}
 
3827
 
 
3828
/*****************************************************************************/
 
3829
 
 
3830
/*
 
3831
 *      Set the state of the DTR and RTS signals.
 
3832
 */
 
3833
 
 
3834
static void stl_sc26198setsignals(struct stlport *portp, int dtr, int rts)
 
3835
{
 
3836
        unsigned char   iopioron, iopioroff;
 
3837
        unsigned long   flags;
 
3838
 
 
3839
        pr_debug("stl_sc26198setsignals(portp=%p,dtr=%d,rts=%d)\n", portp,
 
3840
                        dtr, rts);
 
3841
 
 
3842
        iopioron = 0;
 
3843
        iopioroff = 0;
 
3844
        if (dtr == 0)
 
3845
                iopioroff |= IPR_DTR;
 
3846
        else if (dtr > 0)
 
3847
                iopioron |= IPR_DTR;
 
3848
        if (rts == 0)
 
3849
                iopioroff |= IPR_RTS;
 
3850
        else if (rts > 0)
 
3851
                iopioron |= IPR_RTS;
 
3852
 
 
3853
        spin_lock_irqsave(&brd_lock, flags);
 
3854
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3855
        stl_sc26198setreg(portp, IOPIOR,
 
3856
                ((stl_sc26198getreg(portp, IOPIOR) & ~iopioroff) | iopioron));
 
3857
        BRDDISABLE(portp->brdnr);
 
3858
        spin_unlock_irqrestore(&brd_lock, flags);
 
3859
}
 
3860
 
 
3861
/*****************************************************************************/
 
3862
 
 
3863
/*
 
3864
 *      Return the state of the signals.
 
3865
 */
 
3866
 
 
3867
static int stl_sc26198getsignals(struct stlport *portp)
 
3868
{
 
3869
        unsigned char   ipr;
 
3870
        unsigned long   flags;
 
3871
        int             sigs;
 
3872
 
 
3873
        pr_debug("stl_sc26198getsignals(portp=%p)\n", portp);
 
3874
 
 
3875
        spin_lock_irqsave(&brd_lock, flags);
 
3876
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3877
        ipr = stl_sc26198getreg(portp, IPR);
 
3878
        BRDDISABLE(portp->brdnr);
 
3879
        spin_unlock_irqrestore(&brd_lock, flags);
 
3880
 
 
3881
        sigs = 0;
 
3882
        sigs |= (ipr & IPR_DCD) ? 0 : TIOCM_CD;
 
3883
        sigs |= (ipr & IPR_CTS) ? 0 : TIOCM_CTS;
 
3884
        sigs |= (ipr & IPR_DTR) ? 0: TIOCM_DTR;
 
3885
        sigs |= (ipr & IPR_RTS) ? 0: TIOCM_RTS;
 
3886
        sigs |= TIOCM_DSR;
 
3887
        return sigs;
 
3888
}
 
3889
 
 
3890
/*****************************************************************************/
 
3891
 
 
3892
/*
 
3893
 *      Enable/Disable the Transmitter and/or Receiver.
 
3894
 */
 
3895
 
 
3896
static void stl_sc26198enablerxtx(struct stlport *portp, int rx, int tx)
 
3897
{
 
3898
        unsigned char   ccr;
 
3899
        unsigned long   flags;
 
3900
 
 
3901
        pr_debug("stl_sc26198enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx,tx);
 
3902
 
 
3903
        ccr = portp->crenable;
 
3904
        if (tx == 0)
 
3905
                ccr &= ~CR_TXENABLE;
 
3906
        else if (tx > 0)
 
3907
                ccr |= CR_TXENABLE;
 
3908
        if (rx == 0)
 
3909
                ccr &= ~CR_RXENABLE;
 
3910
        else if (rx > 0)
 
3911
                ccr |= CR_RXENABLE;
 
3912
 
 
3913
        spin_lock_irqsave(&brd_lock, flags);
 
3914
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3915
        stl_sc26198setreg(portp, SCCR, ccr);
 
3916
        BRDDISABLE(portp->brdnr);
 
3917
        portp->crenable = ccr;
 
3918
        spin_unlock_irqrestore(&brd_lock, flags);
 
3919
}
 
3920
 
 
3921
/*****************************************************************************/
 
3922
 
 
3923
/*
 
3924
 *      Start/stop the Transmitter and/or Receiver.
 
3925
 */
 
3926
 
 
3927
static void stl_sc26198startrxtx(struct stlport *portp, int rx, int tx)
 
3928
{
 
3929
        unsigned char   imr;
 
3930
        unsigned long   flags;
 
3931
 
 
3932
        pr_debug("stl_sc26198startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
 
3933
 
 
3934
        imr = portp->imr;
 
3935
        if (tx == 0)
 
3936
                imr &= ~IR_TXRDY;
 
3937
        else if (tx == 1)
 
3938
                imr |= IR_TXRDY;
 
3939
        if (rx == 0)
 
3940
                imr &= ~(IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG);
 
3941
        else if (rx > 0)
 
3942
                imr |= IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG;
 
3943
 
 
3944
        spin_lock_irqsave(&brd_lock, flags);
 
3945
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3946
        stl_sc26198setreg(portp, IMR, imr);
 
3947
        BRDDISABLE(portp->brdnr);
 
3948
        portp->imr = imr;
 
3949
        if (tx > 0)
 
3950
                set_bit(ASYI_TXBUSY, &portp->istate);
 
3951
        spin_unlock_irqrestore(&brd_lock, flags);
 
3952
}
 
3953
 
 
3954
/*****************************************************************************/
 
3955
 
 
3956
/*
 
3957
 *      Disable all interrupts from this port.
 
3958
 */
 
3959
 
 
3960
static void stl_sc26198disableintrs(struct stlport *portp)
 
3961
{
 
3962
        unsigned long   flags;
 
3963
 
 
3964
        pr_debug("stl_sc26198disableintrs(portp=%p)\n", portp);
 
3965
 
 
3966
        spin_lock_irqsave(&brd_lock, flags);
 
3967
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3968
        portp->imr = 0;
 
3969
        stl_sc26198setreg(portp, IMR, 0);
 
3970
        BRDDISABLE(portp->brdnr);
 
3971
        spin_unlock_irqrestore(&brd_lock, flags);
 
3972
}
 
3973
 
 
3974
/*****************************************************************************/
 
3975
 
 
3976
static void stl_sc26198sendbreak(struct stlport *portp, int len)
 
3977
{
 
3978
        unsigned long   flags;
 
3979
 
 
3980
        pr_debug("stl_sc26198sendbreak(portp=%p,len=%d)\n", portp, len);
 
3981
 
 
3982
        spin_lock_irqsave(&brd_lock, flags);
 
3983
        BRDENABLE(portp->brdnr, portp->pagenr);
 
3984
        if (len == 1) {
 
3985
                stl_sc26198setreg(portp, SCCR, CR_TXSTARTBREAK);
 
3986
                portp->stats.txbreaks++;
 
3987
        } else
 
3988
                stl_sc26198setreg(portp, SCCR, CR_TXSTOPBREAK);
 
3989
 
 
3990
        BRDDISABLE(portp->brdnr);
 
3991
        spin_unlock_irqrestore(&brd_lock, flags);
 
3992
}
 
3993
 
 
3994
/*****************************************************************************/
 
3995
 
 
3996
/*
 
3997
 *      Take flow control actions...
 
3998
 */
 
3999
 
 
4000
static void stl_sc26198flowctrl(struct stlport *portp, int state)
 
4001
{
 
4002
        struct tty_struct       *tty;
 
4003
        unsigned long           flags;
 
4004
        unsigned char           mr0;
 
4005
 
 
4006
        pr_debug("stl_sc26198flowctrl(portp=%p,state=%x)\n", portp, state);
 
4007
 
 
4008
        if (portp == NULL)
 
4009
                return;
 
4010
        tty = tty_port_tty_get(&portp->port);
 
4011
        if (tty == NULL)
 
4012
                return;
 
4013
 
 
4014
        spin_lock_irqsave(&brd_lock, flags);
 
4015
        BRDENABLE(portp->brdnr, portp->pagenr);
 
4016
 
 
4017
        if (state) {
 
4018
                if (tty->termios->c_iflag & IXOFF) {
 
4019
                        mr0 = stl_sc26198getreg(portp, MR0);
 
4020
                        stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
 
4021
                        stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
 
4022
                        mr0 |= MR0_SWFRX;
 
4023
                        portp->stats.rxxon++;
 
4024
                        stl_sc26198wait(portp);
 
4025
                        stl_sc26198setreg(portp, MR0, mr0);
 
4026
                }
 
4027
/*
 
4028
 *              Question: should we return RTS to what it was before? It may
 
4029
 *              have been set by an ioctl... Suppose not, since if you have
 
4030
 *              hardware flow control set then it is pretty silly to go and
 
4031
 *              set the RTS line by hand.
 
4032
 */
 
4033
                if (tty->termios->c_cflag & CRTSCTS) {
 
4034
                        stl_sc26198setreg(portp, MR1,
 
4035
                                (stl_sc26198getreg(portp, MR1) | MR1_AUTORTS));
 
4036
                        stl_sc26198setreg(portp, IOPIOR,
 
4037
                                (stl_sc26198getreg(portp, IOPIOR) | IOPR_RTS));
 
4038
                        portp->stats.rxrtson++;
 
4039
                }
 
4040
        } else {
 
4041
                if (tty->termios->c_iflag & IXOFF) {
 
4042
                        mr0 = stl_sc26198getreg(portp, MR0);
 
4043
                        stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
 
4044
                        stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
 
4045
                        mr0 &= ~MR0_SWFRX;
 
4046
                        portp->stats.rxxoff++;
 
4047
                        stl_sc26198wait(portp);
 
4048
                        stl_sc26198setreg(portp, MR0, mr0);
 
4049
                }
 
4050
                if (tty->termios->c_cflag & CRTSCTS) {
 
4051
                        stl_sc26198setreg(portp, MR1,
 
4052
                                (stl_sc26198getreg(portp, MR1) & ~MR1_AUTORTS));
 
4053
                        stl_sc26198setreg(portp, IOPIOR,
 
4054
                                (stl_sc26198getreg(portp, IOPIOR) & ~IOPR_RTS));
 
4055
                        portp->stats.rxrtsoff++;
 
4056
                }
 
4057
        }
 
4058
 
 
4059
        BRDDISABLE(portp->brdnr);
 
4060
        spin_unlock_irqrestore(&brd_lock, flags);
 
4061
        tty_kref_put(tty);
 
4062
}
 
4063
 
 
4064
/*****************************************************************************/
 
4065
 
 
4066
/*
 
4067
 *      Send a flow control character.
 
4068
 */
 
4069
 
 
4070
static void stl_sc26198sendflow(struct stlport *portp, int state)
 
4071
{
 
4072
        struct tty_struct       *tty;
 
4073
        unsigned long           flags;
 
4074
        unsigned char           mr0;
 
4075
 
 
4076
        pr_debug("stl_sc26198sendflow(portp=%p,state=%x)\n", portp, state);
 
4077
 
 
4078
        if (portp == NULL)
 
4079
                return;
 
4080
        tty = tty_port_tty_get(&portp->port);
 
4081
        if (tty == NULL)
 
4082
                return;
 
4083
 
 
4084
        spin_lock_irqsave(&brd_lock, flags);
 
4085
        BRDENABLE(portp->brdnr, portp->pagenr);
 
4086
        if (state) {
 
4087
                mr0 = stl_sc26198getreg(portp, MR0);
 
4088
                stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
 
4089
                stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
 
4090
                mr0 |= MR0_SWFRX;
 
4091
                portp->stats.rxxon++;
 
4092
                stl_sc26198wait(portp);
 
4093
                stl_sc26198setreg(portp, MR0, mr0);
 
4094
        } else {
 
4095
                mr0 = stl_sc26198getreg(portp, MR0);
 
4096
                stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
 
4097
                stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
 
4098
                mr0 &= ~MR0_SWFRX;
 
4099
                portp->stats.rxxoff++;
 
4100
                stl_sc26198wait(portp);
 
4101
                stl_sc26198setreg(portp, MR0, mr0);
 
4102
        }
 
4103
        BRDDISABLE(portp->brdnr);
 
4104
        spin_unlock_irqrestore(&brd_lock, flags);
 
4105
        tty_kref_put(tty);
 
4106
}
 
4107
 
 
4108
/*****************************************************************************/
 
4109
 
 
4110
static void stl_sc26198flush(struct stlport *portp)
 
4111
{
 
4112
        unsigned long   flags;
 
4113
 
 
4114
        pr_debug("stl_sc26198flush(portp=%p)\n", portp);
 
4115
 
 
4116
        if (portp == NULL)
 
4117
                return;
 
4118
 
 
4119
        spin_lock_irqsave(&brd_lock, flags);
 
4120
        BRDENABLE(portp->brdnr, portp->pagenr);
 
4121
        stl_sc26198setreg(portp, SCCR, CR_TXRESET);
 
4122
        stl_sc26198setreg(portp, SCCR, portp->crenable);
 
4123
        BRDDISABLE(portp->brdnr);
 
4124
        portp->tx.tail = portp->tx.head;
 
4125
        spin_unlock_irqrestore(&brd_lock, flags);
 
4126
}
 
4127
 
 
4128
/*****************************************************************************/
 
4129
 
 
4130
/*
 
4131
 *      Return the current state of data flow on this port. This is only
 
4132
 *      really interesting when determining if data has fully completed
 
4133
 *      transmission or not... The sc26198 interrupt scheme cannot
 
4134
 *      determine when all data has actually drained, so we need to
 
4135
 *      check the port statusy register to be sure.
 
4136
 */
 
4137
 
 
4138
static int stl_sc26198datastate(struct stlport *portp)
 
4139
{
 
4140
        unsigned long   flags;
 
4141
        unsigned char   sr;
 
4142
 
 
4143
        pr_debug("stl_sc26198datastate(portp=%p)\n", portp);
 
4144
 
 
4145
        if (portp == NULL)
 
4146
                return 0;
 
4147
        if (test_bit(ASYI_TXBUSY, &portp->istate))
 
4148
                return 1;
 
4149
 
 
4150
        spin_lock_irqsave(&brd_lock, flags);
 
4151
        BRDENABLE(portp->brdnr, portp->pagenr);
 
4152
        sr = stl_sc26198getreg(portp, SR);
 
4153
        BRDDISABLE(portp->brdnr);
 
4154
        spin_unlock_irqrestore(&brd_lock, flags);
 
4155
 
 
4156
        return (sr & SR_TXEMPTY) ? 0 : 1;
 
4157
}
 
4158
 
 
4159
/*****************************************************************************/
 
4160
 
 
4161
/*
 
4162
 *      Delay for a small amount of time, to give the sc26198 a chance
 
4163
 *      to process a command...
 
4164
 */
 
4165
 
 
4166
static void stl_sc26198wait(struct stlport *portp)
 
4167
{
 
4168
        int     i;
 
4169
 
 
4170
        pr_debug("stl_sc26198wait(portp=%p)\n", portp);
 
4171
 
 
4172
        if (portp == NULL)
 
4173
                return;
 
4174
 
 
4175
        for (i = 0; i < 20; i++)
 
4176
                stl_sc26198getglobreg(portp, TSTR);
 
4177
}
 
4178
 
 
4179
/*****************************************************************************/
 
4180
 
 
4181
/*
 
4182
 *      If we are TX flow controlled and in IXANY mode then we may
 
4183
 *      need to unflow control here. We gotta do this because of the
 
4184
 *      automatic flow control modes of the sc26198.
 
4185
 */
 
4186
 
 
4187
static void stl_sc26198txunflow(struct stlport *portp, struct tty_struct *tty)
 
4188
{
 
4189
        unsigned char   mr0;
 
4190
 
 
4191
        mr0 = stl_sc26198getreg(portp, MR0);
 
4192
        stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
 
4193
        stl_sc26198setreg(portp, SCCR, CR_HOSTXON);
 
4194
        stl_sc26198wait(portp);
 
4195
        stl_sc26198setreg(portp, MR0, mr0);
 
4196
        clear_bit(ASYI_TXFLOWED, &portp->istate);
 
4197
}
 
4198
 
 
4199
/*****************************************************************************/
 
4200
 
 
4201
/*
 
4202
 *      Interrupt service routine for sc26198 panels.
 
4203
 */
 
4204
 
 
4205
static void stl_sc26198intr(struct stlpanel *panelp, unsigned int iobase)
 
4206
{
 
4207
        struct stlport  *portp;
 
4208
        unsigned int    iack;
 
4209
 
 
4210
        spin_lock(&brd_lock);
 
4211
 
 
4212
/* 
 
4213
 *      Work around bug in sc26198 chip... Cannot have A6 address
 
4214
 *      line of UART high, else iack will be returned as 0.
 
4215
 */
 
4216
        outb(0, (iobase + 1));
 
4217
 
 
4218
        iack = inb(iobase + XP_IACK);
 
4219
        portp = panelp->ports[(iack & IVR_CHANMASK) + ((iobase & 0x4) << 1)];
 
4220
 
 
4221
        if (iack & IVR_RXDATA)
 
4222
                stl_sc26198rxisr(portp, iack);
 
4223
        else if (iack & IVR_TXDATA)
 
4224
                stl_sc26198txisr(portp);
 
4225
        else
 
4226
                stl_sc26198otherisr(portp, iack);
 
4227
 
 
4228
        spin_unlock(&brd_lock);
 
4229
}
 
4230
 
 
4231
/*****************************************************************************/
 
4232
 
 
4233
/*
 
4234
 *      Transmit interrupt handler. This has gotta be fast!  Handling TX
 
4235
 *      chars is pretty simple, stuff as many as possible from the TX buffer
 
4236
 *      into the sc26198 FIFO.
 
4237
 *      In practice it is possible that interrupts are enabled but that the
 
4238
 *      port has been hung up. Need to handle not having any TX buffer here,
 
4239
 *      this is done by using the side effect that head and tail will also
 
4240
 *      be NULL if the buffer has been freed.
 
4241
 */
 
4242
 
 
4243
static void stl_sc26198txisr(struct stlport *portp)
 
4244
{
 
4245
        struct tty_struct *tty;
 
4246
        unsigned int    ioaddr;
 
4247
        unsigned char   mr0;
 
4248
        int             len, stlen;
 
4249
        char            *head, *tail;
 
4250
 
 
4251
        pr_debug("stl_sc26198txisr(portp=%p)\n", portp);
 
4252
 
 
4253
        ioaddr = portp->ioaddr;
 
4254
        head = portp->tx.head;
 
4255
        tail = portp->tx.tail;
 
4256
        len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
 
4257
        if ((len == 0) || ((len < STL_TXBUFLOW) &&
 
4258
            (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
 
4259
                set_bit(ASYI_TXLOW, &portp->istate);
 
4260
                tty = tty_port_tty_get(&portp->port);
 
4261
                if (tty) {
 
4262
                        tty_wakeup(tty);
 
4263
                        tty_kref_put(tty);
 
4264
                }
 
4265
        }
 
4266
 
 
4267
        if (len == 0) {
 
4268
                outb((MR0 | portp->uartaddr), (ioaddr + XP_ADDR));
 
4269
                mr0 = inb(ioaddr + XP_DATA);
 
4270
                if ((mr0 & MR0_TXMASK) == MR0_TXEMPTY) {
 
4271
                        portp->imr &= ~IR_TXRDY;
 
4272
                        outb((IMR | portp->uartaddr), (ioaddr + XP_ADDR));
 
4273
                        outb(portp->imr, (ioaddr + XP_DATA));
 
4274
                        clear_bit(ASYI_TXBUSY, &portp->istate);
 
4275
                } else {
 
4276
                        mr0 |= ((mr0 & ~MR0_TXMASK) | MR0_TXEMPTY);
 
4277
                        outb(mr0, (ioaddr + XP_DATA));
 
4278
                }
 
4279
        } else {
 
4280
                len = min(len, SC26198_TXFIFOSIZE);
 
4281
                portp->stats.txtotal += len;
 
4282
                stlen = min_t(unsigned int, len,
 
4283
                                (portp->tx.buf + STL_TXBUFSIZE) - tail);
 
4284
                outb(GTXFIFO, (ioaddr + XP_ADDR));
 
4285
                outsb((ioaddr + XP_DATA), tail, stlen);
 
4286
                len -= stlen;
 
4287
                tail += stlen;
 
4288
                if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
 
4289
                        tail = portp->tx.buf;
 
4290
                if (len > 0) {
 
4291
                        outsb((ioaddr + XP_DATA), tail, len);
 
4292
                        tail += len;
 
4293
                }
 
4294
                portp->tx.tail = tail;
 
4295
        }
 
4296
}
 
4297
 
 
4298
/*****************************************************************************/
 
4299
 
 
4300
/*
 
4301
 *      Receive character interrupt handler. Determine if we have good chars
 
4302
 *      or bad chars and then process appropriately. Good chars are easy
 
4303
 *      just shove the lot into the RX buffer and set all status byte to 0.
 
4304
 *      If a bad RX char then process as required. This routine needs to be
 
4305
 *      fast!  In practice it is possible that we get an interrupt on a port
 
4306
 *      that is closed. This can happen on hangups - since they completely
 
4307
 *      shutdown a port not in user context. Need to handle this case.
 
4308
 */
 
4309
 
 
4310
static void stl_sc26198rxisr(struct stlport *portp, unsigned int iack)
 
4311
{
 
4312
        struct tty_struct       *tty;
 
4313
        unsigned int            len, buflen, ioaddr;
 
4314
 
 
4315
        pr_debug("stl_sc26198rxisr(portp=%p,iack=%x)\n", portp, iack);
 
4316
 
 
4317
        tty = tty_port_tty_get(&portp->port);
 
4318
        ioaddr = portp->ioaddr;
 
4319
        outb(GIBCR, (ioaddr + XP_ADDR));
 
4320
        len = inb(ioaddr + XP_DATA) + 1;
 
4321
 
 
4322
        if ((iack & IVR_TYPEMASK) == IVR_RXDATA) {
 
4323
                if (tty == NULL || (buflen = tty_buffer_request_room(tty, len)) == 0) {
 
4324
                        len = min_t(unsigned int, len, sizeof(stl_unwanted));
 
4325
                        outb(GRXFIFO, (ioaddr + XP_ADDR));
 
4326
                        insb((ioaddr + XP_DATA), &stl_unwanted[0], len);
 
4327
                        portp->stats.rxlost += len;
 
4328
                        portp->stats.rxtotal += len;
 
4329
                } else {
 
4330
                        len = min(len, buflen);
 
4331
                        if (len > 0) {
 
4332
                                unsigned char *ptr;
 
4333
                                outb(GRXFIFO, (ioaddr + XP_ADDR));
 
4334
                                tty_prepare_flip_string(tty, &ptr, len);
 
4335
                                insb((ioaddr + XP_DATA), ptr, len);
 
4336
                                tty_schedule_flip(tty);
 
4337
                                portp->stats.rxtotal += len;
 
4338
                        }
 
4339
                }
 
4340
        } else {
 
4341
                stl_sc26198rxbadchars(portp);
 
4342
        }
 
4343
 
 
4344
/*
 
4345
 *      If we are TX flow controlled and in IXANY mode then we may need
 
4346
 *      to unflow control here. We gotta do this because of the automatic
 
4347
 *      flow control modes of the sc26198.
 
4348
 */
 
4349
        if (test_bit(ASYI_TXFLOWED, &portp->istate)) {
 
4350
                if ((tty != NULL) &&
 
4351
                    (tty->termios != NULL) &&
 
4352
                    (tty->termios->c_iflag & IXANY)) {
 
4353
                        stl_sc26198txunflow(portp, tty);
 
4354
                }
 
4355
        }
 
4356
        tty_kref_put(tty);
 
4357
}
 
4358
 
 
4359
/*****************************************************************************/
 
4360
 
 
4361
/*
 
4362
 *      Process an RX bad character.
 
4363
 */
 
4364
 
 
4365
static void stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char ch)
 
4366
{
 
4367
        struct tty_struct       *tty;
 
4368
        unsigned int            ioaddr;
 
4369
 
 
4370
        tty = tty_port_tty_get(&portp->port);
 
4371
        ioaddr = portp->ioaddr;
 
4372
 
 
4373
        if (status & SR_RXPARITY)
 
4374
                portp->stats.rxparity++;
 
4375
        if (status & SR_RXFRAMING)
 
4376
                portp->stats.rxframing++;
 
4377
        if (status & SR_RXOVERRUN)
 
4378
                portp->stats.rxoverrun++;
 
4379
        if (status & SR_RXBREAK)
 
4380
                portp->stats.rxbreaks++;
 
4381
 
 
4382
        if ((tty != NULL) &&
 
4383
            ((portp->rxignoremsk & status) == 0)) {
 
4384
                if (portp->rxmarkmsk & status) {
 
4385
                        if (status & SR_RXBREAK) {
 
4386
                                status = TTY_BREAK;
 
4387
                                if (portp->port.flags & ASYNC_SAK) {
 
4388
                                        do_SAK(tty);
 
4389
                                        BRDENABLE(portp->brdnr, portp->pagenr);
 
4390
                                }
 
4391
                        } else if (status & SR_RXPARITY)
 
4392
                                status = TTY_PARITY;
 
4393
                        else if (status & SR_RXFRAMING)
 
4394
                                status = TTY_FRAME;
 
4395
                        else if(status & SR_RXOVERRUN)
 
4396
                                status = TTY_OVERRUN;
 
4397
                        else
 
4398
                                status = 0;
 
4399
                } else
 
4400
                        status = 0;
 
4401
 
 
4402
                tty_insert_flip_char(tty, ch, status);
 
4403
                tty_schedule_flip(tty);
 
4404
 
 
4405
                if (status == 0)
 
4406
                        portp->stats.rxtotal++;
 
4407
        }
 
4408
        tty_kref_put(tty);
 
4409
}
 
4410
 
 
4411
/*****************************************************************************/
 
4412
 
 
4413
/*
 
4414
 *      Process all characters in the RX FIFO of the UART. Check all char
 
4415
 *      status bytes as well, and process as required. We need to check
 
4416
 *      all bytes in the FIFO, in case some more enter the FIFO while we
 
4417
 *      are here. To get the exact character error type we need to switch
 
4418
 *      into CHAR error mode (that is why we need to make sure we empty
 
4419
 *      the FIFO).
 
4420
 */
 
4421
 
 
4422
static void stl_sc26198rxbadchars(struct stlport *portp)
 
4423
{
 
4424
        unsigned char   status, mr1;
 
4425
        char            ch;
 
4426
 
 
4427
/*
 
4428
 *      To get the precise error type for each character we must switch
 
4429
 *      back into CHAR error mode.
 
4430
 */
 
4431
        mr1 = stl_sc26198getreg(portp, MR1);
 
4432
        stl_sc26198setreg(portp, MR1, (mr1 & ~MR1_ERRBLOCK));
 
4433
 
 
4434
        while ((status = stl_sc26198getreg(portp, SR)) & SR_RXRDY) {
 
4435
                stl_sc26198setreg(portp, SCCR, CR_CLEARRXERR);
 
4436
                ch = stl_sc26198getreg(portp, RXFIFO);
 
4437
                stl_sc26198rxbadch(portp, status, ch);
 
4438
        }
 
4439
 
 
4440
/*
 
4441
 *      To get correct interrupt class we must switch back into BLOCK
 
4442
 *      error mode.
 
4443
 */
 
4444
        stl_sc26198setreg(portp, MR1, mr1);
 
4445
}
 
4446
 
 
4447
/*****************************************************************************/
 
4448
 
 
4449
/*
 
4450
 *      Other interrupt handler. This includes modem signals, flow
 
4451
 *      control actions, etc. Most stuff is left to off-level interrupt
 
4452
 *      processing time.
 
4453
 */
 
4454
 
 
4455
static void stl_sc26198otherisr(struct stlport *portp, unsigned int iack)
 
4456
{
 
4457
        unsigned char   cir, ipr, xisr;
 
4458
 
 
4459
        pr_debug("stl_sc26198otherisr(portp=%p,iack=%x)\n", portp, iack);
 
4460
 
 
4461
        cir = stl_sc26198getglobreg(portp, CIR);
 
4462
 
 
4463
        switch (cir & CIR_SUBTYPEMASK) {
 
4464
        case CIR_SUBCOS:
 
4465
                ipr = stl_sc26198getreg(portp, IPR);
 
4466
                if (ipr & IPR_DCDCHANGE) {
 
4467
                        stl_cd_change(portp);
 
4468
                        portp->stats.modem++;
 
4469
                }
 
4470
                break;
 
4471
        case CIR_SUBXONXOFF:
 
4472
                xisr = stl_sc26198getreg(portp, XISR);
 
4473
                if (xisr & XISR_RXXONGOT) {
 
4474
                        set_bit(ASYI_TXFLOWED, &portp->istate);
 
4475
                        portp->stats.txxoff++;
 
4476
                }
 
4477
                if (xisr & XISR_RXXOFFGOT) {
 
4478
                        clear_bit(ASYI_TXFLOWED, &portp->istate);
 
4479
                        portp->stats.txxon++;
 
4480
                }
 
4481
                break;
 
4482
        case CIR_SUBBREAK:
 
4483
                stl_sc26198setreg(portp, SCCR, CR_BREAKRESET);
 
4484
                stl_sc26198rxbadchars(portp);
 
4485
                break;
 
4486
        default:
 
4487
                break;
 
4488
        }
 
4489
}
 
4490
 
 
4491
static void stl_free_isabrds(void)
 
4492
{
 
4493
        struct stlbrd *brdp;
 
4494
        unsigned int i;
 
4495
 
 
4496
        for (i = 0; i < stl_nrbrds; i++) {
 
4497
                if ((brdp = stl_brds[i]) == NULL || (brdp->state & STL_PROBED))
 
4498
                        continue;
 
4499
 
 
4500
                free_irq(brdp->irq, brdp);
 
4501
 
 
4502
                stl_cleanup_panels(brdp);
 
4503
 
 
4504
                release_region(brdp->ioaddr1, brdp->iosize1);
 
4505
                if (brdp->iosize2 > 0)
 
4506
                        release_region(brdp->ioaddr2, brdp->iosize2);
 
4507
 
 
4508
                kfree(brdp);
 
4509
                stl_brds[i] = NULL;
 
4510
        }
 
4511
}
 
4512
 
 
4513
/*
 
4514
 *      Loadable module initialization stuff.
 
4515
 */
 
4516
static int __init stallion_module_init(void)
 
4517
{
 
4518
        struct stlbrd   *brdp;
 
4519
        struct stlconf  conf;
 
4520
        unsigned int i, j;
 
4521
        int retval;
 
4522
 
 
4523
        printk(KERN_INFO "%s: version %s\n", stl_drvtitle, stl_drvversion);
 
4524
 
 
4525
        spin_lock_init(&stallion_lock);
 
4526
        spin_lock_init(&brd_lock);
 
4527
 
 
4528
        stl_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS);
 
4529
        if (!stl_serial) {
 
4530
                retval = -ENOMEM;
 
4531
                goto err;
 
4532
        }
 
4533
 
 
4534
        stl_serial->owner = THIS_MODULE;
 
4535
        stl_serial->driver_name = stl_drvname;
 
4536
        stl_serial->name = "ttyE";
 
4537
        stl_serial->major = STL_SERIALMAJOR;
 
4538
        stl_serial->minor_start = 0;
 
4539
        stl_serial->type = TTY_DRIVER_TYPE_SERIAL;
 
4540
        stl_serial->subtype = SERIAL_TYPE_NORMAL;
 
4541
        stl_serial->init_termios = stl_deftermios;
 
4542
        stl_serial->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
 
4543
        tty_set_operations(stl_serial, &stl_ops);
 
4544
 
 
4545
        retval = tty_register_driver(stl_serial);
 
4546
        if (retval) {
 
4547
                printk("STALLION: failed to register serial driver\n");
 
4548
                goto err_frtty;
 
4549
        }
 
4550
 
 
4551
/*
 
4552
 *      Find any dynamically supported boards. That is via module load
 
4553
 *      line options.
 
4554
 */
 
4555
        for (i = stl_nrbrds; i < stl_nargs; i++) {
 
4556
                memset(&conf, 0, sizeof(conf));
 
4557
                if (stl_parsebrd(&conf, stl_brdsp[i]) == 0)
 
4558
                        continue;
 
4559
                if ((brdp = stl_allocbrd()) == NULL)
 
4560
                        continue;
 
4561
                brdp->brdnr = i;
 
4562
                brdp->brdtype = conf.brdtype;
 
4563
                brdp->ioaddr1 = conf.ioaddr1;
 
4564
                brdp->ioaddr2 = conf.ioaddr2;
 
4565
                brdp->irq = conf.irq;
 
4566
                brdp->irqtype = conf.irqtype;
 
4567
                stl_brds[brdp->brdnr] = brdp;
 
4568
                if (stl_brdinit(brdp)) {
 
4569
                        stl_brds[brdp->brdnr] = NULL;
 
4570
                        kfree(brdp);
 
4571
                } else {
 
4572
                        for (j = 0; j < brdp->nrports; j++)
 
4573
                                tty_register_device(stl_serial,
 
4574
                                        brdp->brdnr * STL_MAXPORTS + j, NULL);
 
4575
                        stl_nrbrds = i + 1;
 
4576
                }
 
4577
        }
 
4578
 
 
4579
        /* this has to be _after_ isa finding because of locking */
 
4580
        retval = pci_register_driver(&stl_pcidriver);
 
4581
        if (retval && stl_nrbrds == 0) {
 
4582
                printk(KERN_ERR "STALLION: can't register pci driver\n");
 
4583
                goto err_unrtty;
 
4584
        }
 
4585
 
 
4586
/*
 
4587
 *      Set up a character driver for per board stuff. This is mainly used
 
4588
 *      to do stats ioctls on the ports.
 
4589
 */
 
4590
        if (register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stl_fsiomem))
 
4591
                printk("STALLION: failed to register serial board device\n");
 
4592
 
 
4593
        stallion_class = class_create(THIS_MODULE, "staliomem");
 
4594
        if (IS_ERR(stallion_class))
 
4595
                printk("STALLION: failed to create class\n");
 
4596
        for (i = 0; i < 4; i++)
 
4597
                device_create(stallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i),
 
4598
                              NULL, "staliomem%d", i);
 
4599
 
 
4600
        return 0;
 
4601
err_unrtty:
 
4602
        tty_unregister_driver(stl_serial);
 
4603
err_frtty:
 
4604
        put_tty_driver(stl_serial);
 
4605
err:
 
4606
        return retval;
 
4607
}
 
4608
 
 
4609
static void __exit stallion_module_exit(void)
 
4610
{
 
4611
        struct stlbrd *brdp;
 
4612
        unsigned int i, j;
 
4613
 
 
4614
        pr_debug("cleanup_module()\n");
 
4615
 
 
4616
        printk(KERN_INFO "Unloading %s: version %s\n", stl_drvtitle,
 
4617
                stl_drvversion);
 
4618
 
 
4619
/*
 
4620
 *      Free up all allocated resources used by the ports. This includes
 
4621
 *      memory and interrupts. As part of this process we will also do
 
4622
 *      a hangup on every open port - to try to flush out any processes
 
4623
 *      hanging onto ports.
 
4624
 */
 
4625
        for (i = 0; i < stl_nrbrds; i++) {
 
4626
                if ((brdp = stl_brds[i]) == NULL || (brdp->state & STL_PROBED))
 
4627
                        continue;
 
4628
                for (j = 0; j < brdp->nrports; j++)
 
4629
                        tty_unregister_device(stl_serial,
 
4630
                                brdp->brdnr * STL_MAXPORTS + j);
 
4631
        }
 
4632
 
 
4633
        for (i = 0; i < 4; i++)
 
4634
                device_destroy(stallion_class, MKDEV(STL_SIOMEMMAJOR, i));
 
4635
        unregister_chrdev(STL_SIOMEMMAJOR, "staliomem");
 
4636
        class_destroy(stallion_class);
 
4637
 
 
4638
        pci_unregister_driver(&stl_pcidriver);
 
4639
 
 
4640
        stl_free_isabrds();
 
4641
 
 
4642
        tty_unregister_driver(stl_serial);
 
4643
        put_tty_driver(stl_serial);
 
4644
}
 
4645
 
 
4646
module_init(stallion_module_init);
 
4647
module_exit(stallion_module_exit);
 
4648
 
 
4649
MODULE_AUTHOR("Greg Ungerer");
 
4650
MODULE_DESCRIPTION("Stallion Multiport Serial Driver");
 
4651
MODULE_LICENSE("GPL");