From nobody Mon Jun 8 07:26:01 2026 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012031.outbound.protection.outlook.com [52.101.53.31]) (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 C7BAC3FC5B0 for ; Wed, 3 Jun 2026 07:25:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.31 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780471536; cv=fail; b=acCmpUgLLoHgqwtlHGAxOmIGa4W4O5/atNgwXQ5h4w5n9Z8P5fyGTSs/9TGa6JENrkvkdVx8crBMRhplgAz9cB/L0TYwL7tarTHJIZjyF+uqd3NhKPdinMeUZh68YRohl0FNlolppoC6dHpMEtaJbXTtdg2Nl7PPwlqkVeWSdeA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780471536; c=relaxed/simple; bh=l5V+d+C8JS5kphVeRNuUg7q/Cvinfga+85DSzaBJg5M=; h=From:To:Cc:Subject:Date:Message-ID:Content-Type:MIME-Version; b=rpzvsrH3MGhhkYCOE708JP5I3qWzFyjrqPOGkq9mKj30LjP5nuicKogqnbqAvbvHI+D8gl2EwDtqtiqYNA9aaUyPCk4vv2OzknTYf6tArVQPQ5Hwyaqw/sTAymKQOqDatEH74M1dby+13v/xSiZMk7qEmKUOyFRM0Esa3ELuhQg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=altera.com; spf=pass smtp.mailfrom=altera.com; dkim=pass (2048-bit key) header.d=altera.com header.i=@altera.com header.b=XLSGvDx9; arc=fail smtp.client-ip=52.101.53.31 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=altera.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=altera.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=altera.com header.i=@altera.com header.b="XLSGvDx9" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=eDWcEVzFtdLAOyje3121+ZYi1rxBguuM0i6aCUZyIhqaOYm2ScQK318oNYVf8D3OgpC93zP5sXMQQOp+IGporqmBcF5kVJcl162pR1WEqR8kwfcajLid0H4JhkDvhhQ24k67EEg70jnrgsE5UfmqFUfIKMkfeOLGCElU7x5OOoeD6WSUWSj2QF7hRFe7fTjyv846klVpSZiAAdNAd0u5eBc8Xrep1yIKTqa0ek6PiJL0rzODbJcm72uLjsGKJJ5SZdVne+Le+urVRgZ5zSt5Eh63OOAoDhWgZ67uaUDXf16V4sgSIWC1rox2uMAktu6xnFNw3PxD/aNmT1/atQRFZg== 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=Pyn4TEasBxmCsj3hcKPw/KRgK/LKQ2C/+5FeyYUd4gg=; b=VqudxWr4CNxdnbBhvZoRjBoy6YlRMtrPvYpYCJlQalBKIZ7V/zGV4XPfaXkM/NLj2pgNXIMKA6LuJfLUhpEPAOlyqRiTeytIwOaU4QkgNYKvXAGURU5khW19qBPsYG0ifNkZKHCWR2Dpswu+1NhSTgn52icPMGxo1UxmFlmyQNZ/67RYhUxmTVjKTxOo1k8QuQ/Vyp5p3132y6NYrzQnKgpbWXNusyCAEl4u4mw4SnfwqH3wPtGesoHDKInNe9xmOukUX8LCqCsrq/s6Y3qkCqElkyQaJDFKs6dU9Aiidef5eqBTJ378sMyCsL7Sqhfog2g+4LnapM9Hyd2PUDSLFA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=altera.com; dmarc=pass action=none header.from=altera.com; dkim=pass header.d=altera.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=altera.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Pyn4TEasBxmCsj3hcKPw/KRgK/LKQ2C/+5FeyYUd4gg=; b=XLSGvDx9jjrxpYLkyJHCtkVCF0YinjFGIOPCzymFxAmSlEkzdhm7ZH4JEzyH9B382meX2QzFBtbo/kj/pzFhg9D5iw+wXTLPKvJi87diPKCSFy3qt/1t5yRk2bc55gHx8gx7swIXoh5LRC98TW6y1zlEBDcdpue2pKO0vHEsQQC4bS8gUix1tTpqIIMVHezGMC1oTNMuknLbHM1LArzH24HcZBBJYJ7oxe+TStDtlaBnS16KjN7XVqR4C4PG3BSFf8C8qXjrPsjyub7KvJh5KF0uZgJDLgHFpUioDS8VT7TxLvcm4ssDXKuo3+WxdXzIMUUE4iKwCDZDc/7jQU4F3A== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=altera.com; Received: from SJ0PR03MB5950.namprd03.prod.outlook.com (2603:10b6:a03:2d3::20) by SN7PR03MB7155.namprd03.prod.outlook.com (2603:10b6:806:359::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Wed, 3 Jun 2026 07:25:31 +0000 Received: from SJ0PR03MB5950.namprd03.prod.outlook.com ([fe80::53a0:bf93:6b6b:de01]) by SJ0PR03MB5950.namprd03.prod.outlook.com ([fe80::53a0:bf93:6b6b:de01%4]) with mapi id 15.21.0092.006; Wed, 3 Jun 2026 07:25:31 +0000 From: tze.yee.ng@altera.com To: Alexandre Belloni , Frank Li , Adrian Ng Ho Yin , Felix Gu , Wolfram Sang , Manikanta Guntupalli , Jorge Marques , Sakari Ailus , linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Tze Yee Ng Subject: [PATCH] i3c: master: dw: Report CCC M0/M2 errors and retry on failure Date: Wed, 3 Jun 2026 00:25:28 -0700 Message-ID: <5cd9bc11797c7fec92d7ef2a16d4c78963754d06.1780470927.git.tze.yee.ng@altera.com> X-Mailer: git-send-email 2.43.7 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0222.namprd03.prod.outlook.com (2603:10b6:a03:39f::17) To SJ0PR03MB5950.namprd03.prod.outlook.com (2603:10b6:a03:2d3::20) 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: SJ0PR03MB5950:EE_|SN7PR03MB7155:EE_ X-MS-Office365-Filtering-Correlation-Id: 8ede7078-4873-4657-479b-08dec1414ab6 X-MS-Exchange-AtpMessageProperties: SA X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024|55112099003|56012099006|11063799006|3023799007|921020|18002099003; X-Microsoft-Antispam-Message-Info: /Magv7Iw7FCB+/syedErQD7hb4dY/gRvJ/Ds1jF5GebA27TXIP3M3PZBcmy6jOChlD/FYnSk6dyvIe11MmyJVYCOagfwK6D84ELZSAwV8/cwnUUdZy6rzvLuXQORleUuURi6GjRgy37YxEbCWawctjcZsMjqDtW4DLMewRHb/O9sJVrRodV5LZ9X0XJBgkoySY56bTv0687EwULLzxxET6f0nM1iHgJW/y0pD+kmag4yEUxK55F+ek2ZHl2bMy3tFeoXUL7aoI/bD/se9X/JN0wXKAfvCiTRm0eldITsHpwUy0064oZfW/L/MA9tsKvZ/WuHFmJeSYKvk2W0Ccl/Vgxw/Sk4gLSsLnwopnpVKL6VAK875EwWlcVlktJPMdl7zKr+IllGK8AhkWDj26rJGSTVpF8+EMVkDIBB3XYmtN1oCqnN5IajzFNzl79TURTsBWopb/qpjVAsZ3b1u15izlSuViNKJdcY7574EwKqscrHdQIRyOM4k/cQErq1fd5TEOqTuLPThyXLvvs//10VjtFluTmV88sHFw4e/mcwAs1/ibAPrcL7tkEcU0JYuPkK1mIz6Xm834WYe+dBpbKsjzKe3AfjDKoxc+kUIlNLADGsWWLgHobvdksUyQQEURUT2LugSxevrKmTjbqE2tbkLnO4KVaRISNzmm/UnrdNT16iNWfA5kvfGHK8yyRhRlI/8bEMGmeRklRHYGNz74HGHMoJoUcbS8XkyTPTGOhgOk4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ0PR03MB5950.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024)(55112099003)(56012099006)(11063799006)(3023799007)(921020)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RzViSGF3c2swbGt3MHdwR2pPa3JDdDljTmdPRjEvM3ZJU0NTQzllckhIMUhZ?= =?utf-8?B?V3FQRSsvOEhQaDNKamNkZDQxeTB2MXY0SGJnZ3lSSVd2U2dYNzdCVDFhK3Nn?= =?utf-8?B?eElNTkx1dVRyanJDb2NQK29VVEtvNzAyd2NQM3Q1bE94dEZWaVFWQ1BKQi82?= =?utf-8?B?Ni9jNWxFbzNyWXZNNXlCS2pVM3l4RXhQbzQzcjlmRnJJRHlvM2JJUnNEMElk?= =?utf-8?B?azNCb1FOLzZJUVNQV1lzZnFDdlJKcUc2Ty9IOFU4THBmUVN5ZWtIRGxUdDJU?= =?utf-8?B?bkZTVXFOVVdCSWcyaU90eEhMY0c4NEdlazhsV25FemRHbzRDWEpSazh0cS81?= =?utf-8?B?clFUWS82eVdYWElHcHVzNitNNk8xaVpzb0wvclgvV1VSdW1yUmw2MjlONDgv?= =?utf-8?B?OWUxeExaZ0tlaStpTTdCMzhGNWw2bFlQS1MxZjFTdkt3T1J1S2dDL0VHSnZ4?= =?utf-8?B?LzNlS2lsaStLTXNxemxlUHdtRkp5R0UrS3VxNFd4VW42YmxDakJnU2RKdkVF?= =?utf-8?B?VUszL0c2bGozZnR5Q1dxTE1sWS8rbGhRT1pyc3hhT09ycjNRNnJ1VGthYmVF?= =?utf-8?B?VWtld3JNQ25Mclg0SDVNQjA2bjZUMUpjbVRma0hwZTcrQXhoVFBoaVpwb1lG?= =?utf-8?B?NnNQN1hnd0pDTmJ3MlluUVRsSnZZcWcwOCsrcFR6V2R1WkRsZERyN2ltakJM?= =?utf-8?B?N1lvYXdBdmdyaVBKRzc3RURyd2lnQzhNOWlQbm1KRHJEMDh4dFVtMXUwNmxa?= =?utf-8?B?OWJaNG9vWlVJKzFqU2dnR0VwRE4zdUR0Y3BwNDNpSHVMZ242a1kwYXBXbElI?= =?utf-8?B?cmp2L0xoN3BwWG1NWFVCVWhmeDlrRm40S3RGb25hTFNMOEZHWStma1pZc0sw?= =?utf-8?B?eWNmUEVKY3NnMlBrRlYzcVJVdFZpM2tGVWFoMk1lTDMzWWhONWdlOXZ5Zmp5?= =?utf-8?B?M3pONjVDankvQ1RDVmJvSkVGcFJaZEpGSGlNUDBIWEo1bm8zVGJVU1ZiMXFB?= =?utf-8?B?SWJUSFdCUmVXUUQ3c1AyUW9GRXNaV2tEZzZsZ3FlTEcyT01CbU9UeWthY0lz?= =?utf-8?B?MWdNVldxUW96eXBzUmtXRVAvUVhIR3dqdW13c3AveVJnbUpUODA1ZlJQK2li?= =?utf-8?B?YW1HVWxjbjBUbkdtT1R3OWYyVVZwTUoxSXQvSHRtVWZaakZiUkJVWElZMUw0?= =?utf-8?B?NmZ1cW5nZjFaMkZRY21xL2l5UGxpdWsyeU1Bc1lMWGorK3FSdCtUWWlOcS9P?= =?utf-8?B?TC9IRVRXSWNiU2xjeHFJTC9pdzhIdVhRRCs1aW9pMkVYbEZ0eXlKd3BFSXJ2?= =?utf-8?B?a0gwMkpMNFpuMWJqSVlZOVd3M3ZHUnl2Q2lRT2VuSGJJeVRyVm1VQjl0Q3py?= =?utf-8?B?Ym9FS2ZQZmFRNFRDempjYVBKcElPQ1k5bkRpeTE3ckRkSnZReDhOTXFuRVJl?= =?utf-8?B?QTFLNDdkSnRKR0taeTd3VkF1T01JcC8rSCtKMlljWFpUMjZQb1pNeC9odWc4?= =?utf-8?B?eS9QK1VTMmYya0JnQjlkTVF0S3hBL1U0OWZmbzh5ZWxwL1JrR0wzSGJFVVZN?= =?utf-8?B?MUJJSVJkaVRUYTVJNW5zUGVmOHhqWlZJWU40Kzk1eHZYL3hXWDgvc0liMHFv?= =?utf-8?B?MWxtSFB0bVJCSmZFcUVBd25LbEdwYzdtMWJxcHBYY2FGWnQvcTl5d3lFZ3Ev?= =?utf-8?B?VUFJS0puMzhndzVUeUV5aXVka3A1cDRGRmIxK1Urc3BKWGJrcE1kZE5IczBl?= =?utf-8?B?TVNwYU9pRUordlA3TmNqaFp1QmJtOEVkUFBvYWE3S1FPdm90TzRFVUUrQThx?= =?utf-8?B?R295eGtWM0xyaXFOckQ4djZCRXZHMWlUdldtaE52Z3B3Ykl1NjJDS2ZOc29V?= =?utf-8?B?Z0dscklYUm0xdndrUjBBQkh2QURzNkRwbnZjVTFyNDJpWXZQMUZQRmMzNU50?= =?utf-8?B?eFJNQU4rVkxIZlM0UHlGZ3FIbGdvbFpmYkljRXNtMFNuRDRweTlQeHRkTC9H?= =?utf-8?B?T2xqZHBWbVRDMFA2WHFDTVpkU2QzdUlWKzQ3ZWFZclpxTTcyVTVOWUZFMURM?= =?utf-8?B?UkdXYUdsNmRIaFc0T2IybEJFcTVELytHdjBWeG5oZ3VDR2FyN2R4ZnluaUxp?= =?utf-8?B?V0QwM1haSlJTWStBSnNlTUFnc05CekVndEhIc3pJcHRyU25rTWpWQU9YNFBz?= =?utf-8?B?TXI3eUxocGxJTmI1ZmpNODFsNzViU3JseGdHLy9OVkFLRGtEVG5nQnFpUFIz?= =?utf-8?B?WW1MV0JaYWI3OVM5SS9zUmxaUEFib1o4NXBFaC84QURVRVJ2SXlHRkx3cnJG?= =?utf-8?B?NndpWHZZRVFMYXlIeEJ3SzZGU3VPQ1krc1doWDhIRS9Qb2FaSCtSZz09?= X-OriginatorOrg: altera.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8ede7078-4873-4657-479b-08dec1414ab6 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR03MB5950.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Jun 2026 07:25:31.0893 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: fbd72e03-d4a5-4110-adce-614d51f2077a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: n18tNrSGQnAglBpRwVF8MuV7Cjboz3yM1BPb11YcB1cCAPODQRHNGIfzUOFdF9waN/XucqyNoOBGEWoKFvV1OQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR03MB7155 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 - I3C_ERROR_M0: frame error, or an incomplete GET/SET payload when =C2=A0 the controller reports a successful transfer (short read vs =C2=A0 requested length; GETMRL uses GET_MRL_MIN_LEN if the buffer is =C2=A0 larger than struct i3c_ccc_mrl) On a successful GET CCC, set dests[0].payload.len to the number of bytes actually received. 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. 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) =20 +/* 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_mast= er_controller *m) dw_i3c_master_disable(master); } =20 +static bool dw_i3c_ccc_get_len_mismatch(u8 ccc_id, u16 req_len, u16 rx_len) +{ + if (ccc_id !=3D 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 <=3D 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 =3D cmd->error; + + if (err =3D=3D RESPONSE_ERROR_IBA_NACK || + err =3D=3D RESPONSE_ERROR_ADDRESS_NACK) { + ccc->err =3D I3C_ERROR_M2; + } else if (err =3D=3D RESPONSE_ERROR_FRAME) { + ccc->err =3D I3C_ERROR_M0; + } else if (data_len_mismatch && err =3D=3D RESPONSE_NO_ERROR && !*ret) { + ccc->err =3D I3C_ERROR_M0; + *ret =3D -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 =3D 0; =20 + ccc->err =3D I3C_ERROR_UNKNOWN; + if (ccc->id & I3C_CCC_DIRECT) { pos =3D 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); =20 ret =3D xfer->ret; - if (xfer->cmds[0].error =3D=3D RESPONSE_ERROR_IBA_NACK) - ccc->err =3D I3C_ERROR_M2; + cmd =3D &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 =3D ccc->dests[0].payload.len && + cmd->rx_len < ccc->dests[0].payload.len; + dw_i3c_ccc_map_err(ccc, cmd, data_len_mismatch, &ret); =20 return ret; } @@ -751,21 +798,27 @@ static int dw_i3c_ccc_set(struct dw_i3c_master *maste= r, 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; =20 + ccc->err =3D I3C_ERROR_UNKNOWN; + pos =3D dw_i3c_master_get_addr_pos(master, ccc->dests[0].addr); if (pos < 0) return pos; =20 + req_len =3D ccc->dests[0].payload.len; + struct dw_i3c_xfer *xfer __free(kfree) =3D dw_i3c_master_alloc_xfer(maste= r, 1); if (!xfer) return -ENOMEM; =20 cmd =3D xfer->cmds; cmd->rx_buf =3D ccc->dests[0].payload.data; - cmd->rx_len =3D ccc->dests[0].payload.len; + cmd->rx_len =3D req_len; =20 - cmd->cmd_hi =3D COMMAND_PORT_ARG_DATA_LEN(ccc->dests[0].payload.len) | + cmd->cmd_hi =3D COMMAND_PORT_ARG_DATA_LEN(req_len) | COMMAND_PORT_TRANSFER_ARG; =20 cmd->cmd_lo =3D 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); =20 ret =3D xfer->ret; - if (xfer->cmds[0].error =3D=3D RESPONSE_ERROR_IBA_NACK) - ccc->err =3D I3C_ERROR_M2; + cmd =3D &xfer->cmds[0]; + rx_len_mismatch =3D 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 =3D cmd->rx_len; =20 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 =3D to_dw_i3c_master(m); + int retries =3D DW_I3C_CCC_MAX_RETRIES; int ret =3D 0; =20 if (ccc->id =3D=3D I3C_CCC_ENTDAA) @@ -816,10 +874,11 @@ static int dw_i3c_master_send_ccc_cmd(struct i3c_mast= er_controller *m, return ret; } =20 - if (ccc->rnw) - ret =3D dw_i3c_ccc_get(master, ccc); - else - ret =3D dw_i3c_ccc_set(master, ccc); + do { + ret =3D ccc->rnw ? dw_i3c_ccc_get(master, ccc) + : dw_i3c_ccc_set(master, ccc); + } while (--retries && + ret && (ccc->err =3D=3D I3C_ERROR_M0 || ccc->err =3D=3D I3C_ERROR_M2)); =20 pm_runtime_put_autosuspend(master->dev); return ret; --=20 2.43.7