From nobody Sat Feb 7 16:05:41 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 64C9626CE25 for ; Fri, 14 Nov 2025 08:08:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763107729; cv=none; b=NOBlx+yAEFBrfezLCPJFCa8iJjDOd+7WdojuyyL7alIqbwDwYwq7svPgEXPzHJ3qL5UHDs2ogNFfo2J3GhoFZVB5BMoCVlLSPvw0yZrMQf30sP4hWYZ0dJX+89ysmCl3o5xQZBKpasvnpB8ed5sk+lhMdLSkasI/GIU8gETN6Y8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763107729; c=relaxed/simple; bh=smboXSPnSyuQg0Jfbixci8TkTxPDq3bDlst3LL2pjfY=; h=Date:Mime-Version:Message-ID:Subject:From:To:Cc:Content-Type; b=cN6uPfPQNJJyrwYF5pyNFT1RDMfTmZ8xQSq9/aztrt9xFFDqu8aBXYZqi6ePZvyQZiAbdHXcr8anUimGcnnTmE/RkTH/yoEOVgdndymx1/OYz5SxLADTgp3fkPzzmpF1FAkkJcrOx+2ZL3XwCyBN77tSfROj60ijH+h8AdAwxtc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--hhhuuu.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=38tbI3kA; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--hhhuuu.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="38tbI3kA" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-7bb2303fe94so32735b3a.3 for ; Fri, 14 Nov 2025 00:08:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1763107727; x=1763712527; darn=vger.kernel.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=FaZd0pLqMSksiOjb+Jw+W1+Jt+Bqll3R9KqbqD770D8=; b=38tbI3kA+GFn315/pcL4Da/SxJofDfmrHmv93PvIiQWAZA0vrx5+rjvAU+ckdl81GD kJ/qkOwChAIJBx98T3wPSNzK9lGnFM0lCK3xsU/aFOA7M6LpecTGbFInfSHNR5eFzp5i DZyZXxmruP8xuNlf1mFJPTCDoWUS0Eb4zUhvyLoP3IlP2iBX7nyDq3zB24ZK5gdpgHCG AnSU3owiGRVh/Hw+xWjMe6ZlRLHGM5XbVhld4Y+fQk8F7dgh17/g6zSI+uIgfaqGzgXO zjb/F6sLpuTFYXjN3JOMWGHnyVFPtlGgurB44Zi+7cVn2f2B4eLMANhfoNQzBdJ9wQdr Lv5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763107727; x=1763712527; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=FaZd0pLqMSksiOjb+Jw+W1+Jt+Bqll3R9KqbqD770D8=; b=J3WxdfDtwtKgeLXo6TtNBRJkO0ErUnDe34ayo99RUbSH7sa8zePFQDJ06epxw4tepc DtFBM2Kul+L4huKTrLrVRhI1Cf+FY2K8VrPWabE+3TF5C4uwbHnvrXUS2AHsWcP4GeOr JpK+cmca8U/CRJ4ZjRgiLucfKfy3hjibrEarpF6v4TTEQ7PV7XAhWGd8JsPRphYZEPii K55JT1wlY/FyIJ9LFEcfvqDOcTZopnd8SkCmK6UyFHaX5z/dJhXF4r5BI1Y7WP7H1Oha gO0FxCwmwsBCKz3x2xNLJC5PaCcH5+OdAPKSjw1d7CReYBy87V7ca+4c6MdI85WluQ5i /MXg== X-Forwarded-Encrypted: i=1; AJvYcCVqAJ9XHJkp8+LLzirtyyogipyNd0QDIkP/LWl2SYYDIkbosCjB0PF6OGrXqM3JqlbXBPk0oaqAnjmpKdo=@vger.kernel.org X-Gm-Message-State: AOJu0Yxu3/vMCbP80phIAolp8iBTMFnavWu4Cvbwh8t6h0RigE1tDSrm neNZAizkJkFDxIkYAl5Tc65YySebAFJDk3/1FvOy71S99NWFh3FiQYD9ysY6ADjC14K76FcQ7eI z0dmENw== X-Google-Smtp-Source: AGHT+IFyahqRDgCTzEk2G6XerYnaF/ixiNmgFZ8qFZ/mRyHI/Z+svgCP6tH+CS9dbmYU0Ls78Ln6iVi1Ifc= X-Received: from pgnr18.prod.google.com ([2002:a63:8f52:0:b0:bc4:233b:be04]) (user=hhhuuu job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:3ca7:b0:350:55e0:5522 with SMTP id adf61e73a8af0-35ba22a61d6mr3388572637.37.1763107726552; Fri, 14 Nov 2025 00:08:46 -0800 (PST) Date: Fri, 14 Nov 2025 16:08:41 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 X-Mailer: git-send-email 2.52.0.rc1.455.g30608eb744-goog Message-ID: <20251114080841.829128-1-hhhuuu@google.com> Subject: [PATCH] usb: gadget: udc: Fix permanent block caused by 'deactivated' flag From: Jimmy Hu To: Greg Kroah-Hartman , linux-usb@vger.kernel.org Cc: Jimmy Hu , Kuen-Han Tsai , Alan Stern , Thinh Nguyen , Roy Luo , Robert Baldyga , Felipe Balbi , linux-kernel@vger.kernel.org, badhri@google.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When setting a new USB configuration, some functions (e.g., UVC) can call usb_function_deactivate() to set the `gadget->deactivated` flag to `true`, intentionally blocking enumeration until a userspace daemon (e.g., UVC service) is ready. This `deactivated=3Dtrue` state becomes a permanent block if this flag is not cleared by usb_function_activate() (e.g., UVC service failure or config set while unplugged). This blocked state persists even if the cable is plugged/unplugged, as the vbus_event_work() handler is still blocked by the `gadget->deactivated` flag, preventing pullup() from being called. This patch fixes this by modifying vbus_event_work() to clear the `gadget->deactivated` flag *before* usb_udc_connect_control_locked(). This breaks the permanent block, so pullup() can now be called. Fixes: ccdf138fe3e2 ("usb: gadget: add usb_gadget_activate/deactivate funct= ions") Signed-off-by: Jimmy Hu --- drivers/usb/gadget/udc/core.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c index 8dbe79bdc0f9..0195540d511a 100644 --- a/drivers/usb/gadget/udc/core.c +++ b/drivers/usb/gadget/udc/core.c @@ -1151,8 +1151,17 @@ static int usb_udc_connect_control_locked(struct usb= _udc *udc) __must_hold(&udc- static void vbus_event_work(struct work_struct *work) { struct usb_udc *udc =3D container_of(work, struct usb_udc, vbus_work); + struct usb_gadget *gadget =3D udc->gadget; =20 mutex_lock(&udc->connect_lock); + + /* + * Clear the 'deactivated' flag on a VBUS event + * to break the blocked state. + */ + if (gadget->deactivated) + gadget->deactivated =3D false; + usb_udc_connect_control_locked(udc); mutex_unlock(&udc->connect_lock); } --=20 2.52.0.rc1.455.g30608eb744-goog