Subject: Re: should cngetc block?
To: None <eeh@netbsd.org>
From: Kin Cho <kin@neoscale.com>
List: tech-kern
Date: 02/05/2002 19:55:41
eeh@netbsd.org writes:
> cnpollc() is there to enable or disable interrupts so the console
> device can enter and exit polled I/O mode, not to change the
> behavior of cngetc().
I see.
> Changing that interface will require modifications to all drivers
> that support that console interface, not just the `com' driver.
I agree.
> If you want to change that interface so that cngetc() does not
> block, you need to put together a proposal explaining what you
> want to do, how you want to do it, and why it's needed.
My proposal is this:
Objective:
* To provide a way to poll for keyboard input in the interface
"struct consdev". However, only the "com" driver will support
this.
Changes overview:
* Overload cn_pollc in "struct consdev" to enable non-blocking
cn_getc. For example, cn_pollc(dev, 0xa000) makes cn_getc
non-blocking, while cn_pollc(dev, 0xb000) makes cn_getc
blocking
Changes:
In cons.h:
#define CN_NONBLOCKING 0xa000
#define CN_BLOCKING 0xb000
In com.c:
* add static global poll_com_common_getc flag of type int,
initialized to 1
* comcnpollc checks "on" parameter, if equal to CN_NONBLOCKING,
set poll_com_common_getc to 0, if equal to CN_BLOCKING, sets
poll_com_common_getc to 1,
* in com_common_getc, change polling loop to this:
/*
* block until a character becomes available if polling,
* else return if none available now
*/
while (!ISSET(stat = bus_space_read_1(iot, ioh, com_lsr), LSR_RXRDY))
if (!poll_com_common_getc) {
c = -1;
goto L_quit;
}
...
L_quit:
splx(s);
return (c);
}
End of proposal.
-kin