static void init_serial_port(char *devname, int iobase, int irq, struct unit *unit) { struct serial_port *sp; dev_t devno; sp = (struct serial_port *) kmalloc(sizeof(struct serial_port)); memset(sp, 0, sizeof(struct serial_port)); sp->iobase = iobase; sp->irq = irq; sp->cfg.speed = 115200; sp->cfg.databits = 8; sp->cfg.parity = PARITY_NONE; sp->cfg.stopbits = 1; sp->cfg.rx_timeout = INFINITE; sp->cfg.tx_timeout = INFINITE; init_dpc(&sp->dpc); sp->dpc.flags |= DPC_NORAND; init_event(&sp->event, 0, 0); init_sem(&sp->tx_sem, QUEUE_SIZE); init_mutex(&sp->tx_lock, 0); init_sem(&sp->rx_sem, 0); init_mutex(&sp->rx_lock, 0); // Disable interrupts outp(sp->iobase + UART_IER, 0); // Determine UART type check_uart_type(sp); // Set baudrate, parity, databits and stopbits serial_config(sp); // Enable FIFO if (sp->type == UART_16550A) { outp(sp->iobase + UART_FCR, FCR_ENABLE | FCR_RCV_RST | FCR_XMT_RST | FCR_TRIGGER_14); } // Turn on DTR, RTS and OUT2 sp->mcr = MCR_DTR | MCR_RTS | MCR_IENABLE; outp(sp->iobase + UART_MCR, sp->mcr); // Create device devno = dev_make(devname, &serial_driver, unit, sp); // Enable interrupts register_interrupt(&sp->intr, IRQ2INTR(sp->irq), serial_handler, sp); enable_irq(sp->irq); outp((unsigned short) (sp->iobase + UART_IER), IER_ERXRDY | IER_ETXRDY | IER_ERLS | IER_EMSC); kprintf(KERN_INFO "%s: %s iobase 0x%x irq %d\n", device(devno)->name, uart_name[sp->type], sp->iobase, sp->irq); }
STDCALL void KeInitializeDpc(struct kdpc *kdpc, void *func, void *ctx) { DBGTRACE("%s: %p, %p, %p\n", __FUNCTION__, kdpc, func, ctx); init_dpc(kdpc, func, ctx); }