]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb: fix disabling of bad muxes caused by dodgy hardware/firmware
authorAdam Sutton <dev@adamsutton.me.uk>
Fri, 18 Jan 2013 11:08:15 +0000 (11:08 +0000)
committerAdam Sutton <dev@adamsutton.me.uk>
Fri, 18 Jan 2013 11:14:47 +0000 (11:14 +0000)
because some tuners, mostly USB, can result in ioctl() failures due
to inability to communicate with driver and this was not properly
trapped muxes were being disabled.

Better solution is to reject bad muxes being entered in the first
place based on the tuning capability of the device. Ofc if the
tuner fails to report that correctly (probably) we'll still be
buggered.

src/dvb/dvb_fe.c
src/dvb/dvb_multiplex.c

index 7120ab5ce750c9c2aa11affecbd7f3d4a984e066..b1f9a3147fa50e617abccb418766ac073a126a20 100644 (file)
@@ -510,7 +510,6 @@ dvb_fe_tune(th_dvb_mux_instance_t *tdmi, const char *reason)
     }
 
     /* Mark as bad */
-    dvb_mux_set_enable(tdmi, 0);
     return SM_CODE_TUNING_FAILED;
   }   
 
index 37d3ca1721b43ee437eb961b1bde6802fa9ce245..74c07341f72774f030eb60cb9fe5f91afd5188a8 100644 (file)
@@ -162,6 +162,14 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
 
   lock_assert(&global_lock);
 
+  /* Reject out of range */
+  if ((dmc->dmc_fe_params.frequency < tda->tda_fe_info->frequency_min) ||
+      (dmc->dmc_fe_params.frequency > tda->tda_fe_info->frequency_max)) {
+    tvhlog(LOG_DEBUG, "dvb", "mux rejected with frequency %d",
+           dmc->dmc_fe_params.frequency);
+    return NULL;
+  }
+
   /* HACK - we hash/compare based on 2KHz spacing and compare on +/-500Hz */
   LIST_FOREACH(tdmi, &tda->tda_mux_list, tdmi_adapter_hash_link) {
     if(tdmi_compare_key(&tdmi->tdmi_conf, dmc))
@@ -1171,7 +1179,7 @@ dvb_mux_add_by_params(th_dvb_adapter_t *tda,
   tdmi = dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, NULL, 1, 1, NULL, NULL);
 
   if(tdmi == NULL)
-    return "Mux already exist";
+    return "Mux already exists or bad parameters";
 
   return NULL;
 }