summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2009-10-13 11:34:49 +0000
committerThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2009-10-13 11:34:49 +0000
commit7cafde22969025f0c3f1f20931ecef6c7b748346 (patch)
treef5dbfed50718b55929ce1242afc5b115206c6fff /c
parentUpdate for block device API change. (diff)
downloadrtems-7cafde22969025f0c3f1f20931ecef6c7b748346.tar.bz2
Enable interrupts during open to avoid NULL pointer access in interrupt handler.
Diffstat (limited to 'c')
-rw-r--r--c/src/ChangeLog5
-rw-r--r--c/src/libchip/serial/ns16550.c11
2 files changed, 14 insertions, 2 deletions
diff --git a/c/src/ChangeLog b/c/src/ChangeLog
index c90a8fef1f..7c06aa6a3b 100644
--- a/c/src/ChangeLog
+++ b/c/src/ChangeLog
@@ -1,3 +1,8 @@
+2009-10-13 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ * libchip/serial/ns16550.c: Enable interrupts during open to avoid
+ NULL pointer access in interrupt handler.
+
2009-10-09 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libchip/i2c/spi-sd-card.c, libchip/ide/ata.c: Update for block
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);
}
/*