2 * Copyright 2003 Digi International (www.digi.com)
3 * Scott H Kilau <Scott_Kilau at digi dot com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
12 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13 * PURPOSE. See the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 * NOTE TO LINUX KERNEL HACKERS: DO NOT REFORMAT THIS CODE!
22 * This is shared code between Digi's CVS archive and the
23 * Linux Kernel sources.
24 * Changing the source just for reformatting needlessly breaks
25 * our CVS diff history.
27 * Send any bug fixes/changes to: Eng.Linux at digi dot com.
33 #include <linux/kernel.h>
34 #include <linux/version.h>
35 #include <linux/module.h>
36 #include <linux/pci.h>
37 #include <linux/slab.h>
39 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)
40 #include <linux/sched.h>
43 #include "dgnc_driver.h"
45 #include "dpacompat.h"
46 #include "dgnc_mgmt.h"
48 #include "dgnc_trace.h"
51 #include "dgnc_sysfs.h"
53 MODULE_LICENSE("GPL");
54 MODULE_AUTHOR("Digi International, http://www.digi.com");
55 MODULE_DESCRIPTION("Driver for the Digi International Neo and Classic PCI based product line");
56 MODULE_SUPPORTED_DEVICE("dgnc");
59 * insmod command line overrideable parameters
61 * NOTE: we use a set of macros to create the variables, which allows
62 * us to specify the variable type, name, initial value, and description.
64 PARM_INT(debug, 0x00, 0644, "Driver debugging level");
65 PARM_INT(rawreadok, 1, 0644, "Bypass flip buffers on input");
66 PARM_INT(trcbuf_size, 0x100000, 0644, "Debugging trace buffer size.");
68 /**************************************************************************
70 * protos for this file
73 static int dgnc_start(void);
74 static int dgnc_finalize_board_init(struct board_t *brd);
75 static void dgnc_init_globals(void);
76 static int dgnc_found_board(struct pci_dev *pdev, int id);
77 static void dgnc_cleanup_board(struct board_t *brd);
78 static void dgnc_poll_handler(ulong dummy);
79 static int dgnc_init_pci(void);
80 static int dgnc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
81 static void dgnc_remove_one(struct pci_dev *dev);
82 static int dgnc_probe1(struct pci_dev *pdev, int card_type);
83 static void dgnc_do_remap(struct board_t *brd);
85 /* Driver load/unload functions */
86 int dgnc_init_module(void);
87 void dgnc_cleanup_module(void);
89 module_init(dgnc_init_module);
90 module_exit(dgnc_cleanup_module);
94 * File operations permitted on Control/Management major.
96 static struct file_operations dgnc_BoardFops =
99 .unlocked_ioctl = dgnc_mgmt_ioctl,
100 .open = dgnc_mgmt_open,
101 .release = dgnc_mgmt_close
109 struct board_t *dgnc_Board[MAXBOARDS];
110 DEFINE_SPINLOCK(dgnc_global_lock);
111 int dgnc_driver_state = DRIVER_INITIALIZED;
112 ulong dgnc_poll_counter;
114 int dgnc_poll_tick = 20; /* Poll interval - 20 ms */
119 static uint dgnc_Major_Control_Registered = FALSE;
120 static uint dgnc_driver_start = FALSE;
122 static struct class *dgnc_class;
127 static DEFINE_SPINLOCK(dgnc_poll_lock); /* Poll scheduling lock */
128 static ulong dgnc_poll_time; /* Time of next poll */
129 static uint dgnc_poll_stop; /* Used to tell poller to stop */
130 static struct timer_list dgnc_poll_timer;
133 static struct pci_device_id dgnc_pci_tbl[] = {
134 { DIGI_VID, PCI_DEVICE_CLASSIC_4_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
135 { DIGI_VID, PCI_DEVICE_CLASSIC_4_422_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
136 { DIGI_VID, PCI_DEVICE_CLASSIC_8_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 },
137 { DIGI_VID, PCI_DEVICE_CLASSIC_8_422_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 },
138 { DIGI_VID, PCI_DEVICE_NEO_4_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
139 { DIGI_VID, PCI_DEVICE_NEO_8_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5 },
140 { DIGI_VID, PCI_DEVICE_NEO_2DB9_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6 },
141 { DIGI_VID, PCI_DEVICE_NEO_2DB9PRI_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 7 },
142 { DIGI_VID, PCI_DEVICE_NEO_2RJ45_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8 },
143 { DIGI_VID, PCI_DEVICE_NEO_2RJ45PRI_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 9 },
144 { DIGI_VID, PCI_DEVICE_NEO_1_422_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 10 },
145 { DIGI_VID, PCI_DEVICE_NEO_1_422_485_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11 },
146 { DIGI_VID, PCI_DEVICE_NEO_2_422_485_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12 },
147 { DIGI_VID, PCI_DEVICE_NEO_EXPRESS_8_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 },
148 { DIGI_VID, PCI_DEVICE_NEO_EXPRESS_4_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 },
149 { DIGI_VID, PCI_DEVICE_NEO_EXPRESS_4RJ45_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 },
150 { DIGI_VID, PCI_DEVICE_NEO_EXPRESS_8RJ45_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16 },
151 {0,} /* 0 terminated list. */
153 MODULE_DEVICE_TABLE(pci, dgnc_pci_tbl);
158 unsigned int is_pci_express;
161 static struct board_id dgnc_Ids[] =
163 { PCI_DEVICE_CLASSIC_4_PCI_NAME, 4, 0 },
164 { PCI_DEVICE_CLASSIC_4_422_PCI_NAME, 4, 0 },
165 { PCI_DEVICE_CLASSIC_8_PCI_NAME, 8, 0 },
166 { PCI_DEVICE_CLASSIC_8_422_PCI_NAME, 8, 0 },
167 { PCI_DEVICE_NEO_4_PCI_NAME, 4, 0 },
168 { PCI_DEVICE_NEO_8_PCI_NAME, 8, 0 },
169 { PCI_DEVICE_NEO_2DB9_PCI_NAME, 2, 0 },
170 { PCI_DEVICE_NEO_2DB9PRI_PCI_NAME, 2, 0 },
171 { PCI_DEVICE_NEO_2RJ45_PCI_NAME, 2, 0 },
172 { PCI_DEVICE_NEO_2RJ45PRI_PCI_NAME, 2, 0 },
173 { PCI_DEVICE_NEO_1_422_PCI_NAME, 1, 0 },
174 { PCI_DEVICE_NEO_1_422_485_PCI_NAME, 1, 0 },
175 { PCI_DEVICE_NEO_2_422_485_PCI_NAME, 2, 0 },
176 { PCI_DEVICE_NEO_EXPRESS_8_PCI_NAME, 8, 1 },
177 { PCI_DEVICE_NEO_EXPRESS_4_PCI_NAME, 4, 1 },
178 { PCI_DEVICE_NEO_EXPRESS_4RJ45_PCI_NAME, 4, 1 },
179 { PCI_DEVICE_NEO_EXPRESS_8RJ45_PCI_NAME, 8, 1 },
183 static struct pci_driver dgnc_driver = {
185 .probe = dgnc_init_one,
186 .id_table = dgnc_pci_tbl,
187 .remove = dgnc_remove_one,
191 char *dgnc_state_text[] = {
197 char *dgnc_driver_state_text[] = {
198 "Driver Initialized",
204 /************************************************************************
206 * Driver load/unload functions
208 ************************************************************************/
214 * Module load. This is where it all starts.
216 int dgnc_init_module(void)
220 APR(("%s, Digi International Part Number %s\n", DG_NAME, DG_PART));
223 * Initialize global stuff
232 * Find and configure all the cards
234 rc = dgnc_init_pci();
237 * If something went wrong in the scan, bail out of driver.
240 /* Only unregister the pci driver if it was actually registered. */
242 pci_unregister_driver(&dgnc_driver);
244 printk("WARNING: dgnc driver load failed. No Digi Neo or Classic boards found.\n");
246 dgnc_cleanup_module();
249 dgnc_create_driver_sysfiles(&dgnc_driver);
252 DPR_INIT(("Finished init_module. Returning %d\n", rc));
260 static int dgnc_start(void)
265 if (dgnc_driver_start == FALSE) {
267 dgnc_driver_start = TRUE;
269 /* make sure that the globals are init'd before we do anything else */
274 APR(("For the tools package or updated drivers please visit http://www.digi.com\n"));
277 * Register our base character device into the kernel.
278 * This allows the download daemon to connect to the downld device
279 * before any of the boards are init'ed.
281 if (!dgnc_Major_Control_Registered) {
283 * Register management/dpa devices
285 rc = register_chrdev(0, "dgnc", &dgnc_BoardFops);
287 APR(("Can't register dgnc driver device (%d)\n", rc));
293 dgnc_class = class_create(THIS_MODULE, "dgnc_mgmt");
294 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28)
295 device_create_drvdata(dgnc_class, NULL,
296 MKDEV(dgnc_Major, 0),
299 device_create(dgnc_class, NULL,
300 MKDEV(dgnc_Major, 0),
304 dgnc_Major_Control_Registered = TRUE;
308 * Init any global tty stuff.
310 rc = dgnc_tty_preinit();
313 APR(("tty preinit - not enough memory (%d)\n", rc));
317 /* Start the poller */
318 DGNC_LOCK(dgnc_poll_lock, flags);
319 init_timer(&dgnc_poll_timer);
320 dgnc_poll_timer.function = dgnc_poll_handler;
321 dgnc_poll_timer.data = 0;
322 dgnc_poll_time = jiffies + dgnc_jiffies_from_ms(dgnc_poll_tick);
323 dgnc_poll_timer.expires = dgnc_poll_time;
324 DGNC_UNLOCK(dgnc_poll_lock, flags);
326 add_timer(&dgnc_poll_timer);
328 dgnc_driver_state = DRIVER_READY;
335 * Register pci driver, and return how many boards we have.
337 static int dgnc_init_pci(void)
339 return pci_register_driver(&dgnc_driver);
343 /* returns count (>= 0), or negative on error */
344 static int dgnc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
348 /* wake up and enable device */
349 rc = pci_enable_device(pdev);
354 rc = dgnc_probe1(pdev, ent->driver_data);
357 DPR_INIT(("Incrementing numboards to %d\n", dgnc_NumBoards));
363 static int dgnc_probe1(struct pci_dev *pdev, int card_type)
365 return dgnc_found_board(pdev, card_type);
369 static void dgnc_remove_one(struct pci_dev *dev)
375 * dgnc_cleanup_module()
377 * Module unload. This is where it all ends.
379 void dgnc_cleanup_module(void)
384 DGNC_LOCK(dgnc_poll_lock, lock_flags);
386 DGNC_UNLOCK(dgnc_poll_lock, lock_flags);
388 /* Turn off poller right away. */
389 del_timer_sync(&dgnc_poll_timer);
391 dgnc_remove_driver_sysfiles(&dgnc_driver);
393 if (dgnc_Major_Control_Registered) {
394 device_destroy(dgnc_class, MKDEV(dgnc_Major, 0));
395 class_destroy(dgnc_class);
396 unregister_chrdev(dgnc_Major, "dgnc");
399 for (i = 0; i < dgnc_NumBoards; ++i) {
400 dgnc_remove_ports_sysfiles(dgnc_Board[i]);
401 dgnc_tty_uninit(dgnc_Board[i]);
402 dgnc_cleanup_board(dgnc_Board[i]);
405 dgnc_tty_post_uninit();
407 #if defined(DGNC_TRACER)
408 /* last thing, make sure we release the tracebuffer */
412 pci_unregister_driver(&dgnc_driver);
417 * dgnc_cleanup_board()
419 * Free all the memory associated with a board
421 static void dgnc_cleanup_board(struct board_t *brd)
425 if(!brd || brd->magic != DGNC_BOARD_MAGIC)
428 switch (brd->device) {
429 case PCI_DEVICE_CLASSIC_4_DID:
430 case PCI_DEVICE_CLASSIC_8_DID:
431 case PCI_DEVICE_CLASSIC_4_422_DID:
432 case PCI_DEVICE_CLASSIC_8_422_DID:
434 /* Tell card not to interrupt anymore. */
435 outb(0, brd->iobase + 0x4c);
443 free_irq(brd->irq, brd);
445 tasklet_kill(&brd->helper_tasklet);
447 if (brd->re_map_membase) {
448 iounmap(brd->re_map_membase);
449 brd->re_map_membase = NULL;
452 if (brd->msgbuf_head) {
455 DGNC_LOCK(dgnc_global_lock, flags);
457 printk(brd->msgbuf_head);
458 kfree(brd->msgbuf_head);
459 brd->msgbuf_head = NULL;
460 DGNC_UNLOCK(dgnc_global_lock, flags);
463 /* Free all allocated channels structs */
464 for (i = 0; i < MAXPORTS ; i++) {
465 if (brd->channels[i]) {
466 if (brd->channels[i]->ch_rqueue)
467 kfree(brd->channels[i]->ch_rqueue);
468 if (brd->channels[i]->ch_equeue)
469 kfree(brd->channels[i]->ch_equeue);
470 if (brd->channels[i]->ch_wqueue)
471 kfree(brd->channels[i]->ch_wqueue);
473 kfree(brd->channels[i]);
474 brd->channels[i] = NULL;
481 dgnc_Board[brd->boardnum] = NULL;
490 * A board has been found, init it.
492 static int dgnc_found_board(struct pci_dev *pdev, int id)
495 unsigned int pci_irq;
500 /* get the board structure and prep it */
501 brd = dgnc_Board[dgnc_NumBoards] =
502 (struct board_t *) kzalloc(sizeof(struct board_t), GFP_KERNEL);
504 APR(("memory allocation for board structure failed\n"));
508 /* make a temporary message buffer for the boot messages */
509 brd->msgbuf = brd->msgbuf_head =
510 (char *) kzalloc(sizeof(char) * 8192, GFP_KERNEL);
513 APR(("memory allocation for board msgbuf failed\n"));
517 /* store the info for the board we've found */
518 brd->magic = DGNC_BOARD_MAGIC;
519 brd->boardnum = dgnc_NumBoards;
520 brd->vendor = dgnc_pci_tbl[id].vendor;
521 brd->device = dgnc_pci_tbl[id].device;
523 brd->pci_bus = pdev->bus->number;
524 brd->pci_slot = PCI_SLOT(pdev->devfn);
525 brd->name = dgnc_Ids[id].name;
526 brd->maxports = dgnc_Ids[id].maxports;
527 if (dgnc_Ids[i].is_pci_express)
528 brd->bd_flags |= BD_IS_PCI_EXPRESS;
529 brd->dpastatus = BD_NOFEP;
530 init_waitqueue_head(&brd->state_wait);
532 DGNC_SPINLOCK_INIT(brd->bd_lock);
533 DGNC_SPINLOCK_INIT(brd->bd_intr_lock);
535 brd->state = BOARD_FOUND;
537 for (i = 0; i < MAXPORTS; i++) {
538 brd->channels[i] = NULL;
541 /* store which card & revision we have */
542 pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &brd->subvendor);
543 pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &brd->subdevice);
544 pci_read_config_byte(pdev, PCI_REVISION_ID, &brd->rev);
550 switch(brd->device) {
552 case PCI_DEVICE_CLASSIC_4_DID:
553 case PCI_DEVICE_CLASSIC_8_DID:
554 case PCI_DEVICE_CLASSIC_4_422_DID:
555 case PCI_DEVICE_CLASSIC_8_422_DID:
557 brd->dpatype = T_CLASSIC | T_PCIBUS;
559 DPR_INIT(("dgnc_found_board - Classic.\n"));
562 * For PCI ClassicBoards
563 * PCI Local Address (i.e. "resource" number) space
564 * 0 PLX Memory Mapped Config
565 * 1 PLX I/O Mapped Config
566 * 2 I/O Mapped UARTs and Status
567 * 3 Memory Mapped VPD
568 * 4 Memory Mapped UARTs and Status
572 /* get the PCI Base Address Registers */
573 brd->membase = pci_resource_start(pdev, 4);
576 APR(("card has no PCI IO resources, failing board.\n"));
580 brd->membase_end = pci_resource_end(pdev, 4);
582 if (brd->membase & 1)
587 brd->iobase = pci_resource_start(pdev, 1);
588 brd->iobase_end = pci_resource_end(pdev, 1);
589 brd->iobase = ((unsigned int) (brd->iobase)) & 0xFFFE;
591 /* Assign the board_ops struct */
592 brd->bd_ops = &dgnc_cls_ops;
594 brd->bd_uart_offset = 0x8;
595 brd->bd_dividend = 921600;
599 /* Get and store the board VPD, if it exists */
600 brd->bd_ops->vpd(brd);
603 * Enable Local Interrupt 1 (0x1),
604 * Local Interrupt 1 Polarity Active high (0x2),
605 * Enable PCI interrupt (0x40)
607 outb(0x43, brd->iobase + 0x4c);
612 case PCI_DEVICE_NEO_4_DID:
613 case PCI_DEVICE_NEO_8_DID:
614 case PCI_DEVICE_NEO_2DB9_DID:
615 case PCI_DEVICE_NEO_2DB9PRI_DID:
616 case PCI_DEVICE_NEO_2RJ45_DID:
617 case PCI_DEVICE_NEO_2RJ45PRI_DID:
618 case PCI_DEVICE_NEO_1_422_DID:
619 case PCI_DEVICE_NEO_1_422_485_DID:
620 case PCI_DEVICE_NEO_2_422_485_DID:
621 case PCI_DEVICE_NEO_EXPRESS_8_DID:
622 case PCI_DEVICE_NEO_EXPRESS_4_DID:
623 case PCI_DEVICE_NEO_EXPRESS_4RJ45_DID:
624 case PCI_DEVICE_NEO_EXPRESS_8RJ45_DID:
627 * This chip is set up 100% when we get to it.
628 * No need to enable global interrupts or anything.
630 if (brd->bd_flags & BD_IS_PCI_EXPRESS)
631 brd->dpatype = T_NEO_EXPRESS | T_PCIBUS;
633 brd->dpatype = T_NEO | T_PCIBUS;
635 DPR_INIT(("dgnc_found_board - NEO.\n"));
637 /* get the PCI Base Address Registers */
638 brd->membase = pci_resource_start(pdev, 0);
639 brd->membase_end = pci_resource_end(pdev, 0);
641 if (brd->membase & 1)
646 /* Assign the board_ops struct */
647 brd->bd_ops = &dgnc_neo_ops;
649 brd->bd_uart_offset = 0x200;
650 brd->bd_dividend = 921600;
654 if (brd->re_map_membase) {
656 /* After remap is complete, we need to read and store the dvid */
657 brd->dvid = readb(brd->re_map_membase + 0x8D);
659 /* Get and store the board VPD, if it exists */
660 brd->bd_ops->vpd(brd);
665 APR(("Did not find any compatible Neo or Classic PCI boards in system.\n"));
671 * Do tty device initialization.
674 rc = dgnc_tty_register(brd);
676 dgnc_tty_uninit(brd);
677 APR(("Can't register tty devices (%d)\n", rc));
678 brd->state = BOARD_FAILED;
679 brd->dpastatus = BD_NOFEP;
683 rc = dgnc_finalize_board_init(brd);
685 APR(("Can't finalize board init (%d)\n", rc));
686 brd->state = BOARD_FAILED;
687 brd->dpastatus = BD_NOFEP;
692 rc = dgnc_tty_init(brd);
694 dgnc_tty_uninit(brd);
695 APR(("Can't init tty devices (%d)\n", rc));
696 brd->state = BOARD_FAILED;
697 brd->dpastatus = BD_NOFEP;
702 brd->state = BOARD_READY;
703 brd->dpastatus = BD_RUNNING;
705 dgnc_create_ports_sysfiles(brd);
707 /* init our poll helper tasklet */
708 tasklet_init(&brd->helper_tasklet, brd->bd_ops->tasklet, (unsigned long) brd);
710 DPR_INIT(("dgnc_scan(%d) - printing out the msgbuf\n", i));
711 DGNC_LOCK(dgnc_global_lock, flags);
713 printk(brd->msgbuf_head);
714 kfree(brd->msgbuf_head);
715 brd->msgbuf_head = NULL;
716 DGNC_UNLOCK(dgnc_global_lock, flags);
719 * allocate flip buffer for board.
721 * Okay to malloc with GFP_KERNEL, we are not at interrupt
722 * context, and there are no locks held.
724 brd->flipbuf = kzalloc(MYFLIPLEN, GFP_KERNEL);
726 wake_up_interruptible(&brd->state_wait);
737 static int dgnc_finalize_board_init(struct board_t *brd) {
740 DPR_INIT(("dgnc_finalize_board_init() - start\n"));
742 if (!brd || brd->magic != DGNC_BOARD_MAGIC)
745 DPR_INIT(("dgnc_finalize_board_init() - start #2\n"));
748 rc = request_irq(brd->irq, brd->bd_ops->intr, IRQF_SHARED, "DGNC", brd);
751 printk("Failed to hook IRQ %d\n",brd->irq);
752 brd->state = BOARD_FAILED;
753 brd->dpastatus = BD_NOFEP;
756 DPR_INIT(("Requested and received usage of IRQ %d\n", brd->irq));
765 static void dgnc_do_remap(struct board_t *brd)
768 if (!brd || brd->magic != DGNC_BOARD_MAGIC)
771 brd->re_map_membase = ioremap(brd->membase, 0x1000);
773 DPR_INIT(("remapped mem: 0x%p\n", brd->re_map_membase));
777 /*****************************************************************************
797 * As each timer expires, it determines (a) whether the "transmit"
798 * waiter needs to be woken up, and (b) whether the poller needs to
801 ******************************************************************************/
803 static void dgnc_poll_handler(ulong dummy)
806 unsigned long lock_flags;
808 unsigned long new_time;
813 * Do not start the board state machine until
814 * driver tells us its up and running, and has
815 * everything it needs.
817 if (dgnc_driver_state != DRIVER_READY) {
818 goto schedule_poller;
821 /* Go thru each board, kicking off a tasklet for each if needed */
822 for (i = 0; i < dgnc_NumBoards; i++) {
825 DGNC_LOCK(brd->bd_lock, lock_flags);
827 /* If board is in a failed state, don't bother scheduling a tasklet */
828 if (brd->state == BOARD_FAILED) {
829 DGNC_UNLOCK(brd->bd_lock, lock_flags);
833 /* Schedule a poll helper task */
834 tasklet_schedule(&brd->helper_tasklet);
836 DGNC_UNLOCK(brd->bd_lock, lock_flags);
842 * Schedule ourself back at the nominal wakeup interval.
844 DGNC_LOCK(dgnc_poll_lock, lock_flags);
845 dgnc_poll_time += dgnc_jiffies_from_ms(dgnc_poll_tick);
847 new_time = dgnc_poll_time - jiffies;
849 if ((ulong) new_time >= 2 * dgnc_poll_tick) {
850 dgnc_poll_time = jiffies + dgnc_jiffies_from_ms(dgnc_poll_tick);
853 init_timer(&dgnc_poll_timer);
854 dgnc_poll_timer.function = dgnc_poll_handler;
855 dgnc_poll_timer.data = 0;
856 dgnc_poll_timer.expires = dgnc_poll_time;
857 DGNC_UNLOCK(dgnc_poll_lock, lock_flags);
860 add_timer(&dgnc_poll_timer);
864 * dgnc_init_globals()
866 * This is where we initialize the globals from the static insmod
867 * configuration variables. These are declared near the head of
870 static void dgnc_init_globals(void)
874 dgnc_rawreadok = rawreadok;
875 dgnc_trcbuf_size = trcbuf_size;
878 for (i = 0; i < MAXBOARDS; i++) {
879 dgnc_Board[i] = NULL;
882 init_timer(&dgnc_poll_timer);
886 /************************************************************************
890 ************************************************************************/
895 * Put the driver to sleep for x ms's
897 * Returns 0 if timed out, !0 (showing signal) if interrupted by a signal.
899 int dgnc_ms_sleep(ulong ms)
901 current->state = TASK_INTERRUPTIBLE;
902 schedule_timeout((ms * HZ) / 1000);
903 return (signal_pending(current));
909 * dgnc_ioctl_name() : Returns a text version of each ioctl value.
911 char *dgnc_ioctl_name(int cmd)
915 case TCGETA: return("TCGETA");
916 case TCGETS: return("TCGETS");
917 case TCSETA: return("TCSETA");
918 case TCSETS: return("TCSETS");
919 case TCSETAW: return("TCSETAW");
920 case TCSETSW: return("TCSETSW");
921 case TCSETAF: return("TCSETAF");
922 case TCSETSF: return("TCSETSF");
923 case TCSBRK: return("TCSBRK");
924 case TCXONC: return("TCXONC");
925 case TCFLSH: return("TCFLSH");
926 case TIOCGSID: return("TIOCGSID");
928 case TIOCGETD: return("TIOCGETD");
929 case TIOCSETD: return("TIOCSETD");
930 case TIOCGWINSZ: return("TIOCGWINSZ");
931 case TIOCSWINSZ: return("TIOCSWINSZ");
933 case TIOCMGET: return("TIOCMGET");
934 case TIOCMSET: return("TIOCMSET");
935 case TIOCMBIS: return("TIOCMBIS");
936 case TIOCMBIC: return("TIOCMBIC");
939 case DIGI_SETA: return("DIGI_SETA");
940 case DIGI_SETAW: return("DIGI_SETAW");
941 case DIGI_SETAF: return("DIGI_SETAF");
942 case DIGI_SETFLOW: return("DIGI_SETFLOW");
943 case DIGI_SETAFLOW: return("DIGI_SETAFLOW");
944 case DIGI_GETFLOW: return("DIGI_GETFLOW");
945 case DIGI_GETAFLOW: return("DIGI_GETAFLOW");
946 case DIGI_GETA: return("DIGI_GETA");
947 case DIGI_GEDELAY: return("DIGI_GEDELAY");
948 case DIGI_SEDELAY: return("DIGI_SEDELAY");
949 case DIGI_GETCUSTOMBAUD: return("DIGI_GETCUSTOMBAUD");
950 case DIGI_SETCUSTOMBAUD: return("DIGI_SETCUSTOMBAUD");
951 case TIOCMODG: return("TIOCMODG");
952 case TIOCMODS: return("TIOCMODS");
953 case TIOCSDTR: return("TIOCSDTR");
954 case TIOCCDTR: return("TIOCCDTR");
956 default: return("unknown");