IDE changes and ported the IDE commit from PCem.
This commit is contained in:
@@ -278,6 +278,8 @@ ide_irq_raise(ide_t *ide)
|
||||
|
||||
/* ide_log("Raising IRQ %i (board %i)\n", ide_boards[ide->board]->irq, ide->board); */
|
||||
|
||||
ide_log("IDE %i: IRQ raise\n", ide->board);
|
||||
|
||||
if (!(ide->fdisk & 2)) {
|
||||
if (ide_bm[ide->board] && ide_bm[ide->board]->set_irq)
|
||||
ide_bm[ide->board]->set_irq(ide->board | 0x40, ide_bm[ide->board]->priv);
|
||||
@@ -298,6 +300,8 @@ ide_irq_lower(ide_t *ide)
|
||||
|
||||
/* ide_log("Lowering IRQ %i (board %i)\n", ide_boards[ide->board]->irq, ide->board); */
|
||||
|
||||
ide_log("IDE %i: IRQ lower\n", ide->board);
|
||||
|
||||
if (ide->irqstat) {
|
||||
if (ide_bm[ide->board] && ide_bm[ide->board]->set_irq)
|
||||
ide_bm[ide->board]->set_irq(ide->board, ide_bm[ide->board]->priv);
|
||||
@@ -318,6 +322,7 @@ ide_irq_update(ide_t *ide)
|
||||
/* ide_log("Raising IRQ %i (board %i)\n", ide_boards[ide->board]->irq, ide->board); */
|
||||
|
||||
if (!(ide->fdisk & 2) && ide->irqstat) {
|
||||
ide_log("IDE %i: IRQ update raise\n", ide->board);
|
||||
if (ide_bm[ide->board] && ide_bm[ide->board]->set_irq) {
|
||||
ide_bm[ide->board]->set_irq(ide->board, ide_bm[ide->board]->priv);
|
||||
ide_bm[ide->board]->set_irq(ide->board | 0x40, ide_bm[ide->board]->priv);
|
||||
@@ -326,6 +331,7 @@ ide_irq_update(ide_t *ide)
|
||||
picint(1 << ide_boards[ide->board]->irq);
|
||||
}
|
||||
} else if (ide->fdisk & 2) {
|
||||
ide_log("IDE %i: IRQ update lower\n", ide->board);
|
||||
if (ide_bm[ide->board] && ide_bm[ide->board]->set_irq)
|
||||
ide_bm[ide->board]->set_irq(ide->board, ide_bm[ide->board]->priv);
|
||||
else if (ide_boards[ide->board]->irq != -1)
|
||||
@@ -877,11 +883,17 @@ ide_atapi_callback(ide_t *ide)
|
||||
|
||||
switch(ide->sc->packet_status) {
|
||||
case PHASE_IDLE:
|
||||
#ifdef ENABLE_IDE_LOG
|
||||
ide_log("PHASE_IDLE\n");
|
||||
#endif
|
||||
ide->sc->pos = 0;
|
||||
ide->sc->phase = 1;
|
||||
ide->sc->status = READY_STAT | DRQ_STAT | (ide->sc->status & ERR_STAT);
|
||||
return;
|
||||
case PHASE_COMMAND:
|
||||
#ifdef ENABLE_IDE_LOG
|
||||
ide_log("PHASE_COMMAND\n");
|
||||
#endif
|
||||
ide->sc->status = BUSY_STAT | (ide->sc->status & ERR_STAT);
|
||||
if (ide->packet_command) {
|
||||
ide->packet_command(ide->sc, ide->sc->atapi_cdb);
|
||||
@@ -890,6 +902,9 @@ ide_atapi_callback(ide_t *ide)
|
||||
}
|
||||
return;
|
||||
case PHASE_COMPLETE:
|
||||
#ifdef ENABLE_IDE_LOG
|
||||
ide_log("PHASE_COMPLETE\n");
|
||||
#endif
|
||||
ide->sc->status = READY_STAT;
|
||||
ide->sc->phase = 3;
|
||||
ide->sc->packet_status = PHASE_NONE;
|
||||
@@ -897,12 +912,18 @@ ide_atapi_callback(ide_t *ide)
|
||||
return;
|
||||
case PHASE_DATA_IN:
|
||||
case PHASE_DATA_OUT:
|
||||
#ifdef ENABLE_IDE_LOG
|
||||
ide_log("PHASE_DATA_IN or PHASE_DATA_OUT\n");
|
||||
#endif
|
||||
ide->sc->status = READY_STAT | DRQ_STAT | (ide->sc->status & ERR_STAT);
|
||||
ide->sc->phase = !(ide->sc->packet_status & 0x01) << 1;
|
||||
ide_irq_raise(ide);
|
||||
return;
|
||||
case PHASE_DATA_IN_DMA:
|
||||
case PHASE_DATA_OUT_DMA:
|
||||
#ifdef ENABLE_IDE_LOG
|
||||
ide_log("PHASE_DATA_IN_DMA or PHASE_DATA_OUT_DMA\n");
|
||||
#endif
|
||||
out = (ide->sc->packet_status & 0x01);
|
||||
|
||||
if (ide_bm[ide->board] && ide_bm[ide->board]->dma) {
|
||||
@@ -932,11 +953,17 @@ ide_atapi_callback(ide_t *ide)
|
||||
|
||||
return;
|
||||
case PHASE_ERROR:
|
||||
#ifdef ENABLE_IDE_LOG
|
||||
ide_log("PHASE_ERROR\n");
|
||||
#endif
|
||||
ide->sc->status = READY_STAT | ERR_STAT;
|
||||
ide->sc->phase = 3;
|
||||
ide->sc->packet_status = PHASE_NONE;
|
||||
ide_irq_raise(ide);
|
||||
return;
|
||||
default:
|
||||
ide_log("PHASE_UNKNOWN %02X\n", ide->sc->packet_status);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1001,6 +1028,9 @@ ide_atapi_packet_read(ide_t *ide, int length)
|
||||
if (!dev || !dev->temp_buffer || (dev->packet_status != PHASE_DATA_IN))
|
||||
return 0;
|
||||
|
||||
if (dev->packet_status == PHASE_DATA_IN)
|
||||
ide_log("PHASE_DATA_IN read: %i, %i< %i, %i\n", dev->request_pos, dev->max_transfer_len, dev->pos, dev->packet_len);
|
||||
|
||||
bufferw = (uint16_t *) dev->temp_buffer;
|
||||
bufferl = (uint32_t *) dev->temp_buffer;
|
||||
|
||||
@@ -1689,7 +1719,7 @@ ide_read_data(ide_t *ide, int length)
|
||||
ide->secount = (ide->secount - 1) & 0xff;
|
||||
if (ide->secount) {
|
||||
ide_next_sector(ide);
|
||||
ide->atastat = BSY_STAT;
|
||||
ide->atastat = BSY_STAT | READY_STAT | DSC_STAT;
|
||||
if (ide->command == WIN_READ_MULTIPLE)
|
||||
ide_callback(ide_boards[ide->board]);
|
||||
else
|
||||
|
@@ -373,14 +373,16 @@ sff_bus_master_set_irq(int channel, void *priv)
|
||||
|
||||
channel &= 0x01;
|
||||
if (dev->status & 0x04) {
|
||||
if ((dev->irq_mode == 2) && (channel & 1) && pci_use_mirq(0))
|
||||
sff_log("SFF8038i: Channel %i IRQ raise\n", channel);
|
||||
if ((dev->irq_mode == 2) && channel && pci_use_mirq(0))
|
||||
pci_set_mirq(0, 0);
|
||||
else if (dev->irq_mode == 1)
|
||||
pci_set_irq(dev->slot, dev->irq_pin);
|
||||
else
|
||||
picint(1 << (14 + channel));
|
||||
} else {
|
||||
if ((dev->irq_mode == 2) && (channel & 1) && pci_use_mirq(0))
|
||||
sff_log("SFF8038i: Channel %i IRQ lower\n", channel);
|
||||
if ((dev->irq_mode == 2) && channel && pci_use_mirq(0))
|
||||
pci_clear_mirq(0, 0);
|
||||
else if (dev->irq_mode == 1)
|
||||
pci_clear_irq(dev->slot, dev->irq_pin);
|
||||
@@ -419,6 +421,10 @@ sff_reset(void *p)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
#ifdef ENABLE_SFF_LOG
|
||||
sff_log("SFF8038i: Reset\n");
|
||||
#endif
|
||||
|
||||
for (i = 0; i < CDROM_NUM; i++) {
|
||||
if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) &&
|
||||
(cdrom[i].ide_channel < 4) && cdrom[i].priv)
|
||||
@@ -429,6 +435,9 @@ sff_reset(void *p)
|
||||
(zip_drives[i].ide_channel < 4) && zip_drives[i].priv)
|
||||
zip_reset((scsi_common_t *) zip_drives[i].priv);
|
||||
}
|
||||
|
||||
sff_bus_master_set_irq(0x00, p);
|
||||
sff_bus_master_set_irq(0x01, p);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -463,7 +463,7 @@ mfm_readw(uint16_t port, void *priv)
|
||||
mfm->secount = (mfm->secount - 1) & 0xff;
|
||||
if (mfm->secount) {
|
||||
next_sector(mfm);
|
||||
mfm->status = STAT_BUSY;
|
||||
mfm->status = STAT_BUSY | STAT_READY | STAT_DSC;
|
||||
timer_set_delay_u64(&mfm->callback_timer, SECTOR_TIME);
|
||||
} else
|
||||
ui_sb_update_icon(SB_HDD|HDD_BUS_MFM, 0);
|
||||
|
Reference in New Issue
Block a user