When the img-ir driver is asked to change protocol, if the chosen decoder is already loaded then don't call img_ir_set_decoder(), so as not to clear the current filter.
This is important because store_protocol() does not refresh the scancode filter with the new protocol if the set of enabled protocols hasn't actually changed, but it will still call the change_protocol() callback, resulting in the filter being disabled in the hardware. The problem can be reproduced by setting a filter, and then setting the protocol to the same protocol that is already set: $ echo nec > protocols $ echo 0xffff > filter_mask $ echo nec > protocols After this, messages which don't match the filter still get received. Reported-by: Sifan Naeem <sifan.na...@imgtec.com> Signed-off-by: James Hogan <james.ho...@imgtec.com> Cc: Mauro Carvalho Chehab <m.che...@samsung.com> Cc: <stable@vger.kernel.org> # v3.15+ Cc: linux-me...@vger.kernel.org --- drivers/media/rc/img-ir/img-ir-hw.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/rc/img-ir/img-ir-hw.c b/drivers/media/rc/img-ir/img-ir-hw.c index 9db065344b41..1566337c1059 100644 --- a/drivers/media/rc/img-ir/img-ir-hw.c +++ b/drivers/media/rc/img-ir/img-ir-hw.c @@ -643,6 +643,12 @@ static int img_ir_change_protocol(struct rc_dev *dev, u64 *ir_type) continue; if (*ir_type & dec->type) { *ir_type &= dec->type; + /* + * We don't want to clear the filter if nothing is + * changing as it won't get set again. + */ + if (dec == hw->decoder) + return 0; img_ir_set_decoder(priv, dec, *ir_type); goto success; } -- 2.0.4 -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html