3 * (c) 1999 by Computone Corporation
5 ********************************************************************************
7 * PACKAGE: Linux tty Device Driver for IntelliPort family of multiport
8 * serial I/O controllers.
10 * DESCRIPTION: Mainline code for the device driver
12 *******************************************************************************/
15 // Fix the immediate DSS_NOW problem.
16 // Work over the channel stats return logic in ip2_ipl_ioctl so they
17 // make sense for all 256 possible channels and so the user space
18 // utilities will compile and work properly.
22 // 1.2.14 /\/\|=mhw=|\/\/
23 // Added bounds checking to ip2_ipl_ioctl to avoid potential terroristic acts.
24 // Changed the definition of ip2trace to be more consistent with kernel style
25 // Thanks to Andreas Dilger <adilger@turbolabs.com> for these updates
27 // 1.2.13 /\/\|=mhw=|\/\/
28 // DEVFS: Renamed ttf/{n} to tts/F{n} and cuf/{n} to cua/F{n} to conform
29 // to agreed devfs serial device naming convention.
31 // 1.2.12 /\/\|=mhw=|\/\/
32 // Cleaned up some remove queue cut and paste errors
34 // 1.2.11 /\/\|=mhw=|\/\/
35 // Clean up potential NULL pointer dereferences
36 // Clean up devfs registration
37 // Add kernel command line parsing for io and irq
38 // Compile defaults for io and irq are now set in ip2.c not ip2.h!
39 // Reworked poll_only hack for explicit parameter setting
40 // You must now EXPLICITLY set poll_only = 1 or set all irqs to 0
41 // Merged ip2_loadmain and old_ip2_init
42 // Converted all instances of interruptible_sleep_on into queue calls
43 // Most of these had no race conditions but better to clean up now
45 // 1.2.10 /\/\|=mhw=|\/\/
46 // Fixed the bottom half interrupt handler and enabled USE_IQI
47 // to split the interrupt handler into a formal top-half / bottom-half
48 // Fixed timing window on high speed processors that queued messages to
49 // the outbound mail fifo faster than the board could handle.
52 // Four box EX was barfing on >128k kmalloc, made structure smaller by
53 // reducing output buffer size
56 // Device file system support (MHW)
60 // Reload of ip2 without unloading ip2main hangs system on cat of /proc/modules
64 // DCD was not reported when CLOCAL was set on call to TIOCMGET
67 // TIOCMGET requests and waits for status return
68 // No DSS interrupts enabled except for DCD when needed
70 // For internal use only
72 //#define IP2DEBUG_INIT
73 //#define IP2DEBUG_OPEN
74 //#define IP2DEBUG_WRITE
75 //#define IP2DEBUG_READ
76 //#define IP2DEBUG_IOCTL
77 //#define IP2DEBUG_IPL
79 //#define IP2DEBUG_TRACE
86 #include <linux/ctype.h>
87 #include <linux/string.h>
88 #include <linux/fcntl.h>
89 #include <linux/errno.h>
90 #include <linux/module.h>
91 #include <linux/signal.h>
92 #include <linux/sched.h>
93 #include <linux/timer.h>
94 #include <linux/interrupt.h>
95 #include <linux/pci.h>
97 #include <linux/slab.h>
98 #include <linux/major.h>
99 #include <linux/wait.h>
100 #include <linux/device.h>
101 #include <linux/smp_lock.h>
102 #include <linux/firmware.h>
103 #include <linux/platform_device.h>
105 #include <linux/tty.h>
106 #include <linux/tty_flip.h>
107 #include <linux/termios.h>
108 #include <linux/tty_driver.h>
109 #include <linux/serial.h>
110 #include <linux/ptrace.h>
111 #include <linux/ioport.h>
113 #include <linux/cdk.h>
114 #include <linux/comstats.h>
115 #include <linux/delay.h>
116 #include <linux/bitops.h>
118 #include <asm/system.h>
122 #include <linux/vmalloc.h>
123 #include <linux/init.h>
125 #include <asm/uaccess.h>
127 #include "ip2types.h"
128 #include "ip2trace.h"
129 #include "ip2ioctl.h"
138 #include <linux/proc_fs.h>
139 #include <linux/seq_file.h>
141 static const struct file_operations ip2mem_proc_fops;
142 static const struct file_operations ip2_proc_fops;
144 /********************/
145 /* Type Definitions */
146 /********************/
152 /* String constants to identify ourselves */
153 static const char pcName[] = "Computone IntelliPort Plus multiport driver";
154 static const char pcVersion[] = "1.2.14";
156 /* String constants for port names */
157 static const char pcDriver_name[] = "ip2";
158 static const char pcIpl[] = "ip2ipl";
160 /***********************/
161 /* Function Prototypes */
162 /***********************/
164 /* Global module entry functions */
166 /* Private (static) functions */
167 static int ip2_open(PTTY, struct file *);
168 static void ip2_close(PTTY, struct file *);
169 static int ip2_write(PTTY, const unsigned char *, int);
170 static int ip2_putchar(PTTY, unsigned char);
171 static void ip2_flush_chars(PTTY);
172 static int ip2_write_room(PTTY);
173 static int ip2_chars_in_buf(PTTY);
174 static void ip2_flush_buffer(PTTY);
175 static int ip2_ioctl(PTTY, struct file *, UINT, ULONG);
176 static void ip2_set_termios(PTTY, struct ktermios *);
177 static void ip2_set_line_discipline(PTTY);
178 static void ip2_throttle(PTTY);
179 static void ip2_unthrottle(PTTY);
180 static void ip2_stop(PTTY);
181 static void ip2_start(PTTY);
182 static void ip2_hangup(PTTY);
183 static int ip2_tiocmget(struct tty_struct *tty, struct file *file);
184 static int ip2_tiocmset(struct tty_struct *tty, struct file *file,
185 unsigned int set, unsigned int clear);
187 static void set_irq(int, int);
188 static void ip2_interrupt_bh(struct work_struct *work);
189 static irqreturn_t ip2_interrupt(int irq, void *dev_id);
190 static void ip2_poll(unsigned long arg);
191 static inline void service_all_boards(void);
192 static void do_input(struct work_struct *);
193 static void do_status(struct work_struct *);
195 static void ip2_wait_until_sent(PTTY,int);
197 static void set_params (i2ChanStrPtr, struct ktermios *);
198 static int get_serial_info(i2ChanStrPtr, struct serial_struct __user *);
199 static int set_serial_info(i2ChanStrPtr, struct serial_struct __user *);
201 static ssize_t ip2_ipl_read(struct file *, char __user *, size_t, loff_t *);
202 static ssize_t ip2_ipl_write(struct file *, const char __user *, size_t, loff_t *);
203 static long ip2_ipl_ioctl(struct file *, UINT, ULONG);
204 static int ip2_ipl_open(struct inode *, struct file *);
206 static int DumpTraceBuffer(char __user *, int);
207 static int DumpFifoBuffer( char __user *, int);
209 static void ip2_init_board(int, const struct firmware *);
210 static unsigned short find_eisa_board(int);
211 static int ip2_setup(char *str);
217 static struct tty_driver *ip2_tty_driver;
219 /* Here, then is a table of board pointers which the interrupt routine should
220 * scan through to determine who it must service.
222 static unsigned short i2nBoards; // Number of boards here
224 static i2eBordStrPtr i2BoardPtrTable[IP2_MAX_BOARDS];
226 static i2ChanStrPtr DevTable[IP2_MAX_PORTS];
227 //DevTableMem just used to save addresses for kfree
228 static void *DevTableMem[IP2_MAX_BOARDS];
230 /* This is the driver descriptor for the ip2ipl device, which is used to
231 * download the loadware to the boards.
233 static const struct file_operations ip2_ipl = {
234 .owner = THIS_MODULE,
235 .read = ip2_ipl_read,
236 .write = ip2_ipl_write,
237 .unlocked_ioctl = ip2_ipl_ioctl,
238 .open = ip2_ipl_open,
239 .llseek = noop_llseek,
242 static unsigned long irq_counter;
243 static unsigned long bh_counter;
245 // Use immediate queue to service interrupts
247 //#define USE_IQ // PCI&2.2 needs work
249 /* The timer_list entry for our poll routine. If interrupt operation is not
250 * selected, the board is serviced periodically to see if anything needs doing.
252 #define POLL_TIMEOUT (jiffies + 1)
253 static DEFINE_TIMER(PollTimer, ip2_poll, 0, 0);
255 #ifdef IP2DEBUG_TRACE
256 /* Trace (debug) buffer data */
257 #define TRACEMAX 1000
258 static unsigned long tracebuf[TRACEMAX];
259 static int tracestuff;
260 static int tracestrip;
261 static int tracewrap;
269 #define DBG_CNT(s) printk(KERN_DEBUG "(%s): [%x] ttyc=%d, modc=%x -> %s\n", \
270 tty->name,(pCh->flags), \
271 tty->count,/*GET_USE_COUNT(module)*/0,s)
280 #include "i2ellis.c" /* Extremely low-level interface services */
281 #include "i2cmd.c" /* Standard loadware command definitions */
282 #include "i2lib.c" /* High level interface services */
284 /* Configuration area for modprobe */
286 MODULE_AUTHOR("Doug McNash");
287 MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
288 MODULE_LICENSE("GPL");
290 #define MAX_CMD_STR 50
292 static int poll_only;
293 static char cmd[MAX_CMD_STR];
296 static int Eisa_slot;
299 static char rirqs[IP2_MAX_BOARDS];
300 static int Valid_Irqs[] = { 3, 4, 5, 7, 10, 11, 12, 15, 0};
302 /* Note: Add compiled in defaults to these arrays, not to the structure
303 in ip2.h any longer. That structure WILL get overridden
304 by these values, or command line values, or insmod values!!! =mhw=
306 static int io[IP2_MAX_BOARDS];
307 static int irq[IP2_MAX_BOARDS] = { -1, -1, -1, -1 };
309 MODULE_AUTHOR("Doug McNash");
310 MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
311 module_param_array(irq, int, NULL, 0);
312 MODULE_PARM_DESC(irq, "Interrupts for IntelliPort Cards");
313 module_param_array(io, int, NULL, 0);
314 MODULE_PARM_DESC(io, "I/O ports for IntelliPort Cards");
315 module_param(poll_only, bool, 0);
316 MODULE_PARM_DESC(poll_only, "Do not use card interrupts");
317 module_param_string(ip2, cmd, MAX_CMD_STR, 0);
318 MODULE_PARM_DESC(ip2, "Contains module parameter passed with 'ip2='");
320 /* for sysfs class support */
321 static struct class *ip2_class;
323 /* Some functions to keep track of what irqs we have */
325 static int __init is_valid_irq(int irq)
329 while (*i != 0 && *i != irq)
335 static void __init mark_requested_irq(char irq)
337 rirqs[iindx++] = irq;
340 static int __exit clear_requested_irq(char irq)
343 for (i = 0; i < IP2_MAX_BOARDS; ++i) {
344 if (rirqs[i] == irq) {
352 static int have_requested_irq(char irq)
354 /* array init to zeros so 0 irq will not be requested as a side
357 for (i = 0; i < IP2_MAX_BOARDS; ++i)
363 /******************************************************************************/
364 /* Function: cleanup_module() */
365 /* Parameters: None */
366 /* Returns: Nothing */
369 /* This is a required entry point for an installable module. It has to return */
370 /* the device and the driver to a passive state. It should not be necessary */
371 /* to reset the board fully, especially as the loadware is downloaded */
372 /* externally rather than in the driver. We just want to disable the board */
373 /* and clear the loadware to a reset state. To allow this there has to be a */
374 /* way to detect whether the board has the loadware running at init time to */
375 /* handle subsequent installations of the driver. All memory allocated by the */
376 /* driver should be returned since it may be unloaded from memory. */
377 /******************************************************************************/
378 static void __exit ip2_cleanup_module(void)
383 del_timer_sync(&PollTimer);
385 /* Reset the boards we have. */
386 for (i = 0; i < IP2_MAX_BOARDS; i++)
387 if (i2BoardPtrTable[i])
388 iiReset(i2BoardPtrTable[i]);
390 /* The following is done at most once, if any boards were installed. */
391 for (i = 0; i < IP2_MAX_BOARDS; i++) {
392 if (i2BoardPtrTable[i]) {
393 iiResetDelay(i2BoardPtrTable[i]);
394 /* free io addresses and Tibet */
395 release_region(ip2config.addr[i], 8);
396 device_destroy(ip2_class, MKDEV(IP2_IPL_MAJOR, 4 * i));
397 device_destroy(ip2_class, MKDEV(IP2_IPL_MAJOR,
400 /* Disable and remove interrupt handler. */
401 if (ip2config.irq[i] > 0 &&
402 have_requested_irq(ip2config.irq[i])) {
403 free_irq(ip2config.irq[i], (void *)&pcName);
404 clear_requested_irq(ip2config.irq[i]);
407 class_destroy(ip2_class);
408 err = tty_unregister_driver(ip2_tty_driver);
410 printk(KERN_ERR "IP2: failed to unregister tty driver (%d)\n",
412 put_tty_driver(ip2_tty_driver);
413 unregister_chrdev(IP2_IPL_MAJOR, pcIpl);
414 remove_proc_entry("ip2mem", NULL);
417 for (i = 0; i < IP2_MAX_BOARDS; i++) {
420 if (ip2config.type[i] == PCI && ip2config.pci_dev[i]) {
421 pci_disable_device(ip2config.pci_dev[i]);
422 pci_dev_put(ip2config.pci_dev[i]);
423 ip2config.pci_dev[i] = NULL;
426 pB = i2BoardPtrTable[i];
429 i2BoardPtrTable[i] = NULL;
431 if (DevTableMem[i] != NULL) {
432 kfree(DevTableMem[i]);
433 DevTableMem[i] = NULL;
437 module_exit(ip2_cleanup_module);
439 static const struct tty_operations ip2_ops = {
443 .put_char = ip2_putchar,
444 .flush_chars = ip2_flush_chars,
445 .write_room = ip2_write_room,
446 .chars_in_buffer = ip2_chars_in_buf,
447 .flush_buffer = ip2_flush_buffer,
449 .throttle = ip2_throttle,
450 .unthrottle = ip2_unthrottle,
451 .set_termios = ip2_set_termios,
452 .set_ldisc = ip2_set_line_discipline,
455 .hangup = ip2_hangup,
456 .tiocmget = ip2_tiocmget,
457 .tiocmset = ip2_tiocmset,
458 .proc_fops = &ip2_proc_fops,
461 /******************************************************************************/
462 /* Function: ip2_loadmain() */
463 /* Parameters: irq, io from command line of insmod et. al. */
464 /* pointer to fip firmware and firmware size for boards */
465 /* Returns: Success (0) */
468 /* This was the required entry point for all drivers (now in ip2.c) */
469 /* It performs all */
470 /* initialisation of the devices and driver structures, and registers itself */
471 /* with the relevant kernel modules. */
472 /******************************************************************************/
473 /* IRQF_DISABLED - if set blocks all interrupts else only this line */
474 /* IRQF_SHARED - for shared irq PCI or maybe EISA only */
475 /* SA_RANDOM - can be source for cert. random number generators */
476 #define IP2_SA_FLAGS 0
479 static const struct firmware *ip2_request_firmware(void)
481 struct platform_device *pdev;
482 const struct firmware *fw;
484 pdev = platform_device_register_simple("ip2", 0, NULL, 0);
486 printk(KERN_ERR "Failed to register platform device for ip2\n");
489 if (request_firmware(&fw, "intelliport2.bin", &pdev->dev)) {
490 printk(KERN_ERR "Failed to load firmware 'intelliport2.bin'\n");
493 platform_device_unregister(pdev);
497 /******************************************************************************
499 * str: kernel command line string
501 * Can't autoprobe the boards so user must specify configuration on
502 * kernel command line. Sane people build it modular but the others
505 * Alternating pairs of io,irq for up to 4 boards.
506 * ip2=io0,irq0,io1,irq1,io2,irq2,io3,irq3
511 * else => ISA I/O address
513 * irq=0 or invalid for ISA will revert to polling mode
515 * Any value = -1, do not overwrite compiled in value.
517 ******************************************************************************/
518 static int __init ip2_setup(char *str)
520 int j, ints[10]; /* 4 boards, 2 parameters + 2 */
523 str = get_options(str, ARRAY_SIZE(ints), ints);
525 for (i = 0, j = 1; i < 4; i++) {
539 __setup("ip2=", ip2_setup);
541 static int __init ip2_loadmain(void)
545 i2eBordStrPtr pB = NULL;
547 const struct firmware *fw = NULL;
553 /* Hard lock the interrupts to zero */
554 irq[0] = irq[1] = irq[2] = irq[3] = poll_only = 0;
557 /* Check module parameter with 'ip2=' has been passed or not */
558 if (!poll_only && (!strncmp(str, "ip2=", 4)))
561 ip2trace(ITRC_NO_PORT, ITRC_INIT, ITRC_ENTER, 0);
563 /* process command line arguments to modprobe or
564 insmod i.e. iop & irqp */
565 /* irqp and iop should ALWAYS be specified now... But we check
566 them individually just to be sure, anyways... */
567 for (i = 0; i < IP2_MAX_BOARDS; ++i) {
568 ip2config.addr[i] = io[i];
570 ip2config.irq[i] = irq[i];
572 ip2config.irq[i] = 0;
573 /* This is a little bit of a hack. If poll_only=1 on command
574 line back in ip2.c OR all IRQs on all specified boards are
575 explicitly set to 0, then drop to poll only mode and override
576 PCI or EISA interrupts. This superceeds the old hack of
577 triggering if all interrupts were zero (like da default).
578 Still a hack but less prone to random acts of terrorism.
580 What we really should do, now that the IRQ default is set
581 to -1, is to use 0 as a hard coded, do not probe.
587 poll_only = !poll_only;
589 /* Announce our presence */
590 printk(KERN_INFO "%s version %s\n", pcName, pcVersion);
592 ip2_tty_driver = alloc_tty_driver(IP2_MAX_PORTS);
596 /* Initialise all the boards we can find (up to the maximum). */
597 for (i = 0; i < IP2_MAX_BOARDS; ++i) {
598 switch (ip2config.addr[i]) {
599 case 0: /* skip this slot even if card is present */
602 /* ISA address must be specified */
603 if (ip2config.addr[i] < 0x100 ||
604 ip2config.addr[i] > 0x3f8) {
605 printk(KERN_ERR "IP2: Bad ISA board %d "
608 ip2config.addr[i] = 0;
611 ip2config.type[i] = ISA;
613 /* Check for valid irq argument, set for polling if
615 if (ip2config.irq[i] &&
616 !is_valid_irq(ip2config.irq[i])) {
617 printk(KERN_ERR "IP2: Bad IRQ(%d) specified\n",
619 /* 0 is polling and is valid in that sense */
620 ip2config.irq[i] = 0;
626 struct pci_dev *pdev = NULL;
630 pdev = pci_get_device(PCI_VENDOR_ID_COMPUTONE,
631 PCI_DEVICE_ID_COMPUTONE_IP2EX, pdev);
633 ip2config.addr[i] = 0;
634 printk(KERN_ERR "IP2: PCI board %d not "
639 if (pci_enable_device(pdev)) {
640 dev_err(&pdev->dev, "can't enable device\n");
643 ip2config.type[i] = PCI;
644 ip2config.pci_dev[i] = pci_dev_get(pdev);
645 status = pci_read_config_dword(pdev, PCI_BASE_ADDRESS_1,
648 ip2config.addr[i] = (USHORT)(addr & 0xfffe);
650 dev_err(&pdev->dev, "I/O address error\n");
652 ip2config.irq[i] = pdev->irq;
657 printk(KERN_ERR "IP2: PCI card specified but PCI "
658 "support not enabled.\n");
659 printk(KERN_ERR "IP2: Recompile kernel with CONFIG_PCI "
661 #endif /* CONFIG_PCI */
664 ip2config.addr[i] = find_eisa_board(Eisa_slot + 1);
665 if (ip2config.addr[i] != 0) {
666 /* Eisa_irq set as side effect, boo */
667 ip2config.type[i] = EISA;
669 ip2config.irq[i] = Eisa_irq;
674 for (i = 0; i < IP2_MAX_BOARDS; ++i) {
675 if (ip2config.addr[i]) {
676 pB = kzalloc(sizeof(i2eBordStr), GFP_KERNEL);
678 i2BoardPtrTable[i] = pB;
679 iiSetAddress(pB, ip2config.addr[i],
683 printk(KERN_ERR "IP2: board memory allocation "
687 for (i = 0; i < IP2_MAX_BOARDS; ++i) {
688 pB = i2BoardPtrTable[i];
694 for (i = 0; i < IP2_MAX_BOARDS; ++i) {
695 /* We don't want to request the firmware unless we have at
697 if (i2BoardPtrTable[i] != NULL) {
699 fw = ip2_request_firmware();
702 ip2_init_board(i, fw);
706 release_firmware(fw);
708 ip2trace(ITRC_NO_PORT, ITRC_INIT, 2, 0);
710 ip2_tty_driver->owner = THIS_MODULE;
711 ip2_tty_driver->name = "ttyF";
712 ip2_tty_driver->driver_name = pcDriver_name;
713 ip2_tty_driver->major = IP2_TTY_MAJOR;
714 ip2_tty_driver->minor_start = 0;
715 ip2_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
716 ip2_tty_driver->subtype = SERIAL_TYPE_NORMAL;
717 ip2_tty_driver->init_termios = tty_std_termios;
718 ip2_tty_driver->init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL;
719 ip2_tty_driver->flags = TTY_DRIVER_REAL_RAW |
720 TTY_DRIVER_DYNAMIC_DEV;
721 tty_set_operations(ip2_tty_driver, &ip2_ops);
723 ip2trace(ITRC_NO_PORT, ITRC_INIT, 3, 0);
725 err = tty_register_driver(ip2_tty_driver);
727 printk(KERN_ERR "IP2: failed to register tty driver\n");
728 put_tty_driver(ip2_tty_driver);
729 return err; /* leaking resources */
732 err = register_chrdev(IP2_IPL_MAJOR, pcIpl, &ip2_ipl);
734 printk(KERN_ERR "IP2: failed to register IPL device (%d)\n",
737 /* create the sysfs class */
738 ip2_class = class_create(THIS_MODULE, "ip2");
739 if (IS_ERR(ip2_class)) {
740 err = PTR_ERR(ip2_class);
744 /* Register the read_procmem thing */
745 if (!proc_create("ip2mem",0,NULL,&ip2mem_proc_fops)) {
746 printk(KERN_ERR "IP2: failed to register read_procmem\n");
747 return -EIO; /* leaking resources */
750 ip2trace(ITRC_NO_PORT, ITRC_INIT, 4, 0);
751 /* Register the interrupt handler or poll handler, depending upon the
752 * specified interrupt.
755 for (i = 0; i < IP2_MAX_BOARDS; ++i) {
756 if (ip2config.addr[i] == 0)
759 pB = i2BoardPtrTable[i];
761 device_create(ip2_class, NULL,
762 MKDEV(IP2_IPL_MAJOR, 4 * i),
764 device_create(ip2_class, NULL,
765 MKDEV(IP2_IPL_MAJOR, 4 * i + 1),
768 for (box = 0; box < ABS_MAX_BOXES; box++)
769 for (j = 0; j < ABS_BIGGEST_BOX; j++)
770 if (pB->i2eChannelMap[box] & (1 << j))
773 j + ABS_BIGGEST_BOX *
774 (box+i*ABS_MAX_BOXES),
779 /* Poll only forces driver to only use polling and
780 to ignore the probed PCI or EISA interrupts. */
781 ip2config.irq[i] = CIR_POLL;
783 if (ip2config.irq[i] == CIR_POLL) {
785 if (!timer_pending(&PollTimer)) {
786 mod_timer(&PollTimer, POLL_TIMEOUT);
787 printk(KERN_INFO "IP2: polling\n");
790 if (have_requested_irq(ip2config.irq[i]))
792 rc = request_irq(ip2config.irq[i], ip2_interrupt,
794 (ip2config.type[i] == PCI ? IRQF_SHARED : 0),
795 pcName, i2BoardPtrTable[i]);
797 printk(KERN_ERR "IP2: request_irq failed: "
799 ip2config.irq[i] = CIR_POLL;
800 printk(KERN_INFO "IP2: Polling %ld/sec.\n",
801 (POLL_TIMEOUT - jiffies));
804 mark_requested_irq(ip2config.irq[i]);
805 /* Initialise the interrupt handler bottom half
810 for (i = 0; i < IP2_MAX_BOARDS; ++i) {
811 if (i2BoardPtrTable[i]) {
812 /* set and enable board interrupt */
813 set_irq(i, ip2config.irq[i]);
817 ip2trace(ITRC_NO_PORT, ITRC_INIT, ITRC_RETURN, 0);
822 unregister_chrdev(IP2_IPL_MAJOR, "ip2");
823 /* unregister and put tty here */
826 module_init(ip2_loadmain);
828 /******************************************************************************/
829 /* Function: ip2_init_board() */
830 /* Parameters: Index of board in configuration structure */
831 /* Returns: Success (0) */
834 /* This function initializes the specified board. The loadware is copied to */
835 /* the board, the channel structures are initialized, and the board details */
836 /* are reported on the console. */
837 /******************************************************************************/
839 ip2_init_board(int boardnum, const struct firmware *fw)
842 int nports = 0, nboxes = 0;
844 i2eBordStrPtr pB = i2BoardPtrTable[boardnum];
846 if ( !iiInitialize ( pB ) ) {
847 printk ( KERN_ERR "IP2: Failed to initialize board at 0x%x, error %d\n",
848 pB->i2eBase, pB->i2eError );
851 printk(KERN_INFO "IP2: Board %d: addr=0x%x irq=%d\n", boardnum + 1,
852 ip2config.addr[boardnum], ip2config.irq[boardnum] );
854 if (!request_region( ip2config.addr[boardnum], 8, pcName )) {
855 printk(KERN_ERR "IP2: bad addr=0x%x\n", ip2config.addr[boardnum]);
859 if ( iiDownloadAll ( pB, (loadHdrStrPtr)fw->data, 1, fw->size )
861 printk ( KERN_ERR "IP2: failed to download loadware\n" );
862 goto err_release_region;
864 printk ( KERN_INFO "IP2: fv=%d.%d.%d lv=%d.%d.%d\n",
865 pB->i2ePom.e.porVersion,
866 pB->i2ePom.e.porRevision,
867 pB->i2ePom.e.porSubRev, pB->i2eLVersion,
868 pB->i2eLRevision, pB->i2eLSub );
871 switch ( pB->i2ePom.e.porID & ~POR_ID_RESERVED ) {
874 printk( KERN_ERR "IP2: Unknown board type, ID = %x\n",
875 pB->i2ePom.e.porID );
877 goto err_release_region;
880 case POR_ID_II_4: /* IntelliPort-II, ISA-4 (4xRJ45) */
881 printk ( KERN_INFO "IP2: ISA-4\n" );
885 case POR_ID_II_8: /* IntelliPort-II, 8-port using standard brick. */
886 printk ( KERN_INFO "IP2: ISA-8 std\n" );
890 case POR_ID_II_8R: /* IntelliPort-II, 8-port using RJ11's (no CTS) */
891 printk ( KERN_INFO "IP2: ISA-8 RJ11\n" );
895 case POR_ID_FIIEX: /* IntelliPort IIEX */
897 int portnum = IP2_PORTS_PER_BOARD * boardnum;
900 for( box = 0; box < ABS_MAX_BOXES; ++box ) {
901 if ( pB->i2eChannelMap[box] != 0 ) {
904 for( i = 0; i < ABS_BIGGEST_BOX; ++i ) {
905 if ( pB->i2eChannelMap[box] & 1<< i ) {
910 DevTableMem[boardnum] = pCh =
911 kmalloc( sizeof(i2ChanStr) * nports, GFP_KERNEL );
913 printk ( KERN_ERR "IP2: (i2_init_channel:) Out of memory.\n");
914 goto err_release_region;
916 if ( !i2InitChannels( pB, nports, pCh ) ) {
917 printk(KERN_ERR "IP2: i2InitChannels failed: %d\n",pB->i2eError);
919 goto err_release_region;
921 pB->i2eChannelPtr = &DevTable[portnum];
922 pB->i2eChannelCnt = ABS_MOST_PORTS;
924 for( box = 0; box < ABS_MAX_BOXES; ++box, portnum += ABS_BIGGEST_BOX ) {
925 for( i = 0; i < ABS_BIGGEST_BOX; ++i ) {
926 if ( pB->i2eChannelMap[box] & (1 << i) ) {
927 DevTable[portnum + i] = pCh;
928 pCh->port_index = portnum + i;
933 printk(KERN_INFO "IP2: EX box=%d ports=%d %d bit\n",
934 nboxes, nports, pB->i2eDataWidth16 ? 16 : 8 );
938 DevTableMem[boardnum] = pCh =
939 kmalloc ( sizeof (i2ChanStr) * nports, GFP_KERNEL );
941 printk ( KERN_ERR "IP2: (i2_init_channel:) Out of memory.\n");
942 goto err_release_region;
944 pB->i2eChannelPtr = pCh;
945 pB->i2eChannelCnt = nports;
946 if ( !i2InitChannels( pB, nports, pCh ) ) {
947 printk(KERN_ERR "IP2: i2InitChannels failed: %d\n",pB->i2eError);
949 goto err_release_region;
951 pB->i2eChannelPtr = &DevTable[IP2_PORTS_PER_BOARD * boardnum];
953 for( i = 0; i < pB->i2eChannelCnt; ++i ) {
954 DevTable[IP2_PORTS_PER_BOARD * boardnum + i] = pCh;
955 pCh->port_index = (IP2_PORTS_PER_BOARD * boardnum) + i;
959 INIT_WORK(&pB->tqueue_interrupt, ip2_interrupt_bh);
963 release_region(ip2config.addr[boardnum], 8);
966 i2BoardPtrTable[boardnum] = NULL;
970 /******************************************************************************/
971 /* Function: find_eisa_board ( int start_slot ) */
972 /* Parameters: First slot to check */
973 /* Returns: Address of EISA IntelliPort II controller */
976 /* This function searches for an EISA IntelliPort controller, starting */
977 /* from the specified slot number. If the motherboard is not identified as an */
978 /* EISA motherboard, or no valid board ID is selected it returns 0. Otherwise */
979 /* it returns the base address of the controller. */
980 /******************************************************************************/
981 static unsigned short
982 find_eisa_board( int start_slot )
985 unsigned int idm = 0;
986 unsigned int idp = 0;
987 unsigned int base = 0;
994 * First a check for an EISA motherboard, which we do by comparing the
995 * EISA ID registers for the system board and the first couple of slots.
996 * No slot ID should match the system board ID, but on an ISA or PCI
997 * machine the odds are that an empty bus will return similar values for
1001 value = (inb(i) << 24) + (inb(i+1) << 16) + (inb(i+2) << 8) + inb(i+3);
1002 for( i = 0x1c80; i <= 0x4c80; i += 0x1000 ) {
1003 j = (inb(i)<<24)+(inb(i+1)<<16)+(inb(i+2)<<8)+inb(i+3);
1009 * OK, so we are inclined to believe that this is an EISA machine. Find
1010 * an IntelliPort controller.
1012 for( i = start_slot; i < 16; i++ ) {
1014 idm = (inb(base + 0xc80) << 8) | (inb(base + 0xc81) & 0xff);
1015 idp = (inb(base + 0xc82) << 8) | (inb(base + 0xc83) & 0xff);
1017 if ( idm == 0x0e8e ) {
1018 if ( idp == 0x0281 || idp == 0x0218 ) {
1020 } else if ( idp == 0x0282 || idp == 0x0283 ) {
1021 ismine = 3; /* Can do edge-trigger */
1032 /* It's some sort of EISA card, but at what address is it configured? */
1034 setup_address = base + 0xc88;
1035 value = inb(base + 0xc86);
1036 setup_irq = (value & 8) ? Valid_Irqs[value & 7] : 0;
1038 if ( (ismine & 2) && !(value & 0x10) ) {
1039 ismine = 1; /* Could be edging, but not */
1042 if ( Eisa_irq == 0 ) {
1043 Eisa_irq = setup_irq;
1044 } else if ( Eisa_irq != setup_irq ) {
1045 printk ( KERN_ERR "IP2: EISA irq mismatch between EISA controllers\n" );
1048 #ifdef IP2DEBUG_INIT
1049 printk(KERN_DEBUG "Computone EISA board in slot %d, I.D. 0x%x%x, Address 0x%x",
1050 base >> 12, idm, idp, setup_address);
1052 printk(KERN_DEBUG ", Interrupt %d %s\n",
1053 setup_irq, (ismine & 2) ? "(edge)" : "(level)");
1055 printk(KERN_DEBUG ", (polled)\n");
1058 return setup_address;
1061 /******************************************************************************/
1062 /* Function: set_irq() */
1063 /* Parameters: index to board in board table */
1065 /* Returns: Success (0) */
1068 /******************************************************************************/
1070 set_irq( int boardnum, int boardIrq )
1072 unsigned char tempCommand[16];
1073 i2eBordStrPtr pB = i2BoardPtrTable[boardnum];
1074 unsigned long flags;
1077 * Notify the boards they may generate interrupts. This is done by
1078 * sending an in-line command to channel 0 on each board. This is why
1079 * the channels have to be defined already. For each board, if the
1080 * interrupt has never been defined, we must do so NOW, directly, since
1081 * board will not send flow control or even give an interrupt until this
1082 * is done. If polling we must send 0 as the interrupt parameter.
1085 // We will get an interrupt here at the end of this function
1087 iiDisableMailIrq(pB);
1089 /* We build up the entire packet header. */
1090 CHANNEL_OF(tempCommand) = 0;
1091 PTYPE_OF(tempCommand) = PTYPE_INLINE;
1092 CMD_COUNT_OF(tempCommand) = 2;
1093 (CMD_OF(tempCommand))[0] = CMDVALUE_IRQ;
1094 (CMD_OF(tempCommand))[1] = boardIrq;
1096 * Write to FIFO; don't bother to adjust fifo capacity for this, since
1097 * board will respond almost immediately after SendMail hit.
1099 write_lock_irqsave(&pB->write_fifo_spinlock, flags);
1100 iiWriteBuf(pB, tempCommand, 4);
1101 write_unlock_irqrestore(&pB->write_fifo_spinlock, flags);
1102 pB->i2eUsingIrq = boardIrq;
1103 pB->i2eOutMailWaiting |= MB_OUT_STUFFED;
1105 /* Need to update number of boards before you enable mailbox int */
1108 CHANNEL_OF(tempCommand) = 0;
1109 PTYPE_OF(tempCommand) = PTYPE_BYPASS;
1110 CMD_COUNT_OF(tempCommand) = 6;
1111 (CMD_OF(tempCommand))[0] = 88; // SILO
1112 (CMD_OF(tempCommand))[1] = 64; // chars
1113 (CMD_OF(tempCommand))[2] = 32; // ms
1115 (CMD_OF(tempCommand))[3] = 28; // MAX_BLOCK
1116 (CMD_OF(tempCommand))[4] = 64; // chars
1118 (CMD_OF(tempCommand))[5] = 87; // HW_TEST
1119 write_lock_irqsave(&pB->write_fifo_spinlock, flags);
1120 iiWriteBuf(pB, tempCommand, 8);
1121 write_unlock_irqrestore(&pB->write_fifo_spinlock, flags);
1123 CHANNEL_OF(tempCommand) = 0;
1124 PTYPE_OF(tempCommand) = PTYPE_BYPASS;
1125 CMD_COUNT_OF(tempCommand) = 1;
1126 (CMD_OF(tempCommand))[0] = 84; /* get BOX_IDS */
1127 iiWriteBuf(pB, tempCommand, 3);
1130 // enable heartbeat for test porpoises
1131 CHANNEL_OF(tempCommand) = 0;
1132 PTYPE_OF(tempCommand) = PTYPE_BYPASS;
1133 CMD_COUNT_OF(tempCommand) = 2;
1134 (CMD_OF(tempCommand))[0] = 44; /* get ping */
1135 (CMD_OF(tempCommand))[1] = 200; /* 200 ms */
1136 write_lock_irqsave(&pB->write_fifo_spinlock, flags);
1137 iiWriteBuf(pB, tempCommand, 4);
1138 write_unlock_irqrestore(&pB->write_fifo_spinlock, flags);
1141 iiEnableMailIrq(pB);
1142 iiSendPendingMail(pB);
1145 /******************************************************************************/
1146 /* Interrupt Handler Section */
1147 /******************************************************************************/
1150 service_all_boards(void)
1155 /* Service every board on the list */
1156 for( i = 0; i < IP2_MAX_BOARDS; ++i ) {
1157 pB = i2BoardPtrTable[i];
1159 i2ServiceBoard( pB );
1165 /******************************************************************************/
1166 /* Function: ip2_interrupt_bh(work) */
1167 /* Parameters: work - pointer to the board structure */
1168 /* Returns: Nothing */
1171 /* Service the board in a bottom half interrupt handler and then */
1172 /* reenable the board's interrupts if it has an IRQ number */
1174 /******************************************************************************/
1176 ip2_interrupt_bh(struct work_struct *work)
1178 i2eBordStrPtr pB = container_of(work, i2eBordStr, tqueue_interrupt);
1179 // pB better well be set or we have a problem! We can only get
1180 // here from the IMMEDIATE queue. Here, we process the boards.
1181 // Checking pB doesn't cost much and it saves us from the sanity checkers.
1186 i2ServiceBoard( pB );
1187 if( pB->i2eUsingIrq ) {
1188 // Re-enable his interrupts
1189 iiEnableMailIrq(pB);
1195 /******************************************************************************/
1196 /* Function: ip2_interrupt(int irq, void *dev_id) */
1197 /* Parameters: irq - interrupt number */
1198 /* pointer to optional device ID structure */
1199 /* Returns: Nothing */
1203 /* Our task here is simply to identify each board which needs servicing. */
1204 /* If we are queuing then, queue it to be serviced, and disable its irq */
1205 /* mask otherwise process the board directly. */
1207 /* We could queue by IRQ but that just complicates things on both ends */
1208 /* with very little gain in performance (how many instructions does */
1209 /* it take to iterate on the immediate queue). */
1212 /******************************************************************************/
1214 ip2_irq_work(i2eBordStrPtr pB)
1217 if (NO_MAIL_HERE != ( pB->i2eStartMail = iiGetMail(pB))) {
1218 // Disable his interrupt (will be enabled when serviced)
1219 // This is mostly to protect from reentrancy.
1220 iiDisableMailIrq(pB);
1222 // Park the board on the immediate queue for processing.
1223 schedule_work(&pB->tqueue_interrupt);
1225 // Make sure the immediate queue is flagged to fire.
1229 // We are using immediate servicing here. This sucks and can
1230 // cause all sorts of havoc with ppp and others. The failsafe
1231 // check on iiSendPendingMail could also throw a hairball.
1233 i2ServiceBoard( pB );
1235 #endif /* USE_IQI */
1239 ip2_polled_interrupt(void)
1244 ip2trace(ITRC_NO_PORT, ITRC_INTR, 99, 1, 0);
1246 /* Service just the boards on the list using this irq */
1247 for( i = 0; i < i2nBoards; ++i ) {
1248 pB = i2BoardPtrTable[i];
1250 // Only process those boards which match our IRQ.
1251 // IRQ = 0 for polled boards, we won't poll "IRQ" boards
1253 if (pB && pB->i2eUsingIrq == 0)
1259 ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 );
1263 ip2_interrupt(int irq, void *dev_id)
1265 i2eBordStrPtr pB = dev_id;
1267 ip2trace (ITRC_NO_PORT, ITRC_INTR, 99, 1, pB->i2eUsingIrq );
1273 ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 );
1277 /******************************************************************************/
1278 /* Function: ip2_poll(unsigned long arg) */
1280 /* Returns: Nothing */
1283 /* This function calls the library routine i2ServiceBoard for each board in */
1284 /* the board table. This is used instead of the interrupt routine when polled */
1285 /* mode is specified. */
1286 /******************************************************************************/
1288 ip2_poll(unsigned long arg)
1290 ip2trace (ITRC_NO_PORT, ITRC_INTR, 100, 0 );
1292 // Just polled boards, IRQ = 0 will hit all non-interrupt boards.
1293 // It will NOT poll boards handled by hard interrupts.
1294 // The issue of queued BH interrupts is handled in ip2_interrupt().
1295 ip2_polled_interrupt();
1297 mod_timer(&PollTimer, POLL_TIMEOUT);
1299 ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 );
1302 static void do_input(struct work_struct *work)
1304 i2ChanStrPtr pCh = container_of(work, i2ChanStr, tqueue_input);
1305 unsigned long flags;
1307 ip2trace(CHANN, ITRC_INPUT, 21, 0 );
1310 if ( pCh->pTTY != NULL ) {
1311 read_lock_irqsave(&pCh->Ibuf_spinlock, flags);
1312 if (!pCh->throttled && (pCh->Ibuf_stuff != pCh->Ibuf_strip)) {
1313 read_unlock_irqrestore(&pCh->Ibuf_spinlock, flags);
1316 read_unlock_irqrestore(&pCh->Ibuf_spinlock, flags);
1318 ip2trace(CHANN, ITRC_INPUT, 22, 0 );
1320 i2InputFlush( pCh );
1324 // code duplicated from n_tty (ldisc)
1325 static inline void isig(int sig, struct tty_struct *tty, int flush)
1327 /* FIXME: This is completely bogus */
1329 kill_pgrp(tty->pgrp, sig, 1);
1330 if (flush || !L_NOFLSH(tty)) {
1331 if ( tty->ldisc->ops->flush_buffer )
1332 tty->ldisc->ops->flush_buffer(tty);
1333 i2InputFlush( tty->driver_data );
1337 static void do_status(struct work_struct *work)
1339 i2ChanStrPtr pCh = container_of(work, i2ChanStr, tqueue_status);
1342 status = i2GetStatus( pCh, (I2_BRK|I2_PAR|I2_FRA|I2_OVR) );
1344 ip2trace (CHANN, ITRC_STATUS, 21, 1, status );
1346 if (pCh->pTTY && (status & (I2_BRK|I2_PAR|I2_FRA|I2_OVR)) ) {
1347 if ( (status & I2_BRK) ) {
1348 // code duplicated from n_tty (ldisc)
1349 if (I_IGNBRK(pCh->pTTY))
1351 if (I_BRKINT(pCh->pTTY)) {
1352 isig(SIGINT, pCh->pTTY, 1);
1355 wake_up_interruptible(&pCh->pTTY->read_wait);
1357 #ifdef NEVER_HAPPENS_AS_SETUP_XXX
1358 // and can't work because we don't know the_char
1359 // as the_char is reported on a separate path
1360 // The intelligent board does this stuff as setup
1362 char brkf = TTY_NORMAL;
1363 unsigned char brkc = '\0';
1365 if ( (status & I2_BRK) ) {
1369 else if (status & I2_PAR) {
1372 } else if (status & I2_FRA) {
1375 } else if (status & I2_OVR) {
1379 tmp = pCh->pTTY->real_raw;
1380 pCh->pTTY->real_raw = 0;
1381 pCh->pTTY->ldisc->ops.receive_buf( pCh->pTTY, &brkc, &brkf, 1 );
1382 pCh->pTTY->real_raw = tmp;
1384 #endif /* NEVER_HAPPENS_AS_SETUP_XXX */
1388 if ( status & (I2_DDCD | I2_DDSR | I2_DCTS | I2_DRI) ) {
1389 wake_up_interruptible(&pCh->delta_msr_wait);
1391 if ( (pCh->flags & ASYNC_CHECK_CD) && (status & I2_DDCD) ) {
1392 if ( status & I2_DCD ) {
1394 wake_up_interruptible ( &pCh->open_wait );
1397 if (pCh->pTTY && (!(pCh->pTTY->termios->c_cflag & CLOCAL)) ) {
1398 tty_hangup( pCh->pTTY );
1404 ip2trace (CHANN, ITRC_STATUS, 26, 0 );
1407 /******************************************************************************/
1408 /* Device Open/Close/Ioctl Entry Point Section */
1409 /******************************************************************************/
1411 /******************************************************************************/
1412 /* Function: open_sanity_check() */
1413 /* Parameters: Pointer to tty structure */
1414 /* Pointer to file structure */
1415 /* Returns: Success or failure */
1418 /* Verifies the structure magic numbers and cross links. */
1419 /******************************************************************************/
1420 #ifdef IP2DEBUG_OPEN
1422 open_sanity_check( i2ChanStrPtr pCh, i2eBordStrPtr pBrd )
1424 if ( pBrd->i2eValid != I2E_MAGIC ) {
1425 printk(KERN_ERR "IP2: invalid board structure\n" );
1426 } else if ( pBrd != pCh->pMyBord ) {
1427 printk(KERN_ERR "IP2: board structure pointer mismatch (%p)\n",
1429 } else if ( pBrd->i2eChannelCnt < pCh->port_index ) {
1430 printk(KERN_ERR "IP2: bad device index (%d)\n", pCh->port_index );
1431 } else if (&((i2ChanStrPtr)pBrd->i2eChannelPtr)[pCh->port_index] != pCh) {
1433 printk(KERN_INFO "IP2: all pointers check out!\n" );
1439 /******************************************************************************/
1440 /* Function: ip2_open() */
1441 /* Parameters: Pointer to tty structure */
1442 /* Pointer to file structure */
1443 /* Returns: Success or failure */
1445 /* Description: (MANDATORY) */
1446 /* A successful device open has to run a gauntlet of checks before it */
1447 /* completes. After some sanity checking and pointer setup, the function */
1448 /* blocks until all conditions are satisfied. It then initialises the port to */
1449 /* the default characteristics and returns. */
1450 /******************************************************************************/
1452 ip2_open( PTTY tty, struct file *pFile )
1457 i2ChanStrPtr pCh = DevTable[tty->index];
1459 ip2trace (tty->index, ITRC_OPEN, ITRC_ENTER, 0 );
1461 if ( pCh == NULL ) {
1464 /* Setup pointer links in device and tty structures */
1466 tty->driver_data = pCh;
1468 #ifdef IP2DEBUG_OPEN
1470 "IP2:open(tty=%p,pFile=%p):dev=%s,ch=%d,idx=%d\n",
1471 tty, pFile, tty->name, pCh->infl.hd.i2sChannel, pCh->port_index);
1472 open_sanity_check ( pCh, pCh->pMyBord );
1475 i2QueueCommands(PTYPE_INLINE, pCh, 100, 3, CMD_DTRUP,CMD_RTSUP,CMD_DCD_REP);
1476 pCh->dataSetOut |= (I2_DTR | I2_RTS);
1477 serviceOutgoingFifo( pCh->pMyBord );
1479 /* Block here until the port is ready (per serial and istallion) */
1481 * 1. If the port is in the middle of closing wait for the completion
1482 * and then return the appropriate error.
1484 init_waitqueue_entry(&wait, current);
1485 add_wait_queue(&pCh->close_wait, &wait);
1486 set_current_state( TASK_INTERRUPTIBLE );
1488 if ( tty_hung_up_p(pFile) || ( pCh->flags & ASYNC_CLOSING )) {
1489 if ( pCh->flags & ASYNC_CLOSING ) {
1494 if ( tty_hung_up_p(pFile) ) {
1495 set_current_state( TASK_RUNNING );
1496 remove_wait_queue(&pCh->close_wait, &wait);
1497 return( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EAGAIN : -ERESTARTSYS;
1500 set_current_state( TASK_RUNNING );
1501 remove_wait_queue(&pCh->close_wait, &wait);
1504 * 3. Handle a non-blocking open of a normal port.
1506 if ( (pFile->f_flags & O_NONBLOCK) || (tty->flags & (1<<TTY_IO_ERROR) )) {
1507 pCh->flags |= ASYNC_NORMAL_ACTIVE;
1511 * 4. Now loop waiting for the port to be free and carrier present
1514 if ( tty->termios->c_cflag & CLOCAL )
1517 #ifdef IP2DEBUG_OPEN
1518 printk(KERN_DEBUG "OpenBlock: do_clocal = %d\n", do_clocal);
1523 init_waitqueue_entry(&wait, current);
1524 add_wait_queue(&pCh->open_wait, &wait);
1527 i2QueueCommands(PTYPE_INLINE, pCh, 100, 2, CMD_DTRUP, CMD_RTSUP);
1528 pCh->dataSetOut |= (I2_DTR | I2_RTS);
1529 set_current_state( TASK_INTERRUPTIBLE );
1530 serviceOutgoingFifo( pCh->pMyBord );
1531 if ( tty_hung_up_p(pFile) ) {
1532 set_current_state( TASK_RUNNING );
1533 remove_wait_queue(&pCh->open_wait, &wait);
1534 return ( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EBUSY : -ERESTARTSYS;
1536 if (!(pCh->flags & ASYNC_CLOSING) &&
1537 (do_clocal || (pCh->dataSetIn & I2_DCD) )) {
1542 #ifdef IP2DEBUG_OPEN
1543 printk(KERN_DEBUG "ASYNC_CLOSING = %s\n",
1544 (pCh->flags & ASYNC_CLOSING)?"True":"False");
1545 printk(KERN_DEBUG "OpenBlock: waiting for CD or signal\n");
1547 ip2trace (CHANN, ITRC_OPEN, 3, 2, 0,
1548 (pCh->flags & ASYNC_CLOSING) );
1549 /* check for signal */
1550 if (signal_pending(current)) {
1551 rc = (( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EAGAIN : -ERESTARTSYS);
1558 set_current_state( TASK_RUNNING );
1559 remove_wait_queue(&pCh->open_wait, &wait);
1561 --pCh->wopen; //why count?
1563 ip2trace (CHANN, ITRC_OPEN, 4, 0 );
1568 pCh->flags |= ASYNC_NORMAL_ACTIVE;
1572 /* first open - Assign termios structure to port */
1573 if ( tty->count == 1 ) {
1574 i2QueueCommands(PTYPE_INLINE, pCh, 0, 2, CMD_CTSFL_DSAB, CMD_RTSFL_DSAB);
1575 /* Now we must send the termios settings to the loadware */
1576 set_params( pCh, NULL );
1580 * Now set any i2lib options. These may go away if the i2lib code ends
1581 * up rolled into the mainline.
1583 pCh->channelOptions |= CO_NBLOCK_WRITE;
1585 #ifdef IP2DEBUG_OPEN
1586 printk (KERN_DEBUG "IP2: open completed\n" );
1588 serviceOutgoingFifo( pCh->pMyBord );
1590 ip2trace (CHANN, ITRC_OPEN, ITRC_RETURN, 0 );
1595 /******************************************************************************/
1596 /* Function: ip2_close() */
1597 /* Parameters: Pointer to tty structure */
1598 /* Pointer to file structure */
1599 /* Returns: Nothing */
1604 /******************************************************************************/
1606 ip2_close( PTTY tty, struct file *pFile )
1608 i2ChanStrPtr pCh = tty->driver_data;
1614 ip2trace (CHANN, ITRC_CLOSE, ITRC_ENTER, 0 );
1616 #ifdef IP2DEBUG_OPEN
1617 printk(KERN_DEBUG "IP2:close %s:\n",tty->name);
1620 if ( tty_hung_up_p ( pFile ) ) {
1622 ip2trace (CHANN, ITRC_CLOSE, 2, 1, 2 );
1626 if ( tty->count > 1 ) { /* not the last close */
1628 ip2trace (CHANN, ITRC_CLOSE, 2, 1, 3 );
1632 pCh->flags |= ASYNC_CLOSING; // last close actually
1636 if (pCh->ClosingWaitTime != ASYNC_CLOSING_WAIT_NONE) {
1638 * Before we drop DTR, make sure the transmitter has completely drained.
1639 * This uses an timeout, after which the close
1642 ip2_wait_until_sent(tty, pCh->ClosingWaitTime );
1645 * At this point we stop accepting input. Here we flush the channel
1646 * input buffer which will allow the board to send up more data. Any
1647 * additional input is tossed at interrupt/poll time.
1649 i2InputFlush( pCh );
1651 /* disable DSS reporting */
1652 i2QueueCommands(PTYPE_INLINE, pCh, 100, 4,
1653 CMD_DCD_NREP, CMD_CTS_NREP, CMD_DSR_NREP, CMD_RI_NREP);
1654 if (tty->termios->c_cflag & HUPCL) {
1655 i2QueueCommands(PTYPE_INLINE, pCh, 100, 2, CMD_RTSDN, CMD_DTRDN);
1656 pCh->dataSetOut &= ~(I2_DTR | I2_RTS);
1657 i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_PAUSE(25));
1660 serviceOutgoingFifo ( pCh->pMyBord );
1662 tty_ldisc_flush(tty);
1663 tty_driver_flush_buffer(tty);
1669 if (pCh->ClosingDelay) {
1670 msleep_interruptible(jiffies_to_msecs(pCh->ClosingDelay));
1672 wake_up_interruptible(&pCh->open_wait);
1675 pCh->flags &=~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
1676 wake_up_interruptible(&pCh->close_wait);
1678 #ifdef IP2DEBUG_OPEN
1679 DBG_CNT("ip2_close: after wakeups--");
1683 ip2trace (CHANN, ITRC_CLOSE, ITRC_RETURN, 1, 1 );
1688 /******************************************************************************/
1689 /* Function: ip2_hangup() */
1690 /* Parameters: Pointer to tty structure */
1691 /* Returns: Nothing */
1696 /******************************************************************************/
1698 ip2_hangup ( PTTY tty )
1700 i2ChanStrPtr pCh = tty->driver_data;
1706 ip2trace (CHANN, ITRC_HANGUP, ITRC_ENTER, 0 );
1708 ip2_flush_buffer(tty);
1710 /* disable DSS reporting */
1712 i2QueueCommands(PTYPE_BYPASS, pCh, 0, 1, CMD_DCD_NREP);
1713 i2QueueCommands(PTYPE_INLINE, pCh, 0, 2, CMD_CTSFL_DSAB, CMD_RTSFL_DSAB);
1714 if ( (tty->termios->c_cflag & HUPCL) ) {
1715 i2QueueCommands(PTYPE_BYPASS, pCh, 0, 2, CMD_RTSDN, CMD_DTRDN);
1716 pCh->dataSetOut &= ~(I2_DTR | I2_RTS);
1717 i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_PAUSE(25));
1719 i2QueueCommands(PTYPE_INLINE, pCh, 1, 3,
1720 CMD_CTS_NREP, CMD_DSR_NREP, CMD_RI_NREP);
1721 serviceOutgoingFifo ( pCh->pMyBord );
1723 wake_up_interruptible ( &pCh->delta_msr_wait );
1725 pCh->flags &= ~ASYNC_NORMAL_ACTIVE;
1727 wake_up_interruptible ( &pCh->open_wait );
1729 ip2trace (CHANN, ITRC_HANGUP, ITRC_RETURN, 0 );
1732 /******************************************************************************/
1733 /******************************************************************************/
1734 /* Device Output Section */
1735 /******************************************************************************/
1736 /******************************************************************************/
1738 /******************************************************************************/
1739 /* Function: ip2_write() */
1740 /* Parameters: Pointer to tty structure */
1741 /* Flag denoting data is in user (1) or kernel (0) space */
1742 /* Pointer to data */
1743 /* Number of bytes to write */
1744 /* Returns: Number of bytes actually written */
1746 /* Description: (MANDATORY) */
1749 /******************************************************************************/
1751 ip2_write( PTTY tty, const unsigned char *pData, int count)
1753 i2ChanStrPtr pCh = tty->driver_data;
1755 unsigned long flags;
1757 ip2trace (CHANN, ITRC_WRITE, ITRC_ENTER, 2, count, -1 );
1759 /* Flush out any buffered data left over from ip2_putchar() calls. */
1760 ip2_flush_chars( tty );
1762 /* This is the actual move bit. Make sure it does what we need!!!!! */
1763 write_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1764 bytesSent = i2Output( pCh, pData, count);
1765 write_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1767 ip2trace (CHANN, ITRC_WRITE, ITRC_RETURN, 1, bytesSent );
1769 return bytesSent > 0 ? bytesSent : 0;
1772 /******************************************************************************/
1773 /* Function: ip2_putchar() */
1774 /* Parameters: Pointer to tty structure */
1775 /* Character to write */
1776 /* Returns: Nothing */
1781 /******************************************************************************/
1783 ip2_putchar( PTTY tty, unsigned char ch )
1785 i2ChanStrPtr pCh = tty->driver_data;
1786 unsigned long flags;
1788 // ip2trace (CHANN, ITRC_PUTC, ITRC_ENTER, 1, ch );
1790 write_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1791 pCh->Pbuf[pCh->Pbuf_stuff++] = ch;
1792 if ( pCh->Pbuf_stuff == sizeof pCh->Pbuf ) {
1793 write_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1794 ip2_flush_chars( tty );
1796 write_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1799 // ip2trace (CHANN, ITRC_PUTC, ITRC_RETURN, 1, ch );
1802 /******************************************************************************/
1803 /* Function: ip2_flush_chars() */
1804 /* Parameters: Pointer to tty structure */
1805 /* Returns: Nothing */
1809 /******************************************************************************/
1811 ip2_flush_chars( PTTY tty )
1814 i2ChanStrPtr pCh = tty->driver_data;
1815 unsigned long flags;
1817 write_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1818 if ( pCh->Pbuf_stuff ) {
1820 // ip2trace (CHANN, ITRC_PUTC, 10, 1, strip );
1823 // We may need to restart i2Output if it does not fullfill this request
1825 strip = i2Output( pCh, pCh->Pbuf, pCh->Pbuf_stuff);
1826 if ( strip != pCh->Pbuf_stuff ) {
1827 memmove( pCh->Pbuf, &pCh->Pbuf[strip], pCh->Pbuf_stuff - strip );
1829 pCh->Pbuf_stuff -= strip;
1831 write_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1834 /******************************************************************************/
1835 /* Function: ip2_write_room() */
1836 /* Parameters: Pointer to tty structure */
1837 /* Returns: Number of bytes that the driver can accept */
1841 /******************************************************************************/
1843 ip2_write_room ( PTTY tty )
1846 i2ChanStrPtr pCh = tty->driver_data;
1847 unsigned long flags;
1849 read_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1850 bytesFree = i2OutputFree( pCh ) - pCh->Pbuf_stuff;
1851 read_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1853 ip2trace (CHANN, ITRC_WRITE, 11, 1, bytesFree );
1855 return ((bytesFree > 0) ? bytesFree : 0);
1858 /******************************************************************************/
1859 /* Function: ip2_chars_in_buf() */
1860 /* Parameters: Pointer to tty structure */
1861 /* Returns: Number of bytes queued for transmission */
1866 /******************************************************************************/
1868 ip2_chars_in_buf ( PTTY tty )
1870 i2ChanStrPtr pCh = tty->driver_data;
1872 unsigned long flags;
1874 ip2trace (CHANN, ITRC_WRITE, 12, 1, pCh->Obuf_char_count + pCh->Pbuf_stuff );
1876 #ifdef IP2DEBUG_WRITE
1877 printk (KERN_DEBUG "IP2: chars in buffer = %d (%d,%d)\n",
1878 pCh->Obuf_char_count + pCh->Pbuf_stuff,
1879 pCh->Obuf_char_count, pCh->Pbuf_stuff );
1881 read_lock_irqsave(&pCh->Obuf_spinlock, flags);
1882 rc = pCh->Obuf_char_count;
1883 read_unlock_irqrestore(&pCh->Obuf_spinlock, flags);
1884 read_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1885 rc += pCh->Pbuf_stuff;
1886 read_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1890 /******************************************************************************/
1891 /* Function: ip2_flush_buffer() */
1892 /* Parameters: Pointer to tty structure */
1893 /* Returns: Nothing */
1898 /******************************************************************************/
1900 ip2_flush_buffer( PTTY tty )
1902 i2ChanStrPtr pCh = tty->driver_data;
1903 unsigned long flags;
1905 ip2trace (CHANN, ITRC_FLUSH, ITRC_ENTER, 0 );
1907 #ifdef IP2DEBUG_WRITE
1908 printk (KERN_DEBUG "IP2: flush buffer\n" );
1910 write_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1911 pCh->Pbuf_stuff = 0;
1912 write_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1913 i2FlushOutput( pCh );
1916 ip2trace (CHANN, ITRC_FLUSH, ITRC_RETURN, 0 );
1920 /******************************************************************************/
1921 /* Function: ip2_wait_until_sent() */
1922 /* Parameters: Pointer to tty structure */
1923 /* Timeout for wait. */
1924 /* Returns: Nothing */
1927 /* This function is used in place of the normal tty_wait_until_sent, which */
1928 /* only waits for the driver buffers to be empty (or rather, those buffers */
1929 /* reported by chars_in_buffer) which doesn't work for IP2 due to the */
1930 /* indeterminate number of bytes buffered on the board. */
1931 /******************************************************************************/
1933 ip2_wait_until_sent ( PTTY tty, int timeout )
1936 i2ChanStrPtr pCh = tty->driver_data;
1938 tty_wait_until_sent(tty, timeout );
1939 if ( (i = timeout - (jiffies -i)) > 0)
1940 i2DrainOutput( pCh, i );
1943 /******************************************************************************/
1944 /******************************************************************************/
1945 /* Device Input Section */
1946 /******************************************************************************/
1947 /******************************************************************************/
1949 /******************************************************************************/
1950 /* Function: ip2_throttle() */
1951 /* Parameters: Pointer to tty structure */
1952 /* Returns: Nothing */
1957 /******************************************************************************/
1959 ip2_throttle ( PTTY tty )
1961 i2ChanStrPtr pCh = tty->driver_data;
1963 #ifdef IP2DEBUG_READ
1964 printk (KERN_DEBUG "IP2: throttle\n" );
1967 * Signal the poll/interrupt handlers not to forward incoming data to
1968 * the line discipline. This will cause the buffers to fill up in the
1969 * library and thus cause the library routines to send the flow control
1975 /******************************************************************************/
1976 /* Function: ip2_unthrottle() */
1977 /* Parameters: Pointer to tty structure */
1978 /* Returns: Nothing */
1983 /******************************************************************************/
1985 ip2_unthrottle ( PTTY tty )
1987 i2ChanStrPtr pCh = tty->driver_data;
1988 unsigned long flags;
1990 #ifdef IP2DEBUG_READ
1991 printk (KERN_DEBUG "IP2: unthrottle\n" );
1994 /* Pass incoming data up to the line discipline again. */
1996 i2QueueCommands(PTYPE_BYPASS, pCh, 0, 1, CMD_RESUME);
1997 serviceOutgoingFifo( pCh->pMyBord );
1998 read_lock_irqsave(&pCh->Ibuf_spinlock, flags);
1999 if ( pCh->Ibuf_stuff != pCh->Ibuf_strip ) {
2000 read_unlock_irqrestore(&pCh->Ibuf_spinlock, flags);
2001 #ifdef IP2DEBUG_READ
2002 printk (KERN_DEBUG "i2Input called from unthrottle\n" );
2006 read_unlock_irqrestore(&pCh->Ibuf_spinlock, flags);
2010 ip2_start ( PTTY tty )
2012 i2ChanStrPtr pCh = DevTable[tty->index];
2014 i2QueueCommands(PTYPE_BYPASS, pCh, 0, 1, CMD_RESUME);
2015 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_UNSUSPEND);
2016 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_RESUME);
2017 #ifdef IP2DEBUG_WRITE
2018 printk (KERN_DEBUG "IP2: start tx\n" );
2023 ip2_stop ( PTTY tty )
2025 i2ChanStrPtr pCh = DevTable[tty->index];
2027 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_SUSPEND);
2028 #ifdef IP2DEBUG_WRITE
2029 printk (KERN_DEBUG "IP2: stop tx\n" );
2033 /******************************************************************************/
2034 /* Device Ioctl Section */
2035 /******************************************************************************/
2037 static int ip2_tiocmget(struct tty_struct *tty, struct file *file)
2039 i2ChanStrPtr pCh = DevTable[tty->index];
2040 #ifdef ENABLE_DSSNOW
2048 FIXME - the following code is causing a NULL pointer dereference in
2049 2.3.51 in an interrupt handler. It's suppose to prompt the board
2050 to return the DSS signal status immediately. Why doesn't it do
2051 the same thing in 2.2.14?
2054 /* This thing is still busted in the 1.2.12 driver on 2.4.x
2055 and even hoses the serial console so the oops can be trapped.
2058 #ifdef ENABLE_DSSNOW
2059 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DSS_NOW);
2061 init_waitqueue_entry(&wait, current);
2062 add_wait_queue(&pCh->dss_now_wait, &wait);
2063 set_current_state( TASK_INTERRUPTIBLE );
2065 serviceOutgoingFifo( pCh->pMyBord );
2069 set_current_state( TASK_RUNNING );
2070 remove_wait_queue(&pCh->dss_now_wait, &wait);
2072 if (signal_pending(current)) {
2076 return ((pCh->dataSetOut & I2_RTS) ? TIOCM_RTS : 0)
2077 | ((pCh->dataSetOut & I2_DTR) ? TIOCM_DTR : 0)
2078 | ((pCh->dataSetIn & I2_DCD) ? TIOCM_CAR : 0)
2079 | ((pCh->dataSetIn & I2_RI) ? TIOCM_RNG : 0)
2080 | ((pCh->dataSetIn & I2_DSR) ? TIOCM_DSR : 0)
2081 | ((pCh->dataSetIn & I2_CTS) ? TIOCM_CTS : 0);
2084 static int ip2_tiocmset(struct tty_struct *tty, struct file *file,
2085 unsigned int set, unsigned int clear)
2087 i2ChanStrPtr pCh = DevTable[tty->index];
2092 if (set & TIOCM_RTS) {
2093 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_RTSUP);
2094 pCh->dataSetOut |= I2_RTS;
2096 if (set & TIOCM_DTR) {
2097 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DTRUP);
2098 pCh->dataSetOut |= I2_DTR;
2101 if (clear & TIOCM_RTS) {
2102 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_RTSDN);
2103 pCh->dataSetOut &= ~I2_RTS;
2105 if (clear & TIOCM_DTR) {
2106 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DTRDN);
2107 pCh->dataSetOut &= ~I2_DTR;
2109 serviceOutgoingFifo( pCh->pMyBord );
2113 /******************************************************************************/
2114 /* Function: ip2_ioctl() */
2115 /* Parameters: Pointer to tty structure */
2116 /* Pointer to file structure */
2119 /* Returns: Success or failure */
2124 /******************************************************************************/
2126 ip2_ioctl ( PTTY tty, struct file *pFile, UINT cmd, ULONG arg )
2129 i2ChanStrPtr pCh = DevTable[tty->index];
2131 struct async_icount cprev, cnow; /* kernel counter temps */
2132 struct serial_icounter_struct __user *p_cuser;
2134 unsigned long flags;
2135 void __user *argp = (void __user *)arg;
2142 ip2trace (CHANN, ITRC_IOCTL, ITRC_ENTER, 2, cmd, arg );
2144 #ifdef IP2DEBUG_IOCTL
2145 printk(KERN_DEBUG "IP2: ioctl cmd (%x), arg (%lx)\n", cmd, arg );
2151 ip2trace (CHANN, ITRC_IOCTL, 2, 1, rc );
2153 rc = get_serial_info(pCh, argp);
2160 ip2trace (CHANN, ITRC_IOCTL, 3, 1, rc );
2162 rc = set_serial_info(pCh, argp);
2168 rc = tty_check_change(tty);
2173 //return -ENOIOCTLCMD;
2176 //return -ENOIOCTLCMD;
2179 if (STOP_CHAR(tty) != __DISABLED_CHAR) {
2180 i2QueueCommands( PTYPE_BYPASS, pCh, 100, 1,
2181 CMD_XMIT_NOW(STOP_CHAR(tty)));
2185 if (START_CHAR(tty) != __DISABLED_CHAR) {
2186 i2QueueCommands( PTYPE_BYPASS, pCh, 100, 1,
2187 CMD_XMIT_NOW(START_CHAR(tty)));
2195 case TCSBRK: /* SVID version: non-zero arg --> no break */
2196 rc = tty_check_change(tty);
2198 ip2trace (CHANN, ITRC_IOCTL, 4, 1, rc );
2201 ip2_wait_until_sent(tty,0);
2203 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_SEND_BRK(250));
2204 serviceOutgoingFifo( pCh->pMyBord );
2209 case TCSBRKP: /* support for POSIX tcsendbreak() */
2210 rc = tty_check_change(tty);
2212 ip2trace (CHANN, ITRC_IOCTL, 5, 1, rc );
2215 ip2_wait_until_sent(tty,0);
2216 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1,
2217 CMD_SEND_BRK(arg ? arg*100 : 250));
2218 serviceOutgoingFifo ( pCh->pMyBord );
2224 ip2trace (CHANN, ITRC_IOCTL, 6, 1, rc );
2226 rc = put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long __user *)argp);
2233 ip2trace (CHANN, ITRC_IOCTL, 7, 1, rc );
2235 rc = get_user(arg,(unsigned long __user *) argp);
2238 tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL)
2239 | (arg ? CLOCAL : 0));
2244 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change - mask
2245 * passed in arg for lines of interest (use |'ed TIOCM_RNG/DSR/CD/CTS
2246 * for masking). Caller should use TIOCGICOUNT to see which one it was
2249 write_lock_irqsave(&pB->read_fifo_spinlock, flags);
2250 cprev = pCh->icount; /* note the counters on entry */
2251 write_unlock_irqrestore(&pB->read_fifo_spinlock, flags);
2252 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 4,
2253 CMD_DCD_REP, CMD_CTS_REP, CMD_DSR_REP, CMD_RI_REP);
2254 init_waitqueue_entry(&wait, current);
2255 add_wait_queue(&pCh->delta_msr_wait, &wait);
2256 set_current_state( TASK_INTERRUPTIBLE );
2258 serviceOutgoingFifo( pCh->pMyBord );
2260 ip2trace (CHANN, ITRC_IOCTL, 10, 0 );
2264 ip2trace (CHANN, ITRC_IOCTL, 11, 0 );
2266 /* see if a signal did it */
2267 if (signal_pending(current)) {
2271 write_lock_irqsave(&pB->read_fifo_spinlock, flags);
2272 cnow = pCh->icount; /* atomic copy */
2273 write_unlock_irqrestore(&pB->read_fifo_spinlock, flags);
2274 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
2275 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) {
2276 rc = -EIO; /* no change => rc */
2279 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
2280 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
2281 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
2282 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
2288 set_current_state( TASK_RUNNING );
2289 remove_wait_queue(&pCh->delta_msr_wait, &wait);
2291 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 3,
2292 CMD_CTS_NREP, CMD_DSR_NREP, CMD_RI_NREP);
2293 if ( ! (pCh->flags & ASYNC_CHECK_CD)) {
2294 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DCD_NREP);
2296 serviceOutgoingFifo( pCh->pMyBord );
2301 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
2302 * Return: write counters to the user passed counter struct
2303 * NB: both 1->0 and 0->1 transitions are counted except for RI where
2304 * only 0->1 is counted. The controller is quite capable of counting
2305 * both, but this done to preserve compatibility with the standard
2309 ip2trace (CHANN, ITRC_IOCTL, 11, 1, rc );
2311 write_lock_irqsave(&pB->read_fifo_spinlock, flags);
2313 write_unlock_irqrestore(&pB->read_fifo_spinlock, flags);
2315 rc = put_user(cnow.cts, &p_cuser->cts);
2316 rc = put_user(cnow.dsr, &p_cuser->dsr);
2317 rc = put_user(cnow.rng, &p_cuser->rng);
2318 rc = put_user(cnow.dcd, &p_cuser->dcd);
2319 rc = put_user(cnow.rx, &p_cuser->rx);
2320 rc = put_user(cnow.tx, &p_cuser->tx);
2321 rc = put_user(cnow.frame, &p_cuser->frame);
2322 rc = put_user(cnow.overrun, &p_cuser->overrun);
2323 rc = put_user(cnow.parity, &p_cuser->parity);
2324 rc = put_user(cnow.brk, &p_cuser->brk);
2325 rc = put_user(cnow.buf_overrun, &p_cuser->buf_overrun);
2329 * The rest are not supported by this driver. By returning -ENOIOCTLCMD they
2330 * will be passed to the line discipline for it to handle.
2336 case TIOCSERGSTRUCT:
2337 case TIOCSERGETMULTI:
2338 case TIOCSERSETMULTI:
2341 ip2trace (CHANN, ITRC_IOCTL, 12, 0 );
2347 ip2trace (CHANN, ITRC_IOCTL, ITRC_RETURN, 0 );
2352 /******************************************************************************/
2353 /* Function: GetSerialInfo() */
2354 /* Parameters: Pointer to channel structure */
2355 /* Pointer to old termios structure */
2356 /* Returns: Nothing */
2359 /* This is to support the setserial command, and requires processing of the */
2360 /* standard Linux serial structure. */
2361 /******************************************************************************/
2363 get_serial_info ( i2ChanStrPtr pCh, struct serial_struct __user *retinfo )
2365 struct serial_struct tmp;
2367 memset ( &tmp, 0, sizeof(tmp) );
2368 tmp.type = pCh->pMyBord->channelBtypes.bid_value[(pCh->port_index & (IP2_PORTS_PER_BOARD-1))/16];
2369 if (BID_HAS_654(tmp.type)) {
2370 tmp.type = PORT_16650;
2372 tmp.type = PORT_CIRRUS;
2374 tmp.line = pCh->port_index;
2375 tmp.port = pCh->pMyBord->i2eBase;
2376 tmp.irq = ip2config.irq[pCh->port_index/64];
2377 tmp.flags = pCh->flags;
2378 tmp.baud_base = pCh->BaudBase;
2379 tmp.close_delay = pCh->ClosingDelay;
2380 tmp.closing_wait = pCh->ClosingWaitTime;
2381 tmp.custom_divisor = pCh->BaudDivisor;
2382 return copy_to_user(retinfo,&tmp,sizeof(*retinfo));
2385 /******************************************************************************/
2386 /* Function: SetSerialInfo() */
2387 /* Parameters: Pointer to channel structure */
2388 /* Pointer to old termios structure */
2389 /* Returns: Nothing */
2392 /* This function provides support for setserial, which uses the TIOCSSERIAL */
2393 /* ioctl. Not all setserial parameters are relevant. If the user attempts to */
2394 /* change the IRQ, address or type of the port the ioctl fails. */
2395 /******************************************************************************/
2397 set_serial_info( i2ChanStrPtr pCh, struct serial_struct __user *new_info )
2399 struct serial_struct ns;
2400 int old_flags, old_baud_divisor;
2402 if (copy_from_user(&ns, new_info, sizeof (ns)))
2406 * We don't allow setserial to change IRQ, board address, type or baud
2407 * base. Also line nunber as such is meaningless but we use it for our
2408 * array index so it is fixed also.
2410 if ( (ns.irq != ip2config.irq[pCh->port_index])
2411 || ((int) ns.port != ((int) (pCh->pMyBord->i2eBase)))
2412 || (ns.baud_base != pCh->BaudBase)
2413 || (ns.line != pCh->port_index) ) {
2417 old_flags = pCh->flags;
2418 old_baud_divisor = pCh->BaudDivisor;
2420 if ( !capable(CAP_SYS_ADMIN) ) {
2421 if ( ( ns.close_delay != pCh->ClosingDelay ) ||
2422 ( (ns.flags & ~ASYNC_USR_MASK) !=
2423 (pCh->flags & ~ASYNC_USR_MASK) ) ) {
2427 pCh->flags = (pCh->flags & ~ASYNC_USR_MASK) |
2428 (ns.flags & ASYNC_USR_MASK);
2429 pCh->BaudDivisor = ns.custom_divisor;
2431 pCh->flags = (pCh->flags & ~ASYNC_FLAGS) |
2432 (ns.flags & ASYNC_FLAGS);
2433 pCh->BaudDivisor = ns.custom_divisor;
2434 pCh->ClosingDelay = ns.close_delay * HZ/100;
2435 pCh->ClosingWaitTime = ns.closing_wait * HZ/100;
2438 if ( ( (old_flags & ASYNC_SPD_MASK) != (pCh->flags & ASYNC_SPD_MASK) )
2439 || (old_baud_divisor != pCh->BaudDivisor) ) {
2440 // Invalidate speed and reset parameters
2441 set_params( pCh, NULL );
2447 /******************************************************************************/
2448 /* Function: ip2_set_termios() */
2449 /* Parameters: Pointer to tty structure */
2450 /* Pointer to old termios structure */
2451 /* Returns: Nothing */
2456 /******************************************************************************/
2458 ip2_set_termios( PTTY tty, struct ktermios *old_termios )
2460 i2ChanStrPtr pCh = (i2ChanStrPtr)tty->driver_data;
2462 #ifdef IP2DEBUG_IOCTL
2463 printk (KERN_DEBUG "IP2: set termios %p\n", old_termios );
2466 set_params( pCh, old_termios );
2469 /******************************************************************************/
2470 /* Function: ip2_set_line_discipline() */
2471 /* Parameters: Pointer to tty structure */
2472 /* Returns: Nothing */
2474 /* Description: Does nothing */
2477 /******************************************************************************/
2479 ip2_set_line_discipline ( PTTY tty )
2481 #ifdef IP2DEBUG_IOCTL
2482 printk (KERN_DEBUG "IP2: set line discipline\n" );
2485 ip2trace (((i2ChanStrPtr)tty->driver_data)->port_index, ITRC_IOCTL, 16, 0 );
2489 /******************************************************************************/
2490 /* Function: SetLine Characteristics() */
2491 /* Parameters: Pointer to channel structure */
2492 /* Returns: Nothing */
2495 /* This routine is called to update the channel structure with the new line */
2496 /* characteristics, and send the appropriate commands to the board when they */
2498 /******************************************************************************/
2500 set_params( i2ChanStrPtr pCh, struct ktermios *o_tios )
2502 tcflag_t cflag, iflag, lflag;
2503 char stop_char, start_char;
2504 struct ktermios dummy;
2506 lflag = pCh->pTTY->termios->c_lflag;
2507 cflag = pCh->pTTY->termios->c_cflag;
2508 iflag = pCh->pTTY->termios->c_iflag;
2510 if (o_tios == NULL) {
2511 dummy.c_lflag = ~lflag;
2512 dummy.c_cflag = ~cflag;
2513 dummy.c_iflag = ~iflag;
2518 switch ( cflag & CBAUD ) {
2520 i2QueueCommands( PTYPE_BYPASS, pCh, 100, 2, CMD_RTSDN, CMD_DTRDN);
2521 pCh->dataSetOut &= ~(I2_DTR | I2_RTS);
2522 i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_PAUSE(25));
2523 pCh->pTTY->termios->c_cflag |= (CBAUD & o_tios->c_cflag);
2528 * This is the speed that is overloaded with all the other high
2529 * speeds, depending upon the flag settings.
2531 if ( ( pCh->flags & ASYNC_SPD_MASK ) == ASYNC_SPD_HI ) {
2532 pCh->speed = CBR_57600;
2533 } else if ( (pCh->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI ) {
2534 pCh->speed = CBR_115200;
2535 } else if ( (pCh->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST ) {
2536 pCh->speed = CBR_C1;
2538 pCh->speed = CBR_38400;
2541 case B50: pCh->speed = CBR_50; break;
2542 case B75: pCh->speed = CBR_75; break;
2543 case B110: pCh->speed = CBR_110; break;
2544 case B134: pCh->speed = CBR_134; break;
2545 case B150: pCh->speed = CBR_150; break;
2546 case B200: pCh->speed = CBR_200; break;
2547 case B300: pCh->speed = CBR_300; break;
2548 case B600: pCh->speed = CBR_600; break;
2549 case B1200: pCh->speed = CBR_1200; break;
2550 case B1800: pCh->speed = CBR_1800; break;
2551 case B2400: pCh->speed = CBR_2400; break;
2552 case B4800: pCh->speed = CBR_4800; break;
2553 case B9600: pCh->speed = CBR_9600; break;
2554 case B19200: pCh->speed = CBR_19200; break;
2555 case B57600: pCh->speed = CBR_57600; break;
2556 case B115200: pCh->speed = CBR_115200; break;
2557 case B153600: pCh->speed = CBR_153600; break;
2558 case B230400: pCh->speed = CBR_230400; break;
2559 case B307200: pCh->speed = CBR_307200; break;
2560 case B460800: pCh->speed = CBR_460800; break;
2561 case B921600: pCh->speed = CBR_921600; break;
2562 default: pCh->speed = CBR_9600; break;
2564 if ( pCh->speed == CBR_C1 ) {
2565 // Process the custom speed parameters.
2566 int bps = pCh->BaudBase / pCh->BaudDivisor;
2567 if ( bps == 921600 ) {
2568 pCh->speed = CBR_921600;
2571 i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_BAUD_DEF1(bps) );
2574 i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_SETBAUD(pCh->speed));
2576 i2QueueCommands ( PTYPE_INLINE, pCh, 100, 2, CMD_DTRUP, CMD_RTSUP);
2577 pCh->dataSetOut |= (I2_DTR | I2_RTS);
2579 if ( (CSTOPB & cflag) ^ (CSTOPB & o_tios->c_cflag))
2581 i2QueueCommands ( PTYPE_INLINE, pCh, 100, 1,
2582 CMD_SETSTOP( ( cflag & CSTOPB ) ? CST_2 : CST_1));
2584 if (((PARENB|PARODD) & cflag) ^ ((PARENB|PARODD) & o_tios->c_cflag))
2586 i2QueueCommands ( PTYPE_INLINE, pCh, 100, 1,
2588 (cflag & PARENB ? (cflag & PARODD ? CSP_OD : CSP_EV) : CSP_NP)
2592 /* byte size and parity */
2593 if ( (CSIZE & cflag)^(CSIZE & o_tios->c_cflag))
2596 switch ( cflag & CSIZE ) {
2597 case CS5: datasize = CSZ_5; break;
2598 case CS6: datasize = CSZ_6; break;
2599 case CS7: datasize = CSZ_7; break;
2600 case CS8: datasize = CSZ_8; break;
2601 default: datasize = CSZ_5; break; /* as per serial.c */
2603 i2QueueCommands ( PTYPE_INLINE, pCh, 100, 1, CMD_SETBITS(datasize) );
2605 /* Process CTS flow control flag setting */
2606 if ( (cflag & CRTSCTS) ) {
2607 i2QueueCommands(PTYPE_INLINE, pCh, 100,
2608 2, CMD_CTSFL_ENAB, CMD_RTSFL_ENAB);
2610 i2QueueCommands(PTYPE_INLINE, pCh, 100,
2611 2, CMD_CTSFL_DSAB, CMD_RTSFL_DSAB);
2614 // Process XON/XOFF flow control flags settings
2616 stop_char = STOP_CHAR(pCh->pTTY);
2617 start_char = START_CHAR(pCh->pTTY);
2619 //////////// can't be \000
2620 if (stop_char == __DISABLED_CHAR )
2622 stop_char = ~__DISABLED_CHAR;
2624 if (start_char == __DISABLED_CHAR )
2626 start_char = ~__DISABLED_CHAR;
2628 /////////////////////////////////
2630 if ( o_tios->c_cc[VSTART] != start_char )
2632 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DEF_IXON(start_char));
2633 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DEF_OXON(start_char));
2635 if ( o_tios->c_cc[VSTOP] != stop_char )
2637 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DEF_IXOFF(stop_char));
2638 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DEF_OXOFF(stop_char));
2640 if (stop_char == __DISABLED_CHAR )
2642 stop_char = ~__DISABLED_CHAR; //TEST123
2645 if ((iflag & (IXOFF))^(o_tios->c_iflag & (IXOFF)))
2647 if ( iflag & IXOFF ) { // Enable XOFF output flow control
2648 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_OXON_OPT(COX_XON));
2649 } else { // Disable XOFF output flow control
2651 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_OXON_OPT(COX_NONE));
2654 if (start_char == __DISABLED_CHAR )
2658 if ((iflag & (IXON|IXANY)) ^ (o_tios->c_iflag & (IXON|IXANY)))
2660 if ( iflag & IXON ) {
2661 if ( iflag & IXANY ) { // Enable XON/XANY output flow control
2662 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_IXON_OPT(CIX_XANY));
2663 } else { // Enable XON output flow control
2664 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_IXON_OPT(CIX_XON));
2666 } else { // Disable XON output flow control
2668 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_IXON_OPT(CIX_NONE));
2671 if ( (iflag & ISTRIP) ^ ( o_tios->c_iflag & (ISTRIP)) )
2673 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1,
2674 CMD_ISTRIP_OPT((iflag & ISTRIP ? 1 : 0)));
2676 if ( (iflag & INPCK) ^ ( o_tios->c_iflag & (INPCK)) )
2678 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1,
2679 CMD_PARCHK((iflag & INPCK) ? CPK_ENAB : CPK_DSAB));
2682 if ( (iflag & (IGNBRK|PARMRK|BRKINT|IGNPAR))
2683 ^ ( o_tios->c_iflag & (IGNBRK|PARMRK|BRKINT|IGNPAR)) )
2688 if ( iflag & IGNBRK ) { /* Ignore breaks altogether */
2689 /* Ignore breaks altogether */
2690 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_BRK_NREP);
2692 if ( iflag & BRKINT ) {
2693 if ( iflag & PARMRK ) {
2694 brkrpt = 0x0a; // exception an inline triple
2696 brkrpt = 0x1a; // exception and NULL
2698 brkrpt |= 0x04; // flush input
2700 if ( iflag & PARMRK ) {
2701 brkrpt = 0x0b; //POSIX triple \0377 \0 \0
2703 brkrpt = 0x01; // Null only
2706 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_BRK_REP(brkrpt));
2709 if (iflag & IGNPAR) {
2711 /* would be 2 for not cirrus bug */
2712 /* would be 0x20 cept for cirrus bug */
2714 if ( iflag & PARMRK ) {
2716 * Replace error characters with 3-byte sequence (\0377,\0,char)
2719 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_ISTRIP_OPT((char)0));
2724 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_SET_ERROR(parrpt));
2726 if (cflag & CLOCAL) {
2727 // Status reporting fails for DCD if this is off
2728 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DCD_NREP);
2729 pCh->flags &= ~ASYNC_CHECK_CD;
2731 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DCD_REP);
2732 pCh->flags |= ASYNC_CHECK_CD;
2736 i2DrainOutput( pCh, 100 );
2739 /******************************************************************************/
2740 /* IPL Device Section */
2741 /******************************************************************************/
2743 /******************************************************************************/
2744 /* Function: ip2_ipl_read() */
2745 /* Parameters: Pointer to device inode */
2746 /* Pointer to file structure */
2747 /* Pointer to data */
2748 /* Number of bytes to read */
2749 /* Returns: Success or failure */
2751 /* Description: Ugly */
2754 /******************************************************************************/
2758 ip2_ipl_read(struct file *pFile, char __user *pData, size_t count, loff_t *off )
2760 unsigned int minor = iminor(pFile->f_path.dentry->d_inode);
2764 printk (KERN_DEBUG "IP2IPL: read %p, %d bytes\n", pData, count );
2768 case 0: // IPL device
2771 case 1: // Status dump
2774 case 2: // Ping device
2777 case 3: // Trace device
2778 rc = DumpTraceBuffer ( pData, count );
2780 case 4: // Trace device
2781 rc = DumpFifoBuffer ( pData, count );
2791 DumpFifoBuffer ( char __user *pData, int count )
2795 rc = copy_to_user(pData, DBGBuf, count);
2797 printk(KERN_DEBUG "Last index %d\n", I );
2800 #endif /* DEBUG_FIFO */
2805 DumpTraceBuffer ( char __user *pData, int count )
2807 #ifdef IP2DEBUG_TRACE
2811 int *pIndex = (int __user *)pData;
2813 if ( count < (sizeof(int) * 6) ) {
2816 rc = put_user(tracewrap, pIndex );
2817 rc = put_user(TRACEMAX, ++pIndex );
2818 rc = put_user(tracestrip, ++pIndex );
2819 rc = put_user(tracestuff, ++pIndex );
2820 pData += sizeof(int) * 6;
2821 count -= sizeof(int) * 6;
2823 dumpcount = tracestuff - tracestrip;
2824 if ( dumpcount < 0 ) {
2825 dumpcount += TRACEMAX;
2827 if ( dumpcount > count ) {
2830 chunk = TRACEMAX - tracestrip;
2831 if ( dumpcount > chunk ) {
2832 rc = copy_to_user(pData, &tracebuf[tracestrip],
2833 chunk * sizeof(tracebuf[0]) );
2834 pData += chunk * sizeof(tracebuf[0]);
2836 chunk = dumpcount - chunk;
2840 rc = copy_to_user(pData, &tracebuf[tracestrip],
2841 chunk * sizeof(tracebuf[0]) );
2842 tracestrip += chunk;
2845 rc = put_user(tracestrip, ++pIndex );
2846 rc = put_user(tracestuff, ++pIndex );
2854 /******************************************************************************/
2855 /* Function: ip2_ipl_write() */
2857 /* Pointer to file structure */
2858 /* Pointer to data */
2859 /* Number of bytes to write */
2860 /* Returns: Success or failure */
2865 /******************************************************************************/
2867 ip2_ipl_write(struct file *pFile, const char __user *pData, size_t count, loff_t *off)
2870 printk (KERN_DEBUG "IP2IPL: write %p, %d bytes\n", pData, count );
2875 /******************************************************************************/
2876 /* Function: ip2_ipl_ioctl() */
2877 /* Parameters: Pointer to device inode */
2878 /* Pointer to file structure */
2881 /* Returns: Success or failure */
2886 /******************************************************************************/
2888 ip2_ipl_ioctl (struct file *pFile, UINT cmd, ULONG arg )
2890 unsigned int iplminor = iminor(pFile->f_path.dentry->d_inode);
2892 void __user *argp = (void __user *)arg;
2893 ULONG __user *pIndex = argp;
2894 i2eBordStrPtr pB = i2BoardPtrTable[iplminor / 4];
2898 printk (KERN_DEBUG "IP2IPL: ioctl cmd %d, arg %ld\n", cmd, arg );
2903 switch ( iplminor ) {
2904 case 0: // IPL device
2907 case 1: // Status dump
2912 case 64: /* Driver - ip2stat */
2913 rc = put_user(-1, pIndex++ );
2914 rc = put_user(irq_counter, pIndex++ );
2915 rc = put_user(bh_counter, pIndex++ );
2918 case 65: /* Board - ip2stat */
2920 rc = copy_to_user(argp, pB, sizeof(i2eBordStr));
2921 rc = put_user(inb(pB->i2eStatus),
2922 (ULONG __user *)(arg + (ULONG)(&pB->i2eStatus) - (ULONG)pB ) );
2929 if (cmd < IP2_MAX_PORTS) {
2930 pCh = DevTable[cmd];
2933 rc = copy_to_user(argp, pCh, sizeof(i2ChanStr));
2945 case 2: // Ping device
2948 case 3: // Trace device
2950 * akpm: This used to write a whole bunch of function addresses
2951 * to userspace, which generated lots of put_user() warnings.
2952 * I killed it all. Just return "success" and don't do
2969 /******************************************************************************/
2970 /* Function: ip2_ipl_open() */
2971 /* Parameters: Pointer to device inode */
2972 /* Pointer to file structure */
2973 /* Returns: Success or failure */
2978 /******************************************************************************/
2980 ip2_ipl_open( struct inode *pInode, struct file *pFile )
2984 printk (KERN_DEBUG "IP2IPL: open\n" );
2986 cycle_kernel_lock();
2991 proc_ip2mem_show(struct seq_file *m, void *v)
2998 #define FMTLINE "%3d: 0x%08x 0x%08x 0%011o 0%011o\n"
2999 #define FMTLIN2 " 0x%04x 0x%04x tx flow 0x%x\n"
3000 #define FMTLIN3 " 0x%04x 0x%04x rc flow\n"
3004 for( i = 0; i < IP2_MAX_BOARDS; ++i ) {
3005 pB = i2BoardPtrTable[i];
3007 seq_printf(m,"board %d:\n",i);
3008 seq_printf(m,"\tFifo rem: %d mty: %x outM %x\n",
3009 pB->i2eFifoRemains,pB->i2eWaitingForEmptyFifo,pB->i2eOutMailWaiting);
3013 seq_printf(m,"#: tty flags, port flags, cflags, iflags\n");
3014 for (i=0; i < IP2_MAX_PORTS; i++) {
3018 if (tty && tty->count) {
3019 seq_printf(m,FMTLINE,i,(int)tty->flags,pCh->flags,
3020 tty->termios->c_cflag,tty->termios->c_iflag);
3022 seq_printf(m,FMTLIN2,
3023 pCh->outfl.asof,pCh->outfl.room,pCh->channelNeeds);
3024 seq_printf(m,FMTLIN3,pCh->infl.asof,pCh->infl.room);
3031 static int proc_ip2mem_open(struct inode *inode, struct file *file)
3033 return single_open(file, proc_ip2mem_show, NULL);
3036 static const struct file_operations ip2mem_proc_fops = {
3037 .owner = THIS_MODULE,
3038 .open = proc_ip2mem_open,
3040 .llseek = seq_lseek,
3041 .release = single_release,
3045 * This is the handler for /proc/tty/driver/ip2
3047 * This stretch of code has been largely plagerized from at least three
3048 * different sources including ip2mkdev.c and a couple of other drivers.
3049 * The bugs are all mine. :-) =mhw=
3051 static int ip2_proc_show(struct seq_file *m, void *v)
3060 seq_printf(m, "ip2info: 1.0 driver: %s\n", pcVersion);
3061 seq_printf(m, "Driver: SMajor=%d CMajor=%d IMajor=%d MaxBoards=%d MaxBoxes=%d MaxPorts=%d\n",
3062 IP2_TTY_MAJOR, IP2_CALLOUT_MAJOR, IP2_IPL_MAJOR,
3063 IP2_MAX_BOARDS, ABS_MAX_BOXES, ABS_BIGGEST_BOX);
3065 for( i = 0; i < IP2_MAX_BOARDS; ++i ) {
3066 /* This need to be reset for a board by board count... */
3068 pB = i2BoardPtrTable[i];
3070 switch( pB->i2ePom.e.porID & ~POR_ID_RESERVED )
3073 seq_printf(m, "Board %d: EX ports=", i);
3075 for( box = 0; box < ABS_MAX_BOXES; ++box )
3079 if( pB->i2eChannelMap[box] != 0 ) ++boxes;
3080 for( j = 0; j < ABS_BIGGEST_BOX; ++j )
3082 if( pB->i2eChannelMap[box] & 1<< j ) {
3086 seq_printf(m, "%s%d", sep, ports);
3090 seq_printf(m, " boxes=%d width=%d", boxes, pB->i2eDataWidth16 ? 16 : 8);
3094 seq_printf(m, "Board %d: ISA-4 ports=4 boxes=1", i);
3099 seq_printf(m, "Board %d: ISA-8-std ports=8 boxes=1", i);
3104 seq_printf(m, "Board %d: ISA-8-RJ11 ports=8 boxes=1", i);
3109 seq_printf(m, "Board %d: unknown", i);
3110 /* Don't try and probe for minor numbers */
3115 /* Don't try and probe for minor numbers */
3116 seq_printf(m, "Board %d: vacant", i);
3121 seq_puts(m, " minors=");
3123 for ( box = 0; box < ABS_MAX_BOXES; ++box )
3125 for ( j = 0; j < ABS_BIGGEST_BOX; ++j )
3127 if ( pB->i2eChannelMap[box] & (1 << j) )
3129 seq_printf(m, "%s%d", sep,
3130 j + ABS_BIGGEST_BOX *
3131 (box+i*ABS_MAX_BOXES));
3142 static int ip2_proc_open(struct inode *inode, struct file *file)
3144 return single_open(file, ip2_proc_show, NULL);
3147 static const struct file_operations ip2_proc_fops = {
3148 .owner = THIS_MODULE,
3149 .open = ip2_proc_open,
3151 .llseek = seq_lseek,
3152 .release = single_release,
3155 /******************************************************************************/
3156 /* Function: ip2trace() */
3157 /* Parameters: Value to add to trace buffer */
3158 /* Returns: Nothing */
3163 /******************************************************************************/
3164 #ifdef IP2DEBUG_TRACE
3166 ip2trace (unsigned short pn, unsigned char cat, unsigned char label, unsigned long codes, ...)
3169 unsigned long *pCode = &codes;
3170 union ip2breadcrumb bc;
3174 tracebuf[tracestuff++] = jiffies;
3175 if ( tracestuff == TRACEMAX ) {
3178 if ( tracestuff == tracestrip ) {
3179 if ( ++tracestrip == TRACEMAX ) {
3185 bc.hdr.port = 0xff & pn;
3187 bc.hdr.codes = (unsigned char)( codes & 0xff );
3188 bc.hdr.label = label;
3189 tracebuf[tracestuff++] = bc.value;
3192 if ( tracestuff == TRACEMAX ) {
3195 if ( tracestuff == tracestrip ) {
3196 if ( ++tracestrip == TRACEMAX ) {
3205 tracebuf[tracestuff++] = *++pCode;
3211 MODULE_LICENSE("GPL");
3213 static struct pci_device_id ip2main_pci_tbl[] __devinitdata = {
3214 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_IP2EX) },
3218 MODULE_DEVICE_TABLE(pci, ip2main_pci_tbl);
3220 MODULE_FIRMWARE("intelliport2.bin");