Fix meta-bsp structure.
[vuplus_openvuplus_3.0] / meta-bsp / common / recipes / linux / linux-vuplus-2.6.37 / dvb-core.patch
diff --git a/meta-bsp/common/recipes/linux/linux-vuplus-2.6.37/dvb-core.patch b/meta-bsp/common/recipes/linux/linux-vuplus-2.6.37/dvb-core.patch
deleted file mode 100644 (file)
index 87b1738..0000000
+++ /dev/null
@@ -1,1330 +0,0 @@
-diff --git a/drivers/media/dvb/dvb-core/Makefile b/drivers/media/dvb/dvb-core/Makefile
-index 0b51828..8f22bcd 100644
---- a/drivers/media/dvb/dvb-core/Makefile
-+++ b/drivers/media/dvb/dvb-core/Makefile
-@@ -2,8 +2,10 @@
- # Makefile for the kernel DVB device drivers.
- #
-+dvb-net-$(CONFIG_DVB_NET) := dvb_net.o
-+
- dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o   \
-                dvb_ca_en50221.o dvb_frontend.o                \
--               dvb_net.o dvb_ringbuffer.o dvb_math.o
-+               $(dvb-net-y) dvb_ringbuffer.o dvb_math.o
- obj-$(CONFIG_DVB_CORE) += dvb-core.o
-diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c
-index ad1f61d..cb59681 100644
---- a/drivers/media/dvb/dvb-core/dmxdev.c
-+++ b/drivers/media/dvb/dvb-core/dmxdev.c
-@@ -83,7 +83,11 @@ static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
-               ret = wait_event_interruptible(src->queue,
-                                              !dvb_ringbuffer_empty(src) ||
--                                             (src->error != 0));
-+                                             (src->error != 0) ||
-+                                             (src->do_wait != 1));
-+              if (src->do_wait != 1)
-+                      ret = -EINTR;
-+
-               if (ret < 0)
-                       break;
-@@ -572,13 +576,13 @@ static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev,
-       dmx_output_t otype;
-       int ret;
-       int ts_type;
--      enum dmx_ts_pes ts_pes;
-+      dmx_pes_type_t ts_pes;
-       struct dmx_ts_feed *tsfeed;
-       feed->ts = NULL;
-       otype = para->output;
--      ts_pes = (enum dmx_ts_pes)para->pes_type;
-+      ts_pes = para->pes_type;
-       if (ts_pes < DMX_PES_OTHER)
-               ts_type = TS_DECODER;
-@@ -963,6 +967,22 @@ dvb_demux_read(struct file *file, char __user *buf, size_t count,
-       return ret;
- }
-+static int dvb_demux_lock_filter(struct dmxdev_filter *dmxdevfilter)
-+{
-+      int ret;
-+
-+      dmxdevfilter->buffer.do_wait = 0;
-+
-+      if (waitqueue_active(&dmxdevfilter->buffer.queue))
-+              wake_up(&dmxdevfilter->buffer.queue);
-+
-+      ret = mutex_lock_interruptible(&dmxdevfilter->mutex);
-+
-+      dmxdevfilter->buffer.do_wait = 1;
-+
-+      return ret;
-+}
-+
- static int dvb_demux_do_ioctl(struct file *file,
-                             unsigned int cmd, void *parg)
- {
-@@ -976,7 +996,7 @@ static int dvb_demux_do_ioctl(struct file *file,
-       switch (cmd) {
-       case DMX_START:
--              if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
-+              if (dvb_demux_lock_filter(dmxdevfilter)) {
-                       mutex_unlock(&dmxdev->mutex);
-                       return -ERESTARTSYS;
-               }
-@@ -988,7 +1008,7 @@ static int dvb_demux_do_ioctl(struct file *file,
-               break;
-       case DMX_STOP:
--              if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
-+              if (dvb_demux_lock_filter(dmxdevfilter)) {
-                       mutex_unlock(&dmxdev->mutex);
-                       return -ERESTARTSYS;
-               }
-@@ -997,7 +1017,7 @@ static int dvb_demux_do_ioctl(struct file *file,
-               break;
-       case DMX_SET_FILTER:
--              if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
-+              if (dvb_demux_lock_filter(dmxdevfilter)) {
-                       mutex_unlock(&dmxdev->mutex);
-                       return -ERESTARTSYS;
-               }
-@@ -1006,7 +1026,7 @@ static int dvb_demux_do_ioctl(struct file *file,
-               break;
-       case DMX_SET_PES_FILTER:
--              if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
-+              if (dvb_demux_lock_filter(dmxdevfilter)) {
-                       mutex_unlock(&dmxdev->mutex);
-                       return -ERESTARTSYS;
-               }
-@@ -1015,7 +1035,7 @@ static int dvb_demux_do_ioctl(struct file *file,
-               break;
-       case DMX_SET_BUFFER_SIZE:
--              if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
-+              if (dvb_demux_lock_filter(dmxdevfilter)) {
-                       mutex_unlock(&dmxdev->mutex);
-                       return -ERESTARTSYS;
-               }
-@@ -1059,7 +1079,7 @@ static int dvb_demux_do_ioctl(struct file *file,
-               break;
-       case DMX_ADD_PID:
--              if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
-+              if (dvb_demux_lock_filter(dmxdevfilter)) {
-                       ret = -ERESTARTSYS;
-                       break;
-               }
-@@ -1068,7 +1088,7 @@ static int dvb_demux_do_ioctl(struct file *file,
-               break;
-       case DMX_REMOVE_PID:
--              if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
-+              if (dvb_demux_lock_filter(dmxdevfilter)) {
-                       ret = -ERESTARTSYS;
-                       break;
-               }
-diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c
-index 4a88a3e..faa3671 100644
---- a/drivers/media/dvb/dvb-core/dvb_demux.c
-+++ b/drivers/media/dvb/dvb-core/dvb_demux.c
-@@ -478,97 +478,94 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
- EXPORT_SYMBOL(dvb_dmx_swfilter_packets);
--void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
-+static inline int find_next_packet(const u8 *buf, int pos, size_t count,
-+                                 const int pktsize)
- {
--      int p = 0, i, j;
-+      int start = pos, lost;
--      spin_lock(&demux->lock);
--
--      if (demux->tsbufp) {
--              i = demux->tsbufp;
--              j = 188 - i;
--              if (count < j) {
--                      memcpy(&demux->tsbuf[i], buf, count);
--                      demux->tsbufp += count;
--                      goto bailout;
--              }
--              memcpy(&demux->tsbuf[i], buf, j);
--              if (demux->tsbuf[0] == 0x47)
--                      dvb_dmx_swfilter_packet(demux, demux->tsbuf);
--              demux->tsbufp = 0;
--              p += j;
-+      while (pos < count) {
-+              if (buf[pos] == 0x47 ||
-+                  (pktsize == 204 && buf[pos] == 0xB8))
-+                      break;
-+              pos++;
-       }
--      while (p < count) {
--              if (buf[p] == 0x47) {
--                      if (count - p >= 188) {
--                              dvb_dmx_swfilter_packet(demux, &buf[p]);
--                              p += 188;
--                      } else {
--                              i = count - p;
--                              memcpy(demux->tsbuf, &buf[p], i);
--                              demux->tsbufp = i;
--                              goto bailout;
--                      }
--              } else
--                      p++;
-+      lost = pos - start;
-+      if (lost) {
-+              /* This garbage is part of a valid packet? */
-+              int backtrack = pos - pktsize;
-+              if (backtrack >= 0 && (buf[backtrack] == 0x47 ||
-+                  (pktsize == 204 && buf[backtrack] == 0xB8)))
-+                      return backtrack;
-       }
--bailout:
--      spin_unlock(&demux->lock);
-+      return pos;
- }
--EXPORT_SYMBOL(dvb_dmx_swfilter);
--
--void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count)
-+/* Filter all pktsize= 188 or 204 sized packets and skip garbage. */
-+static inline void _dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf,
-+              size_t count, const int pktsize)
- {
-       int p = 0, i, j;
--      u8 tmppack[188];
-+      const u8 *q;
-       spin_lock(&demux->lock);
--      if (demux->tsbufp) {
-+      if (demux->tsbufp) { /* tsbuf[0] is now 0x47. */
-               i = demux->tsbufp;
--              j = 204 - i;
-+              j = pktsize - i;
-               if (count < j) {
-                       memcpy(&demux->tsbuf[i], buf, count);
-                       demux->tsbufp += count;
-                       goto bailout;
-               }
-               memcpy(&demux->tsbuf[i], buf, j);
--              if ((demux->tsbuf[0] == 0x47) || (demux->tsbuf[0] == 0xB8)) {
--                      memcpy(tmppack, demux->tsbuf, 188);
--                      if (tmppack[0] == 0xB8)
--                              tmppack[0] = 0x47;
--                      dvb_dmx_swfilter_packet(demux, tmppack);
--              }
-+              if (demux->tsbuf[0] == 0x47) /* double check */
-+                      dvb_dmx_swfilter_packet(demux, demux->tsbuf);
-               demux->tsbufp = 0;
-               p += j;
-       }
--      while (p < count) {
--              if ((buf[p] == 0x47) || (buf[p] == 0xB8)) {
--                      if (count - p >= 204) {
--                              memcpy(tmppack, &buf[p], 188);
--                              if (tmppack[0] == 0xB8)
--                                      tmppack[0] = 0x47;
--                              dvb_dmx_swfilter_packet(demux, tmppack);
--                              p += 204;
--                      } else {
--                              i = count - p;
--                              memcpy(demux->tsbuf, &buf[p], i);
--                              demux->tsbufp = i;
--                              goto bailout;
--                      }
--              } else {
--                      p++;
-+      while (1) {
-+              p = find_next_packet(buf, p, count, pktsize);
-+              if (p >= count)
-+                      break;
-+              if (count - p < pktsize)
-+                      break;
-+
-+              q = &buf[p];
-+
-+              if (pktsize == 204 && (*q == 0xB8)) {
-+                      memcpy(demux->tsbuf, q, 188);
-+                      demux->tsbuf[0] = 0x47;
-+                      q = demux->tsbuf;
-               }
-+              dvb_dmx_swfilter_packet(demux, q);
-+              p += pktsize;
-+      }
-+
-+      i = count - p;
-+      if (i) {
-+              memcpy(demux->tsbuf, &buf[p], i);
-+              demux->tsbufp = i;
-+              if (pktsize == 204 && demux->tsbuf[0] == 0xB8)
-+                      demux->tsbuf[0] = 0x47;
-       }
- bailout:
-       spin_unlock(&demux->lock);
- }
-+void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
-+{
-+      _dvb_dmx_swfilter(demux, buf, count, 188);
-+}
-+EXPORT_SYMBOL(dvb_dmx_swfilter);
-+
-+void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count)
-+{
-+      _dvb_dmx_swfilter(demux, buf, count, 204);
-+}
- EXPORT_SYMBOL(dvb_dmx_swfilter_204);
- static struct dvb_demux_filter *dvb_dmx_filter_alloc(struct dvb_demux *demux)
-diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
-index cad6634..efe9c30 100644
---- a/drivers/media/dvb/dvb-core/dvb_frontend.c
-+++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
-@@ -105,7 +105,8 @@ struct dvb_frontend_private {
-       /* thread/frontend values */
-       struct dvb_device *dvbdev;
--      struct dvb_frontend_parameters parameters;
-+      struct dvb_frontend_parameters parameters_in;
-+      struct dvb_frontend_parameters parameters_out;
-       struct dvb_fe_events events;
-       struct semaphore sem;
-       struct list_head list_head;
-@@ -160,12 +161,11 @@ static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
-       e = &events->events[events->eventw];
--      memcpy (&e->parameters, &fepriv->parameters,
--              sizeof (struct dvb_frontend_parameters));
--
-       if (status & FE_HAS_LOCK)
-               if (fe->ops.get_frontend)
--                      fe->ops.get_frontend(fe, &e->parameters);
-+                      fe->ops.get_frontend(fe, &fepriv->parameters_out);
-+
-+      e->parameters = fepriv->parameters_out;
-       events->eventw = wp;
-@@ -277,12 +277,12 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra
-       int ready = 0;
-       int fe_set_err = 0;
-       struct dvb_frontend_private *fepriv = fe->frontend_priv;
--      int original_inversion = fepriv->parameters.inversion;
--      u32 original_frequency = fepriv->parameters.frequency;
-+      int original_inversion = fepriv->parameters_in.inversion;
-+      u32 original_frequency = fepriv->parameters_in.frequency;
-       /* are we using autoinversion? */
-       autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
--                       (fepriv->parameters.inversion == INVERSION_AUTO));
-+                       (fepriv->parameters_in.inversion == INVERSION_AUTO));
-       /* setup parameters correctly */
-       while(!ready) {
-@@ -348,18 +348,19 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra
-               fepriv->auto_step, fepriv->auto_sub_step, fepriv->started_auto_step);
-       /* set the frontend itself */
--      fepriv->parameters.frequency += fepriv->lnb_drift;
-+      fepriv->parameters_in.frequency += fepriv->lnb_drift;
-       if (autoinversion)
--              fepriv->parameters.inversion = fepriv->inversion;
-+              fepriv->parameters_in.inversion = fepriv->inversion;
-       if (fe->ops.set_frontend)
--              fe_set_err = fe->ops.set_frontend(fe, &fepriv->parameters);
-+              fe_set_err = fe->ops.set_frontend(fe, &fepriv->parameters_in);
-+      fepriv->parameters_out = fepriv->parameters_in;
-       if (fe_set_err < 0) {
-               fepriv->state = FESTATE_ERROR;
-               return fe_set_err;
-       }
--      fepriv->parameters.frequency = original_frequency;
--      fepriv->parameters.inversion = original_inversion;
-+      fepriv->parameters_in.frequency = original_frequency;
-+      fepriv->parameters_in.inversion = original_inversion;
-       fepriv->auto_sub_step++;
-       return 0;
-@@ -383,7 +384,8 @@ static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
-               if (fepriv->state & FESTATE_RETUNE) {
-                       if (fe->ops.set_frontend)
-                               retval = fe->ops.set_frontend(fe,
--                                                      &fepriv->parameters);
-+                                                      &fepriv->parameters_in);
-+                      fepriv->parameters_out = fepriv->parameters_in;
-                       if (retval < 0)
-                               fepriv->state = FESTATE_ERROR;
-                       else
-@@ -413,8 +415,8 @@ static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
-               /* if we're tuned, then we have determined the correct inversion */
-               if ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
--                  (fepriv->parameters.inversion == INVERSION_AUTO)) {
--                      fepriv->parameters.inversion = fepriv->inversion;
-+                  (fepriv->parameters_in.inversion == INVERSION_AUTO)) {
-+                      fepriv->parameters_in.inversion = fepriv->inversion;
-               }
-               return;
-       }
-@@ -594,12 +596,14 @@ restart:
-                               if (fepriv->state & FESTATE_RETUNE) {
-                                       dprintk("%s: Retune requested, FESTATE_RETUNE\n", __func__);
--                                      params = &fepriv->parameters;
-+                                      params = &fepriv->parameters_in;
-                                       fepriv->state = FESTATE_TUNED;
-                               }
-                               if (fe->ops.tune)
-                                       fe->ops.tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s);
-+                              if (params)
-+                                      fepriv->parameters_out = *params;
-                               if (s != fepriv->status && !(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT)) {
-                                       dprintk("%s: state changed, adding current state\n", __func__);
-@@ -612,11 +616,9 @@ restart:
-                               dvb_frontend_swzigzag(fe);
-                               break;
-                       case DVBFE_ALGO_CUSTOM:
--                              params = NULL; /* have we been asked to RETUNE ?        */
-                               dprintk("%s: Frontend ALGO = DVBFE_ALGO_CUSTOM, state=%d\n", __func__, fepriv->state);
-                               if (fepriv->state & FESTATE_RETUNE) {
-                                       dprintk("%s: Retune requested, FESTAT_RETUNE\n", __func__);
--                                      params = &fepriv->parameters;
-                                       fepriv->state = FESTATE_TUNED;
-                               }
-                               /* Case where we are going to search for a carrier
-@@ -625,7 +627,7 @@ restart:
-                                */
-                               if (fepriv->algo_status & DVBFE_ALGO_SEARCH_AGAIN) {
-                                       if (fe->ops.search) {
--                                              fepriv->algo_status = fe->ops.search(fe, &fepriv->parameters);
-+                                              fepriv->algo_status = fe->ops.search(fe, &fepriv->parameters_in);
-                                               /* We did do a search as was requested, the flags are
-                                                * now unset as well and has the flags wrt to search.
-                                                */
-@@ -636,11 +638,12 @@ restart:
-                               /* Track the carrier if the search was successful */
-                               if (fepriv->algo_status == DVBFE_ALGO_SEARCH_SUCCESS) {
-                                       if (fe->ops.track)
--                                              fe->ops.track(fe, &fepriv->parameters);
-+                                              fe->ops.track(fe, &fepriv->parameters_in);
-                               } else {
-                                       fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
-                                       fepriv->delay = HZ / 2;
-                               }
-+                              fepriv->parameters_out = fepriv->parameters_in;
-                               fe->ops.read_status(fe, &s);
-                               if (s != fepriv->status) {
-                                       dvb_frontend_add_event(fe, s); /* update event list */
-@@ -860,34 +863,34 @@ static int dvb_frontend_check_parameters(struct dvb_frontend *fe,
- static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
- {
-+      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-       int i;
--      memset(&(fe->dtv_property_cache), 0,
--                      sizeof(struct dtv_frontend_properties));
--
--      fe->dtv_property_cache.state = DTV_CLEAR;
--      fe->dtv_property_cache.delivery_system = SYS_UNDEFINED;
--      fe->dtv_property_cache.inversion = INVERSION_AUTO;
--      fe->dtv_property_cache.fec_inner = FEC_AUTO;
--      fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_AUTO;
--      fe->dtv_property_cache.bandwidth_hz = BANDWIDTH_AUTO;
--      fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_AUTO;
--      fe->dtv_property_cache.hierarchy = HIERARCHY_AUTO;
--      fe->dtv_property_cache.symbol_rate = QAM_AUTO;
--      fe->dtv_property_cache.code_rate_HP = FEC_AUTO;
--      fe->dtv_property_cache.code_rate_LP = FEC_AUTO;
--
--      fe->dtv_property_cache.isdbt_partial_reception = -1;
--      fe->dtv_property_cache.isdbt_sb_mode = -1;
--      fe->dtv_property_cache.isdbt_sb_subchannel = -1;
--      fe->dtv_property_cache.isdbt_sb_segment_idx = -1;
--      fe->dtv_property_cache.isdbt_sb_segment_count = -1;
--      fe->dtv_property_cache.isdbt_layer_enabled = 0x7;
-+      memset(c, 0, sizeof(struct dtv_frontend_properties));
-+
-+      c->state = DTV_CLEAR;
-+      c->delivery_system = SYS_UNDEFINED;
-+      c->inversion = INVERSION_AUTO;
-+      c->fec_inner = FEC_AUTO;
-+      c->transmission_mode = TRANSMISSION_MODE_AUTO;
-+      c->bandwidth_hz = BANDWIDTH_AUTO;
-+      c->guard_interval = GUARD_INTERVAL_AUTO;
-+      c->hierarchy = HIERARCHY_AUTO;
-+      c->symbol_rate = QAM_AUTO;
-+      c->code_rate_HP = FEC_AUTO;
-+      c->code_rate_LP = FEC_AUTO;
-+
-+      c->isdbt_partial_reception = -1;
-+      c->isdbt_sb_mode = -1;
-+      c->isdbt_sb_subchannel = -1;
-+      c->isdbt_sb_segment_idx = -1;
-+      c->isdbt_sb_segment_count = -1;
-+      c->isdbt_layer_enabled = 0x7;
-       for (i = 0; i < 3; i++) {
--              fe->dtv_property_cache.layer[i].fec = FEC_AUTO;
--              fe->dtv_property_cache.layer[i].modulation = QAM_AUTO;
--              fe->dtv_property_cache.layer[i].interleaving = -1;
--              fe->dtv_property_cache.layer[i].segment_count = -1;
-+              c->layer[i].fec = FEC_AUTO;
-+              c->layer[i].modulation = QAM_AUTO;
-+              c->layer[i].interleaving = -1;
-+              c->layer[i].segment_count = -1;
-       }
-       return 0;
-@@ -901,7 +904,7 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
-       .buffer = b \
- }
--static struct dtv_cmds_h dtv_cmds[] = {
-+static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
-       _DTV_CMD(DTV_TUNE, 1, 0),
-       _DTV_CMD(DTV_CLEAR, 1, 0),
-@@ -963,6 +966,7 @@ static struct dtv_cmds_h dtv_cmds[] = {
-       _DTV_CMD(DTV_ISDBT_LAYERC_TIME_INTERLEAVING, 0, 0),
-       _DTV_CMD(DTV_ISDBS_TS_ID, 1, 0),
-+      _DTV_CMD(DTV_DVBT2_PLP_ID, 1, 0),
-       /* Get */
-       _DTV_CMD(DTV_DISEQC_SLAVE_REPLY, 0, 1),
-@@ -1020,10 +1024,9 @@ static int is_legacy_delivery_system(fe_delivery_system_t s)
-  * it's being used for the legacy or new API, reducing code and complexity.
-  */
- static void dtv_property_cache_sync(struct dvb_frontend *fe,
--                                  struct dvb_frontend_parameters *p)
-+                                  struct dtv_frontend_properties *c,
-+                                  const struct dvb_frontend_parameters *p)
- {
--      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
--
-       c->frequency = p->frequency;
-       c->inversion = p->inversion;
-@@ -1074,9 +1077,9 @@ static void dtv_property_cache_sync(struct dvb_frontend *fe,
-  */
- static void dtv_property_legacy_params_sync(struct dvb_frontend *fe)
- {
--      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-+      const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-       struct dvb_frontend_private *fepriv = fe->frontend_priv;
--      struct dvb_frontend_parameters *p = &fepriv->parameters;
-+      struct dvb_frontend_parameters *p = &fepriv->parameters_in;
-       p->frequency = c->frequency;
-       p->inversion = c->inversion;
-@@ -1086,14 +1089,12 @@ static void dtv_property_legacy_params_sync(struct dvb_frontend *fe)
-               dprintk("%s() Preparing QPSK req\n", __func__);
-               p->u.qpsk.symbol_rate = c->symbol_rate;
-               p->u.qpsk.fec_inner = c->fec_inner;
--              c->delivery_system = SYS_DVBS;
-               break;
-       case FE_QAM:
-               dprintk("%s() Preparing QAM req\n", __func__);
-               p->u.qam.symbol_rate = c->symbol_rate;
-               p->u.qam.fec_inner = c->fec_inner;
-               p->u.qam.modulation = c->modulation;
--              c->delivery_system = SYS_DVBC_ANNEX_AC;
-               break;
-       case FE_OFDM:
-               dprintk("%s() Preparing OFDM req\n", __func__);
-@@ -1111,15 +1112,10 @@ static void dtv_property_legacy_params_sync(struct dvb_frontend *fe)
-               p->u.ofdm.transmission_mode = c->transmission_mode;
-               p->u.ofdm.guard_interval = c->guard_interval;
-               p->u.ofdm.hierarchy_information = c->hierarchy;
--              c->delivery_system = SYS_DVBT;
-               break;
-       case FE_ATSC:
-               dprintk("%s() Preparing VSB req\n", __func__);
-               p->u.vsb.modulation = c->modulation;
--              if ((c->modulation == VSB_8) || (c->modulation == VSB_16))
--                      c->delivery_system = SYS_ATSC;
--              else
--                      c->delivery_system = SYS_DVBC_ANNEX_B;
-               break;
-       }
- }
-@@ -1129,9 +1125,9 @@ static void dtv_property_legacy_params_sync(struct dvb_frontend *fe)
-  */
- static void dtv_property_adv_params_sync(struct dvb_frontend *fe)
- {
--      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-+      const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-       struct dvb_frontend_private *fepriv = fe->frontend_priv;
--      struct dvb_frontend_parameters *p = &fepriv->parameters;
-+      struct dvb_frontend_parameters *p = &fepriv->parameters_in;
-       p->frequency = c->frequency;
-       p->inversion = c->inversion;
-@@ -1148,10 +1144,9 @@ static void dtv_property_adv_params_sync(struct dvb_frontend *fe)
-               break;
-       }
--      if(c->delivery_system == SYS_ISDBT) {
--              /* Fake out a generic DVB-T request so we pass validation in the ioctl */
--              p->frequency = c->frequency;
--              p->inversion = c->inversion;
-+      /* Fake out a generic DVB-T request so we pass validation in the ioctl */
-+      if ((c->delivery_system == SYS_ISDBT) ||
-+          (c->delivery_system == SYS_DVBT2)) {
-               p->u.ofdm.constellation = QAM_AUTO;
-               p->u.ofdm.code_rate_HP = FEC_AUTO;
-               p->u.ofdm.code_rate_LP = FEC_AUTO;
-@@ -1171,7 +1166,7 @@ static void dtv_property_adv_params_sync(struct dvb_frontend *fe)
- static void dtv_property_cache_submit(struct dvb_frontend *fe)
- {
--      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-+      const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-       /* For legacy delivery systems we don't need the delivery_system to
-        * be specified, but we populate the older structures from the cache
-@@ -1204,133 +1199,149 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
-                                   struct dtv_property *tvp,
-                                   struct file *file)
- {
--      int r = 0;
--
--      /* Allow the frontend to validate incoming properties */
--      if (fe->ops.get_property)
--              r = fe->ops.get_property(fe, tvp);
-+      const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-+      struct dvb_frontend_private *fepriv = fe->frontend_priv;
-+      struct dtv_frontend_properties cdetected;
-+      int r;
--      if (r < 0)
--              return r;
-+      /*
-+       * If the driver implements a get_frontend function, then convert
-+       * detected parameters to S2API properties.
-+       */
-+      if (fe->ops.get_frontend) {
-+              cdetected = *c;
-+              dtv_property_cache_sync(fe, &cdetected, &fepriv->parameters_out);
-+              c = &cdetected;
-+      }
-       switch(tvp->cmd) {
-       case DTV_FREQUENCY:
--              tvp->u.data = fe->dtv_property_cache.frequency;
-+              tvp->u.data = c->frequency;
-               break;
-       case DTV_MODULATION:
--              tvp->u.data = fe->dtv_property_cache.modulation;
-+              tvp->u.data = c->modulation;
-               break;
-       case DTV_BANDWIDTH_HZ:
--              tvp->u.data = fe->dtv_property_cache.bandwidth_hz;
-+              tvp->u.data = c->bandwidth_hz;
-               break;
-       case DTV_INVERSION:
--              tvp->u.data = fe->dtv_property_cache.inversion;
-+              tvp->u.data = c->inversion;
-               break;
-       case DTV_SYMBOL_RATE:
--              tvp->u.data = fe->dtv_property_cache.symbol_rate;
-+              tvp->u.data = c->symbol_rate;
-               break;
-       case DTV_INNER_FEC:
--              tvp->u.data = fe->dtv_property_cache.fec_inner;
-+              tvp->u.data = c->fec_inner;
-               break;
-       case DTV_PILOT:
--              tvp->u.data = fe->dtv_property_cache.pilot;
-+              tvp->u.data = c->pilot;
-               break;
-       case DTV_ROLLOFF:
--              tvp->u.data = fe->dtv_property_cache.rolloff;
-+              tvp->u.data = c->rolloff;
-               break;
-       case DTV_DELIVERY_SYSTEM:
--              tvp->u.data = fe->dtv_property_cache.delivery_system;
-+              tvp->u.data = c->delivery_system;
-               break;
-       case DTV_VOLTAGE:
--              tvp->u.data = fe->dtv_property_cache.voltage;
-+              tvp->u.data = c->voltage;
-               break;
-       case DTV_TONE:
--              tvp->u.data = fe->dtv_property_cache.sectone;
-+              tvp->u.data = c->sectone;
-               break;
-       case DTV_API_VERSION:
-               tvp->u.data = (DVB_API_VERSION << 8) | DVB_API_VERSION_MINOR;
-               break;
-       case DTV_CODE_RATE_HP:
--              tvp->u.data = fe->dtv_property_cache.code_rate_HP;
-+              tvp->u.data = c->code_rate_HP;
-               break;
-       case DTV_CODE_RATE_LP:
--              tvp->u.data = fe->dtv_property_cache.code_rate_LP;
-+              tvp->u.data = c->code_rate_LP;
-               break;
-       case DTV_GUARD_INTERVAL:
--              tvp->u.data = fe->dtv_property_cache.guard_interval;
-+              tvp->u.data = c->guard_interval;
-               break;
-       case DTV_TRANSMISSION_MODE:
--              tvp->u.data = fe->dtv_property_cache.transmission_mode;
-+              tvp->u.data = c->transmission_mode;
-               break;
-       case DTV_HIERARCHY:
--              tvp->u.data = fe->dtv_property_cache.hierarchy;
-+              tvp->u.data = c->hierarchy;
-               break;
-       /* ISDB-T Support here */
-       case DTV_ISDBT_PARTIAL_RECEPTION:
--              tvp->u.data = fe->dtv_property_cache.isdbt_partial_reception;
-+              tvp->u.data = c->isdbt_partial_reception;
-               break;
-       case DTV_ISDBT_SOUND_BROADCASTING:
--              tvp->u.data = fe->dtv_property_cache.isdbt_sb_mode;
-+              tvp->u.data = c->isdbt_sb_mode;
-               break;
-       case DTV_ISDBT_SB_SUBCHANNEL_ID:
--              tvp->u.data = fe->dtv_property_cache.isdbt_sb_subchannel;
-+              tvp->u.data = c->isdbt_sb_subchannel;
-               break;
-       case DTV_ISDBT_SB_SEGMENT_IDX:
--              tvp->u.data = fe->dtv_property_cache.isdbt_sb_segment_idx;
-+              tvp->u.data = c->isdbt_sb_segment_idx;
-               break;
-       case DTV_ISDBT_SB_SEGMENT_COUNT:
--              tvp->u.data = fe->dtv_property_cache.isdbt_sb_segment_count;
-+              tvp->u.data = c->isdbt_sb_segment_count;
-               break;
-       case DTV_ISDBT_LAYER_ENABLED:
--              tvp->u.data = fe->dtv_property_cache.isdbt_layer_enabled;
-+              tvp->u.data = c->isdbt_layer_enabled;
-               break;
-       case DTV_ISDBT_LAYERA_FEC:
--              tvp->u.data = fe->dtv_property_cache.layer[0].fec;
-+              tvp->u.data = c->layer[0].fec;
-               break;
-       case DTV_ISDBT_LAYERA_MODULATION:
--              tvp->u.data = fe->dtv_property_cache.layer[0].modulation;
-+              tvp->u.data = c->layer[0].modulation;
-               break;
-       case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
--              tvp->u.data = fe->dtv_property_cache.layer[0].segment_count;
-+              tvp->u.data = c->layer[0].segment_count;
-               break;
-       case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
--              tvp->u.data = fe->dtv_property_cache.layer[0].interleaving;
-+              tvp->u.data = c->layer[0].interleaving;
-               break;
-       case DTV_ISDBT_LAYERB_FEC:
--              tvp->u.data = fe->dtv_property_cache.layer[1].fec;
-+              tvp->u.data = c->layer[1].fec;
-               break;
-       case DTV_ISDBT_LAYERB_MODULATION:
--              tvp->u.data = fe->dtv_property_cache.layer[1].modulation;
-+              tvp->u.data = c->layer[1].modulation;
-               break;
-       case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
--              tvp->u.data = fe->dtv_property_cache.layer[1].segment_count;
-+              tvp->u.data = c->layer[1].segment_count;
-               break;
-       case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
--              tvp->u.data = fe->dtv_property_cache.layer[1].interleaving;
-+              tvp->u.data = c->layer[1].interleaving;
-               break;
-       case DTV_ISDBT_LAYERC_FEC:
--              tvp->u.data = fe->dtv_property_cache.layer[2].fec;
-+              tvp->u.data = c->layer[2].fec;
-               break;
-       case DTV_ISDBT_LAYERC_MODULATION:
--              tvp->u.data = fe->dtv_property_cache.layer[2].modulation;
-+              tvp->u.data = c->layer[2].modulation;
-               break;
-       case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
--              tvp->u.data = fe->dtv_property_cache.layer[2].segment_count;
-+              tvp->u.data = c->layer[2].segment_count;
-               break;
-       case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
--              tvp->u.data = fe->dtv_property_cache.layer[2].interleaving;
-+              tvp->u.data = c->layer[2].interleaving;
-               break;
-       case DTV_ISDBS_TS_ID:
--              tvp->u.data = fe->dtv_property_cache.isdbs_ts_id;
-+              tvp->u.data = c->isdbs_ts_id;
-+              break;
-+      case DTV_DVBT2_PLP_ID:
-+              tvp->u.data = c->dvbt2_plp_id;
-               break;
-       default:
--              r = -1;
-+              return -EINVAL;
-+      }
-+
-+      /* Allow the frontend to override outgoing properties */
-+      if (fe->ops.get_property) {
-+              r = fe->ops.get_property(fe, tvp);
-+              if (r < 0)
-+                      return r;
-       }
-       dtv_property_dump(tvp);
--      return r;
-+      return 0;
- }
- static int dtv_property_process_set(struct dvb_frontend *fe,
-@@ -1338,15 +1349,16 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
-                                   struct file *file)
- {
-       int r = 0;
-+      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-       struct dvb_frontend_private *fepriv = fe->frontend_priv;
-       dtv_property_dump(tvp);
-       /* Allow the frontend to validate incoming properties */
--      if (fe->ops.set_property)
-+      if (fe->ops.set_property) {
-               r = fe->ops.set_property(fe, tvp);
--
--      if (r < 0)
--              return r;
-+              if (r < 0)
-+                      return r;
-+      }
-       switch(tvp->cmd) {
-       case DTV_CLEAR:
-@@ -1361,126 +1373,129 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
-                * tunerequest so we can pass validation in the FE_SET_FRONTEND
-                * ioctl.
-                */
--              fe->dtv_property_cache.state = tvp->cmd;
-+              c->state = tvp->cmd;
-               dprintk("%s() Finalised property cache\n", __func__);
-               dtv_property_cache_submit(fe);
--              r |= dvb_frontend_ioctl_legacy(file, FE_SET_FRONTEND,
--                      &fepriv->parameters);
-+              r = dvb_frontend_ioctl_legacy(file, FE_SET_FRONTEND,
-+                      &fepriv->parameters_in);
-               break;
-       case DTV_FREQUENCY:
--              fe->dtv_property_cache.frequency = tvp->u.data;
-+              c->frequency = tvp->u.data;
-               break;
-       case DTV_MODULATION:
--              fe->dtv_property_cache.modulation = tvp->u.data;
-+              c->modulation = tvp->u.data;
-               break;
-       case DTV_BANDWIDTH_HZ:
--              fe->dtv_property_cache.bandwidth_hz = tvp->u.data;
-+              c->bandwidth_hz = tvp->u.data;
-               break;
-       case DTV_INVERSION:
--              fe->dtv_property_cache.inversion = tvp->u.data;
-+              c->inversion = tvp->u.data;
-               break;
-       case DTV_SYMBOL_RATE:
--              fe->dtv_property_cache.symbol_rate = tvp->u.data;
-+              c->symbol_rate = tvp->u.data;
-               break;
-       case DTV_INNER_FEC:
--              fe->dtv_property_cache.fec_inner = tvp->u.data;
-+              c->fec_inner = tvp->u.data;
-               break;
-       case DTV_PILOT:
--              fe->dtv_property_cache.pilot = tvp->u.data;
-+              c->pilot = tvp->u.data;
-               break;
-       case DTV_ROLLOFF:
--              fe->dtv_property_cache.rolloff = tvp->u.data;
-+              c->rolloff = tvp->u.data;
-               break;
-       case DTV_DELIVERY_SYSTEM:
--              fe->dtv_property_cache.delivery_system = tvp->u.data;
-+              c->delivery_system = tvp->u.data;
-               break;
-       case DTV_VOLTAGE:
--              fe->dtv_property_cache.voltage = tvp->u.data;
-+              c->voltage = tvp->u.data;
-               r = dvb_frontend_ioctl_legacy(file, FE_SET_VOLTAGE,
--                      (void *)fe->dtv_property_cache.voltage);
-+                      (void *)c->voltage);
-               break;
-       case DTV_TONE:
--              fe->dtv_property_cache.sectone = tvp->u.data;
-+              c->sectone = tvp->u.data;
-               r = dvb_frontend_ioctl_legacy(file, FE_SET_TONE,
--                      (void *)fe->dtv_property_cache.sectone);
-+                      (void *)c->sectone);
-               break;
-       case DTV_CODE_RATE_HP:
--              fe->dtv_property_cache.code_rate_HP = tvp->u.data;
-+              c->code_rate_HP = tvp->u.data;
-               break;
-       case DTV_CODE_RATE_LP:
--              fe->dtv_property_cache.code_rate_LP = tvp->u.data;
-+              c->code_rate_LP = tvp->u.data;
-               break;
-       case DTV_GUARD_INTERVAL:
--              fe->dtv_property_cache.guard_interval = tvp->u.data;
-+              c->guard_interval = tvp->u.data;
-               break;
-       case DTV_TRANSMISSION_MODE:
--              fe->dtv_property_cache.transmission_mode = tvp->u.data;
-+              c->transmission_mode = tvp->u.data;
-               break;
-       case DTV_HIERARCHY:
--              fe->dtv_property_cache.hierarchy = tvp->u.data;
-+              c->hierarchy = tvp->u.data;
-               break;
-       /* ISDB-T Support here */
-       case DTV_ISDBT_PARTIAL_RECEPTION:
--              fe->dtv_property_cache.isdbt_partial_reception = tvp->u.data;
-+              c->isdbt_partial_reception = tvp->u.data;
-               break;
-       case DTV_ISDBT_SOUND_BROADCASTING:
--              fe->dtv_property_cache.isdbt_sb_mode = tvp->u.data;
-+              c->isdbt_sb_mode = tvp->u.data;
-               break;
-       case DTV_ISDBT_SB_SUBCHANNEL_ID:
--              fe->dtv_property_cache.isdbt_sb_subchannel = tvp->u.data;
-+              c->isdbt_sb_subchannel = tvp->u.data;
-               break;
-       case DTV_ISDBT_SB_SEGMENT_IDX:
--              fe->dtv_property_cache.isdbt_sb_segment_idx = tvp->u.data;
-+              c->isdbt_sb_segment_idx = tvp->u.data;
-               break;
-       case DTV_ISDBT_SB_SEGMENT_COUNT:
--              fe->dtv_property_cache.isdbt_sb_segment_count = tvp->u.data;
-+              c->isdbt_sb_segment_count = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYER_ENABLED:
--              fe->dtv_property_cache.isdbt_layer_enabled = tvp->u.data;
-+              c->isdbt_layer_enabled = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERA_FEC:
--              fe->dtv_property_cache.layer[0].fec = tvp->u.data;
-+              c->layer[0].fec = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERA_MODULATION:
--              fe->dtv_property_cache.layer[0].modulation = tvp->u.data;
-+              c->layer[0].modulation = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
--              fe->dtv_property_cache.layer[0].segment_count = tvp->u.data;
-+              c->layer[0].segment_count = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
--              fe->dtv_property_cache.layer[0].interleaving = tvp->u.data;
-+              c->layer[0].interleaving = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERB_FEC:
--              fe->dtv_property_cache.layer[1].fec = tvp->u.data;
-+              c->layer[1].fec = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERB_MODULATION:
--              fe->dtv_property_cache.layer[1].modulation = tvp->u.data;
-+              c->layer[1].modulation = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
--              fe->dtv_property_cache.layer[1].segment_count = tvp->u.data;
-+              c->layer[1].segment_count = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
--              fe->dtv_property_cache.layer[1].interleaving = tvp->u.data;
-+              c->layer[1].interleaving = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERC_FEC:
--              fe->dtv_property_cache.layer[2].fec = tvp->u.data;
-+              c->layer[2].fec = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERC_MODULATION:
--              fe->dtv_property_cache.layer[2].modulation = tvp->u.data;
-+              c->layer[2].modulation = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
--              fe->dtv_property_cache.layer[2].segment_count = tvp->u.data;
-+              c->layer[2].segment_count = tvp->u.data;
-               break;
-       case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
--              fe->dtv_property_cache.layer[2].interleaving = tvp->u.data;
-+              c->layer[2].interleaving = tvp->u.data;
-               break;
-       case DTV_ISDBS_TS_ID:
--              fe->dtv_property_cache.isdbs_ts_id = tvp->u.data;
-+              c->isdbs_ts_id = tvp->u.data;
-+              break;
-+      case DTV_DVBT2_PLP_ID:
-+              c->dvbt2_plp_id = tvp->u.data;
-               break;
-       default:
--              r = -1;
-+              return -EINVAL;
-       }
-       return r;
-@@ -1491,6 +1506,7 @@ static int dvb_frontend_ioctl(struct file *file,
- {
-       struct dvb_device *dvbdev = file->private_data;
-       struct dvb_frontend *fe = dvbdev->priv;
-+      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-       struct dvb_frontend_private *fepriv = fe->frontend_priv;
-       int err = -EOPNOTSUPP;
-@@ -1510,7 +1526,7 @@ static int dvb_frontend_ioctl(struct file *file,
-       if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
-               err = dvb_frontend_ioctl_properties(file, cmd, parg);
-       else {
--              fe->dtv_property_cache.state = DTV_UNDEFINED;
-+              c->state = DTV_UNDEFINED;
-               err = dvb_frontend_ioctl_legacy(file, cmd, parg);
-       }
-@@ -1523,6 +1539,7 @@ static int dvb_frontend_ioctl_properties(struct file *file,
- {
-       struct dvb_device *dvbdev = file->private_data;
-       struct dvb_frontend *fe = dvbdev->priv;
-+      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-       int err = 0;
-       struct dtv_properties *tvps = NULL;
-@@ -1554,11 +1571,13 @@ static int dvb_frontend_ioctl_properties(struct file *file,
-               }
-               for (i = 0; i < tvps->num; i++) {
--                      (tvp + i)->result = dtv_property_process_set(fe, tvp + i, file);
--                      err |= (tvp + i)->result;
-+                      err = dtv_property_process_set(fe, tvp + i, file);
-+                      if (err < 0)
-+                              goto out;
-+                      (tvp + i)->result = err;
-               }
--              if(fe->dtv_property_cache.state == DTV_TUNE)
-+              if (c->state == DTV_TUNE)
-                       dprintk("%s() Property cache is full, tuning\n", __func__);
-       } else
-@@ -1586,8 +1605,10 @@ static int dvb_frontend_ioctl_properties(struct file *file,
-               }
-               for (i = 0; i < tvps->num; i++) {
--                      (tvp + i)->result = dtv_property_process_get(fe, tvp + i, file);
--                      err |= (tvp + i)->result;
-+                      err = dtv_property_process_get(fe, tvp + i, file);
-+                      if (err < 0)
-+                              goto out;
-+                      (tvp + i)->result = err;
-               }
-               if (copy_to_user(tvps->props, tvp, tvps->num * sizeof(struct dtv_property))) {
-@@ -1638,7 +1659,7 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
-       case FE_READ_STATUS: {
-               fe_status_t* status = parg;
--              /* if retune was requested but hasn't occured yet, prevent
-+              /* if retune was requested but hasn't occurred yet, prevent
-                * that user get signal state from previous tuning */
-               if (fepriv->state == FESTATE_RETUNE ||
-                   fepriv->state == FESTATE_ERROR) {
-@@ -1729,7 +1750,7 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
-                        * Dish network legacy switches (as used by Dish500)
-                        * are controlled by sending 9-bit command words
-                        * spaced 8msec apart.
--                       * the actual command word is switch/port dependant
-+                       * the actual command word is switch/port dependent
-                        * so it is up to the userspace application to send
-                        * the right command.
-                        * The command must always start with a '0' after
-@@ -1787,10 +1808,11 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
-               break;
-       case FE_SET_FRONTEND: {
-+              struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-               struct dvb_frontend_tune_settings fetunesettings;
--              if(fe->dtv_property_cache.state == DTV_TUNE) {
--                      if (dvb_frontend_check_parameters(fe, &fepriv->parameters) < 0) {
-+              if (c->state == DTV_TUNE) {
-+                      if (dvb_frontend_check_parameters(fe, &fepriv->parameters_in) < 0) {
-                               err = -EINVAL;
-                               break;
-                       }
-@@ -1800,9 +1822,9 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
-                               break;
-                       }
--                      memcpy (&fepriv->parameters, parg,
-+                      memcpy (&fepriv->parameters_in, parg,
-                               sizeof (struct dvb_frontend_parameters));
--                      dtv_property_cache_sync(fe, &fepriv->parameters);
-+                      dtv_property_cache_sync(fe, c, &fepriv->parameters_in);
-               }
-               memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
-@@ -1811,15 +1833,15 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
-               /* force auto frequency inversion if requested */
-               if (dvb_force_auto_inversion) {
--                      fepriv->parameters.inversion = INVERSION_AUTO;
-+                      fepriv->parameters_in.inversion = INVERSION_AUTO;
-                       fetunesettings.parameters.inversion = INVERSION_AUTO;
-               }
-               if (fe->ops.info.type == FE_OFDM) {
-                       /* without hierarchical coding code_rate_LP is irrelevant,
-                        * so we tolerate the otherwise invalid FEC_NONE setting */
--                      if (fepriv->parameters.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
--                          fepriv->parameters.u.ofdm.code_rate_LP == FEC_NONE)
--                              fepriv->parameters.u.ofdm.code_rate_LP = FEC_AUTO;
-+                      if (fepriv->parameters_in.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
-+                          fepriv->parameters_in.u.ofdm.code_rate_LP == FEC_NONE)
-+                              fepriv->parameters_in.u.ofdm.code_rate_LP = FEC_AUTO;
-               }
-               /* get frontend-specific tuning settings */
-@@ -1832,8 +1854,8 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
-                       switch(fe->ops.info.type) {
-                       case FE_QPSK:
-                               fepriv->min_delay = HZ/20;
--                              fepriv->step_size = fepriv->parameters.u.qpsk.symbol_rate / 16000;
--                              fepriv->max_drift = fepriv->parameters.u.qpsk.symbol_rate / 2000;
-+                              fepriv->step_size = fepriv->parameters_in.u.qpsk.symbol_rate / 16000;
-+                              fepriv->max_drift = fepriv->parameters_in.u.qpsk.symbol_rate / 2000;
-                               break;
-                       case FE_QAM:
-@@ -1875,8 +1897,8 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
-       case FE_GET_FRONTEND:
-               if (fe->ops.get_frontend) {
--                      memcpy (parg, &fepriv->parameters, sizeof (struct dvb_frontend_parameters));
--                      err = fe->ops.get_frontend(fe, (struct dvb_frontend_parameters*) parg);
-+                      err = fe->ops.get_frontend(fe, &fepriv->parameters_out);
-+                      memcpy(parg, &fepriv->parameters_out, sizeof(struct dvb_frontend_parameters));
-               }
-               break;
-@@ -1967,6 +1989,14 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
-       if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
-               if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
-                       goto err0;
-+
-+              /* If we took control of the bus, we need to force
-+                 reinitialization.  This is because many ts_bus_ctrl()
-+                 functions strobe the RESET pin on the demod, and if the
-+                 frontend thread already exists then the dvb_init() routine
-+                 won't get called (which is what usually does initial
-+                 register configuration). */
-+              fepriv->reinitialise = 1;
-       }
-       if ((ret = dvb_generic_open (inode, file)) < 0)
-diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h
-index f9f19be..5590eb6 100644
---- a/drivers/media/dvb/dvb-core/dvb_frontend.h
-+++ b/drivers/media/dvb/dvb-core/dvb_frontend.h
-@@ -239,7 +239,6 @@ struct analog_demod_ops {
-       void (*set_params)(struct dvb_frontend *fe,
-                          struct analog_parameters *params);
-       int  (*has_signal)(struct dvb_frontend *fe);
--      int  (*is_stereo)(struct dvb_frontend *fe);
-       int  (*get_afc)(struct dvb_frontend *fe);
-       void (*tuner_status)(struct dvb_frontend *fe);
-       void (*standby)(struct dvb_frontend *fe);
-@@ -359,6 +358,9 @@ struct dtv_frontend_properties {
-       /* ISDB-T specifics */
-       u32                     isdbs_ts_id;
-+
-+      /* DVB-T2 specifics */
-+      u32                     dvbt2_plp_id;
- };
- struct dvb_frontend {
-diff --git a/drivers/media/dvb/dvb-core/dvb_net.c b/drivers/media/dvb/dvb-core/dvb_net.c
-index 4df42aa..51752a9 100644
---- a/drivers/media/dvb/dvb-core/dvb_net.c
-+++ b/drivers/media/dvb/dvb-core/dvb_net.c
-@@ -1329,7 +1329,8 @@ static int dvb_net_remove_if(struct dvb_net *dvbnet, unsigned long num)
-               return -EBUSY;
-       dvb_net_stop(net);
--      flush_scheduled_work();
-+      flush_work_sync(&priv->set_multicast_list_wq);
-+      flush_work_sync(&priv->restart_net_feed_wq);
-       printk("dvb_net: removed network interface %s\n", net->name);
-       unregister_netdev(net);
-       dvbnet->state[num]=0;
-diff --git a/drivers/media/dvb/dvb-core/dvb_net.h b/drivers/media/dvb/dvb-core/dvb_net.h
-index 3a3126c..1e53acd 100644
---- a/drivers/media/dvb/dvb-core/dvb_net.h
-+++ b/drivers/media/dvb/dvb-core/dvb_net.h
-@@ -32,6 +32,8 @@
- #define DVB_NET_DEVICES_MAX 10
-+#ifdef CONFIG_DVB_NET
-+
- struct dvb_net {
-       struct dvb_device *dvbdev;
-       struct net_device *device[DVB_NET_DEVICES_MAX];
-@@ -40,8 +42,25 @@ struct dvb_net {
-       struct dmx_demux *demux;
- };
--
- void dvb_net_release(struct dvb_net *);
- int  dvb_net_init(struct dvb_adapter *, struct dvb_net *, struct dmx_demux *);
-+#else
-+
-+struct dvb_net {
-+      struct dvb_device *dvbdev;
-+};
-+
-+static inline void dvb_net_release(struct dvb_net *dvbnet)
-+{
-+}
-+
-+static inline int dvb_net_init(struct dvb_adapter *adap,
-+                             struct dvb_net *dvbnet, struct dmx_demux *dmx)
-+{
-+      return 0;
-+}
-+
-+#endif /* ifdef CONFIG_DVB_NET */
-+
- #endif
-diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
-index a5712cd..d5333f3 100644
---- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
-+++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
-@@ -45,6 +45,7 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
-       rbuf->data=data;
-       rbuf->size=len;
-       rbuf->error=0;
-+      rbuf->do_wait=1;
-       init_waitqueue_head(&rbuf->queue);
-diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
-index 41f04da..6951dd3 100644
---- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
-+++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
-@@ -39,6 +39,7 @@ struct dvb_ringbuffer {
-       wait_queue_head_t queue;
-       spinlock_t        lock;
-+      int               do_wait;
- };
- #define DVB_RINGBUFFER_PKTHDRSIZE 3
-diff --git a/include/linux/dvb/audio.h b/include/linux/dvb/audio.h
-index fec66bd..d47bccd 100644
---- a/include/linux/dvb/audio.h
-+++ b/include/linux/dvb/audio.h
-@@ -67,7 +67,7 @@ typedef struct audio_status {
- typedef
--struct audio_karaoke{  /* if Vocal1 or Vocal2 are non-zero, they get mixed  */
-+struct audio_karaoke {  /* if Vocal1 or Vocal2 are non-zero, they get mixed  */
-       int vocal1;    /* into left and right t at 70% each */
-       int vocal2;    /* if both, Vocal1 and Vocal2 are non-zero, Vocal1 gets*/
-       int melody;    /* mixed into the left channel and */
-diff --git a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h
-index 493a2bf..36a3ed6 100644
---- a/include/linux/dvb/frontend.h
-+++ b/include/linux/dvb/frontend.h
-@@ -175,14 +175,20 @@ typedef enum fe_transmit_mode {
-       TRANSMISSION_MODE_2K,
-       TRANSMISSION_MODE_8K,
-       TRANSMISSION_MODE_AUTO,
--      TRANSMISSION_MODE_4K
-+      TRANSMISSION_MODE_4K,
-+      TRANSMISSION_MODE_1K,
-+      TRANSMISSION_MODE_16K,
-+      TRANSMISSION_MODE_32K,
- } fe_transmit_mode_t;
- typedef enum fe_bandwidth {
-       BANDWIDTH_8_MHZ,
-       BANDWIDTH_7_MHZ,
-       BANDWIDTH_6_MHZ,
--      BANDWIDTH_AUTO
-+      BANDWIDTH_AUTO,
-+      BANDWIDTH_5_MHZ,
-+      BANDWIDTH_10_MHZ,
-+      BANDWIDTH_1_712_MHZ,
- } fe_bandwidth_t;
-@@ -191,7 +197,10 @@ typedef enum fe_guard_interval {
-       GUARD_INTERVAL_1_16,
-       GUARD_INTERVAL_1_8,
-       GUARD_INTERVAL_1_4,
--      GUARD_INTERVAL_AUTO
-+      GUARD_INTERVAL_AUTO,
-+      GUARD_INTERVAL_1_128,
-+      GUARD_INTERVAL_19_128,
-+      GUARD_INTERVAL_19_256,
- } fe_guard_interval_t;
-@@ -305,7 +314,9 @@ struct dvb_frontend_event {
- #define DTV_ISDBS_TS_ID               42
--#define DTV_MAX_COMMAND                               DTV_ISDBS_TS_ID
-+#define DTV_DVBT2_PLP_ID      43
-+
-+#define DTV_MAX_COMMAND                               DTV_DVBT2_PLP_ID
- typedef enum fe_pilot {
-       PILOT_ON,
-@@ -337,6 +348,7 @@ typedef enum fe_delivery_system {
-       SYS_DMBTH,
-       SYS_CMMB,
-       SYS_DAB,
-+      SYS_DVBT2,
- } fe_delivery_system_t;
- struct dtv_cmds_h {
-diff --git a/include/linux/dvb/version.h b/include/linux/dvb/version.h
-index 5a7546c..1421cc8 100644
---- a/include/linux/dvb/version.h
-+++ b/include/linux/dvb/version.h
-@@ -24,6 +24,6 @@
- #define _DVBVERSION_H_
- #define DVB_API_VERSION 5
--#define DVB_API_VERSION_MINOR 2
-+#define DVB_API_VERSION_MINOR 3
- #endif /*_DVBVERSION_H_*/