Hi @Dezheng_Tang sorry for the delay we were trying a few things. We tried to isolate to one of our devices which is causing the issue. Still no definitive signal there unfortunately.
I was able to implement the hardware recovery similar to what you suggested. I actually pulled in i2c_bitbang driver that is used on the i2c module for recovery into the i3c driver:
int i2c_bitbang_recover_bus(struct i2c_bitbang *context)
{
int i;
/*
* The I2C-bus specification and user manual (NXP UM10204
* rev. 6, section 3.1.16) suggests the master emit 9 SCL
* clock pulses to recover the bus.
*
* The Linux kernel I2C bitbang recovery functionality issues
* a START condition followed by 9 STOP conditions.
*
* Other I2C slave devices (e.g. Microchip ATSHA204a) suggest
* issuing a START condition followed by 9 SCL clock pulses
* with SDA held high/floating, a REPEATED START condition,
* and a STOP condition.
*
* The latter is what is implemented here.
*/
it seems to work returning SDA high:

and i can trigger it a couple times even:

but the i3c does not get back to IDLE (FYI I added the error EHOSTDOWN to denote this inability to get into IDLE when emitting stop).
[00:17:30.601,824] <err> i3c_mcux: do_one_xfer_read Timeout error
[00:17:30.601,843] <wrn> i3c_mcux: ERROR from transfer read=1, error=-116
[00:17:30.736,449] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001903 MERRWARN 0x00000000 MIBIRULES 0x00000000
[00:17:31.736,672] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:31.736,688] <wrn> i3c_mcux: Timeout on emit stop, retrying
[00:17:31.871,770] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001103 MERRWARN 0x00000000 MIBIRULES 0x00000000
[00:17:32.871,977] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:32.871,993] <wrn> i3c_mcux: Timeout on emit stop, retrying
[00:17:33.006,332] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001103 MERRWARN 0x00000000 MIBIRULES 0x00000000
[00:17:34.006,569] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:34.006,586] <wrn> i3c_mcux: Timeout on emit stop, retrying
[00:17:34.139,991] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001103 MERRWARN 0x00000000 MIBIRULES 0x00000000
[00:17:35.140,169] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:35.140,180] <wrn> i3c_mcux: Timeout on emit stop, retrying
[00:17:35.274,973] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001103 MERRWARN 0x00000000 MIBIRULES 0x00000000
[00:17:36.275,072] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:36.275,088] <wrn> i3c_mcux: Timeout on emit stop, retrying
[00:17:36.410,054] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001103 MERRWARN 0x00000000 MIBIRULES 0x00000000
[00:17:37.410,277] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:37.410,295] <err> i3c_mcux: Error waiting for stop EHOSTDOWN
[00:17:37.410,303] <err> i3c_mcux: STOP ERROR = -117
[00:17:37.410,306] <wrn> i3c_mcux: RETURN EHOSTDOWN
[00:17:37.543,104] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001103 MERRWARN 0x00000000 MIBIRULES 0x00000000
fusion_core:~$i3c_recover
--- 21 messages dropped ---
[00:17:38.543,281] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:38.543,297] <wrn> i3c_mcux: Timeout on emit stop, retrying
[00:17:38.678,129] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001103 MERRWARN 0x00000000 MIBIRULES 0x00000000
[00:17:38.748,052] <wrn> charger: TRUING TO RECOVR BUS
[00:17:38.848,277] <wrn> i3c_mcux: pnx_mcux_i3c_recover_bus ... using i2c bus reovery!!!!
[00:17:39.678,370] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:39.678,388] <wrn> i3c_mcux: Timeout on emit stop, retrying
[00:17:39.813,108] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001103 MERRWARN 0x00000000 MIBIRULES 0x00000000
[00:17:40.813,268] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:40.813,281] <wrn> i3c_mcux: Timeout on emit stop, retrying
[00:17:40.948,013] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001103 MERRWARN 0x00000000 MIBIRULES 0x00000000
[00:17:41.948,273] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:41.948,292] <wrn> i3c_mcux: Timeout on emit stop, retrying
[00:17:42.081,881] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001103 MERRWARN 0x00000000 MIBIRULES 0x00000000
[00:17:43.082,069] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:43.082,087] <wrn> i3c_mcux: Timeout on emit stop, retrying
[00:17:43.216,617] <err> i3c_mcux: Tried to emit stop 10000times..clearing all! MCTRL 0x00000052 MSTATUS 0x00001103 MERRWARN 0x00000000 MIBIRULES 0x00000000
[00:17:51.046,370] <wrn> i3c_mcux: EMIT STOP return EHOSTDOWN
[00:17:51.046,389] <err> i3c_mcux: Error waiting for stop EHOSTDOWN
My question is: After I'm able to recover the SDA line via GPIO toggling/bitbang-ing what steps should i follow to get the i3c controller back? it seems its still stuck somewhere in NORMACT but its not transmitting anything.
Zephyr doesn't allow "re-initializing" devices so i have to build one from scratch, and what I'm doing doesn't seem to be working.
Thanks,
Galen