Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp3110064ybi; Thu, 18 Jul 2019 21:13:05 -0700 (PDT) X-Google-Smtp-Source: APXvYqy5JSGIDf9jB7zuC7/S7vvA1qbTMCymY02s4v7m9qM2o0fOrGTju9w2fDZIrl6D9n1GEqZh X-Received: by 2002:a17:902:934a:: with SMTP id g10mr55398433plp.18.1563509585369; Thu, 18 Jul 2019 21:13:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563509585; cv=none; d=google.com; s=arc-20160816; b=BDQVwSI2aZ6BbfDDV9bALAatuv9UN617U/9sfgge/7rGOBtpnqhzp9YagkR4a6NRVl b/k2CViTV9ZHR30icfhk2Bi9vjVASf0oSYQvfpTux4V6gDluVi6LcF9fCBbw/ml+ZZ0y YwEObs3CW4tVWtPAxT+mnNmaRULH4G9Wkag27f9Slipj9iK+6LIqr1Rrmx7xcpIkixUM 8EDmEDbjEuOcayd06FgpgM6jwzRZOXhj50VcFcSoqXgzoKrJB/+49aRWP+8L98TqrUo9 bikmIBDkt9RmLjLdo6iBDQnhyu6d/9++qTUFN5brJAtGWEbqqAQQzzOSLw2fvkzokqvz o4zQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=KSaZTQZv1AnOggFdbgrcbM7ckXcH5PqIi0F5/ZDbiCI=; b=mOnI77ON0oK/o/uHI3mV4/WIvuZZbZ0Csnya86EVgZdXHEG4sOD5p/ityYHzc7I6Wa 0keWI0+bCD/U6t/Dkek2uVbdPm8JvvtSTRBdJjrS/Fhe4/1EaEerHYlKc7s06E42gUNV XWWAHlNVwh1Hekg0/S6no+NqW8fO3Yf5+YYgJpyhhaTULRNwfXBUkyH0g7SyD6x5DWfA fj1u/6W1YMKLGFTps8J4zrIr2JXLEHzbOOOM+BirWZLLpJ2l1bZPaWMqfU9bQdk1Z7fy vRg8iRioJlTJXPvVjAyYhXDTLmbHQm/wN4sE2KBbVYkfRDJBpTYeSl2cHhazVUajSkOF 2MNQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=tENu29kn; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id cn1si1808614plb.204.2019.07.18.21.12.49; Thu, 18 Jul 2019 21:13:05 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-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=@kernel.org header.s=default header.b=tENu29kn; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388574AbfGSELy (ORCPT + 99 others); Fri, 19 Jul 2019 00:11:54 -0400 Received: from mail.kernel.org ([198.145.29.99]:46858 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388508AbfGSELv (ORCPT ); Fri, 19 Jul 2019 00:11:51 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 6629121873; Fri, 19 Jul 2019 04:11:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1563509510; bh=sacn3cJ+R1kePnKDNwAsaeKzn1gYRQe/keIiGUCKDbg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tENu29knR0I0/Z2ckylTzUic5JYHiQkMCui/B9BEuFD05Pqsl2rDIbg9ZiyDO6we6 LuBNSXxCu5iWB7GAzmADSdpqxjIw7VKGAy9zTXKaedEAr0m/yTy8QONvc5or7I4ZSy q0G6QBOWdWnk77SHpj74wdCcCgJt6R7tLgpOSaaQ= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: EJ Hsu , Alan Stern , Felipe Balbi , Sasha Levin , linux-usb@vger.kernel.org Subject: [PATCH AUTOSEL 4.14 22/60] usb: gadget: storage: Remove warning message Date: Fri, 19 Jul 2019 00:10:31 -0400 Message-Id: <20190719041109.18262-22-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190719041109.18262-1-sashal@kernel.org> References: <20190719041109.18262-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: EJ Hsu [ Upstream commit e70b3f5da00119e057b7faa557753fee7f786f17 ] This change is to fix below warning message in following scenario: usb_composite_setup_continue: Unexpected call When system tried to enter suspend, the fsg_disable() will be called to disable fsg driver and send a signal to fsg_main_thread. However, at this point, the fsg_main_thread has already been frozen and can not respond to this signal. So, this signal will be pended until fsg_main_thread wakes up. Once system resumes from suspend, fsg_main_thread will detect a signal pended and do some corresponding action (in handle_exception()). Then, host will send some setup requests (get descriptor, set configuration...) to UDC driver trying to enumerate this device. During the handling of "set configuration" request, it will try to sync up with fsg_main_thread by sending a signal (which is the same as the signal sent by fsg_disable) to it. In a similar manner, once the fsg_main_thread receives this signal, it will call handle_exception() to handle the request. However, if the fsg_main_thread wakes up from suspend a little late and "set configuration" request from Host arrives a little earlier, fsg_main_thread might come across the request from "set configuration" when it handles the signal from fsg_disable(). In this case, it will handle this request as well. So, when fsg_main_thread tries to handle the signal sent from "set configuration" later, there will nothing left to do and warning message "Unexpected call" is printed. Acked-by: Alan Stern Signed-off-by: EJ Hsu Signed-off-by: Felipe Balbi Signed-off-by: Sasha Levin --- drivers/usb/gadget/function/f_mass_storage.c | 21 ++++++++++++++------ drivers/usb/gadget/function/storage_common.h | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c index 25ba30329533..a74639289760 100644 --- a/drivers/usb/gadget/function/f_mass_storage.c +++ b/drivers/usb/gadget/function/f_mass_storage.c @@ -2295,8 +2295,7 @@ static int fsg_set_alt(struct usb_function *f, unsigned intf, unsigned alt) static void fsg_disable(struct usb_function *f) { struct fsg_dev *fsg = fsg_from_func(f); - fsg->common->new_fsg = NULL; - raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); + raise_exception(fsg->common, FSG_STATE_DISCONNECT); } @@ -2309,6 +2308,7 @@ static void handle_exception(struct fsg_common *common) enum fsg_state old_state; struct fsg_lun *curlun; unsigned int exception_req_tag; + struct fsg_dev *fsg; /* * Clear the existing signals. Anything but SIGUSR1 is converted @@ -2415,9 +2415,19 @@ static void handle_exception(struct fsg_common *common) break; case FSG_STATE_CONFIG_CHANGE: - do_set_interface(common, common->new_fsg); - if (common->new_fsg) + fsg = common->new_fsg; + /* + * Add a check here to double confirm if a disconnect event + * occurs and common->new_fsg has been cleared. + */ + if (fsg) { + do_set_interface(common, fsg); usb_composite_setup_continue(common->cdev); + } + break; + + case FSG_STATE_DISCONNECT: + do_set_interface(common, NULL); break; case FSG_STATE_EXIT: @@ -3007,8 +3017,7 @@ static void fsg_unbind(struct usb_configuration *c, struct usb_function *f) DBG(fsg, "unbind\n"); if (fsg->common->fsg == fsg) { - fsg->common->new_fsg = NULL; - raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); + raise_exception(fsg->common, FSG_STATE_DISCONNECT); /* FIXME: make interruptible or killable somehow? */ wait_event(common->fsg_wait, common->fsg != fsg); } diff --git a/drivers/usb/gadget/function/storage_common.h b/drivers/usb/gadget/function/storage_common.h index e5e3a2553aaa..12687f7e3de9 100644 --- a/drivers/usb/gadget/function/storage_common.h +++ b/drivers/usb/gadget/function/storage_common.h @@ -161,6 +161,7 @@ enum fsg_state { FSG_STATE_ABORT_BULK_OUT, FSG_STATE_PROTOCOL_RESET, FSG_STATE_CONFIG_CHANGE, + FSG_STATE_DISCONNECT, FSG_STATE_EXIT, FSG_STATE_TERMINATED }; -- 2.20.1