Skip to content

Commit 07db0bb

Browse files
committed
Avoid spinning up or hanging on a missing disc drive
1 parent 7d5b8cf commit 07db0bb

File tree

2 files changed

+36
-19
lines changed

2 files changed

+36
-19
lines changed

gc/ogc/dvdlow.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ s32 DVD_LowReadImm(dvdcmdbuf cmdbuf,dvdcallbacklow cb);
4444
s32 DVD_LowWriteImm(dvdcmdbuf cmdbuf,u32 immbuf,dvdcallbacklow cb);
4545
s32 DVD_LowReadDma(dvdcmdbuf cmdbuf,void *buf,u32 len,dvdcallbacklow cb);
4646
s32 DVD_LowWriteDma(dvdcmdbuf cmdbuf,void *buf,u32 len,dvdcallbacklow cb);
47-
s32 DVD_GcodeLowRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
48-
s32 DVD_GcodeLowWriteBuffer(void *buf,u32 len,dvdcallbacklow cb);
49-
s32 DVD_GcodeLowWrite(u32 len,u32 offset,dvdcallbacklow cb);
47+
s32 DVD_LowGcodeRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
48+
s32 DVD_LowGcodeWriteBuffer(void *buf,u32 len,dvdcallbacklow cb);
49+
s32 DVD_LowGcodeWrite(u32 len,u32 offset,dvdcallbacklow cb);
5050

5151
#ifdef __cplusplus
5252
}

libogc/dvd.c

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -903,7 +903,7 @@ static void __dvd_statebusycb(s32 result)
903903
}
904904
if(__dvd_currcmd==0x0019) {
905905
if(_diReg[7]&DVD_DI_MODE) {
906-
DVD_GcodeLowWrite(__dvd_executing->currtxsize,__dvd_executing->offset+__dvd_executing->txdsize,__dvd_statebusycb);
906+
DVD_LowGcodeWrite(__dvd_executing->currtxsize,__dvd_executing->offset+__dvd_executing->txdsize,__dvd_statebusycb);
907907
return;
908908
}
909909
if(_diReg[8]) {
@@ -1623,14 +1623,14 @@ static void __dvd_statebusy(dvdcmdblk *block)
16231623
case 24:
16241624
_diReg[1] = _diReg[1];
16251625
block->currtxsize = block->len;
1626-
DVD_GcodeLowRead(block->buf,block->len,block->offset,__dvd_statebusycb);
1626+
DVD_LowGcodeRead(block->buf,block->len,block->offset,__dvd_statebusycb);
16271627
return;
16281628
case 25:
16291629
_diReg[1] = _diReg[1];
16301630
len = block->len-block->txdsize;
16311631
if(len<__dvd_gcode_writebufsize) block->currtxsize = len;
16321632
else block->currtxsize = __dvd_gcode_writebufsize;
1633-
DVD_GcodeLowWriteBuffer(block->buf+(DVD_GCODE_BLKSIZE*block->txdsize),block->currtxsize,__dvd_statebusycb);
1633+
DVD_LowGcodeWriteBuffer(block->buf+(DVD_GCODE_BLKSIZE*block->txdsize),block->currtxsize,__dvd_statebusycb);
16341634
return;
16351635
default:
16361636
return;
@@ -2134,10 +2134,10 @@ s32 DVD_LowWriteDma(dvdcmdbuf cmdbuf,void *buf,u32 len,dvdcallbacklow cb)
21342134
return 1;
21352135
}
21362136

2137-
s32 DVD_GcodeLowRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb)
2137+
s32 DVD_LowGcodeRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb)
21382138
{
21392139
#ifdef _DVD_DEBUG
2140-
printf("DVD_GcodeLowRead(%p,%d,%d)\n",buf,len,offset);
2140+
printf("DVD_LowGcodeRead(%p,%d,%d)\n",buf,len,offset);
21412141
#endif
21422142
struct timespec tb;
21432143

@@ -2158,10 +2158,10 @@ s32 DVD_GcodeLowRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb)
21582158
return 1;
21592159
}
21602160

2161-
s32 DVD_GcodeLowWriteBuffer(void *buf,u32 len,dvdcallbacklow cb)
2161+
s32 DVD_LowGcodeWriteBuffer(void *buf,u32 len,dvdcallbacklow cb)
21622162
{
21632163
#ifdef _DVD_DEBUG
2164-
printf("DVD_GcodeLowWriteBuffer(%p,%d)\n",buf,len);
2164+
printf("DVD_LowGcodeWriteBuffer(%p,%d)\n",buf,len);
21652165
#endif
21662166
struct timespec tb;
21672167

@@ -2191,10 +2191,10 @@ s32 DVD_GcodeLowWriteBuffer(void *buf,u32 len,dvdcallbacklow cb)
21912191
return 1;
21922192
}
21932193

