From patchwork Thu Feb 5 08:56:42 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Mc Guire X-Patchwork-Id: 5782931 Return-Path: X-Original-To: patchwork-linux-media@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 1B53D9F336 for ; Thu, 5 Feb 2015 09:01:47 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 418FB2026F for ; Thu, 5 Feb 2015 09:01:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 539D9201FA for ; Thu, 5 Feb 2015 09:01:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752583AbbBEJB3 (ORCPT ); Thu, 5 Feb 2015 04:01:29 -0500 Received: from www.osadl.org ([62.245.132.105]:46916 "EHLO www.osadl.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751784AbbBEJB3 (ORCPT ); Thu, 5 Feb 2015 04:01:29 -0500 Received: from debian.hofrr.at (92-243-35-153.adsl.nanet.at [92.243.35.153] (may be forged)) by www.osadl.org (8.13.8/8.13.8/OSADL-2007092901) with ESMTP id t1590k7c020593; Thu, 5 Feb 2015 10:00:47 +0100 From: Nicholas Mc Guire To: Mauro Carvalho Chehab Cc: Hans Verkuil , Wolfram Sang , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Nicholas Mc Guire Subject: [PATCH RFC] media: radio: handle timeouts Date: Thu, 5 Feb 2015 03:56:42 -0500 Message-Id: <1423126602-6639-1-git-send-email-hofrat@osadl.org> X-Mailer: git-send-email 1.7.10.4 X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add handling for timeout case. Signed-off-by: Nicholas Mc Guire --- Some error state/error information seems be get lost int the current code. (line-numbers are from 3.19.0-rc7. Assume that on line 827 core->write succeeds but the following wait_for_completion_timeout times out and the radio->irq_received condition is not satisfied resulting in goto out; 827 r = core->write(core, WL1273_TUNER_MODE_SET, TUNER_MODE_AUTO_SEEK); 828 if (r) 829 goto out; 830 831 wait_for_completion_timeout(&radio->busy, msecs_to_jiffies(1000)); 832 if (!(radio->irq_received & WL1273_BL_EVENT)) 833 goto out; A similar situation is at line 955 - 859 where a tiemout could occure and the reported value would be the success value from core->write. 852 reinit_completion(&radio->busy); 853 dev_dbg(radio->dev, "%s: BUSY\n", __func__); 854 855 r = core->write(core, WL1273_TUNER_MODE_SET, TUNER_MODE_AUTO_SEEK); 856 if (r) 857 goto out; 858 859 wait_for_completion_timeout(&radio->busy, msecs_to_jiffies(1000) the problem is that the value of r now is the "success" value from core->write and any timeout and/or failure to detect the expected interrupt is not reported in 860 out: 861 dev_dbg(radio->dev, "%s: Err: %d\n", __func__, r); 862 return r; Should the wait_for_completion_timeout not report the timeout event by setting r to -ETIMEOUT ? respectively use if (!(radio->irq_received & WL1273_BL_EVENT)) to check and set -ETIMEOUT there ? Comparing this with wl1273_fm_set_tx_freq - the below patch might be suitable way to handle timeout - but this needs a review by someone who knows the details of the driver - so this is really just a guess. Patch was only compile tested with x86_64_defconfig + CONFIG_MEDIA_SUPPORT=m CONFIG_MEDIA_CAMERA_SUPPORT=y, CONFIG_V4L_PLATFORM_DRIVERS=y, CONFIG_MEDIA_RADIO_SUPPORT=y, RADIO_ADAPTER=y, CONFIG_RADIO_WL1273=m Patch is against 3.19.0-rc7 (localversion-next is -next-20150204) drivers/media/radio/radio-wl1273.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/media/radio/radio-wl1273.c b/drivers/media/radio/radio-wl1273.c index 571c7f6..6830523 100644 --- a/drivers/media/radio/radio-wl1273.c +++ b/drivers/media/radio/radio-wl1273.c @@ -828,9 +828,12 @@ static int wl1273_fm_set_seek(struct wl1273_device *radio, if (r) goto out; + /* wait for the FR IRQ */ wait_for_completion_timeout(&radio->busy, msecs_to_jiffies(1000)); - if (!(radio->irq_received & WL1273_BL_EVENT)) + if (!(radio->irq_received & WL1273_BL_EVENT)) { + r = -ETIMEDOUT; goto out; + } radio->irq_received &= ~WL1273_BL_EVENT; @@ -856,7 +859,9 @@ static int wl1273_fm_set_seek(struct wl1273_device *radio, if (r) goto out; - wait_for_completion_timeout(&radio->busy, msecs_to_jiffies(1000)); + /* wait for the FR IRQ */ + if (!wait_for_completion_timeout(&radio->busy, msecs_to_jiffies(1000))) + r = -ETIMEDOUT; out: dev_dbg(radio->dev, "%s: Err: %d\n", __func__, r); return r;