@@ -40,6 +40,7 @@ distribution.
4040typedef struct {
4141 s32 result ;
4242 bool attached ;
43+ bool reattach ;
4344 u8 cmd [3 ];
4445 u32 cmdLen ;
4546 u32 mode ;
@@ -184,6 +185,7 @@ s32 MMCE_SetAccessMode(s32 chan, u8 mode)
184185 if (!err ) {
185186 MMCEControlBlock * cb = & __MMCE [chan ];
186187 cb -> result = MMCE_RESULT_BUSY ;
188+ cb -> reattach = true;
187189 cb -> repeat = 0 ;
188190
189191 if (chan < EXI_CHANNEL_2 )
@@ -320,9 +322,10 @@ s32 MMCE_SetGameID(s32 chan, const char gameID[10])
320322static s32 ExiHandler (s32 chan , s32 dev )
321323{
322324 MMCEControlBlock * cb = & __MMCE [chan ];
325+ cb -> reattach = false;
323326
324327 if (!cb -> repeat ) {
325- cb -> result = MMCE_RESULT_READY ;
328+ cb -> result = ! EXI_Probe ( chan ) ? MMCE_RESULT_NOCARD : MMCE_RESULT_READY ;
326329 LWP_ThreadBroadcast (cb -> syncQueue );
327330
328331 if (chan < EXI_CHANNEL_2 )
@@ -455,11 +458,16 @@ s32 MMCE_WriteSectors(s32 chan, u32 sector, u16 numSectors, const void *buffer)
455458static s32 ExtHandler (s32 chan , s32 dev )
456459{
457460 MMCEControlBlock * cb = & __MMCE [chan ];
458-
459- EXI_RegisterEXICallback (chan , NULL );
460461 cb -> attached = false;
461- cb -> result = MMCE_RESULT_NOCARD ;
462- LWP_ThreadBroadcast (cb -> syncQueue );
462+
463+ if (cb -> reattach ) {
464+ cb -> exiCallback = NULL ;
465+ EXI_RegisterEXICallback (chan , ExiHandler );
466+ } else {
467+ EXI_RegisterEXICallback (chan , NULL );
468+ cb -> result = MMCE_RESULT_NOCARD ;
469+ LWP_ThreadBroadcast (cb -> syncQueue );
470+ }
463471
464472 return TRUE;
465473}
@@ -574,6 +582,7 @@ static bool __mmce_shutdown(DISC_INTERFACE *disc)
574582 }
575583
576584 __MMCE [chan ].attached = false;
585+ __MMCE [chan ].reattach = false;
577586 EXI_Detach (chan );
578587 return true;
579588}
0 commit comments