@@ -1677,6 +1677,25 @@ static int set_delivery_system(struct dvb_frontend *fe, u32 desired_system)
return 0;
}
+static int reset_qos_counters(struct dvb_frontend *fe)
+{
+ struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+
+ /* Reset QoS cache */
+
+ memset (&c->strength, 0, sizeof(c->strength));
+ memset (&c->cnr, 0, sizeof(c->cnr));
+ memset (&c->bit_error, 0, sizeof(c->bit_error));
+ memset (&c->block_error, 0, sizeof(c->block_error));
+ memset (&c->block_count, 0, sizeof(c->block_count));
+
+ /* Call frontend reset counter method, if available */
+ if (fe->ops.reset_qos_counters)
+ return fe->ops.reset_qos_counters(fe);
+
+ return 0;
+}
+
static int dtv_property_process_set(struct dvb_frontend *fe,
struct dtv_property *tvp,
struct file *file)
@@ -1736,8 +1755,8 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
break;
case DTV_DELIVERY_SYSTEM:
r = set_delivery_system(fe, tvp->u.data);
- if (r >= 0 && fe->ops.reset_qos_counters)
- fe->ops.reset_qos_counters(fe);
+ if (r >= 0)
+ reset_qos_counters(fe);
break;
case DTV_VOLTAGE:
c->voltage = tvp->u.data;
@@ -2338,8 +2357,8 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
if (err)
break;
err = dtv_set_frontend(fe);
- if (err >= 0 && fe->ops.reset_qos_counters)
- fe->ops.reset_qos_counters(fe);
+ if (err >= 0)
+ reset_qos_counters(fe);
break;
case FE_GET_EVENT: