From nobody Fri Jul 24 22:57:24 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C4969439F7D for ; Wed, 22 Jul 2026 16:24:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784737477; cv=none; b=qFx8N88lVCMM+SEx+ekXlt9SKB8JkLvGCCu8uY9WIRP6iXt32Y/kyUnS+kY/2HBExFTSp1PRjATwB9Fnxlp4g2JbrRHbGR2Dy7ckAO2/mz7FzQ/nBUYmny0EK47EH/wWrqIQ7sqPWM7AdhLzWS2M/kJRe9VpXQ30Vzn2M0jASWo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784737477; c=relaxed/simple; bh=ujINoWvFEXQOINBn9QUqo3F10YVyvQ7B5C1H6UXMOyk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=B6gffDGNm71vZ8EwR5e4o3GYs0+ph9vUGBEDI5EH/vdsvpWMs75h/Z5//LnYlrobLceZO2NIrgbtwHrugjC3urdSo0P6pHeSsR41nX9pglAMcbmq1GZyLieMmVld1kT60cJHJR6hIXPcEyTSdwvqW4pTRsZp+4JFrkQHWkMGRe4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=fTtZUVBe; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=HlMVsPRm; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="fTtZUVBe"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="HlMVsPRm" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66MFY3KU1310339 for ; Wed, 22 Jul 2026 16:24:34 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= iLzLuBwgWRJMznJIT1I87yw1WV7Wr0u9MEqd4UADguI=; b=fTtZUVBeofZFUkJg pGfIW2N+M+tddGsnrnMh84rnZBTokb/YvPaZNaJ8WSHyeSm618q94VO15fRpL5Ay Zv8Ol+m8YiJDGk3oyWOEApVoWY7TXAPmbjrRHiy6u8aQi2DnH/gNRM7hH33SV9XL muB9ZffZyMEYaoQDUoxRf/GzCIWxZ0VdO9qLYsMFB1GjKi8mFj8hA1HHWKaIMRaO Z8oNXkfIHEVJYOizPHc1CWqiUTz3aWPUyRGdAzCA/hBR1OAYa4a/42fYc1aTH1A8 ZS4/ZJn0YRv4ZDpcE6K6hCux0ZfXwaj9+J8C1jdRCRDAsccCuEYxGBbKsspjET4B QIDbrw== Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fjt79a1cw-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 16:24:34 +0000 (GMT) Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cc620652bfso32665ad.2 for ; Wed, 22 Jul 2026 09:24:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784737474; x=1785342274; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=iLzLuBwgWRJMznJIT1I87yw1WV7Wr0u9MEqd4UADguI=; b=HlMVsPRmW2IA6hL9MQmkMcdAEJloFt1YdNY3BIlACcXcG4QwyWs/TWGigjQgagP/gk hKJa2bfEBIdtt3TJU3Rg5cM5/tZ7F2d18Gk0ygR3U05f/AsAqFf8R67F/purws29flSA r4t0DDENShFjWvx3DjbjEqDFaVMkWfMOob0cQiR9nszJ83CSl6ZJe612qmaKGhSlgH9O 7ClUtdwlpPjTkdkRj3+eIFzyd454VQ0L1ypBXzO69XroQyV42FwTiVCFkuKQvhuaflnb qyLLTgzyI3G6g+/+xKKI+hMuAxrjxjrlR9fMmGmEWhNewM6karo50gRdCnMJ+1Xg/Fnh Gzyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784737474; x=1785342274; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=iLzLuBwgWRJMznJIT1I87yw1WV7Wr0u9MEqd4UADguI=; b=YECr3C5LY5YwDGDRMRaqThmeCfNItQR1L6q9UZTSdzc3JBhz1cZ7UZPi83z4YP2sbP AFO8NKWdgjmC1jOSM/BN3fd9kOHGWX9tTpcWmrNzm1vlHk7GDV5+4NQ5gZksL92TTZKj tGhotvtWgAs/U5RiqgwNkOiPmdMdWffG961SEK7y/7uaBneGcSCLkcrtC6ZggiUVh94i Rsv6sJQBqMEEm/6Z0shg2MEM54aqnJ+4M4ZtDTMKSu0XBaTAudyeT/mFQz9GQthEnd8i of3fNwxjFEatpQgXO3cpopJPoYXaZGpQsPugziIcnGge1g7dODOoF1Oxjpvp/1e1HIVI JyRQ== X-Forwarded-Encrypted: i=1; AHgh+RoD9j2zjDS5UfrLvg0RN/fwXE2HKlwNY2N2b8PIkbju08zTUo6JjCrSpqVAS8XGMzuPXG5jT46UevNAgds=@vger.kernel.org X-Gm-Message-State: AOJu0YyQCZTqyA+2J5QlaKK96SE1lm+aJkNG/wkMp8n2JlZf8koUFz+y xJmj/ffLROo1oG8xtxAP2aT5j2MjiCcw4ikcjxUyw+ouZCEcsOgubUyHtf7XGH+aPTyJG0foyTA Llc1XMO3v66EZj0bS+uywm0z6JVuh3U5KqhR/q9PGUb5HzJSJEz8rQpTlyRvasl3n2TR7xKbxXo he4bLv X-Gm-Gg: AR+sD11sFRM/u1YHKj/HyjTYFssD1NZmbBqo2h+xfi2CXrO6ZcSheVPkX2+YWOSkZUi j2boMFt/FbH/nV3Edkob+0LJQlN6HIjULEsqcmAih6PNk1Hhe36l77GPc7O4ZfRpiFZ78xoPKFC ylLK4veT05njn9gPQFTBUejtciQ4V4tGZZqvSFV+uf74dEsFk2z4qkz6yy/lGliKqwwVkm4KRTM SL3qqGRSJ5BHMED3pgEltUzm1S5SNM9iJeN6BXvm6RGm3bo3DDf4WXlz9kwBOshyTfo4VPzE648 UrEQ8kQKFu5LgXNa65zWViYN9bvA5KNu2qiKucwHGcFALyRAQCGc4qKZruyXyMaFNVAHcVLbKgl BgcJ0iGZkEXx8+11V1XA52e8WxUrO9v/RMI2hduamGLxmOVI= X-Received: by 2002:a17:903:1905:b0:2c4:397:dd7a with SMTP id d9443c01a7336-2cf80472f4amr72977395ad.4.1784737473641; Wed, 22 Jul 2026 09:24:33 -0700 (PDT) X-Received: by 2002:a17:903:1905:b0:2c4:397:dd7a with SMTP id d9443c01a7336-2cf80472f4amr72977155ad.4.1784737473121; Wed, 22 Jul 2026 09:24:33 -0700 (PDT) Received: from hu-zijuhu-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3147dc9d932sm10569970eec.12.2026.07.22.09.24.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 09:24:32 -0700 (PDT) From: Zijun Hu Date: Wed, 22 Jul 2026 09:24:20 -0700 Subject: [PATCH RFC v2 1/3] Bluetooth: btmrvl_sdio: Do not free HCI_VENDOR_PKT frame by hci_recv_frame() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260722-support_vendor_hci-v2-1-132b506460a4@oss.qualcomm.com> References: <20260722-support_vendor_hci-v2-0-132b506460a4@oss.qualcomm.com> In-Reply-To: <20260722-support_vendor_hci-v2-0-132b506460a4@oss.qualcomm.com> To: Marcel Holtmann , Luiz Augusto von Dentz Cc: Zijun Hu , linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, Zijun Hu X-Mailer: b4 0.15.2 X-Authority-Analysis: v=2.4 cv=Sr6gLvO0 c=1 sm=1 tr=0 ts=6a60eec2 cx=c_pps a=JL+w9abYAAE89/QcEU+0QA==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=DZz0kYWpbZunJ_XR1fEA:9 a=QEXdDO2ut3YA:10 a=324X-CrmTo6CU4MGRt3R:22 X-Proofpoint-ORIG-GUID: S3fHuYYJFro8P2XgDAQ5QKCCVFZZ80ag X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDE2MSBTYWx0ZWRfXycnVFjahM/vL frHNbLcaVtkiG6c3AqJUJsOaJSrMfGdYJOAjpXBVX5K5MK0bWD9P3ghAPcyYAoc5xMSbS5ixfPc fvPbz9XxGMcCjUH6uDda4cq0X+/CL54JFmwi9vngmeBVVYMc7FC/qGICUFlgax45kpdBbYHyWbJ v9PYX05FdE2576/rpj3oj8hK1CT9FryswVcmaF6mHN2Fsloy8IOytEIp64fI4jFFygqxu/twYDR OFhwQWOFiTE5knv2TT3orXxoTrECDSTlrxnvbIHldJw3Yj3fLEIi1ePvbJFnizqHajF39V9m9MN uM2AQ7A4vFAg/0XdrlWSodaOE7gbXEhJgOYhaYMNZ6vPKqRxPM2fMcbDz73dD4ndcjExIa70GfB Nluxw8pSqUX8Y7c3vXmSw/5b3ERbrzqsRlYe58rkBwzmO00CTTESQaWgTU3zDWlI1al8YO/Xotr YfG5BiJcD2NHp4HuMOw== X-Proofpoint-GUID: S3fHuYYJFro8P2XgDAQ5QKCCVFZZ80ag X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDE2MSBTYWx0ZWRfXxD/rmqC9ELCn gLoNEEVUOhquOcKBmbM2BPBxYdfjtFh/YKCNgfzfSZZ9rTtpTlqI0RgNrTF4nvd2P3SMHGTObKr WONq9/yW9Zn03sgDmCMFMaxbmYrIVzg= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_04,2026-07-22_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 spamscore=0 lowpriorityscore=0 bulkscore=0 adultscore=0 clxscore=1015 impostorscore=0 phishscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220161 For a HCI_VENDOR_PKT frame, hci_recv_frame() does not accept it and will kfree_skb() it directly. But btmrvl_sdio_card_to_host() is still calling hci_recv_frame() for the frame. Fix by freeing it with kfree_skb() directly. Signed-off-by: Zijun Hu --- drivers/bluetooth/btmrvl_sdio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdi= o.c index 93932a0d8625..b91fc63bc9fe 100644 --- a/drivers/bluetooth/btmrvl_sdio.c +++ b/drivers/bluetooth/btmrvl_sdio.c @@ -799,7 +799,7 @@ static int btmrvl_sdio_card_to_host(struct btmrvl_priva= te *priv) skb_pull(skb, SDIO_HEADER_LEN); =20 if (btmrvl_process_event(priv, skb)) - hci_recv_frame(hdev, skb); + kfree_skb(skb); =20 hdev->stat.byte_rx +=3D buf_len; break; --=20 2.34.1 From nobody Fri Jul 24 22:57:24 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C3A84439F7F for ; Wed, 22 Jul 2026 16:24:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784737480; cv=none; b=Rl9nYvRvX5TAngAHkxkobduHXtkos1krqhS/ACQzsji8KH6DxWB9aWjdu4UbqjM9VaKWhsKFesrRgI9IFI/ut6D123Q6NUvilFu8wNPN58vH44OC16cXnwGFF3H7ZcBjJ17d3Jnq25q65wIonsZQLLqLkWrDlMsX/+UfWgz5v34= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784737480; c=relaxed/simple; bh=W/APSbXoE3Axn9ZWUkFSUufYWQNnk7m+N50KBsxLGwQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Xa/LzWDjgHphqWOdVm6R3UgU/0WGMKja85EX1ZPt+Ij68myd4tKeB/sM0KtdMiAIc/UffZzB6JLfNYbLshI8ZDZCw9Uri5eC8iN3qDylMIsbT2X65GI/V3mMQ/TkcWo2lNfMism6fZCd7YWbV5gCRgQrIHvUvt857UjGdfoeo3Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=H97IPDGt; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Yio2fNiw; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="H97IPDGt"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Yio2fNiw" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66MFXvGL1146366 for ; Wed, 22 Jul 2026 16:24:36 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= +h/2TMKEJac8Gd0kMzL2pVaT9OZjXwWeomRCsweesLI=; b=H97IPDGt7yCjtDWT 6M2DtQ9pZYSX1jIeQbWwJnre1jfe8CZsh6DuFadRLj6Oqi1UjAAtpil9RsxhxzBM XHtDXtiMvGTg+cuPRYqydVxhjYLhOiPqRl04fosNV75H1Ya18C1Fc4oFV4LzQ4kW s/vzMWmx9k/EHn5JAUZWDEJiOk+wPFNmXkyCEIqErWJlk9L2EQtlE1LotUAA4r3c 0d9Yrb4dg6RdBkEKpWFCIw7b8hU228TUy+m73hcKJK6UVOeIRrvwI+bUtRJ4Eq5r HzPCP5MXBKObkhmooafIpOHwZ8CBafn77/EC77NFwN6Zr5paxAyDoSQf7KaLH1d5 x1jlfA== Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fjntn36mv-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 16:24:36 +0000 (GMT) Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cae7a8b9easo22215ad.3 for ; Wed, 22 Jul 2026 09:24:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784737475; x=1785342275; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=+h/2TMKEJac8Gd0kMzL2pVaT9OZjXwWeomRCsweesLI=; b=Yio2fNiwdvrri4uuHqsvbCSzC0Kbf5J6M9wsEXxSt+iS21rAGImyjCdzWaGTVvZFc8 k5/14TCbmekrediMKpxUlPSWmTEpbNBUyQBNAPAV/IUvefkLA50cqNeY+hcrU3JV9Nx4 cP7E+WxL06F3XtYqLpVX259gvoTontzBMztZn9Grj4Ydag+3XR1rXaG3kcQsNX1gelfT rKtXFi/lHeGy75pAokaNfWLWm6NvZeku2TmcI6xLLLZUbX0RIf1V3E9X7qFUMJVL3eW/ 2iRMJmY7RhkUgDQg8q0wEZMQmKsJ9q1S46nuxAdrpLbpojKjpJPpkvS+kR78qju/04lO OOMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784737475; x=1785342275; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=+h/2TMKEJac8Gd0kMzL2pVaT9OZjXwWeomRCsweesLI=; b=CqMWAa3oIj8OTbdzzJLdCYSTFC4lUb+ZCGPucD71REdhDFJxklGpg1FKuYMdoyGwjb Jt7lQrGchkv52iq0T4vgSOL1Bzfru1Hkev1kg8zwydDYDguxJWoYtmzGCsBpy5tcCsaa wlJ2gU8gsNE61IJItHTDVeb96C3ADkuizKL3/CXmNhS9XzN/H29/wdf/mAC0GXltuaA/ vCCqAMPMx322dFCzzMInbfJjm5rJTnUheld+F5ZhodGvsPJg2BsKan7Mt3/WibereItG dSwhPWjACKJfPQTwg0O2ZByFFqaT2NylbEKIiXjtUI2XCyw9Ma2KVdm2NG53nFRmu+F8 bZ5Q== X-Forwarded-Encrypted: i=1; AHgh+RojAUE26e+V3SZrUg1+1Tpa+igytF9GxqxaXyswRd8gDiBXVR4ncAtNJj3pYDMIj8yX5PYYAE7+TNfvXNE=@vger.kernel.org X-Gm-Message-State: AOJu0YyZwM5VSAEll1ggD1buBeeksNIvUg54lnwJl1jonrt5qSss8dKa B6Nt78A5Q8n+ppurn/e5c0B9weQM4F4NQD8xgrvp/Cmeax9lzBTmPEqSja681meMUkJza9Ve4kg RR0l4sq33EwuwCvQEFH1nPzRaYTwiYOcoFE904fP0FmfwmnnkYW37jrWsYNaV7tnWgjkXAHdKTj iqmW77 X-Gm-Gg: AR+sD11TcxszZ9wkI3awBuOgGkc68T+5xZa8hxXwIJcilVb8qx0W1AIm9URWUC5h7LC ncLvIBrOrWZUqWkfC0/wm8rf3RIJ1LOnOsnRS5cI6pYPhXKon90RWsq17MyIQmv3F/HMdU6KobY iXC1a9nWaWYYKUZc10Ans80MFAZnEtC+Ti+0QHVbc+GmsRvjS2n4pYEardfmRmo2sRwmcZTmmny oy8XpMH6Ld1KtyWhWJGfUbrR/9qVfouTUH1sl99OIvPa6AkGQemrwPDzsdfjOfReUBM1is6RcwJ nd+g7uA2X4jcb8A+7s/QmF3VFsZmlyVPVu0BExQXswQmhRQD+A9h3EyIE7mKCuNXIEo0Vi/rFhi W4ng6sJjEHYJCvuuadW+u4jnii/ss0ukWu0a+wm5Ia8mIn94= X-Received: by 2002:a17:903:230d:b0:2c9:ed4a:c3a4 with SMTP id d9443c01a7336-2cf8017d572mr68555385ad.0.1784737475204; Wed, 22 Jul 2026 09:24:35 -0700 (PDT) X-Received: by 2002:a17:903:230d:b0:2c9:ed4a:c3a4 with SMTP id d9443c01a7336-2cf8017d572mr68555085ad.0.1784737474581; Wed, 22 Jul 2026 09:24:34 -0700 (PDT) Received: from hu-zijuhu-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3147dc9d932sm10569970eec.12.2026.07.22.09.24.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 09:24:33 -0700 (PDT) From: Zijun Hu Date: Wed, 22 Jul 2026 09:24:21 -0700 Subject: [PATCH RFC v2 2/3] Bluetooth: Add generic support for vendor HCI frames using HCI_VENDOR_PKT Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260722-support_vendor_hci-v2-2-132b506460a4@oss.qualcomm.com> References: <20260722-support_vendor_hci-v2-0-132b506460a4@oss.qualcomm.com> In-Reply-To: <20260722-support_vendor_hci-v2-0-132b506460a4@oss.qualcomm.com> To: Marcel Holtmann , Luiz Augusto von Dentz Cc: Zijun Hu , linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, Zijun Hu X-Mailer: b4 0.15.2 X-Authority-Analysis: v=2.4 cv=AJsSZ1gA c=1 sm=1 tr=0 ts=6a60eec4 cx=c_pps a=cmESyDAEBpBGqyK7t0alAg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=6DYPQAbK-MwNJFPfgmcA:9 a=QEXdDO2ut3YA:10 a=1OuFwYUASf3TG4hYMiVC:22 X-Proofpoint-GUID: J0lcFN3Cx0wqZ72AyreKFcoxtR0rcIlQ X-Proofpoint-ORIG-GUID: J0lcFN3Cx0wqZ72AyreKFcoxtR0rcIlQ X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDE2MSBTYWx0ZWRfX4ZbYDab7R4VZ 1j/3SkAZ32hZAFyLyu+BMDRN6YjU8CFiPKtmahAIZAYOLbZaRowu1iSt2iHb4Pw+Q/qPC6+ltXz Qt3K5yeXsiiW5KW0poOtU5qfp+qqjvM= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDE2MSBTYWx0ZWRfX9Vk+Uw/GYPxe CMFDYMHcZrkcrq2zNVxPVI3wq7nBZupXrCm//N6rdQC2bndYXvFho2E3XVd/YMQynDPPGh0tSDe mUkJHUpNpmmmk+GDuTmxXwMA+JSa+Pzsv7UldbcvhdAoEXJS3rdpnqpr1DgciKZiESFtkWqHauE vtH4a3iPOpJpxHGx//XsCePoG/ldAVfxa3y25FNfJS9VqRJaWl2rNBoPp8IVGpKGGQQXL6B9Xhm +I95kUXAsdWuykws4Z7Hy+lI7u9HVQUj5G57qE31/BYTFNKUh7dZx7Q6j8ya+aeU80Sp6Oq7+W8 aV27WwFDgp347ZNNGQvzHIrpPMQKFYaC0ViLPTkyINwdOL0bsITBCa2rmr2stc2icLsNTjfTnZp M4Fj7n+F/FHRD2U+jqOR5wEGjlfFETkJjpZHabYYxj8gcxZaaCScAHo//9uR4Qmbs0KqY7ckR9T YPH3alNr6XL3rPkZ5HQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_04,2026-07-22_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 spamscore=0 clxscore=1015 phishscore=0 lowpriorityscore=0 bulkscore=0 adultscore=0 priorityscore=1501 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220161 The virtual HCI_VENDOR_PKT (0xff) has been defined but never used by the BT core. Now, there is a requirement to implement it, as follows: For Qualcomm multi-subsystem BT chips, the transport wire carries both BT-HCI and PERI-HCI frames. PERI is a subsystem on the chip. Take the upcoming QCC2072 support as an example: Packet type BT-HCI indicator PERI-HCI indicator ----------------------------------------------------------------- CMD (Host -> Controller) 0x01 0x31 ACL Data (bidirectional) 0x02 0x32 EVENT (Controller -> Host) 0x04 0x34 To generically support vendor HCI frames: - Show them in btmon logs as they appear on the wire. - Allow userspace to send/receive them via HCI_CHANNEL_USER, with a socket option to control RX, defaulting off to eliminate regression risk for existing applications. - Add hdev->recv_vendor_pkt() to handle vendor frames in hci_rx_work() like BT frame handlers. - Add hci_send_vendor_frame() API similar to existing __hci_cmd_send(). Signed-off-by: Zijun Hu --- include/net/bluetooth/bluetooth.h | 2 ++ include/net/bluetooth/hci.h | 1 + include/net/bluetooth/hci_core.h | 4 +++ include/net/bluetooth/hci_mon.h | 2 ++ net/bluetooth/hci_core.c | 38 ++++++++++++++++++++++++++++ net/bluetooth/hci_sock.c | 53 +++++++++++++++++++++++++++++++++++= ---- 6 files changed, 95 insertions(+), 5 deletions(-) diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/blue= tooth.h index b624da5026f5..d9870a43a2c4 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -256,6 +256,8 @@ struct bt_codecs { =20 #define BT_SCM_PKT_SEQNUM 0x05 =20 +#define BT_RCV_VENDOR_PKT 23 + __printf(1, 2) void bt_info(const char *fmt, ...); __printf(1, 2) diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 50f0eef71fb1..ac97550cbdba 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -398,6 +398,7 @@ enum { /* HCI socket flags */ enum { HCI_SOCK_TRUSTED, + HCI_SOCK_RCV_VENDOR_PKT, HCI_MGMT_INDEX_EVENTS, HCI_MGMT_UNCONF_INDEX_EVENTS, HCI_MGMT_EXT_INDEX_EVENTS, diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_c= ore.h index e7133ff87fbf..428261591288 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -28,6 +28,7 @@ #include #include #include +#include =20 #include #include @@ -645,6 +646,7 @@ struct hci_dev { int (*setup)(struct hci_dev *hdev); int (*shutdown)(struct hci_dev *hdev); int (*send)(struct hci_dev *hdev, struct sk_buff *skb); + void (*recv_vendor_pkt)(struct hci_dev *hdev, struct sk_buff *skb); void (*notify)(struct hci_dev *hdev, unsigned int evt); void (*hw_error)(struct hci_dev *hdev, u8 code); int (*post_init)(struct hci_dev *hdev); @@ -2327,6 +2329,8 @@ static inline int hci_check_conn_params(u16 min, u16 = max, u16 latency, int hci_register_cb(struct hci_cb *hcb); int hci_unregister_cb(struct hci_cb *hcb); =20 +int hci_send_vendor_frame(struct hci_dev *hdev, struct iov_iter *iter); + int __hci_cmd_send(struct hci_dev *hdev, u16 opcode, u32 plen, const void *param); =20 diff --git a/include/net/bluetooth/hci_mon.h b/include/net/bluetooth/hci_mo= n.h index 4b2a0af4ed58..7710688c0d30 100644 --- a/include/net/bluetooth/hci_mon.h +++ b/include/net/bluetooth/hci_mon.h @@ -50,6 +50,8 @@ struct hci_mon_hdr { #define HCI_MON_ISO_RX_PKT 19 #define HCI_MON_DRV_TX_PKT 20 #define HCI_MON_DRV_RX_PKT 21 +#define HCI_MON_VENDOR_TX_PKT 22 +#define HCI_MON_VENDOR_RX_PKT 23 =20 struct hci_mon_new_index { __u8 type; diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 1e324c05af24..90807562e8ed 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -2917,6 +2917,8 @@ int hci_recv_frame(struct hci_dev *hdev, struct sk_bu= ff *skb) break; case HCI_ISODATA_PKT: break; + case HCI_VENDOR_PKT: + break; case HCI_DRV_PKT: break; default: @@ -3053,6 +3055,33 @@ static int hci_send_conn_frame(struct hci_dev *hdev,= struct hci_conn *conn, return hci_send_frame(hdev, skb); } =20 +int hci_send_vendor_frame(struct hci_dev *hdev, struct iov_iter *iter) +{ + struct sk_buff *skb; + size_t len; + + if (WARN_ON(!iov_iter_is_kvec(iter))) + return -EINVAL; + + len =3D iov_iter_count(iter); + if (!len) + return -EINVAL; + + skb =3D bt_skb_alloc(len, GFP_KERNEL); + if (!skb) + return -ENOMEM; + + if (!copy_from_iter_full(skb_put(skb, len), len, iter)) { + kfree_skb(skb); + return -EFAULT; + } + + hci_skb_pkt_type(skb) =3D HCI_VENDOR_PKT; + + return hci_send_frame(hdev, skb); +} +EXPORT_SYMBOL(hci_send_vendor_frame); + /* Send HCI command */ int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, const void *param) @@ -4057,6 +4086,15 @@ static void hci_rx_work(struct work_struct *work) hci_isodata_packet(hdev, skb); break; =20 + case HCI_VENDOR_PKT: + BT_DBG("%s Vendor packet with type 0x%2.2x", + hdev->name, hci_skb_pkt_type(skb)); + if (hdev->recv_vendor_pkt) + hdev->recv_vendor_pkt(hdev, skb); + else + kfree_skb(skb); + break; + case HCI_DRV_PKT: kfree_skb(skb); break; diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 070ca388f9ac..060c265e2c53 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c @@ -229,12 +229,16 @@ void hci_send_to_sock(struct hci_dev *hdev, struct sk= _buff *skb) } else if (hci_pi(sk)->channel =3D=3D HCI_CHANNEL_USER) { if (!bt_cb(skb)->incoming) continue; - if (hci_skb_pkt_type(skb) !=3D HCI_EVENT_PKT && - hci_skb_pkt_type(skb) !=3D HCI_ACLDATA_PKT && - hci_skb_pkt_type(skb) !=3D HCI_SCODATA_PKT && - hci_skb_pkt_type(skb) !=3D HCI_ISODATA_PKT && - hci_skb_pkt_type(skb) !=3D HCI_DRV_PKT) + if (hci_skb_pkt_type(skb) =3D=3D HCI_VENDOR_PKT) { + if (!hci_sock_test_flag(sk, HCI_SOCK_RCV_VENDOR_PKT)) + continue; + } else if (hci_skb_pkt_type(skb) !=3D HCI_EVENT_PKT && + hci_skb_pkt_type(skb) !=3D HCI_ACLDATA_PKT && + hci_skb_pkt_type(skb) !=3D HCI_SCODATA_PKT && + hci_skb_pkt_type(skb) !=3D HCI_ISODATA_PKT && + hci_skb_pkt_type(skb) !=3D HCI_DRV_PKT) { continue; + } } else { /* Don't send frame to other channel types */ continue; @@ -390,6 +394,12 @@ void hci_send_to_monitor(struct hci_dev *hdev, struct = sk_buff *skb) else opcode =3D cpu_to_le16(HCI_MON_ISO_TX_PKT); break; + case HCI_VENDOR_PKT: + if (bt_cb(skb)->incoming) + opcode =3D cpu_to_le16(HCI_MON_VENDOR_RX_PKT); + else + opcode =3D cpu_to_le16(HCI_MON_VENDOR_TX_PKT); + break; case HCI_DRV_PKT: if (bt_cb(skb)->incoming) opcode =3D cpu_to_le16(HCI_MON_DRV_RX_PKT); @@ -1868,6 +1878,7 @@ static int hci_sock_sendmsg(struct socket *sock, stru= ct msghdr *msg, hci_skb_pkt_type(skb) !=3D HCI_ACLDATA_PKT && hci_skb_pkt_type(skb) !=3D HCI_SCODATA_PKT && hci_skb_pkt_type(skb) !=3D HCI_ISODATA_PKT && + hci_skb_pkt_type(skb) !=3D HCI_VENDOR_PKT && hci_skb_pkt_type(skb) !=3D HCI_DRV_PKT) { err =3D -EINVAL; goto drop; @@ -2017,6 +2028,7 @@ static int hci_sock_setsockopt(struct socket *sock, i= nt level, int optname, { struct sock *sk =3D sock->sk; int err =3D 0; + int opt_int; u16 opt; =20 BT_DBG("sk %p, opt %d", sk, optname); @@ -2050,6 +2062,23 @@ static int hci_sock_setsockopt(struct socket *sock, = int level, int optname, hci_pi(sk)->mtu =3D opt; break; =20 + case BT_RCV_VENDOR_PKT: + if (hci_pi(sk)->channel !=3D HCI_CHANNEL_USER) { + err =3D -ENOPROTOOPT; + break; + } + + err =3D copy_safe_from_sockptr(&opt_int, sizeof(opt_int), + optval, optlen); + if (err) + break; + + if (opt_int) + hci_sock_set_flag(sk, HCI_SOCK_RCV_VENDOR_PKT); + else + hci_sock_clear_flag(sk, HCI_SOCK_RCV_VENDOR_PKT); + break; + default: err =3D -ENOPROTOOPT; break; @@ -2132,6 +2161,7 @@ static int hci_sock_getsockopt(struct socket *sock, i= nt level, int optname, { struct sock *sk =3D sock->sk; int err =3D 0; + int opt_int; u16 mtu; =20 BT_DBG("sk %p, opt %d", sk, optname); @@ -2153,6 +2183,19 @@ static int hci_sock_getsockopt(struct socket *sock, = int level, int optname, err =3D -EFAULT; break; =20 + case BT_RCV_VENDOR_PKT: + if (hci_pi(sk)->channel !=3D HCI_CHANNEL_USER) { + err =3D -ENOPROTOOPT; + break; + } + + opt_int =3D hci_sock_test_flag(sk, HCI_SOCK_RCV_VENDOR_PKT) ? + 1 : 0; + if (copy_to_iter(&opt_int, sizeof(opt_int), + &sopt->iter_out) !=3D sizeof(opt_int)) + err =3D -EFAULT; + break; + default: err =3D -ENOPROTOOPT; break; --=20 2.34.1 From nobody Fri Jul 24 22:57:24 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 982EB439F6D for ; Wed, 22 Jul 2026 16:24:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784737479; cv=none; b=GmNumA9Z+Gewk9Ro6m1imMPBYpLPoaGbvd0A4X+uDUaTi/8dq2bpHHg4X7rsSbjrkGfIX7f63eqXJOggbQCHrrzDjKQ6+03eJuGi1Wx7Yj5yNV+6J1JNLWZeZU3M9wAg6CsYMLfMgJwio3UYj68Zs0hd+Vyg12tFn7SbMbo34GU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784737479; c=relaxed/simple; bh=jRpGREaM5NqJx3foXH/P4m0ScWZEgcGcIvLo39NcCrU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NFcPDSqo1cYlt7PA6aQ3GFNhEpb6GFObOoMXpL7zK8zqqrlGLe1KgWsEVIMbr/Tc8GfrcsEFlZL7AkStZ+gvX3sKrLkG37n2RrGRNLYzVHfRHvTJQW8/MVO431lMjkxxOQv1jXFwLQ6IRsgbwfwTzVTe2sFk4obWpsHfrJ4uf8I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=JVmCbbV+; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=gAtQMeLu; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="JVmCbbV+"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="gAtQMeLu" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66MFXqmH1304196 for ; Wed, 22 Jul 2026 16:24:37 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= T1RqKOzM4TNeWlVebimqOJ/wcJPg7VwTnUROemELgw0=; b=JVmCbbV+xLKipX9H KF/prHvauxQwoeZIf/ugbLeVo7tSIDzDf7g18JK/5ouAexvrixwd1fh1vLG1GtL9 G6I+1V8Q9sTa7S/jtNqVQy1rrncl3xwlR4Np/dtGkiIvd83gl34ITUc1KVA95MsY OzXdbNKVAz8ThvIEhglzEN6uKogcOlpkutjWaYT1uq9jH35iy6gOnxoNzHPX7nyV CC5MtdzknqsjjuX7XPtLIc8YcrQtsCk3pzOVQgLszqtnXoydoNMgH7CKPaokWhC0 Mlcnb/AC/k8pFGeZ7DD/bCv7Jgk1I1oRRiSNJWMAWgpduNy7wvrnGGNCREvcNvEM CU/RKw== Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fjs92acvb-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 16:24:36 +0000 (GMT) Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-384d033f7f5so1683893a91.1 for ; Wed, 22 Jul 2026 09:24:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784737476; x=1785342276; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=T1RqKOzM4TNeWlVebimqOJ/wcJPg7VwTnUROemELgw0=; b=gAtQMeLupvhpQavgzJsJZmj9ZBQZXRARTd/VXjHxQ99xseAmbY/1sHxFaWFh3ME02T 836AZN34UKF8yba5Uu0NXKCFJUoH/ii5tTk2lSH/sDMAp5UAKbvwtg9u2hlHmlZBgDG8 HpVMZGewINzvNu5ku+mFEbbeHmY72lX3HFjTnVWCByqxDDN7tJINBB3ELVfQnzxIO5WZ Adr0Etn9J7/lpGGQkGLl6s00bI0lMDL+BGIcyDZFPtgLErB5dsCHIhubuWSL0vWc63f1 bPRbxTaBmanbahlhe9/WrJ2TC+gTnZx1vAVUmbHG1FOo5qu9mDDAnxkVpq98uS39w3HS LBJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784737476; x=1785342276; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=T1RqKOzM4TNeWlVebimqOJ/wcJPg7VwTnUROemELgw0=; b=oViUt3crND/wwRzGatWh+adLRR46r0B7cydzoMeVToJEfYYnV/LmhX3uUKiq7Sw6yf eZ/vM2dY5VuPSgURk9Jx6kwEMd3x2iAy35hhS/7Qk4fGZlfflm3srVh/qwBwi54dqgSq 2u5A/X40eEcnctzWzlPbiVnLeo5GxuaZPcPXHllvu0Yb8zN/8YQRpQjCtCMbfy4OTRnR T4AI6GKKwOu5XiKD/yBoKsrKWax3ztoVPaWhpXXYUbjiUODwkt6/5E4lN8vfPsrFR1l+ cywBBjRGwufmnSqLROCDs1w5NV8l5P3e0Y4ga5HctPTac79F9sb/54Hln7kfNCQjHSZG IUYw== X-Forwarded-Encrypted: i=1; AHgh+RoqAXLKAx6yiR1Gz9Pyz4x9ps0Lmze9uzEyPTgmx4IaUEQji5Rf8UF3fGiDtWfexF3zzwutXrbrOhm+g9Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwfVSHthqMqEt+ACtQt09pNn2dNY/iSHB5HG1+ecGZVs0CGvjZg w6wL6a52GjIom1mYPcHKumoTlIX49otNHKOC8EGb9Hsbtk9zYkcov+exm2kFZ7dGPTBirXCMlO/ EN3TK0Wu4DmSd1aMGqFYdyM+9tJNN16seK4pAEYUbmkHxIytPgpTxHCpABYtS6OPoL4c= X-Gm-Gg: AR+sD12c5sq/0XcAg3CkazdNZZka10WWIUnP+YbR4k7g3Gj3l5wEOwMvfAtPAj4KhyI MEOWqqLvegr6+nee/l7TenNKr0xKFrgesHOBOLgzDmAxqu9suWkWU619ZlPerZNO+N1xw9d6xR0 ZiUOEhkIvlrr66D5DXAMmNX3FhNGypuSZO5xIH63pKddyt0DWu89D1NSRb5vzFGuvSulIW+N5ES LddCKVMgC5ZgH1r88yMYihMEvuZ2i1mtjKSCHP3eEeKMkQSngJ1N2/uoBdRXUH9b/ZAdSw/IJ/c C5WVl/HAd+ZkwQROjbCfdsyYgEpR3lWojxMEbwa71ej5U8tMddIaxUkYSl1a+/dptQLUrZbkQ/M E0H/KEQsk78YUktL/NvNkNRnhJ8cTokC9kcpJw8eF3Nwe2w0= X-Received: by 2002:a17:90b:3b42:b0:383:5a16:bd67 with SMTP id 98e67ed59e1d1-38ea4b4b6c5mr3439251a91.4.1784737476161; Wed, 22 Jul 2026 09:24:36 -0700 (PDT) X-Received: by 2002:a17:90b:3b42:b0:383:5a16:bd67 with SMTP id 98e67ed59e1d1-38ea4b4b6c5mr3439222a91.4.1784737475668; Wed, 22 Jul 2026 09:24:35 -0700 (PDT) Received: from hu-zijuhu-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3147dc9d932sm10569970eec.12.2026.07.22.09.24.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 09:24:34 -0700 (PDT) From: Zijun Hu Date: Wed, 22 Jul 2026 09:24:22 -0700 Subject: [PATCH RFC v2 3/3] Bluetooth: Add hdev->recv_bt_vendor() to handle BT vendor frames Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260722-support_vendor_hci-v2-3-132b506460a4@oss.qualcomm.com> References: <20260722-support_vendor_hci-v2-0-132b506460a4@oss.qualcomm.com> In-Reply-To: <20260722-support_vendor_hci-v2-0-132b506460a4@oss.qualcomm.com> To: Marcel Holtmann , Luiz Augusto von Dentz Cc: Zijun Hu , linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, Zijun Hu X-Mailer: b4 0.15.2 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDE2MSBTYWx0ZWRfX4LUJzxEOr42O iYnfIB5kxTuAo9oMiBxrPi1ivyYsB7P+htbKEf4FUva7gxX+6+u5yGuwqH9v9GogKBZhRkh6/0l 5/oYbxKKsVbTzEaNW0VPXFikUR7ks5g= X-Proofpoint-ORIG-GUID: Ydou-lSvcygJqjH-nlqqSTBs19flNzU5 X-Proofpoint-GUID: Ydou-lSvcygJqjH-nlqqSTBs19flNzU5 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDE2MSBTYWx0ZWRfX4wx4Hcenq3Fw nzTeg2bQnQBOCaur5lytxb1Y6DjxZsbvSA4cFYWMrHKU+YoHlNwjaZnwxZ5zMS26DnNnxEIb+kA QnXaqqA/OxfxrIZPkdMVIifqbRhyogUIdb9sFk948ijOYHkBF8EWLFJcwvmFo8WWOcfhDbMV3Za eMvrEq0+yqjQe4e0Lrmn0LOQtArg5JBRk9Q6mqT1BrCqNcGoVFqm84tUL8Ck0+Gk2AG3AhwbGTn wQZNax5Xy3Urqh3TrmqgljHvtWSNHkF5HGgEB2NcdVUwrqaQ7R7yogLmJ+O293aYyR758veghpl UoyPuJ8RzJ64i0EQEsFAhE3eQNCH31bqGYbw1SJh2FGyOjL4dz3ZmWto27lSKq9F5WAd32Q8csK vvu2IWjNoKCk5eZlY0q+T0aPKk9fK4oLzxzYCNCYZNI8TGMLaOkeLv6Vn1N6/z/zb0mjZNrECAC Mg7FBZl9cr/rsrm+clg== X-Authority-Analysis: v=2.4 cv=QahWeMbv c=1 sm=1 tr=0 ts=6a60eec4 cx=c_pps a=vVfyC5vLCtgYJKYeQD43oA==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=W2HtuRoJ5q-BxxgZR4MA:9 a=QEXdDO2ut3YA:10 a=rl5im9kqc5Lf4LNbBjHf:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_04,2026-07-22_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 priorityscore=1501 malwarescore=0 bulkscore=0 lowpriorityscore=0 phishscore=0 spamscore=0 clxscore=1015 adultscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220161 For unsolicited VSE and ACL frames with vendor reserved handles: Many transport drivers pre-process them in the RX-path because the BT core cannot recognize them, and cause: - Impact performance since skb_clone() in IRQ-disabled context - Difficult to debug as frames consumed without btmon logging Fix by adding the hook to process them within stack's process context, when they have been logged by btmon. Signed-off-by: Zijun Hu --- include/net/bluetooth/hci_core.h | 3 +++ net/bluetooth/hci_core.c | 33 +++++++++++++++++++++++++++++++++ net/bluetooth/hci_event.c | 5 +++++ 3 files changed, 41 insertions(+) diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_c= ore.h index 428261591288..12f3720f6cc8 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -646,6 +646,8 @@ struct hci_dev { int (*setup)(struct hci_dev *hdev); int (*shutdown)(struct hci_dev *hdev); int (*send)(struct hci_dev *hdev, struct sk_buff *skb); + /* Return true if @skb was consumed, false otherwise */ + bool (*recv_bt_vendor)(struct hci_dev *hdev, struct sk_buff *skb); void (*recv_vendor_pkt)(struct hci_dev *hdev, struct sk_buff *skb); void (*notify)(struct hci_dev *hdev, unsigned int evt); void (*hw_error)(struct hci_dev *hdev, u8 code); @@ -2329,6 +2331,7 @@ static inline int hci_check_conn_params(u16 min, u16 = max, u16 latency, int hci_register_cb(struct hci_cb *hcb); int hci_unregister_cb(struct hci_cb *hcb); =20 +bool hci_recv_bt_vendor(struct hci_dev *hdev, struct sk_buff *skb); int hci_send_vendor_frame(struct hci_dev *hdev, struct iov_iter *iter); =20 int __hci_cmd_send(struct hci_dev *hdev, u16 opcode, u32 plen, diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 90807562e8ed..21ef748e3528 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -3830,6 +3830,12 @@ static void hci_acldata_packet(struct hci_dev *hdev,= struct sk_buff *skb) __u16 handle, flags; int err; =20 + /* Header is valid when ACL frame arrives here */ + if (hci_recv_bt_vendor(hdev, skb)) { + hdev->stat.acl_rx++; + return; + } + hdr =3D skb_pull_data(skb, sizeof(*hdr)); if (!hdr) { bt_dev_err(hdev, "ACL packet too small"); @@ -3918,6 +3924,33 @@ static void hci_isodata_packet(struct hci_dev *hdev,= struct sk_buff *skb) handle, err); } =20 +bool hci_recv_bt_vendor(struct hci_dev *hdev, struct sk_buff *skb) +{ + struct hci_event_hdr *evt_hdr; + u8 evt, pkt_type; + + if (!hdev->recv_bt_vendor) + return false; + + pkt_type =3D hci_skb_pkt_type(skb); + + /* Save the event code before calling into the driver, since @skb + * may be freed once consumed. + */ + if (pkt_type =3D=3D HCI_EVENT_PKT) { + evt_hdr =3D hci_event_hdr(skb); + evt =3D evt_hdr->evt; + } + + if (!hdev->recv_bt_vendor(hdev, skb)) + return false; + + if (pkt_type =3D=3D HCI_EVENT_PKT && evt !=3D HCI_EV_VENDOR) + bt_dev_warn(hdev, "consumed unexpected BT event 0x%2.2x", evt); + + return true; +} + static bool hci_req_is_complete(struct hci_dev *hdev) { struct sk_buff *skb; diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index ea858391c789..94c02b66bdfa 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -7801,6 +7801,11 @@ void hci_event_packet(struct hci_dev *hdev, struct s= k_buff *skb) goto done; } =20 + if (hci_recv_bt_vendor(hdev, skb)) { + hdev->stat.evt_rx++; + return; + } + hci_dev_lock(hdev); kfree_skb(hdev->recv_event); hdev->recv_event =3D skb_clone(skb, GFP_KERNEL); --=20 2.34.1