[serial] Don't enable serial console without serial support

serial_console_init() would enable serial console support without
knowing if the serial driver succeeded or not.  As a result, the
serial console would interfere with a normal keyboard on a system
lacking serial support.

Reported-by: Jan ONDREJ (SAL) <ondrejj(at)salstar.sk>
Signed-off-by: Shao Miller <sha0.miller@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Shao Miller
2012-10-05 15:14:12 +01:00
committed by Michael Brown
parent fcdfe81764
commit a712dae709
3 changed files with 13 additions and 4 deletions

View File

@@ -93,6 +93,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define uart_writeb(val,addr) outb((val),(addr)) #define uart_writeb(val,addr) outb((val),(addr))
#endif #endif
/* Boolean for the state of serial driver initialization */
int serial_initialized = 0;
/* /*
* void serial_putc(int ch); * void serial_putc(int ch);
* Write character `ch' to port UART_BASE. * Write character `ch' to port UART_BASE.
@@ -207,7 +210,6 @@ static void serial_init ( void ) {
/* Set clear to send, so flow control works... */ /* Set clear to send, so flow control works... */
uart_writeb((1<<1), UART_BASE + UART_MCR); uart_writeb((1<<1), UART_BASE + UART_MCR);
/* Flush the input buffer. */ /* Flush the input buffer. */
do { do {
/* rx buffer reg /* rx buffer reg
@@ -217,6 +219,9 @@ static void serial_init ( void ) {
/* line status reg */ /* line status reg */
status = uart_readb(UART_BASE + UART_LSR); status = uart_readb(UART_BASE + UART_LSR);
} while(status & UART_LSR_DR); } while(status & UART_LSR_DR);
/* Note that serial support has been initialized */
serial_initialized = 1;
out: out:
return; return;
} }

View File

@@ -18,8 +18,11 @@
struct console_driver serial_console __console_driver; struct console_driver serial_console __console_driver;
static void serial_console_init ( void ) { static void serial_console_init ( void ) {
/* Serial driver initialization should already be done, /*
* time to enable the serial console. */ * Check if serial driver initialization is done.
* If so, it's time to enable the serial console.
*/
if ( serial_initialized )
serial_console.disabled = 0; serial_console.disabled = 0;
} }

View File

@@ -12,5 +12,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
extern void serial_putc ( int ch ); extern void serial_putc ( int ch );
extern int serial_getc ( void ); extern int serial_getc ( void );
extern int serial_ischar ( void ); extern int serial_ischar ( void );
extern int serial_initialized;
#endif /* _IPXE_SERIAL_H */ #endif /* _IPXE_SERIAL_H */