From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.13]) (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 8650D3DC4A0 for ; Tue, 16 Jun 2026 07:42:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.13 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781595723; cv=fail; b=jHAa5CtZSEZDjVp92akH2a9cCI7NUDLE/8sYUTTVVC/hJVd+n72KlydmMCWuIZege60mw7amWhUWQ/np9bUfeda0QVhOsrGXiCJI0NUPpgT+XTpV9oR0XAFv5y47/hNvJOtF1hL3NyQG2bmsdaOT4lyG1oHoMGeWX7g1VRCBIb0= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781595723; c=relaxed/simple; bh=1PT+wpB5I0pWlb/iemqsx7Knm9skMgbJFJ/rn8pqvQc=; h=Message-ID:Date:Subject:To:References:From:In-Reply-To: Content-Type:MIME-Version; b=evxfx4gZXBFgO6OagCZc6bMpDrNgHGEshIyWq127mHatnGNgYEXh7zCmlPBsrmT6sugJuEZnjgExo4FH91lAA1o2UOrYP82enbQrr/hSgoS3whYsCXPnH2eIG1dcUC1XG3nL41zpwrcSKmy1YCrQt99f4UCaY6Ba78njvcNOuU4= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=eGqDhs7t; arc=fail smtp.client-ip=192.198.163.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="eGqDhs7t" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1781595723; x=1813131723; h=message-id:date:subject:to:references:from:in-reply-to: content-transfer-encoding:mime-version; bh=1PT+wpB5I0pWlb/iemqsx7Knm9skMgbJFJ/rn8pqvQc=; b=eGqDhs7t+0qb7ra6OVfKkJHTzGGOdutb4jrlRkhMlLEs52Q7wtfWXmd0 wI2BKINl246s+z9UteBe1OeX1lvJd2eIypTAErxiLfcXfGW1nHUnW+0Xb UVohClZ+5o1QHGnU+v2JuR2hghONVMbaDNbqA/VvLvAF5VTfn5GV30xyc zrI7p8cPgN51UTgSGKMf2Sq5FnSbcLbQQsZgPCyrnc85rXN+Nwu455fjG IOHzn+vKIzzZTuigHXZMdI8kc7jypit5sHUpD6NlEGHa0A+CGFsmX4ElE hl9USG8K6uYfeX4KPSVqhlZG9zSD2TU9E0e0H3wpA77Zt59/31lxZq8J1 w==; X-CSE-ConnectionGUID: w5QxqZEnT7O5XIX0FBAGnA== X-CSE-MsgGUID: FcgpzwF3QVqWje3H5lulAA== X-IronPort-AV: E=McAfee;i="6800,10657,11818"; a="84916273" X-IronPort-AV: E=Sophos;i="6.24,207,1774335600"; d="scan'208";a="84916273" Received: from orviesa001.jf.intel.com ([10.64.159.141]) by fmvoesa107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jun 2026 00:41:44 -0700 X-CSE-ConnectionGUID: 8q7YuwFoS6Sd8YdH7o6lrA== X-CSE-MsgGUID: Gwthanr1Q4ab6nxzMv7UOg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.24,207,1774335600"; d="scan'208";a="285809877" Received: from fmsmsx901.amr.corp.intel.com ([10.18.126.90]) by orviesa001.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jun 2026 00:41:42 -0700 Received: from FMSMSX902.amr.corp.intel.com (10.18.126.91) by fmsmsx901.amr.corp.intel.com (10.18.126.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37; Tue, 16 Jun 2026 00:41:41 -0700 Received: from fmsedg902.ED.cps.intel.com (10.1.192.144) by FMSMSX902.amr.corp.intel.com (10.18.126.91) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37 via Frontend Transport; Tue, 16 Jun 2026 00:41:41 -0700 Received: from PH7PR06CU001.outbound.protection.outlook.com (52.101.201.70) by edgegateway.intel.com (192.55.55.82) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37; Tue, 16 Jun 2026 00:41:41 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NLe/3jcf5gkHaiZrV7sME3siy8aI4RPAwu4yVpAuAwYLro7C9iZTSiljRPW0gI3Kgwm3nwm4ju8ULLp78Dewj4yPWpTk7Di3ivvkj78imfPiF2qExGQO555n5tpVmQGsGpAuEWZ7EGLr7Dh78zddb8PQyS2w/qjn8pUl6gpFXlUHwu+rMBKECwmbeMMWrGT2SSkUXPsjVQNo2nDBbe+Vspp7zpJ17kSOIbcRSHv+hcuDrQOdkr19xhg5f8ZIY9ZoF+niTUxXCB/edyndNCE1VM2K1oBZbNFGVn9aFo4vdBWiogPVNgnQRyaIhTow0fmMALkjS3RESXbjuDYzAPqLuw== 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=/st1ozt75CsT1/zZjDXDKRhlafiYAEyCtFXPvNyoIKY=; b=DmFlI4TWRBY8EiFKC0ix0T8L6wA4j25Rrs+eyOc7J3YjDWnd6VM6n8RzerxwNL+039FO/3Efy5sfEX+DfGED+9Fo9hm4iYxlDUvAa6OHPh7j8zPtpdOekw+lmDz00DnA4Rswd7mxmOvbnQXskpdWNWFHy7bDHMkHla8yBZnLi/0Ce8vcXYLneE7Jh1/cHzRBofcKAB7SLFzlKii7OHmrtTT6pSPcjPSaWwgn7vRqWpOpKDH/ZfaSzDGqcgnEAdL4ZbjUS24S5hPce6xNbj9M6I0onN0bRB5+Ejs94XizzKeONU/y9xElUOSuGL4RmM6KYmwExLwvnuDioEpVbADJRQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from IA1PR11MB7198.namprd11.prod.outlook.com (2603:10b6:208:419::15) by IA3PR11MB9207.namprd11.prod.outlook.com (2603:10b6:208:578::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.113.18; Tue, 16 Jun 2026 07:41:34 +0000 Received: from IA1PR11MB7198.namprd11.prod.outlook.com ([fe80::2c4e:e92a:4fa:a456]) by IA1PR11MB7198.namprd11.prod.outlook.com ([fe80::2c4e:e92a:4fa:a456%3]) with mapi id 15.21.0113.015; Tue, 16 Jun 2026 07:41:34 +0000 Message-ID: <29a3da29-d67c-4596-9a50-e42355726368@intel.com> Date: Tue, 16 Jun 2026 10:41:28 +0300 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3 3/3] i3c: master: Validate GET CCC payload length and retry M0/M2 once To: , Alexandre Belloni , Frank Li , "Adrian Ng Ho Yin" , Felix Gu , Wolfram Sang , Manikanta Guntupalli , Jorge Marques , Sakari Ailus , , References: Content-Language: en-US From: Adrian Hunter Organization: Intel Finland Oy, Registered Address: c/o Alberga Business Park, 6 krs, Bertel Jungin Aukio 5, 02600 Espoo, Business Identity Code: 0357606 - 4, Domiciled in Helsinki In-Reply-To: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-ClientProxiedBy: DUZPR01CA0031.eurprd01.prod.exchangelabs.com (2603:10a6:10:468::16) To IA1PR11MB7198.namprd11.prod.outlook.com (2603:10b6:208:419::15) 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: IA1PR11MB7198:EE_|IA3PR11MB9207:EE_ X-MS-Office365-Filtering-Correlation-Id: e92c52a3-d652-4add-fbb4-08decb7ab069 X-LD-Processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|366016|376014|23010399003|18002099003|22082099003|921020|11063799006|3023799007|4143699003|56012099006; X-Microsoft-Antispam-Message-Info: H1IZT2M7MIj8QsEmP14DDFw7/SY/NxigP+JwGafAQqexwad2WNrUxoMnt+CFL4H7UJOCQB3UQTc5yhiMS+rOTU0btCUJdNU7RYI2k5JFxfWoVqEP+efOPpJIMBdTeWFon6/jqlXJSlw6LunfmS9mJ0hfE83sfgfBjX1kjm4NakG0yKx2OAinK7WHKPvBdHC3QEBYINfK2rmf4wwksv2Ac3j14BVtdZNU8dIiOxSiIExfPJcIip/AZE7RzvCnTdGt1csOZbuEavZVKtZJsF/od/m+4mBiWO3sCF1cP6kiUquc/JUwWYWt2n5qaoNJEyMA9ekBTBG4ZR9Et994ILOxZmgQJGbn2OYo8HLxblLsw2CMM6PNHPFitBO+QzH/ZaBSCyRaR2oM9KoeRxMaeEMc+DoNdKKOZEj+yxRqSjj058jHGtrJ1DEhDiKqYpJTrMnzP/8pQNl+W2qnHrl9R8XwGReIDR3IB/sIQrMif+kLWKT3xwieBO3RThaxniT2cIrMSjPT7QbVA8jWAiFzuv9cQHnYIiRYcvMeYO/ShvUutUlws/UTvUPBJbBk6igkoutEFk7kMc6ctQKBWEpcjm8JwbEWC6l8mRtveO9ikGrx2PLHDqyXGzn9oLQsZO3r0tM+orMa0DgTzgjVulyY3GfScmWaFOd9udETog4N1cbbsN9kMjfHSdYsxbzk9kQv+/ZOgYgrodsOarCVSiZcYJCWJ0D8tkBbwZ/Oj2ByiCgCKks= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:IA1PR11MB7198.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(366016)(376014)(23010399003)(18002099003)(22082099003)(921020)(11063799006)(3023799007)(4143699003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?c3pJMlpaa0tCazd4c0FHdmFUcEdHejdIN053alUvZXJKQUFXL0RldUN6Tnlq?= =?utf-8?B?UTlEanMvbGpLTUdYVWJuNExWSmluL0RGdEFUZFQwTkVMNkZ2ampYaHp2N2ZP?= =?utf-8?B?bXRXUmlxQ3JRdm5ob0F4WXp1Mm00OXdKaU41cDlkSmx1M0pmeXNZUTZiQVMz?= =?utf-8?B?bDZFUTBMN0FGYmh6MEl1bFJhb2FDemNJNXNIcFNVMHJIOUthMS9OZjRWa2Z6?= =?utf-8?B?YjI0SWxaUVVjaXFVM0tDSzZUa0tDM09iZWpXb09aQnhmQ2t5a2Z1cW95WG16?= =?utf-8?B?eVVVTmR6Yll4M0JmSHAxNy91NVo4Skx4UGV0UTJKVjU3bmhRTlN5c2loY3Bw?= =?utf-8?B?NEhvTGg0a08zdWltUVNaMlpwZ3VDZ0wyM2JoZmdWVzUyaE5RaEVrOG5Od2ho?= =?utf-8?B?MnhCLzdyaW84L1dUM05GSGZnck5xczliUGlZQWVvdkUramZoVFh0RXJjdGpY?= =?utf-8?B?VkNuNnRSZGRGcTFFUVZBVDRXV3FSWVBxSTVCUWEvTWJPTit5U3k4YjJGVDhY?= =?utf-8?B?azRuaTA5ek0vR3Z5SG0zTXptT0dTdGpFcGFFb3dvUTAxTFZ3bnNDMXVIZmQ0?= =?utf-8?B?ZHVGZHRCNS9Ob09BTmJEeTVTUkYra2trb3M0cDlmTUZQVkdkMklDdUc2bVhR?= =?utf-8?B?Y3VlQkV6MjVYMmJ0ZTFXSEw1Y1ZwWWQrclIzdCt3ZGFha3ZSSmdsWjFNZld5?= =?utf-8?B?TDhCdHhhbHJTRFJZbFVXODM3V1B1ZlhhY1NhWUNySHoyaHE1SURBOFVCVXRK?= =?utf-8?B?YmlHNlhPUUdyd3cwSFh1QXpjcGt3STVFVzI4SnVvbFZHTFAyTTQ5TDhlYzdJ?= =?utf-8?B?SDIxTGd6dm5LVjM2b2lmc21BQ3QyclhaQnRsRm9taStQUjdoNHdaTmlEZmlh?= =?utf-8?B?WUNEMkxhSDhyeTYyZ1pWTTVzRVMzTnpoZ25LMnBLSEVaOEdwcTFrRjZIYlls?= =?utf-8?B?RURDUFE4T0tpTlQ2a1c4czM3SmFBS2NpNjRQaUZHV2NaUDROTXE0amliNzRa?= =?utf-8?B?cTBjbnM1Y1FmRmR1dUhaMEgxMHhnRGxZWTJmLzJRaS9QaHBDT1V0czZwbUNy?= =?utf-8?B?NFJtMFNsZXlxU1Q4VVdWQVI3MEgrWDVYYjF3TzBoQWlSUW00aE5kejRyWXRm?= =?utf-8?B?UlVIR3lLV1pGbTJZcnFCRmpwV0JGRDZvWkdIWU5sTW0yOXA2OEZIMHpvY0Z2?= =?utf-8?B?N0JNamhRbFJFOGZJSDZ0UXByWkt2UVZPekFuaFErNzdySFNTS2xrWTlPNlpE?= =?utf-8?B?TFlZVkZOTkFLekNMd3BZMG9RQzNsQ1BSQlJacGxqbUoyaUV5eUxxcnoxZFR6?= =?utf-8?B?TU02ZUhZWlkvbjVPRUxHQlBVUnFISmxnT2xJSldBUnZoSE01bWtPbDNoUzE3?= =?utf-8?B?Ulo4UDEzYmJLam9TSmRRanJ2a1kzRUw5YmUyWFBCc1RCb1NLMmtSd1hscTlS?= =?utf-8?B?aUg2NlE2SUpHbmZuVERsU3BaK3dVd2t0c2d3LzgrbXJrazNHTzJrNFV1UzAy?= =?utf-8?B?UVNNWS9SOUFwNXBHOUVPWXk4TUZKMVlTdWhremJPM2V0dFZRVVdLekhoNC9n?= =?utf-8?B?dTEyNndhSXVRdVlMbm40M08yc09lTnVIak10VlBvbW11WGp2dXVHeTlpSzJ5?= =?utf-8?B?bXVlTWdyaXVqWkdQbC9GekVEVGMvOXJRV2pWZlh1S3lVcXNzUWprTmdkU0tT?= =?utf-8?B?VFRvNkFjbEhiQnYrcFFGOGYzRmxRb21reTNCVk82RmFBSlRJdysraVBLeE15?= =?utf-8?B?eWNGY3RhWmgxZnFOeXQwV3lwQjdxbURXMFFneWlWckJCSVZqWjAyS0I3WVJC?= =?utf-8?B?OGgyaEh0MmVqZnBFRkpnblhxbGNkR05sZHZ5enErOFF1bloybGZ1a0tDOWlV?= =?utf-8?B?V3MyMFRWV0paZjV6TElzSTVoN1oxWE9xdy9ROVF3RFQ1YlM4NjBJWjZidXBS?= =?utf-8?B?VnkrTkdKbEFERFBQeGE4TW5RKy8yenozb3Q1U1F2aUxkNGUvMmxWVkpnR3A5?= =?utf-8?B?bmNLVUtuZ2xMbjVGSmhYM0twbUYxNUhmUFUvV2FzNk9ZelBrY3E4QmJIaUZs?= =?utf-8?B?U2JjeC9tQzVTTjNoZjN6RmhIUWJWbTJURkJZZVhYWFFHRlVRWkRxVkF4bktV?= =?utf-8?B?UTRFTUZqZDJmd1dSd1Axd3lzc1BkSXdiYU8wK25PUUwvbkpROC9CYXBGZVhC?= =?utf-8?B?L1JNa3MzSW1hRHptUkYzMi9FNnNEY3M1c2p0QmFWTXc0a3REOU9zWStNNXZZ?= =?utf-8?B?cXBRYnhRbUJHbHJZRU5GMWUrcjdrTTk4WjE2WW5XeCtHVmZPNVQwVG5ycjVV?= =?utf-8?B?Skt4VDlBcjZYSHpVb3d5dmprUDJsOUt1N3hkL0VUNHJsKzYrYzIzZ1NPRTh6?= =?utf-8?Q?WH3jhQKtttNPjkZU=3D?= X-Exchange-RoutingPolicyChecked: nKKmU4wMbCoK6e+RQhPMMrbOe5DzDgfeYdW3HC1ebdWvmq0OUlFYLPZ/6w5MmsG+5BMmrK6gVIwg7zopjDuHi1jy3BxnBGkePi9o3PXcIbFl8j4MQvYD4RAnTtzNL+YRa87lF5YZ++9Z3W0J0GlQa9tloPpO4li+eFrH6cli9qsbV/wU2F1v8B5T2A1/RCGzeBW7ogjeJ8rJhbm8EYZ9SKtTs6BIn8Jer+qgUVFgaPN46MbuJEs5b8bpgQpeQ9FvHvyYLrOtdGSwATQpdRbTcTYH3gIfu66+RPV2bBivuatzmFEXplXS7C4ijyu3IkET2M79hpzEUdgaHJGgLc45OQ== X-MS-Exchange-CrossTenant-Network-Message-Id: e92c52a3-d652-4add-fbb4-08decb7ab069 X-MS-Exchange-CrossTenant-AuthSource: IA1PR11MB7198.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jun 2026 07:41:34.1652 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 5LUdkiDmj7Ic3fKdeXXJFABd2LiDx5Kbu7C8yIJO3WjxwaJGC8FbfnNW0P2Tnhdf6P1XxmvXI7V66yl2KpY4nw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA3PR11MB9207 X-OriginatorOrg: intel.com On 11/06/2026 04:54, tze.yee.ng@altera.com wrote: > From: Adrian Ng Ho Yin > > Validate GET CCC payload length after a successful transfer. Treat a > short read as I3C_ERROR_M0 and return -EIO. GETMRL accepts exactly 2 or > 3 bytes per the I3C spec defined formats. GETMXDS may return 2 bytes > (format 1) or 5 bytes (format 2) per I3C spec. > > Retry GET CCCs once on retriable errors: I3C_ERROR_M0 (frame error) and > I3C_ERROR_M2 (address-header NACK, e.g. IBI or Controller Role Request Some controller drivers do not set I3C_ERROR_M2 correctly: svc-i3c-master seems to set I3C_ERROR_M2 on all errors mipi-i3c-hci sets it also on error status 0x5: NACK: Address was NACK’ed Others need to be checked > arbitration per I3C spec section 5.1.2.2.3). SET CCCs are not retried What has section 5.1.2.2.3 got to do with I3C_ERROR_M2? > to avoid repeating side-effecting commands. Restore dests[].payload.len > to the originally requested length before each attempt and again before > returning an error, so callers that adjust the length on failure (e.g. > i3c_master_getmxds_locked()) do not underflow a shortened value. > > Use a stack buffer for the common single-destination GET case and only > kmalloc when ndests > 1. > > Signed-off-by: Adrian Ng Ho Yin > Signed-off-by: Tze Yee Ng > --- > Changes in v3: > - Drop the change that moves RESPONSE_ERROR_ADDRESS_NACK to default case > in dw_i3c_master_end_xfer_locked(). Now dw_i3c_master_end_xfer_locked() > returns -EIO for RESPONSE_ERROR_ADDRESS_NACK. > --- > drivers/i3c/master.c | 111 ++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 110 insertions(+), 1 deletion(-) > > diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c > index 5cd4e5da2233..c94d37cd8b3f 100644 > --- a/drivers/i3c/master.c > +++ b/drivers/i3c/master.c > @@ -26,6 +26,12 @@ static DEFINE_MUTEX(i3c_core_lock); > static int __i3c_first_dynamic_bus_num; > static BLOCKING_NOTIFIER_HEAD(i3c_bus_notifier); > > +#define I3C_CCC_GETMRL_LEN_SHORT 2 > +#define I3C_CCC_GETMRL_LEN_FULL 3 > +#define I3C_CCC_GETMXDS_LEN_SHORT 2 > +#define I3C_CCC_GETMXDS_LEN_FULL 5 > +#define I3C_CCC_MAX_RETRIES 2 > + > /** > * i3c_bus_maintenance_lock - Lock the bus for a maintenance operation > * @bus: I3C bus to take the lock on > @@ -925,6 +931,61 @@ static void i3c_ccc_cmd_init(struct i3c_ccc_cmd *cmd, bool rnw, u8 id, > cmd->err = I3C_ERROR_UNKNOWN; > } > > +static bool i3c_ccc_get_payload_ok(u8 id, u16 req_len, u16 actual_len) > +{ > + if (actual_len > req_len) > + return false; > + > + if (!req_len) > + return actual_len == 0; > + > + if (id == I3C_CCC_GETMRL) > + return actual_len == I3C_CCC_GETMRL_LEN_SHORT || > + actual_len == I3C_CCC_GETMRL_LEN_FULL; > + > + if (id == I3C_CCC_GETMXDS) > + return actual_len == I3C_CCC_GETMXDS_LEN_SHORT || > + actual_len == I3C_CCC_GETMXDS_LEN_FULL; It would be better to contain individual CCC information in the caller of i3c_master_send_ccc_cmd_locked(). Perhaps add optional_bytes to struct i3c_ccc_cmd_payload: For I3C_CCC_GETMRL, optional_bytes = 1 For I3C_CCC_GETMXDS, optional_bytes = 3 > + > + return actual_len == req_len; > +} > + > +static int i3c_ccc_validate_payload_len(struct i3c_ccc_cmd *cmd, > + const u16 *req_lens) > +{ > + unsigned int i; > + > + if (!cmd->rnw) > + return 0; > + > + for (i = 0; i < cmd->ndests; i++) { > + u16 actual = cmd->dests[i].payload.len; > + u16 req = req_lens[i]; > + > + if (!i3c_ccc_get_payload_ok(cmd->id, req, actual)) { > + cmd->err = I3C_ERROR_M0; > + return -EIO; > + } > + } > + > + return 0; > +} > + > +/* > + * M0: transient frame errors. > + * M2: address-header NACK (I3C spec section 5.1.2.2.3), e.g. when a target > + * simultaneously asserts an IBI or Controller Role Request and neither > + * side ACKs. Software should re-issue the transfer; the controller wins > + * arbitration after Repeated START. > + * > + * Retries apply to GET CCCs only; SET CCCs are not retried to avoid > + * repeating side-effecting commands. > + */ > +static bool i3c_ccc_err_retriable(enum i3c_error_code err) > +{ > + return err == I3C_ERROR_M0 || err == I3C_ERROR_M2; > +} > + > /** > * i3c_master_send_ccc_cmd_locked() - send a CCC (Common Command Codes) > * @master: master used to send frames on the bus > @@ -936,9 +997,17 @@ static void i3c_ccc_cmd_init(struct i3c_ccc_cmd *cmd, bool rnw, u8 id, > static int i3c_master_send_ccc_cmd_locked(struct i3c_master_controller *master, > struct i3c_ccc_cmd *cmd) > { > + u16 req_len; > + u16 *req_lens = NULL; > + u16 *req_lens_alloc = NULL; > + unsigned int i; > + int ret, retries; > + > if (!cmd || !master) > return -EINVAL; > > + retries = cmd->rnw ? I3C_CCC_MAX_RETRIES : 1; > + > if (WARN_ON(master->init_done && > !rwsem_is_locked(&master->bus.lock))) > return -EINVAL; > @@ -953,7 +1022,47 @@ static int i3c_master_send_ccc_cmd_locked(struct i3c_master_controller *master, > !master->ops->supports_ccc_cmd(master, cmd)) > return -EOPNOTSUPP; > > - return master->ops->send_ccc_cmd(master, cmd); > + if (cmd->rnw && cmd->dests && cmd->ndests) { > + if (cmd->ndests == 1) { > + req_len = cmd->dests[0].payload.len; > + req_lens = &req_len; > + } else { > + req_lens_alloc = kmalloc_array(cmd->ndests, > + sizeof(*req_lens_alloc), > + GFP_KERNEL); Simpler to add actual_len to struct i3c_ccc_cmd_payload and amend controller drivers to use that. > + if (!req_lens_alloc) > + return -ENOMEM; > + > + req_lens = req_lens_alloc; > + for (i = 0; i < cmd->ndests; i++) > + req_lens[i] = cmd->dests[i].payload.len; > + } > + } > + > + do { > + cmd->err = I3C_ERROR_UNKNOWN; > + if (req_lens) { > + for (i = 0; i < cmd->ndests; i++) > + cmd->dests[i].payload.len = req_lens[i]; > + } > + ret = master->ops->send_ccc_cmd(master, cmd); > + if (!ret && req_lens) > + ret = i3c_ccc_validate_payload_len(cmd, req_lens); > + } while (--retries && ret && i3c_ccc_err_retriable(cmd->err)); > + > + if (ret && req_lens) { > + /* > + * Drivers may update payload.len to the actual RX count; > + * restore the requested length so callers can safely adjust > + * it on error (e.g. i3c_master_getmxds_locked()). > + */ > + for (i = 0; i < cmd->ndests; i++) > + cmd->dests[i].payload.len = req_lens[i]; > + } > + > + kfree(req_lens_alloc); > + > + return ret; > } > > static struct i2c_dev_desc *