Loading drivers/char/cyclades.c +156 −155 Original line number Diff line number Diff line Loading @@ -4503,6 +4503,159 @@ static void cy_hangup(struct tty_struct *tty) * --------------------------------------------------------------------- */ static void __devinit cy_init_card(struct cyclades_card *cinfo, const unsigned int board) { struct cyclades_port *info; u32 mailbox; unsigned int nports; unsigned short chip_number; int index, port; if (cinfo->num_chips == -1) { /* Cyclades-Z */ mailbox = readl(&((struct RUNTIME_9060 __iomem *) cinfo->ctl_addr)->mail_box_0); nports = (mailbox == ZE_V1) ? ZE_V1_NPORTS : 8; cinfo->intr_enabled = 0; cinfo->nports = 0; /* Will be correctly set later, after Z FW is loaded */ spin_lock_init(&cinfo->card_lock); for (port = cinfo->first_line; port < cinfo->first_line + nports; port++) { info = &cy_port[port]; info->magic = CYCLADES_MAGIC; info->type = PORT_STARTECH; info->card = board; info->line = port; info->chip_rev = 0; info->flags = STD_COM_FLAGS; info->tty = NULL; if (mailbox == ZO_V1) info->xmit_fifo_size = CYZ_FIFO_SIZE; else info->xmit_fifo_size = 4 * CYZ_FIFO_SIZE; info->cor1 = 0; info->cor2 = 0; info->cor3 = 0; info->cor4 = 0; info->cor5 = 0; info->tbpr = 0; info->tco = 0; info->rbpr = 0; info->rco = 0; info->custom_divisor = 0; info->close_delay = 5 * HZ / 10; info->closing_wait = CLOSING_WAIT_DELAY; info->icount.cts = info->icount.dsr = info->icount.rng = info->icount.dcd = 0; info->icount.rx = info->icount.tx = 0; info->icount.frame = info->icount.parity = 0; info->icount.overrun = info->icount.brk = 0; info->x_char = 0; info->event = 0; info->count = 0; info->blocked_open = 0; info->default_threshold = 0; info->default_timeout = 0; INIT_WORK(&info->tqueue, do_softint); init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); init_waitqueue_head(&info->shutdown_wait); init_waitqueue_head(&info->delta_msr_wait); /* info->session */ /* info->pgrp */ info->read_status_mask = 0; /* info->timeout */ /* Bentson's vars */ info->jiffies[0] = 0; info->jiffies[1] = 0; info->jiffies[2] = 0; info->rflush_count = 0; #ifdef CONFIG_CYZ_INTR init_timer(&cyz_rx_full_timer[port]); cyz_rx_full_timer[port].function = NULL; #endif } #ifndef CONFIG_CYZ_INTR if (!timer_pending(&cyz_timerlist)) { mod_timer(&cyz_timerlist, jiffies + 1); #ifdef CY_PCI_DEBUG printk("Cyclades-Z polling initialized\n"); #endif } #endif /* CONFIG_CYZ_INTR */ } else { /* Cyclom-Y of some kind */ index = cinfo->bus_index; spin_lock_init(&cinfo->card_lock); cinfo->nports = CyPORTS_PER_CHIP * cinfo->num_chips; for (port = cinfo->first_line; port < cinfo->first_line + cinfo->nports; port++) { info = &cy_port[port]; info->magic = CYCLADES_MAGIC; info->type = PORT_CIRRUS; info->card = board; info->line = port; info->flags = STD_COM_FLAGS; info->tty = NULL; info->xmit_fifo_size = CyMAX_CHAR_FIFO; info->cor1 = CyPARITY_NONE | Cy_1_STOP | Cy_8_BITS; info->cor2 = CyETC; info->cor3 = 0x08; /* _very_ small rcv threshold */ info->cor4 = 0; info->cor5 = 0; info->custom_divisor = 0; info->close_delay = 5 * HZ / 10; info->closing_wait = CLOSING_WAIT_DELAY; info->icount.cts = info->icount.dsr = info->icount.rng = info->icount.dcd = 0; info->icount.rx = info->icount.tx = 0; info->icount.frame = info->icount.parity = 0; info->icount.overrun = info->icount.brk = 0; chip_number = (port - cinfo->first_line) / 4; if ((info->chip_rev = readb(cinfo->base_addr + (cy_chip_offset[chip_number] << index) + (CyGFRCR << index))) >= CD1400_REV_J) { /* It is a CD1400 rev. J or later */ info->tbpr = baud_bpr_60[13]; /* Tx BPR */ info->tco = baud_co_60[13]; /* Tx CO */ info->rbpr = baud_bpr_60[13]; /* Rx BPR */ info->rco = baud_co_60[13]; /* Rx CO */ info->rflow = 0; info->rtsdtr_inv = 1; } else { info->tbpr = baud_bpr_25[13]; /* Tx BPR */ info->tco = baud_co_25[13]; /* Tx CO */ info->rbpr = baud_bpr_25[13]; /* Rx BPR */ info->rco = baud_co_25[13]; /* Rx CO */ info->rflow = 0; info->rtsdtr_inv = 0; } info->x_char = 0; info->event = 0; info->count = 0; info->blocked_open = 0; info->default_threshold = 0; info->default_timeout = 0; INIT_WORK(&info->tqueue, do_softint); init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); init_waitqueue_head(&info->shutdown_wait); init_waitqueue_head(&info->delta_msr_wait); /* info->session */ /* info->pgrp */ info->read_status_mask = CyTIMEOUT | CySPECHAR | CyBREAK | CyPARITY | CyFRAME | CyOVERRUN; /* info->timeout */ } } } /* initialize chips on Cyclom-Y card -- return number of valid chips (which is number of ports/4) */ static unsigned short __init Loading Loading @@ -5300,13 +5453,7 @@ static const struct tty_operations cy_ops = { static int __init cy_init(void) { struct cyclades_port *info; struct cyclades_card *cinfo; int number_z_boards = 0; int board, port, i, index; unsigned long mailbox; unsigned short chip_number; int nports; unsigned int i; cy_serial_driver = alloc_tty_driver(NR_PORTS); if (!cy_serial_driver) Loading Loading @@ -5369,154 +5516,8 @@ static int __init cy_init(void) } /* initialize per-port data structures for each valid board found */ for (board = 0; board < cy_nboard; board++) { cinfo = &cy_card[board]; if (cinfo->num_chips == -1) { /* Cyclades-Z */ number_z_boards++; mailbox = readl(&((struct RUNTIME_9060 __iomem *) cy_card[board].ctl_addr)-> mail_box_0); nports = (mailbox == ZE_V1) ? ZE_V1_NPORTS : 8; cinfo->intr_enabled = 0; cinfo->nports = 0; /* Will be correctly set later, after Z FW is loaded */ spin_lock_init(&cinfo->card_lock); for (port = cinfo->first_line; port < cinfo->first_line + nports; port++) { info = &cy_port[port]; info->magic = CYCLADES_MAGIC; info->type = PORT_STARTECH; info->card = board; info->line = port; info->chip_rev = 0; info->flags = STD_COM_FLAGS; info->tty = NULL; if (mailbox == ZO_V1) info->xmit_fifo_size = CYZ_FIFO_SIZE; else info->xmit_fifo_size = 4 * CYZ_FIFO_SIZE; info->cor1 = 0; info->cor2 = 0; info->cor3 = 0; info->cor4 = 0; info->cor5 = 0; info->tbpr = 0; info->tco = 0; info->rbpr = 0; info->rco = 0; info->custom_divisor = 0; info->close_delay = 5 * HZ / 10; info->closing_wait = CLOSING_WAIT_DELAY; info->icount.cts = info->icount.dsr = info->icount.rng = info->icount.dcd = 0; info->icount.rx = info->icount.tx = 0; info->icount.frame = info->icount.parity = 0; info->icount.overrun = info->icount.brk = 0; info->x_char = 0; info->event = 0; info->count = 0; info->blocked_open = 0; info->default_threshold = 0; info->default_timeout = 0; INIT_WORK(&info->tqueue, do_softint); init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); init_waitqueue_head(&info->shutdown_wait); init_waitqueue_head(&info->delta_msr_wait); /* info->session */ /* info->pgrp */ info->read_status_mask = 0; /* info->timeout */ /* Bentson's vars */ info->jiffies[0] = 0; info->jiffies[1] = 0; info->jiffies[2] = 0; info->rflush_count = 0; #ifdef CONFIG_CYZ_INTR init_timer(&cyz_rx_full_timer[port]); cyz_rx_full_timer[port].function = NULL; #endif } continue; } else { /* Cyclom-Y of some kind */ index = cinfo->bus_index; spin_lock_init(&cinfo->card_lock); cinfo->nports = CyPORTS_PER_CHIP * cinfo->num_chips; for (port = cinfo->first_line; port < cinfo->first_line + cinfo->nports; port++) { info = &cy_port[port]; info->magic = CYCLADES_MAGIC; info->type = PORT_CIRRUS; info->card = board; info->line = port; info->flags = STD_COM_FLAGS; info->tty = NULL; info->xmit_fifo_size = CyMAX_CHAR_FIFO; info->cor1 = CyPARITY_NONE | Cy_1_STOP | Cy_8_BITS; info->cor2 = CyETC; info->cor3 = 0x08; /* _very_ small rcv threshold */ info->cor4 = 0; info->cor5 = 0; info->custom_divisor = 0; info->close_delay = 5 * HZ / 10; info->closing_wait = CLOSING_WAIT_DELAY; info->icount.cts = info->icount.dsr = info->icount.rng = info->icount.dcd = 0; info->icount.rx = info->icount.tx = 0; info->icount.frame = info->icount.parity = 0; info->icount.overrun = info->icount.brk = 0; chip_number = (port - cinfo->first_line) / 4; if ((info->chip_rev = readb(cinfo->base_addr + (cy_chip_offset[chip_number] << index) + (CyGFRCR << index))) >= CD1400_REV_J) { /* It is a CD1400 rev. J or later */ info->tbpr = baud_bpr_60[13]; /* Tx BPR */ info->tco = baud_co_60[13]; /* Tx CO */ info->rbpr = baud_bpr_60[13]; /* Rx BPR */ info->rco = baud_co_60[13]; /* Rx CO */ info->rflow = 0; info->rtsdtr_inv = 1; } else { info->tbpr = baud_bpr_25[13]; /* Tx BPR */ info->tco = baud_co_25[13]; /* Tx CO */ info->rbpr = baud_bpr_25[13]; /* Rx BPR */ info->rco = baud_co_25[13]; /* Rx CO */ info->rflow = 0; info->rtsdtr_inv = 0; } info->x_char = 0; info->event = 0; info->count = 0; info->blocked_open = 0; info->default_threshold = 0; info->default_timeout = 0; INIT_WORK(&info->tqueue, do_softint); init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); init_waitqueue_head(&info->shutdown_wait); init_waitqueue_head(&info->delta_msr_wait); /* info->session */ /* info->pgrp */ info->read_status_mask = CyTIMEOUT | CySPECHAR | CyBREAK | CyPARITY | CyFRAME | CyOVERRUN; /* info->timeout */ } } } #ifndef CONFIG_CYZ_INTR if (number_z_boards) { mod_timer(&cyz_timerlist, jiffies + 1); #ifdef CY_PCI_DEBUG printk("Cyclades-Z polling initialized\n"); #endif } #endif /* CONFIG_CYZ_INTR */ for (i = 0; i < cy_nboard; i++) cy_init_card(&cy_card[i], i); return 0; Loading Loading
drivers/char/cyclades.c +156 −155 Original line number Diff line number Diff line Loading @@ -4503,6 +4503,159 @@ static void cy_hangup(struct tty_struct *tty) * --------------------------------------------------------------------- */ static void __devinit cy_init_card(struct cyclades_card *cinfo, const unsigned int board) { struct cyclades_port *info; u32 mailbox; unsigned int nports; unsigned short chip_number; int index, port; if (cinfo->num_chips == -1) { /* Cyclades-Z */ mailbox = readl(&((struct RUNTIME_9060 __iomem *) cinfo->ctl_addr)->mail_box_0); nports = (mailbox == ZE_V1) ? ZE_V1_NPORTS : 8; cinfo->intr_enabled = 0; cinfo->nports = 0; /* Will be correctly set later, after Z FW is loaded */ spin_lock_init(&cinfo->card_lock); for (port = cinfo->first_line; port < cinfo->first_line + nports; port++) { info = &cy_port[port]; info->magic = CYCLADES_MAGIC; info->type = PORT_STARTECH; info->card = board; info->line = port; info->chip_rev = 0; info->flags = STD_COM_FLAGS; info->tty = NULL; if (mailbox == ZO_V1) info->xmit_fifo_size = CYZ_FIFO_SIZE; else info->xmit_fifo_size = 4 * CYZ_FIFO_SIZE; info->cor1 = 0; info->cor2 = 0; info->cor3 = 0; info->cor4 = 0; info->cor5 = 0; info->tbpr = 0; info->tco = 0; info->rbpr = 0; info->rco = 0; info->custom_divisor = 0; info->close_delay = 5 * HZ / 10; info->closing_wait = CLOSING_WAIT_DELAY; info->icount.cts = info->icount.dsr = info->icount.rng = info->icount.dcd = 0; info->icount.rx = info->icount.tx = 0; info->icount.frame = info->icount.parity = 0; info->icount.overrun = info->icount.brk = 0; info->x_char = 0; info->event = 0; info->count = 0; info->blocked_open = 0; info->default_threshold = 0; info->default_timeout = 0; INIT_WORK(&info->tqueue, do_softint); init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); init_waitqueue_head(&info->shutdown_wait); init_waitqueue_head(&info->delta_msr_wait); /* info->session */ /* info->pgrp */ info->read_status_mask = 0; /* info->timeout */ /* Bentson's vars */ info->jiffies[0] = 0; info->jiffies[1] = 0; info->jiffies[2] = 0; info->rflush_count = 0; #ifdef CONFIG_CYZ_INTR init_timer(&cyz_rx_full_timer[port]); cyz_rx_full_timer[port].function = NULL; #endif } #ifndef CONFIG_CYZ_INTR if (!timer_pending(&cyz_timerlist)) { mod_timer(&cyz_timerlist, jiffies + 1); #ifdef CY_PCI_DEBUG printk("Cyclades-Z polling initialized\n"); #endif } #endif /* CONFIG_CYZ_INTR */ } else { /* Cyclom-Y of some kind */ index = cinfo->bus_index; spin_lock_init(&cinfo->card_lock); cinfo->nports = CyPORTS_PER_CHIP * cinfo->num_chips; for (port = cinfo->first_line; port < cinfo->first_line + cinfo->nports; port++) { info = &cy_port[port]; info->magic = CYCLADES_MAGIC; info->type = PORT_CIRRUS; info->card = board; info->line = port; info->flags = STD_COM_FLAGS; info->tty = NULL; info->xmit_fifo_size = CyMAX_CHAR_FIFO; info->cor1 = CyPARITY_NONE | Cy_1_STOP | Cy_8_BITS; info->cor2 = CyETC; info->cor3 = 0x08; /* _very_ small rcv threshold */ info->cor4 = 0; info->cor5 = 0; info->custom_divisor = 0; info->close_delay = 5 * HZ / 10; info->closing_wait = CLOSING_WAIT_DELAY; info->icount.cts = info->icount.dsr = info->icount.rng = info->icount.dcd = 0; info->icount.rx = info->icount.tx = 0; info->icount.frame = info->icount.parity = 0; info->icount.overrun = info->icount.brk = 0; chip_number = (port - cinfo->first_line) / 4; if ((info->chip_rev = readb(cinfo->base_addr + (cy_chip_offset[chip_number] << index) + (CyGFRCR << index))) >= CD1400_REV_J) { /* It is a CD1400 rev. J or later */ info->tbpr = baud_bpr_60[13]; /* Tx BPR */ info->tco = baud_co_60[13]; /* Tx CO */ info->rbpr = baud_bpr_60[13]; /* Rx BPR */ info->rco = baud_co_60[13]; /* Rx CO */ info->rflow = 0; info->rtsdtr_inv = 1; } else { info->tbpr = baud_bpr_25[13]; /* Tx BPR */ info->tco = baud_co_25[13]; /* Tx CO */ info->rbpr = baud_bpr_25[13]; /* Rx BPR */ info->rco = baud_co_25[13]; /* Rx CO */ info->rflow = 0; info->rtsdtr_inv = 0; } info->x_char = 0; info->event = 0; info->count = 0; info->blocked_open = 0; info->default_threshold = 0; info->default_timeout = 0; INIT_WORK(&info->tqueue, do_softint); init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); init_waitqueue_head(&info->shutdown_wait); init_waitqueue_head(&info->delta_msr_wait); /* info->session */ /* info->pgrp */ info->read_status_mask = CyTIMEOUT | CySPECHAR | CyBREAK | CyPARITY | CyFRAME | CyOVERRUN; /* info->timeout */ } } } /* initialize chips on Cyclom-Y card -- return number of valid chips (which is number of ports/4) */ static unsigned short __init Loading Loading @@ -5300,13 +5453,7 @@ static const struct tty_operations cy_ops = { static int __init cy_init(void) { struct cyclades_port *info; struct cyclades_card *cinfo; int number_z_boards = 0; int board, port, i, index; unsigned long mailbox; unsigned short chip_number; int nports; unsigned int i; cy_serial_driver = alloc_tty_driver(NR_PORTS); if (!cy_serial_driver) Loading Loading @@ -5369,154 +5516,8 @@ static int __init cy_init(void) } /* initialize per-port data structures for each valid board found */ for (board = 0; board < cy_nboard; board++) { cinfo = &cy_card[board]; if (cinfo->num_chips == -1) { /* Cyclades-Z */ number_z_boards++; mailbox = readl(&((struct RUNTIME_9060 __iomem *) cy_card[board].ctl_addr)-> mail_box_0); nports = (mailbox == ZE_V1) ? ZE_V1_NPORTS : 8; cinfo->intr_enabled = 0; cinfo->nports = 0; /* Will be correctly set later, after Z FW is loaded */ spin_lock_init(&cinfo->card_lock); for (port = cinfo->first_line; port < cinfo->first_line + nports; port++) { info = &cy_port[port]; info->magic = CYCLADES_MAGIC; info->type = PORT_STARTECH; info->card = board; info->line = port; info->chip_rev = 0; info->flags = STD_COM_FLAGS; info->tty = NULL; if (mailbox == ZO_V1) info->xmit_fifo_size = CYZ_FIFO_SIZE; else info->xmit_fifo_size = 4 * CYZ_FIFO_SIZE; info->cor1 = 0; info->cor2 = 0; info->cor3 = 0; info->cor4 = 0; info->cor5 = 0; info->tbpr = 0; info->tco = 0; info->rbpr = 0; info->rco = 0; info->custom_divisor = 0; info->close_delay = 5 * HZ / 10; info->closing_wait = CLOSING_WAIT_DELAY; info->icount.cts = info->icount.dsr = info->icount.rng = info->icount.dcd = 0; info->icount.rx = info->icount.tx = 0; info->icount.frame = info->icount.parity = 0; info->icount.overrun = info->icount.brk = 0; info->x_char = 0; info->event = 0; info->count = 0; info->blocked_open = 0; info->default_threshold = 0; info->default_timeout = 0; INIT_WORK(&info->tqueue, do_softint); init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); init_waitqueue_head(&info->shutdown_wait); init_waitqueue_head(&info->delta_msr_wait); /* info->session */ /* info->pgrp */ info->read_status_mask = 0; /* info->timeout */ /* Bentson's vars */ info->jiffies[0] = 0; info->jiffies[1] = 0; info->jiffies[2] = 0; info->rflush_count = 0; #ifdef CONFIG_CYZ_INTR init_timer(&cyz_rx_full_timer[port]); cyz_rx_full_timer[port].function = NULL; #endif } continue; } else { /* Cyclom-Y of some kind */ index = cinfo->bus_index; spin_lock_init(&cinfo->card_lock); cinfo->nports = CyPORTS_PER_CHIP * cinfo->num_chips; for (port = cinfo->first_line; port < cinfo->first_line + cinfo->nports; port++) { info = &cy_port[port]; info->magic = CYCLADES_MAGIC; info->type = PORT_CIRRUS; info->card = board; info->line = port; info->flags = STD_COM_FLAGS; info->tty = NULL; info->xmit_fifo_size = CyMAX_CHAR_FIFO; info->cor1 = CyPARITY_NONE | Cy_1_STOP | Cy_8_BITS; info->cor2 = CyETC; info->cor3 = 0x08; /* _very_ small rcv threshold */ info->cor4 = 0; info->cor5 = 0; info->custom_divisor = 0; info->close_delay = 5 * HZ / 10; info->closing_wait = CLOSING_WAIT_DELAY; info->icount.cts = info->icount.dsr = info->icount.rng = info->icount.dcd = 0; info->icount.rx = info->icount.tx = 0; info->icount.frame = info->icount.parity = 0; info->icount.overrun = info->icount.brk = 0; chip_number = (port - cinfo->first_line) / 4; if ((info->chip_rev = readb(cinfo->base_addr + (cy_chip_offset[chip_number] << index) + (CyGFRCR << index))) >= CD1400_REV_J) { /* It is a CD1400 rev. J or later */ info->tbpr = baud_bpr_60[13]; /* Tx BPR */ info->tco = baud_co_60[13]; /* Tx CO */ info->rbpr = baud_bpr_60[13]; /* Rx BPR */ info->rco = baud_co_60[13]; /* Rx CO */ info->rflow = 0; info->rtsdtr_inv = 1; } else { info->tbpr = baud_bpr_25[13]; /* Tx BPR */ info->tco = baud_co_25[13]; /* Tx CO */ info->rbpr = baud_bpr_25[13]; /* Rx BPR */ info->rco = baud_co_25[13]; /* Rx CO */ info->rflow = 0; info->rtsdtr_inv = 0; } info->x_char = 0; info->event = 0; info->count = 0; info->blocked_open = 0; info->default_threshold = 0; info->default_timeout = 0; INIT_WORK(&info->tqueue, do_softint); init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); init_waitqueue_head(&info->shutdown_wait); init_waitqueue_head(&info->delta_msr_wait); /* info->session */ /* info->pgrp */ info->read_status_mask = CyTIMEOUT | CySPECHAR | CyBREAK | CyPARITY | CyFRAME | CyOVERRUN; /* info->timeout */ } } } #ifndef CONFIG_CYZ_INTR if (number_z_boards) { mod_timer(&cyz_timerlist, jiffies + 1); #ifdef CY_PCI_DEBUG printk("Cyclades-Z polling initialized\n"); #endif } #endif /* CONFIG_CYZ_INTR */ for (i = 0; i < cy_nboard; i++) cy_init_card(&cy_card[i], i); return 0; Loading