Rewrote timer code.
The new code is based on timestamps, rather than delays. This eliminates the need to update every timer in timer_process(), which cost a non-trivial amount of CPU time on low-end machines. This involved changes to every user of the timer code, so this change almost certainly introduces bugs.
This commit is contained in:
parent
ab359ca9c5
commit
a7d006b637
79 changed files with 1050 additions and 1033 deletions
|
|
@ -4,7 +4,7 @@
|
|||
#include "scsi.h"
|
||||
#include "timer.h"
|
||||
|
||||
#define IDE_TIME (5 * 100 * (1 << TIMER_SHIFT))
|
||||
#define IDE_TIME (100 * TIMER_USEC)
|
||||
|
||||
#define ATAPI_STATE_IDLE 0
|
||||
#define ATAPI_STATE_COMMAND 1
|
||||
|
|
@ -35,7 +35,7 @@ void atapi_data_write(atapi_device_t *atapi_dev, uint16_t val)
|
|||
if (atapi_dev->command_pos >= 12)
|
||||
{
|
||||
atapi_dev->state = ATAPI_STATE_GOT_COMMAND;
|
||||
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -47,7 +47,7 @@ void atapi_data_write(atapi_device_t *atapi_dev, uint16_t val)
|
|||
{
|
||||
atapi_dev->bus_state = 0;
|
||||
atapi_dev->state = ATAPI_STATE_WRITE_DATA;
|
||||
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -73,7 +73,7 @@ uint16_t atapi_data_read(atapi_device_t *atapi_dev)
|
|||
if (atapi_dev->data_read_pos >= atapi_dev->data_write_pos)
|
||||
{
|
||||
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||
idecallback[atapi_dev->board] = 6*IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6*IDE_TIME);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -199,7 +199,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
|
|||
{
|
||||
// pclog("SEND_COMMAND timed out %x\n", scsi_bus_read(&atapi_dev->bus));
|
||||
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -209,7 +209,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
|
|||
{
|
||||
// pclog("SEND_COMMAND - bus state changed %x\n", bus_state);
|
||||
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -261,20 +261,20 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
|
|||
if (ide_bus_master_write_data(atapi_dev->board, atapi_dev->data, atapi_dev->data_read_pos))
|
||||
{
|
||||
atapi_dev->state = ATAPI_STATE_RETRY_WRITE_DMA;
|
||||
idecallback[atapi_dev->board] = 1*IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
|
||||
}
|
||||
else
|
||||
{
|
||||
atapi_dev->data_write_pos = atapi_dev->data_read_pos;
|
||||
atapi_dev->bus_state = 0;
|
||||
atapi_dev->state = ATAPI_STATE_WRITE_DATA;
|
||||
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
atapi_dev->state = ATAPI_STATE_RETRY_WRITE_DMA;
|
||||
idecallback[atapi_dev->board] = 1*IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -312,7 +312,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
|
|||
break;
|
||||
}
|
||||
}
|
||||
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -344,7 +344,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
|
|||
break;
|
||||
}
|
||||
}
|
||||
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -387,7 +387,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
|
|||
break;
|
||||
}
|
||||
}
|
||||
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -433,18 +433,18 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
|
|||
if (ide_bus_master_read_data(atapi_dev->board, atapi_dev->data, atapi_dev->data_write_pos))
|
||||
{
|
||||
atapi_dev->state = ATAPI_STATE_RETRY_READ_DMA;
|
||||
idecallback[atapi_dev->board] = 1*IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
|
||||
}
|
||||
else
|
||||
{
|
||||
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||
idecallback[atapi_dev->board] = 1*IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
atapi_dev->state = ATAPI_STATE_RETRY_READ_DMA;
|
||||
idecallback[atapi_dev->board] = 1*IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -490,7 +490,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
|
|||
}
|
||||
|
||||
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||
idecallback[atapi_dev->board] = 1 * IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1 * IDE_TIME);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -529,7 +529,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
|
|||
ide_irq_raise(atapi_dev->ide);
|
||||
}
|
||||
else
|
||||
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -537,12 +537,12 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
|
|||
{
|
||||
if (ide_bus_master_read_data(atapi_dev->board, atapi_dev->data, atapi_dev->data_write_pos))
|
||||
{
|
||||
idecallback[atapi_dev->board] = 1*IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
|
||||
}
|
||||
else
|
||||
{
|
||||
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||
idecallback[atapi_dev->board] = 6*IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6*IDE_TIME);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -551,13 +551,13 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
|
|||
{
|
||||
if (ide_bus_master_write_data(atapi_dev->board, atapi_dev->data, atapi_dev->data_read_pos))
|
||||
{
|
||||
idecallback[atapi_dev->board] = 1*IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
|
||||
}
|
||||
else
|
||||
{
|
||||
atapi_dev->bus_state = 0;
|
||||
atapi_dev->state = ATAPI_STATE_WRITE_DATA;
|
||||
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in a new issue