u32 reg;
        int ret;
 
+       /* clean SVC_I3C_MINT_IBIWON w1c bits */
+       writel(SVC_I3C_MINT_IBIWON, master->regs + SVC_I3C_MSTATUS);
+
        writel(SVC_I3C_MCTRL_REQUEST_START_ADDR |
               xfer_type |
               SVC_I3C_MCTRL_IBIRESP_NACK |
                goto emit_stop;
        }
 
+       /*
+        * According to I3C spec ver 1.1.1, 5.1.2.2.3 Consequence of Controller Starting a Frame
+        * with I3C Target Address.
+        *
+        * The I3C Controller normally should start a Frame, the Address may be arbitrated, and so
+        * the Controller shall monitor to see whether an In-Band Interrupt request, a Controller
+        * Role Request (i.e., Secondary Controller requests to become the Active Controller), or
+        * a Hot-Join Request has been made.
+        *
+        * If missed IBIWON check, the wrong data will be return. When IBIWON happen, return failure
+        * and yield the above events handler.
+        */
+       if (SVC_I3C_MSTATUS_IBIWON(reg)) {
+               ret = -ENXIO;
+               goto emit_stop;
+       }
+
        if (rnw)
                ret = svc_i3c_master_read(master, in, xfer_len);
        else