2194-
s32 DVD_GcodeLowWrite(u32 len,u32 offset,dvdcallbacklow cb)
2194+
s32 DVD_LowGcodeWrite(u32 len,u32 offset,dvdcallbacklow cb)
21952195
{
21962196
#ifdef _DVD_DEBUG
2197-
printf("DVD_GcodeLowWrite(%d,%d)\n",len,offset);
2197+
printf("DVD_LowGcodeWrite(%d,%d)\n",len,offset);
21982198
#endif
21992199
struct timespec tb;
22002200

@@ -3527,7 +3527,7 @@ void DVD_Init(void)
35273527
u32 DVD_SetAutoInvalidation(u32 auto_inv)
35283528
{
35293529
u32 ret = __dvd_autoinvalidation;
3530-
__dvd_autoinvalidation= auto_inv;
3530+
__dvd_autoinvalidation = auto_inv;
35313531
return ret;
35323532
}
35333533

@@ -3568,6 +3568,7 @@ static bool __gcdvd_ReadSectors(DISC_INTERFACE *disc,sec_t sector,sec_t numSecto
35683568
if(numSectors & ~0x1fffff) return false;
35693569
if(disc->bytesPerSector != 2048) return false;
35703570
if(!SYS_IsDMAAddress(buffer, 32)) return false;
3571+
if(!__dvd_initflag) return false;
35713572

35723573
if(DVD_ReadAbs(&blk, buffer, numSectors << 11, sector << 11) < 0)
35733574
return false;
@@ -3588,21 +3589,30 @@ static bool __gcdvd_ClearStatus(DISC_INTERFACE *disc)
35883589
static bool __gcdvd_Shutdown(DISC_INTERFACE *disc)
35893590
{
35903591
dvdcmdblk blk;
3592+
3593+
if(disc->ioType != DEVICE_TYPE_GAMECUBE_DVD) return false;
3594+
if(!__dvd_initflag) return true;
3595+
35913596
DVD_StopMotor(&blk);
35923597
return true;
35933598
}
35943599

35953600
static bool __gcode_Startup(DISC_INTERFACE *disc)
35963601
{
3602+
s32 cover;
35973603
dvdcmdblk blk;
35983604

3599-
DVD_Init();
3600-
DVD_Reset(DVD_RESETNONE);
3605+
do {
3606+
cover = DVD_LowGetCoverStatus();
3607+
} while(cover == DVD_COVER_RESET);
36013608

3602-
if(DVD_Inquiry(&blk, &__dvd_driveinfo) < 0)
3609+
if(cover == DVD_COVER_OPEN)
36033610
return false;
36043611

3605-
if(__dvd_driveinfo.rel_date != 0x20196c64)
3612+
DVD_Init();
3613+
DVD_Reset(DVD_RESETNONE);
3614+
3615+
if(DVD_Inquiry(&blk, &__dvd_driveinfo) < 0 || __dvd_driveinfo.rel_date != 0x20196c64)
36063616
return false;
36073617

36083618
if(__dvd_driveinfo.pad[1] == 'w')
@@ -3611,13 +3621,18 @@ static bool __gcode_Startup(DISC_INTERFACE *disc)
36113621
disc->features &= ~FEATURE_MEDIUM_CANWRITE;
36123622

36133623
__dvd_gcode_writebufsize = __dvd_driveinfo.pad[3] + 1;
3614-
36153624
return true;
36163625
}
36173626

36183627
static bool __gcode_IsInserted(DISC_INTERFACE *disc)
36193628
{
3620-
if(DVD_LowGetCoverStatus() == DVD_COVER_OPEN)
3629+
s32 cover;
3630+
3631+
do {
3632+
cover = DVD_LowGetCoverStatus();
3633+
} while(cover == DVD_COVER_RESET);
3634+
3635+
if(cover == DVD_COVER_OPEN)
36213636
return false;
36223637

36233638
return true;
@@ -3633,6 +3648,7 @@ static bool __gcode_ReadSectors(DISC_INTERFACE *disc,sec_t sector,sec_t numSecto
36333648
if(numSectors & ~0x7fffff) return false;
36343649
if(disc->bytesPerSector != 512) return false;
36353650
if(!SYS_IsDMAAddress(buffer, 32)) return false;
3651+
if(!__dvd_initflag) return false;
36363652

36373653
if(DVD_GcodeRead(&blk, buffer, numSectors << 9, sector) < 0)
36383654
return false;
@@ -3650,6 +3666,7 @@ static bool __gcode_WriteSectors(DISC_INTERFACE *disc,sec_t sector,sec_t numSect
36503666
if((u32)numSectors != numSectors) return false;
36513667
if(disc->bytesPerSector != 512) return false;
36523668
if(!SYS_IsDMAAddress(buffer, 32)) return false;
3669+
if(!__dvd_initflag) return false;
36533670

36543671
if(DVD_GcodeWrite(&blk, buffer, numSectors, sector) < 0)
36553672
return false;

0 commit comments

Comments
 (0)