tty: i386: rs232 fix
. ignore interrupt (stop interrupt check loop) if interrupt bit not set; limit loop too . mask off other bits when testing bits in the status register . this fixes rs232 output that would otherwise never get re-triggered as too many bits were set in the status byte to match the possibilities. Change-Id: I311c93377fa8fb477ee9a756455fdeda780e6ba1
This commit is contained in:
parent
9178749e13
commit
93d9caa2d6
1 changed files with 13 additions and 3 deletions
|
@ -22,9 +22,11 @@
|
|||
|
||||
/* Interrupt status bits. */
|
||||
#define IS_MODEM_STATUS_CHANGE 0
|
||||
#define IS_NOTPENDING 1
|
||||
#define IS_TRANSMITTER_READY 2
|
||||
#define IS_RECEIVER_READY 4
|
||||
#define IS_LINE_STATUS_CHANGE 6
|
||||
#define IS_IDBITS 6
|
||||
|
||||
/* Line control bits. */
|
||||
#define LC_2STOP_BITS 0x04
|
||||
|
@ -659,8 +661,9 @@ static void rs232_handler(struct rs232 *rs)
|
|||
{
|
||||
/* Interrupt hander for RS232. */
|
||||
int s;
|
||||
int trying = 1000;
|
||||
|
||||
while (TRUE) {
|
||||
while (trying--) {
|
||||
u32_t v;
|
||||
/* Loop to pick up ALL pending interrupts for device.
|
||||
* This usually just wastes time unless the hardware has a buffer
|
||||
|
@ -668,8 +671,13 @@ static void rs232_handler(struct rs232 *rs)
|
|||
* Unfortunately, some serial cards lock up without this.
|
||||
*/
|
||||
if ((s = sys_inb(rs->int_id_port, &v)) != OK)
|
||||
printf("TTY: sys_inb() failed: %d", s);
|
||||
switch (v) {
|
||||
panic("TTY: sys_inb() failed: %d", s);
|
||||
|
||||
/* do we have interrupt info? */
|
||||
if(v & IS_NOTPENDING) return;
|
||||
|
||||
/* what kind of interrupt? */
|
||||
switch (v & IS_IDBITS) {
|
||||
case IS_RECEIVER_READY:
|
||||
in_int(rs);
|
||||
continue;
|
||||
|
@ -685,6 +693,8 @@ static void rs232_handler(struct rs232 *rs)
|
|||
}
|
||||
return;
|
||||
}
|
||||
|
||||
printf("tty rs232: enough!\n");
|
||||
}
|
||||
|
||||
/*===========================================================================*
|
||||
|
|
Loading…
Reference in a new issue