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