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("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->fdisk & 2)) {
|
||||||
if (ide_bm[ide->board] && ide_bm[ide->board]->set_irq)
|
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);
|
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("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->irqstat) {
|
||||||
if (ide_bm[ide->board] && ide_bm[ide->board]->set_irq)
|
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, 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); */
|
/* ide_log("Raising IRQ %i (board %i)\n", ide_boards[ide->board]->irq, ide->board); */
|
||||||
|
|
||||||
if (!(ide->fdisk & 2) && ide->irqstat) {
|
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) {
|
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, ide_bm[ide->board]->priv);
|
||||||
ide_bm[ide->board]->set_irq(ide->board | 0x40, 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);
|
picint(1 << ide_boards[ide->board]->irq);
|
||||||
}
|
}
|
||||||
} else if (ide->fdisk & 2) {
|
} 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)
|
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, ide_bm[ide->board]->priv);
|
||||||
else if (ide_boards[ide->board]->irq != -1)
|
else if (ide_boards[ide->board]->irq != -1)
|
||||||
@@ -877,11 +883,17 @@ ide_atapi_callback(ide_t *ide)
|
|||||||
|
|
||||||
switch(ide->sc->packet_status) {
|
switch(ide->sc->packet_status) {
|
||||||
case PHASE_IDLE:
|
case PHASE_IDLE:
|
||||||
|
#ifdef ENABLE_IDE_LOG
|
||||||
|
ide_log("PHASE_IDLE\n");
|
||||||
|
#endif
|
||||||
ide->sc->pos = 0;
|
ide->sc->pos = 0;
|
||||||
ide->sc->phase = 1;
|
ide->sc->phase = 1;
|
||||||
ide->sc->status = READY_STAT | DRQ_STAT | (ide->sc->status & ERR_STAT);
|
ide->sc->status = READY_STAT | DRQ_STAT | (ide->sc->status & ERR_STAT);
|
||||||
return;
|
return;
|
||||||
case PHASE_COMMAND:
|
case PHASE_COMMAND:
|
||||||
|
#ifdef ENABLE_IDE_LOG
|
||||||
|
ide_log("PHASE_COMMAND\n");
|
||||||
|
#endif
|
||||||
ide->sc->status = BUSY_STAT | (ide->sc->status & ERR_STAT);
|
ide->sc->status = BUSY_STAT | (ide->sc->status & ERR_STAT);
|
||||||
if (ide->packet_command) {
|
if (ide->packet_command) {
|
||||||
ide->packet_command(ide->sc, ide->sc->atapi_cdb);
|
ide->packet_command(ide->sc, ide->sc->atapi_cdb);
|
||||||
@@ -890,6 +902,9 @@ ide_atapi_callback(ide_t *ide)
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
case PHASE_COMPLETE:
|
case PHASE_COMPLETE:
|
||||||
|
#ifdef ENABLE_IDE_LOG
|
||||||
|
ide_log("PHASE_COMPLETE\n");
|
||||||
|
#endif
|
||||||
ide->sc->status = READY_STAT;
|
ide->sc->status = READY_STAT;
|
||||||
ide->sc->phase = 3;
|
ide->sc->phase = 3;
|
||||||
ide->sc->packet_status = PHASE_NONE;
|
ide->sc->packet_status = PHASE_NONE;
|
||||||
@@ -897,12 +912,18 @@ ide_atapi_callback(ide_t *ide)
|
|||||||
return;
|
return;
|
||||||
case PHASE_DATA_IN:
|
case PHASE_DATA_IN:
|
||||||
case PHASE_DATA_OUT:
|
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->status = READY_STAT | DRQ_STAT | (ide->sc->status & ERR_STAT);
|
||||||
ide->sc->phase = !(ide->sc->packet_status & 0x01) << 1;
|
ide->sc->phase = !(ide->sc->packet_status & 0x01) << 1;
|
||||||
ide_irq_raise(ide);
|
ide_irq_raise(ide);
|
||||||
return;
|
return;
|
||||||
case PHASE_DATA_IN_DMA:
|
case PHASE_DATA_IN_DMA:
|
||||||
case PHASE_DATA_OUT_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);
|
out = (ide->sc->packet_status & 0x01);
|
||||||
|
|
||||||
if (ide_bm[ide->board] && ide_bm[ide->board]->dma) {
|
if (ide_bm[ide->board] && ide_bm[ide->board]->dma) {
|
||||||
@@ -932,11 +953,17 @@ ide_atapi_callback(ide_t *ide)
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
case PHASE_ERROR:
|
case PHASE_ERROR:
|
||||||
|
#ifdef ENABLE_IDE_LOG
|
||||||
|
ide_log("PHASE_ERROR\n");
|
||||||
|
#endif
|
||||||
ide->sc->status = READY_STAT | ERR_STAT;
|
ide->sc->status = READY_STAT | ERR_STAT;
|
||||||
ide->sc->phase = 3;
|
ide->sc->phase = 3;
|
||||||
ide->sc->packet_status = PHASE_NONE;
|
ide->sc->packet_status = PHASE_NONE;
|
||||||
ide_irq_raise(ide);
|
ide_irq_raise(ide);
|
||||||
return;
|
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))
|
if (!dev || !dev->temp_buffer || (dev->packet_status != PHASE_DATA_IN))
|
||||||
return 0;
|
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;
|
bufferw = (uint16_t *) dev->temp_buffer;
|
||||||
bufferl = (uint32_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;
|
ide->secount = (ide->secount - 1) & 0xff;
|
||||||
if (ide->secount) {
|
if (ide->secount) {
|
||||||
ide_next_sector(ide);
|
ide_next_sector(ide);
|
||||||
ide->atastat = BSY_STAT;
|
ide->atastat = BSY_STAT | READY_STAT | DSC_STAT;
|
||||||
if (ide->command == WIN_READ_MULTIPLE)
|
if (ide->command == WIN_READ_MULTIPLE)
|
||||||
ide_callback(ide_boards[ide->board]);
|
ide_callback(ide_boards[ide->board]);
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -373,14 +373,16 @@ sff_bus_master_set_irq(int channel, void *priv)
|
|||||||
|
|
||||||
channel &= 0x01;
|
channel &= 0x01;
|
||||||
if (dev->status & 0x04) {
|
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);
|
pci_set_mirq(0, 0);
|
||||||
else if (dev->irq_mode == 1)
|
else if (dev->irq_mode == 1)
|
||||||
pci_set_irq(dev->slot, dev->irq_pin);
|
pci_set_irq(dev->slot, dev->irq_pin);
|
||||||
else
|
else
|
||||||
picint(1 << (14 + channel));
|
picint(1 << (14 + channel));
|
||||||
} else {
|
} 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);
|
pci_clear_mirq(0, 0);
|
||||||
else if (dev->irq_mode == 1)
|
else if (dev->irq_mode == 1)
|
||||||
pci_clear_irq(dev->slot, dev->irq_pin);
|
pci_clear_irq(dev->slot, dev->irq_pin);
|
||||||
@@ -419,6 +421,10 @@ sff_reset(void *p)
|
|||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
|
#ifdef ENABLE_SFF_LOG
|
||||||
|
sff_log("SFF8038i: Reset\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < CDROM_NUM; i++) {
|
for (i = 0; i < CDROM_NUM; i++) {
|
||||||
if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) &&
|
if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) &&
|
||||||
(cdrom[i].ide_channel < 4) && cdrom[i].priv)
|
(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_drives[i].ide_channel < 4) && zip_drives[i].priv)
|
||||||
zip_reset((scsi_common_t *) 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;
|
mfm->secount = (mfm->secount - 1) & 0xff;
|
||||||
if (mfm->secount) {
|
if (mfm->secount) {
|
||||||
next_sector(mfm);
|
next_sector(mfm);
|
||||||
mfm->status = STAT_BUSY;
|
mfm->status = STAT_BUSY | STAT_READY | STAT_DSC;
|
||||||
timer_set_delay_u64(&mfm->callback_timer, SECTOR_TIME);
|
timer_set_delay_u64(&mfm->callback_timer, SECTOR_TIME);
|
||||||
} else
|
} else
|
||||||
ui_sb_update_icon(SB_HDD|HDD_BUS_MFM, 0);
|
ui_sb_update_icon(SB_HDD|HDD_BUS_MFM, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user