diff mbox

[for,v3.6] VIDIOC_ENUM_FREQ_BANDS fix

Message ID 201208012152.46310.hverkuil@xs4all.nl (mailing list archive)
State New, archived
Headers show

Commit Message

Hans Verkuil Aug. 1, 2012, 7:52 p.m. UTC
When VIDIOC_ENUM_FREQ_BANDS is called for a driver that doesn't supply an
enum_freq_bands op, then it will fall back to reporting a single freq band
based on information from g_tuner or g_modulator.

Due to a bug this is an infinite list since the index field wasn't tested.

This patch fixes this and returns -EINVAL if index != 0.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Rémi Denis-Courmont Aug. 1, 2012, 8:41 p.m. UTC | #1
Le mercredi 1 août 2012 22:52:46 Hans Verkuil, vous avez écrit :
> When VIDIOC_ENUM_FREQ_BANDS is called for a driver that doesn't supply an
> enum_freq_bands op, then it will fall back to reporting a single freq band
> based on information from g_tuner or g_modulator.

By the way...

Isn't V4L2_TUNER_CAP_FREQ_BANDS expected to tell whether the driver can 
enumerate bands? Why is there a need for fallback implementation?
Hans Verkuil Aug. 2, 2012, 6:25 a.m. UTC | #2
On Wed August 1 2012 22:41:16 Rémi Denis-Courmont wrote:
> Le mercredi 1 août 2012 22:52:46 Hans Verkuil, vous avez écrit :
> > When VIDIOC_ENUM_FREQ_BANDS is called for a driver that doesn't supply an
> > enum_freq_bands op, then it will fall back to reporting a single freq band
> > based on information from g_tuner or g_modulator.
> 
> By the way...
> 
> Isn't V4L2_TUNER_CAP_FREQ_BANDS expected to tell whether the driver can 
> enumerate bands?

Yes. And it is set as well in this fallback case.

> Why is there a need for fallback implementation?

The main reason is that struct v4l2_frequency_band also returns the modulation
of the frequency band. For all existing drivers (except radio-cadet, which
now implements enum_freq_bands) this can be deduced by the type of device node
that's used (/dev/radioX means FM, /dev/videoX or vbiX means VSB). While the
application could do the same we decided it was more consistent if the V4L2
core does that for the application. It was trivial to implement.

So apps will benefit, and only drivers that actually have more than one
frequency band need to go to the trouble of implementing enum_freq_bands.

Regards,

	Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/media/video/v4l2-ioctl.c b/drivers/media/video/v4l2-ioctl.c
index c3b7b5f..54f4ac6 100644
--- a/drivers/media/video/v4l2-ioctl.c
+++ b/drivers/media/video/v4l2-ioctl.c
@@ -1853,6 +1853,8 @@  static int v4l_enum_freq_bands(const struct v4l2_ioctl_ops *ops,
 			.type = type,
 		};
 
+		if (p->index)
+			return -EINVAL;
 		err = ops->vidioc_g_tuner(file, fh, &t);
 		if (err)
 			return err;
@@ -1870,6 +1872,8 @@  static int v4l_enum_freq_bands(const struct v4l2_ioctl_ops *ops,
 
 		if (type != V4L2_TUNER_RADIO)
 			return -EINVAL;
+		if (p->index)
+			return -EINVAL;
 		err = ops->vidioc_g_modulator(file, fh, &m);
 		if (err)
 			return err;