Prevent stalls while waiting on DMA without explicit switch calls
This commit is contained in:
parent
e3bf5b815f
commit
dcff1d8a74
@ -404,6 +404,7 @@ try_again:
|
|||||||
/* set read */
|
/* set read */
|
||||||
outportb(dev->bar4, 0x08);
|
outportb(dev->bar4, 0x08);
|
||||||
|
|
||||||
|
IRQ_ON;
|
||||||
while (1) {
|
while (1) {
|
||||||
uint8_t status = inportb(dev->io_base + ATA_REG_STATUS);
|
uint8_t status = inportb(dev->io_base + ATA_REG_STATUS);
|
||||||
if (!(status & ATA_SR_BSY)) break;
|
if (!(status & ATA_SR_BSY)) break;
|
||||||
@ -434,13 +435,13 @@ try_again:
|
|||||||
int status = inportb(dev->bar4 + 0x02);
|
int status = inportb(dev->bar4 + 0x02);
|
||||||
int dstatus = inportb(dev->io_base + ATA_REG_STATUS);
|
int dstatus = inportb(dev->io_base + ATA_REG_STATUS);
|
||||||
if (!(status & 0x04)) {
|
if (!(status & 0x04)) {
|
||||||
//switch_task(1);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!(dstatus & ATA_SR_BSY)) {
|
if (!(dstatus & ATA_SR_BSY)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
IRQ_OFF;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (ata_wait(dev, 1)) {
|
if (ata_wait(dev, 1)) {
|
||||||
@ -455,8 +456,10 @@ try_again:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Okay, check the shit... */
|
/* Copy from DMA buffer to output buffer. */
|
||||||
memcpy(buf, dev->dma_start, 512);
|
memcpy(buf, dev->dma_start, 512);
|
||||||
|
|
||||||
|
/* Inform device we are done. */
|
||||||
outportb(dev->bar4 + 0x2, inportb(dev->bar4 + 0x02) | 0x04 | 0x02);
|
outportb(dev->bar4 + 0x2, inportb(dev->bar4 + 0x02) | 0x04 | 0x02);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@ -518,11 +521,6 @@ static void ata_device_write_sector_retry(struct ata_device * dev, uint32_t lba,
|
|||||||
static int ata_initialize(void) {
|
static int ata_initialize(void) {
|
||||||
/* Detect drives and mount them */
|
/* Detect drives and mount them */
|
||||||
|
|
||||||
#if 0
|
|
||||||
debug_file = kopen("/dev/ttyS0", 0);
|
|
||||||
debug_level = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Locate ATA device via PCI */
|
/* Locate ATA device via PCI */
|
||||||
pci_scan(&find_ata_pci, -1, &ata_pci);
|
pci_scan(&find_ata_pci, -1, &ata_pci);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user