From patchwork Tue Jul 25 19:29:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amit Pundir X-Patchwork-Id: 108666 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp939208qge; Tue, 25 Jul 2017 12:29:28 -0700 (PDT) X-Received: by 10.98.9.135 with SMTP id 7mr20740659pfj.15.1501010968271; Tue, 25 Jul 2017 12:29:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1501010968; cv=none; d=google.com; s=arc-20160816; b=gHQXq+9TmS681vEvbLtdcx02hp/s721fk9aJmf1HUBa9vhrSipz7huAxyG8Dy/lRKm I1IYbkhUe8zhfxQC+YlCVmsEp6KkQc3JVcy2vMUI8bqqpwgK2DmAYTjGANFnV/ylsMN3 mcFuZx7DfZhAqcTGJ9r2zZ/4KGlFdI226PlWFwbDxg41CDt94AU26fPu3OhZvcQHYpkx 4ZVANBtcrQciA2LOuQt0X3gosh90GVgM4I6aOA+cQFns5yYl5CuXngBPireJmnKDepol N+hO+VDQ5D1xLQ/apWnjitu5wtYYn70OfkouiBSbP8wTGiZs66kHwDx3QBONMQHSYBJB zGEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=X+JEAS6RzxTeJyASA/2/bficor9gh0qTD26+W9mbf+c=; b=nkcmbsTzjku69Z1p/T/XgVrVVuOi5TyRoGTAEaw3WSqGRP54IXEjqf0JNGCQoU/uAI PdFoXmtodlUw822jGNOqgzzURa0L/jsG1fWCP7sSqOU8ld6TYYVpwHMBw+1p8MR0vdby B6wRcFGun/BJRNW8rJQY1Zb2Hc8ZKoM02wd1VP54i2PLxKxTKET9Ep78+cgJoiJx6jdz 8zv7a1lP1qDRdfG0xRx331beIvjJsdGQM/JZ4I/PQqSCEUixaZfgZby8dgIHEhDaPnpO ImjZUZlRXfGd59d/03Q/R5FG1sePwAVR67sSu+3UKpSxZvNv/cjk3vgVI9SpNrML86WH 8SBg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=ihrZU0Ao; spf=pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=stable-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o129si8605553pga.543.2017.07.25.12.29.28; Tue, 25 Jul 2017 12:29:28 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.b=ihrZU0Ao; spf=pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=stable-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754353AbdGYT30 (ORCPT + 6 others); Tue, 25 Jul 2017 15:29:26 -0400 Received: from mail-pg0-f44.google.com ([74.125.83.44]:36725 "EHLO mail-pg0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754342AbdGYT3Y (ORCPT ); Tue, 25 Jul 2017 15:29:24 -0400 Received: by mail-pg0-f44.google.com with SMTP id 125so74108319pgi.3 for ; Tue, 25 Jul 2017 12:29:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=X+JEAS6RzxTeJyASA/2/bficor9gh0qTD26+W9mbf+c=; b=ihrZU0AoXT22pK/uB0JgIr9PuNsUU9hryuLERDc2rIjd6A5XhQXi99JZMu8JTb0BEe Y/9SQPzgvu+qD012ndzfyX4/dNj2BgVMyXm9SN4PFgT5JY/YwrCHL0L9qaamfyLA/UC0 mrpdOj8UKriaARN5755baOymyzwGw3X5/Fy4M= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=X+JEAS6RzxTeJyASA/2/bficor9gh0qTD26+W9mbf+c=; b=Shi0Xa5jo00eqh1nN4eyuaJtkmmnT8nplrImbpqhSIY/Ck40e3cEfTjdAtRlxOONfr BidRbMjCLePT1B/avWBOW8HLtubn1fLjIoOmY86WcLkXz/lBnKNqsS/Nx2X/Y0NYXpk1 CCQyTvGj2U4vIXuxGcamzklBQc7O3+phnwbm6GgVcNdURoZhf0yWfZykqBciciSrh23C 3X5T3lyy4HWE0+3+xqsZFJm2vJ5IVQA+lniBd21wZDPqnQEPv3lNQK2PihqEyDUUT0j6 Q3pFRB9flwIA6lQxgVcX1+B2G8NCim/Gg5nlY9ZioZh35+e1ZSpt5w/L/Zuj6d/G5pKu 56jQ== X-Gm-Message-State: AIVw113z2REMvZypCzhNLmB6DxSYLtRIfAt6+BUTNOykSegLLkRsMfvV 3d9dRsIxnaLVuNBS X-Received: by 10.84.169.67 with SMTP id g61mr22527599plb.155.1501010963718; Tue, 25 Jul 2017 12:29:23 -0700 (PDT) Received: from localhost.localdomain ([106.51.135.235]) by smtp.gmail.com with ESMTPSA id 85sm30371425pfr.90.2017.07.25.12.29.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 25 Jul 2017 12:29:22 -0700 (PDT) From: Amit Pundir To: Greg KH Cc: Stable , OGAWA Hirofumi , Samuel Ortiz Subject: [PATCH for-4.9 01/10] nfc: Fix hangup of RC-S380* in port100_send_ack() Date: Wed, 26 Jul 2017 00:59:07 +0530 Message-Id: <1501010956-27944-2-git-send-email-amit.pundir@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1501010956-27944-1-git-send-email-amit.pundir@linaro.org> References: <1501010956-27944-1-git-send-email-amit.pundir@linaro.org> Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org From: OGAWA Hirofumi commit 2497128133f8169b24b928852ba6eae34fc495e5 upstream. If port100_send_ack() was called twice or more, it has race to hangup. port100_send_ack() port100_send_ack() init_completion() [...] dev->cmd_cancel = true /* this removes previous from completion */ init_completion() [...] dev->cmd_cancel = true wait_for_completion() /* never be waked up */ wait_for_completion() Like above race, this code is not assuming port100_send_ack() is called twice or more. To fix, this checks dev->cmd_cancel to know if prior cancel is in-flight or not. And never be remove prior task from completion by using reinit_completion(), so this guarantees to be waked up properly soon or later. Signed-off-by: OGAWA Hirofumi Signed-off-by: Samuel Ortiz Signed-off-by: Amit Pundir --- drivers/nfc/port100.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) -- 2.7.4 diff --git a/drivers/nfc/port100.c b/drivers/nfc/port100.c index 2b2330b235e6..073e4a478c89 100644 --- a/drivers/nfc/port100.c +++ b/drivers/nfc/port100.c @@ -725,23 +725,33 @@ static int port100_submit_urb_for_ack(struct port100 *dev, gfp_t flags) static int port100_send_ack(struct port100 *dev) { - int rc; + int rc = 0; mutex_lock(&dev->out_urb_lock); - init_completion(&dev->cmd_cancel_done); + /* + * If prior cancel is in-flight (dev->cmd_cancel == true), we + * can skip to send cancel. Then this will wait the prior + * cancel, or merged into the next cancel rarely if next + * cancel was started before waiting done. In any case, this + * will be waked up soon or later. + */ + if (!dev->cmd_cancel) { + reinit_completion(&dev->cmd_cancel_done); - usb_kill_urb(dev->out_urb); + usb_kill_urb(dev->out_urb); - dev->out_urb->transfer_buffer = ack_frame; - dev->out_urb->transfer_buffer_length = sizeof(ack_frame); - rc = usb_submit_urb(dev->out_urb, GFP_KERNEL); + dev->out_urb->transfer_buffer = ack_frame; + dev->out_urb->transfer_buffer_length = sizeof(ack_frame); + rc = usb_submit_urb(dev->out_urb, GFP_KERNEL); - /* Set the cmd_cancel flag only if the URB has been successfully - * submitted. It will be reset by the out URB completion callback - * port100_send_complete(). - */ - dev->cmd_cancel = !rc; + /* + * Set the cmd_cancel flag only if the URB has been + * successfully submitted. It will be reset by the out + * URB completion callback port100_send_complete(). + */ + dev->cmd_cancel = !rc; + } mutex_unlock(&dev->out_urb_lock); @@ -928,8 +938,8 @@ static void port100_send_complete(struct urb *urb) struct port100 *dev = urb->context; if (dev->cmd_cancel) { + complete_all(&dev->cmd_cancel_done); dev->cmd_cancel = false; - complete(&dev->cmd_cancel_done); } switch (urb->status) { @@ -1543,6 +1553,7 @@ static int port100_probe(struct usb_interface *interface, PORT100_COMM_RF_HEAD_MAX_LEN; dev->skb_tailroom = PORT100_FRAME_TAIL_LEN; + init_completion(&dev->cmd_cancel_done); INIT_WORK(&dev->cmd_complete_work, port100_wq_cmd_complete); /* The first thing to do with the Port-100 is to set the command type