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/firmware.h>
102 #include <linux/platform_device.h>
104 #include <linux/tty.h>
105 #include <linux/tty_flip.h>
106 #include <linux/termios.h>
107 #include <linux/tty_driver.h>
108 #include <linux/serial.h>
109 #include <linux/ptrace.h>
110 #include <linux/ioport.h>
112 #include <linux/cdk.h>
113 #include <linux/comstats.h>
114 #include <linux/delay.h>
115 #include <linux/bitops.h>
117 #include <asm/system.h>
121 #include <linux/vmalloc.h>
122 #include <linux/init.h>
124 #include <asm/uaccess.h>
126 #include "ip2types.h"
127 #include "ip2trace.h"
128 #include "ip2ioctl.h"
137 #include <linux/proc_fs.h>
138 #include <linux/seq_file.h>
140 static const struct file_operations ip2mem_proc_fops;
141 static int ip2_read_proc(char *, char **, off_t, int, int *, void * );
143 /********************/
144 /* Type Definitions */
145 /********************/
151 /* String constants to identify ourselves */
152 static char *pcName = "Computone IntelliPort Plus multiport driver";
153 static char *pcVersion = "1.2.14";
155 /* String constants for port names */
156 static char *pcDriver_name = "ip2";
157 static char *pcIpl = "ip2ipl";
159 // cheezy kludge or genius - you decide?
160 int ip2_loadmain(int *, int *);
162 /***********************/
163 /* Function Prototypes */
164 /***********************/
166 /* Global module entry functions */
168 /* Private (static) functions */
169 static int ip2_open(PTTY, struct file *);
170 static void ip2_close(PTTY, struct file *);
171 static int ip2_write(PTTY, const unsigned char *, int);
172 static int ip2_putchar(PTTY, unsigned char);
173 static void ip2_flush_chars(PTTY);
174 static int ip2_write_room(PTTY);
175 static int ip2_chars_in_buf(PTTY);
176 static void ip2_flush_buffer(PTTY);
177 static int ip2_ioctl(PTTY, struct file *, UINT, ULONG);
178 static void ip2_set_termios(PTTY, struct ktermios *);
179 static void ip2_set_line_discipline(PTTY);
180 static void ip2_throttle(PTTY);
181 static void ip2_unthrottle(PTTY);
182 static void ip2_stop(PTTY);
183 static void ip2_start(PTTY);
184 static void ip2_hangup(PTTY);
185 static int ip2_tiocmget(struct tty_struct *tty, struct file *file);
186 static int ip2_tiocmset(struct tty_struct *tty, struct file *file,
187 unsigned int set, unsigned int clear);
189 static void set_irq(int, int);
190 static void ip2_interrupt_bh(struct work_struct *work);
191 static irqreturn_t ip2_interrupt(int irq, void *dev_id);
192 static void ip2_poll(unsigned long arg);
193 static inline void service_all_boards(void);
194 static void do_input(struct work_struct *);
195 static void do_status(struct work_struct *);
197 static void ip2_wait_until_sent(PTTY,int);
199 static void set_params (i2ChanStrPtr, struct ktermios *);
200 static int get_serial_info(i2ChanStrPtr, struct serial_struct __user *);
201 static int set_serial_info(i2ChanStrPtr, struct serial_struct __user *);
203 static ssize_t ip2_ipl_read(struct file *, char __user *, size_t, loff_t *);
204 static ssize_t ip2_ipl_write(struct file *, const char __user *, size_t, loff_t *);
205 static int ip2_ipl_ioctl(struct inode *, struct file *, UINT, ULONG);
206 static int ip2_ipl_open(struct inode *, struct file *);
208 static int DumpTraceBuffer(char __user *, int);
209 static int DumpFifoBuffer( char __user *, int);
211 static void ip2_init_board(int, const struct firmware *);
212 static unsigned short find_eisa_board(int);
218 static struct tty_driver *ip2_tty_driver;
220 /* Here, then is a table of board pointers which the interrupt routine should
221 * scan through to determine who it must service.
223 static unsigned short i2nBoards; // Number of boards here
225 static i2eBordStrPtr i2BoardPtrTable[IP2_MAX_BOARDS];
227 static i2ChanStrPtr DevTable[IP2_MAX_PORTS];
228 //DevTableMem just used to save addresses for kfree
229 static void *DevTableMem[IP2_MAX_BOARDS];
231 /* This is the driver descriptor for the ip2ipl device, which is used to
232 * download the loadware to the boards.
234 static const struct file_operations ip2_ipl = {
235 .owner = THIS_MODULE,
236 .read = ip2_ipl_read,
237 .write = ip2_ipl_write,
238 .ioctl = ip2_ipl_ioctl,
239 .open = ip2_ipl_open,
242 static unsigned long irq_counter = 0;
243 static unsigned long bh_counter = 0;
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);
256 #ifdef IP2DEBUG_TRACE
257 /* Trace (debug) buffer data */
258 #define TRACEMAX 1000
259 static unsigned long tracebuf[TRACEMAX];
260 static int tracestuff;
261 static int tracestrip;
262 static int tracewrap;
269 #if defined(MODULE) && defined(IP2DEBUG_OPEN)
270 #define DBG_CNT(s) printk(KERN_DEBUG "(%s): [%x] refc=%d, ttyc=%d, modc=%x -> %s\n", \
271 tty->name,(pCh->flags),ip2_tty_driver->refcount, \
272 tty->count,/*GET_USE_COUNT(module)*/0,s)
281 #include "i2ellis.c" /* Extremely low-level interface services */
282 #include "i2cmd.c" /* Standard loadware command definitions */
283 #include "i2lib.c" /* High level interface services */
285 /* Configuration area for modprobe */
287 MODULE_AUTHOR("Doug McNash");
288 MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
290 static int poll_only = 0;
293 static int Eisa_slot;
296 static char rirqs[IP2_MAX_BOARDS];
297 static int Valid_Irqs[] = { 3, 4, 5, 7, 10, 11, 12, 15, 0};
299 /* for sysfs class support */
300 static struct class *ip2_class;
302 // Some functions to keep track of what irq's we have
305 is_valid_irq(int irq)
309 while ((*i != 0) && (*i != irq)) {
316 mark_requested_irq( char irq )
318 rirqs[iindx++] = irq;
323 clear_requested_irq( char irq )
326 for ( i = 0; i < IP2_MAX_BOARDS; ++i ) {
327 if (rirqs[i] == irq) {
337 have_requested_irq( char irq )
339 // array init to zeros so 0 irq will not be requested as a side effect
341 for ( i = 0; i < IP2_MAX_BOARDS; ++i ) {
348 /******************************************************************************/
349 /* Function: cleanup_module() */
350 /* Parameters: None */
351 /* Returns: Nothing */
354 /* This is a required entry point for an installable module. It has to return */
355 /* the device and the driver to a passive state. It should not be necessary */
356 /* to reset the board fully, especially as the loadware is downloaded */
357 /* externally rather than in the driver. We just want to disable the board */
358 /* and clear the loadware to a reset state. To allow this there has to be a */
359 /* way to detect whether the board has the loadware running at init time to */
360 /* handle subsequent installations of the driver. All memory allocated by the */
361 /* driver should be returned since it may be unloaded from memory. */
362 /******************************************************************************/
365 ip2_cleanup_module(void)
371 printk (KERN_DEBUG "Unloading %s: version %s\n", pcName, pcVersion );
373 /* Stop poll timer if we had one. */
375 del_timer ( &PollTimer );
379 /* Reset the boards we have. */
380 for( i = 0; i < IP2_MAX_BOARDS; ++i ) {
381 if ( i2BoardPtrTable[i] ) {
382 iiReset( i2BoardPtrTable[i] );
386 /* The following is done at most once, if any boards were installed. */
387 for ( i = 0; i < IP2_MAX_BOARDS; ++i ) {
388 if ( i2BoardPtrTable[i] ) {
389 iiResetDelay( i2BoardPtrTable[i] );
390 /* free io addresses and Tibet */
391 release_region( ip2config.addr[i], 8 );
392 device_destroy(ip2_class, MKDEV(IP2_IPL_MAJOR, 4 * i));
393 device_destroy(ip2_class, MKDEV(IP2_IPL_MAJOR, 4 * i + 1));
395 /* Disable and remove interrupt handler. */
396 if ( (ip2config.irq[i] > 0) && have_requested_irq(ip2config.irq[i]) ) {
397 free_irq ( ip2config.irq[i], (void *)&pcName);
398 clear_requested_irq( ip2config.irq[i]);
401 class_destroy(ip2_class);
402 if ( ( err = tty_unregister_driver ( ip2_tty_driver ) ) ) {
403 printk(KERN_ERR "IP2: failed to unregister tty driver (%d)\n", err);
405 put_tty_driver(ip2_tty_driver);
406 unregister_chrdev(IP2_IPL_MAJOR, pcIpl);
407 remove_proc_entry("ip2mem", NULL);
410 for (i = 0; i < IP2_MAX_BOARDS; i++) {
413 if (ip2config.type[i] == PCI && ip2config.pci_dev[i]) {
414 pci_disable_device(ip2config.pci_dev[i]);
415 pci_dev_put(ip2config.pci_dev[i]);
416 ip2config.pci_dev[i] = NULL;
419 if ((pB = i2BoardPtrTable[i]) != 0 ) {
421 i2BoardPtrTable[i] = NULL;
423 if ((DevTableMem[i]) != NULL ) {
424 kfree ( DevTableMem[i] );
425 DevTableMem[i] = NULL;
429 /* Cleanup the iiEllis subsystem. */
432 printk (KERN_DEBUG "IP2 Unloaded\n" );
435 module_exit(ip2_cleanup_module);
438 static const struct tty_operations ip2_ops = {
442 .put_char = ip2_putchar,
443 .flush_chars = ip2_flush_chars,
444 .write_room = ip2_write_room,
445 .chars_in_buffer = ip2_chars_in_buf,
446 .flush_buffer = ip2_flush_buffer,
448 .throttle = ip2_throttle,
449 .unthrottle = ip2_unthrottle,
450 .set_termios = ip2_set_termios,
451 .set_ldisc = ip2_set_line_discipline,
454 .hangup = ip2_hangup,
455 .read_proc = ip2_read_proc,
456 .tiocmget = ip2_tiocmget,
457 .tiocmset = ip2_tiocmset,
460 /******************************************************************************/
461 /* Function: ip2_loadmain() */
462 /* Parameters: irq, io from command line of insmod et. al. */
463 /* pointer to fip firmware and firmware size for boards */
464 /* Returns: Success (0) */
467 /* This was the required entry point for all drivers (now in ip2.c) */
468 /* It performs all */
469 /* initialisation of the devices and driver structures, and registers itself */
470 /* with the relevant kernel modules. */
471 /******************************************************************************/
472 /* IRQF_DISABLED - if set blocks all interrupts else only this line */
473 /* IRQF_SHARED - for shared irq PCI or maybe EISA only */
474 /* SA_RANDOM - can be source for cert. random number generators */
475 #define IP2_SA_FLAGS 0
478 static const struct firmware *ip2_request_firmware(void)
480 struct platform_device *pdev;
481 const struct firmware *fw;
483 pdev = platform_device_register_simple("ip2", 0, NULL, 0);
485 printk(KERN_ERR "Failed to register platform device for ip2\n");
488 if (request_firmware(&fw, "intelliport2.bin", &pdev->dev)) {
489 printk(KERN_ERR "Failed to load firmware 'intelliport2.bin'\n");
492 platform_device_unregister(pdev);
497 ip2_loadmain(int *iop, int *irqp)
502 i2eBordStrPtr pB = NULL;
504 static struct pci_dev *pci_dev_i = NULL;
505 const struct firmware *fw = NULL;
507 ip2trace (ITRC_NO_PORT, ITRC_INIT, ITRC_ENTER, 0 );
509 /* process command line arguments to modprobe or
510 insmod i.e. iop & irqp */
511 /* irqp and iop should ALWAYS be specified now... But we check
512 them individually just to be sure, anyways... */
513 for ( i = 0; i < IP2_MAX_BOARDS; ++i ) {
515 ip2config.addr[i] = iop[i];
518 ip2config.irq[i] = irqp[i];
520 ip2config.irq[i] = 0;
522 // This is a little bit of a hack. If poll_only=1 on command
523 // line back in ip2.c OR all IRQs on all specified boards are
524 // explicitly set to 0, then drop to poll only mode and override
525 // PCI or EISA interrupts. This superceeds the old hack of
526 // triggering if all interrupts were zero (like da default).
527 // Still a hack but less prone to random acts of terrorism.
529 // What we really should do, now that the IRQ default is set
530 // to -1, is to use 0 as a hard coded, do not probe.
533 poll_only |= irqp[i];
537 poll_only = !poll_only;
539 /* Announce our presence */
540 printk( KERN_INFO "%s version %s\n", pcName, pcVersion );
542 // ip2 can be unloaded and reloaded for no good reason
543 // we can't let that happen here or bad things happen
544 // second load hoses board but not system - fixme later
546 printk( KERN_INFO "Still loaded\n" );
551 ip2_tty_driver = alloc_tty_driver(IP2_MAX_PORTS);
555 /* Initialise the iiEllis subsystem. */
558 /* Initialize arrays. */
559 memset( i2BoardPtrTable, 0, sizeof i2BoardPtrTable );
560 memset( DevTable, 0, sizeof DevTable );
562 /* Initialise all the boards we can find (up to the maximum). */
563 for ( i = 0; i < IP2_MAX_BOARDS; ++i ) {
564 switch ( ip2config.addr[i] ) {
565 case 0: /* skip this slot even if card is present */
568 /* ISA address must be specified */
569 if ( (ip2config.addr[i] < 0x100) || (ip2config.addr[i] > 0x3f8) ) {
570 printk ( KERN_ERR "IP2: Bad ISA board %d address %x\n",
571 i, ip2config.addr[i] );
572 ip2config.addr[i] = 0;
574 ip2config.type[i] = ISA;
576 /* Check for valid irq argument, set for polling if invalid */
577 if (ip2config.irq[i] && !is_valid_irq(ip2config.irq[i])) {
578 printk(KERN_ERR "IP2: Bad IRQ(%d) specified\n",ip2config.irq[i]);
579 ip2config.irq[i] = 0;// 0 is polling and is valid in that sense
588 pci_dev_i = pci_get_device(PCI_VENDOR_ID_COMPUTONE,
589 PCI_DEVICE_ID_COMPUTONE_IP2EX, pci_dev_i);
590 if (pci_dev_i != NULL) {
593 if (pci_enable_device(pci_dev_i)) {
594 printk( KERN_ERR "IP2: can't enable PCI device at %s\n",
595 pci_name(pci_dev_i));
598 ip2config.type[i] = PCI;
599 ip2config.pci_dev[i] = pci_dev_get(pci_dev_i);
601 pci_read_config_dword(pci_dev_i, PCI_BASE_ADDRESS_1, &addr);
603 ip2config.addr[i]=(USHORT)(addr&0xfffe);
605 printk( KERN_ERR "IP2: PCI I/O address error\n");
608 // If the PCI BIOS assigned it, lets try and use it. If we
609 // can't acquire it or it screws up, deal with it then.
611 // if (!is_valid_irq(pci_irq)) {
612 // printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq);
615 ip2config.irq[i] = pci_dev_i->irq;
616 } else { // ann error
617 ip2config.addr[i] = 0;
618 printk(KERN_ERR "IP2: PCI board %d not found\n", i);
622 printk( KERN_ERR "IP2: PCI card specified but PCI support not\n");
623 printk( KERN_ERR "IP2: configured in this kernel.\n");
624 printk( KERN_ERR "IP2: Recompile kernel with CONFIG_PCI defined!\n");
625 #endif /* CONFIG_PCI */
628 if ( (ip2config.addr[i] = find_eisa_board( Eisa_slot + 1 )) != 0) {
629 /* Eisa_irq set as side effect, boo */
630 ip2config.type[i] = EISA;
632 ip2config.irq[i] = Eisa_irq;
637 pci_dev_put(pci_dev_i);
639 for ( i = 0; i < IP2_MAX_BOARDS; ++i ) {
640 if ( ip2config.addr[i] ) {
641 pB = kzalloc(sizeof(i2eBordStr), GFP_KERNEL);
643 i2BoardPtrTable[i] = pB;
644 iiSetAddress( pB, ip2config.addr[i], ii2DelayTimer );
647 printk(KERN_ERR "IP2: board memory allocation error\n");
651 for ( i = 0; i < IP2_MAX_BOARDS; ++i ) {
652 if ( ( pB = i2BoardPtrTable[i] ) != NULL ) {
657 for ( i = 0; i < IP2_MAX_BOARDS; ++i ) {
658 /* We don't want to request the firmware unless we have at
660 if ( i2BoardPtrTable[i] != NULL ) {
662 fw = ip2_request_firmware();
665 ip2_init_board(i, fw);
669 release_firmware(fw);
671 ip2trace (ITRC_NO_PORT, ITRC_INIT, 2, 0 );
673 ip2_tty_driver->owner = THIS_MODULE;
674 ip2_tty_driver->name = "ttyF";
675 ip2_tty_driver->driver_name = pcDriver_name;
676 ip2_tty_driver->major = IP2_TTY_MAJOR;
677 ip2_tty_driver->minor_start = 0;
678 ip2_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
679 ip2_tty_driver->subtype = SERIAL_TYPE_NORMAL;
680 ip2_tty_driver->init_termios = tty_std_termios;
681 ip2_tty_driver->init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL;
682 ip2_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
683 tty_set_operations(ip2_tty_driver, &ip2_ops);
685 ip2trace (ITRC_NO_PORT, ITRC_INIT, 3, 0 );
687 /* Register the tty devices. */
688 if ( ( err = tty_register_driver ( ip2_tty_driver ) ) ) {
689 printk(KERN_ERR "IP2: failed to register tty driver (%d)\n", err);
690 put_tty_driver(ip2_tty_driver);
693 /* Register the IPL driver. */
694 if ( ( err = register_chrdev ( IP2_IPL_MAJOR, pcIpl, &ip2_ipl ) ) ) {
695 printk(KERN_ERR "IP2: failed to register IPL device (%d)\n", err );
697 /* create the sysfs class */
698 ip2_class = class_create(THIS_MODULE, "ip2");
699 if (IS_ERR(ip2_class)) {
700 err = PTR_ERR(ip2_class);
704 /* Register the read_procmem thing */
705 if (!proc_create("ip2mem",0,NULL,&ip2mem_proc_fops)) {
706 printk(KERN_ERR "IP2: failed to register read_procmem\n");
709 ip2trace (ITRC_NO_PORT, ITRC_INIT, 4, 0 );
710 /* Register the interrupt handler or poll handler, depending upon the
711 * specified interrupt.
714 for( i = 0; i < IP2_MAX_BOARDS; ++i ) {
715 if ( 0 == ip2config.addr[i] ) {
719 if ( NULL != ( pB = i2BoardPtrTable[i] ) ) {
720 device_create(ip2_class, NULL,
721 MKDEV(IP2_IPL_MAJOR, 4 * i),
723 device_create(ip2_class, NULL,
724 MKDEV(IP2_IPL_MAJOR, 4 * i + 1),
727 for ( box = 0; box < ABS_MAX_BOXES; ++box )
729 for ( j = 0; j < ABS_BIGGEST_BOX; ++j )
731 if ( pB->i2eChannelMap[box] & (1 << j) )
733 tty_register_device(ip2_tty_driver,
734 j + ABS_BIGGEST_BOX *
735 (box+i*ABS_MAX_BOXES), NULL);
742 // Poll only forces driver to only use polling and
743 // to ignore the probed PCI or EISA interrupts.
744 ip2config.irq[i] = CIR_POLL;
746 if ( ip2config.irq[i] == CIR_POLL ) {
749 PollTimer.expires = POLL_TIMEOUT;
750 add_timer ( &PollTimer );
752 printk( KERN_INFO "IP2: polling\n");
755 if (have_requested_irq(ip2config.irq[i]))
757 rc = request_irq( ip2config.irq[i], ip2_interrupt,
758 IP2_SA_FLAGS | (ip2config.type[i] == PCI ? IRQF_SHARED : 0),
759 pcName, i2BoardPtrTable[i]);
761 printk(KERN_ERR "IP2: an request_irq failed: error %d\n",rc);
762 ip2config.irq[i] = CIR_POLL;
763 printk( KERN_INFO "IP2: Polling %ld/sec.\n",
764 (POLL_TIMEOUT - jiffies));
767 mark_requested_irq(ip2config.irq[i]);
768 /* Initialise the interrupt handler bottom half (aka slih). */
771 for( i = 0; i < IP2_MAX_BOARDS; ++i ) {
772 if ( i2BoardPtrTable[i] ) {
773 set_irq( i, ip2config.irq[i] ); /* set and enable board interrupt */
777 ip2trace (ITRC_NO_PORT, ITRC_INIT, ITRC_RETURN, 0 );
781 unregister_chrdev(IP2_IPL_MAJOR, "ip2");
786 /******************************************************************************/
787 /* Function: ip2_init_board() */
788 /* Parameters: Index of board in configuration structure */
789 /* Returns: Success (0) */
792 /* This function initializes the specified board. The loadware is copied to */
793 /* the board, the channel structures are initialized, and the board details */
794 /* are reported on the console. */
795 /******************************************************************************/
797 ip2_init_board(int boardnum, const struct firmware *fw)
800 int nports = 0, nboxes = 0;
802 i2eBordStrPtr pB = i2BoardPtrTable[boardnum];
804 if ( !iiInitialize ( pB ) ) {
805 printk ( KERN_ERR "IP2: Failed to initialize board at 0x%x, error %d\n",
806 pB->i2eBase, pB->i2eError );
809 printk(KERN_INFO "IP2: Board %d: addr=0x%x irq=%d\n", boardnum + 1,
810 ip2config.addr[boardnum], ip2config.irq[boardnum] );
812 if (!request_region( ip2config.addr[boardnum], 8, pcName )) {
813 printk(KERN_ERR "IP2: bad addr=0x%x\n", ip2config.addr[boardnum]);
817 if ( iiDownloadAll ( pB, (loadHdrStrPtr)fw->data, 1, fw->size )
819 printk ( KERN_ERR "IP2: failed to download loadware\n" );
820 goto err_release_region;
822 printk ( KERN_INFO "IP2: fv=%d.%d.%d lv=%d.%d.%d\n",
823 pB->i2ePom.e.porVersion,
824 pB->i2ePom.e.porRevision,
825 pB->i2ePom.e.porSubRev, pB->i2eLVersion,
826 pB->i2eLRevision, pB->i2eLSub );
829 switch ( pB->i2ePom.e.porID & ~POR_ID_RESERVED ) {
832 printk( KERN_ERR "IP2: Unknown board type, ID = %x\n",
833 pB->i2ePom.e.porID );
835 goto err_release_region;
838 case POR_ID_II_4: /* IntelliPort-II, ISA-4 (4xRJ45) */
839 printk ( KERN_INFO "IP2: ISA-4\n" );
843 case POR_ID_II_8: /* IntelliPort-II, 8-port using standard brick. */
844 printk ( KERN_INFO "IP2: ISA-8 std\n" );
848 case POR_ID_II_8R: /* IntelliPort-II, 8-port using RJ11's (no CTS) */
849 printk ( KERN_INFO "IP2: ISA-8 RJ11\n" );
853 case POR_ID_FIIEX: /* IntelliPort IIEX */
855 int portnum = IP2_PORTS_PER_BOARD * boardnum;
858 for( box = 0; box < ABS_MAX_BOXES; ++box ) {
859 if ( pB->i2eChannelMap[box] != 0 ) {
862 for( i = 0; i < ABS_BIGGEST_BOX; ++i ) {
863 if ( pB->i2eChannelMap[box] & 1<< i ) {
868 DevTableMem[boardnum] = pCh =
869 kmalloc( sizeof(i2ChanStr) * nports, GFP_KERNEL );
871 printk ( KERN_ERR "IP2: (i2_init_channel:) Out of memory.\n");
872 goto err_release_region;
874 if ( !i2InitChannels( pB, nports, pCh ) ) {
875 printk(KERN_ERR "IP2: i2InitChannels failed: %d\n",pB->i2eError);
877 goto err_release_region;
879 pB->i2eChannelPtr = &DevTable[portnum];
880 pB->i2eChannelCnt = ABS_MOST_PORTS;
882 for( box = 0; box < ABS_MAX_BOXES; ++box, portnum += ABS_BIGGEST_BOX ) {
883 for( i = 0; i < ABS_BIGGEST_BOX; ++i ) {
884 if ( pB->i2eChannelMap[box] & (1 << i) ) {
885 DevTable[portnum + i] = pCh;
886 pCh->port_index = portnum + i;
891 printk(KERN_INFO "IP2: EX box=%d ports=%d %d bit\n",
892 nboxes, nports, pB->i2eDataWidth16 ? 16 : 8 );
896 DevTableMem[boardnum] = pCh =
897 kmalloc ( sizeof (i2ChanStr) * nports, GFP_KERNEL );
899 printk ( KERN_ERR "IP2: (i2_init_channel:) Out of memory.\n");
900 goto err_release_region;
902 pB->i2eChannelPtr = pCh;
903 pB->i2eChannelCnt = nports;
904 if ( !i2InitChannels( pB, nports, pCh ) ) {
905 printk(KERN_ERR "IP2: i2InitChannels failed: %d\n",pB->i2eError);
907 goto err_release_region;
909 pB->i2eChannelPtr = &DevTable[IP2_PORTS_PER_BOARD * boardnum];
911 for( i = 0; i < pB->i2eChannelCnt; ++i ) {
912 DevTable[IP2_PORTS_PER_BOARD * boardnum + i] = pCh;
913 pCh->port_index = (IP2_PORTS_PER_BOARD * boardnum) + i;
917 INIT_WORK(&pB->tqueue_interrupt, ip2_interrupt_bh);
921 release_region(ip2config.addr[boardnum], 8);
924 i2BoardPtrTable[boardnum] = NULL;
928 /******************************************************************************/
929 /* Function: find_eisa_board ( int start_slot ) */
930 /* Parameters: First slot to check */
931 /* Returns: Address of EISA IntelliPort II controller */
934 /* This function searches for an EISA IntelliPort controller, starting */
935 /* from the specified slot number. If the motherboard is not identified as an */
936 /* EISA motherboard, or no valid board ID is selected it returns 0. Otherwise */
937 /* it returns the base address of the controller. */
938 /******************************************************************************/
939 static unsigned short
940 find_eisa_board( int start_slot )
943 unsigned int idm = 0;
944 unsigned int idp = 0;
945 unsigned int base = 0;
952 * First a check for an EISA motherboard, which we do by comparing the
953 * EISA ID registers for the system board and the first couple of slots.
954 * No slot ID should match the system board ID, but on an ISA or PCI
955 * machine the odds are that an empty bus will return similar values for
959 value = (inb(i) << 24) + (inb(i+1) << 16) + (inb(i+2) << 8) + inb(i+3);
960 for( i = 0x1c80; i <= 0x4c80; i += 0x1000 ) {
961 j = (inb(i)<<24)+(inb(i+1)<<16)+(inb(i+2)<<8)+inb(i+3);
967 * OK, so we are inclined to believe that this is an EISA machine. Find
968 * an IntelliPort controller.
970 for( i = start_slot; i < 16; i++ ) {
972 idm = (inb(base + 0xc80) << 8) | (inb(base + 0xc81) & 0xff);
973 idp = (inb(base + 0xc82) << 8) | (inb(base + 0xc83) & 0xff);
975 if ( idm == 0x0e8e ) {
976 if ( idp == 0x0281 || idp == 0x0218 ) {
978 } else if ( idp == 0x0282 || idp == 0x0283 ) {
979 ismine = 3; /* Can do edge-trigger */
990 /* It's some sort of EISA card, but at what address is it configured? */
992 setup_address = base + 0xc88;
993 value = inb(base + 0xc86);
994 setup_irq = (value & 8) ? Valid_Irqs[value & 7] : 0;
996 if ( (ismine & 2) && !(value & 0x10) ) {
997 ismine = 1; /* Could be edging, but not */
1000 if ( Eisa_irq == 0 ) {
1001 Eisa_irq = setup_irq;
1002 } else if ( Eisa_irq != setup_irq ) {
1003 printk ( KERN_ERR "IP2: EISA irq mismatch between EISA controllers\n" );
1006 #ifdef IP2DEBUG_INIT
1007 printk(KERN_DEBUG "Computone EISA board in slot %d, I.D. 0x%x%x, Address 0x%x",
1008 base >> 12, idm, idp, setup_address);
1010 printk(KERN_DEBUG ", Interrupt %d %s\n",
1011 setup_irq, (ismine & 2) ? "(edge)" : "(level)");
1013 printk(KERN_DEBUG ", (polled)\n");
1016 return setup_address;
1019 /******************************************************************************/
1020 /* Function: set_irq() */
1021 /* Parameters: index to board in board table */
1023 /* Returns: Success (0) */
1026 /******************************************************************************/
1028 set_irq( int boardnum, int boardIrq )
1030 unsigned char tempCommand[16];
1031 i2eBordStrPtr pB = i2BoardPtrTable[boardnum];
1032 unsigned long flags;
1035 * Notify the boards they may generate interrupts. This is done by
1036 * sending an in-line command to channel 0 on each board. This is why
1037 * the channels have to be defined already. For each board, if the
1038 * interrupt has never been defined, we must do so NOW, directly, since
1039 * board will not send flow control or even give an interrupt until this
1040 * is done. If polling we must send 0 as the interrupt parameter.
1043 // We will get an interrupt here at the end of this function
1045 iiDisableMailIrq(pB);
1047 /* We build up the entire packet header. */
1048 CHANNEL_OF(tempCommand) = 0;
1049 PTYPE_OF(tempCommand) = PTYPE_INLINE;
1050 CMD_COUNT_OF(tempCommand) = 2;
1051 (CMD_OF(tempCommand))[0] = CMDVALUE_IRQ;
1052 (CMD_OF(tempCommand))[1] = boardIrq;
1054 * Write to FIFO; don't bother to adjust fifo capacity for this, since
1055 * board will respond almost immediately after SendMail hit.
1057 write_lock_irqsave(&pB->write_fifo_spinlock, flags);
1058 iiWriteBuf(pB, tempCommand, 4);
1059 write_unlock_irqrestore(&pB->write_fifo_spinlock, flags);
1060 pB->i2eUsingIrq = boardIrq;
1061 pB->i2eOutMailWaiting |= MB_OUT_STUFFED;
1063 /* Need to update number of boards before you enable mailbox int */
1066 CHANNEL_OF(tempCommand) = 0;
1067 PTYPE_OF(tempCommand) = PTYPE_BYPASS;
1068 CMD_COUNT_OF(tempCommand) = 6;
1069 (CMD_OF(tempCommand))[0] = 88; // SILO
1070 (CMD_OF(tempCommand))[1] = 64; // chars
1071 (CMD_OF(tempCommand))[2] = 32; // ms
1073 (CMD_OF(tempCommand))[3] = 28; // MAX_BLOCK
1074 (CMD_OF(tempCommand))[4] = 64; // chars
1076 (CMD_OF(tempCommand))[5] = 87; // HW_TEST
1077 write_lock_irqsave(&pB->write_fifo_spinlock, flags);
1078 iiWriteBuf(pB, tempCommand, 8);
1079 write_unlock_irqrestore(&pB->write_fifo_spinlock, flags);
1081 CHANNEL_OF(tempCommand) = 0;
1082 PTYPE_OF(tempCommand) = PTYPE_BYPASS;
1083 CMD_COUNT_OF(tempCommand) = 1;
1084 (CMD_OF(tempCommand))[0] = 84; /* get BOX_IDS */
1085 iiWriteBuf(pB, tempCommand, 3);
1088 // enable heartbeat for test porpoises
1089 CHANNEL_OF(tempCommand) = 0;
1090 PTYPE_OF(tempCommand) = PTYPE_BYPASS;
1091 CMD_COUNT_OF(tempCommand) = 2;
1092 (CMD_OF(tempCommand))[0] = 44; /* get ping */
1093 (CMD_OF(tempCommand))[1] = 200; /* 200 ms */
1094 write_lock_irqsave(&pB->write_fifo_spinlock, flags);
1095 iiWriteBuf(pB, tempCommand, 4);
1096 write_unlock_irqrestore(&pB->write_fifo_spinlock, flags);
1099 iiEnableMailIrq(pB);
1100 iiSendPendingMail(pB);
1103 /******************************************************************************/
1104 /* Interrupt Handler Section */
1105 /******************************************************************************/
1108 service_all_boards(void)
1113 /* Service every board on the list */
1114 for( i = 0; i < IP2_MAX_BOARDS; ++i ) {
1115 pB = i2BoardPtrTable[i];
1117 i2ServiceBoard( pB );
1123 /******************************************************************************/
1124 /* Function: ip2_interrupt_bh(work) */
1125 /* Parameters: work - pointer to the board structure */
1126 /* Returns: Nothing */
1129 /* Service the board in a bottom half interrupt handler and then */
1130 /* reenable the board's interrupts if it has an IRQ number */
1132 /******************************************************************************/
1134 ip2_interrupt_bh(struct work_struct *work)
1136 i2eBordStrPtr pB = container_of(work, i2eBordStr, tqueue_interrupt);
1137 // pB better well be set or we have a problem! We can only get
1138 // here from the IMMEDIATE queue. Here, we process the boards.
1139 // Checking pB doesn't cost much and it saves us from the sanity checkers.
1144 i2ServiceBoard( pB );
1145 if( pB->i2eUsingIrq ) {
1146 // Re-enable his interrupts
1147 iiEnableMailIrq(pB);
1153 /******************************************************************************/
1154 /* Function: ip2_interrupt(int irq, void *dev_id) */
1155 /* Parameters: irq - interrupt number */
1156 /* pointer to optional device ID structure */
1157 /* Returns: Nothing */
1161 /* Our task here is simply to identify each board which needs servicing. */
1162 /* If we are queuing then, queue it to be serviced, and disable its irq */
1163 /* mask otherwise process the board directly. */
1165 /* We could queue by IRQ but that just complicates things on both ends */
1166 /* with very little gain in performance (how many instructions does */
1167 /* it take to iterate on the immediate queue). */
1170 /******************************************************************************/
1172 ip2_irq_work(i2eBordStrPtr pB)
1175 if (NO_MAIL_HERE != ( pB->i2eStartMail = iiGetMail(pB))) {
1176 // Disable his interrupt (will be enabled when serviced)
1177 // This is mostly to protect from reentrancy.
1178 iiDisableMailIrq(pB);
1180 // Park the board on the immediate queue for processing.
1181 schedule_work(&pB->tqueue_interrupt);
1183 // Make sure the immediate queue is flagged to fire.
1187 // We are using immediate servicing here. This sucks and can
1188 // cause all sorts of havoc with ppp and others. The failsafe
1189 // check on iiSendPendingMail could also throw a hairball.
1191 i2ServiceBoard( pB );
1193 #endif /* USE_IQI */
1197 ip2_polled_interrupt(void)
1203 ip2trace (ITRC_NO_PORT, ITRC_INTR, 99, 1, irq );
1205 /* Service just the boards on the list using this irq */
1206 for( i = 0; i < i2nBoards; ++i ) {
1207 pB = i2BoardPtrTable[i];
1209 // Only process those boards which match our IRQ.
1210 // IRQ = 0 for polled boards, we won't poll "IRQ" boards
1212 if ( pB && (pB->i2eUsingIrq == irq) ) {
1219 ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 );
1223 ip2_interrupt(int irq, void *dev_id)
1225 i2eBordStrPtr pB = dev_id;
1227 ip2trace (ITRC_NO_PORT, ITRC_INTR, 99, 1, pB->i2eUsingIrq );
1233 ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 );
1237 /******************************************************************************/
1238 /* Function: ip2_poll(unsigned long arg) */
1240 /* Returns: Nothing */
1243 /* This function calls the library routine i2ServiceBoard for each board in */
1244 /* the board table. This is used instead of the interrupt routine when polled */
1245 /* mode is specified. */
1246 /******************************************************************************/
1248 ip2_poll(unsigned long arg)
1250 ip2trace (ITRC_NO_PORT, ITRC_INTR, 100, 0 );
1252 TimerOn = 0; // it's the truth but not checked in service
1254 // Just polled boards, IRQ = 0 will hit all non-interrupt boards.
1255 // It will NOT poll boards handled by hard interrupts.
1256 // The issue of queued BH interrupts is handled in ip2_interrupt().
1257 ip2_polled_interrupt();
1259 PollTimer.expires = POLL_TIMEOUT;
1260 add_timer( &PollTimer );
1263 ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 );
1266 static void do_input(struct work_struct *work)
1268 i2ChanStrPtr pCh = container_of(work, i2ChanStr, tqueue_input);
1269 unsigned long flags;
1271 ip2trace(CHANN, ITRC_INPUT, 21, 0 );
1274 if ( pCh->pTTY != NULL ) {
1275 read_lock_irqsave(&pCh->Ibuf_spinlock, flags);
1276 if (!pCh->throttled && (pCh->Ibuf_stuff != pCh->Ibuf_strip)) {
1277 read_unlock_irqrestore(&pCh->Ibuf_spinlock, flags);
1280 read_unlock_irqrestore(&pCh->Ibuf_spinlock, flags);
1282 ip2trace(CHANN, ITRC_INPUT, 22, 0 );
1284 i2InputFlush( pCh );
1288 // code duplicated from n_tty (ldisc)
1289 static inline void isig(int sig, struct tty_struct *tty, int flush)
1292 kill_pgrp(tty->pgrp, sig, 1);
1293 if (flush || !L_NOFLSH(tty)) {
1294 if ( tty->ldisc.flush_buffer )
1295 tty->ldisc.flush_buffer(tty);
1296 i2InputFlush( tty->driver_data );
1300 static void do_status(struct work_struct *work)
1302 i2ChanStrPtr pCh = container_of(work, i2ChanStr, tqueue_status);
1305 status = i2GetStatus( pCh, (I2_BRK|I2_PAR|I2_FRA|I2_OVR) );
1307 ip2trace (CHANN, ITRC_STATUS, 21, 1, status );
1309 if (pCh->pTTY && (status & (I2_BRK|I2_PAR|I2_FRA|I2_OVR)) ) {
1310 if ( (status & I2_BRK) ) {
1311 // code duplicated from n_tty (ldisc)
1312 if (I_IGNBRK(pCh->pTTY))
1314 if (I_BRKINT(pCh->pTTY)) {
1315 isig(SIGINT, pCh->pTTY, 1);
1318 wake_up_interruptible(&pCh->pTTY->read_wait);
1320 #ifdef NEVER_HAPPENS_AS_SETUP_XXX
1321 // and can't work because we don't know the_char
1322 // as the_char is reported on a separate path
1323 // The intelligent board does this stuff as setup
1325 char brkf = TTY_NORMAL;
1326 unsigned char brkc = '\0';
1328 if ( (status & I2_BRK) ) {
1332 else if (status & I2_PAR) {
1335 } else if (status & I2_FRA) {
1338 } else if (status & I2_OVR) {
1342 tmp = pCh->pTTY->real_raw;
1343 pCh->pTTY->real_raw = 0;
1344 pCh->pTTY->ldisc.receive_buf( pCh->pTTY, &brkc, &brkf, 1 );
1345 pCh->pTTY->real_raw = tmp;
1347 #endif /* NEVER_HAPPENS_AS_SETUP_XXX */
1351 if ( status & (I2_DDCD | I2_DDSR | I2_DCTS | I2_DRI) ) {
1352 wake_up_interruptible(&pCh->delta_msr_wait);
1354 if ( (pCh->flags & ASYNC_CHECK_CD) && (status & I2_DDCD) ) {
1355 if ( status & I2_DCD ) {
1357 wake_up_interruptible ( &pCh->open_wait );
1360 if (pCh->pTTY && (!(pCh->pTTY->termios->c_cflag & CLOCAL)) ) {
1361 tty_hangup( pCh->pTTY );
1367 ip2trace (CHANN, ITRC_STATUS, 26, 0 );
1370 /******************************************************************************/
1371 /* Device Open/Close/Ioctl Entry Point Section */
1372 /******************************************************************************/
1374 /******************************************************************************/
1375 /* Function: open_sanity_check() */
1376 /* Parameters: Pointer to tty structure */
1377 /* Pointer to file structure */
1378 /* Returns: Success or failure */
1381 /* Verifies the structure magic numbers and cross links. */
1382 /******************************************************************************/
1383 #ifdef IP2DEBUG_OPEN
1385 open_sanity_check( i2ChanStrPtr pCh, i2eBordStrPtr pBrd )
1387 if ( pBrd->i2eValid != I2E_MAGIC ) {
1388 printk(KERN_ERR "IP2: invalid board structure\n" );
1389 } else if ( pBrd != pCh->pMyBord ) {
1390 printk(KERN_ERR "IP2: board structure pointer mismatch (%p)\n",
1392 } else if ( pBrd->i2eChannelCnt < pCh->port_index ) {
1393 printk(KERN_ERR "IP2: bad device index (%d)\n", pCh->port_index );
1394 } else if (&((i2ChanStrPtr)pBrd->i2eChannelPtr)[pCh->port_index] != pCh) {
1396 printk(KERN_INFO "IP2: all pointers check out!\n" );
1402 /******************************************************************************/
1403 /* Function: ip2_open() */
1404 /* Parameters: Pointer to tty structure */
1405 /* Pointer to file structure */
1406 /* Returns: Success or failure */
1408 /* Description: (MANDATORY) */
1409 /* A successful device open has to run a gauntlet of checks before it */
1410 /* completes. After some sanity checking and pointer setup, the function */
1411 /* blocks until all conditions are satisfied. It then initialises the port to */
1412 /* the default characteristics and returns. */
1413 /******************************************************************************/
1415 ip2_open( PTTY tty, struct file *pFile )
1420 i2ChanStrPtr pCh = DevTable[tty->index];
1422 ip2trace (tty->index, ITRC_OPEN, ITRC_ENTER, 0 );
1424 if ( pCh == NULL ) {
1427 /* Setup pointer links in device and tty structures */
1429 tty->driver_data = pCh;
1431 #ifdef IP2DEBUG_OPEN
1433 "IP2:open(tty=%p,pFile=%p):dev=%s,ch=%d,idx=%d\n",
1434 tty, pFile, tty->name, pCh->infl.hd.i2sChannel, pCh->port_index);
1435 open_sanity_check ( pCh, pCh->pMyBord );
1438 i2QueueCommands(PTYPE_INLINE, pCh, 100, 3, CMD_DTRUP,CMD_RTSUP,CMD_DCD_REP);
1439 pCh->dataSetOut |= (I2_DTR | I2_RTS);
1440 serviceOutgoingFifo( pCh->pMyBord );
1442 /* Block here until the port is ready (per serial and istallion) */
1444 * 1. If the port is in the middle of closing wait for the completion
1445 * and then return the appropriate error.
1447 init_waitqueue_entry(&wait, current);
1448 add_wait_queue(&pCh->close_wait, &wait);
1449 set_current_state( TASK_INTERRUPTIBLE );
1451 if ( tty_hung_up_p(pFile) || ( pCh->flags & ASYNC_CLOSING )) {
1452 if ( pCh->flags & ASYNC_CLOSING ) {
1455 if ( tty_hung_up_p(pFile) ) {
1456 set_current_state( TASK_RUNNING );
1457 remove_wait_queue(&pCh->close_wait, &wait);
1458 return( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EAGAIN : -ERESTARTSYS;
1461 set_current_state( TASK_RUNNING );
1462 remove_wait_queue(&pCh->close_wait, &wait);
1465 * 3. Handle a non-blocking open of a normal port.
1467 if ( (pFile->f_flags & O_NONBLOCK) || (tty->flags & (1<<TTY_IO_ERROR) )) {
1468 pCh->flags |= ASYNC_NORMAL_ACTIVE;
1472 * 4. Now loop waiting for the port to be free and carrier present
1475 if ( tty->termios->c_cflag & CLOCAL )
1478 #ifdef IP2DEBUG_OPEN
1479 printk(KERN_DEBUG "OpenBlock: do_clocal = %d\n", do_clocal);
1484 init_waitqueue_entry(&wait, current);
1485 add_wait_queue(&pCh->open_wait, &wait);
1488 i2QueueCommands(PTYPE_INLINE, pCh, 100, 2, CMD_DTRUP, CMD_RTSUP);
1489 pCh->dataSetOut |= (I2_DTR | I2_RTS);
1490 set_current_state( TASK_INTERRUPTIBLE );
1491 serviceOutgoingFifo( pCh->pMyBord );
1492 if ( tty_hung_up_p(pFile) ) {
1493 set_current_state( TASK_RUNNING );
1494 remove_wait_queue(&pCh->open_wait, &wait);
1495 return ( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EBUSY : -ERESTARTSYS;
1497 if (!(pCh->flags & ASYNC_CLOSING) &&
1498 (do_clocal || (pCh->dataSetIn & I2_DCD) )) {
1503 #ifdef IP2DEBUG_OPEN
1504 printk(KERN_DEBUG "ASYNC_CLOSING = %s\n",
1505 (pCh->flags & ASYNC_CLOSING)?"True":"False");
1506 printk(KERN_DEBUG "OpenBlock: waiting for CD or signal\n");
1508 ip2trace (CHANN, ITRC_OPEN, 3, 2, 0,
1509 (pCh->flags & ASYNC_CLOSING) );
1510 /* check for signal */
1511 if (signal_pending(current)) {
1512 rc = (( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EAGAIN : -ERESTARTSYS);
1517 set_current_state( TASK_RUNNING );
1518 remove_wait_queue(&pCh->open_wait, &wait);
1520 --pCh->wopen; //why count?
1522 ip2trace (CHANN, ITRC_OPEN, 4, 0 );
1527 pCh->flags |= ASYNC_NORMAL_ACTIVE;
1531 /* first open - Assign termios structure to port */
1532 if ( tty->count == 1 ) {
1533 i2QueueCommands(PTYPE_INLINE, pCh, 0, 2, CMD_CTSFL_DSAB, CMD_RTSFL_DSAB);
1534 /* Now we must send the termios settings to the loadware */
1535 set_params( pCh, NULL );
1539 * Now set any i2lib options. These may go away if the i2lib code ends
1540 * up rolled into the mainline.
1542 pCh->channelOptions |= CO_NBLOCK_WRITE;
1544 #ifdef IP2DEBUG_OPEN
1545 printk (KERN_DEBUG "IP2: open completed\n" );
1547 serviceOutgoingFifo( pCh->pMyBord );
1549 ip2trace (CHANN, ITRC_OPEN, ITRC_RETURN, 0 );
1554 /******************************************************************************/
1555 /* Function: ip2_close() */
1556 /* Parameters: Pointer to tty structure */
1557 /* Pointer to file structure */
1558 /* Returns: Nothing */
1563 /******************************************************************************/
1565 ip2_close( PTTY tty, struct file *pFile )
1567 i2ChanStrPtr pCh = tty->driver_data;
1573 ip2trace (CHANN, ITRC_CLOSE, ITRC_ENTER, 0 );
1575 #ifdef IP2DEBUG_OPEN
1576 printk(KERN_DEBUG "IP2:close %s:\n",tty->name);
1579 if ( tty_hung_up_p ( pFile ) ) {
1581 ip2trace (CHANN, ITRC_CLOSE, 2, 1, 2 );
1585 if ( tty->count > 1 ) { /* not the last close */
1587 ip2trace (CHANN, ITRC_CLOSE, 2, 1, 3 );
1591 pCh->flags |= ASYNC_CLOSING; // last close actually
1595 if (pCh->ClosingWaitTime != ASYNC_CLOSING_WAIT_NONE) {
1597 * Before we drop DTR, make sure the transmitter has completely drained.
1598 * This uses an timeout, after which the close
1601 ip2_wait_until_sent(tty, pCh->ClosingWaitTime );
1604 * At this point we stop accepting input. Here we flush the channel
1605 * input buffer which will allow the board to send up more data. Any
1606 * additional input is tossed at interrupt/poll time.
1608 i2InputFlush( pCh );
1610 /* disable DSS reporting */
1611 i2QueueCommands(PTYPE_INLINE, pCh, 100, 4,
1612 CMD_DCD_NREP, CMD_CTS_NREP, CMD_DSR_NREP, CMD_RI_NREP);
1613 if ( !tty || (tty->termios->c_cflag & HUPCL) ) {
1614 i2QueueCommands(PTYPE_INLINE, pCh, 100, 2, CMD_RTSDN, CMD_DTRDN);
1615 pCh->dataSetOut &= ~(I2_DTR | I2_RTS);
1616 i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_PAUSE(25));
1619 serviceOutgoingFifo ( pCh->pMyBord );
1621 tty_ldisc_flush(tty);
1622 tty_driver_flush_buffer(tty);
1628 if (pCh->ClosingDelay) {
1629 msleep_interruptible(jiffies_to_msecs(pCh->ClosingDelay));
1631 wake_up_interruptible(&pCh->open_wait);
1634 pCh->flags &=~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
1635 wake_up_interruptible(&pCh->close_wait);
1637 #ifdef IP2DEBUG_OPEN
1638 DBG_CNT("ip2_close: after wakeups--");
1642 ip2trace (CHANN, ITRC_CLOSE, ITRC_RETURN, 1, 1 );
1647 /******************************************************************************/
1648 /* Function: ip2_hangup() */
1649 /* Parameters: Pointer to tty structure */
1650 /* Returns: Nothing */
1655 /******************************************************************************/
1657 ip2_hangup ( PTTY tty )
1659 i2ChanStrPtr pCh = tty->driver_data;
1665 ip2trace (CHANN, ITRC_HANGUP, ITRC_ENTER, 0 );
1667 ip2_flush_buffer(tty);
1669 /* disable DSS reporting */
1671 i2QueueCommands(PTYPE_BYPASS, pCh, 0, 1, CMD_DCD_NREP);
1672 i2QueueCommands(PTYPE_INLINE, pCh, 0, 2, CMD_CTSFL_DSAB, CMD_RTSFL_DSAB);
1673 if ( (tty->termios->c_cflag & HUPCL) ) {
1674 i2QueueCommands(PTYPE_BYPASS, pCh, 0, 2, CMD_RTSDN, CMD_DTRDN);
1675 pCh->dataSetOut &= ~(I2_DTR | I2_RTS);
1676 i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_PAUSE(25));
1678 i2QueueCommands(PTYPE_INLINE, pCh, 1, 3,
1679 CMD_CTS_NREP, CMD_DSR_NREP, CMD_RI_NREP);
1680 serviceOutgoingFifo ( pCh->pMyBord );
1682 wake_up_interruptible ( &pCh->delta_msr_wait );
1684 pCh->flags &= ~ASYNC_NORMAL_ACTIVE;
1686 wake_up_interruptible ( &pCh->open_wait );
1688 ip2trace (CHANN, ITRC_HANGUP, ITRC_RETURN, 0 );
1691 /******************************************************************************/
1692 /******************************************************************************/
1693 /* Device Output Section */
1694 /******************************************************************************/
1695 /******************************************************************************/
1697 /******************************************************************************/
1698 /* Function: ip2_write() */
1699 /* Parameters: Pointer to tty structure */
1700 /* Flag denoting data is in user (1) or kernel (0) space */
1701 /* Pointer to data */
1702 /* Number of bytes to write */
1703 /* Returns: Number of bytes actually written */
1705 /* Description: (MANDATORY) */
1708 /******************************************************************************/
1710 ip2_write( PTTY tty, const unsigned char *pData, int count)
1712 i2ChanStrPtr pCh = tty->driver_data;
1714 unsigned long flags;
1716 ip2trace (CHANN, ITRC_WRITE, ITRC_ENTER, 2, count, -1 );
1718 /* Flush out any buffered data left over from ip2_putchar() calls. */
1719 ip2_flush_chars( tty );
1721 /* This is the actual move bit. Make sure it does what we need!!!!! */
1722 write_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1723 bytesSent = i2Output( pCh, pData, count);
1724 write_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1726 ip2trace (CHANN, ITRC_WRITE, ITRC_RETURN, 1, bytesSent );
1728 return bytesSent > 0 ? bytesSent : 0;
1731 /******************************************************************************/
1732 /* Function: ip2_putchar() */
1733 /* Parameters: Pointer to tty structure */
1734 /* Character to write */
1735 /* Returns: Nothing */
1740 /******************************************************************************/
1742 ip2_putchar( PTTY tty, unsigned char ch )
1744 i2ChanStrPtr pCh = tty->driver_data;
1745 unsigned long flags;
1747 // ip2trace (CHANN, ITRC_PUTC, ITRC_ENTER, 1, ch );
1749 write_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1750 pCh->Pbuf[pCh->Pbuf_stuff++] = ch;
1751 if ( pCh->Pbuf_stuff == sizeof pCh->Pbuf ) {
1752 write_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1753 ip2_flush_chars( tty );
1755 write_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1758 // ip2trace (CHANN, ITRC_PUTC, ITRC_RETURN, 1, ch );
1761 /******************************************************************************/
1762 /* Function: ip2_flush_chars() */
1763 /* Parameters: Pointer to tty structure */
1764 /* Returns: Nothing */
1768 /******************************************************************************/
1770 ip2_flush_chars( PTTY tty )
1773 i2ChanStrPtr pCh = tty->driver_data;
1774 unsigned long flags;
1776 write_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1777 if ( pCh->Pbuf_stuff ) {
1779 // ip2trace (CHANN, ITRC_PUTC, 10, 1, strip );
1782 // We may need to restart i2Output if it does not fullfill this request
1784 strip = i2Output( pCh, pCh->Pbuf, pCh->Pbuf_stuff);
1785 if ( strip != pCh->Pbuf_stuff ) {
1786 memmove( pCh->Pbuf, &pCh->Pbuf[strip], pCh->Pbuf_stuff - strip );
1788 pCh->Pbuf_stuff -= strip;
1790 write_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1793 /******************************************************************************/
1794 /* Function: ip2_write_room() */
1795 /* Parameters: Pointer to tty structure */
1796 /* Returns: Number of bytes that the driver can accept */
1800 /******************************************************************************/
1802 ip2_write_room ( PTTY tty )
1805 i2ChanStrPtr pCh = tty->driver_data;
1806 unsigned long flags;
1808 read_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1809 bytesFree = i2OutputFree( pCh ) - pCh->Pbuf_stuff;
1810 read_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1812 ip2trace (CHANN, ITRC_WRITE, 11, 1, bytesFree );
1814 return ((bytesFree > 0) ? bytesFree : 0);
1817 /******************************************************************************/
1818 /* Function: ip2_chars_in_buf() */
1819 /* Parameters: Pointer to tty structure */
1820 /* Returns: Number of bytes queued for transmission */
1825 /******************************************************************************/
1827 ip2_chars_in_buf ( PTTY tty )
1829 i2ChanStrPtr pCh = tty->driver_data;
1831 unsigned long flags;
1833 ip2trace (CHANN, ITRC_WRITE, 12, 1, pCh->Obuf_char_count + pCh->Pbuf_stuff );
1835 #ifdef IP2DEBUG_WRITE
1836 printk (KERN_DEBUG "IP2: chars in buffer = %d (%d,%d)\n",
1837 pCh->Obuf_char_count + pCh->Pbuf_stuff,
1838 pCh->Obuf_char_count, pCh->Pbuf_stuff );
1840 read_lock_irqsave(&pCh->Obuf_spinlock, flags);
1841 rc = pCh->Obuf_char_count;
1842 read_unlock_irqrestore(&pCh->Obuf_spinlock, flags);
1843 read_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1844 rc += pCh->Pbuf_stuff;
1845 read_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1849 /******************************************************************************/
1850 /* Function: ip2_flush_buffer() */
1851 /* Parameters: Pointer to tty structure */
1852 /* Returns: Nothing */
1857 /******************************************************************************/
1859 ip2_flush_buffer( PTTY tty )
1861 i2ChanStrPtr pCh = tty->driver_data;
1862 unsigned long flags;
1864 ip2trace (CHANN, ITRC_FLUSH, ITRC_ENTER, 0 );
1866 #ifdef IP2DEBUG_WRITE
1867 printk (KERN_DEBUG "IP2: flush buffer\n" );
1869 write_lock_irqsave(&pCh->Pbuf_spinlock, flags);
1870 pCh->Pbuf_stuff = 0;
1871 write_unlock_irqrestore(&pCh->Pbuf_spinlock, flags);
1872 i2FlushOutput( pCh );
1875 ip2trace (CHANN, ITRC_FLUSH, ITRC_RETURN, 0 );
1879 /******************************************************************************/
1880 /* Function: ip2_wait_until_sent() */
1881 /* Parameters: Pointer to tty structure */
1882 /* Timeout for wait. */
1883 /* Returns: Nothing */
1886 /* This function is used in place of the normal tty_wait_until_sent, which */
1887 /* only waits for the driver buffers to be empty (or rather, those buffers */
1888 /* reported by chars_in_buffer) which doesn't work for IP2 due to the */
1889 /* indeterminate number of bytes buffered on the board. */
1890 /******************************************************************************/
1892 ip2_wait_until_sent ( PTTY tty, int timeout )
1895 i2ChanStrPtr pCh = tty->driver_data;
1897 tty_wait_until_sent(tty, timeout );
1898 if ( (i = timeout - (jiffies -i)) > 0)
1899 i2DrainOutput( pCh, i );
1902 /******************************************************************************/
1903 /******************************************************************************/
1904 /* Device Input Section */
1905 /******************************************************************************/
1906 /******************************************************************************/
1908 /******************************************************************************/
1909 /* Function: ip2_throttle() */
1910 /* Parameters: Pointer to tty structure */
1911 /* Returns: Nothing */
1916 /******************************************************************************/
1918 ip2_throttle ( PTTY tty )
1920 i2ChanStrPtr pCh = tty->driver_data;
1922 #ifdef IP2DEBUG_READ
1923 printk (KERN_DEBUG "IP2: throttle\n" );
1926 * Signal the poll/interrupt handlers not to forward incoming data to
1927 * the line discipline. This will cause the buffers to fill up in the
1928 * library and thus cause the library routines to send the flow control
1934 /******************************************************************************/
1935 /* Function: ip2_unthrottle() */
1936 /* Parameters: Pointer to tty structure */
1937 /* Returns: Nothing */
1942 /******************************************************************************/
1944 ip2_unthrottle ( PTTY tty )
1946 i2ChanStrPtr pCh = tty->driver_data;
1947 unsigned long flags;
1949 #ifdef IP2DEBUG_READ
1950 printk (KERN_DEBUG "IP2: unthrottle\n" );
1953 /* Pass incoming data up to the line discipline again. */
1955 i2QueueCommands(PTYPE_BYPASS, pCh, 0, 1, CMD_RESUME);
1956 serviceOutgoingFifo( pCh->pMyBord );
1957 read_lock_irqsave(&pCh->Ibuf_spinlock, flags);
1958 if ( pCh->Ibuf_stuff != pCh->Ibuf_strip ) {
1959 read_unlock_irqrestore(&pCh->Ibuf_spinlock, flags);
1960 #ifdef IP2DEBUG_READ
1961 printk (KERN_DEBUG "i2Input called from unthrottle\n" );
1965 read_unlock_irqrestore(&pCh->Ibuf_spinlock, flags);
1969 ip2_start ( PTTY tty )
1971 i2ChanStrPtr pCh = DevTable[tty->index];
1973 i2QueueCommands(PTYPE_BYPASS, pCh, 0, 1, CMD_RESUME);
1974 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_UNSUSPEND);
1975 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_RESUME);
1976 #ifdef IP2DEBUG_WRITE
1977 printk (KERN_DEBUG "IP2: start tx\n" );
1982 ip2_stop ( PTTY tty )
1984 i2ChanStrPtr pCh = DevTable[tty->index];
1986 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_SUSPEND);
1987 #ifdef IP2DEBUG_WRITE
1988 printk (KERN_DEBUG "IP2: stop tx\n" );
1992 /******************************************************************************/
1993 /* Device Ioctl Section */
1994 /******************************************************************************/
1996 static int ip2_tiocmget(struct tty_struct *tty, struct file *file)
1998 i2ChanStrPtr pCh = DevTable[tty->index];
1999 #ifdef ENABLE_DSSNOW
2007 FIXME - the following code is causing a NULL pointer dereference in
2008 2.3.51 in an interrupt handler. It's suppose to prompt the board
2009 to return the DSS signal status immediately. Why doesn't it do
2010 the same thing in 2.2.14?
2013 /* This thing is still busted in the 1.2.12 driver on 2.4.x
2014 and even hoses the serial console so the oops can be trapped.
2017 #ifdef ENABLE_DSSNOW
2018 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DSS_NOW);
2020 init_waitqueue_entry(&wait, current);
2021 add_wait_queue(&pCh->dss_now_wait, &wait);
2022 set_current_state( TASK_INTERRUPTIBLE );
2024 serviceOutgoingFifo( pCh->pMyBord );
2028 set_current_state( TASK_RUNNING );
2029 remove_wait_queue(&pCh->dss_now_wait, &wait);
2031 if (signal_pending(current)) {
2035 return ((pCh->dataSetOut & I2_RTS) ? TIOCM_RTS : 0)
2036 | ((pCh->dataSetOut & I2_DTR) ? TIOCM_DTR : 0)
2037 | ((pCh->dataSetIn & I2_DCD) ? TIOCM_CAR : 0)
2038 | ((pCh->dataSetIn & I2_RI) ? TIOCM_RNG : 0)
2039 | ((pCh->dataSetIn & I2_DSR) ? TIOCM_DSR : 0)
2040 | ((pCh->dataSetIn & I2_CTS) ? TIOCM_CTS : 0);
2043 static int ip2_tiocmset(struct tty_struct *tty, struct file *file,
2044 unsigned int set, unsigned int clear)
2046 i2ChanStrPtr pCh = DevTable[tty->index];
2051 if (set & TIOCM_RTS) {
2052 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_RTSUP);
2053 pCh->dataSetOut |= I2_RTS;
2055 if (set & TIOCM_DTR) {
2056 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DTRUP);
2057 pCh->dataSetOut |= I2_DTR;
2060 if (clear & TIOCM_RTS) {
2061 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_RTSDN);
2062 pCh->dataSetOut &= ~I2_RTS;
2064 if (clear & TIOCM_DTR) {
2065 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DTRDN);
2066 pCh->dataSetOut &= ~I2_DTR;
2068 serviceOutgoingFifo( pCh->pMyBord );
2072 /******************************************************************************/
2073 /* Function: ip2_ioctl() */
2074 /* Parameters: Pointer to tty structure */
2075 /* Pointer to file structure */
2078 /* Returns: Success or failure */
2083 /******************************************************************************/
2085 ip2_ioctl ( PTTY tty, struct file *pFile, UINT cmd, ULONG arg )
2088 i2ChanStrPtr pCh = DevTable[tty->index];
2090 struct async_icount cprev, cnow; /* kernel counter temps */
2091 struct serial_icounter_struct __user *p_cuser;
2093 unsigned long flags;
2094 void __user *argp = (void __user *)arg;
2101 ip2trace (CHANN, ITRC_IOCTL, ITRC_ENTER, 2, cmd, arg );
2103 #ifdef IP2DEBUG_IOCTL
2104 printk(KERN_DEBUG "IP2: ioctl cmd (%x), arg (%lx)\n", cmd, arg );
2110 ip2trace (CHANN, ITRC_IOCTL, 2, 1, rc );
2112 rc = get_serial_info(pCh, argp);
2119 ip2trace (CHANN, ITRC_IOCTL, 3, 1, rc );
2121 rc = set_serial_info(pCh, argp);
2127 rc = tty_check_change(tty);
2132 //return -ENOIOCTLCMD;
2135 //return -ENOIOCTLCMD;
2138 if (STOP_CHAR(tty) != __DISABLED_CHAR) {
2139 i2QueueCommands( PTYPE_BYPASS, pCh, 100, 1,
2140 CMD_XMIT_NOW(STOP_CHAR(tty)));
2144 if (START_CHAR(tty) != __DISABLED_CHAR) {
2145 i2QueueCommands( PTYPE_BYPASS, pCh, 100, 1,
2146 CMD_XMIT_NOW(START_CHAR(tty)));
2154 case TCSBRK: /* SVID version: non-zero arg --> no break */
2155 rc = tty_check_change(tty);
2157 ip2trace (CHANN, ITRC_IOCTL, 4, 1, rc );
2160 ip2_wait_until_sent(tty,0);
2162 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_SEND_BRK(250));
2163 serviceOutgoingFifo( pCh->pMyBord );
2168 case TCSBRKP: /* support for POSIX tcsendbreak() */
2169 rc = tty_check_change(tty);
2171 ip2trace (CHANN, ITRC_IOCTL, 5, 1, rc );
2174 ip2_wait_until_sent(tty,0);
2175 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1,
2176 CMD_SEND_BRK(arg ? arg*100 : 250));
2177 serviceOutgoingFifo ( pCh->pMyBord );
2183 ip2trace (CHANN, ITRC_IOCTL, 6, 1, rc );
2185 rc = put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long __user *)argp);
2192 ip2trace (CHANN, ITRC_IOCTL, 7, 1, rc );
2194 rc = get_user(arg,(unsigned long __user *) argp);
2197 tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL)
2198 | (arg ? CLOCAL : 0));
2203 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change - mask
2204 * passed in arg for lines of interest (use |'ed TIOCM_RNG/DSR/CD/CTS
2205 * for masking). Caller should use TIOCGICOUNT to see which one it was
2208 write_lock_irqsave(&pB->read_fifo_spinlock, flags);
2209 cprev = pCh->icount; /* note the counters on entry */
2210 write_unlock_irqrestore(&pB->read_fifo_spinlock, flags);
2211 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 4,
2212 CMD_DCD_REP, CMD_CTS_REP, CMD_DSR_REP, CMD_RI_REP);
2213 init_waitqueue_entry(&wait, current);
2214 add_wait_queue(&pCh->delta_msr_wait, &wait);
2215 set_current_state( TASK_INTERRUPTIBLE );
2217 serviceOutgoingFifo( pCh->pMyBord );
2219 ip2trace (CHANN, ITRC_IOCTL, 10, 0 );
2223 ip2trace (CHANN, ITRC_IOCTL, 11, 0 );
2225 /* see if a signal did it */
2226 if (signal_pending(current)) {
2230 write_lock_irqsave(&pB->read_fifo_spinlock, flags);
2231 cnow = pCh->icount; /* atomic copy */
2232 write_unlock_irqrestore(&pB->read_fifo_spinlock, flags);
2233 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
2234 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) {
2235 rc = -EIO; /* no change => rc */
2238 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
2239 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
2240 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
2241 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
2247 set_current_state( TASK_RUNNING );
2248 remove_wait_queue(&pCh->delta_msr_wait, &wait);
2250 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 3,
2251 CMD_CTS_NREP, CMD_DSR_NREP, CMD_RI_NREP);
2252 if ( ! (pCh->flags & ASYNC_CHECK_CD)) {
2253 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DCD_NREP);
2255 serviceOutgoingFifo( pCh->pMyBord );
2260 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
2261 * Return: write counters to the user passed counter struct
2262 * NB: both 1->0 and 0->1 transitions are counted except for RI where
2263 * only 0->1 is counted. The controller is quite capable of counting
2264 * both, but this done to preserve compatibility with the standard
2268 ip2trace (CHANN, ITRC_IOCTL, 11, 1, rc );
2270 write_lock_irqsave(&pB->read_fifo_spinlock, flags);
2272 write_unlock_irqrestore(&pB->read_fifo_spinlock, flags);
2274 rc = put_user(cnow.cts, &p_cuser->cts);
2275 rc = put_user(cnow.dsr, &p_cuser->dsr);
2276 rc = put_user(cnow.rng, &p_cuser->rng);
2277 rc = put_user(cnow.dcd, &p_cuser->dcd);
2278 rc = put_user(cnow.rx, &p_cuser->rx);
2279 rc = put_user(cnow.tx, &p_cuser->tx);
2280 rc = put_user(cnow.frame, &p_cuser->frame);
2281 rc = put_user(cnow.overrun, &p_cuser->overrun);
2282 rc = put_user(cnow.parity, &p_cuser->parity);
2283 rc = put_user(cnow.brk, &p_cuser->brk);
2284 rc = put_user(cnow.buf_overrun, &p_cuser->buf_overrun);
2288 * The rest are not supported by this driver. By returning -ENOIOCTLCMD they
2289 * will be passed to the line discipline for it to handle.
2295 case TIOCSERGSTRUCT:
2296 case TIOCSERGETMULTI:
2297 case TIOCSERSETMULTI:
2300 ip2trace (CHANN, ITRC_IOCTL, 12, 0 );
2306 ip2trace (CHANN, ITRC_IOCTL, ITRC_RETURN, 0 );
2311 /******************************************************************************/
2312 /* Function: GetSerialInfo() */
2313 /* Parameters: Pointer to channel structure */
2314 /* Pointer to old termios structure */
2315 /* Returns: Nothing */
2318 /* This is to support the setserial command, and requires processing of the */
2319 /* standard Linux serial structure. */
2320 /******************************************************************************/
2322 get_serial_info ( i2ChanStrPtr pCh, struct serial_struct __user *retinfo )
2324 struct serial_struct tmp;
2326 memset ( &tmp, 0, sizeof(tmp) );
2327 tmp.type = pCh->pMyBord->channelBtypes.bid_value[(pCh->port_index & (IP2_PORTS_PER_BOARD-1))/16];
2328 if (BID_HAS_654(tmp.type)) {
2329 tmp.type = PORT_16650;
2331 tmp.type = PORT_CIRRUS;
2333 tmp.line = pCh->port_index;
2334 tmp.port = pCh->pMyBord->i2eBase;
2335 tmp.irq = ip2config.irq[pCh->port_index/64];
2336 tmp.flags = pCh->flags;
2337 tmp.baud_base = pCh->BaudBase;
2338 tmp.close_delay = pCh->ClosingDelay;
2339 tmp.closing_wait = pCh->ClosingWaitTime;
2340 tmp.custom_divisor = pCh->BaudDivisor;
2341 return copy_to_user(retinfo,&tmp,sizeof(*retinfo));
2344 /******************************************************************************/
2345 /* Function: SetSerialInfo() */
2346 /* Parameters: Pointer to channel structure */
2347 /* Pointer to old termios structure */
2348 /* Returns: Nothing */
2351 /* This function provides support for setserial, which uses the TIOCSSERIAL */
2352 /* ioctl. Not all setserial parameters are relevant. If the user attempts to */
2353 /* change the IRQ, address or type of the port the ioctl fails. */
2354 /******************************************************************************/
2356 set_serial_info( i2ChanStrPtr pCh, struct serial_struct __user *new_info )
2358 struct serial_struct ns;
2359 int old_flags, old_baud_divisor;
2361 if (copy_from_user(&ns, new_info, sizeof (ns)))
2365 * We don't allow setserial to change IRQ, board address, type or baud
2366 * base. Also line nunber as such is meaningless but we use it for our
2367 * array index so it is fixed also.
2369 if ( (ns.irq != ip2config.irq[pCh->port_index])
2370 || ((int) ns.port != ((int) (pCh->pMyBord->i2eBase)))
2371 || (ns.baud_base != pCh->BaudBase)
2372 || (ns.line != pCh->port_index) ) {
2376 old_flags = pCh->flags;
2377 old_baud_divisor = pCh->BaudDivisor;
2379 if ( !capable(CAP_SYS_ADMIN) ) {
2380 if ( ( ns.close_delay != pCh->ClosingDelay ) ||
2381 ( (ns.flags & ~ASYNC_USR_MASK) !=
2382 (pCh->flags & ~ASYNC_USR_MASK) ) ) {
2386 pCh->flags = (pCh->flags & ~ASYNC_USR_MASK) |
2387 (ns.flags & ASYNC_USR_MASK);
2388 pCh->BaudDivisor = ns.custom_divisor;
2390 pCh->flags = (pCh->flags & ~ASYNC_FLAGS) |
2391 (ns.flags & ASYNC_FLAGS);
2392 pCh->BaudDivisor = ns.custom_divisor;
2393 pCh->ClosingDelay = ns.close_delay * HZ/100;
2394 pCh->ClosingWaitTime = ns.closing_wait * HZ/100;
2397 if ( ( (old_flags & ASYNC_SPD_MASK) != (pCh->flags & ASYNC_SPD_MASK) )
2398 || (old_baud_divisor != pCh->BaudDivisor) ) {
2399 // Invalidate speed and reset parameters
2400 set_params( pCh, NULL );
2406 /******************************************************************************/
2407 /* Function: ip2_set_termios() */
2408 /* Parameters: Pointer to tty structure */
2409 /* Pointer to old termios structure */
2410 /* Returns: Nothing */
2415 /******************************************************************************/
2417 ip2_set_termios( PTTY tty, struct ktermios *old_termios )
2419 i2ChanStrPtr pCh = (i2ChanStrPtr)tty->driver_data;
2421 #ifdef IP2DEBUG_IOCTL
2422 printk (KERN_DEBUG "IP2: set termios %p\n", old_termios );
2425 set_params( pCh, old_termios );
2428 /******************************************************************************/
2429 /* Function: ip2_set_line_discipline() */
2430 /* Parameters: Pointer to tty structure */
2431 /* Returns: Nothing */
2433 /* Description: Does nothing */
2436 /******************************************************************************/
2438 ip2_set_line_discipline ( PTTY tty )
2440 #ifdef IP2DEBUG_IOCTL
2441 printk (KERN_DEBUG "IP2: set line discipline\n" );
2444 ip2trace (((i2ChanStrPtr)tty->driver_data)->port_index, ITRC_IOCTL, 16, 0 );
2448 /******************************************************************************/
2449 /* Function: SetLine Characteristics() */
2450 /* Parameters: Pointer to channel structure */
2451 /* Returns: Nothing */
2454 /* This routine is called to update the channel structure with the new line */
2455 /* characteristics, and send the appropriate commands to the board when they */
2457 /******************************************************************************/
2459 set_params( i2ChanStrPtr pCh, struct ktermios *o_tios )
2461 tcflag_t cflag, iflag, lflag;
2462 char stop_char, start_char;
2463 struct ktermios dummy;
2465 lflag = pCh->pTTY->termios->c_lflag;
2466 cflag = pCh->pTTY->termios->c_cflag;
2467 iflag = pCh->pTTY->termios->c_iflag;
2469 if (o_tios == NULL) {
2470 dummy.c_lflag = ~lflag;
2471 dummy.c_cflag = ~cflag;
2472 dummy.c_iflag = ~iflag;
2477 switch ( cflag & CBAUD ) {
2479 i2QueueCommands( PTYPE_BYPASS, pCh, 100, 2, CMD_RTSDN, CMD_DTRDN);
2480 pCh->dataSetOut &= ~(I2_DTR | I2_RTS);
2481 i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_PAUSE(25));
2482 pCh->pTTY->termios->c_cflag |= (CBAUD & o_tios->c_cflag);
2487 * This is the speed that is overloaded with all the other high
2488 * speeds, depending upon the flag settings.
2490 if ( ( pCh->flags & ASYNC_SPD_MASK ) == ASYNC_SPD_HI ) {
2491 pCh->speed = CBR_57600;
2492 } else if ( (pCh->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI ) {
2493 pCh->speed = CBR_115200;
2494 } else if ( (pCh->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST ) {
2495 pCh->speed = CBR_C1;
2497 pCh->speed = CBR_38400;
2500 case B50: pCh->speed = CBR_50; break;
2501 case B75: pCh->speed = CBR_75; break;
2502 case B110: pCh->speed = CBR_110; break;
2503 case B134: pCh->speed = CBR_134; break;
2504 case B150: pCh->speed = CBR_150; break;
2505 case B200: pCh->speed = CBR_200; break;
2506 case B300: pCh->speed = CBR_300; break;
2507 case B600: pCh->speed = CBR_600; break;
2508 case B1200: pCh->speed = CBR_1200; break;
2509 case B1800: pCh->speed = CBR_1800; break;
2510 case B2400: pCh->speed = CBR_2400; break;
2511 case B4800: pCh->speed = CBR_4800; break;
2512 case B9600: pCh->speed = CBR_9600; break;
2513 case B19200: pCh->speed = CBR_19200; break;
2514 case B57600: pCh->speed = CBR_57600; break;
2515 case B115200: pCh->speed = CBR_115200; break;
2516 case B153600: pCh->speed = CBR_153600; break;
2517 case B230400: pCh->speed = CBR_230400; break;
2518 case B307200: pCh->speed = CBR_307200; break;
2519 case B460800: pCh->speed = CBR_460800; break;
2520 case B921600: pCh->speed = CBR_921600; break;
2521 default: pCh->speed = CBR_9600; break;
2523 if ( pCh->speed == CBR_C1 ) {
2524 // Process the custom speed parameters.
2525 int bps = pCh->BaudBase / pCh->BaudDivisor;
2526 if ( bps == 921600 ) {
2527 pCh->speed = CBR_921600;
2530 i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_BAUD_DEF1(bps) );
2533 i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_SETBAUD(pCh->speed));
2535 i2QueueCommands ( PTYPE_INLINE, pCh, 100, 2, CMD_DTRUP, CMD_RTSUP);
2536 pCh->dataSetOut |= (I2_DTR | I2_RTS);
2538 if ( (CSTOPB & cflag) ^ (CSTOPB & o_tios->c_cflag))
2540 i2QueueCommands ( PTYPE_INLINE, pCh, 100, 1,
2541 CMD_SETSTOP( ( cflag & CSTOPB ) ? CST_2 : CST_1));
2543 if (((PARENB|PARODD) & cflag) ^ ((PARENB|PARODD) & o_tios->c_cflag))
2545 i2QueueCommands ( PTYPE_INLINE, pCh, 100, 1,
2547 (cflag & PARENB ? (cflag & PARODD ? CSP_OD : CSP_EV) : CSP_NP)
2551 /* byte size and parity */
2552 if ( (CSIZE & cflag)^(CSIZE & o_tios->c_cflag))
2555 switch ( cflag & CSIZE ) {
2556 case CS5: datasize = CSZ_5; break;
2557 case CS6: datasize = CSZ_6; break;
2558 case CS7: datasize = CSZ_7; break;
2559 case CS8: datasize = CSZ_8; break;
2560 default: datasize = CSZ_5; break; /* as per serial.c */
2562 i2QueueCommands ( PTYPE_INLINE, pCh, 100, 1, CMD_SETBITS(datasize) );
2564 /* Process CTS flow control flag setting */
2565 if ( (cflag & CRTSCTS) ) {
2566 i2QueueCommands(PTYPE_INLINE, pCh, 100,
2567 2, CMD_CTSFL_ENAB, CMD_RTSFL_ENAB);
2569 i2QueueCommands(PTYPE_INLINE, pCh, 100,
2570 2, CMD_CTSFL_DSAB, CMD_RTSFL_DSAB);
2573 // Process XON/XOFF flow control flags settings
2575 stop_char = STOP_CHAR(pCh->pTTY);
2576 start_char = START_CHAR(pCh->pTTY);
2578 //////////// can't be \000
2579 if (stop_char == __DISABLED_CHAR )
2581 stop_char = ~__DISABLED_CHAR;
2583 if (start_char == __DISABLED_CHAR )
2585 start_char = ~__DISABLED_CHAR;
2587 /////////////////////////////////
2589 if ( o_tios->c_cc[VSTART] != start_char )
2591 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DEF_IXON(start_char));
2592 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DEF_OXON(start_char));
2594 if ( o_tios->c_cc[VSTOP] != stop_char )
2596 i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DEF_IXOFF(stop_char));
2597 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DEF_OXOFF(stop_char));
2599 if (stop_char == __DISABLED_CHAR )
2601 stop_char = ~__DISABLED_CHAR; //TEST123
2604 if ((iflag & (IXOFF))^(o_tios->c_iflag & (IXOFF)))
2606 if ( iflag & IXOFF ) { // Enable XOFF output flow control
2607 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_OXON_OPT(COX_XON));
2608 } else { // Disable XOFF output flow control
2610 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_OXON_OPT(COX_NONE));
2613 if (start_char == __DISABLED_CHAR )
2617 if ((iflag & (IXON|IXANY)) ^ (o_tios->c_iflag & (IXON|IXANY)))
2619 if ( iflag & IXON ) {
2620 if ( iflag & IXANY ) { // Enable XON/XANY output flow control
2621 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_IXON_OPT(CIX_XANY));
2622 } else { // Enable XON output flow control
2623 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_IXON_OPT(CIX_XON));
2625 } else { // Disable XON output flow control
2627 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_IXON_OPT(CIX_NONE));
2630 if ( (iflag & ISTRIP) ^ ( o_tios->c_iflag & (ISTRIP)) )
2632 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1,
2633 CMD_ISTRIP_OPT((iflag & ISTRIP ? 1 : 0)));
2635 if ( (iflag & INPCK) ^ ( o_tios->c_iflag & (INPCK)) )
2637 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1,
2638 CMD_PARCHK((iflag & INPCK) ? CPK_ENAB : CPK_DSAB));
2641 if ( (iflag & (IGNBRK|PARMRK|BRKINT|IGNPAR))
2642 ^ ( o_tios->c_iflag & (IGNBRK|PARMRK|BRKINT|IGNPAR)) )
2647 if ( iflag & IGNBRK ) { /* Ignore breaks altogether */
2648 /* Ignore breaks altogether */
2649 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_BRK_NREP);
2651 if ( iflag & BRKINT ) {
2652 if ( iflag & PARMRK ) {
2653 brkrpt = 0x0a; // exception an inline triple
2655 brkrpt = 0x1a; // exception and NULL
2657 brkrpt |= 0x04; // flush input
2659 if ( iflag & PARMRK ) {
2660 brkrpt = 0x0b; //POSIX triple \0377 \0 \0
2662 brkrpt = 0x01; // Null only
2665 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_BRK_REP(brkrpt));
2668 if (iflag & IGNPAR) {
2670 /* would be 2 for not cirrus bug */
2671 /* would be 0x20 cept for cirrus bug */
2673 if ( iflag & PARMRK ) {
2675 * Replace error characters with 3-byte sequence (\0377,\0,char)
2678 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_ISTRIP_OPT((char)0));
2683 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_SET_ERROR(parrpt));
2685 if (cflag & CLOCAL) {
2686 // Status reporting fails for DCD if this is off
2687 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DCD_NREP);
2688 pCh->flags &= ~ASYNC_CHECK_CD;
2690 i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DCD_REP);
2691 pCh->flags |= ASYNC_CHECK_CD;
2695 i2DrainOutput( pCh, 100 );
2698 /******************************************************************************/
2699 /* IPL Device Section */
2700 /******************************************************************************/
2702 /******************************************************************************/
2703 /* Function: ip2_ipl_read() */
2704 /* Parameters: Pointer to device inode */
2705 /* Pointer to file structure */
2706 /* Pointer to data */
2707 /* Number of bytes to read */
2708 /* Returns: Success or failure */
2710 /* Description: Ugly */
2713 /******************************************************************************/
2717 ip2_ipl_read(struct file *pFile, char __user *pData, size_t count, loff_t *off )
2719 unsigned int minor = iminor(pFile->f_path.dentry->d_inode);
2723 printk (KERN_DEBUG "IP2IPL: read %p, %d bytes\n", pData, count );
2727 case 0: // IPL device
2730 case 1: // Status dump
2733 case 2: // Ping device
2736 case 3: // Trace device
2737 rc = DumpTraceBuffer ( pData, count );
2739 case 4: // Trace device
2740 rc = DumpFifoBuffer ( pData, count );
2750 DumpFifoBuffer ( char __user *pData, int count )
2754 rc = copy_to_user(pData, DBGBuf, count);
2756 printk(KERN_DEBUG "Last index %d\n", I );
2759 #endif /* DEBUG_FIFO */
2764 DumpTraceBuffer ( char __user *pData, int count )
2766 #ifdef IP2DEBUG_TRACE
2770 int *pIndex = (int __user *)pData;
2772 if ( count < (sizeof(int) * 6) ) {
2775 rc = put_user(tracewrap, pIndex );
2776 rc = put_user(TRACEMAX, ++pIndex );
2777 rc = put_user(tracestrip, ++pIndex );
2778 rc = put_user(tracestuff, ++pIndex );
2779 pData += sizeof(int) * 6;
2780 count -= sizeof(int) * 6;
2782 dumpcount = tracestuff - tracestrip;
2783 if ( dumpcount < 0 ) {
2784 dumpcount += TRACEMAX;
2786 if ( dumpcount > count ) {
2789 chunk = TRACEMAX - tracestrip;
2790 if ( dumpcount > chunk ) {
2791 rc = copy_to_user(pData, &tracebuf[tracestrip],
2792 chunk * sizeof(tracebuf[0]) );
2793 pData += chunk * sizeof(tracebuf[0]);
2795 chunk = dumpcount - chunk;
2799 rc = copy_to_user(pData, &tracebuf[tracestrip],
2800 chunk * sizeof(tracebuf[0]) );
2801 tracestrip += chunk;
2804 rc = put_user(tracestrip, ++pIndex );
2805 rc = put_user(tracestuff, ++pIndex );
2813 /******************************************************************************/
2814 /* Function: ip2_ipl_write() */
2816 /* Pointer to file structure */
2817 /* Pointer to data */
2818 /* Number of bytes to write */
2819 /* Returns: Success or failure */
2824 /******************************************************************************/
2826 ip2_ipl_write(struct file *pFile, const char __user *pData, size_t count, loff_t *off)
2829 printk (KERN_DEBUG "IP2IPL: write %p, %d bytes\n", pData, count );
2834 /******************************************************************************/
2835 /* Function: ip2_ipl_ioctl() */
2836 /* Parameters: Pointer to device inode */
2837 /* Pointer to file structure */
2840 /* Returns: Success or failure */
2845 /******************************************************************************/
2847 ip2_ipl_ioctl ( struct inode *pInode, struct file *pFile, UINT cmd, ULONG arg )
2849 unsigned int iplminor = iminor(pInode);
2851 void __user *argp = (void __user *)arg;
2852 ULONG __user *pIndex = argp;
2853 i2eBordStrPtr pB = i2BoardPtrTable[iplminor / 4];
2857 printk (KERN_DEBUG "IP2IPL: ioctl cmd %d, arg %ld\n", cmd, arg );
2860 switch ( iplminor ) {
2861 case 0: // IPL device
2864 case 1: // Status dump
2869 case 64: /* Driver - ip2stat */
2870 rc = put_user(ip2_tty_driver->refcount, pIndex++ );
2871 rc = put_user(irq_counter, pIndex++ );
2872 rc = put_user(bh_counter, pIndex++ );
2875 case 65: /* Board - ip2stat */
2877 rc = copy_to_user(argp, pB, sizeof(i2eBordStr));
2878 rc = put_user(inb(pB->i2eStatus),
2879 (ULONG __user *)(arg + (ULONG)(&pB->i2eStatus) - (ULONG)pB ) );