ESDI: fix drive status icon updating
This commit is contained in:
@@ -253,9 +253,9 @@ esdi_writew(uint16_t port, uint16_t val, void *priv)
|
|||||||
if (esdi->pos >= 512) {
|
if (esdi->pos >= 512) {
|
||||||
esdi->pos = 0;
|
esdi->pos = 0;
|
||||||
esdi->status = STAT_BUSY;
|
esdi->status = STAT_BUSY;
|
||||||
get_sector(esdi, &addr);
|
get_sector(esdi, &addr);
|
||||||
double seek_time = hdd_timing_write(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, 1);
|
double seek_time = hdd_timing_write(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, 1);
|
||||||
double xfer_time = esdi_get_xfer_time(esdi, 1);
|
double xfer_time = esdi_get_xfer_time(esdi, 1);
|
||||||
esdi_set_callback(esdi, seek_time + xfer_time);
|
esdi_set_callback(esdi, seek_time + xfer_time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -317,6 +317,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
esdi->command &= ~0x0f; /*mask off step rate*/
|
esdi->command &= ~0x0f; /*mask off step rate*/
|
||||||
esdi->status = STAT_BUSY;
|
esdi->status = STAT_BUSY;
|
||||||
esdi_set_callback(esdi, 200 * HDC_TIME);
|
esdi_set_callback(esdi, 200 * HDC_TIME);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SEEK:
|
case CMD_SEEK:
|
||||||
@@ -325,6 +326,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
get_sector(esdi, &addr);
|
get_sector(esdi, &addr);
|
||||||
seek_time = hdd_seek_get_time(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, HDD_OP_SEEK, 0, 0.0);
|
seek_time = hdd_seek_get_time(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, HDD_OP_SEEK, 0, 0.0);
|
||||||
esdi_set_callback(esdi, seek_time);
|
esdi_set_callback(esdi, seek_time);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -345,10 +347,11 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
|
|
||||||
case 0xa0:
|
case 0xa0:
|
||||||
esdi->status = STAT_BUSY;
|
esdi->status = STAT_BUSY;
|
||||||
get_sector(esdi, &addr);
|
get_sector(esdi, &addr);
|
||||||
seek_time = hdd_timing_read(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, 1);
|
seek_time = hdd_timing_read(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, 1);
|
||||||
xfer_time = esdi_get_xfer_time(esdi, 1);
|
xfer_time = esdi_get_xfer_time(esdi, 1);
|
||||||
esdi_set_callback(esdi, seek_time + xfer_time);
|
esdi_set_callback(esdi, seek_time + xfer_time);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_WRITE:
|
case CMD_WRITE:
|
||||||
@@ -360,21 +363,24 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
fatal("Write with ECC\n");
|
fatal("Write with ECC\n");
|
||||||
esdi->status = STAT_READY | STAT_DRQ | STAT_DSC;
|
esdi->status = STAT_READY | STAT_DRQ | STAT_DSC;
|
||||||
esdi->pos = 0;
|
esdi->pos = 0;
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_VERIFY:
|
case CMD_VERIFY:
|
||||||
case CMD_VERIFY+1:
|
case CMD_VERIFY+1:
|
||||||
esdi->command &= ~0x01;
|
esdi->command &= ~0x01;
|
||||||
esdi->status = STAT_BUSY;
|
esdi->status = STAT_BUSY;
|
||||||
get_sector(esdi, &addr);
|
get_sector(esdi, &addr);
|
||||||
seek_time = hdd_timing_read(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, 1);
|
seek_time = hdd_timing_read(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, 1);
|
||||||
xfer_time = esdi_get_xfer_time(esdi, 1);
|
xfer_time = esdi_get_xfer_time(esdi, 1);
|
||||||
esdi_set_callback(esdi, seek_time + xfer_time);
|
esdi_set_callback(esdi, seek_time + xfer_time);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_FORMAT:
|
case CMD_FORMAT:
|
||||||
esdi->status = STAT_DRQ;
|
esdi->status = STAT_DRQ;
|
||||||
esdi->pos = 0;
|
esdi->pos = 0;
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */
|
case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */
|
||||||
@@ -385,6 +391,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case CMD_DIAGNOSE: /* Execute Drive Diagnostics */
|
case CMD_DIAGNOSE: /* Execute Drive Diagnostics */
|
||||||
esdi->status = STAT_BUSY;
|
esdi->status = STAT_BUSY;
|
||||||
esdi_set_callback(esdi, 200 * HDC_TIME);
|
esdi_set_callback(esdi, 200 * HDC_TIME);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xe0: /*???*/
|
case 0xe0: /*???*/
|
||||||
@@ -448,9 +455,9 @@ esdi_readw(uint16_t port, void *priv)
|
|||||||
if (esdi->secount) {
|
if (esdi->secount) {
|
||||||
next_sector(esdi);
|
next_sector(esdi);
|
||||||
esdi->status = STAT_BUSY;
|
esdi->status = STAT_BUSY;
|
||||||
get_sector(esdi, &addr);
|
get_sector(esdi, &addr);
|
||||||
double seek_time = hdd_timing_read(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, 1);
|
double seek_time = hdd_timing_read(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, 1);
|
||||||
double xfer_time = esdi_get_xfer_time(esdi, 1);
|
double xfer_time = esdi_get_xfer_time(esdi, 1);
|
||||||
/* 390.625 us per sector at 10 Mbit/s = 1280 kB/s. */
|
/* 390.625 us per sector at 10 Mbit/s = 1280 kB/s. */
|
||||||
esdi_set_callback(esdi, seek_time + xfer_time);
|
esdi_set_callback(esdi, seek_time + xfer_time);
|
||||||
} else
|
} else
|
||||||
@@ -543,6 +550,7 @@ esdi_callback(void *priv)
|
|||||||
esdi->status = STAT_READY|STAT_DSC;
|
esdi->status = STAT_READY|STAT_DSC;
|
||||||
}
|
}
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SEEK:
|
case CMD_SEEK:
|
||||||
@@ -552,6 +560,7 @@ esdi_callback(void *priv)
|
|||||||
} else
|
} else
|
||||||
esdi->status = STAT_READY|STAT_DSC;
|
esdi->status = STAT_READY|STAT_DSC;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_READ:
|
case CMD_READ:
|
||||||
@@ -571,7 +580,6 @@ esdi_callback(void *priv)
|
|||||||
esdi->pos = 0;
|
esdi->pos = 0;
|
||||||
esdi->status = STAT_DRQ|STAT_READY|STAT_DSC;
|
esdi->status = STAT_DRQ|STAT_READY|STAT_DSC;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 1);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -580,12 +588,14 @@ esdi_callback(void *priv)
|
|||||||
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
||||||
esdi->error = ERR_ABRT;
|
esdi->error = ERR_ABRT;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
if (get_sector(esdi, &addr)) {
|
if (get_sector(esdi, &addr)) {
|
||||||
esdi->error = ERR_ID_NOT_FOUND;
|
esdi->error = ERR_ID_NOT_FOUND;
|
||||||
esdi->status = STAT_READY|STAT_DSC|STAT_ERR;
|
esdi->status = STAT_READY|STAT_DSC|STAT_ERR;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -596,9 +606,11 @@ esdi_callback(void *priv)
|
|||||||
esdi->status = STAT_DRQ|STAT_READY|STAT_DSC;
|
esdi->status = STAT_DRQ|STAT_READY|STAT_DSC;
|
||||||
esdi->pos = 0;
|
esdi->pos = 0;
|
||||||
next_sector(esdi);
|
next_sector(esdi);
|
||||||
} else
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 1);
|
||||||
|
} else {
|
||||||
esdi->status = STAT_READY|STAT_DSC;
|
esdi->status = STAT_READY|STAT_DSC;
|
||||||
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 1);
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -607,12 +619,14 @@ esdi_callback(void *priv)
|
|||||||
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
||||||
esdi->error = ERR_ABRT;
|
esdi->error = ERR_ABRT;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
if (get_sector(esdi, &addr)) {
|
if (get_sector(esdi, &addr)) {
|
||||||
esdi->error = ERR_ID_NOT_FOUND;
|
esdi->error = ERR_ID_NOT_FOUND;
|
||||||
esdi->status = STAT_READY|STAT_DSC|STAT_ERR;
|
esdi->status = STAT_READY|STAT_DSC|STAT_ERR;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -621,18 +635,20 @@ esdi_callback(void *priv)
|
|||||||
next_sector(esdi);
|
next_sector(esdi);
|
||||||
esdi->secount = (esdi->secount - 1) & 0xff;
|
esdi->secount = (esdi->secount - 1) & 0xff;
|
||||||
if (esdi->secount) {
|
if (esdi->secount) {
|
||||||
get_sector(esdi, &addr);
|
get_sector(esdi, &addr);
|
||||||
seek_time = hdd_timing_read(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, 1);
|
seek_time = hdd_timing_read(&hdd[esdi->drives[esdi->drive_sel].hdd_num], addr, 1);
|
||||||
esdi_set_callback(esdi, seek_time + HDC_TIME);
|
esdi_set_callback(esdi, seek_time + HDC_TIME);
|
||||||
} else {
|
} else {
|
||||||
esdi->pos = 0;
|
esdi->pos = 0;
|
||||||
esdi->status = STAT_READY|STAT_DSC;
|
esdi->status = STAT_READY|STAT_DSC;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_FORMAT:
|
case CMD_FORMAT:
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
if (! drive->present) {
|
if (! drive->present) {
|
||||||
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
||||||
esdi->error = ERR_ABRT;
|
esdi->error = ERR_ABRT;
|
||||||
@@ -649,7 +665,6 @@ esdi_callback(void *priv)
|
|||||||
hdd_image_zero(drive->hdd_num, addr, esdi->secount);
|
hdd_image_zero(drive->hdd_num, addr, esdi->secount);
|
||||||
esdi->status = STAT_READY|STAT_DSC;
|
esdi->status = STAT_READY|STAT_DSC;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 1);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -662,9 +677,11 @@ esdi_callback(void *priv)
|
|||||||
esdi->error = 1; /*no error detected*/
|
esdi->error = 1; /*no error detected*/
|
||||||
esdi->status = STAT_READY|STAT_DSC;
|
esdi->status = STAT_READY|STAT_DSC;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */
|
case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
if (! drive->present) {
|
if (! drive->present) {
|
||||||
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
||||||
esdi->error = ERR_ABRT;
|
esdi->error = ERR_ABRT;
|
||||||
@@ -686,9 +703,11 @@ esdi_callback(void *priv)
|
|||||||
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
||||||
esdi->error = ERR_ABRT;
|
esdi->error = ERR_ABRT;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xe0:
|
case 0xe0:
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
if (! drive->present) {
|
if (! drive->present) {
|
||||||
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
||||||
esdi->error = ERR_ABRT;
|
esdi->error = ERR_ABRT;
|
||||||
@@ -731,6 +750,7 @@ esdi_callback(void *priv)
|
|||||||
esdi->status = STAT_DRQ|STAT_READY|STAT_DSC;
|
esdi->status = STAT_DRQ|STAT_READY|STAT_DSC;
|
||||||
}
|
}
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_READ_PARAMETERS:
|
case CMD_READ_PARAMETERS:
|
||||||
@@ -766,6 +786,7 @@ esdi_callback(void *priv)
|
|||||||
esdi->status = STAT_DRQ|STAT_READY|STAT_DSC;
|
esdi->status = STAT_DRQ|STAT_READY|STAT_DSC;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
}
|
}
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -776,10 +797,9 @@ esdi_callback(void *priv)
|
|||||||
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
esdi->status = STAT_READY|STAT_ERR|STAT_DSC;
|
||||||
esdi->error = ERR_ABRT;
|
esdi->error = ERR_ABRT;
|
||||||
irq_raise(esdi);
|
irq_raise(esdi);
|
||||||
|
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ui_sb_update_icon(SB_HDD|HDD_BUS_ESDI, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user