From nobody Wed Dec 17 08:55:55 2025 Received: from mx0b-0024c301.pphosted.com (mx0b-0024c301.pphosted.com [148.163.153.153]) (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 5EFDC1E25F2; Mon, 12 May 2025 01:28:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.153.153 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013303; cv=fail; b=WUiDyiyXq28StzmrDb7Ab5Mv7rtaVPaHCN9Q8SQqW3ua/ZAbBzToEogqv5bJwGfRFouL/3o6NtPr25NRtuyaFjP1YF5O4EttoF4sOCrVWj7nUWRwHHUs/dEn1HvfIvXo6O3piWg3JSJySJMyJCvTiuVkTow3j4h+6Xtp2T0i3nU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013303; c=relaxed/simple; bh=eK/k7EIovkmSZVjKEIsFaBDoRXRMlAFp2GgYQCnyZ7c=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=U0K78WxVbftQEqDxytx9X2C6AaYhSPrRzyiOdiVZr9QZ/iinNyPrzcXo5IpSRvp7SIXQ47888qrMajfrJExcjql3pVZe4Up895WAwsOAWjueVCSVS9wAQ/OlRHiZL38MXV3iw2e9xJWXHwS2TNYvdwsfIej4Ah9ys2u7XO15sYo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=mnFpCRkH; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=WBTbl9ow; arc=fail smtp.client-ip=148.163.153.153 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="mnFpCRkH"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="WBTbl9ow" Received: from pps.filterd (m0101742.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54BNrm01027097; Sun, 11 May 2025 20:28:03 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=M/DQRublAT2MI+0O6RjdaAVpBmczJipl8PbsdN2HZEM=; b=mnFpCRkHLxs2 sHPsNCBJ90O8W/x3xQZE7y2gUlKX6uUW6pQX3dVHMCp46nmFCHR/nlMbJGk77/SD hw1mTy3TxnJ1RANZUsvI70u7k6Tdb54fJ7f3KFeOPZTUk23D8C6qBe9Www7hxmC/ gIGuBc0HqkSg1hEIcR4R27FipmuJqZWc3MHAzI0Aq0h5Wi0ekKmdfxuG9Zk5Gvq+ lFS6VRwTwJBd/VHFH5v34p+QFzHKeB+ImQmSSLVCb5gP27Yhzd7gT+7YvQ0Cic00 RZq34x0k5Fu5nf1GX0DmCHBdT6q350TPRSonDSZXg2BOaRo0fsyx8iasOurKWSGA 7cyUMeajpQ== Received: from nam11-dm6-obe.outbound.protection.outlook.com (mail-dm6nam11lp2171.outbound.protection.outlook.com [104.47.57.171]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j0aahxd2-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:02 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=jLHwkanHtXH7I+o/C4TtK7/y9UqoOLPO5yULjYwNSse8DeCQvDX9PBKah8JYSqfJ1P2Yso9uwCt78Wf5inwaiF5WhF4Zf2qO8dFK4/AGWhLY+qETvY1SIOqreCjSx7p4zUI0QgLawO8WPj1Y2qCWe9JRFJbnDSnX2RbPqYGxbM7P/FvX2I7A13WQLB213+JWQuANQP70qsdVnoqs7jKnWCAoIEMC9PD+NBdBrqL7eOnRiVfd/mH5apEmPc+ICKZPwLz9jZr/LfzBjaCJG0xz3hmsDg77pjOGfkNtEN3BE/qXPdx8KX8UA3ToCMnRlncMrN5F2oYMZBgO3c3H9J4Waw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=M/DQRublAT2MI+0O6RjdaAVpBmczJipl8PbsdN2HZEM=; b=KeuM7yv3ey87F+AxQLsqfYlMjlOqm2R6RD13LCF/lMu7oJDei4/LWHmJQeXF5s08DN7vn49LSwyIDRGjC31bjYm+qNWCjikX31QgYfzAopFkeGnAYmApNs8iQLlxyYrYZYkBXAvZI3R6YQ7nzAs1WL5N8EZymz/QEGYBrOZ6SjN3wJs0xOFJ9QY4Fcy5HYWW7a+cIQeeW1hsQmLOq5D/rooGVAS1Req2sxKSgIyraQZfNyI/TOLRVvdo6Vo90XG5R8arhkTNPxrju+JccoNxF39KvaBxOryhQFFASactVNnAV5JYKNMaBc7mbdViZiuhjfne/JnrK2brTZh3Nc0TrA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=M/DQRublAT2MI+0O6RjdaAVpBmczJipl8PbsdN2HZEM=; b=WBTbl9ow0gfJ4WyUV8r10HNYz/hQ8IUxfOeLNmTXZM4jeyFnJan84VSI3xcqeohxKbuaLDqrQ8I1WI7bEa7aT0cgVycGIoJi33lWYgHTaQaBk7+KFvhwbklNrbg6bTHfUnVn/P5s2spJNJOQI87HSsFR3fuXaTry+KvUXWo3MUM= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by IA0PR11MB7953.namprd11.prod.outlook.com (2603:10b6:208:40d::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.29; Mon, 12 May 2025 01:27:58 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:27:58 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 01/15] net: cpc: add base skeleton driver Date: Sun, 11 May 2025 21:27:34 -0400 Message-ID: <20250512012748.79749-2-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|IA0PR11MB7953:EE_ X-MS-Office365-Filtering-Correlation-Id: 1990e2da-79fd-48a5-55dd-08dd90f43a75 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|1800799024|366016|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?aXJ3RXJ6WDZHSU9wRHhoSm5XdmlPR2ovZGxvZy9QOG05YTh2WW1nWG5pa0pI?= =?utf-8?B?YmRBL1JqS0FjdEVTU2E3ZWhYWGxqU1cwWm1zWTh4UWM1N1R5S0w2OFNBYWJw?= =?utf-8?B?UWw4Wmt0SWNHS1A0di9UUWg1LzZCdHh1QlUxN2o0Nlc4bE5SRHVOcGJPaTcw?= =?utf-8?B?amVCQWZyOUlSN1JobitpdlBEblU1VEtUcVVsQ3d6MnJoMW1NKzFreU1xdzV5?= =?utf-8?B?TGpuNmVnTHdpT0VRZUZpMVdRbm80KzE4VlBUaVlFZmFCTUVycSsrSkxNdWFW?= =?utf-8?B?d3NQMGthUUI2TUtscTRtbDRaU1NjYkpuaXFHbExJSXgrazQ2bXRLMDJWL0gx?= =?utf-8?B?Nm45cmJqUG9kdHZsc1J4ZmxOMDNmdHhuendBV1hobkwyc1VXRGl6K0dQUzFz?= =?utf-8?B?YVc3TXZuczgwTEhTQ1kwc2EvWVJlNEZIbGNYSzFrVGh5RWhQRVdtc1ZlUzdj?= =?utf-8?B?YmdEU1dLaEpPcDR2TUJwaGRPdXJMem5sRnRyRTRpS2VXZ2RIU3ZTM1pOYStk?= =?utf-8?B?aXZsRTd3TUdFUEJ2RjlGb1N4RDFGQVh5d1BZT2xqTms4WVB6d1ZUMkh1eVlZ?= =?utf-8?B?NytvbXI3UlY1ZXlPK2ZMT3B1MGtYcCtrcXkreFhIMzVqNU9iR0FNTk1yaWsr?= =?utf-8?B?RjRsYmw2L01qZHRQdDB1YXBqUWlkK0U3TW9nRlI1STBqbGUyZjFwL2VpWDdF?= =?utf-8?B?cFR6K2drdHN5WWhtdElEbWkwZE9IZ1NLbng3RkxkaEJLRGpkelhJTkJlU2tx?= =?utf-8?B?MkVQMVVaWHYvOUdKSk1ZaGcwcHc3VHRiOTdKS0hlOENOazRhVUFDK1pnbHZy?= =?utf-8?B?RmZyNkpRQUgrVDhsME5UUVUxVHVmM3lDWVpReEcvZXFNZUZiMkFUdlFQYkxu?= =?utf-8?B?djg5amJjZWlzRUJIOUhZejJyOXFnSDh0dkd4bFNnY2dEbHhkTCtSamtsV0Zt?= =?utf-8?B?MU5GMjBhWHhGVWgrc3dYT0xldlZ4d1ErUmhqMWFWMnpQUjNOYm8xenpLN0N2?= =?utf-8?B?cGhaSTVncHFaSGtnVWlsZ2crV0l4c3QyQjZMcUZoZUIrUitjc2hUODk4VURr?= =?utf-8?B?Yy9UK1B6SmQ0Y3I1UmJoZVJieHFSTk9tYk1WYnJGZTRQSzFvSDkzdEF5ZGVu?= =?utf-8?B?ZTRic2czWERCcllxZ1JldHJiQmtVamJRRUI1MW5QWmswcFNkL1Q2dUxNS2h3?= =?utf-8?B?NjFyTEh0L3ltMTNCZC9SU2hxUFNXVHdSMFhjTmpORUtWdXJZNEIwR3RKSHVU?= =?utf-8?B?Q1dScFpVWWRMWmdKUS9HOEUvVk03YnFCYjA2Mlh2aktKK2RiWkExclBTcjQ4?= =?utf-8?B?bGl1ZlBseTR1ekdxaUVmM2kyZ3ZqWU5PY2VHSjh1QmlvRnBwTXlYYks5WjB1?= =?utf-8?B?djFTREtUYXBXWGNDUzVuYnF1QXM2MnpiNFJDRUR3a3VyYXd1NHNyb21nSml1?= =?utf-8?B?Z3Jrd2lySlZoZGE4OFVTaUdnVXB5REhIaHR1a0hTV2VTeUhUK2k1bWo1ZmdY?= =?utf-8?B?S0FuM3R6VWZTWDJaQWNaRStYZFdwN0U5UUxKZ1IrdCtIb0JNcWszRTMzVXFn?= =?utf-8?B?TE1uQmh2N01ibXN0MzF0YVNSU1l2WkxwMXJHRWVOSVQ5ZFFZNTE3TkdyaG1X?= =?utf-8?B?bDZKVEJvTERodmZ2TmJDNHhJNnV1a2RFY1RXNlVEUnRndG9RczBPbWRBVlpr?= =?utf-8?B?OC9GamZ4MFpZb3kwL1B2SlUxbXhYWHFIUDYzcm02UTNEeDZRU3ZNNDBFTlVl?= =?utf-8?B?OEUxaTBIK1k0S1FFcjNqcUM1ZkNRM0VxUXRzcCs2Wnd3cUpoN3pwbWRsZFE2?= =?utf-8?B?bXBLM3Z3bElqZ3Ezd0tWdzczdE96OVIwcEJESHRvRXJOclBFOGIwQXVoUklp?= =?utf-8?B?dlNWRnVwRlJESnlrMS9FMm4vdDl0RTAra3NuQksxQ3hwekRjaVRKZkxxbnhk?= =?utf-8?B?dXRqYlJOQjlpM0x3bmIzUy9LSkZqL2FqaWQyZmNMYmhDdUVyZ2FzQzNCMmY2?= =?utf-8?Q?B9wuQgOEs8nYJY5y836txS7tUcz9BE=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(1800799024)(366016)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TzNGd1NJV2J2d3U2SkdhUlNIVldSMHlnSU16b3FDUXNWWWVuTXl2UXVoVFZH?= =?utf-8?B?dW11a2VXZ3VYdjFxTUJoajE3d1BITSs1RUY1b1doWkNZeWNhbGhLMjZ5UzNY?= =?utf-8?B?elRZbTBBcEthUWE5dWRnMmtUa3A4NkgyYUhHZmJiZ2Y0TTdPNUdRK05tZGN0?= =?utf-8?B?cjFlYzdnQTFTVHNCRmV6N2h2ZTczRjFsaEgyYkkrMlVQZytnbHhYRXhMYWV0?= =?utf-8?B?aWFEK1ErQ0tUV2lYT1NCZWZSRndLbkVwQjlRRGNkdUhibldiY2h4WkJUM0h6?= =?utf-8?B?d3lTbDN4N3NiMk9XbFAyMXlaWHErSlJzQWNJbE85Q29NbEplazZqZTFCMTZ3?= =?utf-8?B?L0dkMEhrUlJqY0dKT21UQ0Jtdml4alhUVkZ5akpzaEdtSEM1aUF3Ri9oRFVS?= =?utf-8?B?SmtqOUxsT1RnQ1E0VE9zLzZvVmQ0V1ZYbzdIbytFWXFyRi9kZnQ2bXNLY1Fi?= =?utf-8?B?T1VmME1SRlV0K1MwR3IwQjFZcmh2dEJaMXEwa0N0d0FsRW1lQyt6K3ZTZGhV?= =?utf-8?B?MDFpczNsbFdpNEI0UUg2VVhjRTlDVmQ2YlB5MkwxYWRPUDVXck1OclpZcEpK?= =?utf-8?B?enpBNzVDZUJHY0F4d1o0a2E4SFpKeEs4S2JHMVhYdHNqVWkzOE9UK1lqM2Jv?= =?utf-8?B?bXBKZUVodkVQR1JuVXRNUTRJc3dFSlNMUmpiMVh4NkQwUWkveFRQVWpaSDdp?= =?utf-8?B?dSszR1h3WVlua3dyakh6VllBN2t4UzJhUFJIK2dtbEVmZDcwS09abmNUSlV1?= =?utf-8?B?dXJPYXllQXZtQ0JTQVZrYndySjhvc0NWb3hGQjVDaTAybXgxYXZkQllaRmha?= =?utf-8?B?N0ZsWFM0UnBzU0NtRVh3SkEvUEp0YmtvZzdpSmxIVlJNS045MHFhelRDTlVY?= =?utf-8?B?ZEFzeVpKS3hnY01FTG9XNlNDVk82TWxMOEZqTkxzcktReC9zelc4UzJxOVpu?= =?utf-8?B?S3QxdlJuOWhqdUJtYUlRQnp4N2hFenhQV2tGallQaUt3WUJlR0Z5bk5pSTZY?= =?utf-8?B?SGVxVUVmQm93T3JlWmZaZDZQQTB0N0E2WnIrOEg0V0RLVmtzRTJDVWtPcWJN?= =?utf-8?B?K2VTY2V5enNCWFdsOXFmcjRKYzBUMHQzVEhrdjBXRXFUc3UrZENWcHFiVE1y?= =?utf-8?B?akNNYVJwZUlrREFhSHNvR0ZQejl2K0daZWh4Qmp1cGE1NzEyVjFMY1R0ZUI5?= =?utf-8?B?MXdMVVM2NXd1cE5SR01CS0tQMFZHR3JkVnFSdEdmRC9hY1pSUSs1Q2RKMFp3?= =?utf-8?B?cUxnRmUvNGdvbEpzaU11M2paK08wRzRkRllCVkgxM1kxa2NCaWUreHJYcDhr?= =?utf-8?B?bWs1VEd4UCt0bDEyaHcxendMNzdadCtkdHZTVVB0SDRxdEx0cENrWi84WnBv?= =?utf-8?B?UlBJSDdXbWhqWi9ncEFTWHFDaUE2N1pKeEp5bTRRQXIvMWVOTDdSSVNZSDZK?= =?utf-8?B?R3VTVXNiOUZyNkhLV0pyTDhhZWhGUmlsNHgzbWhWR1RnSXZrOWx6SlRpREpm?= =?utf-8?B?ODl4RitwZDlOcDFHeXNiSzNNYlZ4SUdoRHE1eFR1by9JNDdYQWVCRnRVYVA0?= =?utf-8?B?TzlwNURGeGlTeFBMcWtqajUwMEN0MURKS1VvdmF2ZUNCU0JyVkdTcDhwRzNy?= =?utf-8?B?M3VJdFlKOTUrZGdXNWIxL1U5VkJ6ZUgrdUN2WEJ6SjJLOG0rQVdEaHZKL3lT?= =?utf-8?B?QThJVEowYit5RGM2SkduZGZpQ1RaUFBlaWZKcUFZekhEVkduQ2thT1hab3Nw?= =?utf-8?B?WDdDTTNLTFBaaVZnSm0wWmRkdENzVGVjbktKUlMrUmgzWU5SL1cxM2o1djBK?= =?utf-8?B?QWM1TFd4WEM0MFF0VEhEK2FKVUZWMDkxRzlic0Q5Nkg0ejVOMlFua0ErYStr?= =?utf-8?B?d0NHaVRYb3J0anZnd3lBL2ZnUUtINUtXeUpDWmFYbmpYejBjUFZKcjkyM0Zn?= =?utf-8?B?L0JmZndLOHo1U0podWFyWFVtMDJJYlNDTm1zVGNYenlUUElidWtwanV3Z1dK?= =?utf-8?B?R3A2a1hMdXI5Q2JvMHlQSUZoenZEK3RlQW1qeVJOQU8vU2FRNHJpUFR3U3JM?= =?utf-8?B?cUM1WkRteDlGQnFBaHNIaTNlUlFGNFRXWWJiNkthQnYvTHU0WVFLcE9nTldF?= =?utf-8?Q?TWSZ4J0DjLAmu8X/xUFGSfvn2?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1990e2da-79fd-48a5-55dd-08dd90f43a75 X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:27:58.4845 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ov1QQEtAB5OpM5UVyX474qRjkNo/dxdU60QID3tzuBDH5lPzAAwO/kty36a1ChmoHASVQ2JtlzbYIQp8MsjgzQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR11MB7953 X-Proofpoint-GUID: 4y9mDwosoPb03cOtU86rCcxVcf-p3tNI X-Authority-Analysis: v=2.4 cv=TMNFS0la c=1 sm=1 tr=0 ts=68214ea2 cx=c_pps a=gIIqiywzzXYl0XjYY6oQCA==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=amLC3slWZ4KB8aZvhWUA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: 4y9mDwosoPb03cOtU86rCcxVcf-p3tNI X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX49B7FK/slHNO v+NX+sJE28SKuqwTD9mV0HtV5WB1tERCDqpUaW2goGudfiF58Z7qgCdwrfFTNWIYErBf2A1TBcz jMOLFRRxef7Z9cVDg7chKxZtHIch+EGxRusS4mLsapGKj+QobXOER/wftZ1HY4iube8vB8LIiwn v9WalYBksouOsL1aSBYtItl7w3TVR945cwQtwym3SWHK4COqdHzNP7ZuIdymj886zMpJvNGukbm aDlM3ORcOdpjFOKlQh3/NsO4wNdx7Pj2GOCDxKLWs6UiPdpHfDdVi22qkSzHIuTBSlfc9XwBow3 Aw9BbqzxruiuB1qtEd5l6uhzBy5LND42R54koOyNVAROEns7FtCQPxHFVKZ7BfAnD9xtSABSaop eQPLjH0lz7u01NxtNsWays4iucF0jWFDgyCRRpKNDDmw9aw1ikaNBgzBIFvgAtiT9LNFRsSb X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 priorityscore=1501 mlxlogscore=999 phishscore=0 mlxscore=0 bulkscore=0 spamscore=0 clxscore=1011 impostorscore=0 adultscore=0 malwarescore=0 suspectscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 This commit prepares the addition of a CPC driver. CPC, standing for Co-Processor Communication, enables users to have multiple stack protocols over a shared physical link using multiple endpoints. This patch adds the basic infrastructure for the new module, and introduces a new structure `cpc_interface`. The goal of this structure is to abstract a physical link like an SPI device, a SDIO function, or a UART for instance. Signed-off-by: Damien Ri=C3=A9gel --- MAINTAINERS | 6 +++ drivers/net/Kconfig | 2 + drivers/net/Makefile | 1 + drivers/net/cpc/Kconfig | 15 ++++++ drivers/net/cpc/Makefile | 5 ++ drivers/net/cpc/interface.c | 98 +++++++++++++++++++++++++++++++++++++ drivers/net/cpc/interface.h | 88 +++++++++++++++++++++++++++++++++ drivers/net/cpc/main.c | 21 ++++++++ 8 files changed, 236 insertions(+) create mode 100644 drivers/net/cpc/Kconfig create mode 100644 drivers/net/cpc/Makefile create mode 100644 drivers/net/cpc/interface.c create mode 100644 drivers/net/cpc/interface.h create mode 100644 drivers/net/cpc/main.c diff --git a/MAINTAINERS b/MAINTAINERS index 00e94bec401..8256ec0ff8a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -21731,6 +21731,12 @@ S: Maintained F: drivers/input/touchscreen/silead.c F: drivers/platform/x86/touchscreen_dmi.c =20 +SILICON LABS CPC DRIVERS +M: Damien Ri=C3=A9gel +R: Silicon Labs Kernel Team +S: Supported +F: drivers/net/cpc/* + SILICON LABS WIRELESS DRIVERS (for WFxxx series) M: J=C3=A9r=C3=B4me Pouiller S: Supported diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 1fd5acdc73c..d78ca2f4de5 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -508,6 +508,8 @@ source "drivers/atm/Kconfig" =20 source "drivers/net/caif/Kconfig" =20 +source "drivers/net/cpc/Kconfig" + source "drivers/net/dsa/Kconfig" =20 source "drivers/net/ethernet/Kconfig" diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 13743d0e83b..19878d11c62 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -49,6 +49,7 @@ obj-$(CONFIG_MHI_NET) +=3D mhi_net.o obj-$(CONFIG_ARCNET) +=3D arcnet/ obj-$(CONFIG_CAIF) +=3D caif/ obj-$(CONFIG_CAN) +=3D can/ +obj-$(CONFIG_CPC) +=3D cpc/ ifdef CONFIG_NET_DSA obj-y +=3D dsa/ endif diff --git a/drivers/net/cpc/Kconfig b/drivers/net/cpc/Kconfig new file mode 100644 index 00000000000..f31b6837b49 --- /dev/null +++ b/drivers/net/cpc/Kconfig @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: GPL-2.0 + +menuconfig CPC + tristate "Silicon Labs Co-Processor Communication (CPC) Protocol" + depends on NET + help + Provide support for the CPC protocol to Silicon Labs EFR32 devices. + + CPC provides a way to multiplex data channels over a shared physical + link. These data channels can carry Bluetooth, Wi-Fi, or any arbitrary + data. Depending on the part and the firmware, the set of available + channels may differ. + + Say Y here to compile support for CPC into the kernel or say M to + compile as a module. diff --git a/drivers/net/cpc/Makefile b/drivers/net/cpc/Makefile new file mode 100644 index 00000000000..1ce7415f305 --- /dev/null +++ b/drivers/net/cpc/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 + +cpc-y :=3D interface.o main.o + +obj-$(CONFIG_CPC) +=3D cpc.o diff --git a/drivers/net/cpc/interface.c b/drivers/net/cpc/interface.c new file mode 100644 index 00000000000..4fdc78a0868 --- /dev/null +++ b/drivers/net/cpc/interface.c @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#include + +#include "interface.h" + +#define to_cpc_interface(d) container_of(d, struct cpc_interface, dev) + +static DEFINE_IDA(cpc_ida); + +/** + * cpc_intf_release() - Actual release of interface. + * @dev: Device embedded in struct cpc_interface + * + * This function should not be called directly, users are expected to use = cpc_interface_put() + * instead. This function will be called when the last reference to the CP= C device is released. + */ +static void cpc_intf_release(struct device *dev) +{ + struct cpc_interface *intf =3D to_cpc_interface(dev); + + ida_free(&cpc_ida, intf->index); + kfree(intf); +} + +/** + * cpc_interface_alloc() - Allocate memory for new CPC interface. + * + * @parent: Parent device. + * @ops: Callbacks for this device. + * @priv: Pointer to private structure associated with this device. + * + * Context: Process context as allocations are done with @GFP_KERNEL flag + * + * Return: allocated CPC interface or %NULL. + */ +struct cpc_interface *cpc_interface_alloc(struct device *parent, + const struct cpc_interface_ops *ops, + void *priv) +{ + struct cpc_interface *intf; + + intf =3D kzalloc(sizeof(*intf), GFP_KERNEL); + if (!intf) + return NULL; + + intf->index =3D ida_alloc(&cpc_ida, GFP_KERNEL); + if (intf->index < 0) { + kfree(intf); + return NULL; + } + + intf->ops =3D ops; + + intf->dev.parent =3D parent; + intf->dev.release =3D cpc_intf_release; + + device_initialize(&intf->dev); + + dev_set_name(&intf->dev, "cpc%d", intf->index); + dev_set_drvdata(&intf->dev, priv); + + return intf; +} + +/** + * cpc_interface_register() - Register CPC interface. + * @intf: CPC device to register. + * + * Context: Process context. + * + * Return: 0 if successful, otherwise a negative error code. + */ +int cpc_interface_register(struct cpc_interface *intf) +{ + int err; + + err =3D device_add(&intf->dev); + if (err) + return err; + + return 0; +} + +/** + * cpc_interface_unregister() - Unregister a CPC interface. + * @intf: CPC device to unregister. + * + * Context: Process context. + */ +void cpc_interface_unregister(struct cpc_interface *intf) +{ + device_del(&intf->dev); + cpc_interface_put(intf); +} diff --git a/drivers/net/cpc/interface.h b/drivers/net/cpc/interface.h new file mode 100644 index 00000000000..797f70119a8 --- /dev/null +++ b/drivers/net/cpc/interface.h @@ -0,0 +1,88 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#ifndef __CPC_INTERFACE_H +#define __CPC_INTERFACE_H + +#include +#include +#include +#include + +struct cpc_interface; +struct cpc_interface_ops; + +/** + * struct cpc_interface - Representation of a CPC interface. + * @dev: Device structure for bookkeeping.. + * @ops: Callbacks for this device. + * @index: Device index. + */ +struct cpc_interface { + struct device dev; + + const struct cpc_interface_ops *ops; + + int index; +}; + +/** + * struct cpc_interface_ops - Callbacks from CPC core to physical bus driv= er. + * @wake_tx: Called by CPC core to wake up the transmit task of that inter= face. + * @csum: Callback to calculate checksum over the payload. + * + * This structure contains various callbacks that the bus (SDIO, SPI) driv= er must implement. + */ +struct cpc_interface_ops { + int (*wake_tx)(struct cpc_interface *intf); + void (*csum)(struct sk_buff *skb); +}; + +struct cpc_interface *cpc_interface_alloc(struct device *parent, + const struct cpc_interface_ops *ops, + void *priv); + +int cpc_interface_register(struct cpc_interface *intf); +void cpc_interface_unregister(struct cpc_interface *intf); + +/** + * cpc_interface_get() - Get a reference to interface and return its point= er. + * @intf: Interface to get. + * + * Return: Interface pointer with its reference counter incremented, or %N= ULL. + */ +static inline struct cpc_interface *cpc_interface_get(struct cpc_interface= *intf) +{ + if (!intf || !get_device(&intf->dev)) + return NULL; + return intf; +} + +/** + * cpc_interface_put() - Release reference to an interface. + * @intf: CPC interface + * + * Context: Process context. + */ +static inline void cpc_interface_put(struct cpc_interface *intf) +{ + if (intf) + put_device(&intf->dev); +} + +/** + * cpc_interface_get_priv() - Get driver data associated with this interfa= ce. + * @intf: Interface pointer. + * + * Return: Driver data, set at allocation via cpc_interface_alloc(). + */ +static inline void *cpc_interface_get_priv(struct cpc_interface *intf) +{ + if (!intf) + return NULL; + return dev_get_drvdata(&intf->dev); +} + +#endif diff --git a/drivers/net/cpc/main.c b/drivers/net/cpc/main.c new file mode 100644 index 00000000000..ba9ab1ccf63 --- /dev/null +++ b/drivers/net/cpc/main.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#include + +static int __init cpc_init(void) +{ + return 0; +} +module_init(cpc_init); + +static void __exit cpc_exit(void) +{ +} +module_exit(cpc_exit); + +MODULE_DESCRIPTION("Silicon Labs CPC Protocol"); +MODULE_AUTHOR("Damien Ri=C3=A9gel "); +MODULE_LICENSE("GPL"); --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0b-0024c301.pphosted.com (mx0b-0024c301.pphosted.com [148.163.153.153]) (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 2989920CCD9; Mon, 12 May 2025 01:28:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.153.153 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013305; cv=fail; b=l71+8f7Rp1sjAYDMjTfn0TpR0moY0XmRHIIEQYpPaYvsJo2bjJvU0Og1909GxizMd+YtBxr7rhgeAUVpuVUpiPsXWBKyrpM1eX7eiRE0g2O5phUtYU4iFYIjs4ncfJ1ncE+Wm0bImeRwg5sgTHLmgdl6y5q8xB3DD072Wda9enU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013305; c=relaxed/simple; bh=aMS60t9zTRBt0XOMx8oIpVYR9NRurNUNAmPRcoNlJHo=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=SJXaHq8EHy0Yl4DYpZzHOCFAtvgN/yVswg9SXMr7Dlq43u5ar1s822LTtF/psf2TBUDDSnHQsjzeAMe1ZDH7JAR6K8eCcrpmTdgb9K6VGOpooOFbXdN2gaIdaqJypAK6yK1fER6kOOSOysR54rcFtbIQwFO3OtK1HDm4JR+k58s= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=zSaJc6I3; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=WDaq3mKi; arc=fail smtp.client-ip=148.163.153.153 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="zSaJc6I3"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="WDaq3mKi" Received: from pps.filterd (m0101742.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54BNrmxx027097; Sun, 11 May 2025 20:28:01 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=jXjqROARcWrGFd7jep7SkaphFr1yP5nAdM7FauGXBl4=; b=zSaJc6I3/a0m mHy+yt44E8SnOFCtJK0kQSFFrOoLWT/gj/a9Gu2pHEuXKl+v/YZnk81y+70DlRbB hExSi0DMBXmXvXNCe8DD7hEOJceBZAkTi12ty5beecTH+OY+kgBcMMEzIZ4to+py 1TqMpnL3Zw1BNOD4HujYQDvUzoFlyzsfySYFlTPn2J1WbrebmGGznTzpjjr7uvh0 RoxOsH0gKIer21OLLfGGZ3XpXMuUABxAnmoPoLvrYcwPNBvUtK6biRSM1YmtqOM5 iUcJ8NeOySzdwGGH405KDTFJeEXBs234Qk6CVVsBGc9cEbelpzNVjbyzlXwk3Sit +qchezFrDA== Received: from nam11-dm6-obe.outbound.protection.outlook.com (mail-dm6nam11lp2171.outbound.protection.outlook.com [104.47.57.171]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j0aahxd2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:01 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=b3Smu8XjhuvGc0aWuZaDfZkdzYWFFCFHDrxogh9QdDrl5q3vgdSd98RB28NNr5YYG4w598EeNz53YRMpJwGojGfDAbigW4QzMkBfHHt4YuwzQmQmicSQRR2Hgfx5orGsefyiZXJ7uq/wj5jaKJqlLrjGDCVsbP1Xz8QJsFz7bWHsR4pzDzDITaBk5933KSCsb1wjQPAhE3hg0uN7ivmgJMLbmu+w4c0hKPZFJxenEH+7fGIlmLnIzBkByKSI0khVvozqv3G/tjYzCGEMeVTpYetX8farESxXlbNvzxTtmBOMv8RQi/pk5qTxvKm04WZm6vvFnG2hrAz6Nk2inVXGsg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=jXjqROARcWrGFd7jep7SkaphFr1yP5nAdM7FauGXBl4=; b=Jgw/IBBNC37UnkFLbw91sil3xHfSacV68aODJk+ByzdaLAj4vHvS7j3OmnGhWD61zeglkzsQuRYD4zcME6CWbZRAyREbzEXkaZJRvdMukXPGvdUEWGV6QmwTfQIPxwATD4FGe8CgmEnEgubveBuG/EdJPiXRAv8dQi2o/z/sogJsDMR3V3LoICOFVa+K8QNuxb0SjCBVP1aaI/lsuYrLauGwA51fhpMDandLTQGenHDrJSGTLHM55sCgQd6h+K1z1+mmphuF/xSjWmhNAhAW2mLdBpPibN+nIM5izgINdVkuJRF8Dq1QvHN8gNwEy3dk2VAnOJGYjA/uiqCTZNjrPg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jXjqROARcWrGFd7jep7SkaphFr1yP5nAdM7FauGXBl4=; b=WDaq3mKi2+5i8C1hgFmugjyr/AGocfw0/bcH3iwAN4vb9kEJwVtV54Tz+x4qABJioIyBhjwgLyDGdPx56dFOpqh1nfisbkzz9LYo9k5UZxO0Xk9IP1ybXrH4yq6+zqHrQdxgIockhOR+wjKOCNCHQghPbwYNcTuvf21V1yLHbMk= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by IA0PR11MB7953.namprd11.prod.outlook.com (2603:10b6:208:40d::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.29; Mon, 12 May 2025 01:27:59 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:27:59 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 02/15] net: cpc: add endpoint infrastructure Date: Sun, 11 May 2025 21:27:35 -0400 Message-ID: <20250512012748.79749-3-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|IA0PR11MB7953:EE_ X-MS-Office365-Filtering-Correlation-Id: fedb03cc-9b2b-4b89-535f-08dd90f43adf X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|1800799024|366016|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?TUtMTlFiRHl0TUh4bnpFdjVkblV5M3dsNU5qUXNBaUczNFJ1RHpWNWwveG9S?= =?utf-8?B?RnJNZHFYK1p3bjJ6QWNTWjdWYjRwUTIvRGg4SmRkRWxTc0t6RGpsZm1za1dr?= =?utf-8?B?bVU1VlZWcjRwcmRHd1BEcjFXbnI1Z25nUWNSK3FtVy9qSE5XSVM4eWNsN2Y0?= =?utf-8?B?aHVoWmlYQ295RkYvQXRjUitrd0FxZkVFMFkxVEdFWFZzS0h4azNJbWQxWkNY?= =?utf-8?B?bGVsWkZLa2dRaEJzZU5UNnIrZVZDK2E0a084c0NXckZZMGxNNU9NRklWTWhD?= =?utf-8?B?eGhySVo1YnVqWWd0UEF0cDc5MFZ3cnNETTZaMDBmWm5vRjMvRHBaUXZ0MGtT?= =?utf-8?B?NVF5ck5iWHdaOTlGUzhSK0NUUzM0MWFMcHBCTTk2cFdvYmVwL01EdGFKQ3ln?= =?utf-8?B?WjJhMThScG5UMHNPYlJlUGtqRFB2ekFydlZKQzYyZnFJMFY2NG5WK0RwVEJ0?= =?utf-8?B?RnEzSVRwdmpvZFNYR3NETXI0T1ZHQ3c1QzhUNnV6WGFDVG1HUVBXRjhHMmJr?= =?utf-8?B?d25FMWc1c2RwZThONzkyWlM2V1NCZU5uL1RTbzBVdFhxa1VxRjVsb1ZkZWpI?= =?utf-8?B?Y1JTYjFOWU1RamRnbnNrWjFWNG5NZDdrelhGcjNib292SkNCenBsLzZTVnNO?= =?utf-8?B?dHV1cURVV2dGRUhzS0JnbFNLeDRRZ0p6SDUzNXJubnZacllVeDhiWWQ0bGhk?= =?utf-8?B?Ni8reTJncjF4VHBuT3QwZDVuZGxwVXJ3WlhXNmtLekJNNFFRd0VKdzV1NERU?= =?utf-8?B?UnBrdFZDS1d5STV4Rkt1R1dMNEVlSlNmVHdEM3pVYkFuWk5wTEJtWE9GUEZa?= =?utf-8?B?U0dUUTdEVlNNSUEvdG5Lb0NaNThNY2gwc1g5QS9DQmYyN2l2Uk4wRERDcHFp?= =?utf-8?B?ak5QZ0cyNzE2U1pCNWpJNnJxSWtMUEJsWk5lSkUrQW5Bd3VFWXVhby9NV1Ja?= =?utf-8?B?RmI1MDlxWElJSDBLVGFxeUFIQzZ6OXVvcndYS0xkcVVXd0N6d0VXMmxzUDlk?= =?utf-8?B?MUhFZ1gzVTdkWlE5c1NKYnROMmYvckJoS1ZSenNRUnNpVExFTy9JNytCaWtr?= =?utf-8?B?czNJN3pMZkNDL0wrRmtyVDl4WTZsY29aN0RPOWpmaWw2M0o0cEpaajk5bEoz?= =?utf-8?B?djBYU1d3aDcrN0xPYXd4MEVtL1o4bUJJRmk4a3FjUHNsOHNVWXBzVld1M3R5?= =?utf-8?B?RTlwOGZHaDBUQXVDdW1FajBiaW1Vdko2eGREMCtNb2lFUlJTaXE0OWNuaStX?= =?utf-8?B?YnVCVlhRRmUyc0krT1pKRHNKbUgyZXpxRTFMVGdkYUYrcUduYnhQd2FyRkdV?= =?utf-8?B?eWpUMGJ2cEJSRWIvVGw2dUE1UXBVL3dScDlWeCt5Y0M5Ym5GeXI0YlpCeTla?= =?utf-8?B?dm8yRERsR1lFa2xXOTl0QTJ2enV2OXpUUnBSUURFcHJ6KzN2QkJaTG1xTWhV?= =?utf-8?B?Yno1SCtRTXM0Yk9pcy9hdHMyMzRHcHNzUzljS1VKcVl2ZTFYanU1cEFkWFFT?= =?utf-8?B?cVBXYVNyYjVFM1pvQTdET3dkYk41WDVuUnhtSTJVMHFhYjJQUmZvRmMwVkt2?= =?utf-8?B?NDRlQVZKaHRlSWQ4MUpZZXE0dm5COUhzSFoxdTRaUGdkejZRa2F4d0dBMnBq?= =?utf-8?B?MVZYRW1zTXJjZStLR3dVWlJQVFJYV21zWlR0azFPNUh6NkVrbUVUYXYrSnZS?= =?utf-8?B?VmdMY20rSXRuaEd0RWNEMFBnMlRNbHpVNjkvczdiL0x4YlBveWdNUzFTK0xB?= =?utf-8?B?d2tXK1I5U1VrOUpkQVczLy9lR0pRcVhtV2JwZXg3T3dqcTFuRHRLdWJmT1Fu?= =?utf-8?B?ZlpTWWdzcm8rQ0Z2anJicXdlZTFFVk1KMmtjWm8xZkVPOW1xUzk3YUJaTVlL?= =?utf-8?B?WlRmQzk4V0NRR1FMUXB2NkFtSFVkOXNxRzlLVlpXa2MvUFpOSmxJZEQxV0k1?= =?utf-8?B?YjYrUWdwU3g4QXJtbGNjZGMvWitRTm9WaUFXZjd0L3l2dWM4TytUeU5Ld21Q?= =?utf-8?Q?wKDqBcs/7l1/37nGwd8yrQ72dWEyVg=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(1800799024)(366016)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?SXdhd2t6V2pwUXlIRlZzTnlxQmxNQVZ2V0sxYjgxcGhCdHhXMU5BRmdIN0lo?= =?utf-8?B?VmdoakVZQUdWQTZTY1pnWFd1ZHRPSTV5ZnBxd0xxSExoaitsb2JjRWsvUHlU?= =?utf-8?B?ZVlubDg5ZzY3dzdLcGorNklDRVQyT3VZcWtmbW1SRmNCSklhN1NTZHZKcFJm?= =?utf-8?B?MldIbGpnUStWb0E4NTkrVFJwbjBFaGRxVEtCMVFiS25uYVZIcUw3dXZ3SUlv?= =?utf-8?B?WDkvbktxNWZyRjBhaEtUQllKaE82Y3hpaEswQ2pGZ2hZV0ZRQ20vRVcrZWFN?= =?utf-8?B?WE80S01uRGMrM0NRVWVFWU9talB4ajVIWndaaHhjdmNmME1FUEVZL0RYWEUz?= =?utf-8?B?TWpvb1FTaW5DY3JGWmlvbjZPekpOdFNpb0FLcnZGYVNZRkpOSTA5TkV3S3dT?= =?utf-8?B?OTNhdDVxT2VHeDNnUkJaazM4eEtKZklyWHlTOXFPVlVmbC9WdW44L28vcVIv?= =?utf-8?B?TmNzMEpjVGFOSm03dzgrVEVwL0NOOHBvUVhtMzZIcnRlU1hnREpaR0RCaGtM?= =?utf-8?B?VVg5WlFOeHFIN1JyVlBkb3dUaGQ5MVE2UGNnWGMvT3ZSblQzKzVHYms4WTR6?= =?utf-8?B?VjNrNGFjcjZRUndkamNWL0pIdFFJYnRjRlkyeDIxd096SDR0bTMyQWxNL1I2?= =?utf-8?B?WU15OTFmSWtDL29ESXc3QTJJTHJ4aWtmWTQyaldESTF5bkFIK0VsQU1kbVEw?= =?utf-8?B?ZnExMjlhb3dTRktCd2UrR0lzaGtjQm96TXdvTVZmNm4vN3p2bjdENjZxMWNr?= =?utf-8?B?R2o2RDZxbWZjRE9wZnFMRi9PcjF4TlNWYS95cDRhT3FqUE8wL21Iam5IeHJz?= =?utf-8?B?OWpDU0pocHZFRXQzc0ZldlpHQXN4dEpsdmpXYkM1akJDSGNaQ1UwNmdPZEw5?= =?utf-8?B?ZWdxTjhDa3Arb2hlSFdrZ2EzQkJPUXZoaGdEcFIwVnBUdm9XR1BHdng1Nmk5?= =?utf-8?B?cWRMc1VXaFcvZTBXOUtQaEhqWUl4R0VTdklTZVo4dzltYXJJd2g5Q2QyRkNr?= =?utf-8?B?a3ZNMkZSb3ZGTnBxa2NReTNRSEhMUjIzbHorV0dXMWVCOXREWG9pRDhNZnpu?= =?utf-8?B?RllGYWxKbDhzR1daRjE0RDQ5UkpRV00yTlJwZ1hsRGlvQVRjVFNkM01QeldH?= =?utf-8?B?NUVKK0NUWmJMNTBZSy9la2FEdVQ4aUdQd0hTcmdPem45ZWhqMFU5dHRqOTY2?= =?utf-8?B?Z3ljb2RucFBBOXVkTVM3cSt5NzExOWhNSFJCL25GRlFRamJNRUJmNzlaemlY?= =?utf-8?B?R0plb3ViZnV5bWZkSzRnZStqS0t6SGs5QzRqdXVwTy9lZDdVeFY5M0dlSHVs?= =?utf-8?B?NzFxbzBwejZBOHdqUlNYa3lqd1FLTDg5MlR0SWR2WEowcEJGekZveUdCd0Iw?= =?utf-8?B?eWJaMFloNXRJc2RodTA4Tm5FeDVBNW4wSWVMU3RwYmhLQWxEcVlETHFweU5s?= =?utf-8?B?SnNjb0pFZWVXNndJQ201bkE2eTdsZGNlN0JESnBwbzNOdmpuay9aSUdYYjVH?= =?utf-8?B?SExDR2JtK2lDZ0hzZ0JKL1pOTE1jdmFlRVdQeWx2dHcxSUpRZnpSWFZURTJa?= =?utf-8?B?dFV5NWNWNjF3N1JzNTNSVHgrSnczWWJrb2FnMHI0aTNEejQwb0p0WUt4QjRt?= =?utf-8?B?alRQWEMrYVdPMGVyMVZlK3kzMDI1bDJIaXptNy9icWt0eENTZFQyZ2QwK24r?= =?utf-8?B?MGxXQ2QxdUFpNFR4QkZtZWdpaEZZdG1DeDlIUVF1YVl6Ynh4aXQ3L0htZWxz?= =?utf-8?B?WWhaTEpvbnV6NUt4Nk5Oak1nQ0JDWDFUd0lWSTkza21kUTFGVWdLWGM0MGR6?= =?utf-8?B?RXFWcUpxbUozOThiaVFzOXFoS2NHYzNiSkVrMzhrSUpXbERYVG1LQ2M3cGlq?= =?utf-8?B?YzBSaGFBZkYwUjBKY1JtNzJ5M3lYcCtHTUU5Y01jV1F5NHJYUXpLbC9yczdQ?= =?utf-8?B?bTlPN1R1dmkvUGpjSHZ2SkpnN3F2L0RXTkxWeitpOUdKaURtWVFoV3BEaG5D?= =?utf-8?B?dXJRbVczc0NXWWZXNFZvZUoxM1p0RUpoUVJwY1BuNzFuVklGQTgvSXcyekdD?= =?utf-8?B?UlFXRldTTExJSDN3SXBVWXlUS0FtRkk1dWxXc1NuR2N4RFVIOFd4WUJPK3Bz?= =?utf-8?Q?8AqVYqfual7ljtxDJUr/idz68?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: fedb03cc-9b2b-4b89-535f-08dd90f43adf X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:27:59.2099 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 0WZ07FSyiQaDIiEsfiMI23lgQFhAQ5mBT81merZfZXSKQWuvtq6c+DemtkdmxP0aN/Dt+3vxYCel9WvqyyIINw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR11MB7953 X-Proofpoint-GUID: m7GQ6_qB8944kknOFpxMyXoeLT7gISB5 X-Authority-Analysis: v=2.4 cv=TMNFS0la c=1 sm=1 tr=0 ts=68214ea1 cx=c_pps a=gIIqiywzzXYl0XjYY6oQCA==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=FtdxCg7vcX7QgciArP4A:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: m7GQ6_qB8944kknOFpxMyXoeLT7gISB5 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX8WG97dKaJNwL iyOI0bq76fN/OHkwV5cMlpboddvq7KJtdtpYaY5muewS1kU+we9H6+AA73xdY23g7JO24Zd4Jwz 6K8J1gMTsa2DALRVcJwCEctHiQy82ggh//bLjNiZlVt9PzvS8mXvjY0MwGdlejvxkub8B8TyZcG feIkj83dX0SXpOeNQRB7fBggI0F5o4zj4YY7SkXA+yYo6UaFVgaSvrcg/PEavNPLRXJCK9PieRZ 18O7ZDJQlVmUiyzo/hyINx0Pou/0M40V0uTGym81S1q3JC0iVcNJaDZvOR3GBSvh36oj6yoZZN3 ZFNgh09t/swEZHzcAa79ZjwHlEPBsZDUlGEBlawgMmvrYV8htG5Kd9sknp06v9PG32yqm418QKh 8oE/4nC0pJP3q4wLNDowmZLey1qEPVLwfAobKKLc+L0FTJuotr0r6zBRzNddqDZ9OZJySXA8 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 priorityscore=1501 mlxlogscore=999 phishscore=0 mlxscore=0 bulkscore=0 spamscore=0 clxscore=1011 impostorscore=0 adultscore=0 malwarescore=0 suspectscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 Network stacks using CPC are isolated from each other and their communication channels are called endpoints. Within a CPC interface, endpoints must have a unique Endpoint ID, which will be used to address messages to that specific endpoint in a latter changeset. Endpoints are part of an interface, this is represented in the device model by endpoints being children of interface, and the interface ensuring uniqueness of the endpoint ID when a new one is added. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/Makefile | 2 +- drivers/net/cpc/cpc.h | 101 ++++++++++++++++++++++ drivers/net/cpc/endpoint.c | 166 ++++++++++++++++++++++++++++++++++++ drivers/net/cpc/interface.c | 58 +++++++++++++ drivers/net/cpc/interface.h | 11 +++ 5 files changed, 337 insertions(+), 1 deletion(-) create mode 100644 drivers/net/cpc/cpc.h create mode 100644 drivers/net/cpc/endpoint.c diff --git a/drivers/net/cpc/Makefile b/drivers/net/cpc/Makefile index 1ce7415f305..673a40db424 100644 --- a/drivers/net/cpc/Makefile +++ b/drivers/net/cpc/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 =20 -cpc-y :=3D interface.o main.o +cpc-y :=3D endpoint.o interface.o main.o =20 obj-$(CONFIG_CPC) +=3D cpc.o diff --git a/drivers/net/cpc/cpc.h b/drivers/net/cpc/cpc.h new file mode 100644 index 00000000000..529319f4339 --- /dev/null +++ b/drivers/net/cpc/cpc.h @@ -0,0 +1,101 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#ifndef __CPC_H +#define __CPC_H + +#include +#include + +#define CPC_ENDPOINT_NAME_MAX_LEN 128 + +struct cpc_driver; +struct cpc_interface; +struct cpc_endpoint; + +/** + * struct cpc_endpoint - Representation of CPC endpointl + * @dev: Driver model representation of the device. + * @name: Endpoint name, used for matching with corresponding driver. + * @id: Endpoint id, uniquely identifies an endpoint within a CPC device. + * @intf: Pointer to CPC device this endpoint belongs to. + * @list_node: list_head member for linking in a CPC device. + * + * Each endpoint can send and receive data without consideration of the ot= her endpoints sharing the + * same physical link. + */ +struct cpc_endpoint { + struct device dev; + + char name[CPC_ENDPOINT_NAME_MAX_LEN]; + u8 id; + + struct cpc_interface *intf; + struct list_head list_node; +}; + +struct cpc_endpoint *cpc_endpoint_alloc(struct cpc_interface *intf, u8 id); +int cpc_endpoint_register(struct cpc_endpoint *ep); +struct cpc_endpoint *cpc_endpoint_new(struct cpc_interface *intf, u8 id, c= onst char *ep_name); + +void cpc_endpoint_unregister(struct cpc_endpoint *ep); + +/** + * cpc_endpoint_from_dev() - Upcast from a device pointer. + * @dev: Reference to a device. + * + * Return: Reference to the cpc endpoint. + */ +static inline struct cpc_endpoint *cpc_endpoint_from_dev(const struct devi= ce *dev) +{ + return container_of(dev, struct cpc_endpoint, dev); +} + +/** + * cpc_endpoint_get() - Get a reference to endpoint and return its pointer. + * @ep: Endpoint to get. + * + * Return: Endpoint pointer with its reference counter incremented, or %NU= LL. + */ +static inline struct cpc_endpoint *cpc_endpoint_get(struct cpc_endpoint *e= p) +{ + if (!ep || !get_device(&ep->dev)) + return NULL; + return ep; +} + +/** + * cpc_endpoint_put() - Release reference to an endpoint. + * @ep: CPC endpoint, allocated by cpc_endpoint_alloc(). + * + * Context: Process context. + */ +static inline void cpc_endpoint_put(struct cpc_endpoint *ep) +{ + if (ep) + put_device(&ep->dev); +} + +/** + * cpc_endpoint_get_drvdata() - Get driver data associated with this endpo= int. + * @ep: Endpoint. + * + * Return: Driver data, set by cpc_endpoint_set_drvdata(). + */ +static inline void *cpc_endpoint_get_drvdata(struct cpc_endpoint *ep) +{ + return dev_get_drvdata(&ep->dev); +} + +/** + * cpc_endpoint_set_drvdata() - Set driver data for this endpoint. + * @ep: Endpoint. + */ +static inline void cpc_endpoint_set_drvdata(struct cpc_endpoint *ep, void = *data) +{ + dev_set_drvdata(&ep->dev, data); +} + +#endif diff --git a/drivers/net/cpc/endpoint.c b/drivers/net/cpc/endpoint.c new file mode 100644 index 00000000000..5aef8d7e43c --- /dev/null +++ b/drivers/net/cpc/endpoint.c @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#include + +#include "cpc.h" +#include "interface.h" + +/** + * cpc_ep_release() - Actual release of the CPC endpoint. + * @dev: Device embedded in struct cpc_endpoint. + * + * This function should not be called directly, users are expected to use = cpc_endpoint_put(). + */ +static void cpc_ep_release(struct device *dev) +{ + struct cpc_endpoint *ep =3D cpc_endpoint_from_dev(dev); + + cpc_interface_put(ep->intf); + kfree(ep); +} + +/** + * cpc_endpoint_alloc() - Allocate memory for new CPC endpoint. + * @intf: CPC interface owning this endpoint. + * @id: Endpoint ID. + * + * Context: Process context as allocations are done with @GFP_KERNEL flag + * + * Return: allocated CPC endpoint or %NULL. + */ +struct cpc_endpoint *cpc_endpoint_alloc(struct cpc_interface *intf, u8 id) +{ + struct cpc_endpoint *ep; + + if (!cpc_interface_get(intf)) + return NULL; + + ep =3D kzalloc(sizeof(*ep), GFP_KERNEL); + if (!ep) { + cpc_interface_put(intf); + return NULL; + } + + ep->intf =3D intf; + ep->id =3D id; + + ep->dev.parent =3D &intf->dev; + ep->dev.release =3D cpc_ep_release; + + device_initialize(&ep->dev); + + return ep; +} + +static int cpc_ep_check_unique_id(struct device *dev, void *data) +{ + struct cpc_endpoint *ep =3D cpc_endpoint_from_dev(dev); + struct cpc_endpoint *new_ep =3D data; + + if (ep->id =3D=3D new_ep->id) + return -EBUSY; + + return 0; +} + +static int __cpc_endpoint_register(struct cpc_endpoint *ep) +{ + size_t name_len; + int err; + + name_len =3D strnlen(ep->name, sizeof(ep->name)); + if (name_len =3D=3D 0 || name_len =3D=3D sizeof(ep->name)) + return -EINVAL; + + err =3D dev_set_name(&ep->dev, "%s.%d", dev_name(&ep->intf->dev), ep->id); + if (err) { + dev_err(&ep->dev, "failed to dev_set_name (%d)\n", err); + return err; + } + + err =3D device_for_each_child(&ep->intf->dev, ep, cpc_ep_check_unique_id); + if (err) + return err; + + err =3D device_add(&ep->dev); + if (err) + return err; + + return 0; +} + +/** + * cpc_endpoint_register() - Register an endpoint. + * @ep: Endpoint to register. + * + * Companion function of cpc_endpoint_alloc(). This function adds the endp= oint, making it usable by + * CPC drivers. As this ensures that endpoint ID is unique within a CPC in= terface and then adds the + * endpoint, the lock interface is held to prevent concurrent additions. + * + * Context: Lock "add_lock" of endpoint's interface. + * + * Return: 0 on success, negative errno otherwise. + */ +int cpc_endpoint_register(struct cpc_endpoint *ep) +{ + int err; + + if (!ep || !ep->intf) + return -EINVAL; + + mutex_lock(&ep->intf->add_lock); + err =3D __cpc_endpoint_register(ep); + mutex_unlock(&ep->intf->add_lock); + + return err; +} + +/** + * cpc_endpoint_new() - Convenience wrapper to allocate and register an en= dpoint. + * @intf: The interface the endpoint will be attached to. + * @id: ID of the endpoint to add. + * @ep_name: Name of the endpoint to add. + * + * Context: Process context, as allocation are done with GFP_KERNEL and in= terface's lock is + * acquired. + * + * Return: Newly added endpoint, or %NULL in case of error. + */ +struct cpc_endpoint *cpc_endpoint_new(struct cpc_interface *intf, u8 id, c= onst char *ep_name) +{ + struct cpc_endpoint *ep; + int err; + + ep =3D cpc_endpoint_alloc(intf, id); + if (!ep) + return NULL; + + if (ep_name) + strscpy(ep->name, ep_name); + + err =3D cpc_endpoint_register(ep); + if (err) + goto put_ep; + + return ep; + +put_ep: + cpc_endpoint_put(ep); + + return NULL; +} + +/** cpc_endpoint_unregister() - Unregister an endpoint. + * @ep: Endpoint registered with cpc_endpoint_new() or cpc_endpoint_regist= er(). + * + * Unregister an endpoint, its resource will be freed when the last refere= nce to this + * endpoint is dropped. + */ +void cpc_endpoint_unregister(struct cpc_endpoint *ep) +{ + device_del(&ep->dev); + put_device(&ep->dev); +} diff --git a/drivers/net/cpc/interface.c b/drivers/net/cpc/interface.c index 4fdc78a0868..6b3fc16f212 100644 --- a/drivers/net/cpc/interface.c +++ b/drivers/net/cpc/interface.c @@ -5,6 +5,7 @@ =20 #include =20 +#include "cpc.h" #include "interface.h" =20 #define to_cpc_interface(d) container_of(d, struct cpc_interface, dev) @@ -53,6 +54,10 @@ struct cpc_interface *cpc_interface_alloc(struct device = *parent, return NULL; } =20 + mutex_init(&intf->add_lock); + mutex_init(&intf->lock); + INIT_LIST_HEAD(&intf->eps); + intf->ops =3D ops; =20 intf->dev.parent =3D parent; @@ -85,6 +90,12 @@ int cpc_interface_register(struct cpc_interface *intf) return 0; } =20 +static int cpc_intf_unregister_ep(struct device *dev, void *null) +{ + cpc_endpoint_unregister(cpc_endpoint_from_dev(dev)); + return 0; +} + /** * cpc_interface_unregister() - Unregister a CPC interface. * @intf: CPC device to unregister. @@ -93,6 +104,53 @@ int cpc_interface_register(struct cpc_interface *intf) */ void cpc_interface_unregister(struct cpc_interface *intf) { + /* Iterate in reverse order so that system endpoint is removed last. */ + device_for_each_child_reverse(&intf->dev, NULL, cpc_intf_unregister_ep); + device_del(&intf->dev); cpc_interface_put(intf); } + +/** + * __cpc_interface_get_endpoint() - get endpoint registered in CPC device = with this id without lock + * @intf: CPC device to probe + * @ep_id: endpoint ID that's being looked for + * + * Get an endpoint by its ID if present in a CPC device. Endpoint's ref co= unt is incremented and + * should be decremented with cpc_endpoint_put() when done. + * + * Context: This function doesn't lock device's endpoint list, caller is r= esponsible for that. + * + * Return: a struct cpc_endpoint pointer or NULL if not found. + */ +static struct cpc_endpoint *__cpc_interface_get_endpoint(struct cpc_interf= ace *intf, u8 ep_id) +{ + struct cpc_endpoint *ep_it; + + list_for_each_entry(ep_it, &intf->eps, list_node) { + if (ep_it->id =3D=3D ep_id) + return cpc_endpoint_get(ep_it); + } + + return NULL; +} + +/** + * cpc_interface_get_endpoint() - get endpoint registered in CPC device wi= th this id + * @intf: CPC device to probe + * @ep_id: endpoint ID that's being looked for + * + * Context: This function locks device's endpoint list. + * + * Return: a struct cpc_endpoint pointer or NULL if not found. + */ +struct cpc_endpoint *cpc_interface_get_endpoint(struct cpc_interface *intf= , u8 ep_id) +{ + struct cpc_endpoint *ep; + + mutex_lock(&intf->lock); + ep =3D __cpc_interface_get_endpoint(intf, ep_id); + mutex_unlock(&intf->lock); + + return ep; +} diff --git a/drivers/net/cpc/interface.h b/drivers/net/cpc/interface.h index 797f70119a8..d6b6d9ce5de 100644 --- a/drivers/net/cpc/interface.h +++ b/drivers/net/cpc/interface.h @@ -17,15 +17,24 @@ struct cpc_interface_ops; /** * struct cpc_interface - Representation of a CPC interface. * @dev: Device structure for bookkeeping.. + * @add_lock: Lock to serialize addition of new endpoints. * @ops: Callbacks for this device. * @index: Device index. + * @lock: Protect access to endpoint list. + * @eps: List of endpoints managed by this device. */ struct cpc_interface { struct device dev; =20 + /* Prevent concurrent addition of new devices */ + struct mutex add_lock; + const struct cpc_interface_ops *ops; =20 int index; + + struct mutex lock; /* Protect eps from concurrent access. */ + struct list_head eps; }; =20 /** @@ -47,6 +56,8 @@ struct cpc_interface *cpc_interface_alloc(struct device *= parent, int cpc_interface_register(struct cpc_interface *intf); void cpc_interface_unregister(struct cpc_interface *intf); =20 +struct cpc_endpoint *cpc_interface_get_endpoint(struct cpc_interface *intf= , u8 ep_id); + /** * cpc_interface_get() - Get a reference to interface and return its point= er. * @intf: Interface to get. --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0b-0024c301.pphosted.com (mx0b-0024c301.pphosted.com [148.163.153.153]) (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 1DC4620C472; Mon, 12 May 2025 01:28:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.153.153 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013302; cv=fail; b=cvro2ZJNiW2oMdk+ILSbMxhJtMCDTSQgRd5rTvdd1rtyqjvYOF8fA9e2ra0ZiuFa84JeH0JYWjTBQH2jLyBlxhgAgFGmSIbwtaYQLvxNR30fXE7yIoMyAHy8/fEXntWKN87t4v7+03vb51Qe3Q/Ozk8ZFMsGd0wllrfwxka7+HE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013302; c=relaxed/simple; bh=b8CqXrs6aJVEOej0AuRdPTxYayQQhb2unx9+3Sc1UHo=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=WtSRRxJXxJsGW6dK5/Xmrg5n4tT01Yje2V+Crt9LpfEom71ffNNRjKkDueVu9j5OCfzektNWkEUCliB/GsAih+KDZtMctFzbmUPizZ0IxY3nxD79VbM4QQjVNtaBB/2bm0pDUi9qs12E0rVC/QFGdZoUAnKuT2D5IzUUyGCbA80= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=OShb8UVE; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=VUNnfbyl; arc=fail smtp.client-ip=148.163.153.153 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="OShb8UVE"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="VUNnfbyl" Received: from pps.filterd (m0101742.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54BNrm02027097; Sun, 11 May 2025 20:28:03 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=iUmW6Z9NJh7Framw2XmyIpfMBUt+ypWSE2hLnuZfHWI=; b=OShb8UVEDAct gmJJau718dHhdseZhRG13DstktdWcF/sasOB9buun7oTQHYO8lyyRFrVd+VFLoIR baXjQd7LKbzf8u9ZZej2vYi598+Kaf0Tf5qr8ytcKR211fJGuUf4VvKcWT+ozGdV jz3BsX/aNeUojQGKvE1ntOcUeMA0D29/qfVdbCDCmFEHG8mk8qYY05eRzjoKsNwn E3jZHxf7zouiqCd8tiKW+u7yiaaDughZgArdNIe+oiJoTvxk5etcDbnPeFpeqSd2 ap0Dqwv2sQsKCiJlM6CBe4cqkc35krm5ua3diEYpv3cAl5FBXtGrPdsacS2gea0N d2sHA3+XBw== Received: from nam11-dm6-obe.outbound.protection.outlook.com (mail-dm6nam11lp2171.outbound.protection.outlook.com [104.47.57.171]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j0aahxd2-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:03 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JuLIZTdxo7pT7/msFyDj7mG0ARKLkIKW3RkMlodrSw2qFa6NbnmsuOwedl1lapNjHnDld2k5ZB6XfOX/SjVS0knrTAwFHmJcX12GWJU7yMFl6zSJCVzdpDB6mshAqR4vrbjZ+/4i4Rp2NsziFlVwgR5pQaQUzGbQByKkzs1Kvf9nN9zPFfUZvefVvrFfN76kgh/QXtcRBxYBMulMFfNXXmETijy2TvNo/FGDzJHYszezgGGpxqUHQkIoBpTcBGrGmiafB2D4z3I2i69sHGwaLPnsEubo3nNl9ILThLEwMNSwgTnjSMH8DLxb03Uw/zAqBLWnrSy0raN80ezdBUUadA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=iUmW6Z9NJh7Framw2XmyIpfMBUt+ypWSE2hLnuZfHWI=; b=s3hP8LpK9xlrNZVhOjuffKLtEOp9olTXb4WJ7Z4fuI7OcHJtF+X9wmh4lbEgZWu2i91MUBtzt46WXqynVeJHdQofSklo/euRSZnHjlTvka2FxPOghfQq0acaqaWq6QfF/CHPEUDeFDcJAWbUpnqWPq5/OVVxrbBO+JwLfXEQVkOa9wlQiBzcfFQxt8fRvCCZ/7xtO4ujarUawlbK1+eBdX0uxSCT0C8rUiiVDURtpicc3fUUXMyim7y1zbR3MGa5ggbOTTbmLfY7uIoEfw1DwjttauoeCbAEUgt73FYiQ3jRoaXZ3Oq4eIV2kNRS3sSxhO0FLSyrTttoU4PIGIRlfQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=iUmW6Z9NJh7Framw2XmyIpfMBUt+ypWSE2hLnuZfHWI=; b=VUNnfbylhGnlM4yDREfc3LG1sHM8pRek/zsVEKju0jkCdb3oECHDXS7MR4RCAPHm7K3ajU54StVFoU1Cm7gx6Yy2ol/s9jztnngcziUYo+DT5nNkrhWcAdRvfRJNDBkyDaF9Ltgysb8C2bVbOgFLAfYETuueYtUDG45/fr0Lzbw= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by IA0PR11MB7953.namprd11.prod.outlook.com (2603:10b6:208:40d::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.29; Mon, 12 May 2025 01:28:00 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:27:59 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 03/15] net: cpc: introduce CPC driver and bus Date: Sun, 11 May 2025 21:27:36 -0400 Message-ID: <20250512012748.79749-4-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|IA0PR11MB7953:EE_ X-MS-Office365-Filtering-Correlation-Id: 6601b3e7-2ca7-4cd6-385b-08dd90f43b4c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|1800799024|366016|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?cjcyY0dNWUg3Q3M5eW5KYjVKZVpLRW1mMElkOGM5MjNPOFc2UWxkVGY5WWVY?= =?utf-8?B?SzhJSlN2MEc3U1BTNXhiblpLRHFCNTcrZjJOOEhXa0thODgvQit4UnJhRnlG?= =?utf-8?B?ek5EQnA0Z0ZTUkxkcUo5a3oyUDZOajNGSXRRVS9sU09aMC8vMnMzYVU3ZFVs?= =?utf-8?B?c2N6QzVjcW9sWmR2RVlmQjJlMURmNnZRTVZGRDRTenJJK3VXcGxRMVJEUTB3?= =?utf-8?B?bXU5dzdFMEJVOS8zaFh2SE5nNkdjZzNlcDk2bkZBRDNwaWFNVnhtR285bHBY?= =?utf-8?B?bm1QRVRBS1lBTWRPbFFpSmdiM0M4S1hLcXVhTTVqMkxNeWlnN0VaRCttMXd1?= =?utf-8?B?UzhpMHpNekloTjVZckpVd0RDVjc3M25lNHVZQnp2ZzNzN2xWR0NnRkcwc1lk?= =?utf-8?B?OWtDcDVNR2hXUXRZeitlVUhCOTRYdzc5V0V2dHF3NFBPa2JGdlRBb0J6QlJX?= =?utf-8?B?YzJZOUlBTmRIV015VXduc2RHRitwYlNvTDdmRWFLMFhtOHRyZUY1a2FLUzVD?= =?utf-8?B?dFozVkU2dGU4Q3NacXNtbnpUNkdodXpHWW9KZ2dUbVNjWVVOeHh0TGRtcDNX?= =?utf-8?B?RlVZV2c0cmpxbm9kTjV4UUdTTW9iVEZPRS9tbGxtZ2JCN0RrcWFEZ3duNEVY?= =?utf-8?B?VGZVZXJaZWJYTHJtcFN0MHd0NW1tRUt3MFZFaGdDQWUrQlBsVU9YOEZCUHJW?= =?utf-8?B?MXB4SStaUkpoVHFzVjNFOFVqdHp0NXNyTXlnWHRRM21zZGowUmsvR3JPTzRE?= =?utf-8?B?ZnAyd2dXNENUcHZISEQrcjVyYnRlSlBjci9mRjZIUFhWeWRoamhobGQxMUMr?= =?utf-8?B?SHQ1UEwyR0laY0d3cVUyMWRLSmhNRFdTM3hwWk5XbHNrc3pwRC9XTW9Cdlls?= =?utf-8?B?MTFzOG84blJDbklHNTE4UmFNaGdaWXlTY0pFMU9lYmNXbWQyV1JjUm1hWGRv?= =?utf-8?B?bkNpU2RGb3ZRSEFGZmhMNUphSVNnektqdWk3SVZwS3FNY2JXSWliV1dFZ2NU?= =?utf-8?B?aS8vbnA2RkxxMjhXK1cwNnE4cWtHenRKWW9NTmxUaEREbGcvd0RYV01MUko3?= =?utf-8?B?bk9vNFBPTk5EcFJyRnByUXdRMW5acS9nVkFreS96OTVnUE9pM1ZSVGFnMlFz?= =?utf-8?B?WnZpNEhTUFcxSVk2REdBUlpkc2o3UmZzVUhZRHp4WXlGQ2RkSWVaOXprSjVY?= =?utf-8?B?TURqVUVrUHI5MnRPeTA4T25MWHU5UFhJMCswUHNURDdMNTcyYVNBUmViODRk?= =?utf-8?B?aGdRYkxyQTM1bzhXaG1ON29WYU15NFA4VmltbjAvOG41QUFnbUhUNEJqbFVK?= =?utf-8?B?QzhXZ1M2RC9hQTgrQVlxekxKQ2Ftc1RBMjNGTFM5R3d0NVQwWWwxUDNyd1A3?= =?utf-8?B?dXN5c3c1a1hZVUQyZWIrR1dzK0duSDYydTRkZ2NERGlMQ05LMEFzQk5aUkJP?= =?utf-8?B?QStHWHlpNWpTUjdIVTVKSy9JM0pxUUcwMDJvbU10MjZ3dFAzOFlsUS9lS3BM?= =?utf-8?B?SWRmblhYRXVUZzJzRmR2MjF5d2t6NHJsV0xDNXNuVzkxZ0Q2bjk0cjREdVFv?= =?utf-8?B?S0p4alJvYTRqQlMwcmRPWURBQSt3Ymt0ZmRtby9mNVpBU1ZFZzNja0FiL043?= =?utf-8?B?Y2gxTDg0TWVJQUhsMGMwZys4VDh4NG95WkNXUm1vODB2RjlZUUllNjhhUFkx?= =?utf-8?B?bmNSOStaVWJkNkwxc1RtY055OFV3UitxSTlEbDZaUnBQc09hdTl2aysxeno3?= =?utf-8?B?bWVhUFpjbkRpbWFxN3VObzA3NmdHZ3NwSzRDd0ttbnRVUEN2T2drbk5hRytt?= =?utf-8?B?YXdUUTRhVmtBSEtnNDhaOFlIdUMzK3BzUHlBNmpOMktwOE9zRFFBU2tNMTFz?= =?utf-8?B?bVF6bjF6dnNRTFVPVHVCLzNYaE1rWG9oUC92WWUwL3I2cVk3TERyYlg4L1ho?= =?utf-8?B?cHdnSm5MdjVqeTB5ZGtnckk1alZ3UzdZR1BHZ2xsME5QeHJ3MEdhR2JSQjZY?= =?utf-8?Q?eEkQNVEOJZXCFHg4mhuUVBYTz06tJU=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(1800799024)(366016)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?OW1QWVk3Vy82Z1JtQXVpL2JBZTBTUm44c0N4d3BYVzlJSGtFNXZEa1RUTFZt?= =?utf-8?B?K3JxQlFQbUFVRG1LWDNoMWV1aDJwZG5qSUpLOU9BK0dSd2tMUEllczBFQUJ1?= =?utf-8?B?UnNDczlSWGFIRFo4dS9ud0ZlcXVsZGRIbW5NQlQxRXhaMWxvSW9EZVVwcHh5?= =?utf-8?B?d2xFSDUrWVgwQmlKSWsrbFE4eXFsNU1IZkJCd1pvWktEUXVjTmNROU1sRUpE?= =?utf-8?B?VHFKNXJvRkxIR2lUdzFINklDUkszcmlFbjcyUEtvbEtIT2tiNEFVTlBaSHdO?= =?utf-8?B?L1JtWWhDYlZVT2Rla2VicUFlblJQVlZLUmhhSkVtR3g5NVZRMG14QUN3bUpK?= =?utf-8?B?dUI1S21vb1RuRWgrUG5XV0FrWjFVUFlDMkYwU3F3ZmFuVVZnVkhjeE8rQlFZ?= =?utf-8?B?eHk3dUdGMjA3VXNYSnprS0VYMDVIRW5pYTZZSjNwTlVoVlA3Q3NrckVETEpQ?= =?utf-8?B?bExScWxxaVIrRHE5c1poemc1NkNTZ1hHOCtpdG1SdEhTY01HVm8rdm12R251?= =?utf-8?B?a1FEbHYzVG9RK2RpUVp0cHZGc1ByZG9vbmFiYnZFaWtqL1RMSXMvNEdmanhV?= =?utf-8?B?ZEZ2eDVHbS9OWFpFTEhraW1OSS9xeGJ4YW9KeVFseTRRWDhkZWZ0cEs1UTNU?= =?utf-8?B?TEtFTHdEQTlTa056ZU9KajR4NTVOR2hDVEY1VHI0QmxWTzlBYUtGYWZ0OCtV?= =?utf-8?B?YnY5SmhkYkpUNXZ6VlhHcy9RcXMyQm9LQlBvUkh0ZWk0MnJJaW9TNU93cDRL?= =?utf-8?B?YW9sS2h1QlpVaWFoVW5vdTQ1OW04TDhNVEhYUWpUTUZwSjRPdG9vYjFBQy9P?= =?utf-8?B?L3R4TWJFS0Q0bm9UTmZnSDMvMU5Fc3VxdkRaK0NpYkp1OUZGMStYcFZRUDdG?= =?utf-8?B?MDdDQ1p5ZlFTTFVER0JNOFBGcDZxOGw1aGN3anVPTzZ0UWNvZ3lvWmRrdXg1?= =?utf-8?B?V1d0Yzk3ZU45TGxDR3F0cnNpOGR6SC9ZQkQwV2dQc1BTdUZ5WFJaUHErRE9B?= =?utf-8?B?KytoTHlGUktoT2xXbGZrY3g0TytiNTFwN2JEM2k5WUpNUTVIWEtYMFJvck9M?= =?utf-8?B?OUViYzUzSlplYjh4L1JFTmlpQW9MSnpuTC9qV3pIRFBQSFU3YW1LUDZCQW1q?= =?utf-8?B?TW1qZ0xCUHQzZGVEWVpWbG14N0tIeisxY0l1c0F6ZXNtQU82UmZoRXgwSFRK?= =?utf-8?B?b1R1YUYzeXg0RkY4VHoyams1ZmJseHJoTDIzdnR4MEpFUGthNWs0cmlZRnpH?= =?utf-8?B?dlArR01NdXFYalcwMnhPRm0yWUgrRGE1UnQxTUNQaWtEbzd2aXgyem1uOE45?= =?utf-8?B?OU5RZ2k3NGJ5TkNwWVBaVWppTm16M09HSWNCR2tqZElEQTcvR25xdFFlQzBE?= =?utf-8?B?c0pMd0hWdjRpdC9DdnVLQ2RCL1hQZmRuNHZZVE1iSHpzZGdCcDBzeXhWQmRX?= =?utf-8?B?UFFLeTVIRUhaZzNnNExCSnI2RW5EQ3FaOXBVSjF1VnpLMklpSnUyeWZPN0xE?= =?utf-8?B?SWZ6eWxhV0VzWEY2dUVoZm1saXpMcTdBUnE1bkhOeTJYZXlVV2lmNXk2MXYz?= =?utf-8?B?MTBTc1pTYU5Zc01FQ3lGOUlmaGlRMFVNeDlCbzZJQW9Wb2I1UEhTcDlQVG1z?= =?utf-8?B?TFJGQ3dTUGdjRmtwUTluKzR2MVhYSmNGY1MvZUo1UkhnenduY3lxdExOQS9E?= =?utf-8?B?bWc3M2IyN0NoRXZ6aytXQ29nR1BZMGhCUEZXanJsSmdXeHFZSjQxOThiREM3?= =?utf-8?B?Tk9SV1NEcktka0FSZXlWQndJVno2a05qNGcrcmNXS3NLNUU0dENrQmdia0U2?= =?utf-8?B?am1WK2R6QUkzZFA1a0puQzlJTHVTeHlSQmxiMUF4VndiTUtHcFYxOEFGNzRv?= =?utf-8?B?U1ZjbFBGWUVxbEJJWW5QdElpaHBxVWphOTlnbllkbDEzNHhRZmVJYmJoV3N4?= =?utf-8?B?MTR4RkdpZ0p2MnhlL1l2cVViY1VGZDU0TGlybHZ1dnpiSmN2czI4NC9DYXhs?= =?utf-8?B?bUhKeDBicEpaU2l3MllSQlhDakhmVnhMTVd6dmFnRWlnM1EzWW9TQVB0ekNH?= =?utf-8?B?cU92dlpRQW9EN1ppeCt2aUt0RHNJd0wwQ2JVdHVWc1JCNDRaLzNJRVphWGcw?= =?utf-8?Q?XGweXOyAsWwPf98Z7xzDncbcm?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6601b3e7-2ca7-4cd6-385b-08dd90f43b4c X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:27:59.9013 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: GCanxWBuBgrxMD1ku3e/gr3njaWBT6EhOkxKaqfX7mNtHpx1dr3Nude1vyi+LKJ2lZDwrME3rhyJoFxAZ3zsFQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR11MB7953 X-Proofpoint-GUID: LfvRHbvAFiDY8c0CLt3UixMGe2FuU66u X-Authority-Analysis: v=2.4 cv=TMNFS0la c=1 sm=1 tr=0 ts=68214ea3 cx=c_pps a=gIIqiywzzXYl0XjYY6oQCA==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=yfPTFhKnZHbw51aZTvwA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: LfvRHbvAFiDY8c0CLt3UixMGe2FuU66u X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX0QEACopkYO0I mbh8wwK+oEOLzPWW3GD+osLPThhu6jaiXCjQPURSEYl1KW+N/zCivrnxs9+LvxNbV7LI59vCPk/ /JjVn1k9iipWd3A4RhKw96+lIpY47koWYzddTSnMZ7iPTaTO6OsqQ849Q9jDICZ9pDprJ5jDX2G AU05GudL3J3Gz4/IS1wRL+etc7fxh0HC7JxHr8SDRnAZsI2T0vLgySqFpPKuPyHS193km4nQwRT OweRYIeWhzYlpI/RWHDymo4a00I7kefHrTSyQVJa+iFX1MlrWlDHNIKKohqJLhbjdL1NZ8NRqj7 K+PKdfjG02qOIw1FbbTK/9UGkrHsSYDhNCcYGxqbmqtJNtY3FTgFH1C9zCZbCEKPqG8KJf0llCc kQ88hNDyiJfR6rnLyAzPZ3sfpJBPaV/PbKiZ6Ra58nPkcRGzcp4bIkKzBmonq0T/5GaYv3RS X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 priorityscore=1501 mlxlogscore=999 phishscore=0 mlxscore=0 bulkscore=0 spamscore=0 clxscore=1015 impostorscore=0 adultscore=0 malwarescore=0 suspectscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 Endpoints by itself are useless if there are no drivers to use them. This commit adds the final bit of infrastructure for CPC module: a new bus type and its associated driver. As a very basic matching mechanism, the bus will match an endpoint with its driver if driver's name (driver.name attribute) matches endpoint's name. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/cpc.h | 39 +++++++++++++++++++++++ drivers/net/cpc/endpoint.c | 1 + drivers/net/cpc/main.c | 65 +++++++++++++++++++++++++++++++++++++- 3 files changed, 104 insertions(+), 1 deletion(-) diff --git a/drivers/net/cpc/cpc.h b/drivers/net/cpc/cpc.h index 529319f4339..cbd1b3d6a03 100644 --- a/drivers/net/cpc/cpc.h +++ b/drivers/net/cpc/cpc.h @@ -15,6 +15,8 @@ struct cpc_driver; struct cpc_interface; struct cpc_endpoint; =20 +extern const struct bus_type cpc_bus; + /** * struct cpc_endpoint - Representation of CPC endpointl * @dev: Driver model representation of the device. @@ -98,4 +100,41 @@ static inline void cpc_endpoint_set_drvdata(struct cpc_= endpoint *ep, void *data) dev_set_drvdata(&ep->dev, data); } =20 +/*------------------------------------------------------------------------= ---*/ + +/** + * struct cpc_driver - CPC endpoint driver. + * @driver: Internal driver for the device driver model. + * @probe: Binds this driver to the endpoint. + * @remove: Unbinds this driver from the endpoint. + * + * This represents a device driver that uses an endpoint to communicate wi= th a remote application at + * the other side of the CPC interface. The way to communicate with the re= mote is abstracted by the + * interface, and drivers don't have to care if other endpoints are presen= t or not. + */ +struct cpc_driver { + struct device_driver driver; + + int (*probe)(struct cpc_endpoint *ep); + void (*remove)(struct cpc_endpoint *ep); +}; + +int __cpc_driver_register(struct cpc_driver *cpc_drv, struct module *owner= ); +void cpc_driver_unregister(struct cpc_driver *cpc_drv); + +/* Convenience macro with THIS_MODULE */ +#define cpc_driver_register(driver) \ + __cpc_driver_register(driver, THIS_MODULE) + +/** + * cpc_driver_from_drv - Upcast from a device driver. + * @drv: Reference to a device driver. + * + * @return: Reference to the cpc driver. + */ +static inline struct cpc_driver *cpc_driver_from_drv(const struct device_d= river *drv) +{ + return container_of(drv, struct cpc_driver, driver); +} + #endif diff --git a/drivers/net/cpc/endpoint.c b/drivers/net/cpc/endpoint.c index 5aef8d7e43c..98e49614320 100644 --- a/drivers/net/cpc/endpoint.c +++ b/drivers/net/cpc/endpoint.c @@ -48,6 +48,7 @@ struct cpc_endpoint *cpc_endpoint_alloc(struct cpc_interf= ace *intf, u8 id) ep->id =3D id; =20 ep->dev.parent =3D &intf->dev; + ep->dev.bus =3D &cpc_bus; ep->dev.release =3D cpc_ep_release; =20 device_initialize(&ep->dev); diff --git a/drivers/net/cpc/main.c b/drivers/net/cpc/main.c index ba9ab1ccf63..dcbe6dcb651 100644 --- a/drivers/net/cpc/main.c +++ b/drivers/net/cpc/main.c @@ -3,16 +3,79 @@ * Copyright (c) 2025, Silicon Laboratories, Inc. */ =20 +#include #include =20 +#include "cpc.h" + +static int cpc_bus_match(struct device *dev, const struct device_driver *d= river) +{ + struct cpc_driver *cpc_drv =3D cpc_driver_from_drv(driver); + struct cpc_endpoint *cpc_ep =3D cpc_endpoint_from_dev(dev); + + return strcmp(cpc_drv->driver.name, cpc_ep->name) =3D=3D 0; +} + +static int cpc_bus_probe(struct device *dev) +{ + struct cpc_driver *cpc_drv =3D cpc_driver_from_drv(dev->driver); + struct cpc_endpoint *ep =3D cpc_endpoint_from_dev(dev); + + return cpc_drv->probe(ep); +} + +static void cpc_bus_remove(struct device *dev) +{ + struct cpc_driver *cpc_drv =3D cpc_driver_from_drv(dev->driver); + struct cpc_endpoint *ep =3D cpc_endpoint_from_dev(dev); + + cpc_drv->remove(ep); +} + +const struct bus_type cpc_bus =3D { + .name =3D KBUILD_MODNAME, + .match =3D cpc_bus_match, + .probe =3D cpc_bus_probe, + .remove =3D cpc_bus_remove, +}; + +/** + * __cpc_driver_register() - Register driver to the cpc bus. + * @cpc_drv: Reference to the cpc driver. + * @owner: Reference to this module's owner. + * + * @return: 0 on success, otherwise a negative error code. + */ +int __cpc_driver_register(struct cpc_driver *cpc_drv, struct module *owner) +{ + cpc_drv->driver.bus =3D &cpc_bus; + cpc_drv->driver.owner =3D owner; + + return driver_register(&cpc_drv->driver); +} + +/** + * cpc_driver_unregister() - Unregister driver from the cpc bus. + * @cpc_drv: Reference to the cpc driver. + */ +void cpc_driver_unregister(struct cpc_driver *cpc_drv) +{ + driver_unregister(&cpc_drv->driver); +} + static int __init cpc_init(void) { - return 0; + int err; + + err =3D bus_register(&cpc_bus); + + return err; } module_init(cpc_init); =20 static void __exit cpc_exit(void) { + bus_unregister(&cpc_bus); } module_exit(cpc_exit); =20 --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 B4C622116EB; Mon, 12 May 2025 01:28:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013310; cv=fail; b=chQGX2GjK4Y/bojNZUkWSLOMuws8UDLK28zxk/s78am4QXkE5GqatrkZpmXgvaFOdYPblV3RaDgvChJjU9PeJyvMZaJGivx+MzHMD/7k/j2j9LIgrWGhKTbRZVqGWvP3XMR50GtldG8edw0BKF+iGckFplgonP7ory13+/3xRZ4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013310; c=relaxed/simple; bh=jySBjMDmNQNCXrabGC8bX4EwHQRzxNxw4QyUDEwm/iQ=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=ssG9ZbEfdb0bW75dBoMbFtqu1V/1J7XmR4lMd/FSxViKHGpgHWBCx7Dp1K0aa9CV95EitlAp/4pzFI/caZZYmP7ZlLQW2AzqY5cySabrnzhUu56+cBSeoBqPtuQPf1Gc8m0qfV5sjz1hI0T8cyqJ+M94P0dmtRBbAOuBqEoh3Fg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=AZDvZfng; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=FnIXsui+; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="AZDvZfng"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="FnIXsui+" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54C0dSZF021480; Sun, 11 May 2025 20:28:07 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=OENZnLNkhByALmDeJKCZ0SPB8gbBjIOoxib6TmUA89w=; b=AZDvZfngDgoR SNxoRUOVGtbttncqu5UjUIBDrmJZg/BtyScBuREstK1FLly4YlqauwhKRXKCWibW Y2iU9LG9/HK+kuPlKzlWWMIyh28uM6HxmarFzEpGWn49bB/LVa+xqVutfUaJyoAu cgYQe5v+NqoTYket4ScVbsbN6+QpIXJRYB8m98Yq4OUhRTpnCUZWpbK0MgGoG8ys MwjhSWcMsU3jKfDtd9zMqZt2VyEwOhNRos5EyPEWPNN4Uebydf+y62hP9JxQa9pk 0NZgC5wODqXVnj24u83nYC2C0xXnLSF9q5XUdYCkR9NHbRIaeO3eDUFh2/mpsciT Q1yrluSGUw== Received: from nam11-bn8-obe.outbound.protection.outlook.com (mail-bn8nam11lp2176.outbound.protection.outlook.com [104.47.58.176]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw6-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:07 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=lwx8kksrqWmRUjOliV40fW9k1Ryf7dGeW9Rn/OQSNEF1AHsjNlt4ig9mQm3zXvakL26L0Y39+rURu9ytHVQBZOLvUMF3BcO/YnNkanoi+Nr7AhpU1M5KVlzDr93IxLtujsjZHVLeBaSpofBtNo0+CFEM0FDbkcC9qKzIlJjdZ2pnFjQZz/UM/gEXpOTy5LJxq3N+oC3p8of7lw/vy3PB6hXUEJX0+N8aVDpGdTp77IGi/fqQZWalWQZ9dU4BenEmUXSVJfTmcz/I4+eNVGiMClGxxsf8wiG72btikv152Ot9LIBqBwM5YCizM7v8PmofO+T8wRQd3R5habnvde3siQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=OENZnLNkhByALmDeJKCZ0SPB8gbBjIOoxib6TmUA89w=; b=kjcEpbaePTt0bdjOrgy35g3ZOC4WvwzxCDuVwwfIkP3TPC8RX4pqg3FkbAOsGtXxTZGxqkdzJ1Vu8/IQ/RiD3Q00CkE5uSkYZKPc0qHXOJYleH6bDMVeZTfo0q6Y6YAgWuCSk63L6iXH3KMVxm0RQhqdMkcu5kQLWw7gQ3g/Iq+i3GBYBm6EhCHTywAy0do4CdV3A5F6+Gl9oMl1WXS0hmGYPr5/cBAVpyjLPzRQ0abIVt2KrLhQSTcYfWu5v8YpS5Y02eib6+h+857LgzExv42SiHUcdvpDWaEShvA0TBNYdqgI7bHBArze1ZPQVr3LUx85wXM9i+zGO0Zk7dvCVg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OENZnLNkhByALmDeJKCZ0SPB8gbBjIOoxib6TmUA89w=; b=FnIXsui+6yOU90tJpT3YsqTfPxYZAZY+s18+decZZxENdN25RAzFHPBpyoLyVDiMiI8r2i0jxOk/GaH0Ir7xe0Ax/9CTYdy3+0PxmRrSlOM5OlhSdOSUQVhtKnt8Y2LGfF9YdV3iw4lGMMkmdyzUU7mTMR0n4ZGVDMNjU2GI2Vg= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by IA0PR11MB7953.namprd11.prod.outlook.com (2603:10b6:208:40d::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.29; Mon, 12 May 2025 01:28:00 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:00 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 04/15] net: cpc: add protocol header structure and API Date: Sun, 11 May 2025 21:27:37 -0400 Message-ID: <20250512012748.79749-5-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|IA0PR11MB7953:EE_ X-MS-Office365-Filtering-Correlation-Id: 022797e0-16c0-4d9b-643e-08dd90f43bb4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|1800799024|366016|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?NElsU0hTbFBJN1N3RCtWcGRSY1NBQkNTUnB3U3FlWEc2QXdkNTFEUjcyUjZF?= =?utf-8?B?dHhJeU05VUo3cm9UUG42TCtNdlZ4VGE1SFREUklqeXRtNzhXcGtlUnBvVUVo?= =?utf-8?B?OFlBTkRZYjRoV2NZZXBOcW40Sjh5ZkxwbUpoS2pjYzh4dW8vNENCVTRLbnEv?= =?utf-8?B?Lzgrbll5Tjh1VExqQ1JnR0NOSS9PbFNqV3lKdXVkWFVhd3JuRTZZbERlYXVs?= =?utf-8?B?KzRpdnNtNDk0KyswaWtNMGdnZWdFenUwenYvQStuNDBhdTNYTWk2N056VFBB?= =?utf-8?B?eU5uT2d1aUtROWVjZWw2aG1OTlVHS2xtTVp2dVh6VjQ3RFNXZkhqcUc3R1RP?= =?utf-8?B?NEFlUmU1dTBNQllMQzB3TXhIT3YzQlhnaW1vaDk4UlBPd1A4QmFQdWlndWUw?= =?utf-8?B?QjBHSzRtek1uQXhnSnJmRy9SYW0zK1loQjFnYm9sOHJLZnJLUnhySEs2SVlZ?= =?utf-8?B?ZEJCbGd0RE5OeFVDLytaZGgzSDNVVThvaEt0L3F4ek1va3RjeVRRZmVLZnJp?= =?utf-8?B?Vk5OWHptNWUvbDR0MEdMaG1GOTgvQzR0UGVJOEUrdEsvck9jK0Y4NkpMY1VR?= =?utf-8?B?TWM1MW16WDdPNjN3dVRmZ3JDbHlTTUlvb2NSZC80R3poaWJVUDdDWEZ2OVI4?= =?utf-8?B?L3lERXB1STVJL2FUdzh4NkRYdUo4VVUrUjZCd3pGOEJzZXZBb2I2YklrbHM2?= =?utf-8?B?K0NmTnU2RzA0QUJxMUNWaEtYaXhUbGlDVDVHcnlrdno4bWd0VGxKRVdDdmln?= =?utf-8?B?aXNQL0pMWVIxNEZJOFd6MVlmZmRMMVJ2eGNZZjJwS0tIRkoyTWs4TW1meDVs?= =?utf-8?B?aVEzUkVRTmdMSUwrLzBPNG54SUM1M2g2Z0ZITlhEYVVxaDluWm9HUXVvbURY?= =?utf-8?B?MThsZVJVSFFUSkZtSTQzUjhhTGZ6bWtxYnl2V1FFQVRjUlF1WW02b1JGSUxu?= =?utf-8?B?QVlJSlBOck9kRU9ENTZOWmlubzVUVjJaNkdDVTd5VlkvU3pzT0VNbWFvazZ3?= =?utf-8?B?TjNFRVBZbWZKRXVJbmZZdnYrQmp6WW9aWTNoT3pvK2g2ODNGTGN3enNLN3Ro?= =?utf-8?B?cHVOMnpDZlRwS2FRVHBibWNKV0ZQamhCWm1saGlCdzVQVUFUODVDUlJ4aHdI?= =?utf-8?B?WWdCWnRQc01qbXdBQzNuTW5DUVh1QlN2NSszbmtuQytEd1hjQU5NSjh2Q1Zn?= =?utf-8?B?NlhQcDBRWVkycXFIQWNpOCtoTGY2dGJuN2JvUHlHamUyRUlUNzlXTjF1SHJP?= =?utf-8?B?eG1UREpKWCtNUVFvSHlXQUJ4QTFYbGVLNGVONnZHOVZ0NWtxa2EzVHM5YkVv?= =?utf-8?B?V2dmRngwS3RZckpRL0hSaVd1TTkwQjVJb1RHNkw1eEVURjVEL05KTXgvUGhC?= =?utf-8?B?U0t3WUg2VkthLzFDN2pUYVoxK1NvM3dUenRvYlVUQzRQZjZLaFBBVExjQjJG?= =?utf-8?B?OHUrUFFNOHltSEExZWpvcmkrQkhUY0ZuZzhVRkZWaWY4Q0prMjhWZmdVaU1G?= =?utf-8?B?YnJXY1oxd05VL3pscDErZE5VOG4xa0hjRCtGQXdVQ252UWx6MVdMREFReDNX?= =?utf-8?B?MW9wL3FxTnI2R1pORjk1NDJuQWZxd2N6SjFBKzIyZU1OTzhwOUVuMlBzci9m?= =?utf-8?B?QXMvNEpiOU1Kb2Y1RkF6amNXS1A1VWsxQ1JTKzRDNk1RdHFSV01CMVA5TW1r?= =?utf-8?B?TEdRZ3d5OWlDem5GUE1zMG1VRnEyMmEyRzhZRXVDSE8rdE1wMDRaWkl6aXB5?= =?utf-8?B?LytqMUEzZ0Q4Q2IxbDZqbis4NDdSM1lFWXowbE5WajB6R3FlOEt0RFhzSGVU?= =?utf-8?B?eU4rZzcrTXFHNUgrbFBPM0IzRC9TS2lpMTdLb2liMy9rS1VVeXpva1ZIbXk0?= =?utf-8?B?YnpRVi80eFM5aGN6bjRSb3UyTHlubm0yQXY1N2NHbG03SVZLc0RiT0lqcXFC?= =?utf-8?B?azBYVVcwRCs0bEpxOFVEc2dXQ0ZBMy9uSmZlSGpRd011eFRnRUQ2bTY4bzEv?= =?utf-8?Q?5/+ucAY0fC/kKcN/sAtKVQiAjIbOA4=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(1800799024)(366016)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UWlwc0hHQzQzd2tENjNTOTArWEd4VGRhMWRDQ3k3MTVkbFFJZkZvT3k5RERn?= =?utf-8?B?MUU5TmEwWktCclgvRDhzTklaOVhjYTZaZXgzOG80WXBnSFFPbDl4eWNnck1M?= =?utf-8?B?RVRLVXBGQzZmRlBUbG1SZWZJYjJPM1ltU2d2UWJ4aHhxTCtlRFpNck9kRndB?= =?utf-8?B?bkN2R1BNWC9WUHFydWd3eTFLUGM1UkpteEt2Z2ZMWmxjejJBSFlyZGszTGdv?= =?utf-8?B?REhNbm5RakZNa3hLSmhGM1pqcDlUdXpLcTd5MVozalI4eFhMTHNZM0VEYmhS?= =?utf-8?B?c2c4Q2tlMno1bS9NeTFydUxrVkp3T3Y2Y3BURjlvSGZBeXRCV2hDOS9DRFQw?= =?utf-8?B?cEZ5czhPbGFCbG4xR2FTM05YZzk5Wlp2aG1GQWNlMGd3MGlzM3dxU2Z1ZmUw?= =?utf-8?B?K25YMG5Na3lhWEFuV1JCb0VnakdhMVVNeW50bFlOUmh6SDhCQURiYjJlZ3Bt?= =?utf-8?B?N3c3QUpKdDlscThJM1pBcVlqM0lEODdOOGdybjN2QmMwa3A3eUhVb2IzbytC?= =?utf-8?B?bUZyZ0l0eHl6RC9wUFliWmljd1I5V0xxakFONnk5ZjVyUzY4YW9pVVZJNTRm?= =?utf-8?B?cFBYaEtvQnJsUU04VXYzMWxhTDI2SU5xRnZJcFM0SHFzYWdkWEZpekZJSjh1?= =?utf-8?B?MVBURTlvZmVvMTQ5SjZ6Qkp2WEF6cytDZ0pwU2pGZE9xK3RGdlhMVytTK0tN?= =?utf-8?B?c2RiRFFGbTdEVEgzSXE0cTlrNkxVdkhpLzJXQzdoOWc1ZFJIb2FIWm1RZjFs?= =?utf-8?B?YnI2N0tTd01vVXlwVW5Ca1psSGtRb21LUUhaUTkveEk0K2lxWGN6VHhCa0dH?= =?utf-8?B?azRWUnZid2dRc09OSWR4ZzBqeFZwYkN1ekhielhvSE1vR1A5NkhTR0syTjBN?= =?utf-8?B?VEZRSUNmUUU2RnFjVFQrZjhLVWkyUUFKVUtQeHMrdGRQMjZVTEhZQ0xyQjln?= =?utf-8?B?WFVQNVNscGh2ZVVtejFnL1ZuMDY0OEJCRzZaUDBpaDhTTXN3UkJRUGV3S0N5?= =?utf-8?B?RlZBSFR4a0U2bHllUmh6MWZUTDFIeERtY2lNdXRZSnQ3UjJlNE9XWXdCT0FJ?= =?utf-8?B?TzRCbC9WN2xGOWxDbDF6UVc0UURjeXRNai96NkZMZmFFMWVsa2IwZTdabE9t?= =?utf-8?B?Rmc0dGVkS1lTVjB6OHpWQlR3Ylc1ZVM2cUxTQUVzNWZMc3dtYXp3Y3l6TkJM?= =?utf-8?B?N015cW1RRURmVm1xalJOL0lEZXloRDZ1WUlkb215S1FhTG5BdnBiNW8xNUNV?= =?utf-8?B?Zmd5S3VnUkhkS0E1ckFPTVREWSszMGJya1FLeWJwSExaam50Ny9vU0k2RVph?= =?utf-8?B?dk5Qc1Z6b1lYVzNveC92QXFwZE51VVlZOWFsQUpuWUZDRjNuRjRPb3FOZjlG?= =?utf-8?B?K2d0VlpZbHdIS1RONFN6dVFwVXJhcFEwN3B4cStkS2hrbEg4UlorekhTblBm?= =?utf-8?B?d0RSaE1sOEduYXZpOTRuV3VXdCt1TFU1RWxlQ1dmc2h2NjBFZVNjZ3k0QWQ0?= =?utf-8?B?SWhONEF0STdORVJOL3hUYUYzVDNVRzdaRW5wZEY2aGUzZi9vWGRwd2pCU2tt?= =?utf-8?B?dEdzTTRtMUt6UTd2bHVWSHZxandkU2g1Q3NtajcyL0lZSjdmSUdKZ2JnVnl4?= =?utf-8?B?dlgyVnBqZmpJYkxOUmJhMmc1a3JyQWNtdXNJaU5PU1dFWmpUUysvOHdxcUlW?= =?utf-8?B?dXFRaUVZbklxZ2FzazBmMWQxWFJockJvSkVGNG1mZHFNL0dPZUlTVTZPTkNz?= =?utf-8?B?VVZlSHR6aXR0bGFnWEI0dlNLYk8vTXhlUlpZZVdqdTVaL0gvQVNyL3U2WFRi?= =?utf-8?B?aFhWU0FiTzQ5bDdIbWhZL2tQNEY0RVc4ZU0zT0RUbXNHaFl5NXErRENWTFRF?= =?utf-8?B?L2hKeDZvelk2MHJaVzV6QjZwY3VqbXVBK012TWhaUmpDTERVLzcvVjJkbkQ1?= =?utf-8?B?Ujk3clp0aUlCbUZNM3dTNm1DcW9QN2tkM3ZPMnVHMG43MlllUERLdHBHemlU?= =?utf-8?B?eGNFMGdkczlXUHJ5K3dsWUlJQllvUGhCTTRxT3hpd1A1YXBpL3JLanhFelBC?= =?utf-8?B?ZUJ2NjFkc1N0UlVJTE4xOFBSMWZpc3I1RWxvR0JsRXpiNXQ1UlZPV1g5dDlG?= =?utf-8?Q?cRSENTSjat91Ma6oiEjqRSvqC?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 022797e0-16c0-4d9b-643e-08dd90f43bb4 X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:00.5822 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: NGF6DbSCB7IbDXx94Bhpq0bAFIGIBk2WlmKTEwVxZAVg+a9nQfdfm/5EATsFq8fVWHORT+4tXjsVf+0aVwta+g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR11MB7953 X-Proofpoint-GUID: wQfZNIKp8h2q9zNT1x2u_effgSdj8WIj X-Proofpoint-ORIG-GUID: wQfZNIKp8h2q9zNT1x2u_effgSdj8WIj X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfXyBLg8iiOTwRP aRrpVSI9h3AJRl3EESMlqNDHgpUAwV9Y7vXHXKLzy8AxK1knRyWw6qKKn+aK3bPBiE8kqrf5hkl IPU/j2lfLr/G9ntztkTtu+TeX4cWcWMI0h2Xkv6oHzuk/XkUXz9pUKOsrfdtwccoLcyCngpMFhK 80A1MxyBmWoxZslY6/sSZ7gF4uw97XuXyBCVavWFRm7EmAa0vniQGBnXC7TixWITZBvY+uuXbq7 wduCti6iy1y6JR/5YLs/decwZvqDrEWDlJ+86ZJEUpNR90dfNXWiNCc4qbjZVMbrf8EBEKiyMx+ YxnZD6woKWKDCWHNhKNKUtHnbHz897cgJhoxYgxyZ2nZXRuwVHFIs4KZs/CCS+f+jVGTcPNJ9UF K0be+wgvLtEPwHDbpTwDy56AN8vbcyORLHeGtDTs1sKowSbWWM5kUPQqK18xSLX4wrjr6FB4 X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214ea7 cx=c_pps a=X8fexuRkk/LHRdmY6WyJkQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=F0xCgmf7AXx50LILr2cA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=999 clxscore=1011 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 CPC frames are composed of a header and optionally a payload. There are three main frame types currently supported: - DATA for transmitting payload or regular control frames (like ACKs, that don't have payload associated with them) - SYN for connection sequence - RST for disconnection and errors Add structure and functions to operate on this header. They will be leveraged in a future commit where the protocol is actually implemented. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/Makefile | 2 +- drivers/net/cpc/header.c | 237 +++++++++++++++++++++++++++++++++++++++ drivers/net/cpc/header.h | 83 ++++++++++++++ 3 files changed, 321 insertions(+), 1 deletion(-) create mode 100644 drivers/net/cpc/header.c create mode 100644 drivers/net/cpc/header.h diff --git a/drivers/net/cpc/Makefile b/drivers/net/cpc/Makefile index 673a40db424..81c470012c1 100644 --- a/drivers/net/cpc/Makefile +++ b/drivers/net/cpc/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 =20 -cpc-y :=3D endpoint.o interface.o main.o +cpc-y :=3D endpoint.o header.o interface.o main.o =20 obj-$(CONFIG_CPC) +=3D cpc.o diff --git a/drivers/net/cpc/header.c b/drivers/net/cpc/header.c new file mode 100644 index 00000000000..9f6d637b5ae --- /dev/null +++ b/drivers/net/cpc/header.c @@ -0,0 +1,237 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#include +#include +#include + +#include "header.h" + +#define CPC_CONTROL_TYPE_MASK 0xC0 +#define CPC_CONTROL_ACK_MASK BIT(2) + +/** + * cpc_header_get_type() - Get the frame type. + * @hdr_raw: Raw header. + * @type: Reference to a frame type. + * + * Return: True if the type has been successfully decoded, otherwise false. + * On success, the output parameter type is assigned. + */ +bool cpc_header_get_type(const u8 hdr_raw[CPC_HEADER_SIZE], enum cpc_frame= _type *type) +{ + const struct cpc_header *hdr =3D (struct cpc_header *)hdr_raw; + + switch (FIELD_GET(CPC_CONTROL_TYPE_MASK, hdr->ctrl)) { + case CPC_FRAME_TYPE_DATA: + *type =3D CPC_FRAME_TYPE_DATA; + break; + case CPC_FRAME_TYPE_SYN: + *type =3D CPC_FRAME_TYPE_SYN; + break; + case CPC_FRAME_TYPE_RST: + *type =3D CPC_FRAME_TYPE_RST; + break; + default: + return false; + } + + return true; +} + +/** + * cpc_header_get_ep_id() - Get the endpoint id. + * @hdr_raw: Raw header. + * + * Return: Endpoint id. + */ +u8 cpc_header_get_ep_id(const u8 hdr_raw[CPC_HEADER_SIZE]) +{ + const struct cpc_header *hdr =3D (struct cpc_header *)hdr_raw; + + return hdr->ep_id; +} + +/** + * cpc_header_get_recv_wnd() - Get the receive window. + * @hdr_raw: Raw header. + * + * Return: Receive window. + */ +u8 cpc_header_get_recv_wnd(const u8 hdr_raw[CPC_HEADER_SIZE]) +{ + const struct cpc_header *hdr =3D (struct cpc_header *)hdr_raw; + + return hdr->recv_wnd; +} + +/** + * cpc_header_get_seq() - Get the sequence number. + * @hdr_raw: Raw header. + * + * Return: Sequence number. + */ +u8 cpc_header_get_seq(const u8 hdr_raw[CPC_HEADER_SIZE]) +{ + const struct cpc_header *hdr =3D (struct cpc_header *)hdr_raw; + + return hdr->seq; +} + +/** + * cpc_header_get_ack() - Get the acknowledge number. + * @hdr_raw: Raw header. + * + * Return: Acknowledge number. + */ +u8 cpc_header_get_ack(const u8 hdr_raw[CPC_HEADER_SIZE]) +{ + const struct cpc_header *hdr =3D (struct cpc_header *)hdr_raw; + + return hdr->ack; +} + +/** + * cpc_header_get_req_ack() - Get the request acknowledge frame flag. + * @hdr_raw: Raw header. + * + * Return: Request acknowledge frame flag. + */ +bool cpc_header_get_req_ack(const u8 hdr_raw[CPC_HEADER_SIZE]) +{ + const struct cpc_header *hdr =3D (struct cpc_header *)hdr_raw; + + return FIELD_GET(CPC_CONTROL_ACK_MASK, hdr->ctrl); +} + +/** + * cpc_header_get_mtu() - Get the maximum transmission unit. + * @hdr_raw: Raw header. + * + * Return: Maximum transmission unit. + * + * Must only be used over a SYN frame. + */ +u16 cpc_header_get_mtu(const u8 hdr_raw[CPC_HEADER_SIZE]) +{ + const struct cpc_header *hdr =3D (struct cpc_header *)hdr_raw; + + return le16_to_cpu(hdr->syn.mtu); +} + +/** + * cpc_header_get_payload_len() - Get the payload length. + * @hdr_raw: Raw header. + * + * Return: Payload length. + * + * Must only be used over a DATA frame. + */ +u16 cpc_header_get_payload_len(const u8 hdr_raw[CPC_HEADER_SIZE]) +{ + const struct cpc_header *hdr =3D (struct cpc_header *)hdr_raw; + + return le16_to_cpu(hdr->dat.payload_len); +} + +/** + * cpc_header_get_ctrl() - Encode parameters into a control byte. + * @type: Frame type. + * @req_ack: Frame flag indicating a request to be acknowledged. + * + * Return: Encoded control byte. + */ +u8 cpc_header_get_ctrl(enum cpc_frame_type type, bool req_ack) +{ + return FIELD_PREP(CPC_CONTROL_TYPE_MASK, type) | + FIELD_PREP(CPC_CONTROL_ACK_MASK, req_ack); +} + +/** + * cpc_header_get_frames_acked_count() - Get frames to be acknowledged. + * @seq: Current sequence number of the endpoint. + * @ack: Acknowledge number of the received frame. + * @ack_pending_count: Amount of frames pending on an acknowledge. + * + * Return: Frames to be acknowledged. + */ +u8 cpc_header_get_frames_acked_count(u8 seq, u8 ack, u8 ack_pending_count) +{ + u8 frames_acked_count; + u8 ack_range_min; + u8 ack_range_max; + + ack_range_min =3D seq + 1; + ack_range_max =3D seq + ack_pending_count; + + if (!cpc_header_number_in_range(ack_range_min, ack_range_max, ack)) + return 0; + + /* Find number of frames acknowledged with ACK number. */ + if (ack > seq) { + frames_acked_count =3D ack - seq; + } else { + frames_acked_count =3D 256 - seq; + frames_acked_count +=3D ack; + } + + return frames_acked_count; +} + +/** + * cpc_header_is_syn_ack_valid() - Check if the provided SYN-ACK valid or = not. + * @seq: Current sequence number of the endpoint. + * @ack: Acknowledge number of the received SYN. + * + * Return: True if valid, otherwise false. + */ +bool cpc_header_is_syn_ack_valid(u8 seq, u8 ack) +{ + return !!cpc_header_get_frames_acked_count(seq, ack, 1); +} + +/** + * cpc_header_number_in_window() - Test if a number is within a window. + * @start: Start of the window. + * @end: Window size. + * @n: Number to be tested. + * + * Given the start of the window and its size, test if the number is + * in the range [start; start + wnd). + * + * @return True if start <=3D n <=3D start + wnd - 1 (modulo 256), otherwi= se false. + */ +bool cpc_header_number_in_window(u8 start, u8 wnd, u8 n) +{ + u8 end; + + if (wnd =3D=3D 0) + return false; + + end =3D start + wnd - 1; + + return cpc_header_number_in_range(start, end, n); +} + +/** + * cpc_header_number_in_range() - Test if a number is between start and en= d (included). + * @start: Lowest limit. + * @end: Highest limit inclusively. + * @n: Number to be tested. + * + * @return True if start <=3D n <=3D end (modulo 256), otherwise false. + */ +bool cpc_header_number_in_range(u8 start, u8 end, u8 n) +{ + if (end >=3D start) { + if (n < start || n > end) + return false; + } else { + if (n > end && n < start) + return false; + } + + return true; +} diff --git a/drivers/net/cpc/header.h b/drivers/net/cpc/header.h new file mode 100644 index 00000000000..c85bcaef345 --- /dev/null +++ b/drivers/net/cpc/header.h @@ -0,0 +1,83 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#ifndef __CPC_HEADER_H +#define __CPC_HEADER_H + +#include +#include + +#define CPC_HEADER_MAX_RX_WINDOW 255 +#define CPC_HEADER_SIZE 8 + +/** + * enum cpc_frame_type - Describes all possible frame types that can + * be received or sent. + * @CPC_FRAME_TYPE_DATA: Used to send and control application DATA frames. + * @CPC_FRAME_TYPE_SYN: Used to initiate an endpoint connection. + * @CPC_FRAME_TYPE_RST: Used to reset the endpoint connection and indicate + * that the endpoint is unavailable. + */ +enum cpc_frame_type { + CPC_FRAME_TYPE_DATA, + CPC_FRAME_TYPE_SYN, + CPC_FRAME_TYPE_RST, +}; + +/** + * struct cpc_header - Representation of the CPC header. + * @ctrl: Indicates the frame type [7..6] and frame flags [5..0]. + * Currently only the request acknowledge flag is supported. + * This flag indicates if the frame should be acknowledged by + * the remote on reception. + * @ep_id: Address of the endpoint the frame is destined to. + * @recv_wnd: Indicates to the remote how many reception buffers are + * available so it can determine how many frames it can send. + * @seq: Identifies the frame with a number. + * @ack: Indicate the sequence number of the next expected frame from + * the remote. When paired with a fast re-transmit flag, it indicates + * the sequence number of the frame in error that should be + * re-transmitted. + * @syn.mtu: On a SYN frame, this represents the maximum transmission unit. + * @dat.payload_len: On a DATA frame, this indicates the payload length. + */ +struct cpc_header { + u8 ctrl; + u8 ep_id; + u8 recv_wnd; + u8 seq; + u8 ack; + union { + u8 extension[3]; + struct __packed { + __le16 mtu; + u8 reserved; + } syn; + struct __packed { + __le16 payload_len; + u8 reserved; + } dat; + struct __packed { + u8 reserved[3]; + } rst; + }; +} __packed; + +bool cpc_header_get_type(const u8 hdr_raw[CPC_HEADER_SIZE], enum cpc_frame= _type *type); +u8 cpc_header_get_ep_id(const u8 hdr_raw[CPC_HEADER_SIZE]); +u8 cpc_header_get_recv_wnd(const u8 hdr_raw[CPC_HEADER_SIZE]); +u8 cpc_header_get_seq(const u8 hdr_raw[CPC_HEADER_SIZE]); +u8 cpc_header_get_ack(const u8 hdr_raw[CPC_HEADER_SIZE]); +bool cpc_header_get_req_ack(const u8 hdr_raw[CPC_HEADER_SIZE]); +u16 cpc_header_get_mtu(const u8 hdr_raw[CPC_HEADER_SIZE]); +u16 cpc_header_get_payload_len(const u8 hdr_raw[CPC_HEADER_SIZE]); +u8 cpc_header_get_ctrl(enum cpc_frame_type type, bool req_ack); + +u8 cpc_header_get_frames_acked_count(u8 seq, u8 ack, u8 ack_pending_count); +bool cpc_header_is_syn_ack_valid(u8 seq, u8 ack); +bool cpc_header_number_in_window(u8 start, u8 wnd, u8 n); +bool cpc_header_number_in_range(u8 start, u8 end, u8 n); + +#endif --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 B785420E32D; Mon, 12 May 2025 01:28:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013308; cv=fail; b=dvpfyYqRMWUHelTTNBpVGGAhj5SNwYLshIIPabLd7fZkCEQDVq2HiV2RRjdgNkJs+hN4DxMdI5kclt4CIywWlJeZn4Jys58gFFrzTqr7Q5EvaS+zkRdhLETayC5PpF4pJaiErR8fxfHyazi9/4nJtMOMgnJRWYmFKXZChOAw8QU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013308; c=relaxed/simple; bh=6FKqElMS+HZQzdDDRI7HZwcaMXpEINbksPlcmoyODgg=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=s1Gw8yKaM1J3cN+OgW4Z+xt4f8ndIwYg0hvCqSg6M469xj2NYEWyHCzpMeowRMr4NLQwg3Gkx0WimexGMQ1/OgnGwVYDbxwcEjpwDFPGQSONyt2VGa5IffsZ8b54NkOUNrzUvydAwaIrbVKJ+yil7xu86YqZs6m/R/Bs3Hgr/eI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=r+3W9cEY; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=Gkt+VHjr; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="r+3W9cEY"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="Gkt+VHjr" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54C0dSZC021480; Sun, 11 May 2025 20:28:05 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=mW7vmEdxebJd3ADXDxa0qONobo7bNXedsL+eHxaxpHA=; b=r+3W9cEYxhdZ 5AUp/EoE7kaCaHIysXfibKvo4xWByadTV1ylU2ffjD3IRdmODX9s7YxjczWCt6hR NWLqJ/7KPVumYp+P/NcPPn1SuUm9MOFNA8ybYxyfezTfhDs1QgrjzmEjXwbx1JEG i0NgusgnHglxyT/3gD7kHS4PdYnDaZKo4loSi2HMfv2OLRZZ4eFI56Ym3Vj3vnki sQM2rm8MwYkiJyPjlYE2nuxw6PLfwjAkP/HSnhmCdb9hj7SsMMkdchcrUXHvVjoO x9g3hTl2vbjJWCYtkVSynWPBL54JU0Us93SYsRHaZHqS3jRk6D7WZqWyMajMXe+C 2Y1QrwqO4g== Received: from nam11-bn8-obe.outbound.protection.outlook.com (mail-bn8nam11lp2176.outbound.protection.outlook.com [104.47.58.176]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:05 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=DTFpLBU+0mD7cBjW2HCjwgetwEFW70wriws4dqqduvovXlN2CQmgp0KgwUlZynVk6KamFNYeBsC3NZioi6qJUQwGT+nKO03xW8GB9S8EGr/cbkkA+jxOIGfARL0W7YKMsmwgzgmBQ+kqlJQb/Ef/CkSt3v+NEvOh+BxgMlowuV56lpmg6dlGJ5CIldIpwL0KqXhOVWKJxaleZ06qkYx4fkMWOV6uDvGipMBb+rv20cF3ECq8sJwj08VriFM8nFZJVjkKDjUNiB+3YIBBPSCknnDMHUIDbQBd7+ppQi2tGqj0sDaAzTZ2q0T7Q/6PZz65zXR22lmGLdRXnTsjtwkCAQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=mW7vmEdxebJd3ADXDxa0qONobo7bNXedsL+eHxaxpHA=; b=dqgrKRR6RO5dRfr1zipt/mnwoRsBKfj7fFr8IlXaLbe3+H4rlR8PT3JYzg1q9LJ9bjJCqrWZy+yzNLADT1cImC9x8fAHBrYwBqfztthi5DLxP7clqY02z6756n3litR1hnWGvfm3PwRVkHe5A4JfuKBxlBEEeOMBndWbYTcUe+zx8JtkLfn/MDMoxmAS4F3z/oE/SF7tJjqCdhcj1fOtWCbrl81snXDy5UdB3GyKLQdaVxqgErLgfQhX0fCDWXiol2WfH6va5K822jqzI/sC7+bLHmI3Iy0lr7WcEiIkb8VK30PWLRBgenaS1JBDosj72SzkpfHL6f2cRUWT2qkGuA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mW7vmEdxebJd3ADXDxa0qONobo7bNXedsL+eHxaxpHA=; b=Gkt+VHjrvbwroF17oB92P9Qj/Ko4efWVb+zJr9jlMiT7o2fGmVOdzX5l7qw7+eOGbSc2tJ+K/KcAXlMRkcxeqVVcq0FvXI2eXO3n+cYsNH4WVdUrdRwCReyF8RhWQ3KN0VexJbusZkJMZP/XGBxBjQQJDHJRYWrE0GobJJOZiYs= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by IA0PR11MB7953.namprd11.prod.outlook.com (2603:10b6:208:40d::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.29; Mon, 12 May 2025 01:28:01 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:01 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 05/15] net: cpc: implement basic transmit path Date: Sun, 11 May 2025 21:27:38 -0400 Message-ID: <20250512012748.79749-6-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|IA0PR11MB7953:EE_ X-MS-Office365-Filtering-Correlation-Id: 3df0926f-113c-4be6-26c5-08dd90f43c1f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|1800799024|366016|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?UFg3ZHNodjMzTjZMOXVoSkRrR2dyWWFrcUYwRnEvdDFxeUIwMUZ5TmduTEdl?= =?utf-8?B?blRJTGE4TjIyS2Mwd0g5WlMyS1lhOVZvOHNMSnZ4MTVDTkN0enBETFRHbitG?= =?utf-8?B?L1l4T2VVM0Z1Wm5oSnA2WkZsMzJrRUE0YVliVTBBMWl2OWNjUUo3S1NscDF6?= =?utf-8?B?NWVpVWZmeS9ZSlBLTzFSZ3N3MUJaZWEyRWh0NzlPeWluS1dQMXNMK21lMlRp?= =?utf-8?B?dmFDNHFSckN0SDN2QWxEbHFUM3J5c3MzN2UxNXo0NTROcWlNSGR1bEVnSlVI?= =?utf-8?B?R2Y5dVplOXZHRW1kbHBWenF1RjhQYzg2d2tCZlNIa2I3TmpGWnRoYTJFUG80?= =?utf-8?B?OWdrZHVyVzU5dlBFa3VTMStIMDdLZnl5d1F4eXdKMGhTc0N1bXBTbDJnRith?= =?utf-8?B?SEtlQjhISCsySTBwanpwOHpGQVl6N3RSY1ptazhFWlVRRldoR3ZJSnNMbE5s?= =?utf-8?B?TU5TV2g4dmFIUFBZZTNvOEZkeW5rdTVaaU02N0VYWEYrRGxaclVqSWVLakF1?= =?utf-8?B?amI0bGxDVnFHK0JHQy82V3M4dUt1c3haL01aNEplWkt5azc1eUFSb2JhbUJV?= =?utf-8?B?U2lhSndLRmJsUG9YZXdMTHBoU3Z5b3UyUGNXVWtUalNjUWRRNXF3Y21yLy9B?= =?utf-8?B?dFQ1YUc3Zm9lbjA1S2FvTzBKd09RU1Rhalc5eUNBUVErc0xmN0UzMGtJSHZO?= =?utf-8?B?Nko5L2NrOWdTQS9QajBxZllDdDlwSndvYk4yVXBxME9SM2J1WldtdHVTaGx3?= =?utf-8?B?TGpSWUZyMUQxRytYcWZYV1BldnFmV1BZa0JCQVRJQk9RYVhRVWFXTXVvWkpT?= =?utf-8?B?dGNzTVlzZ0wvNXgxRHJoZUhyeFU1VUlHMjJPYStjeUZUYTZlaXpsSTd6WkZh?= =?utf-8?B?ZGJZMjA4d1FZN3V1SE1CYzBOYUdPRjFoM3hBWlhLdnMzNEU5NDFJRWhmUERn?= =?utf-8?B?OStzN2JnU2dFZU15SWlycUNBT2ZVblpKT0pnaW56SllwdzlRM1d4MHJMTGk4?= =?utf-8?B?SUtwOXczWlBCRytwcitsVVlyV01jWm1QakNsblhFYnBtT3BnR0xtOE5VR0VZ?= =?utf-8?B?ZWtMRTNmcThNN2N2UzQvb3dmMkp5VWhCdzNJYmpVWFFFdy9TODB1Nyt1VHBj?= =?utf-8?B?YUQ0dzR6QmNEU3VBMW1oZVVMbWM3disrTEQvOWNxekZodzFxNlFxK2RXa3p2?= =?utf-8?B?T3RvNy9rb1JUY2h3OUdlcWYveHVjZ0FoaVdldlRncUIyQUhuakRTNnlra2F2?= =?utf-8?B?RnBuMlZtUHdlWlVmT2tmV2hSUWJVVENRZVVDTVl5em41bTc0Y1JXQnZuMkI3?= =?utf-8?B?QklSWnRNdURGMlV4TnZDL28zdjdUdHFkRStEcG1VdmtUZmtDUDNsWFkwandh?= =?utf-8?B?Nkp4Um5UblI4MkFTaXpzeTJCdDY0SHVpc0hkMmlDd0EvUVROYkpOLytFZDBD?= =?utf-8?B?NWl1NmNxb1IzY05uQ2UyMlJhMUxscENrRS9wMWlaNkNlNGVsWkV6K1N6T2Za?= =?utf-8?B?a2l4bUlPa3JzWm1FS1dlTGJSbHhhZHlDUHpoc0tUTTVPVEZWamhXM21HZFdj?= =?utf-8?B?dkZFbC9mTE41bkloM2tGOEd1eENYaXR1aExFQ3hiTFdObGRqR205YjlGTVY1?= =?utf-8?B?STRXUGxWYjFTczR6YkM0bE5zU1FyTFdUYzRDRHIxUmJmZUprSmMyYmt6TlF2?= =?utf-8?B?MUNCUXllUUg0MkRMbGRjT3pud1FrSTBkMUo1dVZSRTg3ajl3WGk5OVY5MTMx?= =?utf-8?B?WlcvOENHT09HOUxyaXRiTHdZTkVobVIwRUJvMlVTRU9FNHplcFpaQ01RdnRw?= =?utf-8?B?M0tjVkxUWWMxclNQeWdKRmIxclNnYmF6YmphZjVVZnRJc0J3K0lQY01KVHZY?= =?utf-8?B?R1QrdXVWRkt3RDdPMC8wWndsMUxnL08ydjFIbm42VXkyVnpsV3ZFTVB3SE95?= =?utf-8?B?enVWaUd1ZFQxa0JYSzYxOEVLTDR1enFmUUVVN0RrS21jQzNrUUJZRlg0d016?= =?utf-8?Q?l2RQQcJoCur/fQ+79uADaz0KTmDqAc=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(1800799024)(366016)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?dk40Vk9iY1U1SlpuampiS0xZWjZzMEl3a1gzQ0F3THZ5dEFURm9VUStlWFJr?= =?utf-8?B?Zlh0SzcxKzBkV085MHF6aElyL3dmRDVDSmp1Q2FFVG4xUklDc1BXOTRuSUZK?= =?utf-8?B?eCtGcjVSTVFtOTEzbEszWURhWEhkYS83YlZZdEkwMDB0azRzS2xpaTFhaFVo?= =?utf-8?B?bWxNS2kzQUJ0Z2UvTXRyaDNDOHhrdGNLVEhWRmo1RnNtQTBsQTI5TFltZEFI?= =?utf-8?B?YTRYRi95MUJ6UjNOU2lGc2N5eTBuY3dPYWlzb0ptc1IxUExHUnlKNE0yZ0kx?= =?utf-8?B?YmFpR0hqNVJEZkh5TERmaHlzaTZLMEJZZVpQUnRJeEl1K3R0TkpSRmU4dDlN?= =?utf-8?B?b2NDcFlRZDNwQTdhZjZnbjhzam1odjBDQjhxQWI1L0xLRXhQSFgxbG5tOGt2?= =?utf-8?B?dkRVcEFiNHhvQkRjTk1lS09EOVRGTnlHNS9TSHNNbmF6TWVXcWFFUGIxYnZI?= =?utf-8?B?b3FGSG9sRjJwVHdtOTluZU1wNnlEajVCQ1daZ1gvVEl2dU1uV01XdFVnMGdY?= =?utf-8?B?WGozSG4yOWNheWJxTGVXanAvRG9TTXROUk41TUxuaFJNb3RKWlNsUk1WZHpj?= =?utf-8?B?aVlhb04xSllBK3dhQ0wyckJpTWx4cG9iem9wSFlBYzlHOWxYejNkYjRPckJX?= =?utf-8?B?azZuejJNWkltYmY2Nm16R3F2VFFHdHVRTExXSjBHNkFNalBib2Jpd1dxbmxt?= =?utf-8?B?UTBWeDk1SDJLeG9hWHltYmJmUVRraWJ0ZGZscHd2QmJQTmtweERLb1dpY3VL?= =?utf-8?B?Mis1QnJiVTZEVi9WODNqalp2WktYK1FuV3NTVjJGRkVkT25LcERjVjkva3Vn?= =?utf-8?B?QUtyMkRHdlgyNlIrQjl6K0Fydkp1ZVFiMThlNXczWFZWNCs2UUtMbjdIYTAv?= =?utf-8?B?L2Z3U1hvelFKL0tqRm5vdFpKVnBNNFRmblBWMkp6Y1FicEVyZDlZTHhYY3Zm?= =?utf-8?B?TTRJUzd1TldTTWM5UlA5Q21JWTZmV0tuc3dNcytpNWg0L1Q3Nmt5S0plamEv?= =?utf-8?B?NU5vRTRkYmNVbDBlTG1BekIzbmY3WTR6TmhUaW9ZMUx6cEYyQXNsckNGWiti?= =?utf-8?B?Y0V1RFJGZUdjZFhpN21welIzUVJwQ0VwODViR2tHMHhYSlh5aXJwamc3Y1Uz?= =?utf-8?B?eCsvaEorMmVUc054Qm5qWUtMdkN5amlSWDNObkZISVFSbHRjZnlhM0ZTbGxY?= =?utf-8?B?S3JTQVlJckxwS2FkcnNIa2JFRVEwWWo5ZDlUS2x2dFI5NHFpZlE3VHVlNXAz?= =?utf-8?B?TjFQZ0FSWjFPakMwa3MyTkFKRmxoc3hoSEUzSk1TaW94dzZFSGxleEtFWm0z?= =?utf-8?B?Y0t3R3VFSmhvM2Y2c3EvUHhFVWJwTER0VTFlOHZtMXV1Vzc1Zzh4U203cHN5?= =?utf-8?B?ZzF0enZQSU8vNDJMSXZJejNuVnk4eUxEcmJuWHNJK1VsSjBhZEhzTmtuMGlF?= =?utf-8?B?MTM2M0NsRDEyNFJ2SWoxNVJGQ21GeXdiSTVOcDR3TGZlanBvRk96VWhIanF0?= =?utf-8?B?T1NlQjRRSXNIYmY5SzBCb3RtdEw4d3FNdlVQUlQ1emdCZlNFZFNpbitWVE9s?= =?utf-8?B?QU9Xa29GR2d0TlRuamF4QjEzQm02b2JBY1hHaXpXYU5jRXhFNXh6VzRhUjkx?= =?utf-8?B?S2xNQ01VMHNsRnNZMUVRdWU1TjN5NzdhOFQwTG9admJOQ0N2T1ZXcnlEUDV3?= =?utf-8?B?RkRwcmFIOWhrbngxUmxWSitNVEZVMSthOHN2dTlGVWpnQTRiL0o1UmZrK2Vm?= =?utf-8?B?R2lsY0pKbE12aHZmSENCNFBYKzk0UmxSdzQwV0g1Yi9qTERvb1hCU05SS1RJ?= =?utf-8?B?eEhtR1YreUxtZ3hUamxINGtWNFZOT05mZjA5TXZOa0h6R0VkM3NHd1hXbVNx?= =?utf-8?B?VmtvZ1RCNURzZzJpTE4wdkw0RURFb1Jtc2I2TVovbFFHZzBYVVMzVjBXY3JM?= =?utf-8?B?Qlk4a2JCU3lkTFU4UnpvbkY2ZTFNUjNMUlZ5TEJ4c1RxNGxyVG5GeDhNeHRt?= =?utf-8?B?c21uaENMQnBCWmJvUzQrZFNDRndCVmJOQ2pJY3lEY2RlK1IxVEVoaElSanFn?= =?utf-8?B?emY0cEJhMzE0WHgvWDQySUo5ZzM0V3dwUVlIVCt1amhGQlZjaDNYSHpZdVFk?= =?utf-8?Q?YmfsVwrtrLSHnvMmnSJh9NWQi?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3df0926f-113c-4be6-26c5-08dd90f43c1f X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:01.3461 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: URNveDJlyOue6Qhbpi0UnEYcAvqM4FSJoG+tGQe2R7HV2OTlVjDG32O4cgWIxpursnrmdQX22Wwns+Ti16KzUw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR11MB7953 X-Proofpoint-GUID: eDv24CPFnK76PzMtQoXB1OPliLvczo4f X-Proofpoint-ORIG-GUID: eDv24CPFnK76PzMtQoXB1OPliLvczo4f X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX0Qx115e6vAwE JjXI4IjDRXtQOcTP9GPnTy/WAKrVWb8vkFLvKxTDFlyJcFQe25MMc+Ir6CFPTtl5a815PAyq8UU Oxpic+D2aaq8MRwCC7iieUL42LT4uPK1ana2YwajLsx+TbEuLIYciLaxd4M/z30piqLORIfN2it yERj1O8WHj/S35zMEeRXvNLKfm6WJDlEjhnwdN0nITDFbaqAfPZCCtjAx4P6bpaxOQqch3Qf2AZ P2/pKjfR9/WOzLdxiwwFtPZyS/pCLAMRta4YwEnbqzUzxrNqhERAFLiKhNlW75yBvbAV2RGMlR2 wCIVIvrx1YikBlxrnn6PPjxUrxYJ4WJLifXTXb+E3LomtdAi42L+r25VK7e28mFmtagGNX2cnAw UbiBMuGQIxYMhh/KB8mvZXzvPftPyoq4PgLoeolhzIYfphkNr+BihD9BSX9GJBlXTcQJX7YS X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214ea5 cx=c_pps a=X8fexuRkk/LHRdmY6WyJkQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=rdBUWvkrBW2bLS41O5wA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=999 clxscore=1011 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 Implement a very basic transmission path for endpoints. Transmitting involves the following flow: - user call cpc_endpoint_write() with the SKB they wish to send - a CPC header is prepared and prepended to the frame - SKB is pushed to endpoint's holding queue (*) - SKB is dequeued from endpoint's holding queue and moved to interface's transmit queue (*) - interface is woken up by invoking its wake_tx() callback - interface work task is now responsible for dequeueing and transmitting that SKB when it's convenient for it to do so. (*) Endpoint's holding queue currently serves no purpose but it will when other protocol features are implemented. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/Makefile | 2 +- drivers/net/cpc/cpc.h | 15 +++++++++ drivers/net/cpc/endpoint.c | 33 +++++++++++++++++++ drivers/net/cpc/interface.c | 40 +++++++++++++++++++++++ drivers/net/cpc/interface.h | 7 +++++ drivers/net/cpc/main.c | 50 +++++++++++++++++++++++++++++ drivers/net/cpc/protocol.c | 63 +++++++++++++++++++++++++++++++++++++ drivers/net/cpc/protocol.h | 19 +++++++++++ 8 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 drivers/net/cpc/protocol.c create mode 100644 drivers/net/cpc/protocol.h diff --git a/drivers/net/cpc/Makefile b/drivers/net/cpc/Makefile index 81c470012c1..0e9c3f775dc 100644 --- a/drivers/net/cpc/Makefile +++ b/drivers/net/cpc/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 =20 -cpc-y :=3D endpoint.o header.o interface.o main.o +cpc-y :=3D endpoint.o header.o interface.o main.o protocol.o =20 obj-$(CONFIG_CPC) +=3D cpc.o diff --git a/drivers/net/cpc/cpc.h b/drivers/net/cpc/cpc.h index cbd1b3d6a03..2f54e5b660e 100644 --- a/drivers/net/cpc/cpc.h +++ b/drivers/net/cpc/cpc.h @@ -7,6 +7,7 @@ #define __CPC_H =20 #include +#include #include =20 #define CPC_ENDPOINT_NAME_MAX_LEN 128 @@ -24,6 +25,8 @@ extern const struct bus_type cpc_bus; * @id: Endpoint id, uniquely identifies an endpoint within a CPC device. * @intf: Pointer to CPC device this endpoint belongs to. * @list_node: list_head member for linking in a CPC device. + * @holding_queue: Contains frames that were not pushed to the transport l= ayer + * due to having insufficient space in the transmit window. * * Each endpoint can send and receive data without consideration of the ot= her endpoints sharing the * same physical link. @@ -36,6 +39,8 @@ struct cpc_endpoint { =20 struct cpc_interface *intf; struct list_head list_node; + + struct sk_buff_head holding_queue; }; =20 struct cpc_endpoint *cpc_endpoint_alloc(struct cpc_interface *intf, u8 id); @@ -44,6 +49,8 @@ struct cpc_endpoint *cpc_endpoint_new(struct cpc_interfac= e *intf, u8 id, const c =20 void cpc_endpoint_unregister(struct cpc_endpoint *ep); =20 +int cpc_endpoint_write(struct cpc_endpoint *ep, struct sk_buff *skb); + /** * cpc_endpoint_from_dev() - Upcast from a device pointer. * @dev: Reference to a device. @@ -137,4 +144,12 @@ static inline struct cpc_driver *cpc_driver_from_drv(c= onst struct device_driver return container_of(drv, struct cpc_driver, driver); } =20 +/*------------------------------------------------------------------------= ---*/ + +struct sk_buff *cpc_skb_alloc(size_t payload_len, gfp_t priority); +void cpc_skb_set_ctx(struct sk_buff *skb, + void (*destructor)(struct sk_buff *skb), + void *ctx); +void *cpc_skb_get_ctx(struct sk_buff *skb); + #endif diff --git a/drivers/net/cpc/endpoint.c b/drivers/net/cpc/endpoint.c index 98e49614320..4e98955be30 100644 --- a/drivers/net/cpc/endpoint.c +++ b/drivers/net/cpc/endpoint.c @@ -6,7 +6,9 @@ #include =20 #include "cpc.h" +#include "header.h" #include "interface.h" +#include "protocol.h" =20 /** * cpc_ep_release() - Actual release of the CPC endpoint. @@ -18,6 +20,8 @@ static void cpc_ep_release(struct device *dev) { struct cpc_endpoint *ep =3D cpc_endpoint_from_dev(dev); =20 + skb_queue_purge(&ep->holding_queue); + cpc_interface_put(ep->intf); kfree(ep); } @@ -51,6 +55,8 @@ struct cpc_endpoint *cpc_endpoint_alloc(struct cpc_interf= ace *intf, u8 id) ep->dev.bus =3D &cpc_bus; ep->dev.release =3D cpc_ep_release; =20 + skb_queue_head_init(&ep->holding_queue); + device_initialize(&ep->dev); =20 return ep; @@ -165,3 +171,30 @@ void cpc_endpoint_unregister(struct cpc_endpoint *ep) device_del(&ep->dev); put_device(&ep->dev); } + +/** + * cpc_endpoint_write - Write a DATA frame. + * @ep: Endpoint handle. + * @skb: Frame to send. + * + * @return: 0 on success, otherwise a negative error code. + */ +int cpc_endpoint_write(struct cpc_endpoint *ep, struct sk_buff *skb) +{ + struct cpc_header hdr; + int err; + + if (ep->intf->ops->csum) + ep->intf->ops->csum(skb); + + memset(&hdr, 0, sizeof(hdr)); + hdr.ctrl =3D cpc_header_get_ctrl(CPC_FRAME_TYPE_DATA, true); + hdr.ep_id =3D ep->id; + hdr.recv_wnd =3D CPC_HEADER_MAX_RX_WINDOW; + hdr.seq =3D 0; + hdr.dat.payload_len =3D skb->len; + + err =3D __cpc_protocol_write(ep, &hdr, skb); + + return err; +} diff --git a/drivers/net/cpc/interface.c b/drivers/net/cpc/interface.c index 6b3fc16f212..1dd87deed59 100644 --- a/drivers/net/cpc/interface.c +++ b/drivers/net/cpc/interface.c @@ -58,6 +58,8 @@ struct cpc_interface *cpc_interface_alloc(struct device *= parent, mutex_init(&intf->lock); INIT_LIST_HEAD(&intf->eps); =20 + skb_queue_head_init(&intf->tx_queue); + intf->ops =3D ops; =20 intf->dev.parent =3D parent; @@ -154,3 +156,41 @@ struct cpc_endpoint *cpc_interface_get_endpoint(struct= cpc_interface *intf, u8 e =20 return ep; } + +/** + * cpc_interface_send_frame() - Queue a socket buffer for transmission. + * @intf: Interface to send SKB over. + * @ops: SKB to send. + * + * Queue SKB in interface's transmit queue and signal the interface. Inter= face is expected to use + * cpc_interface_dequeue() to get the next SKB to transmit. + */ +void cpc_interface_send_frame(struct cpc_interface *intf, struct sk_buff *= skb) +{ + skb_queue_tail(&intf->tx_queue, skb); + intf->ops->wake_tx(intf); +} + +/** + * cpc_interface_dequeue() - Get the next SKB that was queued for transmis= sion. + * @intf: Interface. + * + * Get an SKB that was previously queued by cpc_interface_send_frame(). + * + * Return: An SKB, or %NULL if queue was empty. + */ +struct sk_buff *cpc_interface_dequeue(struct cpc_interface *intf) +{ + return skb_dequeue(&intf->tx_queue); +} + +/** + * cpc_interface_tx_queue_empty() - Check if transmit queue is empty. + * @intf: Interface. + * + * Return: True if transmit queue is empty, false otherwise. + */ +bool cpc_interface_tx_queue_empty(struct cpc_interface *intf) +{ + return skb_queue_empty_lockless(&intf->tx_queue); +} diff --git a/drivers/net/cpc/interface.h b/drivers/net/cpc/interface.h index d6b6d9ce5de..1b501b1f6dc 100644 --- a/drivers/net/cpc/interface.h +++ b/drivers/net/cpc/interface.h @@ -22,6 +22,7 @@ struct cpc_interface_ops; * @index: Device index. * @lock: Protect access to endpoint list. * @eps: List of endpoints managed by this device. + * @tx_queue: Transmit queue to be consumed by the interface. */ struct cpc_interface { struct device dev; @@ -35,6 +36,8 @@ struct cpc_interface { =20 struct mutex lock; /* Protect eps from concurrent access. */ struct list_head eps; + + struct sk_buff_head tx_queue; }; =20 /** @@ -58,6 +61,10 @@ void cpc_interface_unregister(struct cpc_interface *intf= ); =20 struct cpc_endpoint *cpc_interface_get_endpoint(struct cpc_interface *intf= , u8 ep_id); =20 +void cpc_interface_send_frame(struct cpc_interface *intf, struct sk_buff *= skb); +struct sk_buff *cpc_interface_dequeue(struct cpc_interface *intf); +bool cpc_interface_tx_queue_empty(struct cpc_interface *intf); + /** * cpc_interface_get() - Get a reference to interface and return its point= er. * @intf: Interface to get. diff --git a/drivers/net/cpc/main.c b/drivers/net/cpc/main.c index dcbe6dcb651..8feb0613252 100644 --- a/drivers/net/cpc/main.c +++ b/drivers/net/cpc/main.c @@ -7,6 +7,56 @@ #include =20 #include "cpc.h" +#include "header.h" + +/** + * cpc_skb_alloc() - Allocate an skb with a specific headroom for CPC head= ers. + * @payload_len: Length of the payload. + * @priority: GFP priority to use for memory allocation. + * + * Return: Pointer to the skb on success, otherwise NULL. + */ +struct sk_buff *cpc_skb_alloc(size_t payload_len, gfp_t priority) +{ + struct sk_buff *skb; + + skb =3D alloc_skb(payload_len + CPC_HEADER_SIZE, priority); + if (skb) + skb_reserve(skb, CPC_HEADER_SIZE); + + return skb; +} + +/** + * cpc_skb_set_ctx() - Set the skb context. + * @skb: Frame. + * @destructor: Destructor callback. + * @ctx: Context pointer, might be NULL. + */ +void cpc_skb_set_ctx(struct sk_buff *skb, + void (*destructor)(struct sk_buff *skb), + void *ctx) +{ + skb->destructor =3D destructor; + + if (ctx) + memcpy(&skb->cb[0], &ctx, sizeof(void *)); +} + +/** + * cpc_skb_get_ctx() - Get the skb context. + * @skb: Frame. + * + * Return: Context pointer. + */ +void *cpc_skb_get_ctx(struct sk_buff *skb) +{ + void *ctx; + + memcpy(&ctx, &skb->cb[0], sizeof(void *)); + + return ctx; +} =20 static int cpc_bus_match(struct device *dev, const struct device_driver *d= river) { diff --git a/drivers/net/cpc/protocol.c b/drivers/net/cpc/protocol.c new file mode 100644 index 00000000000..692d3e07939 --- /dev/null +++ b/drivers/net/cpc/protocol.c @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#include +#include + +#include "cpc.h" +#include "header.h" +#include "interface.h" +#include "protocol.h" + +static int __cpc_protocol_queue_tx_frame(struct cpc_endpoint *ep, struct s= k_buff *skb) +{ + struct cpc_interface *intf =3D ep->intf; + struct sk_buff *cloned_skb; + + cloned_skb =3D skb_clone(skb, GFP_KERNEL); + if (!cloned_skb) + return -ENOMEM; + + cpc_interface_send_frame(intf, cloned_skb); + + return 0; +} + +static void __cpc_protocol_process_pending_tx_frames(struct cpc_endpoint *= ep) +{ + struct sk_buff *skb; + int err; + + while ((skb =3D skb_dequeue(&ep->holding_queue))) { + err =3D __cpc_protocol_queue_tx_frame(ep, skb); + if (err < 0) { + skb_queue_head(&ep->holding_queue, skb); + return; + } + } +} + +/** + * __cpc_protocol_write() - Write a frame. + * @ep: Endpoint handle. + * @hdr: Header to write. + * @skb: Payload to write. + * + * Context: Expect endpoint's lock to be held. + * + * Return: 0 on success, otherwise a negative error code. + */ +int __cpc_protocol_write(struct cpc_endpoint *ep, + struct cpc_header *hdr, + struct sk_buff *skb) +{ + memcpy(skb_push(skb, sizeof(*hdr)), hdr, sizeof(*hdr)); + + skb_queue_tail(&ep->holding_queue, skb); + + __cpc_protocol_process_pending_tx_frames(ep); + + return 0; +} diff --git a/drivers/net/cpc/protocol.h b/drivers/net/cpc/protocol.h new file mode 100644 index 00000000000..b51f0191be4 --- /dev/null +++ b/drivers/net/cpc/protocol.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#ifndef CPC_PROTOCOL_H +#define CPC_PROTOCOL_H + +#include +#include +#include +#include + +struct cpc_endpoint; +struct cpc_header; + +int __cpc_protocol_write(struct cpc_endpoint *ep, struct cpc_header *hdr, = struct sk_buff *skb); + +#endif --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 1FBDE211A3D; Mon, 12 May 2025 01:28:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013310; cv=fail; b=OZnGggMiiITl4YxDnOxU4TkHxFmUfJnFqPp/LEfBnOv6UA+5yp6CA1ZW5gZ1D6+TJvXCWNfpLk9nPo9fWkQlPFOlstqz9aLmuXchjEpS0qUQh4HII3t9+2rmUnogN+TVUDiozEHhQvFoNxpl1zH3LXdZhS8EI3RSafc3vLy4ODY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013310; c=relaxed/simple; bh=xKLxqVI75B+T0nmkriO4U748a5AiEtsRMrKWFKfl3cs=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=TbegBiSoo25Euhgs0KmMFzKORH+10Zz73VQ/buq5d+ZwFR5R6YgdLRaKs+CtZ2fQ1JokaJO0idPq/CxUI2JKJvvTE9aZxdJerRp7ZttTPT1nVyCD8hOCx8uT6v6If7Y9Y2btgoeW6zKqVnhB7zcqft+HTiO7fQZid0YPZqhVmtg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=xfN2LCl+; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=U5SYT+mj; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="xfN2LCl+"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="U5SYT+mj" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54C0dSZD021480; Sun, 11 May 2025 20:28:06 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=hiB/HACrcA1C27eSnxfZKkcUqdmXdpKawXLNSKb4KTI=; b=xfN2LCl+LaOQ OliQzu+hh5pCbzvJUIB6KjYs+0ldcSpJW+u4R43Pn+OkcYI8dnWEhCLpc/Uk72g5 hHO7+gjb6qeV+pnn2vsBqymWxEC3TDwfQorxaU22o2SoeFuwKYmWSrkghJqkhGeX fZmPXyJYssD36IX1hz3fjMoE8IuVlpvhnJyGP/kWDkP+wC+A8khTM8891WvY69Ca 9L2eIq4YvSB1za/nT87g7q7zVqckGfUmV0S/1fXoY0Gevc9DXN5Sx7sPpk1xyUNE QghzEzBBgU/3gFnF/pOjo4jgKhSJU90zH3p+UN+Yw33pgYBJbQ0QIvbV0VCU+07f 6jhlSdCWAg== Received: from nam11-bn8-obe.outbound.protection.outlook.com (mail-bn8nam11lp2176.outbound.protection.outlook.com [104.47.58.176]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw6-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:05 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=jZVexzX571T56N7qoppRrb9w41NnPUr6RkizKtp8GQB50G5Yld8ChF7Z5oYM6r+5p87fTq5Lt2k5Pfn2s+hG+PTRbkaoCKGCdTDaAmazpXUNLJhvBys+2IXkX9j356gbm5C0XBwlBlagUoaQtHInxbvV1tLK47QuW0kIRnh0J24Vfju1VJIlFOFmYEplV+ZOI06iKsgVwfcEhimNI8FxNB7PU9XstaM60q91q7KDqsmqG+LC196wo3i2+kcSayUmzIZcbrmvJLX8mjGxV5nNIpBeBkD50XKvrJEa7e8bRUIXtIimvgTNYTXg/c2oiJtI4mApvYpGflFQL/fFf5DBcQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hiB/HACrcA1C27eSnxfZKkcUqdmXdpKawXLNSKb4KTI=; b=vgIMECRvTa4DOdbfRQ5GrHWSK/uhn8qsyLVyd0W+bBBM6kTMlcJj+RX02BewGZIIUAQrPDSX0iT5Q1cW1uqYx7iwCZqJtEuuj5LEGYFPIpD2ClcqSZb+DhNRAZTcbIxO7KpF01duJy+5o+Pl1CpOVUDjP3jgQGdJygs6zJEBXDMbriamwpbG5qKkXLLGKa6fV7j4/HviRExYi5avmkDRvTgEUzRrFJ2Xx+sxb0WVhf5bR4CodW2cQ0aRz3hqWU3kPX7V+VIFx2JTCBI0+dUSHSIyQWPLYkJomk6nUdOPOCgt6Dyv/RT3hXsriTIjsYLnw8AJH0MwyidXVFbtJrA0vw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hiB/HACrcA1C27eSnxfZKkcUqdmXdpKawXLNSKb4KTI=; b=U5SYT+mjyoyaysXu2kD6cIHcEWC3kur7L6VRuhtZhBrZxqFCxWPp+GMSf8ARO71WVyP5jfbF8w5FA7VcdjvBOnzo7rnIkMWcRh1PW9hKVr5v7e18iOem0A1uTYwsfRSJa0OrQIyjGvFMLREy8z+BGuqYhrZmfB/NlxUJHkNsPp0= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by IA0PR11MB7953.namprd11.prod.outlook.com (2603:10b6:208:40d::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.29; Mon, 12 May 2025 01:28:02 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:02 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 06/15] net: cpc: implement basic receive path Date: Sun, 11 May 2025 21:27:39 -0400 Message-ID: <20250512012748.79749-7-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|IA0PR11MB7953:EE_ X-MS-Office365-Filtering-Correlation-Id: 1cb4743f-75e7-4370-b104-08dd90f43c9d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|1800799024|366016|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?QjRnZ0Vsc0dJajBlUzBxaUxtZm1BUnVYNFQwbklSclZORGZJTlAyK1orQzBr?= =?utf-8?B?RUdOVnZFRHhjWmtORUtwSE9yMXQ0Tnk0bnpWUGE0dGo1MHZKOGpObUQ3OTJs?= =?utf-8?B?cDZzTXg0MFg2WWVrOVNBZ0tzTlJUSlhiOTdDQnhLenl6djRGelVNTXdxTGxQ?= =?utf-8?B?dUVzQkdHVzZxOXhFZW9GblZCUjdDWUFXaGxiM1pTcWJZbGdpMUwra3c3QlRG?= =?utf-8?B?RmNoUDRaczVsblhkeGNNZ0V0bERpNHZUOXdhUjZZWTg0d2hpZm96WmtMNTh3?= =?utf-8?B?TUM1aG9GQndXeGZQQWVqSEh6NXJTKzlkMW93RWJ3bGMwQmFPQXp1T1NOMVRz?= =?utf-8?B?UjhLYitzVCtsVURPQW5kMTFGbjlIWkhMZEw0RnoxRlYxR1dnU2hXb2I4UVo0?= =?utf-8?B?d1AvSklkYnRkNkZkamszOER4Z0xQTTNsSUdDZUJmb1ROK2dRQ1NOUy9XdElN?= =?utf-8?B?K085TmJGaCtaR2NCeVpCdHVwaldKRlFKZ1Q2d2FXSUk0L0ZBSFAyWmtCYXky?= =?utf-8?B?UlVkdDJWcVhKalBYMnZLNkJjSVBac1pRTVhOWExwWUJiM2trVHM0dkpQZjhI?= =?utf-8?B?WFlxMkhJanRHeXdrQ2FSTHE2VHlBdThsMm5GVUhSNjRtT2RCcytkRlREc2Z5?= =?utf-8?B?d3ZqeWJwVzhtMXpoVjYxOGZnWjJDWE5Ka01oWFNaRnFsZkc3bGNqN0pNVmRm?= =?utf-8?B?bk9TREszMThiZGx6VS9EOFhwOVh0QkZHNmdyM28xMWxJUDh3NjdKZUxYVDln?= =?utf-8?B?MTBJdXZyRytJM2R0SlZZVmVSaWdSZnViaFFWbnc3bExGNnZiUmFMWlpVeXlW?= =?utf-8?B?UDRudWliR0wrbUhuUHJSZ0xJbzRYN1I4Mnh2dEJQNkVmQnJNcitPQkZDL3dp?= =?utf-8?B?cXBmWS8xZFdPa1ZxOFFsQ21yRG5sZTRBSnk2WmMxeGtZMy9OcG1tVFp0aWV6?= =?utf-8?B?dWV4Z29IVXNyVW9sYWgzeXQ4Q3lLTnJ1NG5jLzhWUXNYeHVrMVkycDFrbGpn?= =?utf-8?B?Tm80RHhoTHYyaU13RlJvOHRwNDBFcld0UWtSWExxNkNGalJsYmFWeTV6STdY?= =?utf-8?B?RUQxSkJIQWRrSEhJOGI3VjhiZzNsY3pwUWJQdlQ2ZDd5NjV0MlZTSG9DTzNq?= =?utf-8?B?N1pOMlFyeDA5ZDB2aHlOdHN2RE5GUWNHVVVnNU9yZVFPNDRyMDJQOGVUcEVC?= =?utf-8?B?OGpKc1J0UDdpTWpOMTFQRW03czA5cURFZEVaWW5nbEozSjFZUFFOTENyU0Jn?= =?utf-8?B?OFN1VkZnczNieHR0Y3ppSXVOajY1TDhneXB5WHhSNnB1WHRmSHdVLy95ZkNS?= =?utf-8?B?aXVFZFNaRWRHUzF5dUtCWEpTL2J5ZnFLa1JMYWg1Zlp0SitjUi9YZHNzMEhV?= =?utf-8?B?M29JQnhJQlV6RHJmbmwxYXE4d1FJZGNWUm55UjlmSnRzdU5LK2VGLzFaTGhG?= =?utf-8?B?MHFXMTY4Qk1ZaktLMjVESjk5TU9ZbWpzYWpoMmladFp1RWlGVCtMTmE1a05x?= =?utf-8?B?MnFUc2cyejQzc2ZHaUttZ1gvd3JFMFRxcUlDQmkyeWRMNmo5b0lsLy84Ui9x?= =?utf-8?B?MFRpbUNUUkpTYkZFUGZQd1o1MGV2UEVUNXJEaGgxa0VHdEZWemJ4T2I5VWFD?= =?utf-8?B?VU1lN041cjJERjFqeUNIV3luSXFqcWo2Lzd2a05XbWUzdFYxQ0Rlc2pPWTBZ?= =?utf-8?B?UFcxRzhLUVIvdXZIK2xEZWpSMkNINXBDeUt2S0M2ZGdOSmFmUXNWYnFmVi9i?= =?utf-8?B?N0w5Nzh3QnVuN0xFMmFBME11eDM0UEExcis4Z0Q1dVN0L3BxekdSNjV0eXhy?= =?utf-8?B?SHlHNXZ5ckNaLzh3bzhkdk81RWhNWDU1Zm5iZUtzeXZZTE15M0MvRkdoRVRB?= =?utf-8?B?d3VXcTZTOCszblc1Nk9wcTdWb042QTM5c244b3d1S3hpZEY0SnhacHZ5WW1E?= =?utf-8?B?eVM5aTZzSEtGd3pESDNjYXVSN0ltVHB2RFVUM3ZDVUU5YmVNT1pxTmxxZFBw?= =?utf-8?Q?AsUHf6vuF7DGbTi5BJiKpOFLfitA3s=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(1800799024)(366016)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RGI5OVNqVWt4WGdsQmdmTzJzSFlpSkUxSjYyUGdqY2Zidit1bTF1NkUrZHF4?= =?utf-8?B?bC9UdDQza2tjWUt1TnE1TWpXSTFuMUpYVzRYNXlCbGhOTVpKclpVb0lhVE1j?= =?utf-8?B?VFhOTmFzNDY2YnNwd1lLTWRLV0MrckNYTm5KUm5IclBQdXJOUjBiZjZQTDQw?= =?utf-8?B?cmgvaWEyaTczTk1QdVc2NHBDbzhEZzJxbnNMRzNoV2NKMUs3dGhWbGZlY0VR?= =?utf-8?B?NEZsSjc4dGxjMW5zTkF3VWVYUTVCNEE1YjRLT1BtVU1aYktVNnlrdXNsOG5v?= =?utf-8?B?a3NPeVN4VE9SVG05aDBiUVFrbEdmMFozN0I0eUNKSmR0UnAzOWQrM2MrN3dj?= =?utf-8?B?WklvMjBuTE0zaTYvYnNGVzY0dDczRmpONm5nMnhXUThRN0FtOG5BVkN4MXQ2?= =?utf-8?B?UVIzc1J1M3ZPKzBmdFc0anROVkFKc1ZTMTlWM3BXZmVlT2tnc3hpYkIzcHFM?= =?utf-8?B?c1Z3STBEVHEzYjZHRGt1dGRIVUl6S2NRWXRpWk05Q0s3WjBaWXd5aURiejNI?= =?utf-8?B?ZE40Zkh3NkZ5U3NGVElXd2QzQ005TXNUNElZd1dDYUMvRWRUcld2MTBkV2Mx?= =?utf-8?B?RnNmSEtWT21pOVFWYTB0clB6WFhMaDhDaUlFNGdYSTNmNHV0aUd4SDd0RTlS?= =?utf-8?B?bFRFZUl6eVpuay9BeGw5bHJWaU1hZ09pTHpBMnRBUHBpZk1FdnlWRjFoY0ZL?= =?utf-8?B?dUVQYUt3OU85bW5MUHlWbjBkR3A0d1BpVVpQMDVNYWMxMlozRm1iOXBidXFl?= =?utf-8?B?MlQ2UGg1TFFNczZFaUdzR1E0UE5QbllrTGdTWTZJTzQxMWIzREdUYkJuTUk3?= =?utf-8?B?K3dES09Eb3FTOFZxejBaNFRRbE0rYTVnZG5nTVE0ajlKcUNob2FEK280T3VU?= =?utf-8?B?Qktzb2tvUzNsUHErNm8vWHJ1UFVCcWNZSnI3RzMzUjB6VHhxNzJSdnExSnN2?= =?utf-8?B?cGlkak8yZVBRU0FLcjJONVp4QkJUUGQvbHMvcGdzenZ1cTk4SFVMV3d1Ymk4?= =?utf-8?B?RVAzNDh5ci82Q09icHhSSUFXdmUxVVkraklhNE01aTRlVVdMZm9RL3lKOGow?= =?utf-8?B?Wld0LzhJRVlEQkwycnB2QmVHbUsyODFNamZmSmwrK3BEaUpvbVhJSWtoQllH?= =?utf-8?B?d3ZMaVA3NnRsbENPWDNaQjM2MldwS2krRm9saUpnSWx5SkhGQUJ6QmZFYlox?= =?utf-8?B?YmxSM0FXN1c1dUZWb2ZucnBRRXJYSFdDMGdwVGMyMjFVRVltTFljQ09ZTlhD?= =?utf-8?B?TXFTekpvb2lTUlJRZk5GaHR3UlNBUjE2QjJkamp6UjRjYkdMN1lvR0VXTW5N?= =?utf-8?B?bDhJTmFML2tvd2N0Ry9HSUxPM2dnS2NWQWVGbTFLMlZlc1RPQWFQUG4vcldE?= =?utf-8?B?SFdEbUlHWlF1b3hKT2FvRVE0ZEszUm1EcWhpbG1jN243ck1EQXQxWXRYR1kx?= =?utf-8?B?THNWNHNXUDFxcE5IVVpNV1hraTNZQnVWNm54Y2hsT0Vwa09xZTlWZ0JTVXNh?= =?utf-8?B?VGVIY2FuOXY5OWJRT2ZqUG5OT1B3VG53S09nVFk2dm16Q3JrcHRVajFHbmkw?= =?utf-8?B?REdkRGJoWURzY0srdU5CS0tpWXJ3cjQwdSt0VExrelJNZU5PeWJDT01NMWdY?= =?utf-8?B?VXl5c0s3emI4cXVpK3hnYWVMTXV3Vld4M0VBVjJDK0ZadHplRmZKTE9vc0FC?= =?utf-8?B?dkYxNHBWOEVIL3FJOVVVZzI0R0dPNGlibW5OVUgyeDFSOGZVVkQ2cWVlUlN6?= =?utf-8?B?YitSR1h2M0dZWGFQT0ttR0VlN2FiYzhSY0hyQ1pEWDhId2QrZWM5WTJ3a3Rk?= =?utf-8?B?SHlZNHp6aGlqWGhMYnlscU5zVGZNRlZtRkVuZHZRQjdrVFpFbVUzNkluQUU4?= =?utf-8?B?b1dqSys0Yk5rcXBmOGQveW94Wlk4K253VVRVRVh5N2kzdUloeGh2MXJGa2R6?= =?utf-8?B?UUtoUkhsdGJyTldJdVZQNW00ZXlYNU9GeFduclZGZmFPRGlCbFE1bTdhRUxV?= =?utf-8?B?aTNBYm1BYzgxRUxWOERCdHk2TlRxQ2I0MVRlb0RLVjYxajQySmRWNExoOFhB?= =?utf-8?B?SFZHRzd6ZEtGemdGTDAyOGVTck0zcW5lTGhCelZoNEFtVXo4Y3lORzIwUUlV?= =?utf-8?Q?O7XzLxnRLFIcIUqscNp0WhqaN?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1cb4743f-75e7-4370-b104-08dd90f43c9d X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:02.1685 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 7GPFCejTBIuoXuFglYhDiaDY96V3np7GMuW2iz2xZTKkEKKnFUPujqpPHKkuw5zrFw+REw/YdOa3WIV/6JJuyA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR11MB7953 X-Proofpoint-GUID: oCi3p5LiMFmz3gQG5IFeSSxUI7wYfMUm X-Proofpoint-ORIG-GUID: oCi3p5LiMFmz3gQG5IFeSSxUI7wYfMUm X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX4GuKO0Zy9SCD dtxt4Qn5V/33+Ag4B3Z9n0HrCAxqmUXMYsP3h3spBoHS/rRz7IoQ4l3O0E7bFUAKzQLPkw3tFaj EYy1fHF4B7nj5d2MZR8rki60UdK0/SQoSEpU2YIifKJdS3q0eVNNvzwO+tA7WByDDddBbqj/8uB FBZUYM4vkLdOaPkyG8aXelPd8xFVwayoY7e3rcHxdz4kKOnJwDtLIBcoOErCn7gWBAEIAg7PKzM vjmbmZwLAEI5H3bn93xvKHx3fD9Sllyi3jILKX5I/Zx95GN093cx+T4shvyTyI84u/TOe7jcRb/ wuVFjXUwL2uElhQJhZuAO9iubKSoEaza7aOXp3OHjgIyBZaSH/VZiMNK3WKcotNLdpeQqPjQJKr PzAYPjPlgmOVJnxnkgMtjSnmpwO+g/Ng3w8cRLZzsZJYFzWhHp6iDM1MFkFV9bZylu74vxrr X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214ea6 cx=c_pps a=X8fexuRkk/LHRdmY6WyJkQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=rBU6LZDfq31Z93SBm0AA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=999 clxscore=1011 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 Implement a very basic receive path. When a new frame is available, interfaces are expected to call cpc_interface_receive_frame(). This frame will be handled in a high-priority workqueue and dispatched to the endpoint it targets, if available. Endpoints should set an RX callback with cpc_endpoint_set_ops() in order to be notified when a new frame arrives. This callback should be short, long operations should be dispatched or the main reception task will be blocked until that processing finishes. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/cpc.h | 9 ++++++ drivers/net/cpc/endpoint.c | 11 +++++++ drivers/net/cpc/interface.c | 59 +++++++++++++++++++++++++++++++++++++ drivers/net/cpc/interface.h | 8 +++++ drivers/net/cpc/protocol.c | 15 ++++++++++ drivers/net/cpc/protocol.h | 2 ++ 6 files changed, 104 insertions(+) diff --git a/drivers/net/cpc/cpc.h b/drivers/net/cpc/cpc.h index 2f54e5b660e..dc05b36b6e6 100644 --- a/drivers/net/cpc/cpc.h +++ b/drivers/net/cpc/cpc.h @@ -18,6 +18,13 @@ struct cpc_endpoint; =20 extern const struct bus_type cpc_bus; =20 +/** struct cpc_endpoint_ops - Endpoint's callbacks. + * @rx: Data availability is provided with a skb owned by the driver. + */ +struct cpc_endpoint_ops { + void (*rx)(struct cpc_endpoint *ep, struct sk_buff *skb); +}; + /** * struct cpc_endpoint - Representation of CPC endpointl * @dev: Driver model representation of the device. @@ -39,6 +46,7 @@ struct cpc_endpoint { =20 struct cpc_interface *intf; struct list_head list_node; + struct cpc_endpoint_ops *ops; =20 struct sk_buff_head holding_queue; }; @@ -50,6 +58,7 @@ struct cpc_endpoint *cpc_endpoint_new(struct cpc_interfac= e *intf, u8 id, const c void cpc_endpoint_unregister(struct cpc_endpoint *ep); =20 int cpc_endpoint_write(struct cpc_endpoint *ep, struct sk_buff *skb); +void cpc_endpoint_set_ops(struct cpc_endpoint *ep, struct cpc_endpoint_ops= *ops); =20 /** * cpc_endpoint_from_dev() - Upcast from a device pointer. diff --git a/drivers/net/cpc/endpoint.c b/drivers/net/cpc/endpoint.c index 4e98955be30..51007ba5bcc 100644 --- a/drivers/net/cpc/endpoint.c +++ b/drivers/net/cpc/endpoint.c @@ -172,6 +172,17 @@ void cpc_endpoint_unregister(struct cpc_endpoint *ep) put_device(&ep->dev); } =20 +/** + * cpc_endpoint_set_ops() - Set callbacks for this endpoint. + * @ep: Endpoint + * @ops: New callbacks to set. If already set, override pre-existing value. + */ +void cpc_endpoint_set_ops(struct cpc_endpoint *ep, struct cpc_endpoint_ops= *ops) +{ + if (ep) + ep->ops =3D ops; +} + /** * cpc_endpoint_write - Write a DATA frame. * @ep: Endpoint handle. diff --git a/drivers/net/cpc/interface.c b/drivers/net/cpc/interface.c index 1dd87deed59..edc6b387e50 100644 --- a/drivers/net/cpc/interface.c +++ b/drivers/net/cpc/interface.c @@ -6,12 +6,44 @@ #include =20 #include "cpc.h" +#include "header.h" #include "interface.h" +#include "protocol.h" =20 #define to_cpc_interface(d) container_of(d, struct cpc_interface, dev) =20 static DEFINE_IDA(cpc_ida); =20 +static void cpc_interface_rx_work(struct work_struct *work) +{ + struct cpc_interface *intf =3D container_of(work, struct cpc_interface, r= x_work); + enum cpc_frame_type type; + struct cpc_endpoint *ep; + struct sk_buff *skb; + u8 ep_id; + + while ((skb =3D skb_dequeue(&intf->rx_queue))) { + cpc_header_get_type(skb->data, &type); + ep_id =3D cpc_header_get_ep_id(skb->data); + + ep =3D cpc_interface_get_endpoint(intf, ep_id); + if (!ep) { + kfree_skb(skb); + continue; + } + + switch (type) { + case CPC_FRAME_TYPE_DATA: + cpc_protocol_on_data(ep, skb); + break; + default: + kfree_skb(skb); + } + + cpc_endpoint_put(ep); + } +} + /** * cpc_intf_release() - Actual release of interface. * @dev: Device embedded in struct cpc_interface @@ -23,6 +55,10 @@ static void cpc_intf_release(struct device *dev) { struct cpc_interface *intf =3D to_cpc_interface(dev); =20 + flush_work(&intf->rx_work); + + destroy_workqueue(intf->workq); + ida_free(&cpc_ida, intf->index); kfree(intf); } @@ -54,10 +90,20 @@ struct cpc_interface *cpc_interface_alloc(struct device= *parent, return NULL; } =20 + intf->workq =3D alloc_workqueue(KBUILD_MODNAME "_wq", WQ_HIGHPRI, 0); + if (!intf->workq) { + ida_free(&cpc_ida, intf->index); + kfree(intf); + + return ERR_PTR(-ENOMEM); + } + mutex_init(&intf->add_lock); mutex_init(&intf->lock); INIT_LIST_HEAD(&intf->eps); =20 + INIT_WORK(&intf->rx_work, cpc_interface_rx_work); + skb_queue_head_init(&intf->rx_queue); skb_queue_head_init(&intf->tx_queue); =20 intf->ops =3D ops; @@ -157,6 +203,19 @@ struct cpc_endpoint *cpc_interface_get_endpoint(struct= cpc_interface *intf, u8 e return ep; } =20 +/** + * cpc_interface_receive_frame - queue a received frame for processing + * @intf: pointer to the CPC device + * @skb: received frame + * + * Context: This queues the sk_buff in a list and schedule the work task t= o process the list. + */ +void cpc_interface_receive_frame(struct cpc_interface *intf, struct sk_buf= f *skb) +{ + skb_queue_tail(&intf->rx_queue, skb); + queue_work(intf->workq, &intf->rx_work); +} + /** * cpc_interface_send_frame() - Queue a socket buffer for transmission. * @intf: Interface to send SKB over. diff --git a/drivers/net/cpc/interface.h b/drivers/net/cpc/interface.h index 1b501b1f6dc..a45227a50a7 100644 --- a/drivers/net/cpc/interface.h +++ b/drivers/net/cpc/interface.h @@ -22,6 +22,9 @@ struct cpc_interface_ops; * @index: Device index. * @lock: Protect access to endpoint list. * @eps: List of endpoints managed by this device. + * @workq: Interface-specific work queue. + * @rx_work: work struct for processing received frames + * @rx_queue: list of sk_buff that were received * @tx_queue: Transmit queue to be consumed by the interface. */ struct cpc_interface { @@ -37,6 +40,10 @@ struct cpc_interface { struct mutex lock; /* Protect eps from concurrent access. */ struct list_head eps; =20 + struct workqueue_struct *workq; + struct work_struct rx_work; + struct sk_buff_head rx_queue; + struct sk_buff_head tx_queue; }; =20 @@ -61,6 +68,7 @@ void cpc_interface_unregister(struct cpc_interface *intf); =20 struct cpc_endpoint *cpc_interface_get_endpoint(struct cpc_interface *intf= , u8 ep_id); =20 +void cpc_interface_receive_frame(struct cpc_interface *intf, struct sk_buf= f *skb); void cpc_interface_send_frame(struct cpc_interface *intf, struct sk_buff *= skb); struct sk_buff *cpc_interface_dequeue(struct cpc_interface *intf); bool cpc_interface_tx_queue_empty(struct cpc_interface *intf); diff --git a/drivers/net/cpc/protocol.c b/drivers/net/cpc/protocol.c index 692d3e07939..91335160981 100644 --- a/drivers/net/cpc/protocol.c +++ b/drivers/net/cpc/protocol.c @@ -39,6 +39,21 @@ static void __cpc_protocol_process_pending_tx_frames(str= uct cpc_endpoint *ep) } } =20 +void cpc_protocol_on_data(struct cpc_endpoint *ep, struct sk_buff *skb) +{ + if (skb->len > CPC_HEADER_SIZE) { + /* Strip header. */ + skb_pull(skb, CPC_HEADER_SIZE); + + if (ep->ops && ep->ops->rx) + ep->ops->rx(ep, skb); + else + kfree_skb(skb); + } else { + kfree_skb(skb); + } +} + /** * __cpc_protocol_write() - Write a frame. * @ep: Endpoint handle. diff --git a/drivers/net/cpc/protocol.h b/drivers/net/cpc/protocol.h index b51f0191be4..9a028e0e94b 100644 --- a/drivers/net/cpc/protocol.h +++ b/drivers/net/cpc/protocol.h @@ -16,4 +16,6 @@ struct cpc_header; =20 int __cpc_protocol_write(struct cpc_endpoint *ep, struct cpc_header *hdr, = struct sk_buff *skb); =20 +void cpc_protocol_on_data(struct cpc_endpoint *ep, struct sk_buff *skb); + #endif --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 B48C4211488; Mon, 12 May 2025 01:28:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013309; cv=fail; b=nt/QJXHMGF9cr78yAkdcdL3mrmJugeKgZL6JYTtvREglmCNSDKm62N9+9Rd8Mj1f0vqXXsL1AxWIddDbhs4aPjDNZp/Ku21qyKDUkaEFwG3yJey2B6EsvSxAa5SsKdczxJa3h7EJ/N91TZKOH+aaObmmPp19S2NAD4BKvFEYlNI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013309; c=relaxed/simple; bh=762PqNg5mQV/ZsEEt7A4Sv7P8C3+tUoF98+osHGv0nk=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=striFrDkQQWbIAg8Oo2nsnUA3IZglRdFw7IY2Tv06GVSBO7xDemsJ5sRiuUV/TWp2YxIjLEE/5rMuZFhRb44jgWcJWhsawBT+ZmZ3Abea85j3Ny9V47YQYwSQG6KJ0ZXjOrnBgzykd0P5tqBQfJNwioS9oXq3/HvimJzFsRJqXo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=kzP9b3Zk; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=FRRJRNS4; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="kzP9b3Zk"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="FRRJRNS4" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54C0dSZE021480; Sun, 11 May 2025 20:28:07 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=X1RZOjcznezFd9unJ9Co5hH7dmX96NN4Uf02y23T+vA=; b=kzP9b3Zk3eBZ dbR3vsTp18mv0/AvVEcs32WvkslnZUio3GV1xI9qT5PEcyHBe3oC60My39nA815r JLB0QZU1nB1er8dr4k/1my//4eE73OUDV8/qcLO/mDlRiYneo1vQ97Kvlmp2Llwf 7mgegtMQZbjG2ijhYWu/i84aUbCh6nRZpBINE/XhyuOpm9B9N5gNMgMDdawCdT1R Dgtdj/VF1P9VLEZIUp7NrPnooN/lvOJzP5rwjGhqIB/DEM8VuclsdtrdZGY4oXPV qPLv3nzppeX5LrgZd4RZP10h1TPaCYZJ9w3vl198+HUYh57U51IDa9wiPz34AKt+ iGg//OOFOw== Received: from nam11-bn8-obe.outbound.protection.outlook.com (mail-bn8nam11lp2176.outbound.protection.outlook.com [104.47.58.176]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw6-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:06 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=LLybjehF85e3iDwkAoBaUEwOEDwP/wg/sxfpf6Pz7+4Iu5pv14c60Glc9zw1WaMwhz53zR4gogVSJcpc1hdijxWbnSLi8GaVu1/Kedz13zSLc7WDBQHEVcutZwEozKEKC4vngO+j7QrgYmt2qyAAclSMnlBEfJk0qShWZVPUg1JZFACwuuc+AwkEXVWM1nKaS2BLKHq8FzOqkX5iGEs76I9M/7xlniZAG0YTPqTmo4x3HQLy+7Lvwm9v5PIBGj/lmi87DPf7OMoCi2lZULNr5DRWSI1UTQwkO2Solxf761NhHZrX6XFbjfYEq7SZeqtunCLBTDfQV5to1205l8JeDA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=X1RZOjcznezFd9unJ9Co5hH7dmX96NN4Uf02y23T+vA=; b=ZdIxnJxVVMv+btsxobIgSzh7yFuvePL8IlY0b2LRh6qlhX0sO2fXe1OpeeX003eo0BFwedM9xIhUHmhTplGDTZEtlappFfnRw/Fk5kE0G3Ih/ScqlXx6+znwEGd+U+zbXk/sqEEDYYeJ60CMG4R0j4idS3Ob6cuQOZP4YtG01kLSliWDSi/XQ69AjIqHCtUnCVaxzMymUqvtHFlphv896nWO6VFIESwtm1cwVnMuuKYAKSE9laW5SQu5V26ybS6wtXdoC4BiQpxC0WNZsbu+ncsLzloLJRwK22drxSosLPlrmE/PKLkt7D0t9QlPGv6B80BL9pcYumD8xSEW2g+u/g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=X1RZOjcznezFd9unJ9Co5hH7dmX96NN4Uf02y23T+vA=; b=FRRJRNS4pW6zvobcWq9K/FLQ/yhDVmDBNgjz/LQ4wTMOazEKPKZV2GMpgGZH+i3oY276mHKA29GTgW9FGh6oErrRa6qYVhxN6EeV6EQits/uYhUgj34UEiuzex/sT549Sg4VEV3aa2k7RL246bVc3lHICX/Y9y7/I1/gCH3/9JE= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by IA0PR11MB7953.namprd11.prod.outlook.com (2603:10b6:208:40d::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.29; Mon, 12 May 2025 01:28:03 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:02 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 07/15] net: cpc: implement sequencing and ack Date: Sun, 11 May 2025 21:27:40 -0400 Message-ID: <20250512012748.79749-8-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|IA0PR11MB7953:EE_ X-MS-Office365-Filtering-Correlation-Id: 38039ef1-3ea1-4103-9186-08dd90f43d0f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|1800799024|366016|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?b0ZLVFlCbnR3MGtoME4rTFpGSm1ja0h2T21XNVovQ0I2RjZSWGVqWW5VUlZK?= =?utf-8?B?SFZ3MS9tUzY1YVZ4T0JmeDVrMjNDWE55bmV2K200VlpXWHU3Q1lQcGM4a0tx?= =?utf-8?B?aXVVSHgzOVM3amVMaHMwWDdLNk1sRHg2ZlE3Zng3TkZhMGVUb29BckJBNGo0?= =?utf-8?B?RFJDYlNrbUd6NmVNNDBjWURrM1JYQjdlVFV2QVhCVzJMZGFrdXp4dm9kZjZx?= =?utf-8?B?YlVpbm5jTGNUOEVRUlpGeFpON09Zclp0Wi9zcTNFYXdkUXZZVTZlWkRZSXlu?= =?utf-8?B?VVY5Yi9sQWNEVzlwdktTMnJqRVJVMEJOOWtQdjU3bWdGNnREOVl6bitpOWtk?= =?utf-8?B?Q2hoRTlRNFU2WmpON3psVm9JRG8ydG43NnJ4R2RpNWtCTTJGN1JGQzllZC93?= =?utf-8?B?TlVleXNZQW02WFhHYzgxQTlCVUp3K0N6V2RhSlRKVzhnd20zdmVyWStQOW9l?= =?utf-8?B?aDRFc0dNenRkR1dxdG1pK3VXYndhRnZBOWljeE43SHM4K1N1MFRjMmxRZGNY?= =?utf-8?B?T0RrdnZkcFN2TXR2YTdDQXk4S2NDZWwvWTVNN1NSSjBWVGVhWDRkdGpWZTlU?= =?utf-8?B?ZUlkNVFTSHB5VDV1K1FlL3RLR3RZbTM4QTNJOC94TDJCY1BjMnJueWNrOVd2?= =?utf-8?B?eERoZVBnTE1kSU5MVEpxMGpOc2tiMDh4MXFvWWRGWjJDV0xkbmFUYzF5c09L?= =?utf-8?B?RENMM1pqTHNaV08yV0hTUmJtTm9WdGJaYjE0aUxINWNhQzBFWVluWmRKOGtr?= =?utf-8?B?ZTZBR2tSZ2tiQ3c0SzJDSnI5MWZUMnpIa2dycUF3TXcrY2t5RFl3Wmo1Y0V2?= =?utf-8?B?MXRyTE9QdXpuT2NHbWM5cnpoRGtBVE9YNUhyWVNsV3NIMDdlYSsvb2hnWE1n?= =?utf-8?B?akxZbG9FUzNZeDA0eUpuSDRCVGhKZ3dsMjAvM1FvaXRBeTMwQ2ZmVXN0dmR3?= =?utf-8?B?eEZNMUZyeEdCWnBLVndPMnJRRFBSNGhKWGdNbGhJVnZIcVRmeXN3eVUxMjBU?= =?utf-8?B?Uy8xdjZSQ3Q1U25HTFVTN0FDWVhBN1pqUExjTDVJSHVhTWVqS0RhYTFzWVRO?= =?utf-8?B?UHFPUjFmTzRZTmozcEtUWFZ2MlJkQTY3OWQ2VXEyRC9wR1dFeTc1TnVYMVBY?= =?utf-8?B?WUcxaTdqaVFzUW9heFZjRFVJdWpJRk5YL0RtVGprOFFqVFZVRHFxNzdDeVJD?= =?utf-8?B?QlZsUU9xNHpiOU1YYUZUVkpRUng5cURXdVBsR1BWMFRIUElCcTdmbUV6RThM?= =?utf-8?B?ai91VVVQclcwUDMwSi84aTl4TXpTbzl5Yy8xLytlcnhkQjJDTzFpVG5hR3NI?= =?utf-8?B?cWJxaEl2VjZZYVExUlJmN3lLQzJlTHpDZCtqekxIMWhzakdLd0laVFZHSlI5?= =?utf-8?B?UGFJWEVwbWxVdEk0WXZYT2F3aWQxTHNlc2VaRTdWNWRYK3FsQnJacWo0MEwv?= =?utf-8?B?ZEpndlgweStvTUFFK3k1REgxdkxvNkV3WE5zVythVUluUFNGUGtMaldHU2xI?= =?utf-8?B?Sm1OY2o2MTVDTUdZZEVHUnZzMkRtYWZqb29wZThPMWFzQTJjbm9kWnZIWFcr?= =?utf-8?B?T0lpQzFIV0lhbktaVmZhWmdNYW1JK0l3aThMWFQ4TWtWTE91eFBVUWVIOUtS?= =?utf-8?B?bThZUEhxZ1lrSWZFTG9lT0dqclQ3Z1NhOHd0eHlzVUU2UWdqSE00VThKbkJZ?= =?utf-8?B?TXlsOEdxZHRzU0Z2UVpzYVorSmdIYllRNEl0TmNKMVkwd29lM01rWjVZdGMz?= =?utf-8?B?VTVvelI0ZVFnQW9tNFRQSGhFQWdybnFrMkJ2Z0JRS29GcjViVE50OXZ1c3JN?= =?utf-8?B?N1doQUZGME11Z0FrWGdDczQ4MU1RejlBUm9YRWJwblA5VSs0dkJYSGlmaUpJ?= =?utf-8?B?MUpMTmpnT0NnZ08xaU80bzRsaStGQkVOZmoyeHp0SzRFR1MyVFdubTAwNXFT?= =?utf-8?B?TVZwS0NMVHNpUlU0Qmx4VDk1SGdPUFVOSjdOS1JDUVlza1dheFMzOWEvNzZN?= =?utf-8?Q?JcP7XUh+4+ysJuGY/V0HEXzaFzwYRs=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(1800799024)(366016)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bFlacEoyWmVEZGs4cllnWndvNDExVSttUFNrR04yNzlTM2QzdExLVXl3ZHRV?= =?utf-8?B?TGlibm1POWRJVmZGWHVMNUxvaHFOVWkyR3QrYnNNQTBGeVIrclNkMUMwODlm?= =?utf-8?B?eno4T2VDcXVGR1hlUTVKTlFDUmZHVnA3WHg1L1dYa2J5MEwyWEtJQVZkaEFU?= =?utf-8?B?cndiMjh5SmRXUWJpbXpYR0NsRnhtbUhmNjdZVzE5aEV0SDlrUGJtR1IyZDhu?= =?utf-8?B?NktxRTdiZitGc1JSSHMwQWUrZVB5NFp3Rm9tVSsrT3QvLzRZK3JzMWROY2Z2?= =?utf-8?B?bGhOMG5TQVFseHYva1pJQ2EwaWNMWWw1eGNiZlRKNjl1c2JqSUt0TENQdndM?= =?utf-8?B?VTlSNXlxOGtOdzRqL1krL3FMazArNXdkNzE4dEV0YU9GSVZSeXZxbXowSFMz?= =?utf-8?B?S1B5NjY2Y0pxMEw4NWtjVjlCNUhaWDBTQVVFdnVUbGsxWjFBODlUSHhXOHdC?= =?utf-8?B?UUJYR2l4RW1mQVFFbTJER09tdmp4RGRlNVhrT0tZWkhWYVZxelRLTEpiQ3Br?= =?utf-8?B?aHd4Qlc2TEdJb0VmMnpveVVQZHFCbmlFS0ZTZnIxVndkbXduWVRrWWdlTXEy?= =?utf-8?B?TnRzT1FWZjJNMlFjQXJUekFjaHdZeFBxK3gvbnlWM2tsUXNkb2FMV1l6Znhi?= =?utf-8?B?T3ZkK0tUWUZKZDVIQkx4a0h0UU1zbnRSZERGOU82VWtFT0s5dGVSNHBJQmZ4?= =?utf-8?B?L3ZSbWMrY0FwWEVkMlNOQWl5aEFqeEFjaUR3ejB0amhKdjVnbjltNTUydG9a?= =?utf-8?B?OWFxeXloTjRiZGptQVBPR0t0SzZFR2pVMFlGRUNxditkSUthSFRadEZEOVpo?= =?utf-8?B?U1ppSUphRjdLMHhCalN4aGVIaWhvUVd3MlNkWUx4V0QrNmdvQmMrd3VHUU81?= =?utf-8?B?d1pka3ZvUStvd3AzdmJvZG1TS3FLSkR4Mk10dDBiRElpQ2ZVZUkvMFI3eUxK?= =?utf-8?B?SUxYa1o5MG9wMDhnbkVtNmNHUDFQMkhXOTVJdkxpaDdocit4aXBVRHdxdFpK?= =?utf-8?B?TGROaW9Udk4vc1UxYllBZFdybTFBT3grRTFtNVBENUtwODJMblNnMnNSWHpn?= =?utf-8?B?R2ppeFBYM3VyZ083ZlRhWVFKN2tzRmdkL1AxZThTNjJNMDE3Q1BBQXd4OTF1?= =?utf-8?B?OEFGazlMc0YxYStSdUc4Y2EwTHQvQ01aU3NsN0dmdjYrSDZvdnRGZHQxTlZy?= =?utf-8?B?QU4wVU5Bem9PSWNsYU4zUHFGQnk2UFpjeDVPSFF4Q1A5YWpwbTY5KzhjVnZB?= =?utf-8?B?eXYvbW1yYVI2NTRXZE1EczlzUTAvUlhDdVZyTkVMU3ZQZCs1b3NmMk85eW5D?= =?utf-8?B?YS92U0ExbkQzbGJJU2Z2ZXUwZ2VtZ3paVysrUytkN2JoTmdyUzhnQ0QvbGF3?= =?utf-8?B?dDNRKytHcmx1M1lRMTQ0QVBxOStudXBWUXdTMXdGOTQzdGxscGFzN0xRSUNu?= =?utf-8?B?cVVSS2d6RWZ3bDBtT1hwdzFwUmptZ2FjR00yWTQ2a2JERDkvSGJOWDVJZzNk?= =?utf-8?B?RUFpcXYxYjF5cUFmMWV5bUFOcDhEOVpkTE00eG1wR04xNWZpL2ZpTDFSSWNS?= =?utf-8?B?dCtsektMaVZZQ2tmNFhTTkdRZkR0UFhSUGNLV3FmbngrRHh2MkhFbkM3alZK?= =?utf-8?B?RGkzNGlRc1dOb1pMODgzTnVuMTNBR09aNG5SbER0Q2h1dzRqYWtmRGlEMmdB?= =?utf-8?B?bjFGM2JlSDZxZ2JvRWNuWGw2YThLQjlNYnVLTzkwVXhWYVc0Q3hkQk5rUWpF?= =?utf-8?B?UDB4cHZzemd5M0p3Tzh4d3U3Q2VMZ3ArVEdaWGF1RkFoRUlrQVF6c2k2UCtJ?= =?utf-8?B?SDRpVmYzd0pUdVN3eXVVUVBWR1l1WStoSEMxSXRkUUxuTlFuaWhwbW5TU29r?= =?utf-8?B?VGFESWlJd3VZSXpOeGdHSmZ4TlhmaUpnWVNaQnk4T3BQcmUwdjU4Q3lSTWNC?= =?utf-8?B?S2Q2TGw4SHhWdy84N2dvTXhLMVpHempCTER3amxrYTBOc2l1UldtenRqYk5Q?= =?utf-8?B?d2d4NzBOQTJoa1JEelcrbUxkU29kSTVRaXh6cUFtNGEyMG9QemhjeXRBbFoy?= =?utf-8?B?aCtWVDFzdE91a3dLZHNmck1yVFZwMktBWjZxNlJzR3hhSlVIMzMyM2UwUUNp?= =?utf-8?Q?Yu9GaKqmfrz2HYhudIdJvaA/i?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 38039ef1-3ea1-4103-9186-08dd90f43d0f X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:02.9139 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 2RTFLo06W0TK5A7hWLXsrExUDkAOE8lETf6AB8EeMARLHjNBeZZK974V5dyFhuzr1ZXdusQSu2I55JsOhSV20Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR11MB7953 X-Proofpoint-GUID: 5IoJNtqibDveoP4PnvIu81KHFel8-5cE X-Proofpoint-ORIG-GUID: 5IoJNtqibDveoP4PnvIu81KHFel8-5cE X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX+SzjMKNQaGvK Crf9UZ12cptreIi2ugsDVyIrIs9nyHdx4ZZyf6J04FzOCceQfI6dbmg56aTx2a+11CXV1CoZbMS CllNIopkrFFSeBU2eNh8KNH9wMiqp419W1iNZmkfp9/Rz8twnyM6B92KTZROX7UcuMB3SSfohX9 IrujrpWdb40mRXRz+NUq0iIQI5pEWBuou5YhwRaCkFcZPp32rPY4OOPTqUua362sygyM9C4pWZZ 8uoBsh4yN1c5/H9xpQtuuY3SrSm3VHkfv+iI5uhVqLTHuhVFf8V4Uw9AB8NcUFj/MWbrGk6nehN zwxWSsy5cCO2ho8zmlbh3uEr3PM4WJbSSjOWOGRMH4lLuMYBrhqq2TflSztAXfLI1AfkhcgPikL F60iAOUBMfkfDRdG5B8GyIpqSkgpclju2smQyAsPeNDVX8sJ8IqLYkz8ypdK07G9ACRBy06A X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214ea6 cx=c_pps a=X8fexuRkk/LHRdmY6WyJkQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=Y9oiwHhhYaTOX2ZSGccA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=999 clxscore=1015 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 CPC frames are sequenced and must be acked by the remote. If not acked in a timely manner, they should be retransmitted but that feature is not part of this commit. Another key feature is that peers advertise how many frames they can receive. As the remote is usually a microcontroller with limited memory, this serves as a way to throttle the host and prevent it from sending frames that the microcontroller is not yet able to receive. This is where endpoint's holding_queue becomes useful and serves as storage for frames that endpoint is ready to send but that the remote is not yet able to receive. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/cpc.h | 26 +++++++++ drivers/net/cpc/endpoint.c | 24 ++++++++- drivers/net/cpc/protocol.c | 108 ++++++++++++++++++++++++++++++++++++- 3 files changed, 156 insertions(+), 2 deletions(-) diff --git a/drivers/net/cpc/cpc.h b/drivers/net/cpc/cpc.h index dc05b36b6e6..94284e2d59d 100644 --- a/drivers/net/cpc/cpc.h +++ b/drivers/net/cpc/cpc.h @@ -18,6 +18,27 @@ struct cpc_endpoint; =20 extern const struct bus_type cpc_bus; =20 +/** + * struct cpc_endpoint_tcb - endpoint's transmission control block + * @lock: synchronize tcb access + * @send_wnd: send window, maximum number of frames that the remote can ac= cept + * TX frames should have a sequence in the range + * [send_una; send_una + send_wnd]. + * @send_nxt: send next, the next sequence number that will be used for tr= ansmission + * @send_una: send unacknowledged, the oldest unacknowledged sequence numb= er + * @ack: current acknowledge number + * @seq: current sequence number + * @mtu: maximum transmission unit + */ +struct cpc_endpoint_tcb { + struct mutex lock; /* Synchronize access to all other attributes. */ + u8 send_wnd; + u8 send_nxt; + u8 send_una; + u8 ack; + u8 seq; +}; + /** struct cpc_endpoint_ops - Endpoint's callbacks. * @rx: Data availability is provided with a skb owned by the driver. */ @@ -32,6 +53,8 @@ struct cpc_endpoint_ops { * @id: Endpoint id, uniquely identifies an endpoint within a CPC device. * @intf: Pointer to CPC device this endpoint belongs to. * @list_node: list_head member for linking in a CPC device. + * @tcb: Transmission control block. + * @pending_ack_queue: Contain frames pending on an acknowledge. * @holding_queue: Contains frames that were not pushed to the transport l= ayer * due to having insufficient space in the transmit window. * @@ -48,6 +71,9 @@ struct cpc_endpoint { struct list_head list_node; struct cpc_endpoint_ops *ops; =20 + struct cpc_endpoint_tcb tcb; + + struct sk_buff_head pending_ack_queue; struct sk_buff_head holding_queue; }; =20 diff --git a/drivers/net/cpc/endpoint.c b/drivers/net/cpc/endpoint.c index 51007ba5bcc..db925cc078d 100644 --- a/drivers/net/cpc/endpoint.c +++ b/drivers/net/cpc/endpoint.c @@ -20,12 +20,26 @@ static void cpc_ep_release(struct device *dev) { struct cpc_endpoint *ep =3D cpc_endpoint_from_dev(dev); =20 + skb_queue_purge(&ep->pending_ack_queue); skb_queue_purge(&ep->holding_queue); =20 cpc_interface_put(ep->intf); kfree(ep); } =20 +/** + * cpc_endpoint_tcb_reset() - Reset endpoint's TCB to initial values. + * @ep: endpoint pointer + */ +static void cpc_endpoint_tcb_reset(struct cpc_endpoint *ep) +{ + ep->tcb.seq =3D ep->id; + ep->tcb.ack =3D 0; + ep->tcb.send_nxt =3D ep->id; + ep->tcb.send_una =3D ep->id; + ep->tcb.send_wnd =3D 1; +} + /** * cpc_endpoint_alloc() - Allocate memory for new CPC endpoint. * @intf: CPC interface owning this endpoint. @@ -55,6 +69,10 @@ struct cpc_endpoint *cpc_endpoint_alloc(struct cpc_inter= face *intf, u8 id) ep->dev.bus =3D &cpc_bus; ep->dev.release =3D cpc_ep_release; =20 + mutex_init(&ep->tcb.lock); + cpc_endpoint_tcb_reset(ep); + + skb_queue_head_init(&ep->pending_ack_queue); skb_queue_head_init(&ep->holding_queue); =20 device_initialize(&ep->dev); @@ -195,6 +213,8 @@ int cpc_endpoint_write(struct cpc_endpoint *ep, struct = sk_buff *skb) struct cpc_header hdr; int err; =20 + mutex_lock(&ep->tcb.lock); + if (ep->intf->ops->csum) ep->intf->ops->csum(skb); =20 @@ -202,10 +222,12 @@ int cpc_endpoint_write(struct cpc_endpoint *ep, struc= t sk_buff *skb) hdr.ctrl =3D cpc_header_get_ctrl(CPC_FRAME_TYPE_DATA, true); hdr.ep_id =3D ep->id; hdr.recv_wnd =3D CPC_HEADER_MAX_RX_WINDOW; - hdr.seq =3D 0; + hdr.seq =3D ep->tcb.seq; hdr.dat.payload_len =3D skb->len; =20 err =3D __cpc_protocol_write(ep, &hdr, skb); =20 + mutex_unlock(&ep->tcb.lock); + return err; } diff --git a/drivers/net/cpc/protocol.c b/drivers/net/cpc/protocol.c index 91335160981..92e3b0a9cdf 100644 --- a/drivers/net/cpc/protocol.c +++ b/drivers/net/cpc/protocol.c @@ -11,15 +11,54 @@ #include "interface.h" #include "protocol.h" =20 +static void __cpc_protocol_send_ack(struct cpc_endpoint *ep) +{ + struct cpc_header hdr; + struct sk_buff *skb; + + skb =3D cpc_skb_alloc(0, GFP_KERNEL); + if (!skb) + return; + + memset(&hdr, 0, sizeof(hdr)); + hdr.ctrl =3D cpc_header_get_ctrl(CPC_FRAME_TYPE_DATA, false); + hdr.ep_id =3D ep->id; + hdr.recv_wnd =3D CPC_HEADER_MAX_RX_WINDOW; + hdr.ack =3D ep->tcb.ack; + memcpy(skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr)); + + cpc_interface_send_frame(ep->intf, skb); +} + +static void cpc_protocol_on_tx_complete(struct sk_buff *skb) +{ + struct cpc_endpoint *ep =3D cpc_skb_get_ctx(skb); + + /* + * Increase the send_nxt sequence, this is used as the upper bound of seq= uence number that + * can be ACK'd by the remote. + */ + mutex_lock(&ep->tcb.lock); + ep->tcb.send_nxt++; + mutex_unlock(&ep->tcb.lock); +} + static int __cpc_protocol_queue_tx_frame(struct cpc_endpoint *ep, struct s= k_buff *skb) { + struct cpc_header *hdr =3D (struct cpc_header *)skb->data; struct cpc_interface *intf =3D ep->intf; struct sk_buff *cloned_skb; =20 + hdr->ack =3D ep->tcb.ack; + cloned_skb =3D skb_clone(skb, GFP_KERNEL); if (!cloned_skb) return -ENOMEM; =20 + skb_queue_tail(&ep->pending_ack_queue, skb); + + cpc_skb_set_ctx(cloned_skb, cpc_protocol_on_tx_complete, ep); + cpc_interface_send_frame(intf, cloned_skb); =20 return 0; @@ -28,10 +67,19 @@ static int __cpc_protocol_queue_tx_frame(struct cpc_end= point *ep, struct sk_buff static void __cpc_protocol_process_pending_tx_frames(struct cpc_endpoint *= ep) { struct sk_buff *skb; + u8 window; int err; =20 + window =3D ep->tcb.send_wnd; + while ((skb =3D skb_dequeue(&ep->holding_queue))) { - err =3D __cpc_protocol_queue_tx_frame(ep, skb); + if (!cpc_header_number_in_window(ep->tcb.send_una, + window, + cpc_header_get_seq(skb->data))) + err =3D -ERANGE; + else + err =3D __cpc_protocol_queue_tx_frame(ep, skb); + if (err < 0) { skb_queue_head(&ep->holding_queue, skb); return; @@ -39,8 +87,64 @@ static void __cpc_protocol_process_pending_tx_frames(str= uct cpc_endpoint *ep) } } =20 +static void __cpc_protocol_receive_ack(struct cpc_endpoint *ep, u8 recv_wn= d, u8 ack) +{ + struct sk_buff *skb; + u8 acked_frames; + + ep->tcb.send_wnd =3D recv_wnd; + + skb =3D skb_peek(&ep->pending_ack_queue); + if (!skb) + goto out; + + /* Return if no frame to ACK. */ + if (!cpc_header_number_in_range(ep->tcb.send_una, ep->tcb.send_nxt, ack)) + goto out; + + /* Calculate how many frames will be ACK'd. */ + acked_frames =3D cpc_header_get_frames_acked_count(cpc_header_get_seq(skb= ->data), + ack, + skb_queue_len(&ep->pending_ack_queue)); + + for (u8 i =3D 0; i < acked_frames; i++) + kfree_skb(skb_dequeue(&ep->pending_ack_queue)); + + ep->tcb.send_una +=3D acked_frames; + +out: + __cpc_protocol_process_pending_tx_frames(ep); +} + void cpc_protocol_on_data(struct cpc_endpoint *ep, struct sk_buff *skb) { + bool expected_seq; + + mutex_lock(&ep->tcb.lock); + + __cpc_protocol_receive_ack(ep, + cpc_header_get_recv_wnd(skb->data), + cpc_header_get_ack(skb->data)); + + if (cpc_header_get_req_ack(skb->data)) { + expected_seq =3D cpc_header_get_seq(skb->data) =3D=3D ep->tcb.ack; + if (expected_seq) + ep->tcb.ack++; + + __cpc_protocol_send_ack(ep); + + if (!expected_seq) { + dev_warn(&ep->dev, + "unexpected seq: %u, expected seq: %u\n", + cpc_header_get_seq(skb->data), ep->tcb.ack); + mutex_unlock(&ep->tcb.lock); + kfree_skb(skb); + return; + } + } + + mutex_unlock(&ep->tcb.lock); + if (skb->len > CPC_HEADER_SIZE) { /* Strip header. */ skb_pull(skb, CPC_HEADER_SIZE); @@ -74,5 +178,7 @@ int __cpc_protocol_write(struct cpc_endpoint *ep, =20 __cpc_protocol_process_pending_tx_frames(ep); =20 + ep->tcb.seq++; + return 0; } --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 0D9C027456; Mon, 12 May 2025 01:28:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013309; cv=fail; b=ArnI7QTfoHhPca4Sl8nhpYSEx3RV6n9GrU4q0pTOa0K9bu1+JfPZW0o2T+jX1OvFhfilcMHorCTtMBzpwpjN6wqsg3GD2SYmmb7XCIeiCzvXevEoto6i3VCfn83+488sFM4lZEUzBumUR3YY1MmLsIB0kB1pFAs4raI84ov4BNU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013309; c=relaxed/simple; bh=K3cLtLRti8imrg/jZ3HeDH517zMk8EVeAopAzu6h3uQ=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=lTGKY4zWO0NEu5WToU/K0SpS+zI4kECQTPVeCOECHXJpAUbJDpO157JVp+L7XYlFnKuMzsxAVajPV6yU0dpr8QF6RMxcqGUKHXTY01fJbBUR1IJDMMfvMw1OVzqsErlLYZPyCuWx5u9YpdPfmlWnF9AQ0T10lSqrz7PE7OSSKp8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=ukiCeFdx; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=RxZXveLw; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="ukiCeFdx"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="RxZXveLw" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54BMe1Rr027700; Sun, 11 May 2025 20:28:09 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=kWQTEjPud+PElrz0qUYJfc1sEE+0Frc6NSiUBSHDnWc=; b=ukiCeFdxZzh/ 6l0VXnsCHKzs2ThbhBrd2ZlA7ichO3WAfKTFpBDEDf6wDosiHu+woyb/aXSggcPD 5Jsm5onWZf6VbidDjAvhoeDEgBLbmc+VTVH4eY8iFvGAx9yFaEEM1WjxkLRUSGYo 3p9xP4PUcJfG5Qm+LtxRYDfOOMnECKP6lmXl8xlYGSFceoz7BcGT068MVQmgn1fD UTYuA/KBuaIx7+wGa/6L665DUKlkcKHDWlMzeZheH2eUwwZnhwDhjDOfeiSwzir3 bl1XHAqQKtFPtVqdVUoDi1D3YN/EslOtE6cpFlHLmUylwfG4U8/HsU9uYXnXAZBm bnFd0f56KQ== Received: from nam04-dm6-obe.outbound.protection.outlook.com (mail-dm6nam04lp2044.outbound.protection.outlook.com [104.47.73.44]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw9-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:09 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=U39ba/3VgEzPGbWOG0dWVOTpOq7ludgHc5EUxQJWKxTuo+Dxa4TtEDrTkOHxzLLw48Nd58qVtu5YNlZhq6+nxUii0VZLJRUdaPoWKli+s/P9Cun8+bV7mVUTgaJOe+PUFkYVAIAtwnDlPNfiIpAK0xJ5D+7JNS2ElGTDi0QZSh5Y56Kb4OpOPs24Xltr5k+jORwENzVgjLtjKm5evSVLOKbX54oo84SoKhVEnxXGj/AWigBTXOoWNm3QclhXHIdDOA4Bb6wHjnwrlG/V3uM/cxwbUS+o46l/p29NM/aEOKd5Db+JJoOXsX06sg7YkTstydPQ0c3cpUZljKHuACUcYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=kWQTEjPud+PElrz0qUYJfc1sEE+0Frc6NSiUBSHDnWc=; b=UvzUT6mH3JvTItZihQRjf+GAe/LGvLa1aLOSXEXhXnE173XL/rOH66VhJjpPIBNaoBdp9XyYaIPYyBi2RmAxMEA/gQX6PAsNSMCLrPNwI5cXbpL1VDiaz2sMcpi7iUHmJXEL/Tinud3VmJrrPc/xqWOXlFLRf8XNTT2AKgnlRne6MNo9qzMTigs1KpkMuQ2LpA7YhRW3u6nrJ5cBNCltg5O114N2toztqnDHDJ4NkW+lALCFngKs6K/g8F97Qy6Do/d1NhM8s4FTtCve+TpboO7bmzyy+5OY0e9K0VuSyi14+pgN7cqTPhqYxAALwtAJ2lUOgMKuXLFPcBgI60tNgQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kWQTEjPud+PElrz0qUYJfc1sEE+0Frc6NSiUBSHDnWc=; b=RxZXveLw/evVX8GVOBivf5y6xQRf0vH0xaH2G5GhhVi6EuZFtDVYmdEW35Dm+WLN7XT+WfhiiqoAT9dYj61LQL9a35VILryew7CmgbkycXqsTGYZbxdQyyMqOAA1/nEq5ZopjHFiYcH8TkSwcFlWAC8/OnnLH6TQlBIhisjTHik= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by PH0PR11MB4920.namprd11.prod.outlook.com (2603:10b6:510:41::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.27; Mon, 12 May 2025 01:28:04 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:03 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 08/15] net: cpc: add support for connecting endpoints Date: Sun, 11 May 2025 21:27:41 -0400 Message-ID: <20250512012748.79749-9-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|PH0PR11MB4920:EE_ X-MS-Office365-Filtering-Correlation-Id: 10f7e573-7775-4336-b9de-08dd90f43d80 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?TFpKRVY2ajZZclZLcmRUVWVyOVVkZUhzeGhlNlJmVVZKOG9uT3NBQjhNOElZ?= =?utf-8?B?MkYyQ0NScTZwSDdzT2g4citXdUhyNTV2UjBRZVJwa1dzWXpINnJjTkxMWU5o?= =?utf-8?B?UU9mZ1NXQmJyMDVNdTQ0TStJemkxdEJZSVpzelNFbmJiSDJrWXQrcXlSc0cy?= =?utf-8?B?UkFEUGhTOStCNzg2OFVVM3k5cU9zbE9pbEpUUkg1aGw5VUtoaGRZenhZNHo0?= =?utf-8?B?di9ZVW14VGpYR0NSM2l2a2ZtWEtzVHVpSzBaU1JlL1RVRHI3cmkySGlDM3ZU?= =?utf-8?B?UUErTExtc3FoTCs2dnFqNmFmdy9Rb2U5bXVaMXJMYUR1WWlZc3h1VUt0NjhO?= =?utf-8?B?RGtHa21oK2Q0cGg0WUpLdzNCZCs4MnNCQ3RyYXdTblRYTE14ZXJrRERKRmRN?= =?utf-8?B?U2JFYWE2NGZpQUU4d1o2bWFnaVVRSEhOczgweGZkYndGWGhmVjQ4R1NoRCsy?= =?utf-8?B?QlJnRDB6VnFaUHZxaXp4bkFNVVFuYll5eGJYM1I1K1A5S1JtaVY5T3NHeGRl?= =?utf-8?B?RkY4dU1tYnRSTEFpQ1Jkd3NWRDRRY3ZrNytyMk4rbk85WWtvT2FSUnFNOUVL?= =?utf-8?B?L0hWQTlKVk5UUzlsSlQ5SCsvdG5kbXRDdGxFOWdPNEx6amZkTWpXdndORTNp?= =?utf-8?B?QXNaTUZMVTFPbUtUWTlaVjY1N2hKd3BpWjdmaDJDQjhWVEpOelZnV0ZYU05s?= =?utf-8?B?RFRQVXFyRThVcXh2b1BXN0lvOCs0dWl5VW1Tb1laSXdrNUhKNnJDSUxyL2NH?= =?utf-8?B?T2ZqQlA5K2FYV2pvUzNYN1BuSDl0bUgvOWowNDF6TE1LQmVFLzBlRDNpZWoz?= =?utf-8?B?Vytkbm5MZXkrMzNtRGp3OCsyRVEzWGtsTW9sU3hIOCtNbHVoMFpTNTFhejhV?= =?utf-8?B?WG5wZUgyeHJQWG1kbTRnb2p6cWtPM2hlMjUydloyMTZnOXVxNlhJVjJwRThr?= =?utf-8?B?eS9zeC9uUzA4bXBNcSt6c0lTY21sYno0UytaWU9KdWpaTUpaUE9DOVRyRXor?= =?utf-8?B?N0llNlhWV21UeTk5S3lxWThnNEN1cTAwYTQyY2p4Ym0xM09aWlNoRXY0SHkx?= =?utf-8?B?VTJ0Z2ErMUYzcjRaalJOZnNLaWkwbGJPem9qRVp6SFp3a0x5ZUhsUElZUUNF?= =?utf-8?B?c1dCcmxsSDNnUk9TZWhhSVpQOVIzaEluUWxRaXhUclhoY1JhVGNBeFhZU0Nm?= =?utf-8?B?Q3NZVnVXNnFleGtQNUFzUlAvdnovTXRLQitMRWRueFNvQXA4T3RLbHVqdG1Y?= =?utf-8?B?SjByMWczR2JaRUVnY05ocXlDM1JWeFdoMDlvRE4vbUwyc0thZDQvYTFuV0RU?= =?utf-8?B?RmdtMnorVDdyMC9OYVNWQVNKVzVZOTdERVpHU2VjMDlsWGY3aXVZN3U4M2RN?= =?utf-8?B?YVJaSXNyOEpaK04rNUVDeEg4TU1SNFpRRFdFZVVOYXBXTGhReXZTRTlwRUlF?= =?utf-8?B?Y3BNdXRvd0k1N2NaVktvWmRMTjFNdTVodzFaMW9xM2t1QkEwYjY5cW5qZG8v?= =?utf-8?B?SkZucWtRdEswNHQ1S20zQmdvcG1QRG9BRGdSOEkwWm90dEFEUTJJZTE2bjdV?= =?utf-8?B?YmZ5M0xtVllaRVlUVy9OR3k4ejErNzI3bitldDArakZnN0UyNHI1bkdSWkwx?= =?utf-8?B?aHlOR0dIK3NzSVFRck5WNWU0Tm9kWkFTamxsWElKUmFaRFEvTHVZSkNMNGd3?= =?utf-8?B?MVFHUW1MVk5qQ1FIUUwwTHJhV25UNDhJdVBGdjArTlplSG80S3BaNXJZR3M1?= =?utf-8?B?TFhqY1o0OFBDTGdEVGRMbW5paG4xTFFPRnJkQysweXVuOHdYWXN5aG8vdjdh?= =?utf-8?B?SjRwTW9SRUo3WXU2WURScTRCWFFYM0hDWUQrODM4d0NMU2k3R00yVEt6NVdN?= =?utf-8?B?b3VtR2VVc3RDSkxxN0dNbjlpTktxNGI3NjBpUk1pWnVLUG5OYldpV25wM3Ns?= =?utf-8?B?aGw4Z1I0UVU3cHpjSGRtcmlMUXpKMzBCU3FucTcxN0pnR0U3eXM5YUN4QVJV?= =?utf-8?Q?OZIQAjCqNvCE79JVSkTOh7dId9sy0Y=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Ym5KcmRXSllId1pjbU5GRHRJa050dDBBcjlpSUlxa205ODRtMnFsWk01bC9N?= =?utf-8?B?VzQ2QjQxN3pmZzQ5OFFvcVBpbEpaTjRmMzB6dC9JVStCMVBQVGJTNkk3VFl1?= =?utf-8?B?VGlzQkV6K2RYZWE2SkVQcmpVRVVMMmZiY0FzRFpZZGxMaDBoc25HLzRRK0xF?= =?utf-8?B?aFFHYjA5YXBqTkFLV01Yd2FWV1hXdVBTSE52bk9lSmtFUm5rUXYxVUkyNVhZ?= =?utf-8?B?M2ZESHlENkF2UVdRQ0NUNVVDMFVNYXhic1pVMDZGZ0tQRlBwUmVRdnFPYmFt?= =?utf-8?B?ZzlISlJ4ZHJXSXNXTGdTa3pGVU8wS2dybHRtR0FiL3RDV2RxZ0ZFSWV1a0xy?= =?utf-8?B?cy8rNGxqZUhMOWg0bEhHV2N1aklaVDBKOEF0elBoVDRNVHhLKzZKUmZlU21a?= =?utf-8?B?d0FYRmxwdGFMWVhjNUpueUlLUUJJZ05adHhZa3A4cnkyUXdqOWY5OUx0dVdE?= =?utf-8?B?M2JsNjFSd0VvZTN2T2hSWW4vZXRreGJRTHltSzNGdWNkWDllc1FSdWNiQ3c0?= =?utf-8?B?RWsxeHZyUlZxcWhHN1JHYnM1YWMxdDZtQjhzY1E1VW1Vc1dqMENWQ3pzZk9j?= =?utf-8?B?T0NHd0xuV2JCQkp6Z29DLzA5RnFVdVFwQVkwbjU4a1B1WXR0eElsRjYwK29H?= =?utf-8?B?MUQ3V2dxdk9zZi82N3MwcGJUamxLaU5vQnRvVWFUUUx1VllHLzdiUTBxTEdu?= =?utf-8?B?K0NEc2xmNFZQdkR5TVlVZXZhS0RySURnQXV3WlNrbGYzWGRaZ29CdDY4d2xi?= =?utf-8?B?c1U4ZkJHYkt1TVBUemh6NFBrdGVUYndyZkpMQit4TDR2UlIzWThWNFgwRWJj?= =?utf-8?B?VkFXT09xSjZjMmpZNUlaTW5aRVlNZlVzYkVtVjJabXVoazF6RFBwUllWQWtu?= =?utf-8?B?SUVBbk0vU1pHZHFQd1hzMU54QmFYejBQdkU4QWZ3UFg4MW5SNkVvRDMzZmJz?= =?utf-8?B?V1ZjUm5kMytkZG5CZExUNGNDTFZaZmkvYzJXMFo4RUNXYk02UjVqVnlIM21I?= =?utf-8?B?czZFanI2N1Y0Zk9jczN5OWU4NlB6MnZwcDdLOGtjN3JoRlJDZjloMmhyYTFB?= =?utf-8?B?UXVjY3ovWWNEQ2hzQUx4OHVnMDJkUlAxeW5lYlhrcUtuVnlhUk8yUjZCYjEr?= =?utf-8?B?RWlMeGx4dHFZNkhUVE0vcS9YR3laNnBSUG84Z0pBNVVJQ09TR0Q3VjVURlg5?= =?utf-8?B?Tlc0YStKM1BLUEdicVNUVGVmRjNCZ1ZQYkJmTWtXbmVyTkpyaWxYWXpoQzdP?= =?utf-8?B?b1pWTnJvY0hYbURvcTIxTzBpa3NYT25ycDN0RDR0MEF5bzhoODFOakRhN3Vh?= =?utf-8?B?bFZKbUlwOExtbjNVdy8wSzdvWWJHbkZxOVZQUm5OeFhDK3VOUmdMTVE0MTBZ?= =?utf-8?B?R2g5M3c3QkNuKy9Ja0l3RXIxVVRMNnJSaUQ3SHJSR2REa1NQazVtRm5PVm8w?= =?utf-8?B?Mk42ckd4VWxxcmc1amphWjNVZy9HNVRvOGlFRi9wWEpOUkF0Qlk4elV1QUht?= =?utf-8?B?NGp3SjI4bUN2SDhDU0JWbWRnUjZPY1pSTnRBMkcxWURSdW5vZjlJak1zU1Ro?= =?utf-8?B?cjEwdTJWWVlOWXN3OE4xSGtBOG8rZmlXOExFbENKQ3labmtIN0hObXBYNlFR?= =?utf-8?B?Yy9TWkNNd05JaHlCV1FPNmFtLzhZT0RwOVVGakN6VWNUZ0QrbTdicXJNdnpw?= =?utf-8?B?MWxZMmtjM0hjc1lZM0dud2FPeCtjT1FMczBadUFQc3U4aFk5bWhodnpFRmh2?= =?utf-8?B?Y2ZaRHY0NzdQQllFWFR6R2l4NnpLbVBLYldRb2NFbzdDNHZleTRCRWFWZnlm?= =?utf-8?B?c1Y1YmZrTnFYOEU5V2txR1NCMmhmOHJ5TDhWcktBRzU5QzIvdVFxd2NBbTdv?= =?utf-8?B?a28vSGs1VHI3ZjIyYThWTHJxZ3RqUDg1VWh6a080aWJwckVrbGVJeVJSSEkz?= =?utf-8?B?dTJZcHBDRFhkYmN4S0Y2VmJtRTNCa3NuamhQRjNLWEszc0Y3Uk1zbmR6cXNk?= =?utf-8?B?TXZjaEFEQ1hhQ1YwamhON2RUNjJLbWR2T1QrSWlKMGlDY09hd3l4K2duSUhk?= =?utf-8?B?TzVpQnlzODBuTDN6a3F6Qi9vOWZWOVh6V1MzbkxtWGZVOERML1ZpWkhKSHZK?= =?utf-8?Q?Wix2bjp2/7Iy/stI/7z8qkqgH?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 10f7e573-7775-4336-b9de-08dd90f43d80 X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:03.6377 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: E7VqzwXwCZXn/x96E16VyDORJdjKJBzxBLcNbcsNmdYmqGVFeqA1cBlUFbnOG090S8X8lwzTEB+iDGrUcR/NGA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR11MB4920 X-Proofpoint-GUID: 9wwzgUiX7zGTKnj9uA-aw7tTKhH0pxKR X-Proofpoint-ORIG-GUID: 9wwzgUiX7zGTKnj9uA-aw7tTKhH0pxKR X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX6v/ZI8b4g/vt QYKyhMMDn2FBguHd7GVruFcNRre7fBk8lGBvy0WwCToyMZ0w/IWdbdef8TiVkfgzPIke7Q6jBpz IUYAjgIf2iuhdNe+Krq8LxjyWpdeOKW/u6Zm55jHuZN+MSxypdsJ30Y1STr6GlZNoRpBQPvNhVk X3nZpEDIsDu7wxZ/tgmWMnlfqsU8ICNx/1w08f6kIa3hFTqcO+HcpTMJq7VRD/MRAEsxUxVtxPV 7TyNdYwReWGSSFgvkkcWB9xJqjxks78LRUryVGKzKub71RyyKSNsJLU3uN4JV/uQ+8SIa/57XsZ S9WY3Xnwpf75sjHw9HyGuuXeQgy4muvdWaeCkRWr2DDWsBgfwCG/Jv9phvnnBWou3WPSG60oDNU TskYWI2uT69Zx812hTWgMgv2Hq4wxfmWsui4HkjuzlkWRz9Dml9siOAOVDc8DduMXY11Wqer X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214ea9 cx=c_pps a=coA4Samo6CBVwaisclppwQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=TjJOd7T2WYD0k9XMUkAA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=999 clxscore=1015 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 Endpoints must be connected before transmitting. This is achieved using a three-way handshake in which each peer advertises the maximum payload size it can receive. Once again, this constraint comes from the remote microcontroller, which can have tight limit on the payload size it can handle. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/cpc.h | 12 +++++ drivers/net/cpc/endpoint.c | 75 ++++++++++++++++++++++++++++ drivers/net/cpc/interface.c | 29 +++++++++++ drivers/net/cpc/interface.h | 3 ++ drivers/net/cpc/protocol.c | 97 ++++++++++++++++++++++++++++++++++++- drivers/net/cpc/protocol.h | 4 ++ 6 files changed, 219 insertions(+), 1 deletion(-) diff --git a/drivers/net/cpc/cpc.h b/drivers/net/cpc/cpc.h index 94284e2d59d..d316fce4ad7 100644 --- a/drivers/net/cpc/cpc.h +++ b/drivers/net/cpc/cpc.h @@ -18,6 +18,11 @@ struct cpc_endpoint; =20 extern const struct bus_type cpc_bus; =20 +/* CPC endpoint flags */ +enum { + CPC_ENDPOINT_UP, /* Connection is established with remote counterpart. */ +}; + /** * struct cpc_endpoint_tcb - endpoint's transmission control block * @lock: synchronize tcb access @@ -37,6 +42,7 @@ struct cpc_endpoint_tcb { u8 send_una; u8 ack; u8 seq; + u16 mtu; }; =20 /** struct cpc_endpoint_ops - Endpoint's callbacks. @@ -54,6 +60,8 @@ struct cpc_endpoint_ops { * @intf: Pointer to CPC device this endpoint belongs to. * @list_node: list_head member for linking in a CPC device. * @tcb: Transmission control block. + * @conn: Completion structure for connection. + * @flags: Endpoint state flags. * @pending_ack_queue: Contain frames pending on an acknowledge. * @holding_queue: Contains frames that were not pushed to the transport l= ayer * due to having insufficient space in the transmit window. @@ -72,6 +80,8 @@ struct cpc_endpoint { struct cpc_endpoint_ops *ops; =20 struct cpc_endpoint_tcb tcb; + struct completion conn; + unsigned long flags; =20 struct sk_buff_head pending_ack_queue; struct sk_buff_head holding_queue; @@ -83,6 +93,8 @@ struct cpc_endpoint *cpc_endpoint_new(struct cpc_interfac= e *intf, u8 id, const c =20 void cpc_endpoint_unregister(struct cpc_endpoint *ep); =20 +int cpc_endpoint_connect(struct cpc_endpoint *ep); +void cpc_endpoint_disconnect(struct cpc_endpoint *ep); int cpc_endpoint_write(struct cpc_endpoint *ep, struct sk_buff *skb); void cpc_endpoint_set_ops(struct cpc_endpoint *ep, struct cpc_endpoint_ops= *ops); =20 diff --git a/drivers/net/cpc/endpoint.c b/drivers/net/cpc/endpoint.c index db925cc078d..e6b2793d842 100644 --- a/drivers/net/cpc/endpoint.c +++ b/drivers/net/cpc/endpoint.c @@ -35,6 +35,7 @@ static void cpc_endpoint_tcb_reset(struct cpc_endpoint *e= p) { ep->tcb.seq =3D ep->id; ep->tcb.ack =3D 0; + ep->tcb.mtu =3D 0; ep->tcb.send_nxt =3D ep->id; ep->tcb.send_una =3D ep->id; ep->tcb.send_wnd =3D 1; @@ -72,6 +73,7 @@ struct cpc_endpoint *cpc_endpoint_alloc(struct cpc_interf= ace *intf, u8 id) mutex_init(&ep->tcb.lock); cpc_endpoint_tcb_reset(ep); =20 + init_completion(&ep->conn); skb_queue_head_init(&ep->pending_ack_queue); skb_queue_head_init(&ep->holding_queue); =20 @@ -197,10 +199,77 @@ void cpc_endpoint_unregister(struct cpc_endpoint *ep) */ void cpc_endpoint_set_ops(struct cpc_endpoint *ep, struct cpc_endpoint_ops= *ops) { + if (test_bit(CPC_ENDPOINT_UP, &ep->flags)) + return; + if (ep) ep->ops =3D ops; } =20 +/** + * cpc_endpoint_connect - Connect to the remote endpoint. + * @ep: Endpoint handle. + * + * @return: 0 on success, otherwise a negative error code. + */ +int cpc_endpoint_connect(struct cpc_endpoint *ep) +{ + unsigned long timeout =3D msecs_to_jiffies(2000); + int err; + + if (!ep->ops || !ep->ops->rx) + return -EINVAL; + + if (test_bit(CPC_ENDPOINT_UP, &ep->flags)) + return 0; + + cpc_interface_add_rx_endpoint(ep); + + mutex_lock(&ep->tcb.lock); + skb_queue_purge(&ep->pending_ack_queue); + skb_queue_purge(&ep->holding_queue); + cpc_endpoint_tcb_reset(ep); + mutex_unlock(&ep->tcb.lock); + + err =3D cpc_protocol_send_syn(ep); + if (err) + goto remove_from_ep_list; + + timeout =3D wait_for_completion_timeout(&ep->conn, timeout); + if (timeout =3D=3D 0) { + err =3D -ETIMEDOUT; + mutex_lock(&ep->tcb.lock); + skb_queue_purge(&ep->pending_ack_queue); + mutex_unlock(&ep->tcb.lock); + + goto remove_from_ep_list; + } + + return 0; + +remove_from_ep_list: + cpc_interface_remove_rx_endpoint(ep); + + return err; +} + +/** + * cpc_endpoint_disconnect - Disconnect endpoint from remote. + * @ep: Endpoint handle. + * + * Close the connection with the remote device. When that function returns= , no more packets will be + * received from the remote. + * + * Context: Must be called from process context, endpoint's interface lock= is held. + */ +void cpc_endpoint_disconnect(struct cpc_endpoint *ep) +{ + if (!test_and_clear_bit(CPC_ENDPOINT_UP, &ep->flags)) + return; + + cpc_interface_remove_rx_endpoint(ep); +} + /** * cpc_endpoint_write - Write a DATA frame. * @ep: Endpoint handle. @@ -215,6 +284,11 @@ int cpc_endpoint_write(struct cpc_endpoint *ep, struct= sk_buff *skb) =20 mutex_lock(&ep->tcb.lock); =20 + if (skb->len > ep->tcb.mtu) { + err =3D -EINVAL; + goto out; + } + if (ep->intf->ops->csum) ep->intf->ops->csum(skb); =20 @@ -227,6 +301,7 @@ int cpc_endpoint_write(struct cpc_endpoint *ep, struct = sk_buff *skb) =20 err =3D __cpc_protocol_write(ep, &hdr, skb); =20 +out: mutex_unlock(&ep->tcb.lock); =20 return err; diff --git a/drivers/net/cpc/interface.c b/drivers/net/cpc/interface.c index edc6b387e50..d6b04588a61 100644 --- a/drivers/net/cpc/interface.c +++ b/drivers/net/cpc/interface.c @@ -36,6 +36,9 @@ static void cpc_interface_rx_work(struct work_struct *wor= k) case CPC_FRAME_TYPE_DATA: cpc_protocol_on_data(ep, skb); break; + case CPC_FRAME_TYPE_SYN: + cpc_protocol_on_syn(ep, skb); + break; default: kfree_skb(skb); } @@ -203,6 +206,32 @@ struct cpc_endpoint *cpc_interface_get_endpoint(struct= cpc_interface *intf, u8 e return ep; } =20 +/** + * cpc_interface_add_rx_endpoint() - Set an endpoint as being available fo= r receiving frames. + * @ep: Endpoint. + */ +void cpc_interface_add_rx_endpoint(struct cpc_endpoint *ep) +{ + struct cpc_interface *intf =3D ep->intf; + + mutex_lock(&intf->lock); + list_add_tail(&ep->list_node, &intf->eps); + mutex_unlock(&intf->lock); +} + +/** + * cpc_interface_remove_rx_endpoint() - Unet an endpoint as being availabl= e for receiving frames. + * @ep: Endpoint. + */ +void cpc_interface_remove_rx_endpoint(struct cpc_endpoint *ep) +{ + struct cpc_interface *intf =3D ep->intf; + + mutex_lock(&intf->lock); + list_del(&ep->list_node); + mutex_unlock(&intf->lock); +} + /** * cpc_interface_receive_frame - queue a received frame for processing * @intf: pointer to the CPC device diff --git a/drivers/net/cpc/interface.h b/drivers/net/cpc/interface.h index a45227a50a7..f7f46053fad 100644 --- a/drivers/net/cpc/interface.h +++ b/drivers/net/cpc/interface.h @@ -68,6 +68,9 @@ void cpc_interface_unregister(struct cpc_interface *intf); =20 struct cpc_endpoint *cpc_interface_get_endpoint(struct cpc_interface *intf= , u8 ep_id); =20 +void cpc_interface_add_rx_endpoint(struct cpc_endpoint *ep); +void cpc_interface_remove_rx_endpoint(struct cpc_endpoint *ep); + void cpc_interface_receive_frame(struct cpc_interface *intf, struct sk_buf= f *skb); void cpc_interface_send_frame(struct cpc_interface *intf, struct sk_buff *= skb); struct sk_buff *cpc_interface_dequeue(struct cpc_interface *intf); diff --git a/drivers/net/cpc/protocol.c b/drivers/net/cpc/protocol.c index 92e3b0a9cdf..db7ac0dc066 100644 --- a/drivers/net/cpc/protocol.c +++ b/drivers/net/cpc/protocol.c @@ -11,6 +11,36 @@ #include "interface.h" #include "protocol.h" =20 +int cpc_protocol_send_syn(struct cpc_endpoint *ep) +{ + struct cpc_header hdr; + struct sk_buff *skb; + int err; + + skb =3D cpc_skb_alloc(0, GFP_KERNEL); + if (!skb) + return -ENOMEM; + + memset(&hdr, 0, sizeof(hdr)); + + mutex_lock(&ep->tcb.lock); + + hdr.ctrl =3D cpc_header_get_ctrl(CPC_FRAME_TYPE_SYN, true); + hdr.ep_id =3D ep->id; + hdr.recv_wnd =3D CPC_HEADER_MAX_RX_WINDOW; + hdr.seq =3D ep->tcb.seq; + hdr.syn.mtu =3D cpu_to_le16(U16_MAX); + + err =3D __cpc_protocol_write(ep, &hdr, skb); + + mutex_unlock(&ep->tcb.lock); + + if (err) + kfree_skb(skb); + + return err; +} + static void __cpc_protocol_send_ack(struct cpc_endpoint *ep) { struct cpc_header hdr; @@ -116,6 +146,42 @@ static void __cpc_protocol_receive_ack(struct cpc_endp= oint *ep, u8 recv_wnd, u8 __cpc_protocol_process_pending_tx_frames(ep); } =20 +static bool __cpc_protocol_is_syn_ack_valid(struct cpc_endpoint *ep, struc= t sk_buff *skb) +{ + enum cpc_frame_type type; + struct sk_buff *syn_skb; + u8 syn_seq; + u8 ack; + + /* Fetch the previously sent frame. */ + syn_skb =3D skb_peek(&ep->pending_ack_queue); + if (!syn_skb) { + dev_warn(&ep->dev, "cannot validate syn-ack, no frame was sent\n"); + return false; + } + + cpc_header_get_type(syn_skb->data, &type); + + /* Verify if this frame is SYN. */ + if (type !=3D CPC_FRAME_TYPE_SYN) { + dev_warn(&ep->dev, "cannot validate syn-ack, no syn frame was sent (%d)\= n", type); + return false; + } + + syn_seq =3D cpc_header_get_seq(syn_skb->data); + ack =3D cpc_header_get_ack(skb->data); + + /* Validate received ACK with the SEQ used in the initial SYN. */ + if (!cpc_header_is_syn_ack_valid(syn_seq, ack)) { + dev_warn(&ep->dev, + "syn-ack (%d) is not valid with previously sent syn-seq (%d)\n", + ack, syn_seq); + return false; + } + + return true; +} + void cpc_protocol_on_data(struct cpc_endpoint *ep, struct sk_buff *skb) { bool expected_seq; @@ -149,7 +215,7 @@ void cpc_protocol_on_data(struct cpc_endpoint *ep, stru= ct sk_buff *skb) /* Strip header. */ skb_pull(skb, CPC_HEADER_SIZE); =20 - if (ep->ops && ep->ops->rx) + if (test_bit(CPC_ENDPOINT_UP, &ep->flags)) ep->ops->rx(ep, skb); else kfree_skb(skb); @@ -158,6 +224,35 @@ void cpc_protocol_on_data(struct cpc_endpoint *ep, str= uct sk_buff *skb) } } =20 +void cpc_protocol_on_syn(struct cpc_endpoint *ep, struct sk_buff *skb) +{ + mutex_lock(&ep->tcb.lock); + + if (!__cpc_protocol_is_syn_ack_valid(ep, skb)) + goto out; + + __cpc_protocol_receive_ack(ep, + cpc_header_get_recv_wnd(skb->data), + cpc_header_get_ack(skb->data)); + + /* On SYN-ACK, the remote's SEQ becomes our starting ACK. */ + ep->tcb.ack =3D cpc_header_get_seq(skb->data); + ep->tcb.mtu =3D cpc_header_get_mtu(skb->data); + ep->tcb.ack++; + + complete(&ep->conn); + + __cpc_protocol_send_ack(ep); + + set_bit(CPC_ENDPOINT_UP, &ep->flags); + complete(&ep->conn); + +out: + mutex_unlock(&ep->tcb.lock); + + kfree_skb(skb); +} + /** * __cpc_protocol_write() - Write a frame. * @ep: Endpoint handle. diff --git a/drivers/net/cpc/protocol.h b/drivers/net/cpc/protocol.h index 9a028e0e94b..e67f0f6d025 100644 --- a/drivers/net/cpc/protocol.h +++ b/drivers/net/cpc/protocol.h @@ -13,9 +13,13 @@ =20 struct cpc_endpoint; struct cpc_header; +struct cpc_interface; =20 int __cpc_protocol_write(struct cpc_endpoint *ep, struct cpc_header *hdr, = struct sk_buff *skb); =20 void cpc_protocol_on_data(struct cpc_endpoint *ep, struct sk_buff *skb); +void cpc_protocol_on_syn(struct cpc_endpoint *ep, struct sk_buff *skb); + +int cpc_protocol_send_syn(struct cpc_endpoint *ep); =20 #endif --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 2232A210198; Mon, 12 May 2025 01:28:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013309; cv=fail; b=NsSYjLiXVeVFXVkIpHG+fVapAHDvUtb6CJKliuS+Fp6UyuJYuubjoo+AbONtfNF7dt5w7L09/I5/1CHQxfa3ltk8XbwmrsFmyxdDAt9wKlY2j2d06tKxNhkH1EAKaO9djB+FxlYaxaqYQsfZC5afTfDjfQYRCWrRJh/mrCA/Sek= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013309; c=relaxed/simple; bh=1hIlqrNFHGw9mq61l/tBkz65eya983ytAL8SVpcZlzE=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=setvnvJ9efs+B2p37V2IKyTOJHjDCkgq5CX5HHsOGv1+OFe/qvKZr4wAmDE0RQq1d7K0GG3LzM57t6dBVZg2b0Ux7kUwcOgwoo3jiDgD0dj7hX0H9JWs8lsqxFMu1KyL1S3o9+9aGkGNgk4hxE6DSqx+OQkkzRXHqBFhk8Ee3oI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=nLg27H8B; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=fzxs/TMu; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="nLg27H8B"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="fzxs/TMu" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54BMe1Rq027700; Sun, 11 May 2025 20:28:08 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=rsrtDaVYT0EGlKun0m/DLcc5C0Zcc+VmuIsFnK4ijq4=; b=nLg27H8BpWYv 9B2KtvHvDtsgWMs1nMbe8zijvW17vBL9THUCZO2Xgq5N+MauJMsP3PthPlWPOr6m dz+Forbhfj3UMogujjA4UgJOBQqf7hPgtEd5U3XLnXv+V6ptaLNxGvELnq8q0VCi s2EbTp4M9I6Yfx3h6yhil34eYlR6ERHJFifSIc6iWubPs4EpPu8XoxF54CITqrxy sol9CsUbITqUPi7faah6KvDjTmIZCrd+wGJ4DCd2GsHCwq0t7cZe+3y9HTVjOunU NGevPm2Cui4iaF9SuTB7W1mGuVY67Gwu117ITdfytlUFyW+sLGMsbDjL2zhWqTIz qj8xxUHDbA== Received: from nam04-dm6-obe.outbound.protection.outlook.com (mail-dm6nam04lp2044.outbound.protection.outlook.com [104.47.73.44]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw9-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:08 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PTrMB7QlaCG3UKCyuinqlN6ziDlV+uXtu0KjczhQi+TNg6Ug596Gpxh3OLxvIFG9i7x6mRltMLhmUNXP+vhau5mjGB3F6vtuKtPmkOACnoj2PIigOdSvQ+lA98tEj1t6zgGTgIz3354j8UGjRzMALUQRldwuWu2DkhI0gQ3T7fVthYWlv1sU7YOndM2wZvUNbYrf6jj/YBFCsQAi3VmQdIXSVt8oYLUk+FzlCgjlrIZwRR3b95rVHBwBZgtffVtWGBRVrwvuLGxvq66p+DCs+pR6LB/gXoA9oh8Gd/1z0FAhecz5YuAGagCYCRjFijFDje186bDwjKIUWlD5t4AjLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=rsrtDaVYT0EGlKun0m/DLcc5C0Zcc+VmuIsFnK4ijq4=; b=ipmSmFSfH61BSDeolOPvEXERfY7oS//fTmcW6/wTc70bi4B9Z37OirK1se/J0+2h7mKUdmDx73L/VpZpFknvK0Ni8ojYe3p2k2dOie74FtSTWEq5a3CutLY26SjsF3XqDE15T04bcz0LHTKA0HcZUYpXX1QbX66aBtijyoAJJX4rpd7zczPLcOz2SCl3gpvImelp9oj0wpi0w6kERuORuBhUsRF72u2V21stTT6tmPRfSLGVQfQ8UGIgabLrlHfsC9zEQ9Mvf0B7di+mfkieS4/OKU+zyfaUcYFewCBvQiv76lU+YzAfySuxh4AK9Lmo3O+PZ2DggqvOzdq50mb+BA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=rsrtDaVYT0EGlKun0m/DLcc5C0Zcc+VmuIsFnK4ijq4=; b=fzxs/TMuhd/RCK13AFfzJrZsEriES/wzYp4RfMzi7xTZ1oUiPbwrYNeM6AwV1j47mlChLXzfBGCX3s1YC/su8+Y3HLLlHrRfQSEpLz+u+nDet+tWodgnb4dhgPZ/kdsFIw2MbR/vHy96Pldc2tWPC0nvGCCPMr0dPmVMHy2jqm4= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by PH0PR11MB4920.namprd11.prod.outlook.com (2603:10b6:510:41::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.27; Mon, 12 May 2025 01:28:04 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:04 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 09/15] net: cpc: add support for RST frames Date: Sun, 11 May 2025 21:27:42 -0400 Message-ID: <20250512012748.79749-10-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|PH0PR11MB4920:EE_ X-MS-Office365-Filtering-Correlation-Id: 793a4aa2-70a7-4a2f-8681-08dd90f43df2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?U05GS2RTT1hXY0RkRXVpNEdLemFzaktRWUNaK0NHRXpVYThHZjVsa2IwdEgx?= =?utf-8?B?MnFXUG90SFFuVldvK2pxdEVkYmx3bHd4NHVOem15UEQ5UHhqL0dyTnlBc3JT?= =?utf-8?B?aU9ZT3diY3I0bVVmcEZ3bzNPRW82R29GRlFWZXkycnpWK3BnL0RWZTBqNHI2?= =?utf-8?B?L0xmQmRWd3FOaG93aE9rWmxnckt6RldhVjVnU0REV2pUMVdtUmlwWHc3RE9u?= =?utf-8?B?eTgyRmN1YVJ0Vmx4dUZjUjhtbkQ3aTJFWVhkRTYvdXJHMitNWXNnWHVKMk1T?= =?utf-8?B?clVKR2Z6OG45U1o0OXY4VG1lSFhvZTJrTmI0eWVWeGR1eHJNS08ySlUwTlZN?= =?utf-8?B?MTAvUEFKMmdVenIwTGRRSURKSWhrbTJTbWtSTjJCNk01aU0wdFc5SzJUZkdm?= =?utf-8?B?OXJPMU9PdUtnVGRMMSt2VkF5bVVmaWVUL1Bpd0RuVG00Q29RTTVyZGV5dUpy?= =?utf-8?B?T1RNdEt3QmxKTmx6ZWdJekNXMTNwNk51NDVvVTNSdXZyb2dGUEhnR1RMSm9z?= =?utf-8?B?RmdQNnp2MzJOTGhGU1FGVFRPc1ZtV1FzbG11VGd3VHZaR2ZJRUpYS0RRNVJX?= =?utf-8?B?dTV1SjYzYVc2ZzVzaFR3U0JHblk2M01nMFZYVDZxTFAyd29uR1cyQWsyK2E1?= =?utf-8?B?K1F1YndpcDFHUWoxbzQyOVk4cHYrVU5ZZjBTaVNFRlBlRmV6M3pGV0Y2ajlH?= =?utf-8?B?TjEzWVB3SlptektwQlpGMXJlVkFQcjBOVFU5djEyb2lxZjFKUzA0UkhWdG91?= =?utf-8?B?R2VueVJxM0ZjaXZudGF5MmVOV3pQWGd5WEJZVzJkOHp0eUMxRGV3dG1ac3M3?= =?utf-8?B?NVpFdTRQajNJYmE1MWlOZm1VRnV0S0N0TmxsS0xWbm53YzFWSHBtai9mUzVP?= =?utf-8?B?N2d6cXpzY001Unlabm54WC9tRmFBazZ0L04rRWd4amN2RHpUeExYWkYxUERD?= =?utf-8?B?WXJwV3dWZE1kWC94WXc4VXlXbDJuZW9va05LVUpQdVFmbWE2alBKY0pIUGJT?= =?utf-8?B?dUVUNFZUUDRDZ1RTZmpnU3pjSnBsUTd3OGN6dnkzQmFNbGw0dzdnZlkrNjVJ?= =?utf-8?B?Yko1RkRTMG9hM2RzQWRuSVpsYTZpTVhITjdUY2NJdWJYc0QzZGFTbHI5S0tK?= =?utf-8?B?QngyNGQxTEg2TzQ5Q2lteitVR3ZXV3RNYXpOWHJWMG4yb3BYZUFoaTYyNzNW?= =?utf-8?B?NjByenI1eS9xN01aR052UElNZ3pQbEVqZkdlcnVrR2lvR2pOcjZ2TFFJTTAr?= =?utf-8?B?TzFVWEZNdmRUTXZldWFrOXJvMUNZZlpWV290SFpmWUNjUjV6Ukw0TURobER3?= =?utf-8?B?dGRieUdTaW9HMHdwcnlla0I0ZDc2Y29nV25BVjRySXF0WjE0M3FhZ2ZBRlRk?= =?utf-8?B?a3F5ZklMaU52a1N4Nytjb3VEYW53eUt2TEtMVnFrMUdKSVlLK0VXclVocjZS?= =?utf-8?B?dlhIeGpxbXdYLzhHT3FkbXltOURTRzB2bDh1bkQ4L05qeGN2d0xGL1d2TTJt?= =?utf-8?B?RWtOR2hZaDVJalBxL1NkMkRRZ0JUblUxMkpSOUhFeEVZYzhjYTdHSjl2dVJi?= =?utf-8?B?TWx5MnJsWTc3d2ppK1VFbHdkcmN3UnVCb0JWbnNuWlhVUy93WThiWVJJUkUy?= =?utf-8?B?MlFPZk5ZZE1RODR4QkdvOWlIenNSMi9NRUw4cDBzVzBnbTlkK1BzRnNLRWZV?= =?utf-8?B?TTc0dGcvSnh3VkhhWjFDZ0FBeVJuWmNVOUdEdUlHY2hzR2dLaGVmYXdwdHRS?= =?utf-8?B?aHNLMVR5WEp4QUxYQU0wcTE5TlpMcUNMa2puQTRNbnBQZXpuaHFmYTg4V081?= =?utf-8?B?RHcwVE03cEhqS2pVemtYQnpESWRraFc3UWljR3NKRkZDbU0zL2JTMjU2NGF0?= =?utf-8?B?VTkrMHg4bDV1NkRjSmp1d3JkOXBHQlBBWGU5SHNHMDdST3hKb2Q4MmpaY1ky?= =?utf-8?B?SWFVMVpNcHJ3VE5XWFNwUXViZ1AvRmZ0aXdIbjk2N2UvVjc3MUVJcTF4Uno0?= =?utf-8?Q?opnp1rE+qXIzr5kuyzQ1zMmgYXqHEU=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?aXZUV1h0Y0l2RGk4ZmMwYUd3T3NCVFl0aHhlaHk4c2ZBdHNkMW81aUpmMFlz?= =?utf-8?B?R0RoVW1ZZ05lL1FvOXpORnRRajNuM29mVDJVL044U2FIamdMQUxNTHdXem9k?= =?utf-8?B?Umx3WWFodUJRdDRhaEZBSnU1a1k4bGx4N2dZdEJsbUphKzl0WmozVFVkUTJ4?= =?utf-8?B?ZGs0aDU0ZEpRTkFjdDJOV1JmSCtlbkpHM2daRWVrR1lRUW9uZzM3b0NiSEFl?= =?utf-8?B?WUpuOTJyVXlMYXpWdGJEOUw2VzlGVkt2dGxsdFhPYVpZL3Z6N2xXemQ4UHJK?= =?utf-8?B?MWRHQlFkcEhVYzgzbU9jRTJaOEhLTDl2OXd1cmlJOWZvb1lGT3NIbWROOWMy?= =?utf-8?B?d1RWczJRaHhkYTFXdGJjL3VuNWdpVGlya0VaM2FHWmN3R1J4QzBrQVJXaFFn?= =?utf-8?B?LzdtZUl2dTREOWN6UWtCU2x6aUpyVjR4Nk5Xbk5OLyt4RHE2bmZTeEhvNWR6?= =?utf-8?B?emlHMVA5OWZETS80RlZnc21mRlpSZDJqanQzWWtUYXl4Z2lHQ1lFRytTOHJr?= =?utf-8?B?ZGkrQ2xMTE1qSjRUR3NYSWtsaTd3c1NjNWRkd2NWSVRyOGpjRWVWMUFJUWdD?= =?utf-8?B?MUlkTmFGbGxPU3VHVW9aRFhkbHVHSFVBaTJvOVcyTWxRdkV0YWIycGo5cmNY?= =?utf-8?B?WUhSZ0lsRjdjdlFiZU1hNGpVdU9jVFBFeFJtV2lYZjJUQzhjY1dkaW5JTWFR?= =?utf-8?B?RkY3R2lZaVFIczhXaWZ2Qng0cVFvKzhzeXNKZDlFVnBCeVB2NE1PZHVuSFFC?= =?utf-8?B?dVAxVDJ0UUtzVjBrN0dnaWhlL2d2M2NDckFoRTBMOEphVDl4enpZblU0MENu?= =?utf-8?B?QTBxZ2h4SjVhVWxsN1lSeEc5MVZBUVBNZ0xEbUdaMEk2dmFUODBuUFpCRVRX?= =?utf-8?B?VU5tanQ1L1UyR2pSY3BuZlpmUm1QbnIwYWx1L0tsVkRobXJGcGFyL1NqT29v?= =?utf-8?B?OVg2bVQ0anVwOGY0NzZ1UHRaVzJleXkyNTZydXpSY1ZNbGlETVJWdkVtNDlM?= =?utf-8?B?T3JrRkVlNmNhbHJlSmx6K0dSSHJUbUhMTzVKVkpsS0xJUkVJY0RKbDF1aEFS?= =?utf-8?B?Zk1ubjJ6MXloOWpmdDFJR0dzNko5VkZVaWlabWcxdmdtMkNXaWFRbVlFaWlE?= =?utf-8?B?YzdmV2JOOGxnN1hpdk52anNpV2NaYitPeUw0UGk4K3JVcS9FUVBJYmlxa0Ru?= =?utf-8?B?aWNQTFRUQWVYa2xRQ2RxOHZhOFJjMUFqNzZ6MXZuMDQ3Q25BbEk1TGdhWEtz?= =?utf-8?B?VzNrYkFiRENQT2R0TXVJcitUanhaNmd1MGg3YjNPeEs0bnRsZEdLb0tpY0F4?= =?utf-8?B?blYyZ3VZcmM3bmErWTFBcmZMaXlGZitOWW5HQzRCL1poUWZHazcxQy9OU0No?= =?utf-8?B?eE5yVUdaN1RMenFzdGduTkN1N1ZaUkZFZ0FIa3ZJSnRhRmdZVDNrbDhiOE4z?= =?utf-8?B?QmJKUFZvbHRaWCs1VW5WSlN3a2VQdUNUSXhseHp1VFJlUERlSG9lVXVhd09M?= =?utf-8?B?d1NWODlKUjk0YVBiZVBHWUtIZDZPb0s4N1AxKzIyMHUwMm1wZERDdGcwcktz?= =?utf-8?B?aGNCbWhqZE1NUjdKZWE5aFcwK2NUVHZhSXBVSmE0YVNWTVpRb3Y1dnlYeFNi?= =?utf-8?B?clpNaFpSK2pobG1qdkw5ZWtwWTdRQ0t0SXZ6VnhsdnY5WVB1a1N1VjJwZlM4?= =?utf-8?B?ZWg2UmllUy82ZVl1SndyY05PNVByUmwvbE5CWW4wTjcwQXljTkI4QW01eUox?= =?utf-8?B?VDVDUjdJdnVZaVlLTFhSc0cwZ09zMk1uUUU2clE0My9GWDNRc1Z0ZWtSVkJJ?= =?utf-8?B?cE5vbHR1UnNzak40UHZ1NHhNalJWQjRpcm1iZ3QvS2hRTS9GYm9iTzNqTy9n?= =?utf-8?B?TjZoWDhWT2ZFcThtNVNjK1RmcSs2cFBXV3ZCcVFObEFqL003UlRua1NseW9T?= =?utf-8?B?a0l6SnhWYkNROUY5TDRMTWRrb2FKNm5NaGxMRm9yMGMveUFYWnZwTHhic2x6?= =?utf-8?B?MFEzZjY1VDV5WkJodStnTTVkaEhSRXFPSFJBamZwSTZDSWNaTVlJOWFxWkJS?= =?utf-8?B?NXlyMXMyL05TNFVrZHh2OEZkTXBkZ1E5Z09BN244MU9DakFvZTZVNzhRL3pM?= =?utf-8?Q?u36V5EFCLpDy1UPdAHFQa/6hZ?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 793a4aa2-70a7-4a2f-8681-08dd90f43df2 X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:04.3418 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: pf/7wqgwhp/S9CzWnxLoTevts2x59TG+EPXhzLmLZNcEk2y8ixe1YEiyJykKeYRqKRnryWESq0BQeuFIk9Rn1A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR11MB4920 X-Proofpoint-GUID: P1ePiCP7e8EwKgYrPn2Wa7jvvpJV5KCR X-Proofpoint-ORIG-GUID: P1ePiCP7e8EwKgYrPn2Wa7jvvpJV5KCR X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX8wX8N86pgMLW vIEt3m8NwieQB+eQ8DtzpD+6w+/bm8bFtshEGHh54zH1sg/F0LlV2jCjC+aT4l7u4y/0R9knVlE W1y2xVuuULmM5/GRCmrcIo9mgIewEDuH8PPekBXJTGnnPeqsch43ejAyPqQu0fKrToeBnSewHVQ L4vZvOOlrfQoqrYeBApczlJB+Kxs0Ek2RBK4n3xw1ZPIaU+kwHGewbjK84NwJNMhX4lpxa+Dw5h LY2KlC65Xlbj4qa5OmQICEYxBbvvcWeAFZGdrX8+Mp3Vk66U9zXaeK1mwO2rAAuNRfktmCcrUhm oSEwMBSsJxaOrODyvn+HT+0cRDA+TX4OG2zfgN4Yx0f2UU9k1JsvGcFRxxN85WQ+KqG6xjqrX5L sPGkE36D6yVRm4Ujy1Cj/dHfM1O7xqjMWBNC871rzW4u+zcM/du8GL8Kxz1LMnN40vWS7QPp X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214ea8 cx=c_pps a=coA4Samo6CBVwaisclppwQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=HXJrTte0tiLIOPi1Ik8A:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=991 clxscore=1015 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 Reset frames are used to either disconnect an endpoint or to signal that a frame is targeting an endpoint that is not connected. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/cpc.h | 1 + drivers/net/cpc/endpoint.c | 16 ++++++++++++---- drivers/net/cpc/interface.c | 9 ++++++++- drivers/net/cpc/protocol.c | 32 +++++++++++++++++++++++++++++++- drivers/net/cpc/protocol.h | 2 ++ 5 files changed, 54 insertions(+), 6 deletions(-) diff --git a/drivers/net/cpc/cpc.h b/drivers/net/cpc/cpc.h index d316fce4ad7..34ee519d907 100644 --- a/drivers/net/cpc/cpc.h +++ b/drivers/net/cpc/cpc.h @@ -94,6 +94,7 @@ struct cpc_endpoint *cpc_endpoint_new(struct cpc_interfac= e *intf, u8 id, const c void cpc_endpoint_unregister(struct cpc_endpoint *ep); =20 int cpc_endpoint_connect(struct cpc_endpoint *ep); +void __cpc_endpoint_disconnect(struct cpc_endpoint *ep, bool send_rst); void cpc_endpoint_disconnect(struct cpc_endpoint *ep); int cpc_endpoint_write(struct cpc_endpoint *ep, struct sk_buff *skb); void cpc_endpoint_set_ops(struct cpc_endpoint *ep, struct cpc_endpoint_ops= *ops); diff --git a/drivers/net/cpc/endpoint.c b/drivers/net/cpc/endpoint.c index e6b2793d842..7e2f623fb8e 100644 --- a/drivers/net/cpc/endpoint.c +++ b/drivers/net/cpc/endpoint.c @@ -253,6 +253,17 @@ int cpc_endpoint_connect(struct cpc_endpoint *ep) return err; } =20 +void __cpc_endpoint_disconnect(struct cpc_endpoint *ep, bool send_rst) +{ + if (!test_and_clear_bit(CPC_ENDPOINT_UP, &ep->flags)) + return; + + cpc_interface_remove_rx_endpoint(ep); + + if (send_rst) + cpc_protocol_send_rst(ep->intf, ep->id); +} + /** * cpc_endpoint_disconnect - Disconnect endpoint from remote. * @ep: Endpoint handle. @@ -264,10 +275,7 @@ int cpc_endpoint_connect(struct cpc_endpoint *ep) */ void cpc_endpoint_disconnect(struct cpc_endpoint *ep) { - if (!test_and_clear_bit(CPC_ENDPOINT_UP, &ep->flags)) - return; - - cpc_interface_remove_rx_endpoint(ep); + __cpc_endpoint_disconnect(ep, true); } =20 /** diff --git a/drivers/net/cpc/interface.c b/drivers/net/cpc/interface.c index d6b04588a61..30e7976355c 100644 --- a/drivers/net/cpc/interface.c +++ b/drivers/net/cpc/interface.c @@ -28,6 +28,10 @@ static void cpc_interface_rx_work(struct work_struct *wo= rk) =20 ep =3D cpc_interface_get_endpoint(intf, ep_id); if (!ep) { + if (type !=3D CPC_FRAME_TYPE_RST) { + dev_dbg(&intf->dev, "ep%u not allocated (%d)\n", ep_id, type); + cpc_protocol_send_rst(intf, ep_id); + } kfree_skb(skb); continue; } @@ -39,8 +43,11 @@ static void cpc_interface_rx_work(struct work_struct *wo= rk) case CPC_FRAME_TYPE_SYN: cpc_protocol_on_syn(ep, skb); break; - default: + case CPC_FRAME_TYPE_RST: + dev_dbg(&ep->dev, "reset\n"); kfree_skb(skb); + cpc_protocol_on_rst(ep); + break; } =20 cpc_endpoint_put(ep); diff --git a/drivers/net/cpc/protocol.c b/drivers/net/cpc/protocol.c index db7ac0dc066..faacd0f42ad 100644 --- a/drivers/net/cpc/protocol.c +++ b/drivers/net/cpc/protocol.c @@ -60,6 +60,28 @@ static void __cpc_protocol_send_ack(struct cpc_endpoint = *ep) cpc_interface_send_frame(ep->intf, skb); } =20 +/** + * cpc_protocol_send_rst - send a RST frame + * @intf: interface pointer + * @ep_id: endpoint id + */ +void cpc_protocol_send_rst(struct cpc_interface *intf, u8 ep_id) +{ + struct cpc_header hdr =3D { + .ctrl =3D cpc_header_get_ctrl(CPC_FRAME_TYPE_RST, false), + .ep_id =3D ep_id, + }; + struct sk_buff *skb; + + skb =3D cpc_skb_alloc(0, GFP_KERNEL); + if (!skb) + return; + + memcpy(skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr)); + + cpc_interface_send_frame(intf, skb); +} + static void cpc_protocol_on_tx_complete(struct sk_buff *skb) { struct cpc_endpoint *ep =3D cpc_skb_get_ctx(skb); @@ -228,8 +250,11 @@ void cpc_protocol_on_syn(struct cpc_endpoint *ep, stru= ct sk_buff *skb) { mutex_lock(&ep->tcb.lock); =20 - if (!__cpc_protocol_is_syn_ack_valid(ep, skb)) + if (!__cpc_protocol_is_syn_ack_valid(ep, skb)) { + cpc_protocol_send_rst(ep->intf, ep->id); + goto out; + } =20 __cpc_protocol_receive_ack(ep, cpc_header_get_recv_wnd(skb->data), @@ -253,6 +278,11 @@ void cpc_protocol_on_syn(struct cpc_endpoint *ep, stru= ct sk_buff *skb) kfree_skb(skb); } =20 +void cpc_protocol_on_rst(struct cpc_endpoint *ep) +{ + __cpc_endpoint_disconnect(ep, false); +} + /** * __cpc_protocol_write() - Write a frame. * @ep: Endpoint handle. diff --git a/drivers/net/cpc/protocol.h b/drivers/net/cpc/protocol.h index e67f0f6d025..977bb7c1450 100644 --- a/drivers/net/cpc/protocol.h +++ b/drivers/net/cpc/protocol.h @@ -19,7 +19,9 @@ int __cpc_protocol_write(struct cpc_endpoint *ep, struct = cpc_header *hdr, struct =20 void cpc_protocol_on_data(struct cpc_endpoint *ep, struct sk_buff *skb); void cpc_protocol_on_syn(struct cpc_endpoint *ep, struct sk_buff *skb); +void cpc_protocol_on_rst(struct cpc_endpoint *ep); =20 +void cpc_protocol_send_rst(struct cpc_interface *intf, u8 ep_id); int cpc_protocol_send_syn(struct cpc_endpoint *ep); =20 #endif --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 223882101A0; Mon, 12 May 2025 01:28:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013308; cv=fail; b=mnZd1b0td+5/BecnbUwLxHwRTylAW0d19ZBfe8N2n236eZ5KQk1LsGCa6bk6qpDg1dDmGR70D5/nGeKN6h8ZnfO+aqB2zdn8P7vUoaM4oz66H/rS3/TDMfCA43HhIecdrZqyUYWi7z7CHCcZB7gxxP1npa/SQLQEekhgLgoo/yc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013308; c=relaxed/simple; bh=eOVq661l8gpp2FeBA9ADn5tu4JJnCo1TtL8AVMR0GFA=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=gwG9WubKc3jXV+NuVDoWrOrNJWykAqVZL6SuFAqcXCTRLgd2rzRJ2D8ZsuSIDXa8VXYCO7rg8511wWKuJIaj1g3GpN1TtrVAyH4VPYBPwkiDZuz+rEB3yoAqHlbjvY2Z7h0GQjWMfytp24x/Jl1iR5U9DV2s4nkU/qK1M1/dJUk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=PFzBfLGl; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=Mi5A959m; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="PFzBfLGl"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="Mi5A959m" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54BMe1Ro027700; Sun, 11 May 2025 20:28:08 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=7u7C0lpSYz9RVO7RNG6CAYIQXWebGd0f2fTr9WKVL3U=; b=PFzBfLGlGgV2 7e6q/rnp19e6miD6o/HrL04wdd5W6+ymliBV7/6IF6brLBlHagkLplSWzHxGjnxA aCZrHef3NP7/yXakwkv2zPuI2I9W6ERupHFLQIa3c0iTWplxrMn+R/mHJNt75FX+ XYccicGdiFPzaSoo4sg6mukjtkuYjuK23yTsfvEw81BR/8i64jOCEbheln1yEnRU IV0Jlj1SF2z0z4TH5MjuiBYyXmnG0Cji/m+NnHxo7lJy2FQl79KdWWXOSmRJl99j xP6Q1B9/4Yh0aY1SmyhCKNYo4bgfexQY5I0iZG9R3CUp8YT2jNXzwVrEVIJzQSR6 I15Zo+AcZg== Received: from nam04-dm6-obe.outbound.protection.outlook.com (mail-dm6nam04lp2044.outbound.protection.outlook.com [104.47.73.44]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:07 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=krhMgvIFes1hCk6fhbxE5s4YPEiDEkHro4H8xRc3X3D+CRsvSLRyjpqjaVWNTN5tS4r8OOteR4teC5nhnVx0s3gQltuJMZXs0hFF4TFgXWht6lQCu8t5OddG7EgpbY6I/tZPmF8b4uNCRKKHDRrak1gw19t96Gz4H4D/3eDXOFkJCDfrzotfQHvtN9eSdULvvlDgxqZ0c5eAnwE65KZTQClr27+tYX1/6JFabOCUdFrjpZSxt2ZPsMkYbTJJyS67nKTmoCSHB2/HSYMMro9L/dAIdIggJ5B2sb1WYrGkqWkHAQapFrG4oBD/VilIM5zHAsgka8LzPuOrQzW3xxP+pw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=7u7C0lpSYz9RVO7RNG6CAYIQXWebGd0f2fTr9WKVL3U=; b=Cotxz3mJMHbSIz+1yv40Kg0/qjLTZLBPisD9qjCqGTDRSbN8Re1CNofrLRVPEdNkQWb312SgiGS4ZUM2t8Rqd5dB10esd8rcQXe5ECE//aHswHx6a6+E5/zNU83Z6htAuE8g5Xm8jppTFJByer6rQo4ApfM91Msbp97GOdqvTNrzKlDKi7uEXhMdhPe9t8a7nfEvFzWqPEabcCidezbQsaRNpMWZbXmyLgaOYBDnV/HzkvSke9tX3/6ZHwfaavy/roHq8XOMHunVLT2cRFFcorZN1aifCqYBdfDtdaSXeZJl6peCgt9gX1TqPD4MXmnqG5UADkoVFmL9i+iwi/euZQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7u7C0lpSYz9RVO7RNG6CAYIQXWebGd0f2fTr9WKVL3U=; b=Mi5A959mxyqIj3OP4JHKB4Bni2szeMdiEiQvYpOdBVSWObkS8DZr2G2pt3+u/JaCwxZ8QXqTmJSpVwqPIyS+JuPUo5panr2oGdswaQQ9j9q/yI+YtmSGb9EEXWG/wHZVvNb+I4OnaozQ4hEtZOlQc5tf01MBjWXakKkr0qBzD6U= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by PH0PR11MB4920.namprd11.prod.outlook.com (2603:10b6:510:41::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.27; Mon, 12 May 2025 01:28:05 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:05 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 10/15] net: cpc: make disconnect blocking Date: Sun, 11 May 2025 21:27:43 -0400 Message-ID: <20250512012748.79749-11-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|PH0PR11MB4920:EE_ X-MS-Office365-Filtering-Correlation-Id: e8f10ca9-896a-4790-5614-08dd90f43e62 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?Q0hqemdRbThNeEc5Tmd6OWc3ZER3QzhyUDY4V21aTlhVQUUyZDBuZ3ZoM1ZC?= =?utf-8?B?b2psQnJXRmVoV1hkRHpIRkx4cEhrTnhEWWdWSVdMVjUvQlduUU1ZMUVXR3Zh?= =?utf-8?B?cWpRMnZVVlpVQmtoMmdTNGNhMEJpTTVCNSs4OW0wdGZ4M1QreTlZbWptNTBU?= =?utf-8?B?M3pMYm8xMkxxZG43V1pYbEdOTGdXUFRWd3JEc2F0K0VKaXgrdkljYkZVeVdX?= =?utf-8?B?ZXVTa3Q4Z09mVUJLVm03U2owc0FNUCtCcTl4NE5xcllGblNiWVhtNXU3YTBy?= =?utf-8?B?S0VjQTVUbDB4U2ZOU3hIbGdqUUs5K3VDZmxSNGtyakpBbHZic3lrNXFVVHBv?= =?utf-8?B?MThzWlIzYzl4djJqYnlNeTYzSnMrYkVRYldBMFNNeEh2L3pxQ0FCUFhIUWVi?= =?utf-8?B?M0RtNFdHZXVmM1FnZGJxcDg0ZGNRZTZQQkh2TlhCS0F1UlhlMzVOcHZPVitY?= =?utf-8?B?VUVsS1R2RW5nOEp3c21XcVFkY0UyU1RrZ2NEeEtmamxYQlQwRFJZeFdkREJQ?= =?utf-8?B?OUtSTWo4NlRDMUU2czRSZlNpTmw5V3pHYlk2NkJXM3pmTWpYdlJNVzJqVnVW?= =?utf-8?B?alp1dzlWV0RmQkl5SkRHWStzMmZtL3M1MmExOGJwZSt1UGZia3htbE95UFJ0?= =?utf-8?B?R2NVUk1XVGRZZlhyak13aDkrTWpRZmdYQVNUZDNvTFRIbk9qdFdqSTNHY2xx?= =?utf-8?B?K3lEeUovODMwR2k2QzhJK1NRcWppMzlPODZwZUlLRjhzSFlkZzBSZnlHaFRv?= =?utf-8?B?cE0yUlQ1Z2k2OStXdGVxT3QzZlRhbGNZTVZFZ2hCVVZoeGIrZ3lwZThmMFhI?= =?utf-8?B?VnA1eGRibGxnbzMyR01tYWxmSnFJSGdpb2NSdEw1QkFHZjdwN0RNNVhXQ1pZ?= =?utf-8?B?ajZEaWNXWFFCMmN4cUNlMHJ3bkkyeC8yVlJRWnY5VjFiUUpBWjZpMTJCY1Jm?= =?utf-8?B?eWdQYVI5RVFlb2pmT1VRU1lHSmhSRzBNcW5ydVVUaHMzZ3RiWWdvaVhBTXdw?= =?utf-8?B?WEh5Y3ViRmZmZ09SamRqRHVwRTVYaFI1RUUya3VhSklsMmZCbHJnOGpZdWt0?= =?utf-8?B?Y0hyS01lOG5RRXRYcFZMb3o0RTlHWHcwYjRCSDZOWXc1U2hPZUxBWHh0Snho?= =?utf-8?B?ellEV0JmcVpNTmdpWjNBOThKdmx5aEF5Nkt2S3JsanF5SDNRVlloL2hpQ0E0?= =?utf-8?B?YXluZXBYUWpZQ3RkbUpuUlQyYmUxcHR0bC9SYVZ1TEJ6dno0ekJGOFEwejJ2?= =?utf-8?B?RlBpUDZ1NkQzSnMvTHhqZkhkYXNuTURrNjRvSDJhTUptZ2ZnazdwekE1ZU0y?= =?utf-8?B?WWt1NUlROTVxaG01NWFtdFJSNzZaQ0phQ0N3czRZOUc5L0xBMWVnOHZjRUYz?= =?utf-8?B?OFBFQ0tsblM4M1ZjYmZIR3JBaFRhNSs0WFZadHFnY21kT3oxK2NsNmNMQyt6?= =?utf-8?B?d1N3UHZJdnhRMUpIQUNYRWZBSko3S0RTYkp5MzJ6T1pneUtrd0M4UWZvZGla?= =?utf-8?B?QmZEemFlWXdvR3UyNzNCWFdlZFR0NXp5c1c2eVMxOTdHcnZHcjZJZDZlcThj?= =?utf-8?B?MnlXSlNTeEVkTm0yRktRUWUvZ1pBTDVxc2ZmQTB3ekl4cUZ3VGJVQXpDZTRO?= =?utf-8?B?M3Bxdks3Slp0cEo2dk56RkJUejBDSEJBald5Ym5iTWYvT0hjQ2pqMmNXMUpU?= =?utf-8?B?NTJqSGRCWkoxaE9YdDhlSkV6MmM3RkhxWDZTc1RmbzNNYmJZcWY2NEU5dEpu?= =?utf-8?B?MkxEdFREbjl1RE9OSlZtWEg5dXNKYjdoc3JIVW4zNjU1VmxXVW41Z0E5OVJl?= =?utf-8?B?ZjVLTUpRZTRCS3pTMWYzUUN3NGpudWZUWTZJc3drcW1EYnRyTmFVWlhLQlNN?= =?utf-8?B?WnNlSS91dDlyWFV4NWNPWUZhckRoNVlZUXVFNWxMYWsweEU2L3F6TFlwTGpW?= =?utf-8?B?VTdDQVI0bWdIcllneVpzWG1LYmhKWlQ2aG8wMFNrL0psTTh2azVFZzVBWVBV?= =?utf-8?Q?DKqbUssXNFlZVS7PIehPY1hkHqlfuE=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ZjFYQ0dSVElVWGJ2VWp5SDErdnZpa24wZU1OdTJrL3Vxd1UvYmdtM3RQQXd5?= =?utf-8?B?ai9hRUtpVGRvNmcxbml6NzlZaTVNSStMcVdpWk5ZZTIrbHJNOVVSTi9FUXM4?= =?utf-8?B?RFp1RnVxUzg1SWtEbC8zUlFOVytzZ3I3ckprMXhvL3dHVExka25oWGFMSWpD?= =?utf-8?B?TkhyQ1g5RnNEODE0L3YrNXNtRjVaZmtWUFRxVy9HbndwSXU5YzhaN3pKU3Nz?= =?utf-8?B?bHZYNVQ4K2pmTkdtbnBXSjhERDNWQzBkNXdyK285NEhyMWhGMlVnWUxsZFly?= =?utf-8?B?RVB1OTBDdnpWMVZHZXVBZnNGWks0cVdQYjdqbFRTMTdYVmlqd2ZNQ2YyQ2Ja?= =?utf-8?B?WU1nWGFTYWtuaWRoVTl4Wm5jbGk2bHJodXNjYS84RmxiMVlVRm9QQXFUek5a?= =?utf-8?B?cmxiTVlyenJqTjFTZjhIQUtNMkU3eFJCNnFmV1hLTWR1NHE3aCtiaGkzbC9E?= =?utf-8?B?TG9xWUJJVndBS09GYXZ4UGNlUG14NzhBZG9xQ3B4Q3pPT3Jua3FUMmczeXht?= =?utf-8?B?TXN6cjVPZi9mZTc5c1czRlc4ajZzY1lYaXZjRmtjREFOK215WlI3Mk85K3pR?= =?utf-8?B?UTk2QkRPQUUrd0lJdjI3S3BHQktXVTBZOWFiK3pPWEI5akFPekNkZVdKZUM3?= =?utf-8?B?TUpWNUwxNkVKR3Q3QUM4eGU1bTRzeWQ4TVFuT3VTeHBodThNQ3NrNkt2Ly9L?= =?utf-8?B?Ylo5azVWTUo2Nm9INkpQR0djUElpeFhGU2FoNG54SEZxTTRWakdSejFUREJC?= =?utf-8?B?QWJmU0l2VWUyQU10YjRmeWc1Q21oOGJjUFR6QWxHWStpek11TkNqY0UxZWZk?= =?utf-8?B?WGZTb3N1Y0FWeWVyOUcyc2kvYktPdjNQcVVkL09uK0ttdjlQUWZmTFV4ek5k?= =?utf-8?B?Q29GK091RmhkRUF6REZUK0hNR0d1QWdTU2VHeHAxUFg1ekx5WFlyWXpRSHda?= =?utf-8?B?bzlhWVJqZHZVdVVGTHR2MzBzSjJqWEhZL3pqWDg2bFNFUzA0TWphK3doT3pm?= =?utf-8?B?RWdFWmI0dXNMWkR2RzlBeGJhSVZkdzl6cmluYk5tNmVXM2paM2E5S3NTVEVN?= =?utf-8?B?YklQU244c2dEN25WUkI5cTFsZ1BLdVlMYU5YWHZhdUsrc211Z3hwbWJlODZQ?= =?utf-8?B?K3QxQzJidER5enNFT2k2TWl5Wm5ncGhRSzZNci8yU2VJTGpRL0NiOUYxdlNy?= =?utf-8?B?REd0ckNNVzkyMWtpblNCRU84WW1IOVFoazdvWjAzMmN1b0NNRktiUVJuUXB1?= =?utf-8?B?ZlZ3WkhpUmRqREdWaVU2dXhlOFJXS21qZWFXWXFtenB0bzc1dnB5U0I1R3lq?= =?utf-8?B?aDhCaDBrNXRhWFY5RzRadXJnSXU4akRJdDFRTTRGNWIyQTF4bVRhbTFtWkhj?= =?utf-8?B?Q1FaT3V6ajE4RTc1QUZ4bndRQi9XNjRFZzFlcnkzM3FpL1FSUzdJR0hjcFd4?= =?utf-8?B?WXFkTUJiaEViZlZkOXZjaitIMFdvamtUcmVLeFc1RU5yOU50TS9qQW1FOXV4?= =?utf-8?B?UGwxS0lEZXgyMDk3MTg1bkdTL0lsUlNiZDQxNXFGRGdUSWlHLzlqOW82N2sw?= =?utf-8?B?SkZBMVFwZlJHY05rbmNDUVRUS0NjUTVhRkhLOXk0MnV0MWpkd1ZaeGRZMnZD?= =?utf-8?B?T0MybGNHUjdGck1qRzJHWmtXU1l1TitYelhadnQ1dzJLaVAwRVFvTVM4ZXZO?= =?utf-8?B?eDQyOEV2Qmd0eTBWeXZHUkZoN0JVNHFCM0xERFBOS2VaSWxLQ3c5VVlCSGwv?= =?utf-8?B?K1BrUmVDOU4yRkl6NG1SRHd0aVAvdTNvakFQRWgrekpNeEZDanRnbndEcWcr?= =?utf-8?B?TGVnM1ZjVlk2Q0crSVpWaW4xeFdScFdXRmlPSklMR05NblpWYmhDWDVZYUdt?= =?utf-8?B?ZGYvQTFUcmNXM2lOUk9TZUhTNlZKZ3kxSEgzcmo5YW9mUXBqZXBva1NyTjd3?= =?utf-8?B?UE5IcXVveTlGRThEUU9rTlZWaWRJak5NR04vL1ZzN21vZDh5bFFSRDF5S3Bs?= =?utf-8?B?azBTeWJPTnYwek91RVRQb3VjTUcxU2RGeEkwVDZVcFY0VFhaSHcwVzB0ZUZF?= =?utf-8?B?UllWRmQvN2JBRmFoSWNQemIxcU5mSEhqY2RKSmlKT1Vza2xWdEFsS01WUzEx?= =?utf-8?Q?S1FRTO34Q46tykRR9Q7JPnuLr?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: e8f10ca9-896a-4790-5614-08dd90f43e62 X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:05.0908 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: sO+haYBxbD+8WNU2lLzySvz3e0J5lA5TEL3F62LhL99hkcjnhZlY6hKFi5jXj9PCbjpaquJd4JCuGa/vtwhgng== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR11MB4920 X-Proofpoint-GUID: _XyYAn7_z-G793oMIXQEp602CdkeN8hS X-Proofpoint-ORIG-GUID: _XyYAn7_z-G793oMIXQEp602CdkeN8hS X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX9IviIZXgTOVE bz9e2J58OeO2LHhCk2fTvfRv1PRXrG4pGmn4m8LIIugn0PVN5VFBqPFuOr8Xo3x+5GdjyySrAfI QNkYWdf4m8kIb3D4Hk0hk8q9KYf/B6dq3fUBWSANs2fvIOyHX7OCdlMVg73PNbD5FcTNCLDqtIE hIyUp7lwI3ZOqg78Qg1ClEkXQ7vf34twrw82vnROM6GH3u0PSK2mGq3HbHaom0cm/4dH730yIDo h1bzc7yrbYXx/b7zdGea3evemGVzi+21ZjvrYLZpeU6xTwI1ZQmvBl++RVnnAbM6vaUvtMx0Rfq RqgwltAL+Phx8nu/weUGBBocxIocP1X0R+0XiIkfxgTcp6yV9ld6LYUTVB3JF8U5ZLRwfPBkXJ1 iXN8ii9KrexcSayblKGSDi1R2yxFwQpMpLLCjxH6+Z3H5kXr7V2pCJmhx3CS59TKaLUTr2hQ X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214ea7 cx=c_pps a=coA4Samo6CBVwaisclppwQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=ejdkOH3wlQVQteUC5O0A:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=999 clxscore=1011 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 In order to make life easier for consumer drivers, make cpc_endpoint_disconnect() blocking. Once the call returns, it guarantees that endpoint's rx callback won't be called anymore, making driver's teardown simpler to implement. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/cpc.h | 1 + drivers/net/cpc/endpoint.c | 19 ++++++++++++++++++- drivers/net/cpc/interface.c | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/net/cpc/cpc.h b/drivers/net/cpc/cpc.h index 34ee519d907..8a761856deb 100644 --- a/drivers/net/cpc/cpc.h +++ b/drivers/net/cpc/cpc.h @@ -21,6 +21,7 @@ extern const struct bus_type cpc_bus; /* CPC endpoint flags */ enum { CPC_ENDPOINT_UP, /* Connection is established with remote counterpart. */ + CPC_ENDPOINT_RECEIVING, /* Interface RX work is processing a frame for th= is endpoint. */ }; =20 /** diff --git a/drivers/net/cpc/endpoint.c b/drivers/net/cpc/endpoint.c index 7e2f623fb8e..f953e4cb7ab 100644 --- a/drivers/net/cpc/endpoint.c +++ b/drivers/net/cpc/endpoint.c @@ -260,8 +260,25 @@ void __cpc_endpoint_disconnect(struct cpc_endpoint *ep= , bool send_rst) =20 cpc_interface_remove_rx_endpoint(ep); =20 - if (send_rst) + if (send_rst) { + /* + * It makes sense to wait on the RECEIVING bit only when send_rst is tru= e as this + * means the operation was initiated by the user and can happen concurre= ntly with + * the RX work function. If a RST is received from the remote and + * __cpc_endpoint_disconnect from the RX work function, then it's safe t= o assume + * that this frame won't trigger a call to ep->ops->rx function. + */ + int err; + + err =3D wait_on_bit_timeout(&ep->flags, + CPC_ENDPOINT_RECEIVING, + TASK_INTERRUPTIBLE, + msecs_to_jiffies(1000)); + if (!err) + dev_warn(&ep->dev, "Timeout when disconnecting.\n"); + cpc_protocol_send_rst(ep->intf, ep->id); + } } =20 /** diff --git a/drivers/net/cpc/interface.c b/drivers/net/cpc/interface.c index 30e7976355c..13b52cdc357 100644 --- a/drivers/net/cpc/interface.c +++ b/drivers/net/cpc/interface.c @@ -36,6 +36,8 @@ static void cpc_interface_rx_work(struct work_struct *wor= k) continue; } =20 + set_bit(CPC_ENDPOINT_RECEIVING, &ep->flags); + switch (type) { case CPC_FRAME_TYPE_DATA: cpc_protocol_on_data(ep, skb); @@ -50,6 +52,8 @@ static void cpc_interface_rx_work(struct work_struct *wor= k) break; } =20 + clear_and_wake_up_bit(CPC_ENDPOINT_RECEIVING, &ep->flags); + cpc_endpoint_put(ep); } } --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 67A29212FBD; Mon, 12 May 2025 01:28:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013310; cv=fail; b=KarPRghLGmlqaYqiI58+AMxGGLKXSrzbRCtqxwwF54Flguv1gHzfZENdlLjSQdwHxb7thux3Qu9etU8DL+Kj2HRXDcwkqlgmDEldg8kLJN7P1b70ZZEgmBGFHZD21yG5Rjwvac741sGQIQhfyrUUDDf3BqHvT5GZrX/BdmZ/AdM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013310; c=relaxed/simple; bh=BOlevcCcopUqKn3RQdHywD/3nNBn2LVTd6rEH5JZs+0=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=W0jx9CwkZiDuLWeAmT9O8TEuAjkafRbU3JDIhFVZlYmyGC4hizl5HjsJpd6RyhTxFM3BElX2IZKPGmevu+UOaYVwJrGmkiG3tObZpj4zOioxCP/b2vbzVUq8C3P077lP4fosox62rjRdD/Fyy68tzk2vLvi9za9XcAaVZCMD54k= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=BUKbWHP4; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=Gm5+HLT5; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="BUKbWHP4"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="Gm5+HLT5" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54BMe1Rs027700; Sun, 11 May 2025 20:28:10 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=pyZqhMwr/SpNd+33ZfcKpTFgNZPEpMjHNd7ROlVnCXk=; b=BUKbWHP41o4k 1NqoE0jj8ZajAqVYWThEnTD9r73zJqwUJll6PDTkzZOOM8ShOyiJ7w/E9AvHttvA K/+QpAtvutVXX+SgbahsE8h2FcyEDhabaARqxOHmLo9JCusyw0paFDHDmLFUYSUp XLRkNVNuI+QgKs2IkguAn6w5RlIudKWkO4+Jo/9fykfHk3jHaiT2AXJX5mG0E37S +xccuXj2aR4nMQeNyisf1sDdLl5GXjnQfl7hYOoJHHX19TER9FLq9K32L4CPhIyR VBjC5kwg3Td7vu10vFmhAFM4xN+mCFbeJyyjNqFlyfZmuPNnTN33Se8Y31F72H5N 4psJKyeILA== Received: from nam04-dm6-obe.outbound.protection.outlook.com (mail-dm6nam04lp2044.outbound.protection.outlook.com [104.47.73.44]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw9-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:09 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Tzp7n6fWsSV8onLhEBDLV6Ff1vLqb2MRkwxMzFDMizlWJu8/fwTxczEJVy1YjMHdFxVIhOQBrHnuz/lj5p0nrYFiQsmsEPiLF+Luq+NPv1YS6jaAf+uCbep9/Ekjsbu2JCdHy4UpTpWC0vL4Wr8BpNM1YarZuyBYZ2WRDMxMYrxDPL0Ixv2vx1toilUN+zcMwGHR++I78ENEmqr1qJDJ464ks5skQe5FnnQgsM9EyE8jLesbhKNand2bx1PDLMPJwiUuFIaNqDG7su6yf8HDb9GtWBbhU/XSHHfOZ7Y9gLkqppnhrKKkwZQ27Hq0CGJgFFJggp6/lp/YoZ/mFcuiPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=pyZqhMwr/SpNd+33ZfcKpTFgNZPEpMjHNd7ROlVnCXk=; b=oaCPfN1EhwRKrzodeaZD5W/baH4g69FDCdHl7vd7t8G2d1Kjh+YKW0VxbyCGEdf8dlXr+DnbKgNkq/kqJg/gLauQn4tx/TEUwdG6BRb8NCqWbZimyY7/MzXiiXTidgbohiCXMmJZEjy2y6AUnk/xjMUp7I55B4AjLiZanpO2fkkeC/iHyTWaNHCqQb1xQHaWC3zWQWV+F2rGHu78dxAwR75dlC6sMFCPMrqEIgoGwMxYXmNJ9X4LvNeReeWW5iju1vAFa6jYE9KxSlRagCQuQRHF+NiOVVGQM+ahFaguLk5FBzVj8+C2QfhKP2CUo7La8rnQeN1Sd3cO0LmRd+arZw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=pyZqhMwr/SpNd+33ZfcKpTFgNZPEpMjHNd7ROlVnCXk=; b=Gm5+HLT5FBKGHNHgmhe9nPTlzwIl6v/9j4JcGZaDkasBMQB/HHDQxfYWyCwo42cTzZs1O6BWCppqLE7d9Md1rvuO/x/qxQwzo0Jsje7FHOuwSJE/mxgQ/HuIrqQgIW6lpsv5TwZPbQjQMmufeWdf/7hT8E12y7mWISl/jy52WV8= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by PH0PR11MB4920.namprd11.prod.outlook.com (2603:10b6:510:41::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.27; Mon, 12 May 2025 01:28:05 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:05 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 11/15] net: cpc: add system endpoint Date: Sun, 11 May 2025 21:27:44 -0400 Message-ID: <20250512012748.79749-12-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|PH0PR11MB4920:EE_ X-MS-Office365-Filtering-Correlation-Id: 4ddb6ab0-1822-4a4d-2aff-08dd90f43ed5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?YmhndEVHdU5BcUI4RnV6b0UrTGlmU0QzdlhxejFDc2FvVjJVRGR1UGp4KzhY?= =?utf-8?B?RlQwOEt4ZTRkTUxOZm4ybWVuaU8zYVVseTNOK2g2U0lDc1FoSXgvbGlaRmdB?= =?utf-8?B?YmFFclZncWdkV294SC9zendWOUlwVU5mR0JKOVIwTDgrSS81YWpZSFI0cjFK?= =?utf-8?B?bFR5YUY1RGNOQ1plRkJXeTl1QmFtVWY1Z3lEODV2TlhxYXpTeER0dUNyZHdQ?= =?utf-8?B?bStMMXEzaXdHT1NINnBoSHlTT2M0WUlhbWFFR0pSdkd6TFNvR0pvOHp5RlI2?= =?utf-8?B?RkJ5WE9QeXdtUmF3S3hNOVU1UlVYZjdOaDBGWGdPS3I2MmJjcXFqUFZDUFNh?= =?utf-8?B?blkrbUVPM2taRXpQWjA5bnlHZk1HaFpkNXVoV1Nqa25MUHZXd00rZ3FGV2Jm?= =?utf-8?B?V2JGS3hKS0d1TVRGSlM0QktabXNZeE84WnRjYTNHM3pvNmRGYS8zeFg2Rm1R?= =?utf-8?B?cGt1aXVRdXBoZVRmSllPYmtQekU1eUh6a3RDU1BXMFBzcHl6UUd4akNkSk1F?= =?utf-8?B?NTdsaWpZdUIycmFFOUFxTHRZNFkyQk1DVUZiRUphZWdwWG8yQkJpZ2puTXFE?= =?utf-8?B?TWZNYnVyVEl6eGxMenJqL3NOQTNOTG5OUVB0WXByUC9FR0QxT3BpbVdoY3J1?= =?utf-8?B?ejVKeE1lQXh1YndPWkZrSmwzSG5uT2NZTnB1TXd0L1FJZytNVXEzTTRTL2tK?= =?utf-8?B?VFNGaEdDTHh2b0IzRkphUm0rL1NrRkp2anpiTkRFdGcxdXBSRXNDU1ZJVnRN?= =?utf-8?B?b2NGWmJ0QTBhT3pZRmxvOFU5QUF0SEhnWDhvSFJvYVc1VDhEUlJiN1MrWUlw?= =?utf-8?B?S0tkamhJZnJMR2FkN3JzRWRhZFltbFJEWWoxWXJkYjVES1VTdkhzUzZDMzdT?= =?utf-8?B?eE80aU1rREJYNUNSZTR0L2Nqb1V1OVdkREE1aWsxN1MwK1k4SVRsQ2tudHdE?= =?utf-8?B?a0cvZTEvTjVkTFhQYStLZGRvNTlUSXN5cCs3ZS9CS1dnV0d3N2duY1ZUOXcw?= =?utf-8?B?RTJOTUs5cWRTVmd3dmwvY1JaT2hqck1KOC82ampSbndpWUtML1VPTjlPVUdy?= =?utf-8?B?Tk1pRTQzcnd0WnhDb3JIOW5JVzhOSEJRbElXZWtBYnQxQ0pKOFRUWFZCaits?= =?utf-8?B?am10Z1NQRGVSVGl3Qjl6eEV5NTFLZTFwbUN0Nm5ic255Wk5jN2ZtWHVhSWZ3?= =?utf-8?B?R25YaFN1WFhGdVdWOXkxODY4NFU1ZDZsMVBzbVg1c3A0R0poZFdhMGFMVnlU?= =?utf-8?B?aXZDT1k0U1U5Wi9MS2kzc1BzeDcvcXBRSTl5SUtyeTFqMlZBTkd2OXR5dy9x?= =?utf-8?B?ci90QjdwcXZFRjRXQ1d3QzF6UFY0bTU2bndXOEJFdGRzVjRjVFRpTVNmTTVV?= =?utf-8?B?K2ZLNkc0WUVXQWdXbWZCQTFRRGQvZDdMVSsrRTUraGVpL0FNeUJuVTNqb1F6?= =?utf-8?B?Qjk5dXM5VnNXUW5sWjhJcHk1NHpia0RVZ1hNUlhwajVFa3k0ZmNWWkNnZjdj?= =?utf-8?B?TlhMYUlWVnlwMDdlS21tOFlXN1BjbTl0VHdzdkVZSDBOZmppdTAyTXVnRGZa?= =?utf-8?B?WXI4WVQzM0FxQjIzeExCUWdibER6UUdZaGpEVmtXS05aSm5VS0o5TFUzNDM0?= =?utf-8?B?cjFUU1F1WHNLeHlrd3ZDVng2TkFUNFpwc0E1TENIZHo4aWNhc0poRmM4a3Nm?= =?utf-8?B?QVhKZThXT3A4bXRPbTNzYVF3d0ZNQTM3Nmc0cnUwMWRDRElHL2lSTDAwL2x0?= =?utf-8?B?Tm9BajVUc0pOOFlqbnFQdDMwMTVUSi9XbkJmK2dBR0hDWG1ub21ldko4QThZ?= =?utf-8?B?bENRbEJVcEZHWm1yL1BHd3V2bmt0TGxSWWY2M0dDbWh5MVo0L2xrM09NVklm?= =?utf-8?B?ZThZcHJRaUxxaEJuSVRIaDU5aUVBaDVzYTFyZTZRNUZBbUh6UXBzQkpPRitI?= =?utf-8?B?dnNHYkNJdHgzVXUvMHRpUC92bzBHQ0N6SGJOUkdZR251aENlM2swczkwR0Rv?= =?utf-8?Q?4/XT/EDCSXZENQv7KkC2p8C4W2NMWM=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TzlkMzBBMU9McWcvL3VPa2xFZGp6NnRzMFpzUVpSMFVIQ0czT0hVY0t0RUJY?= =?utf-8?B?Slk1cENHSGRkakNiaW1UTkx3QU0vUFVJWUFaeVVObU1NNkR3MHNNSWt1Rm5n?= =?utf-8?B?Qk1uTFRjNmNiUm9NVXVYSFUvbVlZRU1aRkp5K20zYmdTdlJGaUZVK1l3S2h3?= =?utf-8?B?WGsvUTRhRjNpNzhTTzgrbldYUEhNek0vdnhZSWd5Uk84bk5SYm5VOFBPS0pP?= =?utf-8?B?d2FpeEcwY0U5TUdzZ1lycitzcDFlcmcwODBBWnREYTNlM215a2xFcFowVkw5?= =?utf-8?B?ZUNFbzhpWXdrZllSeEZJK0JrL1Bac0NHTFZ1S0NxcnZ5UmhhWE51MUJzbGlE?= =?utf-8?B?WjNMUHNLbGNmMGVPS3piS2hCOW1IcnBzWm04N1NGazZwM2p0THpJSDF4RWt3?= =?utf-8?B?c0pZK0drOGRhWWx1MEE5cmVBRW5PenhiRHNLYytySCtETjZiOW91eU13ZjBN?= =?utf-8?B?ejh5bk9seDZxaVZRbW1OdFFpbUNNU0d1UWNjNU44NlFRRWZ3Smk0NGRSWDFh?= =?utf-8?B?NGNTT1ZoV2tTdDl6UGZvNlprZWQzVjJacmtkekNIanNNbVJJVE5rTUd3VTk0?= =?utf-8?B?angzcUtUZTJ0a0tsQ0VXMzh5bjBFQ1I0TWNJYmRZK1REZFBic28rMU5GQ0dT?= =?utf-8?B?Y1QxR3BCNEVXckNjTTFvbjdhRUhybW15anExWlAwVHo0UTEvbU1RQ0x5TmJk?= =?utf-8?B?OVYyMnJnRjdTVG5RdnI0NTUzamx5ZVNqTS8vL2pkeDFiMHliWkNSSkE0VFJw?= =?utf-8?B?azg1S21GemVHRzdwdWZkNFZWYW1vU2sxQUZnSW54cElqaEhHcDkrdE9ldVdF?= =?utf-8?B?dDdxUzlCdVB5cEZva0FIMmF2cXRtVzYzNm9zQ2Y5UlNtQ3pyT080Z1dKVnhw?= =?utf-8?B?TkNWbWtVOHpCVFFJZ2pvWnJBd25nVnZTTWZvZG5oNWFDcWxjNHdVK05GTmVH?= =?utf-8?B?OFZ1dXdJbjZJRlFNYnVVTjVDL2hJT0VVSWdQWHlLTHg2eHFMeFVSa0FtRnRU?= =?utf-8?B?aE14RGJXUE9FcTZuWjVsVlpsYXFLT1pneS96d0ZBNkJ5TytNMVNpK296K05z?= =?utf-8?B?Y0ZvUnFyNFN3WnJFcnZRMVpoejZJb2dBRWkybGh5Rmowbnc4eUV2Y3FWdWZL?= =?utf-8?B?NW91aHFUdXB1Q0NSL2dZRGhCWDBMYWZ0ZytyMVVucVEzQ2RtRGVLYXJWNWIv?= =?utf-8?B?VE1VN3VtRDBMRXBrUmdxTkFmQXp4L3o4QUREVUlYL0NnL1N6Z2FaMEI4ZFIr?= =?utf-8?B?UmNNSlpOZjBWaTNmU3dUZzB1MkdYOGRKMHBBVmpkelNVa2Vsc0gxcGR0cUJH?= =?utf-8?B?VURhVG5vRU9lbWlqVkVHYVVGU3Q1cjlHTFBmMXFKdW1LS0RaMVZ6ODJxTzRG?= =?utf-8?B?RU0yd3ZNYktLUWl0cENLeHV0SkdqdDJ2YkRaRWtmbFRNY1pINUJKYWFRMHI1?= =?utf-8?B?aktUZkwrNGxlemI1ZzR6TzBiSlJ4dWVkejNSdHcxYkFPeFZEeW1VYjFaVkZ4?= =?utf-8?B?Q0xMLzFJZ1dFRGJRNXA5c0hzb2JnOWlUZ0g1LzRZS285bEJmRUl4S0cyVjZW?= =?utf-8?B?M1ludFVHOGdtajlYakp0bXd6aTQrR0Z0L0ZGamJzYTEzZUxaTHFETUhFYTZl?= =?utf-8?B?WmNqWG1BckFQeVVjUVppZUpVeXZ1dVhlR3ZqdjNQSXpLc1pGZEI1cWxpQngw?= =?utf-8?B?TWdNQXBUcTRyZ29iaFVGVE9WcytPS0FZUGZNdzRZY3Y5U2tmSUFydU1xcko2?= =?utf-8?B?U1FGMVZBcnAySldlVHk5bzBBNHRzWWN3bWEyTGFKNzhtaGpLVTA0QWR1M2lK?= =?utf-8?B?YVRqYlQ0UlduV3JQYXBEMmYrd3RIQjlESTc1d3l4SU92VmtCUFZtd1M2QVdO?= =?utf-8?B?RytLY2Y1R2ZqajBGTmcrQlZuNFBvMjFXZTNkYmlFOFplSjQvcnJaUU1KaXRX?= =?utf-8?B?WFNKOU9vZ1NGSmxxZlJSV2Via1p2a2wvaUdYNThaaU9qdkMrMkswTWFlZnhw?= =?utf-8?B?ZEc4Z0dVZzJUcnZmZ3REZFN5a2k3Ri8vMnNYcm44L3dFNUV0cHc5WHM4YUxE?= =?utf-8?B?QytiWisrTkVyR0FONmkxT3V6dGZ0cGxZN0xrRVVJSmF5ZEY4VU9aYmhYY2tY?= =?utf-8?Q?WWBwW5y0m2yDdk0uELW+9wAQ3?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4ddb6ab0-1822-4a4d-2aff-08dd90f43ed5 X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:05.8746 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: BhiUXTGm53iG+MGfjofIV0q7lXh6hfept/EXC8zWm+Itw5ALD//X1LZVa/lSFq6LG2jo7hUxDFHC9AulQD+OEA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR11MB4920 X-Proofpoint-GUID: CrTAKVv6-MCkcgTejZi1BdaLBYMVfj01 X-Proofpoint-ORIG-GUID: CrTAKVv6-MCkcgTejZi1BdaLBYMVfj01 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX862RZeIVvQqk TGGRqCuf+vCNZHwloIlLQaVb3I3NmCjkuQxGXhkfF1V9ISM+w3So0LBUwHcZmUQw2+Mw3wME4Jc 4s5TtXzdhep/prHwy/dF0ivyjOTMlia0qwYMBfWcaFB+QsaiP0HWpHMLxMw+lBtA7g3bc8lk2uV AhGyLD8pnFusZef+6mwZl3oN95zQB47aNP4ciAkYUd+C9zI66mUrP8qP6Lb8Oz0XpCD/HgXY7vl kCcDlCJXuSlheqNCtRC9dx7KzIW/ov8XfvJ4kqlruuCYt+U1b1iTSz9g6TwNQsPzlX1GAD0M13S 0Jox2pQlksFfi8xoEB4AsPO7tzUCvcfBYvMi/bkJoPjW7cMZWKsdvZR0FLMkK58zNfqONjz8MRb x2Bq6vEn9cgE6ZaX5nwQNOKeOHtpDcT2zSdP6g+Hw6F6kbolckkQfbtN7IhI2XZgQ5njI4Pe X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214eaa cx=c_pps a=coA4Samo6CBVwaisclppwQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=J-GgsyN5KvRDZGlfWz4A:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=999 clxscore=1015 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 The system endpoint is the main endpoint and is guaranteed to be present in every CPC-enabled device. It is used to communicate device capabilities. One of the key element of the system endpoint is that it will send a notification when an endpoint is opened on the microcontroller. When such notification is received by the host, a new endpoint will be registered. As registering a new endpoint can be a long operation, as in the end it calls device_add(), system's endpoint processing of RX frames is dispatched in its own work function. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/Makefile | 2 +- drivers/net/cpc/main.c | 8 + drivers/net/cpc/system.c | 432 +++++++++++++++++++++++++++++++++++++++ drivers/net/cpc/system.h | 14 ++ 4 files changed, 455 insertions(+), 1 deletion(-) create mode 100644 drivers/net/cpc/system.c create mode 100644 drivers/net/cpc/system.h diff --git a/drivers/net/cpc/Makefile b/drivers/net/cpc/Makefile index 0e9c3f775dc..a61af84df90 100644 --- a/drivers/net/cpc/Makefile +++ b/drivers/net/cpc/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 =20 -cpc-y :=3D endpoint.o header.o interface.o main.o protocol.o +cpc-y :=3D endpoint.o header.o interface.o main.o protocol.o system.o =20 obj-$(CONFIG_CPC) +=3D cpc.o diff --git a/drivers/net/cpc/main.c b/drivers/net/cpc/main.c index 8feb0613252..fc46a25f5dc 100644 --- a/drivers/net/cpc/main.c +++ b/drivers/net/cpc/main.c @@ -8,6 +8,7 @@ =20 #include "cpc.h" #include "header.h" +#include "system.h" =20 /** * cpc_skb_alloc() - Allocate an skb with a specific headroom for CPC head= ers. @@ -118,6 +119,12 @@ static int __init cpc_init(void) int err; =20 err =3D bus_register(&cpc_bus); + if (err) + return err; + + err =3D cpc_system_drv_register(); + if (err) + bus_unregister(&cpc_bus); =20 return err; } @@ -125,6 +132,7 @@ module_init(cpc_init); =20 static void __exit cpc_exit(void) { + cpc_system_drv_unregister(); bus_unregister(&cpc_bus); } module_exit(cpc_exit); diff --git a/drivers/net/cpc/system.c b/drivers/net/cpc/system.c new file mode 100644 index 00000000000..1d5803093f8 --- /dev/null +++ b/drivers/net/cpc/system.c @@ -0,0 +1,432 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cpc.h" +#include "interface.h" +#include "protocol.h" +#include "system.h" + +/** + * enum cpc_system_cmd_id - Describes all possible system command id's. + * @CPC_SYSTEM_CMD_NOOP: Used for testing purposes. + * @CPC_SYSTEM_CMD_PROP_NOTIFY: Used for notification purposes. + * @CPC_SYSTEM_CMD_PROP_VALUE_GET: Used to fetch a property. + * @CPC_SYSTEM_CMD_PROP_VALUE_SET: Used to set a property. + * @CPC_SYSTEM_CMD_PROP_VALUE_IS: Used for receiving asynchronous properti= es. + * @CPC_SYSTEM_CMD_INVALID: Used to indicate a system command was invalid. + */ +enum cpc_system_cmd_id { + CPC_SYSTEM_CMD_NOOP =3D 0x00, + CPC_SYSTEM_CMD_PROP_NOTIFY =3D 0x01, + CPC_SYSTEM_CMD_PROP_VALUE_GET =3D 0x02, + CPC_SYSTEM_CMD_PROP_VALUE_SET =3D 0x03, + CPC_SYSTEM_CMD_PROP_VALUE_IS =3D 0x06, + CPC_SYSTEM_CMD_INVALID =3D 0xFF, +}; + +/** + * enum cpc_system_property_id - Describes all possible system property id= entifiers. + * @CPC_SYSTEM_PROP_INVALID: Invalid property. + * @CPC_SYSTEM_PROP_PROTOCOL_VERSION: Protocol version property. + * @CPC_SYSTEM_PROP_DRV_CAPABILITIES: Driver capabilities property. + * @CPC_SYSTEM_PROP_CPC_VERSION: CPC version property. + * @CPC_SYSTEM_PROP_APP_VERSION: Application version property. + * @CPC_SYSTEM_PROP_RESET_REASON: Reset reason property. + * @CPC_SYSTEM_PROP_EP_OPEN_NOTIF: Endpoint open notification property. + */ +enum cpc_system_property_id { + CPC_SYSTEM_PROP_INVALID =3D 0x00, + CPC_SYSTEM_PROP_PROTOCOL_VERSION =3D 0x10, + CPC_SYSTEM_PROP_DRV_CAPABILITIES =3D 0x11, + CPC_SYSTEM_PROP_CPC_VERSION =3D 0x12, + CPC_SYSTEM_PROP_APP_VERSION =3D 0x13, + CPC_SYSTEM_PROP_RESET_REASON =3D 0x14, + CPC_SYSTEM_PROP_EP_OPEN_NOTIF =3D 0x800, +}; + +/** + * enum cpc_system_status - Describes all possible system statuses. + * @CPC_SYSTEM_STATUS_RESET_POWER_ON: Reset was due to a power reason. + * @CPC_SYSTEM_STATUS_RESET_EXTERNAL: Reset was due to an external reason. + * @CPC_SYSTEM_STATUS_RESET_SOFTWARE: Reset was due to a software reason. + * @CPC_SYSTEM_STATUS_RESET_FAULT: Reset was due to a fault. + * @CPC_SYSTEM_STATUS_RESET_CRASH: Reset was due to a crash. + * @CPC_SYSTEM_STATUS_RESET_ASSERT: Reset was due to an assert. + * @CPC_SYSTEM_STATUS_RESET_OTHER: Reset was due to some other reason. + * @CPC_SYSTEM_STATUS_RESET_UNKNOWN: Reset was due to an unknown reason. + * @CPC_SYSTEM_STATUS_RESET_WATCHDOG: Reset was due to a watchdog trigger. + */ +enum cpc_system_status { + CPC_SYSTEM_STATUS_RESET_POWER_ON =3D 112, + CPC_SYSTEM_STATUS_RESET_EXTERNAL =3D 113, + CPC_SYSTEM_STATUS_RESET_SOFTWARE =3D 114, + CPC_SYSTEM_STATUS_RESET_FAULT =3D 115, + CPC_SYSTEM_STATUS_RESET_CRASH =3D 116, + CPC_SYSTEM_STATUS_RESET_ASSERT =3D 117, + CPC_SYSTEM_STATUS_RESET_OTHER =3D 118, + CPC_SYSTEM_STATUS_RESET_UNKNOWN =3D 119, + CPC_SYSTEM_STATUS_RESET_WATCHDOG =3D 120, +}; + +/** + * struct cpc_system_cmd - Wire representation of the system command. + * @id: Identifier of the command. + * @seq: Command sequence number. + * @len: Length of the payload in bytes. + * @payload: Variable length payload. + */ +struct cpc_system_cmd { + u8 id; + u8 seq; + __le16 len; + u8 payload[]; +} __packed; + +/** + * struct cpc_system_cmd_property - Wire representation of the system + * command property. + * @id: Identifier of the property. + * @payload: Variable length property value. + */ +struct cpc_system_cmd_property { + __le32 id; + u8 payload[]; +} __packed; + +struct cpc_system_cmd_handle { + u8 seq; + struct list_head node; +}; + +struct cpc_system_cmd_ctx { + struct mutex lock; /* Synchronize access to command list */ + u8 next_seq; + struct list_head list; + + struct work_struct init_work; + struct work_struct rx_work; + + struct sk_buff_head rx_queue; + + struct cpc_endpoint *ep; +}; + +static bool __cpc_system_cmd_pop_handle(struct cpc_system_cmd_ctx *cmd_ctx, + struct cpc_system_cmd_handle **cmd_handle) +{ + *cmd_handle =3D list_first_entry_or_null(&cmd_ctx->list, struct cpc_syste= m_cmd_handle, node); + + if (*cmd_handle) + list_del(&(*cmd_handle)->node); + + return !!*cmd_handle; +} + +static void cpc_system_cmd_init(struct cpc_system_cmd_ctx *cmd_ctx) +{ + mutex_init(&cmd_ctx->lock); + INIT_LIST_HEAD(&cmd_ctx->list); + cmd_ctx->next_seq =3D 0; +} + +static void cpc_system_cmd_clear(struct cpc_system_cmd_ctx *cmd_ctx) +{ + struct cpc_system_cmd_handle *cmd_handle; + + mutex_lock(&cmd_ctx->lock); + while (__cpc_system_cmd_pop_handle(cmd_ctx, &cmd_handle)) + kfree(cmd_handle); + + cmd_ctx->next_seq =3D 0; + mutex_unlock(&cmd_ctx->lock); +} + +static bool cpc_system_cmd_find_handle(struct cpc_system_cmd_ctx *cmd_ctx, + u8 cmd_seq, + struct cpc_system_cmd_handle **cmd_handle) +{ + mutex_lock(&cmd_ctx->lock); + + list_for_each_entry((*cmd_handle), &cmd_ctx->list, node) { + if ((*cmd_handle)->seq =3D=3D cmd_seq) { + list_del(&(*cmd_handle)->node); + mutex_unlock(&cmd_ctx->lock); + return true; + } + } + + mutex_unlock(&cmd_ctx->lock); + + return false; +} + +static void cpc_system_on_reset_reason(struct cpc_endpoint *ep, struct sk_= buff *skb) +{ + u32 reset_reason; + + if (skb->len !=3D sizeof(reset_reason)) { + dev_err(&ep->dev, "reset reason has invalid length (%d)\n", skb->len); + return; + } + + reset_reason =3D get_unaligned_le32(skb->data); + + switch (reset_reason) { + case CPC_SYSTEM_STATUS_RESET_POWER_ON: + case CPC_SYSTEM_STATUS_RESET_EXTERNAL: + case CPC_SYSTEM_STATUS_RESET_SOFTWARE: + case CPC_SYSTEM_STATUS_RESET_FAULT: + case CPC_SYSTEM_STATUS_RESET_CRASH: + case CPC_SYSTEM_STATUS_RESET_ASSERT: + case CPC_SYSTEM_STATUS_RESET_OTHER: + case CPC_SYSTEM_STATUS_RESET_UNKNOWN: + case CPC_SYSTEM_STATUS_RESET_WATCHDOG: + dev_dbg(&ep->dev, "reset reason: %d\n", reset_reason); + break; + default: + dev_dbg(&ep->dev, "undefined reset reason: %d\n", reset_reason); + break; + } +} + +static void cpc_system_prop_value_is(struct cpc_endpoint *ep, struct sk_bu= ff *skb) +{ + u32 id; + + if (skb->len < sizeof(id)) { + dev_warn(&ep->dev, "command property with invalid length (%d)\n", skb->l= en); + return; + } + + id =3D get_unaligned_le32(skb_pull_data(skb, sizeof(id))); + + switch (id) { + case CPC_SYSTEM_PROP_RESET_REASON: + cpc_system_on_reset_reason(ep, skb); + break; + default: + dev_dbg(&ep->dev, "unsupported command property identifier (%d)\n", id); + break; + } +} + +static void cpc_system_on_prop_value_is(struct cpc_endpoint *ep, struct sk= _buff *skb, u8 seq) +{ + struct cpc_system_cmd_ctx *cmd_ctx =3D cpc_endpoint_get_drvdata(ep); + struct cpc_system_cmd_handle *cmd_handle; + + if (cpc_system_cmd_find_handle(cmd_ctx, seq, &cmd_handle)) { + cpc_system_prop_value_is(ep, skb); + kfree(cmd_handle); + } else { + dev_warn(&ep->dev, "unknown command sequence (%u)\n", seq); + } +} + +static void cpc_system_on_ep_open_notification(struct cpc_endpoint *ep, st= ruct sk_buff *skb) +{ + struct cpc_endpoint *new_ep; + u8 ep_id; + + /* + * Payload should contain at least the endpoint ID + * and the null terminating byte of the string. + */ + if (skb->len < sizeof(ep_id) + 1) { + dev_warn(&ep->dev, "open with invalid length (%d)\n", skb->len); + return; + } + + ep_id =3D *(u8 *)skb_pull_data(skb, sizeof(ep_id)); + + if (skb->data[skb->len - 1] !=3D '\0') { + dev_warn(&ep->dev, "non nul-terminated endpoint name for ep%u\n", ep_id); + return; + } + + if (skb->len > sizeof(ep->name)) { + dev_warn(&ep->dev, "oversized endpoint name (%d) for ep%u\n", skb->len, = ep_id); + return; + } + + dev_dbg(&ep->dev, "open notification for ep%u: '%s'\n", ep_id, skb->data); + + new_ep =3D cpc_endpoint_alloc(ep->intf, ep_id); + if (!new_ep) + return; + + memcpy(new_ep->name, skb->data, skb->len); + + /* Register the new endpoint in the same interface that received the noti= fication. */ + cpc_endpoint_register(new_ep); +} + +static void cpc_system_on_prop_notify(struct cpc_endpoint *ep, struct sk_b= uff *skb) +{ + u32 id; + + if (skb->len < sizeof(id)) { + dev_warn(&ep->dev, "command property with invalid length (%d)\n", skb->l= en); + return; + } + + id =3D get_unaligned_le32(skb_pull_data(skb, sizeof(id))); + + switch (id) { + case CPC_SYSTEM_PROP_EP_OPEN_NOTIF: + cpc_system_on_ep_open_notification(ep, skb); + break; + default: + dev_dbg(&ep->dev, "unsupported command property identifier (%d)\n", id); + break; + } +} + +static void cpc_system_on_data(struct cpc_endpoint *ep, struct sk_buff *sk= b) +{ + struct cpc_system_cmd *system_cmd; + u16 payload_len; + u8 seq; + + if (skb->len < sizeof(*system_cmd)) { + dev_warn(&ep->dev, "command with invalid length (%d)\n", skb->len); + kfree_skb(skb); + return; + } + + system_cmd =3D skb_pull_data(skb, sizeof(*system_cmd)); + payload_len =3D le16_to_cpu(system_cmd->len); + seq =3D system_cmd->seq; + + if (skb->len !=3D payload_len) { + dev_warn(&ep->dev, + "command payload length does not match (%d !=3D %d)\n", + skb->len, payload_len); + kfree_skb(skb); + return; + } + + switch (system_cmd->id) { + case CPC_SYSTEM_CMD_PROP_VALUE_IS: + cpc_system_on_prop_value_is(ep, skb, seq); + break; + case CPC_SYSTEM_CMD_PROP_NOTIFY: + cpc_system_on_prop_notify(ep, skb); + break; + default: + dev_dbg(&ep->dev, "unsupported system command identifier (%d)\n", system= _cmd->id); + break; + } + + kfree_skb(skb); +} + +static void cpc_system_rx_work(struct work_struct *work) +{ + struct cpc_system_cmd_ctx *cmd_ctx =3D container_of(work, struct cpc_syst= em_cmd_ctx, rx_work); + struct sk_buff *skb; + + while ((skb =3D skb_dequeue(&cmd_ctx->rx_queue))) + cpc_system_on_data(cmd_ctx->ep, skb); +} + +static void cpc_system_rx(struct cpc_endpoint *ep, struct sk_buff *skb) +{ + struct cpc_system_cmd_ctx *cmd_ctx =3D cpc_endpoint_get_drvdata(ep); + + skb_queue_tail(&cmd_ctx->rx_queue, skb); + schedule_work(&cmd_ctx->rx_work); +} + +static void cpc_system_init_work(struct work_struct *work) +{ + struct cpc_system_cmd_ctx *cmd_ctx =3D container_of(work, + struct cpc_system_cmd_ctx, + init_work); + + cpc_endpoint_connect(cmd_ctx->ep); +} + +static struct cpc_endpoint_ops system_ops =3D { + .rx =3D cpc_system_rx, +}; + +static int cpc_system_probe(struct cpc_endpoint *ep) +{ + struct cpc_system_cmd_ctx *cmd_ctx; + + cmd_ctx =3D kzalloc(sizeof(*cmd_ctx), GFP_KERNEL); + if (!cmd_ctx) + return -ENOMEM; + + cpc_system_cmd_init(cmd_ctx); + + INIT_WORK(&cmd_ctx->init_work, cpc_system_init_work); + INIT_WORK(&cmd_ctx->rx_work, cpc_system_rx_work); + + skb_queue_head_init(&cmd_ctx->rx_queue); + + cmd_ctx->ep =3D ep; + + cpc_endpoint_set_drvdata(ep, cmd_ctx); + cpc_endpoint_set_ops(ep, &system_ops); + + /* Defer connection of the system endpoint to not block in probe(). */ + schedule_work(&cmd_ctx->init_work); + + return 0; +} + +static void cpc_system_remove(struct cpc_endpoint *ep) +{ + struct cpc_system_cmd_ctx *cmd_ctx =3D cpc_endpoint_get_drvdata(ep); + + cpc_endpoint_disconnect(ep); + + cpc_system_cmd_clear(cmd_ctx); + + flush_work(&cmd_ctx->init_work); + flush_work(&cmd_ctx->rx_work); + + skb_queue_purge(&cmd_ctx->rx_queue); + + kfree(cmd_ctx); +} + +static struct cpc_driver system_driver =3D { + .driver =3D { + .name =3D CPC_SYSTEM_ENDPOINT_NAME, + }, + .probe =3D cpc_system_probe, + .remove =3D cpc_system_remove, +}; + +/** + * cpc_system_drv_register - Register the system endpoint driver. + * + * @return: 0 on success, otherwise a negative error code. + */ +int cpc_system_drv_register(void) +{ + return cpc_driver_register(&system_driver); +} + +/** + * cpc_system_drv_unregister - Unregister the system endpoint driver. + */ +void cpc_system_drv_unregister(void) +{ + cpc_driver_unregister(&system_driver); +} diff --git a/drivers/net/cpc/system.h b/drivers/net/cpc/system.h new file mode 100644 index 00000000000..31307da3547 --- /dev/null +++ b/drivers/net/cpc/system.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#ifndef __CPC_SYSTEM_H +#define __CPC_SYSTEM_H + +#define CPC_SYSTEM_ENDPOINT_NAME "system" + +int cpc_system_drv_register(void); +void cpc_system_drv_unregister(void); + +#endif --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 B4BCA211499; Mon, 12 May 2025 01:28:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013309; cv=fail; b=shX3ltIZ0oRq4lNN6W2amQ6iClAFtQwnIfQ1Y1ip4wfLQwO+p3bz3BtC5UJNADzqX21C5xMOg4yEBbF94R2Fx/7uGWAqUobGpcC1csnUzj4x8iuUcl1aVs1uykO2QRI0Yk2JDGq89EheyiNHwxe6PsVpoFQRKCYF67pP2rvpRA4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013309; c=relaxed/simple; bh=HcMliIS3j59GG+DIVMMKjHXvBw7ZwkpvyJxIPtoMdPo=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=RKn1yeMsg5R+076QArOBuWJT2L/4ZTLXOo/VpeIHeyhaBIzFkB4iih6/sShG4cr6E6d7IucfQAHPMYulPTHbsL+5k08aT0aindEsrYkO7LAHleo9TysYMWVAm6KalerEisWKMcATz3IVsrqEuGArRX1ZA2bXKxqXA63NhbvWlk0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=iBmgavYd; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=DAvClvSh; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="iBmgavYd"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="DAvClvSh" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54BMe1Rt027700; Sun, 11 May 2025 20:28:10 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=eqkql/xxfdoWTqO4kVd2ir53xSNoqDtwUtYMRE3XKGE=; b=iBmgavYdezAi I2h7a7JrtfbViWEpiMjBidTt5N37IPFkQBrgJ39Lyqhuo/RtGWb1rKjSghKcn9qG iZuncoBsykqx2xjG3KDlWz36kr+C6qC4/KcoKe7i66daoZg2bv78l4+Us1mYOECf vtqWeD/vMvxp5q3Ln91qsNd8kkihgjqbtnouNnCcVzOHCTYB7LiUl01kiUl5cyDx ME+PiE8jzOf1PIGzD6B63XcJUycLmPDicx2FAi6CMCmzZSwHgwrA13VJsuovzIvd cew7Cq03Vc/6ysUmK73Je/DxO8DiUVcFwIPvEPF+3vd9X/RxWT9rlLV3/jz/44O3 TCtsJ5GQtg== Received: from nam04-dm6-obe.outbound.protection.outlook.com (mail-dm6nam04lp2044.outbound.protection.outlook.com [104.47.73.44]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw9-5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:10 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xsHKVAeIrt9SjYl89+qCOQq4zVCZNGcnnLVbbIuNrWqc57hob0uYC/S9x0/wvKJrhchTuLRfMsys9QsFvRippwkCXAi+CXEOs+AMEm+jdAjlLDVPObwrfJoe0poztFhJAKBgmrfv98A0+oDFQTSzbr/MXVJMpZ85ikKTNewE5uAS5coLCedrAyZylaQbhqBzOGX5do7k6hcFEUUC65LEKI2mIxIvPh8Bt8BDJMrXI1twE58bHS0Vabd8KSTj2uEXwJmRwHfk3yBmEcvvqRHtB3EDtAWkUGjlv8mDE8WQAs3tO/6751hpuvm3BiNVQF7ecPmvFzc2T2ieob3rHFk6pw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=eqkql/xxfdoWTqO4kVd2ir53xSNoqDtwUtYMRE3XKGE=; b=DBlwhkcW5JyLSKnh0P2QmTjGaqPrRTfROs8a8DEEijutVRJ8yG9Tl1Ou/AF6TeMEp3PfAJnUEU1NjvM2TWuiYny3Ph7cPFW2O7fjvKJSdBDgfnBdvLyTsSlO4KTOx2R5Jkm/AmimNTJRJK2OsSgsKSpEDlRkbhjj/VCVZFcqb53gVEy+mYQlX3chQG94zop2S2MKXR8OSe/h6pK+R3MwKBHUcds1FIbV3kOd/brnPsVfKJIXOxsy7SaANEZhL234DpP0xFPXOwXDIYFAclpA95QbLtpF8dttrTpszKKHNOU9PaQqJKcDMH9TpCRUhCJ4/rArAQ/du/rq3C87fckfiw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=eqkql/xxfdoWTqO4kVd2ir53xSNoqDtwUtYMRE3XKGE=; b=DAvClvShdywnDsvV+rJaQUehOrEIHndolnP61xPSynS+PQk4iSrFsENtla/ahU3TIE7u/Q8EczLPNvPg+4SIYVELidpzJ2MceMsPus6R+MTM7UsbX6ZLbCxzndS5vqlqw/t7QY+cB8jyBbxfWnn5jo1buNh9peEMuYXebhkjKQg= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by PH0PR11MB4920.namprd11.prod.outlook.com (2603:10b6:510:41::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.27; Mon, 12 May 2025 01:28:06 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:06 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 12/15] net: cpc: create system endpoint with a new interface Date: Sun, 11 May 2025 21:27:45 -0400 Message-ID: <20250512012748.79749-13-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|PH0PR11MB4920:EE_ X-MS-Office365-Filtering-Correlation-Id: a4f19c9c-a967-4f7b-81ab-08dd90f43f46 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?MHEvd2QzcG5YaGJ6NUYybzFlNDZBK3NyV013YkZocXRwbDNMUlVDd0t1ejRP?= =?utf-8?B?WE1BMlNPTlR2NWdOa3A3LzU5NVlSaUU3QnIxaGc0YmI1dW5RZ1QvT3BiWUVC?= =?utf-8?B?WUJXbWgrOVB5d2JVajNmY0Z5c3ZFdUpKTGxzalplcHY2T1c3aUV1N29GZTVX?= =?utf-8?B?T2Q1c01KM25lb2NMOS9nK2I5bU1LSUdHTzVjaFpOVXRCMGhDTis4Q01XZFRN?= =?utf-8?B?Nk5MR1JjVyszMzJIVktSV2RoV2NKQWx2cUFRTEQyRVMwbGpYVnFxNlB3Yy9K?= =?utf-8?B?QWswTkUzeW5DZDlOMmFNTnRkb2dDOVA1SWx4eEdORFN3YTJZMkVlS1JiSURR?= =?utf-8?B?TFY1Q1JLVitmNDZBWG9WYXdsRVpKOUhKc09VRVllWUVKQW96NHRDVUdKMTBI?= =?utf-8?B?N0Q5Qnc5bWs1UjJ3eVBLN1FZZ0l0dUgzNWJMb3g1YVhQc0dKb2txVURlaEZw?= =?utf-8?B?cmVxaGNMdzdBVFZXcHFGVUpXRjRSMWtiWlAvdXBKSHhBWGYreEFackFZRGJO?= =?utf-8?B?cGExUkd5ZUYxOHpTYi9sNmJrN1ZqNlkwL1doMkltVFpjNU1kOG9qTG9jUVRm?= =?utf-8?B?SUx6UFVKaDl6YVZKcm9IM2Z1UkNuTEJ5QTlzTytXbXdKTUlnVFRDZjkvMWpB?= =?utf-8?B?OHY4T1YvWWVjWGlGeThIQk5UMlRxYmVpT0ZaMTFzcWNjbVp0MVFRWjBDSkkx?= =?utf-8?B?WGNwbjkrVmVSQVArZU04QTM5dll4KzNCQTlJbGNCckU5RHRqc043dmFqclVp?= =?utf-8?B?ejVQZDh0SWNZMUNmV1AxMjFMOGlkSy9kejNEak81MUdvbWNHRWJsbWl6bE04?= =?utf-8?B?S2cwVGFxbHBzNDJSOTNrNkx5K1c5a0c4S1Jhb3Y2V0lTQUEybWs5V2twZStJ?= =?utf-8?B?Wmp3NTRRZDdsckh2NnQwTG1MQitBcUJBWjR2Q2VCNTFwWEZ1MkNQL0Z5bnU2?= =?utf-8?B?eWZiK3Z2ZWZiTG5aMUlKWndJTDRlaE1aM1huWFIwMmU3YWJDOTFBK2V0d0F3?= =?utf-8?B?dlY0dGV1YUJDcE1idVdsS0d0S29VZDUvemNPVmxxbFlHb0h5OVZJTmdxdUlu?= =?utf-8?B?NkdURE9IaTZlcnljZVlHTThPUkw0clFvejYwTVdyRGFHQ1NRaitDalFmcnVU?= =?utf-8?B?S1hhUDlQaTZ4MVBodGU4cXZzZTh5OGluRTZSMC9nVXNMN2ovNE5BM3N3cDdt?= =?utf-8?B?NWZWcUtLWnQ1L01DbFIxelQ5UHE0dTZzTTZkNzRUdXo2RlB6ZURCRjJ0UExx?= =?utf-8?B?YTFtQWNoaUpLejdGM2Y1MGhjTUY5V0ljc01BSWgrNlhmcnZGelZMNXludnd0?= =?utf-8?B?YlVuVjhFemQ4ZzZEMzE0RFAxWHhuWDdQZ1YwVlZlaGE2RFNkd25xNEdRQWNX?= =?utf-8?B?czJnZEZMUnIwbnhBUnRmTE9OSXZQQjNkQmFvRG95UUFaYlhYTGZUdjRCL2F2?= =?utf-8?B?YWE1Z0hwWnA5R0l2NFBldmhIS3Y4UlJBT1hLVGkzc3N2V09paW10YUZvWVNx?= =?utf-8?B?N29JYSswT3pQZEhxS3IzUXV5NjFMRkVLYlJCK0pjS05QcStrTmhLN3I4dGVa?= =?utf-8?B?VHhXWmFhK2VxUnZBV0tCRTJCQTRkRm1HSGthMlo5Tm16L1FHZVN4MENaUXBZ?= =?utf-8?B?RG9OTTVQR1MyMnRScVFNZGFYemI2YnVNUytkV25Kc0E4N3BTWWplSHNFV1ZF?= =?utf-8?B?Kzc4TTBLbjVWT2Zackx3WVptU2hiZlBZRE1OOUg1SWNpeGY3RzZhRkNxV3Vt?= =?utf-8?B?T1k5cGN4dDZDUGFQdG9kWEVFWlFHSFdXMC9wYTk5Y0t5djg3ckovb0xxVm1Q?= =?utf-8?B?c0lCOG83OVc2TGJ3VFhEUjlVdkIwZWd1RUV4NnR4VXZubCtxSXVRS1NiRVov?= =?utf-8?B?bGgvNWhCVDg1OWs1OHZiNWxrL0JwWXdGdzBpR3kvU1hzUTdPMTNxOEFCZnYw?= =?utf-8?B?SFVhS2xlVVNWbkRUb1JSYnZ3MUNMVnFRbHd4UVg1Q3dRemFJR0RKd0htT1k4?= =?utf-8?Q?uFwFi9JBFqEPKhIlmhBuUzoZ2cpkv0=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TE5OSzV2TCtFT2gyaDU3WmlkeGd2N0hwbEZQRXpSTFlZQlV6WDFCQ0ZpdTJJ?= =?utf-8?B?NXdYOEYwZUt3N1U1Zkhsb0NyN0g3WklJSjRmQnNsVnNkU2l1NFk2OFF4Sk80?= =?utf-8?B?OGtFMk0zT1hXNzJHeGdCODYwNTZKMzcxcnQ5bEZFTmZvdlN0RFUrOWJoYWQ5?= =?utf-8?B?ZjR6M0Ezd3IxUlo0TXNtYklLV2t6c3FaSUJjVkRDSWdKckE2aU56RVRDaUxt?= =?utf-8?B?U0xieEQ2SytCNkxLcmFjN0JmVGthSGdJTWlibEErTm82Z1NocE1mRU9UeTJY?= =?utf-8?B?NlF0TWNUdjl6VE9uc04zZWN0S0UraE1DT2NhZllVWDdVMDFKdEZXNWs3NTlR?= =?utf-8?B?S1BFUStOTHdQYlAwRmVVWWRMcE1iemc0SXI0d0Y1TUZhUTBBWFZMYWtPd2E4?= =?utf-8?B?NGZGeWJsT2h3WGdKTEtwbmZOSmtyNG1vSVVIaDViaTUxZ3F3c1haRlpOUk84?= =?utf-8?B?YjgwWFdyZXpkbFNuUmVzVHhvWkFJVG50MWlhcHIzeHY1dzhoRnZMeWtDeklY?= =?utf-8?B?SjE1R2M2SGNLSU15MXVJMHVUZGt0SmMxRzRnWG5oNkoweTVVZVoweFVqdG9S?= =?utf-8?B?MnhEV3NMOXpWVG1iUUNJWkYreWNzWnBWaDdoQmszZXprQzlJSlk4djluRXdy?= =?utf-8?B?aWloc20wSDlQRHQwTjdaQllFdE1mSEJsS05UTjdOckxZc1hrb05vTFp6SU03?= =?utf-8?B?TlgvTWc1Y2tCMFpKVWJseEM5SHEyeGZrSmdqSWZabG9aVXc4N2pOR1dFWkM4?= =?utf-8?B?elAzdlgyUUhUNWM5NHduZGwrTVJIZGVvQjA5cTlReXo5WFV0UFdYTHQxYzQr?= =?utf-8?B?MEllRlljZC9PazRmczArUzlIZkRoYTI5Q2l1QjZBWmxvZ1FUdFRpbHE5dTUr?= =?utf-8?B?dHg2OGpBWXBhVlF4OG1xOW9wTXE2RVN4NTJJNndCYzM5a0hpNUoxekQxTUJu?= =?utf-8?B?SGphODdtNzBvWEV5VGZVTlJKU0ZyalkxQ251Y3NEYkIrOUNmSHJzditLTU1O?= =?utf-8?B?bGY0THYyZFR1YW1yTFRDdjY3bUVXSlRoOEM4STBkNXJ5bW8xanJTMjlWUHU5?= =?utf-8?B?eHRKWnUzU0xTNm1TNXdLcUtiandzejRRdmR0b3MzOVprSTJEY2owWVlmeUJ2?= =?utf-8?B?L1BWb0FFWm9PL0p6T1Qwei9YOWw5UzZMUlR3a0VsZm4va0ZTS1BqNmJvNFZW?= =?utf-8?B?dnNRTUY5SjZ0ZmdqbzNlRXNLZGZtbmVKY2VPVGdYUDBCYTRXdFJmUXdLUXh2?= =?utf-8?B?S0RLRlJ2ei9QK1hEdm5EOWFYa1hRN0N3S3FBR2k1NlMycGJFMG5ueGhGejlh?= =?utf-8?B?dkxsQVNtbGJNcEFCc2J4Y2lDWExWNTd1TXA4bDlieTJNMG5CMUtJK3hnR2ZQ?= =?utf-8?B?bjU5cWVRdzE4NDVuN2tEMUE4bllpK05vRW90dnpSSFg2OUlTTDRSWXRtRGxr?= =?utf-8?B?VlpZR3pHbGUySkpLcHVja1h5Z0MzTXZtRHZraUdGaHRZTmNUQTh0MkY0c3c2?= =?utf-8?B?aTE0cDVtam1vR2hCZ0FRWkwvdzNsZzVSc2hQZUNJM2JWSjFWMkdCL1RYeU5C?= =?utf-8?B?QmExNzZRU0pGM1dZRlBIRTFFdllPaVI0M2NiNHFmMFNXOVloN0M5Ky9YVHBQ?= =?utf-8?B?YkREWi8wQlRlSjFqeUFrVnVNaktyT2o0RWZoUTdlY2xOMDRkRCtTL1Q5Y2Z2?= =?utf-8?B?U0ZEL0djMWdhU0ZwL2JpbXRQUVVqREQ5dWtGUStwL2g4Ky9saEFWTUdtaUlC?= =?utf-8?B?UW11c2YrdUI1VTJ0RGJpNDBub2pPaS8vTGE0RFA2emNPb1hJZ3RYS08yS3pk?= =?utf-8?B?aHBxRlpzazJCTEhQa1dFRnlLalFzQkNJTGptWXhUcG5hRzZ5anRvVno4R040?= =?utf-8?B?RHcxT25ob2hiU2s0OUluNXVldkRIS0pLc2dnMnZXcHJFZW5LdlJteFpzaTFw?= =?utf-8?B?ZjZmRVpHc295b20zck90cXd5YjN4OXgybDQ4b2hrNkNPNlgxTTJzZ1FsdWhp?= =?utf-8?B?bUV0a0Z1aVkwNHBSS1hTdGl1R2gzaExIZkVCOEpPVWFzd1Y5MzFTTUdtOWMy?= =?utf-8?B?cjhUTlMvS2NOUG03OFIzTUF4RHh2c2I0eHZzTFhwS25SdEl1Z0xIc0tSektq?= =?utf-8?Q?vNE7hd4gkHxtW7jUGsu5GMv6O?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: a4f19c9c-a967-4f7b-81ab-08dd90f43f46 X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:06.6547 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: oTlDq0tHZxhKkcz+C8FrBt/mIGJBGRNY+V90jRhSPCbdE/Yd/949rZczvPhzVg/V67B6X3FS+SRex5tUIkQiTQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR11MB4920 X-Proofpoint-GUID: -8deuHCCk87VqSWhX1vXWfEY2bnY97OY X-Proofpoint-ORIG-GUID: -8deuHCCk87VqSWhX1vXWfEY2bnY97OY X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX/bI6xzwiONV5 K6LjehrlF4kSB/coWziWwMOtheJAwQqpM3Zr7mfOeYEjJQr3E4O96I6AOcaL7wuyfjvbrqhOSqa tVNYoMuxR6oOwrdBqe0KryjY65RoAVbOMfThsLHVfyG7Z+rpfgiVMrpioPro+hZ4kFdB+19jww0 1OT0q0ro8EzW0ssrmGN0rEXZ/5VO+2tNHqwP8rCv+pjGGs1S6hs/mEr/tuoP+UB9QxEpmW5Ja97 3yli6BHZ+m2D4fJ6W+Cu9Ikl2bBFsrTYcLOPIjDdtLBBaJPCBl63ahqETAwCUuBkJvzOX5n3YMx h0/EA91Fw8dKjQVpnsjXZbWaZe4iaNcQVHNPndv67W0BxHrySpTSr74m2Zr09kM2lOhUu6JOL6U I7J1OJYygv0bCGwYA3yAxVjbJYnwsPHRI9HAxjDt6JDpINC1CHqmTj4Ob9CgqQ/lJtFgwMVu X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214eaa cx=c_pps a=coA4Samo6CBVwaisclppwQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=rJb1O5Hunsf5rzLoQWMA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=999 clxscore=1015 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 Without a system endpoint, no new endpoints will ever be created on an interface, so as part of the registration of a new interface, create the system endpoint attached to it. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/interface.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/net/cpc/interface.c b/drivers/net/cpc/interface.c index 13b52cdc357..dec4c9be3c4 100644 --- a/drivers/net/cpc/interface.c +++ b/drivers/net/cpc/interface.c @@ -9,6 +9,7 @@ #include "header.h" #include "interface.h" #include "protocol.h" +#include "system.h" =20 #define to_cpc_interface(d) container_of(d, struct cpc_interface, dev) =20 @@ -143,13 +144,25 @@ struct cpc_interface *cpc_interface_alloc(struct devi= ce *parent, */ int cpc_interface_register(struct cpc_interface *intf) { + struct cpc_endpoint *system_ep; int err; =20 err =3D device_add(&intf->dev); if (err) return err; =20 + system_ep =3D cpc_endpoint_new(intf, 0, CPC_SYSTEM_ENDPOINT_NAME); + if (!system_ep) { + err =3D -ENOMEM; + goto unregister_intf; + } + return 0; + +unregister_intf: + cpc_interface_unregister(intf); + + return err; } =20 static int cpc_intf_unregister_ep(struct device *dev, void *null) --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 AC75D20DD51; Mon, 12 May 2025 01:28:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013305; cv=fail; b=njipegHrCNvf45b6lhUr6rivvsImj3zHcziu0OJWjYbmHJv7UptWw3GUASbmztYJzAaAObJ4gQMadiVMiXKSDDVopMAma0KNZ3NOKwe5HnmbWz+cFRIbUuk94eZ+SqETiScMpj+W2KCPIo/o1lsl9smtAIWZW9/eHofA05248Fw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013305; c=relaxed/simple; bh=dAKWjc1lp0N+4UoGb8D/DAdkichT0/NtezYZCn+Pnzw=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=m/GQWqjCfW4VH2AW+XmHweqL3ZAhTdq5XMK41VKIFLXh34YqHrgnlWsSUqd7ghfqZ+cc9sbAfRyKXS5U/rpwqrB4oGNTu8V76cHB7/dSOHnJzYimlOD1re3QOaeWxY5Eof5iAwu119BczaDQGoV15qMZI2FEgahjOnc3p5HJk2c= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=rHnqG32i; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=UE6xHzEJ; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="rHnqG32i"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="UE6xHzEJ" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54BMe1Ru027700; Sun, 11 May 2025 20:28:11 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=mzwLE/RoXF6S94UGYe2XD8Gl0bdLPmQo5X+hh2M9HfY=; b=rHnqG32iUT4r 9Wu8VxciI8qoJ2RQzYfucTFIgdXJDDFiSIbi+/Yk2gmDYjUSqWdgy69GyBGWgr1m iIdTSOCGdbe39UPh+BTRpBkWsMv8/ir5ZyZVLF6p45TLkf+qX8ClwAw/69ZBKuMq 0qRsAgjIXUdbdv538xFaIPasgAZ/8Zn6RH82EN3iReZ9Pczb74ZpQ3yorc6vekLA 6ia+1ZwZ8ka/x2R5JfAw9IsSWiw3waP5qKZiUwurXC7twrn/hXJA2hSZvk3H9DPC R9F2qErpUo1Qma88dMZ00TTPV7yvuQhirapLO4r6AkKdmOV7YAHEcOQIF2MBSCuz +c5ZXx4QiQ== Received: from nam04-dm6-obe.outbound.protection.outlook.com (mail-dm6nam04lp2044.outbound.protection.outlook.com [104.47.73.44]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw9-6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:11 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CGjcFxc4Wa5NFVoWxQfU7po18tlsx1dtD6WTQWiPwLcJaaGFQi0An+2FeMwxitcYOrniLf4rzGRL5h3C7Hv3mRDDkwR/S2hNDuIGi13zfYdDdB4l6YpvmbuwGDTJAio4sTb1Gbvl2HRj3461Klpvo+JCOgCClLJm/FYySLcQhM7PI4wJWbq/M4JnYoSc0lxFgFZ30QeRzdnETrLIaR/Wk1wG0kc/kr/f7DcHVa75G6Zxx9PEM4OO1paoLgqMCV5ZzB+YlRCaIWmEjZrGrpYj8c5prb0RkkGKqPAa3qDHvDwzNzcQ1TVzPGMwoqkOwiZzt4CCw2uQ+OQGhPIZs4RjTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=mzwLE/RoXF6S94UGYe2XD8Gl0bdLPmQo5X+hh2M9HfY=; b=ZkCpdkJZeHbi7HvOmOzcfwKKWcs+U+09X8gheDFNY8OdnuG6Wtj4PSUlReKqZfVakVxaej0WQPuwdgj8Pnyf0g9PAiIRMu/QmuTqKfq7wytHFxLaUFC5daVw+VJouz7+qmEU854k3G4YpaAPG9xEu5Zud/kme9ksLunRCmpkQPm7ySIWrLLUH/JNxTNWMnLuR1psKcFR8wDetnd5mRnqKn0RGLx0VgAM1xgw9xykSc/rypGbRP+0veG30abHwz81ktqHXso40KDr41IMptFjhki10WAQYPMWU1I6qZZ9Ry4c+s8GXyCzQBwQQoUil8taw8jB5eVM38rEBhTjhZdSvw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mzwLE/RoXF6S94UGYe2XD8Gl0bdLPmQo5X+hh2M9HfY=; b=UE6xHzEJsaofjf/giU2gK5Oj7VufRfRnnloO1RcwUIwj+Is/TD5+ARGCzO5WeXvIZ9HYsYiOs84SimSl//9xmJfmmtplUuLHvhpXylMZyc0aH9E4etMwm5ZhNHt0kfhpqJzmbDEzKJj4B+zrJyBUYLnGU1SUSE3XxZMEv0fF4uw= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by PH0PR11MB4920.namprd11.prod.outlook.com (2603:10b6:510:41::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.27; Mon, 12 May 2025 01:28:07 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:07 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 13/15] dt-bindings: net: cpc: add silabs,cpc-spi.yaml Date: Sun, 11 May 2025 21:27:46 -0400 Message-ID: <20250512012748.79749-14-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|PH0PR11MB4920:EE_ X-MS-Office365-Filtering-Correlation-Id: c672eb6a-1857-4520-df6f-08dd90f43fbf X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?aXN0M2xadWRFZGRsU1ZtanJMQjBEcVBmaEk1SC9kWUtVQ0FVdWZoR0Zna3Jk?= =?utf-8?B?Tkx2TGNKek5hNXhQZ1JMbFZTVGZWcmJRaXhxWHZocEhkRE1aRVhTWTZPTVc4?= =?utf-8?B?WDQrWnJ6R09TQnQvZEtINXdIS1ZDVUtXWFNUL284dnRTajQxNEZuRFF1cDc3?= =?utf-8?B?NTZ2b1FoZExldEg5KzdpeEJWblNTME05SHBHQUtsc2RjU0Rqbzdzbm1RcVZi?= =?utf-8?B?UFhPRU5qNktDMWdnbHJoczJURExQYWs2ZTVRcXBNVVBkbGNKWU9GdEJVTmZv?= =?utf-8?B?TEFwb1ptWXdNMW9lN0RrN3FsS1Q1cnlHV0NDVVo2VXpaYjhOWW04MW0rblN4?= =?utf-8?B?QVVZbDh0bzkxY3c0WWpFbVAwRGVmTGM2VjE3d0cvNFBNUkZhMkNOVW4vck1O?= =?utf-8?B?dGxTckRIVk8zMmtYRy9sdkxwcC9aTVZmR0IwYlNFclJHUHkzYzl6b2FSRGw5?= =?utf-8?B?czBHOUI5STJZOE9mbXcza3EycHdWbGpBK2xnNzUwcm1QdVRXcUJ6bjgzOXU0?= =?utf-8?B?M1dNajlDb2VrdGxyc2U5bmlXOWo2R2pRaDRxWFJtOENPa212YzM5WGJmUG1k?= =?utf-8?B?L0lrKzlta3JCZnFIYnNYZVFCV0VlL0NEUU95cnVsSXRId3dSTnJmMEk2RTBJ?= =?utf-8?B?b3hFUGY4N1lCYW1OUnI4UXMxd1BzOGoxUVJIMWRXdlI3cW42VDdlTzJqMjgz?= =?utf-8?B?VXlibGp4NlRjeWhwYU5Zc1AyNHQ3QUJHQ0pOWjA4MEhRQXFPUURaR0F2aGFo?= =?utf-8?B?b2h0OUFIMmRqRW5jTXhIeDR3WHMzbkhLSThtbGFsaGlmcDBNZDVsUVEyaDFE?= =?utf-8?B?U0NVRHdhcHc2c3pNNEpneDlhdzdBSE9COVhhM1lMcmtEbGc4Lys3NGRUWWd4?= =?utf-8?B?NjMvUU8yZ2loSUlQdVVCcmZET0ZMMlJPQXJPYUhWeHNHdWdLa1czU3FFeDVG?= =?utf-8?B?cEd5UWk3dEE4dHBqVFlPcFBGTzNFK3RpbktXUmxDUEFxK0RmNmtEU1Y5aVFK?= =?utf-8?B?eHN4VHFoVkNwTkZ6N0pIamt5dnhyZnNVUDRGaXM1VmNNYWZIUDBiWTFvd0th?= =?utf-8?B?THdwckJWd0xJTlk5MDYvL3dvT0YwdCtKMlM0UFRQQVR3bGRqMzIxbFkyVUdn?= =?utf-8?B?b0ZvMXo4SEVKT0kwcERrOTROQmZoUE9jR0h0VXV5bStHNzJlN1FJWlJReTBv?= =?utf-8?B?NDMvckV2bnFhYW1DdXM2QUtDZHVROXdJaVArSXkyRHpRYnc1VkNOTnFYSGI2?= =?utf-8?B?NUVvbHVpMmxHQTZIU2Vsd0pOZTJ5dzdOMW1yVFUrVkR6WVd1QTVVZzNlbFV6?= =?utf-8?B?K0NzVkMyR1Qyb2dnY0lTWjc3OFBtbDFFdVJITW5YSjdYbHU5T3BrS3l6bCt2?= =?utf-8?B?WWhrcDAxU3NPby9FT090cGVJeDJJUTNxNzhtL1doSVBWL2NTSVhtM2pKZ1Rk?= =?utf-8?B?dVFZTmVKZm5PWFJCOXl5ZmVNb0NOQU5Mbm50Q2drNkZPWUNpYkMzVE1nd292?= =?utf-8?B?RkpSZSt5QkN1bHVncGFNb0ZaQXNjNjhsOHowZWNsSUUwSmVYNEpJVWFiV3NQ?= =?utf-8?B?ZFprWmRSMGlqZnBWejBkeWFGREJZY0sxVmdHRmhMaEVwNTlLQTgvZ0lLMTVi?= =?utf-8?B?eVF6MFRsSjI3N0hzVHU2cmkrSEk2NTBSYk92VmF1bXc3L09oUU03WW9XUXVs?= =?utf-8?B?Vm00VWJkM09hcDhYWGhuSTBMZW16Wko1UWlpVXFwYUVhb2tjNE1lVHRwaE1p?= =?utf-8?B?dWxtOXlZYVFMOExua1NNaUVJclhMTzk0ZVRvQmdXckd3S1FqaUsxb1ZjKzVJ?= =?utf-8?B?K3B1Zk9pSjY3dFlWbzhrQU9CcitLNUkzNlNLcVVzZDJBOGZMZjVXdkhwbTlm?= =?utf-8?B?Y1cwUktpMVprWmptTkVuMEh3SVBrb01ubUN6SE1uS2t2S0FnRCtCZjhoUkRD?= =?utf-8?Q?LadlKfb5g6k=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bUpQZnBXNlF6L2trYXhsRmF4dVA1RENRNUp1MGdya0tMazBLU3ZVZW84eVlQ?= =?utf-8?B?ZGt6b2dEaTJuVlJ5TE4rVTRjY0ZBR1BUcVVyc2RFSlREVDdBNHEvZkFUNkJE?= =?utf-8?B?Nzh2ZkcrejJUVnk2b0t6U3A3SWhFbFdLMlpUTTF6MVZwaGZtNmN5czlVNERG?= =?utf-8?B?Zk8xYWpSREtLVnMzUnJlUVUya1dSTml1Rlc3b20xU3FrNE42VGlaYll1OFBh?= =?utf-8?B?dk1aVlQ0Z1ZJTS9KN01vK3R2eFRBczlYMWtaQy9FeFpoVUtqTWwvS2xqU3dz?= =?utf-8?B?ZHBQWlJQS2I0VjNMUXlJdS8yYlhwTWVieGk4TW9nK0tiSHVjT2tHTWpibVlp?= =?utf-8?B?eXlkNnZtMTNVWVBRYTdVdHhabCtxZUlvMXEvQXU0RVpCenZEeVcrNWU3elJL?= =?utf-8?B?dWZJYnIxOWxMd0xXZE43dzd2S0VxRCs0MDVyWEtLZlg1TTNZNmQyeTF6ZE4y?= =?utf-8?B?Y0h5VlFJT0dCN0dIRWtaNHpZWmdHQkptS2g4Q2Zua1RnNktIMHAxODdFTjVn?= =?utf-8?B?N21sZ280S0RBdTdHUmZFMm1EdG0xUHl6a1pUbktFSGQzdStvbXBTUy9CM3Vz?= =?utf-8?B?WUc3SnJBaTNIL1RDdWR3emY5czRUSWxteGVVUGw4cjFpQjFDU2M2NkdDUHBB?= =?utf-8?B?OHdrbFJjU1BsdFNqVVNzdG5BR2V5b2dKVmQxaVlpdGMxdWtUd3YxNVRSTlJM?= =?utf-8?B?dWsxbFRvSXFzU2tHZ2dPNk1Hb0FLTTFlYWRLQXBJazY5dVVSc2dNVDdaeXJC?= =?utf-8?B?L1pZY0prdUljT3NSM3liWkpsS2NCaGFMTXd2Ty85VllEdE5sbFVFbjFmV1hT?= =?utf-8?B?emNsaEMyWld3U0pkK05TQ1Z4VVZONVhWUTVVYldMSUxLWlphSGNpak5FK2Nn?= =?utf-8?B?YjBFdmpmTURtM2lyUnhEODBhcm9oNTBmNXN0TXFqSVNBNVladUNNbDlxUFUz?= =?utf-8?B?UjBaczluQWlWZlhsbktwUHBzRER3bW9GRFJtZ3lTY1RjanBMQlVQVFRSSW5G?= =?utf-8?B?NTRvT3ptdmNzSlRCWHYyZkJsNkl2MTNtVmpmRzZVSGdWKy9GOTJIcFQ2aCt2?= =?utf-8?B?dWh1VzVaMVhvQW9xR1gwVldlK2szeWdKRFo4TEZrQUIraGpMOS81UjlVVVpY?= =?utf-8?B?d1NuZFVpeXJFMlQ5UlJnbjJjZzFseER6NllDc3NSbHRjNXpYV0twc1VoTlY1?= =?utf-8?B?ZGxpWG01cWR5NlJHd3pXSUFHSW4yTnFkb2JTRTFqOEtERTJVL1hROWp5ekFa?= =?utf-8?B?NUhTa1o4VWZKNTIyd2VkWEhXSEJsdXA4TU4rbUxNQTNZL2xUMFZFTUtIdGFO?= =?utf-8?B?V0dodlFsWFoxcE10d2tFVlQ3MDRNaWh1aWlaVENmZ1JISWRDZ1VseURNdjdn?= =?utf-8?B?Tk4yTldaYWJiRG5JM0F5QVdOdVNHZ1RzVHlWWXNrTTV1TWZLdzBmUStFblhx?= =?utf-8?B?S2hud3ZGUWZjUUxzM2daY2U0bjZyWUt0akhDVVhyeU1TYk5XeVZtZXJ4YXB0?= =?utf-8?B?bUdKeUFHRStOWEFxZWJ5QitmL1lxTnUwNjI2d0dxMmpsdTZiaURGcnBXWnoy?= =?utf-8?B?UHN5eUY0cVJTY2U1S2NhYXFyZVlxOXpoamRQcXhWdE9CbzYreTlMekEzYXU3?= =?utf-8?B?MzF6eXY0YVpaVkpkQW5VSE1aU0llWGlrcGpUUFBwOWhheTBhNGlJa3N5b0pz?= =?utf-8?B?NUtvQ3F1Zk1VcXFrQXJTdnd6VHhmRjIxaE4yT2QxanhLdVFYbHAvamZVQ1RP?= =?utf-8?B?VFBpNGZNT2RpbnBUdUVkcDAzWVFNNGw5aU44N1hlMWM5QnplVklVeVVOK29E?= =?utf-8?B?aFkrVHBPb0xwckk4MFdINlM0RTFhSkh3SzQ5K1VEOUNpV2VJREpKQjVJblJu?= =?utf-8?B?WSt5SDZIZ1RUT0Y1WW5OaTMvUlVhbVFZR0tncDZpMnpjQTE4K0hSVWZKaWJn?= =?utf-8?B?NFg1V1d4L3R0aEFUWEh5RXA1c3paeGNYUnVyS2pORVdpWXN1bXFuM2w5Vndx?= =?utf-8?B?U213SFp2T0k2S05QV0xMeXZKdVFFTHhENFBZUjRwWDZZWWNlOVlUKzltZGd6?= =?utf-8?B?U241WlFkWVl1d01rL1JLYkMzZC9kWTFVeUNoaStrYXF3V1RBVmRQQUd2RkI1?= =?utf-8?Q?nQRt+yz2lvMmYztb2KBPLuy8X?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: c672eb6a-1857-4520-df6f-08dd90f43fbf X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:07.4097 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 9XU8Xwofv1qsSksqt5HIX8pBf52z4K3qfL3kgQTIIcoLgjDmx5w12ketE9QrDF4kU5cTEBVVrqtmOJCbWSiY5A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR11MB4920 X-Proofpoint-GUID: Pb8nVnCeIUgcu_DQuRxBFQOuONtgEqnU X-Proofpoint-ORIG-GUID: Pb8nVnCeIUgcu_DQuRxBFQOuONtgEqnU X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX2RmBqwW70Wwi K7lYPFkTsHBM+NuYebHh+WmJ0LIWm5qejXbkaxAsyJkvvRvyBbotWc+2GTPlYp6jRzlOdulPmzt /VqHEDL7M7hHBkxW4aOPEFrC1seYvpIN7oF5Gc2BU8rzsHHmgLEJ5lpwzWADhnSdkD2A6IcShsv muo2XQTJ+c+91Le8rvfjOVs/6cDvj4CgY3ndbHkJVL7DFIeuM+JWHn/Ao7IvfbaBamLSrcBKJY1 +kXK7We19k0CdvtWL19hfsM/VM5CN3gQn6noM7b0xK4YCI2uGQZxkmgOgD4ci2QwmQMWe9QYEhL 4Pnfq3PIGvbI32rbr30YBp3cemK1gRzIR6Rcwu4JAuGAECMzICBEvAf/6ah9v4/Pqa/yG7UFHri YRvMagMhP/Tqhxs0OhoK/IYoiTTx/aTADpt7TsFFkilX0LP+oz6C47k2oPivBLzlGMVhCGAn X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214eab cx=c_pps a=coA4Samo6CBVwaisclppwQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=gEfo2CItAAAA:8 a=2AEO0YjSAAAA:8 a=BkuTzMVKkkJGYDtwCjMA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=764 clxscore=1015 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 Document device tree bindings for Silicon Labs CPC over a SPI bus. This device requires both a chip select and an interrupt line to be able to work. Signed-off-by: Damien Ri=C3=A9gel --- .../bindings/net/silabs,cpc-spi.yaml | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Documentation/devicetree/bindings/net/silabs,cpc-spi.ya= ml diff --git a/Documentation/devicetree/bindings/net/silabs,cpc-spi.yaml b/Do= cumentation/devicetree/bindings/net/silabs,cpc-spi.yaml new file mode 100644 index 00000000000..82d3cd47daa --- /dev/null +++ b/Documentation/devicetree/bindings/net/silabs,cpc-spi.yaml @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +# Copyright 2024 Silicon Labs Inc. +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/net/silabs,cpc-spi.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: SPI driver for CPC + +maintainers: + - Damien Ri=C3=A9gel + +description: | + This binding is for the implementation of CPC protocol over SPI. The pro= tocol + consists of a chain of header+payload frames. The interrupt is used by t= he + device to signal it has a frame to transmit, but also between headers and + payloads to signal that it is ready to receive payload. + +properties: + compatible: + enum: + - silabs,cpc-spi + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + +required: + - compatible + - reg + - interrupt + +allOf: + - $ref: /schemas/spi/spi-peripheral-props.yaml# + +unevaluatedProperties: false + +examples: + - | + #include + spi { + #address-cells =3D <1>; + #size-cells =3D <0>; + + cpcspi@0 { + compatible =3D "silabs,cpc-spi"; + reg =3D <0>; + spi-max-frequency =3D <1000000>; + interrupt-parent =3D <&gpio>; + interrupts =3D <23 IRQ_TYPE_EDGE_FALLING>; + }; + }; --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 DBAC420E323; Mon, 12 May 2025 01:28:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013307; cv=fail; b=cfkzDY06grHtmlnYbtMb6LNpOCWiVIAXbDJIZ0wPP7YMRvCg0zO0ca0iOnmsoGfuhZZqoEYx+TuNuMk/E2VwdfQtZCUefglbbKuuwa0fwAVr7nKIpcwWjfhqNUw4n1TmLSn7AK0BNinaVGuVf0NQwIAZJILuhbjq43iTMVAVsyw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013307; c=relaxed/simple; bh=dAcJSUaGdxRYNzLemz09uwt37Rt3VQNTmqaA/bpJ/eg=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=A9+7V245MjZVR4zA7ND9j0r81HOA0H6fKeQ31NCz/Zj2Z3aXyXkUasVBpA4RJ/634g5CXmIy/Uvjkzhx6lOp2aBednymml0kNF2kAye+/7qek1qCUBP9vUuiLrWPBYee3QRqQUQl6Mqc5DG4PXUH2/UBrixMo3XYkjsCL4E6HPE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=RsqX43q1; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=ObSGY39Z; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="RsqX43q1"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="ObSGY39Z" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54BMe1Rv027700; Sun, 11 May 2025 20:28:12 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=LTvOyFFoYHjTt4R2ws8k8T62c37WSdYxkVhSLGcjEqM=; b=RsqX43q116JF K7bztHNioxSgvb64czQan6Qq2q2YvbVdkFvPeGJz9AjPFS67IdEiO3e9p+IWhuTO zwSjcAArLs7Es6eEryW9Jf1T6GxEBEJbpH7zzClsJZmiOqm/J1cZCeTee0CEEozM ultsFUNJcSaR3tRLAuRpcomYYUMSEEAsDZ/eKds139qO+c6HhH7ua80kHTAElCdd CZslBKXfWHOWgEfrl2PCSl8syCDKiYPsgduZSs21ZhAr8CdCTkVxHhmJOrUgTpc7 PF1ChBZ98LtpeLNaN0c+HOLutiHo2tWECtN7n9FByoFpCslgXhRR/AxEQ2VxEVAL FdGZrBjeeg== Received: from nam04-dm6-obe.outbound.protection.outlook.com (mail-dm6nam04lp2044.outbound.protection.outlook.com [104.47.73.44]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw9-7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:11 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=EW9wCsqzYR6oibYCaRMqxYWQl2Fpxz4m3bmxqmeWy+2lts6PdMfALLNmypaG1vPuHjuiql06keC/shHwiGmIh48d2cRCSVpzOTzKpMo1ozrhzAhvSpJMHGxwzoZx0K1i0O7WmTWQNdTvnPSYJyg8XLfC6aEjHSw4NDJHHRZE6ZJLqve50UKz9CTUHBv1txPWTA+/BwNuWg+9GlmgWqB/A4GF5GFSo3LK9STnLwv9rBA5OPlsz4AvdGUEOPvUlFbDHJ5t9QkFIZDxFuEOs4sdYI4K9bfy1UKcIdfyhvo5D+ZUzeE0wMwEMK6uLxzpSB9NsdqMCUDyAXEakrxvyHxooA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=LTvOyFFoYHjTt4R2ws8k8T62c37WSdYxkVhSLGcjEqM=; b=H/sp0NDheMI0fpYhyPzssTEMpJzbIxy5Ey9UUk+zOY8d9SCzZ1LtVtRYeP/NjDegf4UzK6ZvB5n5Nexf9k2TXusQ2yrwqTaekH1Y6PlyygOnW0tA5M5DADmb5OjAuhXaeCMn/bP9I5ID5tFdC9avKGIbWI3S8AH6/P6VPpVJKlGP1/w9ECtndb7sbhYSPVIQA8uP9g6Z4624ItqUGrCnkx7gkyC+X6w68XD0eVRqLQpeDZvapV+GGKTwc2FlIitGe8eFdk1X/J3ruWB0fzM1dJZRgJd6LTDLkJ1ia4wesr9O7pdmij9P2EIUEOvhxI0dE6xELKRq8UNYNRGbeP3pcg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LTvOyFFoYHjTt4R2ws8k8T62c37WSdYxkVhSLGcjEqM=; b=ObSGY39ZxLkJx5dgCzHzfVs7gT1IvoZBdlqY6Rn6LaEanDnhUApPtL0WEINYijEBYKNzACbmTvGFr0IkAeKF/DGxL1mmw4DJcc9BUIMs0VAF5RmG8qjA0o+hh8FvwqJI+wGqiP3JWWJVuA4hRXEqotl1FjrjdTYmmJHWp2Kujf4= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by PH0PR11MB4920.namprd11.prod.outlook.com (2603:10b6:510:41::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.27; Mon, 12 May 2025 01:28:08 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:08 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 14/15] net: cpc: add SPI interface driver Date: Sun, 11 May 2025 21:27:47 -0400 Message-ID: <20250512012748.79749-15-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|PH0PR11MB4920:EE_ X-MS-Office365-Filtering-Correlation-Id: 12c5d7a4-c00f-434c-1f5f-08dd90f44033 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?b0hJVFlTZFVJOWtzamJCaTc4MmkrN0hZTVcwaVBGN20vRlpvSVdPeTZYL2R6?= =?utf-8?B?YlhyYVRidWc0Y3lvQ1lhZWhlYUFPVU1mUHdTZG1TanJUMzcwaDBYaXpwZGw4?= =?utf-8?B?M3o1UG5BcTBzQ3VVUmFZTGt0ZXBqazhFalBxU240emFSSmo4VUpGdDgxeHo3?= =?utf-8?B?RUZ1b2c0WWxROXJidUt5NCtrbGxnaSt6WjVUYXBKZjN3NUhHdTVJNU91ZlAy?= =?utf-8?B?RlFXRlNjQUdPdzhxT2pPQno3ajQzMTBzdG1MV1BtYUVPQ0xsUTFRMG5JY3hy?= =?utf-8?B?cXF1MDMrNDBnemVvY2NpYkdkRGdxNVJsMUt3UVl0UnkwT0tCZ2R2N0trV2cr?= =?utf-8?B?dW83QWVYTTZxYm9QcjNEcVlORlRZZ1VPc0o3STY4NWhHZ3ZoOTZZY3ZXS3J2?= =?utf-8?B?WFRWaUVpdnE3YjYxZVJKMG0xNllWeTlyd0FmOUVFeFRuREdOUmR6d0RkcTZo?= =?utf-8?B?cFo0UzAxUmNPVzFxVDlCbjRnQjh2M283UStCVEFNZmJIL0JxNituR2I2TzRz?= =?utf-8?B?RXZNSWlud05RZkZDR2pibWMrVDlWTzNDYjhJRFhMVEZxMSs2OTI0WThRKzZK?= =?utf-8?B?aGwzRGRnT3p2eG5tZVo3RVV2YXFhWXp5bFFmazBmdXFzTHlEL1QrTkZLaGd6?= =?utf-8?B?Tlkwd0lwVmU5VU0yOFdaLzdLc2ZhL2xGVk5pc2IyVXhMS0RicGVmOTRjRFZU?= =?utf-8?B?V0l2bUVsRHlDa29BL1ZzMFFrTUFRa1BNaVdKQ0hnd0dmYlhRTEpCM2s3dTk0?= =?utf-8?B?enBUSDdTYXl0V3pLTFdsdHgzYm5zRUtSeFY5SHdVT0RjaDlJWDVRbkg1Q3FD?= =?utf-8?B?emlua1cwQmdqc2g4RjFzYjlTMXJMMUFIN2xTME9UWDdYekNWT2RodS9HRkFG?= =?utf-8?B?MWFUeGRURUFqVmhGK3kxNmNCVFhWQnRORmhuUWVzS2pza0lOSFJSRUFXWVFB?= =?utf-8?B?Tm1XU0trZkl2djZtVzR2Q1ZjV0RFdnVOcHdNQkN6ME9kWTFaMVd4cHI4OVJS?= =?utf-8?B?S2dNMzd3Q1pXTFBPYUFySk1YY2RWY0JHRjVhUHBZTjJFbTJ0cFBrdFpxS2xp?= =?utf-8?B?bjZ0akorbXA4VnBUYnJGLzhiR3VueFhxSHByM0srSGhpekJlZkkwU1JDZXhT?= =?utf-8?B?bVNHZ2JFMGJHbHc0SzRScldwMGJrcHF0NkI0ZUtaa004S3BQZkJqQ29EM2dG?= =?utf-8?B?eHcyUXZhaVZOR3hSZXQvNjl6SzNveVhtRXVidDBqbVdyT2FPUjVzY1RnQ2ly?= =?utf-8?B?N1NVRWNXT2F3anlUOHNvc0hFMFNqaVVEY0VKRW40cDRreGVxbXFvbkltblJB?= =?utf-8?B?a2R6Q2ZKMVJHWmFmM09UZlBjYnVhQVdqTnQvVGNVelRjQ2dYUkxwQ0FnT0lh?= =?utf-8?B?VTBjTTloVnRrQ2VsZWdyWDNXS1UwZnJBRGpHbDcrMnBEZFltVVI0S0ZkV1lv?= =?utf-8?B?MmpjbmtKcXRGTlRNWGNnVm9pTHhUWjcxYnVSdmNXT21JTUJST2pERVMwTW4r?= =?utf-8?B?SHdmTjdYaXlOU0dBb2M4REdYako0TWJLTFBiVE1pZDE3cDJ5ei9vUjlCaWVQ?= =?utf-8?B?NTNIeTM3OEZZdU4yRkluUXczV2R5MHdaNDFTTTk5YnQ5NmhQWWpiMjRRb2p6?= =?utf-8?B?MmlRSUQ2VmJOMERLcWdWeWdRT1FRMEo5Vis3VnFnbTNVVWNMamsxcXZTbWlJ?= =?utf-8?B?TThCc09pZHlmNWZQajZrL0ZnQWhhVkcrdDR5ZGlTRXRiVi94Q08vVDZJQ0FL?= =?utf-8?B?VDExMVliakJGYkdWdURPVlBZQ1FvK1RFTDYzMzd1WW02U1E1UUN1NytrV25C?= =?utf-8?B?M0VyZkk1VU41Nkl0YkdvbFJCcUkzK0orVGFZRmhVWE0xVjlCWlJYNXFQdmpz?= =?utf-8?B?TDZLSVg1blRmNGdlUjREUjVxalBoRGk2ZmVWL1NuVFIyOEh4NG15OU1qWjRw?= =?utf-8?B?NkJCRjFrV0puMEh6N2hjV29TWG9yekJXMlpBTHkzNjA3cUdkWE1NNzZPVERX?= =?utf-8?Q?QTILZ98YTKTexe3ru6JdQBxWt86zz0=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bFh6ekczYWl2aGszeDBRMDV1OUdMUWRWWnFBNUQ4VWFpdTgvai9ibFUwd2s1?= =?utf-8?B?TnpFdzhtck9uS2F2aC9HemtMVEFPOUdTU05SMVAvSW53QlVkSFBSMCs2S2pM?= =?utf-8?B?bjlOell4R2Raa011eWFIdUhlNWxhVG0xME1aWHR4ZTh1Z2pEaUU1T2xoRWlw?= =?utf-8?B?NXlERkZVYXhtSUI2am5pVnk2UFgrUWtOU2tYQjhkOThuV0g3STFqcXZHb3ph?= =?utf-8?B?Mm1DQ3h0YjJXckZCT2s2MUpFc1gvTDIzamtYRVg0cExxSVlyeGtlRnNTSWxY?= =?utf-8?B?eEZZN1luYlNKRjArRXdieWFiWVhFSHZ5WEpFZVFkMnJDOUxjNityRkhsZ2VE?= =?utf-8?B?TE5JY2p4NDlxUnVISnpPSkxONDdqblpuU0VuY1U4L05EU0xqcDlwRngxMkIy?= =?utf-8?B?S2JyRGw4K1hKTzNtL21DZnBCR1ZJNTVtMktNMjNMLzUzSTlXY3hMNitpYzV2?= =?utf-8?B?cXlXT3BLUEwxNlFvNEtBcFN0enlHdmZrdFpkTmFYTUFCMXFsWWFwUEpiL2VB?= =?utf-8?B?cEpoZzA2TXo5NHo3UTJPYVlndEdmUldMOGQxdWlhUGZPQ3hidVBIaFU1dzBV?= =?utf-8?B?VkRPVzNyVnpSdDRLSWdCWXBEZHM5MWIrMEpXVnp2YVEzcGtZaE96WWo3YWJt?= =?utf-8?B?L3o4UEdVVVJUbGthY3NKYVR3MGN0dlhPNkJ5QVA3ZGdYdnZqSDA0TmloMllq?= =?utf-8?B?aDljaUU1bkVKUVdPakE2bGlxL0s2dGM1UkV1Uzc3VGJGelAyd2ZPbnZUSXo4?= =?utf-8?B?NHFOQmxPT1YzYUYySlpEMFlmdUd6N0ZSVHg5N25GcjU0eGozbkJYQWxneXVV?= =?utf-8?B?MnBPVWxTdmdoM3R6REhReWxpMWdPbDVpbWhYN1BXRXBrOTRmZGFiZFRYNCs0?= =?utf-8?B?Q2pDNTdsblRhaWpISUxJMkZvNlBnTjNuUlloQ0JieHVmNDE0YjVNQWtTTVRI?= =?utf-8?B?aGdSdXJDMU8zTUtYaHk4N3M0Yjhkdk1EVHdWM3JPVlRIOHI4ZXNNd0Jiem5H?= =?utf-8?B?MnhzakMyV3dDb2laTDdxc2psdHZiUUx5SlFpWTJQeDFheS9mR0s1U1FTajVS?= =?utf-8?B?c0Q0VFl6VG9MZkhhOVBtS3BDVTNGbEdVd3l5VjJYUXVCQUdWQlFQdllUb2JK?= =?utf-8?B?Y2djSkVCcnZQOGVYQnovQXMzSTlzNE81VTlwVnhrdGx5ZWtxenoxem5HRGRK?= =?utf-8?B?UWhFd0h3NTluOTVBYzhwOFh6YUZXa28vc2pOZTk3RDBWOC9EYTB2ZW9kM1FJ?= =?utf-8?B?ZVFTZElYN2VOM0thZktDMzNyN3ZjSFhkbWVjd2V1dFYraDBvT0lVSWJjZXVQ?= =?utf-8?B?Z3hMbGxXQ095M2lNSGlxQW80T2hweTNNWGxLRFZXRzNZN1JZT1JlYXExN0dC?= =?utf-8?B?c0R2VVAzUVdqVmo2aS85REdpdkcxZHU1NzhxT3ZLYjNiZFFQVFBOZ21XT2py?= =?utf-8?B?dWQrUnUzdVB6eVo4SGM0MCtKL0lyMmJnL0xmQ3JiOEtmdTNyVmJwZHBVMThk?= =?utf-8?B?ajBwT3Z2T0VxNlhkZWZ0NHc1NXRTQXhKZTFCY2o0QUp0VjhuZU5PK20ySzhE?= =?utf-8?B?YzloVXhYT2hvc0tLS1lybjlxSFB2ZURuY25DNnJDZU5CYVRrUElWaDRweXJj?= =?utf-8?B?THVRRVRyTjFjaXZITURoZ2wvRzdKSWV2MSs0VkpTcEhmNVl6UHJOZk00M29D?= =?utf-8?B?Tzgya2NNMk52aVNXUEFKQzZRcytTYitsd1Nta08xd0lOWTI2cFVYclUyT295?= =?utf-8?B?VGFIcWRLeUxjWEFTanlrVW9DQXdCajdxZTZYMm0rY1FQOW15eHora1BBa2tr?= =?utf-8?B?ZFJmNkpwMXRPVEsveGV1Y2NkWkxMOEpxSUFxaUt5NFg0VmpnVmRnVVlzWDVU?= =?utf-8?B?LzhTL2t4WWdqaXYzZTBnT2k0cklKQk5PenBJSXkvdDBZQzh6OXJBUFhqTEhD?= =?utf-8?B?dGtVYnBJZjhKOHJBcDFKNk0xeEE5UjQxZ0RRSlBMMTk1eUtON1VrMkJub3RZ?= =?utf-8?B?c1pLVVR4NXRKUnJpU09EREc1eXNqUGJQdzBwWHJtYXk2RVZ5bzhjMkZzZ2U2?= =?utf-8?B?MkhZU1VnS2NoT1VLbS9OV2wvUmxBRWZjMWowZC9MbythQmFxc0JIdnZ3eEFN?= =?utf-8?Q?gJM9dekY2VVRc1O5/R0/9Ik9z?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 12c5d7a4-c00f-434c-1f5f-08dd90f44033 X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:08.1301 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: hypHCdGPE6KJ5ipVIGpdSNkH9tb0l0V7dOyT1AWQswnq+qdsDq87R0/o6Zb3BzjK+7r7Mondx4kbGd76IR1Q7w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR11MB4920 X-Proofpoint-GUID: FB9XpQk501Pia991ia4JGv9uUuIu98Ur X-Proofpoint-ORIG-GUID: FB9XpQk501Pia991ia4JGv9uUuIu98Ur X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX4Q6AqC5r/sX9 ANB9BoyNSPCCGUNaWcc8pDxTnFaFJUzr6FxAR9r7dgbdhhEqregmBzF4C/mRJ/Idh2hIBAlMhgI 9x1UTlJTYZO7noJ83Yqfd8tmkiyyfutlSwu43DahThko6iahDE0+Sul9PSfzNbQzyyp3izUf8Ql nHMxolzwZV8v+9yaOAtV4d1TZXXWRDPnjdXaz2+LZHgEqBDsB8UTeCgoUdKWso91aMVCdePWW1B owpxRAmw4wWZ82D8dLg3As7gvBJRYWG1Rk6uYeITyK6bBWmf/+kvPDN38f8eE1NVPsxAEvT3qor /bzj7tyt5ZTBDpMPFzzxraNvQcymY/T7x3QVG8fSPSxaEkkwC/rbiHYicMvpw4DSRig4g5B+gc2 RZuTOGCoLW2GUBhJ+GdfvLBVPcDMEu5H/lzsmZ1dtkVSJh5qX7ZHK6U4HA58aNQd5EKMDdGg X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214eab cx=c_pps a=coA4Samo6CBVwaisclppwQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=TGmY4fB2UfIvIpc1UaMA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=999 clxscore=1015 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 This adds support for CPC over SPI. CPC uses a full-duplex protocol. Each frame transmission/reception is split into two parts: - read and/or write header + header checksum - read and/or write payload + payload checksum Header frames are always 10 bytes (8 bytes of header and 2 bytes of checksum). The header contains the size of the payload to receive (size to transmit is already known). As the SPI device also has some processing to do when it receives a header, the SPI driver must wait for the interrupt line to be asserted before clocking the payload. The SPI device always expects the chip select to be asserted and deasserted after a header, even if there are no payloads to transmit. This is used to keep headers transmission synchronized between host and device. As some controllers don't support doing that if there is nothing to transmit, a null byte is transmitted in that case and it will be ignored by the device. If there are payloads, the driver will clock the maximum length of the two payloads. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/Kconfig | 3 +- drivers/net/cpc/Makefile | 2 +- drivers/net/cpc/main.c | 8 + drivers/net/cpc/spi.c | 550 +++++++++++++++++++++++++++++++++++++++ drivers/net/cpc/spi.h | 12 + 5 files changed, 573 insertions(+), 2 deletions(-) create mode 100644 drivers/net/cpc/spi.c create mode 100644 drivers/net/cpc/spi.h diff --git a/drivers/net/cpc/Kconfig b/drivers/net/cpc/Kconfig index f31b6837b49..f5159390a82 100644 --- a/drivers/net/cpc/Kconfig +++ b/drivers/net/cpc/Kconfig @@ -2,7 +2,8 @@ =20 menuconfig CPC tristate "Silicon Labs Co-Processor Communication (CPC) Protocol" - depends on NET + depends on NET && SPI + select CRC_ITU_T help Provide support for the CPC protocol to Silicon Labs EFR32 devices. =20 diff --git a/drivers/net/cpc/Makefile b/drivers/net/cpc/Makefile index a61af84df90..195cdf4ad62 100644 --- a/drivers/net/cpc/Makefile +++ b/drivers/net/cpc/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 =20 -cpc-y :=3D endpoint.o header.o interface.o main.o protocol.o system.o +cpc-y :=3D endpoint.o header.o interface.o main.o protocol.o spi.o system.o =20 obj-$(CONFIG_CPC) +=3D cpc.o diff --git a/drivers/net/cpc/main.c b/drivers/net/cpc/main.c index fc46a25f5dc..b4e73145ac2 100644 --- a/drivers/net/cpc/main.c +++ b/drivers/net/cpc/main.c @@ -8,6 +8,7 @@ =20 #include "cpc.h" #include "header.h" +#include "spi.h" #include "system.h" =20 /** @@ -126,12 +127,19 @@ static int __init cpc_init(void) if (err) bus_unregister(&cpc_bus); =20 + err =3D cpc_spi_register_driver(); + if (err) { + cpc_system_drv_unregister(); + bus_unregister(&cpc_bus); + } + return err; } module_init(cpc_init); =20 static void __exit cpc_exit(void) { + cpc_spi_unregister_driver(); cpc_system_drv_unregister(); bus_unregister(&cpc_bus); } diff --git a/drivers/net/cpc/spi.c b/drivers/net/cpc/spi.c new file mode 100644 index 00000000000..2b068eeb5d4 --- /dev/null +++ b/drivers/net/cpc/spi.c @@ -0,0 +1,550 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cpc.h" +#include "header.h" +#include "interface.h" +#include "spi.h" + +#define CPC_SPI_CSUM_SIZE 2 +#define CPC_SPI_INTERRUPT_MAX_WAIT_MS 1000 +#define CPC_SPI_MAX_PAYLOAD_SIZE 4096 + +struct cpc_spi { + struct spi_device *spi; + struct cpc_interface *intf; + + struct task_struct *task; + wait_queue_head_t event_queue; + + struct sk_buff *tx_skb; + u8 tx_csum[CPC_SPI_CSUM_SIZE]; + + atomic_t event_cond; + struct sk_buff *rx_skb; + unsigned int rx_len; + u8 rx_header[CPC_HEADER_SIZE + CPC_SPI_CSUM_SIZE]; +}; + +static bool buffer_is_zeroes(const u8 *buffer, size_t length) +{ + for (size_t i =3D 0; i < length; i++) { + if (buffer[i] !=3D 0) + return false; + } + + return true; +} + +static u16 cpc_spi_csum(const u8 *buffer, size_t length) +{ + return crc_itu_t(0, buffer, length); +} + +static int cpc_spi_do_xfer_header(struct cpc_spi *ctx) +{ + struct spi_transfer xfer_header =3D { + .rx_buf =3D ctx->rx_header, + .len =3D CPC_HEADER_SIZE, + .speed_hz =3D ctx->spi->max_speed_hz, + }; + struct spi_transfer xfer_csum =3D { + .rx_buf =3D &ctx->rx_header[CPC_HEADER_SIZE], + .len =3D sizeof(ctx->tx_csum), + .speed_hz =3D ctx->spi->max_speed_hz, + }; + enum cpc_frame_type type; + struct spi_message msg; + size_t payload_len =3D 0; + struct sk_buff *skb; + u16 rx_csum; + u16 csum; + int ret; + + if (ctx->tx_skb) { + u16 tx_hdr_csum =3D cpc_spi_csum(ctx->tx_skb->data, CPC_HEADER_SIZE); + + put_unaligned_le16(tx_hdr_csum, ctx->tx_csum); + + xfer_header.tx_buf =3D ctx->tx_skb->data; + xfer_csum.tx_buf =3D ctx->tx_csum; + } + + spi_message_init(&msg); + spi_message_add_tail(&xfer_header, &msg); + spi_message_add_tail(&xfer_csum, &msg); + + ret =3D spi_sync(ctx->spi, &msg); + if (ret) + return ret; + + if (ctx->tx_skb) { + if (skb_headlen(ctx->tx_skb) =3D=3D CPC_HEADER_SIZE) { + kfree_skb(ctx->tx_skb); + ctx->tx_skb =3D NULL; + } else { + skb_pull(ctx->tx_skb, CPC_HEADER_SIZE); + } + } + + if (buffer_is_zeroes(ctx->rx_header, CPC_HEADER_SIZE)) + return 0; + + rx_csum =3D get_unaligned_le16(&ctx->rx_header[CPC_HEADER_SIZE]); + csum =3D cpc_spi_csum(ctx->rx_header, CPC_HEADER_SIZE); + + if (rx_csum !=3D csum || !cpc_header_get_type(ctx->rx_header, &type)) { + /* + * If the header checksum is invalid, its length can't be trusted, recei= ve + * the maximum payload length to recover from that situation. If the fra= me + * type cannot be extracted from the header, use same recovery mechanism. + */ + ctx->rx_len =3D CPC_SPI_MAX_PAYLOAD_SIZE; + + return 0; + } + + if (type =3D=3D CPC_FRAME_TYPE_DATA) + payload_len =3D cpc_header_get_payload_len(ctx->rx_header) + + sizeof(ctx->tx_csum); + + skb =3D cpc_skb_alloc(payload_len, GFP_KERNEL); + if (!skb) { + /* + * Failed to allocate memory to receive the payload. Driver must clock in + * these bytes even if there is no room, to keep the sender in sync. + */ + ctx->rx_len =3D payload_len; + + return 0; + } + + memcpy(skb_push(skb, CPC_HEADER_SIZE), ctx->rx_header, CPC_HEADER_SIZE); + + if (payload_len) { + ctx->rx_skb =3D skb; + ctx->rx_len =3D payload_len; + } else { + cpc_interface_receive_frame(ctx->intf, skb); + } + + return 0; +} + +static int cpc_spi_do_xfer_notch(struct cpc_spi *ctx) +{ + struct spi_transfer xfer =3D { + .tx_buf =3D ctx->tx_csum, + .len =3D 1, + .speed_hz =3D ctx->spi->max_speed_hz, + }; + struct spi_message msg; + + ctx->tx_csum[0] =3D 0; + + spi_message_init(&msg); + spi_message_add_tail(&xfer, &msg); + + return spi_sync(ctx->spi, &msg); +} + +static int cpc_spi_do_xfer_payload(struct cpc_spi *ctx) +{ + struct spi_transfer shared_xfer =3D { + .speed_hz =3D ctx->spi->max_speed_hz, + .rx_buf =3D NULL, + .tx_buf =3D NULL, + }; + struct spi_transfer pad_xfer1 =3D { + .speed_hz =3D ctx->spi->max_speed_hz, + .rx_buf =3D NULL, + .tx_buf =3D NULL, + }; + struct spi_transfer pad_xfer2 =3D { + .speed_hz =3D ctx->spi->max_speed_hz, + .rx_buf =3D NULL, + .tx_buf =3D NULL, + }; + unsigned int rx_len =3D ctx->rx_len; + unsigned int tx_data_len; + struct spi_message msg; + int ret; + + spi_message_init(&msg); + spi_message_add_tail(&shared_xfer, &msg); + + /* + * This can happen if header checksum was invalid. In that case, protocol + * mandates to be ready to receive the maximum number of bytes that the + * device is capable to send, in order to be sure its TX queue is flushed. + */ + if (!ctx->rx_skb && rx_len) { + shared_xfer.rx_buf =3D kmalloc(rx_len, GFP_KERNEL); + if (!shared_xfer.rx_buf) + return -ENOMEM; + + shared_xfer.len =3D rx_len; + } + + if (ctx->rx_skb && !ctx->tx_skb) { + shared_xfer.rx_buf =3D skb_put(ctx->rx_skb, rx_len); + shared_xfer.len =3D rx_len; + } + + if (ctx->tx_skb) { + u16 csum =3D ctx->tx_skb->csum; + + put_unaligned_le16(csum, ctx->tx_csum); + + tx_data_len =3D ctx->tx_skb->len; + + shared_xfer.tx_buf =3D ctx->tx_skb->data; + shared_xfer.len =3D tx_data_len; + + if (!ctx->rx_skb) { + pad_xfer1.tx_buf =3D ctx->tx_csum; + pad_xfer1.len =3D sizeof(ctx->tx_csum); + + spi_message_add_tail(&pad_xfer1, &msg); + } + } + + if (ctx->rx_skb && ctx->tx_skb) { + unsigned int shared_len; + unsigned int pad_len; + + shared_len =3D min(rx_len, tx_data_len); + pad_len =3D max(rx_len, tx_data_len) - shared_len; + + shared_xfer.rx_buf =3D skb_put(ctx->rx_skb, shared_len); + shared_xfer.len =3D shared_len; + + if (rx_len < tx_data_len) { + /* + * |------- RX BUFFER + RX CSUM ------| + * |------------------- TX BUFFER ------------|---- TX CSUM ----| + * + * | SHARED | + * | PAD 1 | + * | PAD 2 | + */ + pad_xfer1.rx_buf =3D NULL; + pad_xfer1.tx_buf =3D ctx->tx_skb->data + shared_len; + pad_xfer1.len =3D pad_len; + + pad_xfer2.rx_buf =3D NULL; + pad_xfer2.tx_buf =3D ctx->tx_csum; + pad_xfer2.len =3D sizeof(ctx->tx_csum); + + spi_message_add_tail(&pad_xfer1, &msg); + spi_message_add_tail(&pad_xfer2, &msg); + } else if (rx_len =3D=3D tx_data_len) { + /* + * |------------- RX BUFFER + RX CSUM ---------| + * |------------------- TX BUFFER -------------|---- TX CSUM ---| + * + * | SHARED | + * | PAD 1 | + */ + pad_xfer1.rx_buf =3D NULL; + pad_xfer1.tx_buf =3D ctx->tx_csum; + pad_xfer1.len =3D sizeof(ctx->tx_csum); + + spi_message_add_tail(&pad_xfer1, &msg); + } else if (rx_len =3D=3D tx_data_len + 1) { + /* + * |----------------- RX BUFFER + RX CSUM ----------------| + * |------------------- TX BUFFER -------------|---- TX CSUM ---| + * + * | SHARED | + * | PAD 1 | + * | PAD 2 | + */ + pad_xfer1.tx_buf =3D ctx->tx_csum; + pad_xfer1.rx_buf =3D skb_put(ctx->rx_skb, 1); + pad_xfer1.len =3D 1; + + pad_xfer2.tx_buf =3D &ctx->tx_csum[1]; + pad_xfer2.rx_buf =3D NULL; + pad_xfer2.len =3D 1; + + spi_message_add_tail(&pad_xfer1, &msg); + spi_message_add_tail(&pad_xfer2, &msg); + } else { + /* + * |----------------------------- RX BUFFER + RX CSUM -----------------= --| + * |------------------- TX BUFFER -------------|---- TX CSUM ---| + * + * | SHARED | + * | PAD 1 | + * | PAD = 2 | + */ + pad_xfer1.tx_buf =3D ctx->tx_csum; + pad_xfer1.rx_buf =3D skb_put(ctx->rx_skb, sizeof(ctx->tx_csum)); + pad_xfer1.len =3D sizeof(ctx->tx_csum); + + pad_xfer2.tx_buf =3D NULL; + pad_xfer2.rx_buf =3D skb_put(ctx->rx_skb, pad_len - sizeof(ctx->tx_csum= )); + pad_xfer2.len =3D pad_len - sizeof(ctx->tx_csum); + + spi_message_add_tail(&pad_xfer1, &msg); + spi_message_add_tail(&pad_xfer2, &msg); + } + } + + ret =3D spi_sync(ctx->spi, &msg); + + if (ctx->tx_skb) { + kfree_skb(ctx->tx_skb); + ctx->tx_skb =3D NULL; + } + + if (ctx->rx_skb) { + unsigned char *csum_ptr; + u16 expected_csum; + u16 csum; + + if (ret) { + kfree_skb(ctx->rx_skb); + goto exit; + } + + csum_ptr =3D skb_tail_pointer(ctx->rx_skb) - sizeof(csum); + csum =3D get_unaligned_le16(csum_ptr); + + expected_csum =3D cpc_spi_csum(ctx->rx_skb->data + CPC_HEADER_SIZE, + ctx->rx_len - sizeof(csum)); + + if (csum =3D=3D expected_csum) { + skb_trim(ctx->rx_skb, ctx->rx_skb->len - sizeof(csum)); + + cpc_interface_receive_frame(ctx->intf, ctx->rx_skb); + } else { + kfree_skb(ctx->rx_skb); + } + } + +exit: + ctx->rx_skb =3D NULL; + ctx->rx_len =3D 0; + + return ret; +} + +static int cpc_spi_do_xfer_thread(void *data) +{ + struct cpc_spi *ctx =3D data; + bool xfer_idle =3D true; + int ret; + + while (!kthread_should_stop()) { + if (xfer_idle) { + ret =3D wait_event_interruptible(ctx->event_queue, + (!cpc_interface_tx_queue_empty(ctx->intf) || + atomic_read(&ctx->event_cond) =3D=3D 1 || + kthread_should_stop())); + + if (ret) + continue; + + if (kthread_should_stop()) + return 0; + + if (!ctx->tx_skb) + ctx->tx_skb =3D cpc_interface_dequeue(ctx->intf); + + /* + * Reset thread event right before transmission to prevent interrupts t= hat + * happened while the thread was already awake to wake up the thread ag= ain, + * as the event is going to be handled by this iteration. + */ + atomic_set(&ctx->event_cond, 0); + + ret =3D cpc_spi_do_xfer_header(ctx); + if (!ret) + xfer_idle =3D false; + } else { + ret =3D wait_event_timeout(ctx->event_queue, + (atomic_read(&ctx->event_cond) =3D=3D 1 || + kthread_should_stop()), + msecs_to_jiffies(CPC_SPI_INTERRUPT_MAX_WAIT_MS)); + if (ret =3D=3D 0) { + dev_err_once(&ctx->spi->dev, "device didn't assert interrupt in a time= ly manner\n"); + continue; + } + + atomic_set(&ctx->event_cond, 0); + + if (!ctx->tx_skb && !ctx->rx_skb) + ret =3D cpc_spi_do_xfer_notch(ctx); + else + ret =3D cpc_spi_do_xfer_payload(ctx); + + if (!ret) + xfer_idle =3D true; + } + } + + return 0; +} + +static irqreturn_t cpc_spi_irq_handler(int irq, void *data) +{ + struct cpc_spi *ctx =3D data; + + atomic_set(&ctx->event_cond, 1); + wake_up(&ctx->event_queue); + + return IRQ_HANDLED; +} + +static int cpc_spi_ops_wake_tx(struct cpc_interface *intf) +{ + struct cpc_spi *ctx =3D cpc_interface_get_priv(intf); + + wake_up_interruptible(&ctx->event_queue); + + return 0; +} + +static void cpc_spi_ops_csum(struct sk_buff *skb) +{ + skb->csum =3D cpc_spi_csum(skb->data, skb->len); +} + +static const struct cpc_interface_ops spi_intf_cpc_ops =3D { + .wake_tx =3D cpc_spi_ops_wake_tx, + .csum =3D cpc_spi_ops_csum, +}; + +static int cpc_spi_probe(struct spi_device *spi) +{ + struct cpc_interface *intf; + struct cpc_spi *ctx; + int err; + + if (!spi->irq) { + dev_err(&spi->dev, "cannot function without IRQ, please provide one\n"); + return -EINVAL; + } + + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + intf =3D cpc_interface_alloc(&spi->dev, &spi_intf_cpc_ops, ctx); + if (IS_ERR(intf)) { + kfree(ctx); + + return PTR_ERR(intf); + } + + spi_set_drvdata(spi, ctx); + + ctx->spi =3D spi; + ctx->intf =3D intf; + + ctx->tx_skb =3D NULL; + + atomic_set(&ctx->event_cond, 0); + ctx->rx_skb =3D NULL; + + init_waitqueue_head(&ctx->event_queue); + + err =3D cpc_interface_register(intf); + if (err) + goto put_interface; + + err =3D request_irq(spi->irq, cpc_spi_irq_handler, IRQF_TRIGGER_FALLING, + dev_name(&spi->dev), ctx); + if (err) + goto unregister_interface; + + ctx->task =3D kthread_run(cpc_spi_do_xfer_thread, ctx, "%s", + dev_name(&spi->dev)); + if (IS_ERR(ctx->task)) { + err =3D PTR_ERR(ctx->task); + goto free_irq; + } + + return 0; + +free_irq: + free_irq(spi->irq, ctx); + +unregister_interface: + cpc_interface_unregister(intf); + +put_interface: + cpc_interface_put(intf); + + kfree(ctx); + + return err; +} + +static void cpc_spi_remove(struct spi_device *spi) +{ + struct cpc_spi *ctx =3D spi_get_drvdata(spi); + struct cpc_interface *intf =3D ctx->intf; + + kthread_stop(ctx->task); + free_irq(spi->irq, ctx); + cpc_interface_unregister(intf); + kfree(ctx); +} + +static const struct of_device_id cpc_dt_ids[] =3D { + { .compatible =3D "silabs,cpc-spi" }, + {}, +}; +MODULE_DEVICE_TABLE(of, cpc_dt_ids); + +static const struct spi_device_id cpc_spi_ids[] =3D { + { .name =3D "cpc-spi" }, + {}, +}; +MODULE_DEVICE_TABLE(spi, cpc_spi_ids); + +static struct spi_driver cpc_spi_driver =3D { + .driver =3D { + .name =3D "cpc-spi", + .of_match_table =3D cpc_dt_ids, + }, + .probe =3D cpc_spi_probe, + .remove =3D cpc_spi_remove, +}; + +/** + * cpc_spi_register_driver - Register driver to the SPI subsytem. + * + * @return: 0 on success, otherwise a negative error code. + */ +int cpc_spi_register_driver(void) +{ + return spi_register_driver(&cpc_spi_driver); +} + +/** + * cpc_spi_unregister_driver - Unregister driver from the SPI subsytem. + */ +void cpc_spi_unregister_driver(void) +{ + spi_unregister_driver(&cpc_spi_driver); +} diff --git a/drivers/net/cpc/spi.h b/drivers/net/cpc/spi.h new file mode 100644 index 00000000000..211133c4758 --- /dev/null +++ b/drivers/net/cpc/spi.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#ifndef __CPC_SPI_H +#define __CPC_SPI_H + +int cpc_spi_register_driver(void); +void cpc_spi_unregister_driver(void); + +#endif --=20 2.49.0 From nobody Wed Dec 17 08:55:55 2025 Received: from mx0a-0024c301.pphosted.com (mx0a-0024c301.pphosted.com [148.163.149.154]) (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 8D8D520E718; Mon, 12 May 2025 01:28:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.149.154 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013307; cv=fail; b=iyP2WhTbpFUcioq4ny2FjkZBBYd/wTH+SjekO/mmGwapcZ7aIIAkXYz4jGR7NMSCPkuC24yDcsurFU7sDO1ZRm/QjTL4UphfIOcp/N0EqNE1OG6UG7HhIRFiSVcgXBJSqa6tTG9xQ7i0+MguXSldYMbBZa8/6cauQJmfJdOQRhI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747013307; c=relaxed/simple; bh=J5jZqqfqhMmRHBOqN+2/e6fmEgAlMc1/FlJT8cM195Q=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=e0N/eS9dDfk6tjIEcIN2ZXPG7faH8vWcG+CtujTgmKHgG4yPJbCl17AsXR0qiAX1VMGvizVquA8I+bmAVOdDK+uCGjS7td3UrXA1ArFhGO6xDcWAmisdt9iK3RUcSYhPCnCXlpTn93xygCGz7ceY1Xe9kS7sVHqu8kMwQcL4Ed0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com; spf=pass smtp.mailfrom=silabs.com; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b=QYANk6lw; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b=c8ayZtwP; arc=fail smtp.client-ip=148.163.149.154 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=silabs.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=silabs.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=silabs.com header.i=@silabs.com header.b="QYANk6lw"; dkim=pass (1024-bit key) header.d=silabs.com header.i=@silabs.com header.b="c8ayZtwP" Received: from pps.filterd (m0101743.ppops.net [127.0.0.1]) by mx0a-0024c301.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 54BMe1Rw027700; Sun, 11 May 2025 20:28:12 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pps12202023; bh=RWBCh0EhSmW+QtYQmugPztGTiGpOuaav1Vsd1G/u5SE=; b=QYANk6lwX0q0 Pla2TXdym+V8aKnW7HQiX+iHC8j9nXBaVPAV/ilwGwEtxvf04AUPfQlE3+sMU2nb vzspOLuup7LfIC//shP0KTGM5QDLdYQ6JC7X6qbjQHWc7+O7QtvvDPyErBUIlE0M OeSXKceI53Eop2w7IdY8N4xrPHOVzHhXECb/rlAXkWs64qvTQu/1VxciJ/S0QY8J sUq5q95bkWlH72JjzyztTKA0K9yGYxyvQLMsG6E8cNC45YXYH6FH8X2BKDaEv2/r Hac18UKYbgOy2heFLFpzdCmGpPleYx+ncdscYBEDeiX72khAzKTekXuBM+VrSbuV dLdMtTO08A== Received: from nam04-dm6-obe.outbound.protection.outlook.com (mail-dm6nam04lp2044.outbound.protection.outlook.com [104.47.73.44]) by mx0a-0024c301.pphosted.com (PPS) with ESMTPS id 46j34csvw9-8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 May 2025 20:28:12 -0500 (CDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MAo6dlmi3RaB6ErijkWIlsZzYz7D2On0jxurTbzfI9ZtWvLLYJ+1sxJGkQ1wXDqb92nwp3pzLsO9oDC33X8+qwQTVmQEupeMQQNve65o8/zXLunNiT0HeFTzUd7/cNvSdOWvSugoBsABxZUYhT+QKHPJyglqPq2k9XrpDYJd+kCA8wgYhArzkx+fL0rkQhkurAJptYcGkF7MMbJT1qTMsx05FT5DYfQ1QEwMzdwcX62K2HqXdIYr3Ov0K8EEdhB7p0G6TrnrMy66lSQ4Kj92Mgvb7guqaWKC2tzYud9ZLp9zO5b/xj0jItIEc9cW7hr7dpe/NikwlkSwauOnldBh7w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=RWBCh0EhSmW+QtYQmugPztGTiGpOuaav1Vsd1G/u5SE=; b=TI/EPhDnZ3JpVyv06Npacqy2CPZxMNYYffpnywTILkEcpkO1NrpE3ov589IcvIHL+5o4fVjFB532h2jotWPoZnA6PBjAPUVPplHNieUnYVKTbRs/DD6L4kIYyKksVLXl5nlMQMtlk2nqCy/Ciu4DWw50dJKfDKrwKlBf2ss15trGP+hH4YSN7MLixWs4tCqhtHJGT8lL+nn/x5cw9PdKKRDDWlq/mQdXU6SNH8CbF4JAfCh6FOS0NT5TA1fK2yMG7Q8tde6rw52ba2bvqVl6KwojgABjKgZ/ybSMB+YgbFMeYE0zQWqmpD5+aVdJsFXgPGk5W9Obdza+24lb3aNq9Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=silabs.com; dmarc=pass action=none header.from=silabs.com; dkim=pass header.d=silabs.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=silabs.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=RWBCh0EhSmW+QtYQmugPztGTiGpOuaav1Vsd1G/u5SE=; b=c8ayZtwPQV89lWkTPkdc4wH2HyxWl2lqlwQ8HI1uNJI5icbKS5QMaQoC9ubQ5txgmyZ4NLw2eGFC7+ewF2Ipz1gpVUvcyDy+HyqUvxQjkjXHgmik3cb5mWXWqQVFVexCi3nq5Xx+scnJpIUuMePv90SxNfTPcHr2i2VJPDnMJ+M= Received: from DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) by PH0PR11MB4920.namprd11.prod.outlook.com (2603:10b6:510:41::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8722.27; Mon, 12 May 2025 01:28:08 +0000 Received: from DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a]) by DS0PR11MB8205.namprd11.prod.outlook.com ([fe80::c508:9b04:3351:524a%4]) with mapi id 15.20.8699.026; Mon, 12 May 2025 01:28:08 +0000 From: =?UTF-8?q?Damien=20Ri=C3=A9gel?= To: Andrew Lunn , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Silicon Labs Kernel Team , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 15/15] net: cpc: add Bluetooth HCI driver Date: Sun, 11 May 2025 21:27:48 -0400 Message-ID: <20250512012748.79749-16-damien.riegel@silabs.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250512012748.79749-1-damien.riegel@silabs.com> References: <20250512012748.79749-1-damien.riegel@silabs.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: YT4PR01CA0451.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:10d::17) To DS0PR11MB8205.namprd11.prod.outlook.com (2603:10b6:8:162::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR11MB8205:EE_|PH0PR11MB4920:EE_ X-MS-Office365-Filtering-Correlation-Id: 7402ee25-f5c5-40f5-6d85-08dd90f4409f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?Ui9rV085OU1nNXNyK2ZLMEtLV05Qam91dEo0OWRsTFZ6K3FWRmdSY3A0UWQw?= =?utf-8?B?TERhL2l1Y2lJMGx5VmRPSnFRMXR5Z0hTd0luSUwvZjQ0OFBpOUFIU1lYa1VI?= =?utf-8?B?QmNQemEzK1NpVUJneUpXdUdsUW5yV1NIRVV0dXdQcE1rSlBxU2VyZlRPVlpt?= =?utf-8?B?UVQ0aXpWRGJmTkdENThEWXhCNklzZmc1Rmp3eHpmRmlXa1ZzbG8rU3dmcHp4?= =?utf-8?B?NExsalpyRmRQdnp3YmlIcEx0eHJvWTV4d1RwMVAvK1hadjVzNG9sREFma0Zj?= =?utf-8?B?M3QvLzFaU2pkNDJ6dU1OeFF3L2lPcXdoRXBabHJsV0ZBZyt6M005b3I5TkRa?= =?utf-8?B?TXVEZ1lBdDgyS0gwd3ZNa1lnVW5ISmxoMEdodUFDZXE0M0xwcXRVYXFXYk00?= =?utf-8?B?d2VsUXVpdmtxdGZCbVp5SE5aZWE2WW1JaUZWK1JRZFR3QjBKYW9JZW9laFpo?= =?utf-8?B?Q3pyaUZFOVV0UEpKQ2hacEZUY0FadUdxbEJLRytFMUdLS0FUNXZRM2IzSW55?= =?utf-8?B?ckxZMm1Cam9aRmV2eTc3cU9ENjg5a2YyYlhQSm5zcy9mYUhvSzRTMFFsOHpN?= =?utf-8?B?NUEzYjVGQ0g3QlNkRFFjVFhBejN3TW1NcytUajFmeDhGczRWYjBhTVJTM1My?= =?utf-8?B?UHIxWUt3d3B6T3QvRzhieVN4VnZXbXVJZlFrek1kQXB5RmhpK3JjeGVDVXJI?= =?utf-8?B?RXJnSXh1cHhXcjRBSSt0TkhTbUNmaHU1djJiZ2tyV2xxWElFRjJ4bEhFaG5T?= =?utf-8?B?bWhiQVR1b2ZHUEczMDlBQWVaRmdzbmMyKzlTNS9oSzRIc1hBNDhBaTkxQjV5?= =?utf-8?B?RzNwaFFsVkVWeEtHdnpXaTBvSU1NTFhickRPcC85THY5UVdyWm5zUksxRlBZ?= =?utf-8?B?cWM3cnBIaDZ1NG00TXZncUxGRnZMZ0RxeVEvRHZUQ3krTmdDSkNTUmkyNW41?= =?utf-8?B?Rm5FMG9lMUNRTDRERmVmZXlrNWpwbGtXU1Z6eTlrNjNxL0tyR0pZTGszdmpS?= =?utf-8?B?cDdWbGhVOHpySXRVYTJFdUN4OVlwMEJaanNlTjJ0VnNSNlY1aHFrVDdHQmw0?= =?utf-8?B?NVVhaGdvMlQwSGwzdytkcVdFWUd3RzVoVlkxOVhjajlLeEVDOUlnbUVpSVFs?= =?utf-8?B?Y3lXSm82THQ5OWJnTDR0WmY1alZnVHkwb2pFVXI1MFZPcERvVGtXN2o0ZC8v?= =?utf-8?B?NDVwUS9PUnVrOUtaMzR0Y0lHdE0wemNDT2FrdnM2ZEdubllGWmFxRjBscytE?= =?utf-8?B?STRraWdwTEY2QUExK0duZkIyd2hPWGw2bnJUS2NjcTdxcjUweHlpUXJOZkpE?= =?utf-8?B?d2pNWDYwZ21JOWNSYVd1NmJ0QUdBenZhWVhlSDIyYjRJRjdua2dGNUt0TVRu?= =?utf-8?B?WStweDc3dzV2MWY1cnVTbkhaNEwwbGpmVmFLZDZ1MmlGVW5vOHB2VlVaWUhQ?= =?utf-8?B?eisrY0QrNUFrdHRNWTRTMEFKb2xVVWFKenlBaW53SkxmWVBMRFZzdVQ5OWpB?= =?utf-8?B?MW9KQitpZ0hRWVlrTDZrNWpMSU9lclFoVUNyaFovam1IRUN0VHlCaTBrdVdq?= =?utf-8?B?TThWTTRBOWN0T3NmblNRK3pPdWRiWElCOG5rNCszRWlNMVp0ejk1cDI3by9s?= =?utf-8?B?U0NrRm1JZHNFY2dFdmhwRC9qOHRNUnBUVlc0VkF6MUgwV3FJc3JoUW9DUHFD?= =?utf-8?B?MjhOV0J1UFFncGFQZ3ZjbldVbkNaUEduRlhRL0d5clVxWFh0amY0ZVkyY0FY?= =?utf-8?B?S1FQZDc0Q3B5VHA4S0NRclE4aFY5WDNaN0h3dGpmTzFEbFpHTDBNbWlWSVFN?= =?utf-8?B?Mmk1dlVOREhLZjJTY1RXbkVMWmVBajRGUjhYazJ1alRTaHNZRWtoRDVGcXhu?= =?utf-8?B?YmNLYTN1Y1hDdE5MUklXbmZLNHdvbzNXc0RwNDVseVlYMXhwNk5KZ3FuZGpa?= =?utf-8?B?eU96Y0NBN3J3cllBVEpQT0xWVnRnR0xqY0VmWUI0V2QvMzI3aWg4akpzc2Yz?= =?utf-8?Q?LGB3iIeg7lKZQtglrk05fXlUFGWkA4=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR11MB8205.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cjNiaHdSVmt1eHUyYk9pSElRSCtFSXNmVHVReXpoQURNT2Zma0d4MmRBUmQ3?= =?utf-8?B?UkR1YVlSdEpwbWh5aHNkWTREZXFPSDRhNTJHNkNiMHJlNThxYjN1WVZ6QlYx?= =?utf-8?B?RThmd0JzKzJybWl4SHlPOXZCc2haMEpwdTczd2ZCNnRTdmd3clFWdHU1YjN5?= =?utf-8?B?REllVmRabFJUNVptbDBWbG1Ya1BPMmU0MkNobStYSDc5ejFTUWl2QnhEb3Yx?= =?utf-8?B?S1lHOCtMaEJocnVQV25kdnp3OHVoN00yc2VzTHlMNnNqQkMvSkhmeUhaMWtQ?= =?utf-8?B?NWFuN2s2U21Fc3hEWVVkQUxaWlNXTVkwcVpJSlErS0o2SGcxME90cnRsZWw1?= =?utf-8?B?a0V4ZXJUdGNZYmgxS1pBNEZ4ZkFPSFh3RURORDJkM3ZDTjJmVFFEbWIrQk9F?= =?utf-8?B?bTF4YUpQdFdUVHN3QWMzZ0lZNEQ0ZFUzbzJyTks5TThPallIcjVhOUFOYkY4?= =?utf-8?B?dFd0MC9OZFhWVDRBSDRUVHlyQXAxTExTcGlxZlZHdzExT0dkTkxzRVQ1VVJ4?= =?utf-8?B?UVJITGhla3ZiblB0RTA3bTNBRE1TbnJBWC9MYy9iUUM5ckREckpqR0dCck1u?= =?utf-8?B?SnhUL2R0ck5kNHJ0MURGRzZ5N3FuQ2J5THFRUWlwelRVRWdRZmRoV1lyUGNi?= =?utf-8?B?QXdBRWUyajhxRGVOMW1HUU93MEdDdDUrZGRKdFB6TitJRjRsN1llK1U4L21Y?= =?utf-8?B?LzBJd3ppbGdXbms2N1dRMzVRWVQ4MGJEbGVjV016YnUwZFNSemFIaDFUWXBv?= =?utf-8?B?UjVRUG1UcDVQNS9qSVhhN0hJUHIxekN5c3lidmx6TjZmRHJvMjJQbGNTRkVK?= =?utf-8?B?T3EyTmFKMkxVaW1hTWVBWHdwaGRmZ01IdjJlSkxKc21Sb3pxRmJERkkreGd4?= =?utf-8?B?bnJxQXl2Znh0RC90YzV5aWdzRzNhYmZqL0V5Tk1UYVJjZzhJRDF3RzNMaHFx?= =?utf-8?B?VytkYjdPbGpEakR1V1BpS2J3TFhjZy8vS09UZGNQbm5JNExWS01BZXdCUW00?= =?utf-8?B?RDFFVGs1MXkzY1RQYXk2R202UUNwbnlkZ3pvNE1GNEVhTW1ZNnJweGFDZWRG?= =?utf-8?B?SmFyTzBZK1M3bk8xUE94dmZXcGg4WkZZOEZyd01kcTE4ZXo5VDl6UWxBVzJB?= =?utf-8?B?N3UxZGJFVFEvOEs3R0JWemp1eXRxQjN0Ymw2RXpZYS9OY2ZJQXZqVzZta3Zo?= =?utf-8?B?WWFKNWpJazUwYVJRUHFUaTR6OW1OSUJhbkxNZzhmNjlHdm1HTWFMQnEwNFdv?= =?utf-8?B?eUMzZFF4Uy9VUXh4Qk9ZMVQ4WTJWZG9YNjFNWkxKVTBla2Z4L0VldytodlE2?= =?utf-8?B?NlJPcllSOWo0WDZXS3RvM3pqNGJiSitFcWpqandZOTcyS0RIM1ptZ0Y3Uk4y?= =?utf-8?B?dFZONTg2SVl1enpEcXNGMjJZVEhwQm51Z2NQRFlybExvUWh4ZlMrZDNqMlFx?= =?utf-8?B?SHhOYXovOTI4K05ZS0xyRmV2TzBINFo5TjF0bVppbE84dGRhM3daTlI0NjEw?= =?utf-8?B?QkFJbWpvd0J4SWNPY3lKSnI4cXNjaXFtOTZkZnJMaGFGUFRGNkRaUVJHc2Vx?= =?utf-8?B?KzU3RDgrN05YR2JlWjlkeEpQZ2k1TnFIQndRYlNNVUFEWW15WDN0MU12RmZL?= =?utf-8?B?c2twbEJhSnRxdGl3aFVJalQ4UStnMElQdGd5RzlLTmpPWDZCcTNRemdvUlQw?= =?utf-8?B?UzdmQnY2YVI3Z0dHWExQczhIZmhIZjJsd29ycTBtbndFVHoxRHBpUmt5czd2?= =?utf-8?B?VitWUmJRRlI3cFBwYVNzUnE5RytQSkNYRmMxdjJCdWo4WXhFSWpFYmZFQW8y?= =?utf-8?B?M1ZKM2pmNlg3TWlkTkJjd3Rnb3dOUXpQTGFsMVA1RGF2aHlvVW5pWE9zcmlN?= =?utf-8?B?L1B6ZXhmbVNJemJXSHlUTzJtQzFFM0VBZExNYjBVL1RWWmRIWWlZcTdmMUt6?= =?utf-8?B?NjB4amppdlVEQzVjMnE1RWJaQS9ybGFxS1FLd0g2SHp2Uy83YXdrNXF1UFY0?= =?utf-8?B?M0N3TXovRHBFa25vQ2lTcjY1QTExUWIzZTF0SmlJbUtLVSt2WFBEY1ZVWmVy?= =?utf-8?B?ZEY2aGx4R00zWGFJMkNKNVJreXVyMWhOTURPRVZvV0tXbFFGRjdZL0ZrUDd0?= =?utf-8?Q?KGoLcEngyZ9V3H6CucgV2oXlf?= X-OriginatorOrg: silabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7402ee25-f5c5-40f5-6d85-08dd90f4409f X-MS-Exchange-CrossTenant-AuthSource: DS0PR11MB8205.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 May 2025 01:28:08.8558 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 54dbd822-5231-4b20-944d-6f4abcd541fb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 4L6nBYMGU6g4/teV0sCpJtEQtPXTFRWXT2e1bLsK2nc2o1IMyZV3qYJNJ6qQRSwzrIkuAQpU/rVUzYjCmkJcJw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR11MB4920 X-Proofpoint-GUID: 5nqPBLum36HYNw2ky0pK_kBkJAiJtO3- X-Proofpoint-ORIG-GUID: 5nqPBLum36HYNw2ky0pK_kBkJAiJtO3- X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNTEyMDAxMyBTYWx0ZWRfX3KyM5IxF8ezH fUZhMtiizerpja8frg5PCv3WJqrgkySufuONI6xxIEFAnCgsAdCaiXdF7AN9e7ahi9uqc+TJsGs 8NLpKG9LD5lk48kvQemVrvY0Vdw7nZ0dmXhodi2MrYb39+kMm7I7cpVLtr+CDX2ff8kMitgPWr9 0aEOFsc65dZWHfO4NV3l5Id9oTzPwm7f/oJBr0GfO38SN0e5tO2YCF78cF4euCUcde0so5lRhD9 PPuF9FMHNNi9ANCIOrY4ACtjWAVi15FjDrN43gIVsN3zUSao2dwOOX2ng0/R6ucclBUjIHTniR6 d9nuIuKxzvO9WqUU8FculOHP1txlURuXfpS64PfvvsfVau9UanLXvq496sttlLY91ou/z5pXJ/2 gDsx7tKUBBWJhSjClUS5qqEbmMfCmP77nK3ly848lQNxLEzxU1ikbcndYwkBukGoMA9ufiYi X-Authority-Analysis: v=2.4 cv=L/gdQ/T8 c=1 sm=1 tr=0 ts=68214eac cx=c_pps a=coA4Samo6CBVwaisclppwQ==:117 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=dt9VzEwgFbYA:10 a=M51BFTxLslgA:10 a=i1IsUcr2s-wA:10 a=2AEO0YjSAAAA:8 a=KeReSjn5avopcc9GsFcA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-05-11_10,2025-05-09_01,2025-02-21_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 mlxlogscore=999 clxscore=1015 mlxscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=spam authscore=0 authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.21.0-2504070000 definitions=main-2505120013 Add support for Bluetooth HCI driver. As most of the protocol is already handled by the remote endpoint, this driver is just doing some glue to plug into CPC. Signed-off-by: Damien Ri=C3=A9gel --- drivers/net/cpc/Kconfig | 2 +- drivers/net/cpc/Makefile | 2 +- drivers/net/cpc/ble.c | 147 +++++++++++++++++++++++++++++++++++++++ drivers/net/cpc/ble.h | 14 ++++ drivers/net/cpc/main.c | 23 ++++-- 5 files changed, 181 insertions(+), 7 deletions(-) create mode 100644 drivers/net/cpc/ble.c create mode 100644 drivers/net/cpc/ble.h diff --git a/drivers/net/cpc/Kconfig b/drivers/net/cpc/Kconfig index f5159390a82..e8faa351bf7 100644 --- a/drivers/net/cpc/Kconfig +++ b/drivers/net/cpc/Kconfig @@ -2,7 +2,7 @@ =20 menuconfig CPC tristate "Silicon Labs Co-Processor Communication (CPC) Protocol" - depends on NET && SPI + depends on NET && SPI && BT select CRC_ITU_T help Provide support for the CPC protocol to Silicon Labs EFR32 devices. diff --git a/drivers/net/cpc/Makefile b/drivers/net/cpc/Makefile index 195cdf4ad62..cee40aec412 100644 --- a/drivers/net/cpc/Makefile +++ b/drivers/net/cpc/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 =20 -cpc-y :=3D endpoint.o header.o interface.o main.o protocol.o spi.o system.o +cpc-y :=3D ble.o endpoint.o header.o interface.o main.o protocol.o spi.o s= ystem.o =20 obj-$(CONFIG_CPC) +=3D cpc.o diff --git a/drivers/net/cpc/ble.c b/drivers/net/cpc/ble.c new file mode 100644 index 00000000000..2b7aec4dbdf --- /dev/null +++ b/drivers/net/cpc/ble.c @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Driver for Bluetooth HCI over CPC. + * + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#include +#include +#include + +#include "ble.h" +#include "cpc.h" + +struct cpc_ble { + struct cpc_endpoint *ep; + struct hci_dev *hdev; + struct sk_buff_head txq; +}; + +static int cpc_ble_open(struct hci_dev *hdev) +{ + struct cpc_ble *ble =3D hci_get_drvdata(hdev); + + skb_queue_head_init(&ble->txq); + + return cpc_endpoint_connect(ble->ep); +} + +static int cpc_ble_close(struct hci_dev *hdev) +{ + struct cpc_ble *ble =3D hci_get_drvdata(hdev); + + cpc_endpoint_disconnect(ble->ep); + + skb_queue_purge(&ble->txq); + + return 0; +} + +static int cpc_ble_flush(struct hci_dev *hdev) +{ + struct cpc_ble *ble =3D hci_get_drvdata(hdev); + + skb_queue_purge(&ble->txq); + + return 0; +} + +static int cpc_ble_send(struct hci_dev *hdev, struct sk_buff *skb) +{ + struct cpc_ble *ble =3D hci_get_drvdata(hdev); + + memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1); + + return cpc_endpoint_write(ble->ep, skb); +} + +static void cpc_ble_rx_frame(struct cpc_endpoint *ep, struct sk_buff *skb) +{ + struct cpc_ble *ble =3D cpc_endpoint_get_drvdata(ep); + + hci_skb_pkt_type(skb) =3D *((u8 *)skb_pull_data(skb, 1)); + hci_skb_expect(skb) =3D skb->len; + + hci_recv_frame(ble->hdev, skb); +} + +static struct cpc_endpoint_ops cpc_ble_ops =3D { + .rx =3D cpc_ble_rx_frame, +}; + +static int cpc_ble_probe(struct cpc_endpoint *ep) +{ + struct cpc_ble *ble; + int err; + + ble =3D kzalloc(sizeof(*ble), GFP_KERNEL); + if (!ble) { + err =3D -ENOMEM; + goto alloc_ble_fail; + } + + cpc_endpoint_set_ops(ep, &cpc_ble_ops); + cpc_endpoint_set_drvdata(ep, ble); + + ble->ep =3D ep; + ble->hdev =3D hci_alloc_dev(); + if (!ble->hdev) { + err =3D -ENOMEM; + goto alloc_hdev_fail; + } + + hci_set_drvdata(ble->hdev, ble); + ble->hdev->open =3D cpc_ble_open; + ble->hdev->close =3D cpc_ble_close; + ble->hdev->flush =3D cpc_ble_flush; + ble->hdev->send =3D cpc_ble_send; + + err =3D hci_register_dev(ble->hdev); + if (err) + goto register_hdev_fail; + + return 0; + +register_hdev_fail: + hci_free_dev(ble->hdev); +alloc_hdev_fail: + kfree(ble); +alloc_ble_fail: + return err; +} + +static void cpc_ble_remove(struct cpc_endpoint *ep) +{ + struct cpc_ble *ble =3D cpc_endpoint_get_drvdata(ep); + + hci_unregister_dev(ble->hdev); + hci_free_dev(ble->hdev); + kfree(ble); +} + +static struct cpc_driver ble_driver =3D { + .driver =3D { + .name =3D CPC_BLUETOOTH_ENDPOINT_NAME, + }, + .probe =3D cpc_ble_probe, + .remove =3D cpc_ble_remove, +}; + +/** + * cpc_ble_drv_register - Register the ble endpoint driver. + * + * @return: 0 on success, otherwise a negative error code. + */ +int cpc_ble_drv_register(void) +{ + return cpc_driver_register(&ble_driver); +} + +/** + * cpc_ble_drv_unregister - Unregister the ble endpoint driver. + */ +void cpc_ble_drv_unregister(void) +{ + cpc_driver_unregister(&ble_driver); +} diff --git a/drivers/net/cpc/ble.h b/drivers/net/cpc/ble.h new file mode 100644 index 00000000000..ae1cac4e7e8 --- /dev/null +++ b/drivers/net/cpc/ble.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2025, Silicon Laboratories, Inc. + */ + +#ifndef __CPC_BLE_H +#define __CPC_BLE_H + +#define CPC_BLUETOOTH_ENDPOINT_NAME "silabs,cpc-ble" + +int cpc_ble_drv_register(void); +void cpc_ble_drv_unregister(void); + +#endif diff --git a/drivers/net/cpc/main.c b/drivers/net/cpc/main.c index b4e73145ac2..e5636207d5d 100644 --- a/drivers/net/cpc/main.c +++ b/drivers/net/cpc/main.c @@ -7,6 +7,7 @@ #include =20 #include "cpc.h" +#include "ble.h" #include "header.h" #include "spi.h" #include "system.h" @@ -125,13 +126,24 @@ static int __init cpc_init(void) =20 err =3D cpc_system_drv_register(); if (err) - bus_unregister(&cpc_bus); + goto unregister_bus; + + err =3D cpc_ble_drv_register(); + if (err) + goto unregister_system_driver; =20 err =3D cpc_spi_register_driver(); - if (err) { - cpc_system_drv_unregister(); - bus_unregister(&cpc_bus); - } + if (err) + goto unregister_ble_driver; + + return 0; + +unregister_ble_driver: + cpc_ble_drv_unregister(); +unregister_system_driver: + cpc_system_drv_unregister(); +unregister_bus: + bus_unregister(&cpc_bus); =20 return err; } @@ -140,6 +152,7 @@ module_init(cpc_init); static void __exit cpc_exit(void) { cpc_spi_unregister_driver(); + cpc_ble_drv_unregister(); cpc_system_drv_unregister(); bus_unregister(&cpc_bus); } --=20 2.49.0