diff options
author | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2009-10-13 11:34:49 +0000 |
---|---|---|
committer | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2009-10-13 11:34:49 +0000 |
commit | 7cafde22969025f0c3f1f20931ecef6c7b748346 (patch) | |
tree | f5dbfed50718b55929ce1242afc5b115206c6fff /c/src/libchip/serial/ns16550.c | |
parent | Update for block device API change. (diff) | |
download | rtems-7cafde22969025f0c3f1f20931ecef6c7b748346.tar.bz2 |
Enable interrupts during open to avoid NULL pointer access in interrupt handler.
Diffstat (limited to '')
-rw-r--r-- | c/src/libchip/serial/ns16550.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/c/src/libchip/serial/ns16550.c b/c/src/libchip/serial/ns16550.c index f2915f2a50..19403431f3 100644 --- a/c/src/libchip/serial/ns16550.c +++ b/c/src/libchip/serial/ns16550.c @@ -173,6 +173,9 @@ NS16550_STATIC int ns16550_open( rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg; struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1; console_tbl *c = &Console_Port_Tbl [minor]; + console_data *d = &Console_Port_Data [minor]; + + d->termios_data = tty; /* Assert DTR */ if (c->pDeviceFlow != &ns16550_flow_DTRCTS) { @@ -182,6 +185,10 @@ NS16550_STATIC int ns16550_open( /* Set initial baud */ rtems_termios_set_initial_baud( tty, (int32_t) c->pDeviceParams); + if (c->pDeviceFns->deviceOutputUsesInterrupts) { + ns16550_enable_interrupts( minor, NS16550_ENABLE_ALL_INTR_EXCEPT_TX); + } + return RTEMS_SUCCESSFUL; } @@ -202,6 +209,8 @@ NS16550_STATIC int ns16550_close( ns16550_negate_DTR(minor); } + ns16550_enable_interrupts(minor, NS16550_DISABLE_ALL_INTR); + return(RTEMS_SUCCESSFUL); } @@ -648,8 +657,6 @@ NS16550_STATIC void ns16550_initialize_interrupts( int minor) } } #endif - - ns16550_enable_interrupts( minor, NS16550_ENABLE_ALL_INTR_EXCEPT_TX); } /* |