stand/efi/eficom: better handling of absent device

Don't even have a comc_port when the port doesn't exist: always free it
if we probe that it's not there. Also, when it's not present, clear the
flags indicating presence to avoid disturbing other flags.

Sponsored by:		Netflix
Reviewed by:		tsoome, kevans
Differential Revision:	https://reviews.freebsd.org/D40220
This commit is contained in:
Warner Losh 2023-05-24 16:34:31 -06:00
parent 2efbc8e284
commit f28dff43ad

View file

@ -332,9 +332,12 @@ comc_probe(struct console *sc)
env_setenv("efi_com_speed", EV_VOLATILE, value,
comc_speed_set, env_nounset);
eficom.c_flags = 0;
if (comc_setup()) {
sc->c_flags = C_PRESENTIN | C_PRESENTOUT;
} else {
sc->c_flags &= ~(C_PRESENTIN | C_PRESENTOUT);
free(comc_port);
comc_port = NULL;
}
}
@ -349,14 +352,20 @@ comc_probe_compat(struct console *sc)
}
#endif
/*
* Called when the console is selected in cons_change. If we didn't detect the
* device, comc_port will be NULL, and comc_setup will fail. It may be called
* even when the device isn't present as a 'fallback' console or when listed
* specifically in console env, so we have to reset the c_flags in those case to
* say it's not present.
*/
static int
comc_init(int arg __unused)
{
if (comc_setup())
return (CMD_OK);
eficom.c_flags = 0;
eficom.c_flags &= ~(C_ACTIVEIN | C_ACTIVEOUT);
return (CMD_ERROR);
}
@ -516,8 +525,10 @@ comc_setup(void)
EFI_STATUS status;
char *ev;
/* port is not usable */
if (comc_port->sio == NULL)
/*
* If the device isn't active, or there's no port present.
*/
if ((eficom.c_flags & (C_ACTIVEIN | C_ACTIVEOUT)) == 0 || comc_port == NULL)
return (false);
if (comc_port->sio->Reset != NULL) {