From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.17]) (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 4E2923A48E8 for ; Wed, 3 Jun 2026 09:27:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.17 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780478849; cv=fail; b=bw98tfpXoc7T8QK1lZ/dlmxSYjpI+RGle8ZwEP07I7yoHwFwzkHV+aS5kIP/XUIRruDW8WBfllUgld6eh5qNszZTxZcUaCYDfXkbSCsX5GNhS4RPJ5MKt3qw3uFFJsO3L8fGTUCXAzvRwHQ8cpL3Ae8MvYPdgTr0LqckIycO9Xg= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780478849; c=relaxed/simple; bh=BFtVPkATYeWiXTHH2WOTVSf+kOdAnXnucpVBHxY4xAs=; h=Message-ID:Date:Subject:To:References:From:In-Reply-To: Content-Type:MIME-Version; b=XTayYzcb+zmwzZLZf/Y1Ko16PPD24Tl1z/jChyVbXP5FYZY9y7pVthOpcZAs5q1N3fX0yVs/lCad0uI4xvj1XnOJVYHHGaekxU8COkOIRGql+61qgBz2rp6PUba5Q/tpPBttW/Ow55iy6HuQ1Z5VVN25o+QMkGCBtlLoD0Cr6g0= 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=LdQV/0kg; arc=fail smtp.client-ip=192.198.163.17 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="LdQV/0kg" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1780478847; x=1812014847; h=message-id:date:subject:to:references:from:in-reply-to: content-transfer-encoding:mime-version; bh=BFtVPkATYeWiXTHH2WOTVSf+kOdAnXnucpVBHxY4xAs=; b=LdQV/0kgu3AXzbxbd1PY+9tf7g8lCWiIPNDDlfYzW1GJn7XgxL73yjsS Z7DnQeX+RmdA0EAB5g0/R9CQKpgJqaIOZijoZAjrSor1fhA0elAa4iqEu zoht3MzlbG+n3L+U+l8nmqKifupxvVzdidzzKNlk9IicUcwtXjNCWRptG XZugfWuo8VHHsAd+vR8N06dsVnXctOHk7cpeAE4TXAXznqtOjupyzv1PR NsCoyBBVUg9tgn/VmgVLh1nBg/FIVeNs4LW6IbkT50Rqag/I0+MCGwrJm /eUQivHAe1ByTYEG7jV6WGlxR2gZTXztdSxVWhdm/IaHKBDpTMTV/fUKF Q==; X-CSE-ConnectionGUID: ag9fszeyTcSHunkesBGTYA== X-CSE-MsgGUID: fRmRrWUwT4y3jszddmU4+w== X-IronPort-AV: E=McAfee;i="6800,10657,11805"; a="81138352" X-IronPort-AV: E=Sophos;i="6.24,184,1774335600"; d="scan'208";a="81138352" Received: from orviesa002.jf.intel.com ([10.64.159.142]) by fmvoesa111.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Jun 2026 02:27:26 -0700 X-CSE-ConnectionGUID: v5EB9Q9dQGyQpB7qrik2Dw== X-CSE-MsgGUID: KIbWHGhsQCG5xXWnzI8hqw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.24,184,1774335600"; d="scan'208";a="274418963" Received: from orsmsx903.amr.corp.intel.com ([10.22.229.25]) by orviesa002.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Jun 2026 02:27:27 -0700 Received: from ORSMSX901.amr.corp.intel.com (10.22.229.23) by ORSMSX903.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37; Wed, 3 Jun 2026 02:27:26 -0700 Received: from ORSEDG903.ED.cps.intel.com (10.7.248.13) by ORSMSX901.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37 via Frontend Transport; Wed, 3 Jun 2026 02:27:26 -0700 Received: from SN4PR2101CU001.outbound.protection.outlook.com (40.93.195.42) by edgegateway.intel.com (134.134.137.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37; Wed, 3 Jun 2026 02:27:25 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nKNN0q/EJuELfhk89TVrdX8WCYpG1vhamoyZvHVLtzQCY7cbi8JVZ3C6eSZcUK4dKt+VSvSXGvnbjvH31rif0Kwcf1ndQWYgvaoau3pjQ2bID3GvFmMB0ITc96DCkuJ6fbALYaHZZpLCw/g1SfNBivRwI0we3IgCGNTY95Fs4kbHyuDseFMQ16BcX72qDpHXv+1LWu3FHeCIeG34Ko1Ok34NKfu4vqXdZbhBxT2NWBEhNW6kzLmZdEymiFcZ0fwEpXocmjatYBxKK7BLIhfOnofNm/+SU6lGicyhY5zbxC+v6iRh3e3Tm5lyde3UHn3fWO36T/xfqb2k1hT+vlebPg== 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=r1zT59pLl0AgayOmA7cYwawBFG9z1sjQA/ah8OtijFo=; b=ekcXsbXwK81QljBRp7+ZevNkhXQayM3EG0QGmIwAa0lzxqyrDNwBshRMEIrGpWH9DsXkcQDCaI7SsLWf9lQI/nMFXbYpVXpsakpbkVjeXLyoLTtczxYtb9OO07vscPy64g4BnXJOcoV8YdVuWwrXsiyZfAZl+17z0H0YnrKWV/HaXTFhGmAysQUDrbpSL/X3ZgSFqMCuu/fXHeARK/xWJU1IbPIiP7kA8sEwBLI3Eb15rG9dOREPjrU87P0L9gmEED+70f58HOCy87fF8tyaRevzda2LsubNHyaPG+vwSkkN4gie4viOikIHb0giK+/wPbWp8gvIhphHdUNU1fbivQ== 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 BL4PR11MB8872.namprd11.prod.outlook.com (2603:10b6:208:5a8::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.92.7; Wed, 3 Jun 2026 09:27:19 +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.0071.015; Wed, 3 Jun 2026 09:27:18 +0000 Message-ID: <36c9b61d-3022-4edc-9217-55b5f3d5dc62@intel.com> Date: Wed, 3 Jun 2026 12:27:13 +0300 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] i3c: master: dw: Report CCC M0/M2 errors and retry on failure To: , Alexandre Belloni , Frank Li , "Adrian Ng Ho Yin" , Felix Gu , Wolfram Sang , Manikanta Guntupalli , Jorge Marques , Sakari Ailus , , References: <5cd9bc11797c7fec92d7ef2a16d4c78963754d06.1780470927.git.tze.yee.ng@altera.com> 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: <5cd9bc11797c7fec92d7ef2a16d4c78963754d06.1780470927.git.tze.yee.ng@altera.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-ClientProxiedBy: DU2PR04CA0161.eurprd04.prod.outlook.com (2603:10a6:10:2b0::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_|BL4PR11MB8872:EE_ X-MS-Office365-Filtering-Correlation-Id: 87e2de18-6587-458c-27c2-08dec1524eac 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|921020|11063799006|3023799007|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: Ol3xXmOj2hagm2iUGy8vmPcdrs03D0kn0O0pjyoCUzC8guSpWj0vvVGAi9RQMHHsLGewkNdpR2HuniAxXJQ1RN/8aJn+x3s+BEJsMHRsQPPgmva+Jfj8O+nEkYLf+PnGgngvDWhBUdNr1n6apnTbO1UzNya76mMbx/PRYjHqv0s5/1uu+Nko4XN76BoRZbqk10RjKMfnElhMQp0uE97WDp+yKnLB/n3/lo9C7KNdgWO3UR11xtYwVP26e5wQQWy1juzJ8S5dQTQW8fAKEQSPTvcpyIRwGSIoXwmOgszZMlzzkkVDvk6vEnf+OdRI0Hv37N05LkCkDzYEytTWId+ThpyNh395kS0fghXpO9CRB7vlQMd5oIHM1v4IAn0Mv/zdv073J5zSFAyfHNYU2rRZRpoNZEruKN0VIdAV/m+EP2TlGxHhaCWfA5C7iiZ6BPtGVxaol+cj//CaMpgyX8KbBks+5UN+aQPwPt2xUS7G/UvfG5bQ5O75VUJg9yKQg6RUIcbU5JuoMHl9NcVfl2+KnM3LBjsRmiwo44b81LuhIyni7Z9Q47kXvmb4O+YTMo1v1ZuI4FaJxb60XiK20LcQFAYCCDb3fVZkFKCcEwobjMou0sGfwDJ02Y9yErK8H3h3QH3CpR1cURc0QbVBpd68vRGpsqmQorG/ap/E8TLpYP5goyBVelkxlmzqSgDOlzrygkFopPVbJ435UP1/0n40RHP9RNpU/yBi1WC5pPmipfs= 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)(921020)(11063799006)(3023799007)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bEFDek82N1o4Q3lIeUhuRGxjekF4ODh5Yjc2ZE10Q25EdDcwVlhZVTFwSGtB?= =?utf-8?B?QVMzd1JESFJyLzBnUDR4TVArM1FROVkzbklnV2ZUSFRlS28xY3Nwa2t0OGJO?= =?utf-8?B?TWkzd3ZZL0JvTCtORXBvbXE4MnZ5cHNyWHNPYWwrQ2g2M3V6bSs0S01BTzd6?= =?utf-8?B?cEpWZnNMYWhiUlVrd2dFUWxDQVc1L2RTWTZSeCsxZk9TbjZRRGFYWE5kejRl?= =?utf-8?B?dFdMM3JieVV1MVRZMWU0NjlsbG1nL1A2SGpyeUlhSndyWHhCRTlsZ1FKQlU4?= =?utf-8?B?L3JBOEZHZmk5ZnJBcVhIY2piSFJPK0d1OHNQamxmUkZQYysyZDRvQkFKUEJH?= =?utf-8?B?YVl5VTU0eGNxdlhJdUFkZSt3MWE4T0J3SDZraVVHaVQyN2lacm52Wm1UZGpN?= =?utf-8?B?bnQ0TlBSSU10S1Jyd2VIdmE1UkZwU2c2anRiRmQ3REdYY1N6QUdSUExQVFZR?= =?utf-8?B?V05VazdLNThVSjZLVDBuaWhzelBwY2xabHBoSXVvR2tYZE5INDBlY2ZUQ3dU?= =?utf-8?B?aUd6czhaNUt1emxTY2hFdldwS0h2dldoL0VNam1ZYmhVRHFTMWFvM0VCczNM?= =?utf-8?B?MWNhT3Y5QlJtK0hhMjVzMU5DdnBVVkFoazFIUU1JRk1KaWMzbDUyOXhrOTc4?= =?utf-8?B?NW1wV1Y2UTgxSDVibFRzRG05Ymk4dW10NWd6dUZhVEJNS0VJd2JZYkJGbVR3?= =?utf-8?B?MThYUFNUYmk4UmpsUmJIQUNRcW9lTUI5bGk4RUhKSDl3VHRlMjA1MCtGdWlr?= =?utf-8?B?OTBBZFo5b244akhJbDFPQTNzeUwxMHVyeDBQelRVV1lPMzY5SG5QMkdnSzVH?= =?utf-8?B?cU5RWFp1YkNhM0FMTFU0b3I0RDZOTTFEcWhSWHkzbkZTUWQrRkwxbzBCYXRo?= =?utf-8?B?eHVuL09PdXRzVTEwZ0hUdEFmWjhTZmZtTG56WFIvWE5DSWtpK3YreU9PTzM4?= =?utf-8?B?MC8xMmFEV1RtZkg3VDNMYTN5ejE0aEhZQ2pkTFdCT2FLcE8xb281elRkVjU0?= =?utf-8?B?cGZLaitSclczdU85SVhGeE5mTG5aZ0I4RUlCaWZ3U3FvaGVhY01CcXlYcEs1?= =?utf-8?B?MjBvbTJmTm9TZUJvOExjS3ZISzVFNi92Sng1UTFsUG1XM0JqMDdHSW84dnRU?= =?utf-8?B?NXNjSEQvZmNlN0taamxmY0loYVk2dTdHcks2YWhqZmxYTHJ0YmREWFJ5T05x?= =?utf-8?B?blZ5YS9POUpMV0h6ZzBMYWVFNjhlbFdMN2h0a2hiVTFjZWFWbUkyVDBMRGlW?= =?utf-8?B?Z2hkYXZLYjRDOWFZVHFXcUR4SExaRWZGYzFMb3B1Q2lZRllZbWdkUjVCenJj?= =?utf-8?B?elhESDJvQitIcHRoSXMzc0tadTZLN0NCYWdlZ0ZqZXNnR2NqY0V3b2xmUHdC?= =?utf-8?B?N0pvK25RN3J6Nit3cE5mQUFIdjcrSHpyMkhqdnZpQis5ejhPRlBZVWZlUmpE?= =?utf-8?B?UHEvV01nazFCVy92OE9wZ2tYMjI3amNsWThaTW9aUVUzM1VkdENxQXMxUzNl?= =?utf-8?B?SVNLVm5JY0JjRUIwMjhTalJqZFZMZVN5cE1TeUR3WkNtRHI1V3MzeVZZaVJF?= =?utf-8?B?SGV1YTZRVVJNVXo4OVcwQStNZXhsUHhKZUFUdVFXMGlOT3JFOGJjdFF6aUN3?= =?utf-8?B?RS92MWxwVElWTm4wNER0b3ZNNGpmOGR0enI1VU8ySHB0Mk0za3Nyb0ZOaTNu?= =?utf-8?B?L0grVDl1SG9uNzdmeWdoQmRZTzZ5UjZrdHU1UENLREpyZTFqdmw3c013aVZu?= =?utf-8?B?Zk9YWTAxOUdHcHJHam9nVml4ZXVBYlBkUytlazVNQlp0N2t4cGc3UndWaE1a?= =?utf-8?B?Ui9Jc3lzMVNOMGVkODJPYXNrV1JxQStoclJ4cEZyc3IvSnhMUHlwR1IrY1c2?= =?utf-8?B?OXhKcEt4aDA4Q01WS083V3ZKeWIxMkNjdkVldFE4d0NDdFIyQ0phUGkrTEdm?= =?utf-8?B?RU9EdzVFdE05eGpERnFIQUlNeklNVGlZZkZOSFo4UmR2L0s2cjArN2N0TTBR?= =?utf-8?B?REZ0SmhOQjB3RzFuTldOajhjVGdCcFJRSzBjbjNpMmFpTzJBR3FWYm8xR21F?= =?utf-8?B?a3dKbUNxVENPSkVqQUFUQldDamMzUlhGc3VhK1NtUkdYZDNVbmpQYWtuNDlv?= =?utf-8?B?aEoxK01pU2VCMFhlTFVIZVBlY244N2V2RU5wWklzVkFrMHhBQ2QzUk82a3Vn?= =?utf-8?B?aHRsbWVHdk9RazJFcklrV0J4YTV1QWRFazYwRkVGREFpNG1qNDYvZ1FEcFdR?= =?utf-8?B?enptOU4wV2RQVmpxdUR2ZjQ1cmdqdXdacGNvN01TRkYxeUNmb2lORXRmeGY2?= =?utf-8?B?MWtLODZPdVRoVU1acHZsRCtuN2VCYkp0K29nSEFBOHphbzRHWHFxeVNGOG9X?= =?utf-8?Q?ubWOFFPvvfHydqf0=3D?= X-Exchange-RoutingPolicyChecked: SQwZZjrOVfD76kxQWoJMIOrR9qEmwZpxKX0mrVug1jJh66XnwoI/cxv2+Vpritgco0A60bXyx6bFOhLVUUJF6md9le/d/0OG2d9LuISsp2HshI6rQNUAjhZsJ4/6MTx6QhEDwQq97M63XZ3fPGl2E7p3AFnW4q/+ccVx02t1O1TpQHt2eAJ+x/JTpcjpqnbRXXgkhYpQ9p8xfGXZMIeB+JDvEf8ydIDzti3PXXf1elHWYylDET4WeoPrMIf+u8mjKJSJCCx55RG320T9l3O++9cdu05mHVSDAEiyEwCXgQslb+HfMb1rNo4xqze+n7zb2tU92kcpqPwYK04uqFM/RA== X-MS-Exchange-CrossTenant-Network-Message-Id: 87e2de18-6587-458c-27c2-08dec1524eac X-MS-Exchange-CrossTenant-AuthSource: IA1PR11MB7198.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Jun 2026 09:27:18.6747 (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: 4Vc2NouIzC+us7t0dM+CUNfW8NAJu/Vfwyake+L0FOlZPHNaC0z9qfmvSriuSNRlj+0HRC9KnlUbrZnHXi2B8A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL4PR11MB8872 X-OriginatorOrg: intel.com On 03/06/2026 10:25, tze.yee.ng@altera.com wrote: > From: Adrian Ng Ho Yin > > Improve CCC reliability on the DesignWare master by reporting > standard I3C error codes to the core and retrying the command once > when the failure looks transient. > > Map hardware status to ccc->err as follows: > - I3C_ERROR_M2: IBA NACK or address NACK That sounds like it duplicates dw_i3c_master_set_dev_nack_retry(). > - I3C_ERROR_M0: frame error, or an incomplete GET/SET payload when >   the controller reports a successful transfer (short read vs >   requested length; GETMRL uses GET_MRL_MIN_LEN if the buffer is >   larger than struct i3c_ccc_mrl) Need to consider what would be better handled by I3C core. Anything related to the protocol, that every controller driver needs, should be handled there. > > On a successful GET CCC, set dests[0].payload.len to the number of > bytes actually received. Is that a bug fix? Maybe it needs a separate patch? > > Reset ccc->err before each attempt. Retry the CCC get or set once > if the transfer fails with I3C_ERROR_M0 or I3C_ERROR_M2. Again, please consider what would be better handled in drivers/i3c/master.c > > Signed-off-by: Adrian Ng Ho Yin > Signed-off-by: Tze Yee Ng > --- > drivers/i3c/master/dw-i3c-master.c | 79 ++++++++++++++++++++++++++---- > 1 file changed, 69 insertions(+), 10 deletions(-) > > diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c > index 655693a2187e..85ea0af57717 100644 > --- a/drivers/i3c/master/dw-i3c-master.c > +++ b/drivers/i3c/master/dw-i3c-master.c > @@ -243,6 +243,12 @@ > #define AMD_I3C_OD_PP_TIMING BIT(1) > #define DW_I3C_DISABLE_RUNTIME_PM_QUIRK BIT(2) > > +/* Minimum GETMRL payload (read_len only; no IBI byte). */ > +#define GET_MRL_MIN_LEN 2 > + > +/* Maximum number of retries for CCC commands */ > +#define DW_I3C_CCC_MAX_RETRIES 2 > + > struct dw_i3c_cmd { > u32 cmd_lo; > u32 cmd_hi; > @@ -708,12 +714,47 @@ static void dw_i3c_master_bus_cleanup(struct i3c_master_controller *m) > dw_i3c_master_disable(master); > } > > +static bool dw_i3c_ccc_get_len_mismatch(u8 ccc_id, u16 req_len, u16 rx_len) > +{ > + if (ccc_id != I3C_CCC_GETMRL) > + return rx_len < req_len; > + > + /* > + * GETMRL returns 2 or 3 bytes; core sets req_len accordingly. > + * If the buffer is larger, only enforce the minimum valid size. > + */ > + if (req_len <= sizeof(struct i3c_ccc_mrl)) > + return rx_len < req_len; > + > + return rx_len < GET_MRL_MIN_LEN; > +} > + > +static void dw_i3c_ccc_map_err(struct i3c_ccc_cmd *ccc, > + struct dw_i3c_cmd *cmd, > + bool data_len_mismatch, int *ret) > +{ > + u8 err = cmd->error; > + > + if (err == RESPONSE_ERROR_IBA_NACK || > + err == RESPONSE_ERROR_ADDRESS_NACK) { > + ccc->err = I3C_ERROR_M2; > + } else if (err == RESPONSE_ERROR_FRAME) { > + ccc->err = I3C_ERROR_M0; > + } else if (data_len_mismatch && err == RESPONSE_NO_ERROR && !*ret) { > + ccc->err = I3C_ERROR_M0; > + *ret = -EIO; > + } > +} > + > static int dw_i3c_ccc_set(struct dw_i3c_master *master, > struct i3c_ccc_cmd *ccc) > { > struct dw_i3c_cmd *cmd; > + bool data_len_mismatch; > int ret, pos = 0; > > + ccc->err = I3C_ERROR_UNKNOWN; > + > if (ccc->id & I3C_CCC_DIRECT) { > pos = dw_i3c_master_get_addr_pos(master, ccc->dests[0].addr); > if (pos < 0) > @@ -742,8 +783,14 @@ static int dw_i3c_ccc_set(struct dw_i3c_master *master, > dw_i3c_master_dequeue_xfer(master, xfer); > > ret = xfer->ret; > - if (xfer->cmds[0].error == RESPONSE_ERROR_IBA_NACK) > - ccc->err = I3C_ERROR_M2; > + cmd = &xfer->cmds[0]; > + /* > + * RESPONSE_PORT_DATA_LEN reports bytes transferred; on SET CCCs > + * this reflects the write count (stored in cmd->rx_len). > + */ > + data_len_mismatch = ccc->dests[0].payload.len && > + cmd->rx_len < ccc->dests[0].payload.len; > + dw_i3c_ccc_map_err(ccc, cmd, data_len_mismatch, &ret); > > return ret; > } > @@ -751,21 +798,27 @@ static int dw_i3c_ccc_set(struct dw_i3c_master *master, > static int dw_i3c_ccc_get(struct dw_i3c_master *master, struct i3c_ccc_cmd *ccc) > { > struct dw_i3c_cmd *cmd; > + u16 req_len; > + bool rx_len_mismatch; > int ret, pos; > > + ccc->err = I3C_ERROR_UNKNOWN; > + > pos = dw_i3c_master_get_addr_pos(master, ccc->dests[0].addr); > if (pos < 0) > return pos; > > + req_len = ccc->dests[0].payload.len; > + > struct dw_i3c_xfer *xfer __free(kfree) = dw_i3c_master_alloc_xfer(master, 1); > if (!xfer) > return -ENOMEM; > > cmd = xfer->cmds; > cmd->rx_buf = ccc->dests[0].payload.data; > - cmd->rx_len = ccc->dests[0].payload.len; > + cmd->rx_len = req_len; > > - cmd->cmd_hi = COMMAND_PORT_ARG_DATA_LEN(ccc->dests[0].payload.len) | > + cmd->cmd_hi = COMMAND_PORT_ARG_DATA_LEN(req_len) | > COMMAND_PORT_TRANSFER_ARG; > > cmd->cmd_lo = COMMAND_PORT_READ_TRANSFER | > @@ -780,8 +833,12 @@ static int dw_i3c_ccc_get(struct dw_i3c_master *master, struct i3c_ccc_cmd *ccc) > dw_i3c_master_dequeue_xfer(master, xfer); > > ret = xfer->ret; > - if (xfer->cmds[0].error == RESPONSE_ERROR_IBA_NACK) > - ccc->err = I3C_ERROR_M2; > + cmd = &xfer->cmds[0]; > + rx_len_mismatch = dw_i3c_ccc_get_len_mismatch(ccc->id, req_len, > + cmd->rx_len); > + dw_i3c_ccc_map_err(ccc, cmd, rx_len_mismatch, &ret); > + if (!ret) > + ccc->dests[0].payload.len = cmd->rx_len; > > return ret; > } > @@ -796,6 +853,7 @@ static int dw_i3c_master_send_ccc_cmd(struct i3c_master_controller *m, > struct i3c_ccc_cmd *ccc) > { > struct dw_i3c_master *master = to_dw_i3c_master(m); > + int retries = DW_I3C_CCC_MAX_RETRIES; > int ret = 0; > > if (ccc->id == I3C_CCC_ENTDAA) > @@ -816,10 +874,11 @@ static int dw_i3c_master_send_ccc_cmd(struct i3c_master_controller *m, > return ret; > } > > - if (ccc->rnw) > - ret = dw_i3c_ccc_get(master, ccc); > - else > - ret = dw_i3c_ccc_set(master, ccc); > + do { > + ret = ccc->rnw ? dw_i3c_ccc_get(master, ccc) > + : dw_i3c_ccc_set(master, ccc); > + } while (--retries && > + ret && (ccc->err == I3C_ERROR_M0 || ccc->err == I3C_ERROR_M2)); > > pm_runtime_put_autosuspend(master->dev); > return ret;