summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Maciej Nowak2017-02-02 21:53:58 +0100
committerTomasz Maciej Nowak2017-02-02 21:53:58 +0100
commit0568c76543ae09a74e87c5ea231fe3160d01c488 (patch)
tree3c6bb31469f9fbb279eff24f4bd8da6ad71db05b
downloadaur-0568c76543ae09a74e87c5ea231fe3160d01c488.tar.gz
Initial commit
-rw-r--r--.SRCINFO35
-rw-r--r--93-vtunerc.rules1
-rw-r--r--PKGBUILD34
-rw-r--r--dkms.conf18
-rw-r--r--kernel-3.10.patch154
-rw-r--r--kernel-4.2.patch39
-rw-r--r--kernel-4.6.patch15
-rw-r--r--tweaks.patch144
8 files changed, 440 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..e02d822c3619
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,35 @@
+# Generated by mksrcinfo v8
+# Thu Feb 2 20:48:19 UTC 2017
+pkgbase = vtunerc-dkms
+ pkgdesc = VTuner client kernel module for virtual DVB's
+ pkgver = 1.4
+ pkgrel = 1
+ url = http://code.google.com/p/vtuner/
+ arch = x86_64
+ arch = i686
+ arch = arm
+ arch = armv6h
+ arch = armv7h
+ arch = aarch64
+ license = GPL2
+ depends = linux>=3.3
+ depends = dkms
+ conflicts = vtuner-module
+ conflicts = vtuner-module-lts
+ source = vtuner.linux-driver-rel1.4.tar.gz::https://github.com/lecotex/vtuner.linux-driver/archive/rel1.4.tar.gz
+ source = kernel-3.10.patch
+ source = kernel-4.2.patch
+ source = kernel-4.6.patch
+ source = tweaks.patch
+ source = 93-vtunerc.rules
+ source = dkms.conf
+ sha256sums = c6ba0cfd808e3f8473a5ea25d4ac2871b826edc62de5f3624c0bd812aad63bc1
+ sha256sums = caf2b8c5c4bf7808da4c48fa272f1706e0ca1ca4db84a08d9d2373e6e38e7812
+ sha256sums = ab7f8c73aa578e4bc0a7cf58c112115cb6f215eb0a7f013773d6d4a50730d527
+ sha256sums = 6c634f32b245cfc097e45b426515a1d8f5c892a60a9f9e442540d6b3a2489042
+ sha256sums = bd5d9b0659fb8a2d8555adc7f60bcf2915f29244402a744aac9e10b1a50adb8c
+ sha256sums = 4b2d860cac8c8bab2d8fa79760d4405bef6fd042f4e78b680d25d1a5ebcbf83d
+ sha256sums = d2e90a5d2da394c9ffe4ab796383d6cdd7304e926ad095b7dad6fec4a23efd5d
+
+pkgname = vtunerc-dkms
+
diff --git a/93-vtunerc.rules b/93-vtunerc.rules
new file mode 100644
index 000000000000..6c227a287167
--- /dev/null
+++ b/93-vtunerc.rules
@@ -0,0 +1 @@
+ACTION=="add", KERNEL=="vtunerc*", SUBSYSTEMS=="dvb", MODE="0660", GROUP="video"
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..e7ba93dd3d4a
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,34 @@
+# Maintainer: Tomasz Maciej Nowak <com[dot]gmail[at]tmn505>
+pkgname='vtunerc-dkms'
+pkgdesc="VTuner client kernel module for virtual DVB's"
+pkgver=1.4
+pkgrel=1
+arch=('x86_64' 'i686' 'arm' 'armv6h' 'armv7h' 'aarch64')
+url="http://code.google.com/p/vtuner/"
+license=('GPL2')
+depends=('linux>=3.3' 'dkms')
+conflicts=('vtuner-module' 'vtuner-module-lts')
+source=("vtuner.linux-driver-rel${pkgver}.tar.gz::https://github.com/lecotex/vtuner.linux-driver/archive/rel${pkgver}.tar.gz"
+ 'kernel-3.10.patch'
+ 'kernel-4.2.patch'
+ 'kernel-4.6.patch'
+ 'tweaks.patch'
+ '93-vtunerc.rules'
+ 'dkms.conf')
+sha256sums=('c6ba0cfd808e3f8473a5ea25d4ac2871b826edc62de5f3624c0bd812aad63bc1'
+ 'caf2b8c5c4bf7808da4c48fa272f1706e0ca1ca4db84a08d9d2373e6e38e7812'
+ 'ab7f8c73aa578e4bc0a7cf58c112115cb6f215eb0a7f013773d6d4a50730d527'
+ '6c634f32b245cfc097e45b426515a1d8f5c892a60a9f9e442540d6b3a2489042'
+ 'bd5d9b0659fb8a2d8555adc7f60bcf2915f29244402a744aac9e10b1a50adb8c'
+ '4b2d860cac8c8bab2d8fa79760d4405bef6fd042f4e78b680d25d1a5ebcbf83d'
+ 'd2e90a5d2da394c9ffe4ab796383d6cdd7304e926ad095b7dad6fec4a23efd5d')
+
+package() {
+ install -dm755 ${pkgdir}/usr/src/vtunerc-${pkgver}/patches
+ cp \
+ ${srcdir}/vtuner.linux-driver-rel${pkgver}/* \
+ ${srcdir}/dkms.conf \
+ ${pkgdir}/usr/src/vtunerc-${pkgver}
+ cp ${srcdir}/*.patch ${pkgdir}/usr/src/vtunerc-${pkgver}/patches
+ install -Dm644 ${srcdir}/93-vtunerc.rules ${pkgdir}/usr/lib/udev/rules.d/93-vtunerc.rules
+}
diff --git a/dkms.conf b/dkms.conf
new file mode 100644
index 000000000000..4e674bf39dde
--- /dev/null
+++ b/dkms.conf
@@ -0,0 +1,18 @@
+PACKAGE_NAME="vtunerc"
+PACKAGE_VERSION="1.4"
+AUTOINSTALL="yes"
+
+BUILT_MODULE_NAME[0]="vtunerc"
+MAKE[0]="make KDIR=/usr/lib/modules/$kernelver/build VTUNERC_MAX_ADAPTERS=8"
+DEST_MODULE_LOCATION[0]="/kernel/drivers/media"
+
+PATCH[0]="tweaks.patch"
+
+PATCH[1]="kernel-3.10.patch"
+PATCH_MATCH[1]="(3\.1[0-9]\.(.*)|4.*)"
+
+PATCH[2]="kernel-4.2.patch"
+PATCH_MATCH[2]="(4\.[2-9](.*)|4\.[0-9][0-9]\.(.*))"
+
+PATCH[3]="kernel-4.6.patch"
+PATCH_MATCH[3]="(4\.[6-9](.*)|4\.[0-9][0-9]\.(.*))"
diff --git a/kernel-3.10.patch b/kernel-3.10.patch
new file mode 100644
index 000000000000..df72c3a4defa
--- /dev/null
+++ b/kernel-3.10.patch
@@ -0,0 +1,154 @@
+diff -uprNx '.*' vtuner.linux-driver-rel1.4.orig/vtunerc_main.c vtuner.linux-driver-rel1.4/vtunerc_main.c
+--- vtuner.linux-driver-rel1.4.orig/vtunerc_main.c 2016-01-10 21:20:06.319074454 +0100
++++ vtuner.linux-driver-rel1.4/vtunerc_main.c 2016-01-10 21:22:45.112413694 +0100
+@@ -22,6 +22,7 @@
+ #include <linux/i2c.h>
+ #include <asm/uaccess.h>
+ #include <linux/delay.h>
++#include <linux/seq_file.h>
+
+ #include "demux.h"
+ #include "dmxdev.h"
+@@ -176,64 +177,53 @@ static char *get_fe_name(struct dvb_fron
+ return (feinfo && feinfo->name) ? feinfo->name : "(not set)";
+ }
+
+-/**
+- * @brief procfs file handler
+- * @param buffer:
+- * @param start:
+- * @param offset:
+- * @param size:
+- * @param eof:
+- * @param data:
+- * @return =0: success <br/>
+- * <0: if any error occur
+- */
+-#define MAXBUF 512
+-int vtunerc_read_proc(char *buffer, char **start, off_t offset, int size,
+- int *eof, void *data)
+-{
+- char outbuf[MAXBUF] = "[ vtunerc driver, version "
+- VTUNERC_MODULE_VERSION " ]\n";
+- int blen, i, pcnt;
+- struct vtunerc_ctx *ctx = (struct vtunerc_ctx *)data;
+-
+- blen = strlen(outbuf);
+- sprintf(outbuf+blen, " sessions: %u\n", ctx->stat_ctrl_sess);
+- blen = strlen(outbuf);
+- sprintf(outbuf+blen, " TS data : %u\n", ctx->stat_wr_data);
+- blen = strlen(outbuf);
+- sprintf(outbuf+blen, " PID tab :");
+- pcnt = 0;
+- for (i = 0; i < MAX_PIDTAB_LEN; i++) {
+- blen = strlen(outbuf);
+- if (ctx->pidtab[i] != PID_UNKNOWN) {
+- sprintf(outbuf+blen, " %x", ctx->pidtab[i]);
++static int vtunerc_read_proc(struct seq_file *seq, void *v)
++{
++ int i, pcnt = 0;
++ struct vtunerc_ctx *ctx = (struct vtunerc_ctx *)seq->private;
++ seq_printf(seq, "[ vtunerc driver, version "
++ VTUNERC_MODULE_VERSION " ]\n");
++ seq_printf(seq, " sessions: %u\n", ctx->stat_ctrl_sess);
++ seq_printf(seq, " TS data : %u\n", ctx->stat_wr_data);
++ seq_printf(seq, " PID tab :");
++ for (i = 0; i < MAX_PIDTAB_LEN; i++)
++ if (ctx->pidtab[i] != PID_UNKNOWN) {
++ seq_printf(seq, " %x", ctx->pidtab[i]);
+ pcnt++;
+- }
+- }
+- blen = strlen(outbuf);
+- sprintf(outbuf+blen, " (len=%d)\n", pcnt);
+- blen = strlen(outbuf);
+- sprintf(outbuf+blen, " FE type : %s\n", get_fe_name(ctx->feinfo));
+-
+- blen = strlen(outbuf);
+- sprintf(outbuf+blen, " msg xchg: %d/%d\n", ctx->ctrldev_request.type, ctx->ctrldev_response.type);
+-
+- blen = strlen(outbuf);
+-
+- if (size < blen)
+- return -EINVAL;
+-
+- if (offset != 0)
+- return 0;
+-
+- strcpy(buffer, outbuf);
+-
+- /* signal EOF */
+- *eof = 1;
++ }
++ seq_printf(seq, " (len=%d)\n", pcnt);
++ seq_printf(seq, " FE type : %s\n", get_fe_name(ctx->feinfo));
++ seq_printf(seq, " msg xchg: %d/%d\n", ctx->ctrldev_request.type, ctx->ctrldev_response.type);
++ return 0;
++}
+
+- return blen;
++static int vtunerc_proc_open(struct inode *inode, struct file *file)
++{
++ int ret;
++ struct vtunerc_ctx *ctx = PDE_DATA(inode);
++
++ if (!try_module_get(THIS_MODULE))
++ return -ENODEV;
++ ret = single_open(file, vtunerc_read_proc, ctx);
++ if (ret)
++ module_put(THIS_MODULE);
++ return ret;
++}
+
++static int vtuner_proc_release(struct inode *inode, struct file *file)
++{
++ int ret = single_release(inode, file);
++ module_put(THIS_MODULE);
++ return ret;
+ }
++
++static const struct file_operations vtunerc_read_proc_fops = {
++ .open = vtunerc_proc_open,
++ .read = seq_read,
++ .llseek = seq_lseek,
++ .release = vtuner_proc_release,
++ };
++
+ #endif
+
+ static char *my_strdup(const char *s)
+@@ -346,8 +336,8 @@ static int __init vtunerc_init(void)
+ sprintf(procfilename, VTUNERC_PROC_FILENAME,
+ ctx->idx);
+ ctx->procname = my_strdup(procfilename);
+- if (create_proc_read_entry(ctx->procname, 0, NULL,
+- vtunerc_read_proc,
++ if (proc_create_data(ctx->procname, 0, NULL,
++ &vtunerc_read_proc_fops,
+ ctx) == 0)
+ printk(KERN_WARNING
+ "vtunerc%d: Unable to register '%s' proc file\n",
+diff -uprNx '.*' vtuner.linux-driver-rel1.4.orig/vtunerc_priv.h vtuner.linux-driver-rel1.4/vtunerc_priv.h
+--- vtuner.linux-driver-rel1.4.orig/vtunerc_priv.h 2013-04-18 23:19:32.000000000 +0200
++++ vtuner.linux-driver-rel1.4/vtunerc_priv.h 2016-01-10 21:22:05.879078901 +0100
+@@ -20,6 +20,7 @@
+ #include <linux/module.h> /* Specifically, a module */
+ #include <linux/kernel.h> /* We're doing kernel work */
+ #include <linux/cdev.h>
++#include <linux/version.h>
+
+ #include "demux.h"
+ #include "dmxdev.h"
+@@ -108,4 +109,12 @@ if (ctx->config && (ctx->config->debug))
+ printk(KERN_DEBUG "vtunerc%d: " fmt, ctx->idx, ##arg); \
+ } while (0)
+
++/* backward compatibility stuff */
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
++static inline void *PDE_DATA(const struct inode *inode)
++{
++ return PROC_I(inode)->pde->data;
++}
++#endif
++
+ #endif
diff --git a/kernel-4.2.patch b/kernel-4.2.patch
new file mode 100644
index 000000000000..24af5d2f6540
--- /dev/null
+++ b/kernel-4.2.patch
@@ -0,0 +1,39 @@
+diff -uprNx '.*' vtuner.linux-driver.orig/vtunerc_proxyfe.c vtuner.linux-driver/vtunerc_proxyfe.c
+--- vtuner.linux-driver.orig/vtunerc_proxyfe.c 2016-01-10 03:06:52.000000000 +0100
++++ vtuner.linux-driver/vtunerc_proxyfe.c 2016-01-10 12:55:53.141702168 +0100
+@@ -36,7 +36,7 @@ struct dvb_proxyfe_state {
+ };
+
+
+-static int dvb_proxyfe_read_status(struct dvb_frontend *fe, fe_status_t *status)
++static int dvb_proxyfe_read_status(struct dvb_frontend *fe, enum fe_status *status)
+ {
+ struct dvb_proxyfe_state *state = fe->demodulator_priv;
+ struct vtunerc_ctx *ctx = state->ctx;
+@@ -254,7 +254,7 @@ static int dvb_proxyfe_init(struct dvb_f
+ return 0;
+ }
+
+-static int dvb_proxyfe_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
++static int dvb_proxyfe_set_tone(struct dvb_frontend *fe, enum fe_sec_tone_mode tone)
+ {
+ struct dvb_proxyfe_state *state = fe->demodulator_priv;
+ struct vtunerc_ctx *ctx = state->ctx;
+@@ -267,7 +267,7 @@ static int dvb_proxyfe_set_tone(struct d
+ return 0;
+ }
+
+-static int dvb_proxyfe_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
++static int dvb_proxyfe_set_voltage(struct dvb_frontend *fe, enum fe_sec_voltage voltage)
+ {
+ struct dvb_proxyfe_state *state = fe->demodulator_priv;
+ struct vtunerc_ctx *ctx = state->ctx;
+@@ -293,7 +293,7 @@ static int dvb_proxyfe_send_diseqc_msg(s
+ return 0;
+ }
+
+-static int dvb_proxyfe_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst)
++static int dvb_proxyfe_send_diseqc_burst(struct dvb_frontend *fe, enum fe_sec_mini_cmd burst)
+ {
+ struct dvb_proxyfe_state *state = fe->demodulator_priv;
+ struct vtunerc_ctx *ctx = state->ctx;
diff --git a/kernel-4.6.patch b/kernel-4.6.patch
new file mode 100644
index 000000000000..afa3e551f0f4
--- /dev/null
+++ b/kernel-4.6.patch
@@ -0,0 +1,15 @@
+diff -uprNx '.*' vtuner.linux-driver-rel1.4.orig/vtunerc_proxyfe.c vtuner.linux-driver-rel1.4/vtunerc_proxyfe.c
+--- vtuner.linux-driver-rel1.4.orig/vtunerc_proxyfe.c 2016-08-05 11:33:24.000000000 +0200
++++ vtuner.linux-driver-rel1.4/vtunerc_proxyfe.c 2016-08-05 11:34:37.840983911 +0200
+@@ -107,9 +107,9 @@ static int dvb_proxyfe_read_ucblocks(str
+ return 0;
+ }
+
+-static int dvb_proxyfe_get_frontend(struct dvb_frontend *fe)
++static int dvb_proxyfe_get_frontend(struct dvb_frontend *fe,
++ struct dtv_frontend_properties *c)
+ {
+- struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+ struct dvb_proxyfe_state *state = fe->demodulator_priv;
+ struct vtunerc_ctx *ctx = state->ctx;
+ struct vtuner_message msg;
diff --git a/tweaks.patch b/tweaks.patch
new file mode 100644
index 000000000000..dfacb16434f9
--- /dev/null
+++ b/tweaks.patch
@@ -0,0 +1,144 @@
+diff -uprNx '.*' vtuner.linux-driver/vtunerc_ctrldev.c vtuner_tweak/vtunerc_ctrldev.c
+--- vtuner.linux-driver/vtunerc_ctrldev.c 2015-03-27 16:20:00.000000000 +0100
++++ vtuner_tweak/vtunerc_ctrldev.c 2015-05-10 02:19:42.000000000 +0200
+@@ -404,7 +411,7 @@ void vtunerc_unregister_ctrldev(struct v
+ int vtunerc_ctrldev_xchange_message(struct vtunerc_ctx *ctx,
+ struct vtuner_message *msg, int wait4response)
+ {
+- //dprintk(ctx, "XCH_MSG: %d: entered\n", msg->type);
++ dprintk(ctx, "XCH_MSG: %d: entered\n", msg->type);
+ if (down_interruptible(&ctx->xchange_sem))
+ return -ERESTARTSYS;
+
+@@ -413,7 +420,7 @@ int vtunerc_ctrldev_xchange_message(stru
+ up(&ctx->xchange_sem);
+ return 0;
+ }
+- //dprintk(ctx, "XCH_MSG: %d: continue\n", msg->type);
++ dprintk(ctx, "XCH_MSG: %d: continue\n", msg->type);
+
+ #if 0
+ BUG_ON(ctx->ctrldev_request.type != -1);
+@@ -433,7 +440,7 @@ int vtunerc_ctrldev_xchange_message(stru
+
+ if (wait_event_interruptible(ctx->ctrldev_wait_response_wq,
+ ctx->ctrldev_response.type != -1)) {
+- //dprintk(ctx, "XCH_MSG: %d: wait_event interrupted\n", msg->type);
++ dprintk(ctx, "XCH_MSG: %d: wait_event interrupted\n", msg->type);
+ ctx->ctrldev_request.type = -1;
+ up(&ctx->xchange_sem);
+ return -ERESTARTSYS;
+@@ -441,7 +448,7 @@ int vtunerc_ctrldev_xchange_message(stru
+
+ BUG_ON(ctx->ctrldev_response.type == -1);
+
+- //dprintk(ctx, "XCH_MSG: %d -> %d (DONE)\n", msg->type, ctx->ctrldev_response.type);
++ dprintk(ctx, "XCH_MSG: %d -> %d (DONE)\n", msg->type, ctx->ctrldev_response.type);
+ memcpy(msg, &ctx->ctrldev_response, sizeof(struct vtuner_message));
+ ctx->ctrldev_response.type = -1;
+
+diff -uprNx '.*' vtuner.linux-driver/vtunerc_main.c vtuner_tweak/vtunerc_main.c
+--- vtuner.linux-driver/vtunerc_main.c 2015-03-27 16:20:00.000000000 +0100
++++ vtuner_tweak/vtunerc_main.c 2015-05-10 02:19:42.000000000 +0200
+@@ -101,10 +101,10 @@ static void pidtab_copy_to_msg(struct vt
+ struct vtuner_message *msg)
+ {
+ int i;
+-
+- for (i = 0; i < (MAX_PIDTAB_LEN - 1); i++)
++
++ for (i = 0; i < MAX_PIDTAB_LEN ; i++)
+ msg->body.pidlist[i] = ctx->pidtab[i]; /*TODO: optimize it*/
+- msg->body.pidlist[MAX_PIDTAB_LEN - 1] = 0;
++ /* msg->body.pidlist[MAX_PIDTAB_LEN - 1] = 0; */
+ }
+
+ static int vtunerc_start_feed(struct dvb_demux_feed *feed)
+@@ -128,8 +128,12 @@ static int vtunerc_start_feed(struct dvb
+ return -EINVAL;
+ }
+
+- /* organize PID list table */
++ if (feed->pid >= 0x2000 ) {
++ printk(KERN_ERR "vtunerc%d: full mux not supported\n",ctx->idx);
++ return -EINVAL;
++ }
+
++ /* organize PID list table */
+ if (pidtab_find_index(ctx->pidtab, feed->pid) < 0) {
+ pidtab_add_pid(ctx->pidtab, feed->pid);
+
+diff -uprNx '.*' vtuner.linux-driver/vtunerc_proxyfe.c vtuner_tweak/vtunerc_proxyfe.c
+--- vtuner.linux-driver/vtunerc_proxyfe.c 2015-03-27 16:20:00.000000000 +0100
++++ vtuner_tweak/vtunerc_proxyfe.c 2016-01-10 03:04:10.468098249 +0100
+@@ -174,52 +180,12 @@ static int dvb_proxyfe_set_frontend(stru
+
+ if (ctx->vtype == VT_S2 && c->delivery_system == SYS_DVBS2) {
+ /* DELIVERY SYSTEM: S2 delsys in use */
+- msg.body.fe_params.u.qpsk.fec_inner = 9;
++ msg.body.fe_params.u.qpsk.fec_inner |= 32;
+
+ /* MODULATION */
+ if (c->modulation == PSK_8)
+- /* signal PSK_8 modulation used */
+- msg.body.fe_params.u.qpsk.fec_inner += 9;
+-
+- /* FEC */
+- switch (c->fec_inner) {
+- case FEC_1_2:
+- msg.body.fe_params.u.qpsk.fec_inner += 1;
+- break;
+- case FEC_2_3:
+- msg.body.fe_params.u.qpsk.fec_inner += 2;
+- break;
+- case FEC_3_4:
+- msg.body.fe_params.u.qpsk.fec_inner += 3;
+- break;
+- case FEC_4_5:
+- msg.body.fe_params.u.qpsk.fec_inner += 8;
+- break;
+- case FEC_5_6:
+- msg.body.fe_params.u.qpsk.fec_inner += 4;
+- break;
+- /*case FEC_6_7: // undefined
+- msg.body.fe_params.u.qpsk.fec_inner += 2;
+- break;*/
+- case FEC_7_8:
+- msg.body.fe_params.u.qpsk.fec_inner += 5;
+- break;
+- case FEC_8_9:
+- msg.body.fe_params.u.qpsk.fec_inner += 6;
+- break;
+- /*case FEC_AUTO: // undefined
+- msg.body.fe_params.u.qpsk.fec_inner += 2;
+- break;*/
+- case FEC_3_5:
+- msg.body.fe_params.u.qpsk.fec_inner += 7;
+- break;
+- case FEC_9_10:
+- msg.body.fe_params.u.qpsk.fec_inner += 9;
+- break;
+- default:
+- ; /*FIXME: what now? */
+- break;
+- }
++ /* signal PSK_8 modulation used */
++ msg.body.fe_params.u.qpsk.fec_inner |= 64;
+
+ /* ROLLOFF */
+ switch (c->rolloff) {
+@@ -506,10 +480,10 @@ static struct dvb_frontend_ops dvb_proxy
+ .frequency_tolerance = 29500,
+ .symbol_rate_min = 1000000,
+ .symbol_rate_max = 45000000,
+- .caps = FE_CAN_INVERSION_AUTO |
+- FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
+- FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
+- FE_CAN_QPSK
++ .caps = FE_CAN_INVERSION_AUTO | FE_CAN_FEC_1_2 |
++ FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | FE_CAN_FEC_4_5 |
++ FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 |
++ FE_CAN_QPSK | FE_CAN_RECOVER
+ },
+
+ .release = dvb_proxyfe_release,