summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryokota <yokota@FreeBSD.org>1999-12-07 11:23:58 +0000
committeryokota <yokota@FreeBSD.org>1999-12-07 11:23:58 +0000
commit6969be118893d65257541cd82a7fbea8ef969586 (patch)
tree3ac9fbeb111927e58f3cd8245b6f95580c397879
parentd29133dba78088590a688c17b161e9000781e9cf (diff)
downloadFreeBSD-src-6969be118893d65257541cd82a7fbea8ef969586.zip
FreeBSD-src-6969be118893d65257541cd82a7fbea8ef969586.tar.gz
Fix the ioctl CONS_FINDMODE and its underlying subroutine
xxx_query_mode() in the vga and vesa drivers. - xxx_query_mode() returns 0 (success) and a positive error number. - Copy mode information on success. - Remove redundant structure copy. The bug first found in -STABLE by jmg.
-rw-r--r--sys/dev/fb/fb.c8
-rw-r--r--sys/dev/fb/vga.c9
-rw-r--r--sys/i386/isa/vesa.c11
3 files changed, 10 insertions, 18 deletions
diff --git a/sys/dev/fb/fb.c b/sys/dev/fb/fb.c
index 59ac170..b95003e 100644
--- a/sys/dev/fb/fb.c
+++ b/sys/dev/fb/fb.c
@@ -754,14 +754,6 @@ fb_commonioctl(video_adapter_t *adp, u_long cmd, caddr_t arg)
case FBIO_FINDMODE: /* find a matching video mode */
error = (*vidsw[adp->va_index]->query_mode)(adp,
(video_info_t *)arg);
- if (error < 0) {
- error = EINVAL;
- } else {
- error = (*vidsw[adp->va_index]->get_info)(adp,
- error, (video_info_t *)arg);
- if (error)
- error = ENODEV; /* shouldn't happen */
- }
break;
case FBIO_GETMODE: /* get video mode */
diff --git a/sys/dev/fb/vga.c b/sys/dev/fb/vga.c
index 6c96dae..f733e47 100644
--- a/sys/dev/fb/vga.c
+++ b/sys/dev/fb/vga.c
@@ -1441,11 +1441,10 @@ vga_get_info(video_adapter_t *adp, int mode, video_info_t *info)
static int
vga_query_mode(video_adapter_t *adp, video_info_t *info)
{
- video_info_t buf;
int i;
if (!vga_init_done)
- return -1;
+ return ENXIO;
for (i = 0; bios_vmode[i].vi_mode != EOT; ++i) {
if (bios_vmode[i].vi_mode == NA)
@@ -1475,11 +1474,11 @@ vga_query_mode(video_adapter_t *adp, video_info_t *info)
continue;
/* verify if this mode is supported on this adapter */
- if (vga_get_info(adp, bios_vmode[i].vi_mode, &buf))
+ if (vga_get_info(adp, bios_vmode[i].vi_mode, info))
continue;
- return bios_vmode[i].vi_mode;
+ return 0;
}
- return -1;
+ return ENODEV;
}
/*
diff --git a/sys/i386/isa/vesa.c b/sys/i386/isa/vesa.c
index a209251..ee2e463 100644
--- a/sys/i386/isa/vesa.c
+++ b/sys/i386/isa/vesa.c
@@ -937,10 +937,10 @@ vesa_query_mode(video_adapter_t *adp, video_info_t *info)
{
int i;
- if ((i = (*prevvidsw->query_mode)(adp, info)) != -1)
- return i;
+ if ((*prevvidsw->query_mode)(adp, info) == 0)
+ return 0;
if (adp != vesa_adp)
- return -1;
+ return ENODEV;
for (i = 0; vesa_vmode[i].vi_mode != EOT; ++i) {
if ((info->vi_width != 0)
@@ -965,9 +965,10 @@ vesa_query_mode(video_adapter_t *adp, video_info_t *info)
if ((info->vi_flags != 0)
&& (info->vi_flags != vesa_vmode[i].vi_flags))
continue;
- return vesa_vmode[i].vi_mode;
+ *info = vesa_vmode[i];
+ return 0;
}
- return -1;
+ return ENODEV;
}
static int
OpenPOWER on IntegriCloud