Skip to content

Commit 0ea3b8f

Browse files
nextgeniusproQuzarDC
authored andcommitted
Fix DMA transfer lock for non-blocking mode
1 parent 51b5fdb commit 0ea3b8f

1 file changed

Lines changed: 6 additions & 2 deletions

File tree

  • kernel/arch/dreamcast/hardware

kernel/arch/dreamcast/hardware/cdrom.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ int cdrom_stream_request(void *buffer, size_t size, bool block) {
557557
}
558558

559559
params.size = size;
560-
sem_wait_scoped(&_g1_ata_sem);
560+
sem_wait(&_g1_ata_sem);
561561

562562
if(stream_dma) {
563563
dma_in_progress = true;
@@ -570,6 +570,7 @@ int cdrom_stream_request(void *buffer, size_t size, bool block) {
570570
dma_in_progress = false;
571571
dma_blocking = false;
572572
dma_auto_unlock = false;
573+
sem_signal(&_g1_ata_sem);
573574
return ERR_SYS;
574575
}
575576
if(!block) {
@@ -579,8 +580,10 @@ int cdrom_stream_request(void *buffer, size_t size, bool block) {
579580
}
580581
else {
581582
rs = syscall_gdrom_pio_transfer(cmd_hnd, &params);
582-
if(rs < 0)
583+
if(rs < 0) {
584+
sem_signal(&_g1_ata_sem);
583585
return ERR_SYS;
586+
}
584587
}
585588

586589
data = (struct cmd_transfer_data){ cmd_hnd, 0 };
@@ -595,6 +598,7 @@ int cdrom_stream_request(void *buffer, size_t size, bool block) {
595598
stream_cb(stream_cb_param);
596599
}
597600

601+
sem_signal(&_g1_ata_sem);
598602
return ERR_OK;
599603
}
600604

0 commit comments

Comments
 (0)