[kernel/f16] Fix DVB-S2 to DVB-S switch back on Kaffeine
mchehab
mchehab at fedoraproject.org
Tue Apr 17 21:47:20 UTC 2012
commit 185d60abac1ba85ca761e3bbfe2f4d8c54f1ddc3
Author: Mauro Carvalho Chehab <mchehab at redhat.com>
Date: Tue Apr 17 18:44:38 2012 -0300
Fix DVB-S2 to DVB-S switch back on Kaffeine
Kaffeine basically tried to switch back to DVB-S using FE_SET_FRONTEND.
This ioctl was not designed to allow mode switching.
The only ioctl that (explicitly) sets a mode is FE_SET_PROPERTY.
Yet, there's a compat code there that should have been converting the
call into something different than SYS_UNKNOWN.
So, let's fix the code there. It will hopefully do the right thing.
Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
dvb_frontend_switch_regression_fix.patch | 65 ++++++++++++++++++++++++++++++
kernel.spec | 5 ++
2 files changed, 70 insertions(+), 0 deletions(-)
---
diff --git a/dvb_frontend_switch_regression_fix.patch b/dvb_frontend_switch_regression_fix.patch
new file mode 100644
index 0000000..f5c7010
--- /dev/null
+++ b/dvb_frontend_switch_regression_fix.patch
@@ -0,0 +1,65 @@
+From c6c6fa8dcc27aad6ce3467544be0f57fd82b99a3 Mon Sep 17 00:00:00 2001
+From: Mauro Carvalho Chehab <mchehab at redhat.com>
+Date: Tue, 17 Apr 2012 18:32:19 -0300
+Subject: [PATCH] [media] dvb_frontend: Fix a regression when switching back
+ to DVB-S
+
+There are some softwares (Kaffeine and likely xine) that uses a
+DVBv5 call to switch to DVB-S2, but expects that a DVBv3 call to
+switch back to DVB-S. Well, this is not right, as a DVBv3 call
+doesn't know anything about delivery systems.
+
+However, as, by accident, this used to work, we need to restore its
+behavior, in order to avoid regressions with those softwares.
+
+Reported on this Fedora 16 bugzilla:
+ https://bugzilla.redhat.com/show_bug.cgi?id=812895
+
+Reported-by: Dieter Roever <Dieter.Roever at gmx.de>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+
+diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+index 4555baa..bb582fd 100644
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
+@@ -1443,6 +1443,28 @@ static int set_delivery_system(struct dvb_frontend *fe, u32 desired_system)
+ __func__);
+ return -EINVAL;
+ }
++ /*
++ * Get a delivery system that is compatible with DVBv3
++ * NOTE: in order for this to work with softwares like Kaffeine that
++ * uses a DVBv5 call for DVB-S2 and a DVBv3 call to go back to
++ * DVB-S, drivers that support both should put the SYS_DVBS entry
++ * before the SYS_DVBS2, otherwise it won't switch back to DVB-S.
++ * The real fix is that userspace applications should not use DVBv3
++ * and not trust on calling FE_SET_FRONTEND to switch the delivery
++ * system.
++ */
++ ncaps = 0;
++ while (fe->ops.delsys[ncaps] && ncaps < MAX_DELSYS) {
++ if (fe->ops.delsys[ncaps] == desired_system) {
++ delsys = desired_system;
++ break;
++ }
++ ncaps++;
++ }
++ if (delsys == SYS_UNDEFINED) {
++ dprintk("%s() Couldn't find a delivery system that matches %d\n",
++ __func__, desired_system);
++ }
+ } else {
+ /*
+ * This is a DVBv5 call. So, it likely knows the supported
+@@ -1491,9 +1513,10 @@ static int set_delivery_system(struct dvb_frontend *fe, u32 desired_system)
+ __func__);
+ return -EINVAL;
+ }
+- c->delivery_system = delsys;
+ }
+
++ c->delivery_system = delsys;
++
+ /*
+ * The DVBv3 or DVBv5 call is requesting a different system. So,
+ * emulation is needed.
diff --git a/kernel.spec b/kernel.spec
index 423f3ba..2ce9ce0 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -710,6 +710,7 @@ Patch2802: linux-2.6-silence-acpi-blacklist.patch
# add-poll-requested-events.patch was added for 3.4
Patch2900: add-poll-requested-events.patch
Patch2901: drivers-media-update.patch
+Patch2902: dvb_frontend_switch_regression_fix.patch
# fs fixes
@@ -1417,6 +1418,7 @@ ApplyPatch quite-apm.patch
# apply if non-empty
ApplyPatch add-poll-requested-events.patch
ApplyOptionalPatch drivers-media-update.patch
+ApplyPatch dvb_frontend_switch_regression_fix.patch
# Patches headed upstream
@@ -2229,6 +2231,9 @@ fi
# and build.
%changelog
+* Tue Apr 17 2012 Mauro Carvalho Chehab <mchehab at redhat.com>
+- Fix DVB-S2->DVB-S switch regression (rhbz 812895)
+
* Tue Apr 17 2012 Josh Boyer <jwboyer at redhat.com>
- Fix oops in nfs_have_delegation (rhbz 811138)
- Fix oops on invalid AMD microcode load (rhbz 797559)
More information about the scm-commits
mailing list