From patchwork Tue Jul 24 09:59:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Mack X-Patchwork-Id: 10541771 X-Patchwork-Delegate: sameo@linux.intel.com Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B73FE112B for ; Tue, 24 Jul 2018 10:00:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A6FCE286E1 for ; Tue, 24 Jul 2018 10:00:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9B61228711; Tue, 24 Jul 2018 10:00:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2C4A3286E1 for ; Tue, 24 Jul 2018 10:00:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388499AbeGXLFo (ORCPT ); Tue, 24 Jul 2018 07:05:44 -0400 Received: from mail.bugwerft.de ([46.23.86.59]:57166 "EHLO mail.bugwerft.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388407AbeGXLFo (ORCPT ); Tue, 24 Jul 2018 07:05:44 -0400 Received: from localhost.localdomain (i577BC1D8.versanet.de [87.123.193.216]) by mail.bugwerft.de (Postfix) with ESMTPSA id A2685291A01; Tue, 24 Jul 2018 09:59:38 +0000 (UTC) From: Daniel Mack To: sameo@linux.intel.com Cc: linux-wireless@vger.kernel.org, colin.king@canonical.com, shikha.singh@st.com, Daniel Mack Subject: [PATCH v3 07/11] NFC: st95hf: ignore spurious interrupts Date: Tue, 24 Jul 2018 11:59:37 +0200 Message-Id: <20180724095941.25777-8-daniel@zonque.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180724095941.25777-1-daniel@zonque.org> References: <20180724095941.25777-1-daniel@zonque.org> Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When an interrupt occurs before st95hf_in_send_cmd() was called, the ISR will currently dereference a NULL pointer. Fix this by checking whether `cb_arg->complete_cb' is set, and bail out early if that's not the case. Again spurious interrupts are likely to occur with EMI noise through the antenna, and need to be handled gracefully. Signed-off-by: Daniel Mack --- drivers/nfc/st95hf/core.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/nfc/st95hf/core.c b/drivers/nfc/st95hf/core.c index 99f84ddfdfef..7fdad67b1a4d 100644 --- a/drivers/nfc/st95hf/core.c +++ b/drivers/nfc/st95hf/core.c @@ -796,6 +796,13 @@ static irqreturn_t st95hf_irq_thread_handler(int irq, void *st95hfcontext) goto end; } + /* + * If the completion callback is not set, no command is currently + * active. Ignore the spurious interrupt. + */ + if (unlikely(!cb_arg->complete_cb)) + goto end; + /* if stcontext->ddev is %NULL, it means remove already ran */ if (!stcontext->ddev) { result = -ENODEV; @@ -844,8 +851,16 @@ static irqreturn_t st95hf_irq_thread_handler(int irq, void *st95hfcontext) wtx = false; cb_arg->rats = false; skb_resp = ERR_PTR(result); - /* call of callback with error */ - cb_arg->complete_cb(stcontext->ddev, cb_arg->cb_usrarg, skb_resp); + + /* + * Report an error to the core. If cb_arg->complete_cb is unset, + * we're handling a spurious interrupt that can be ignored. + */ + if (cb_arg->complete_cb) + cb_arg->complete_cb(stcontext->ddev, + cb_arg->cb_usrarg, + skb_resp); + mutex_unlock(&stcontext->rm_lock); return IRQ_HANDLED; }